commit 6b3179ed2d7778bc867fb55d1cecbbc3e0482a5d Author: OfficialDakari Date: Thu Jun 5 22:05:37 2025 +0500 x diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 0000000..81e3deb --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,2 @@ +* @krille-chan +assets/l10n/*.arb @weblate \ No newline at end of file diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..402c3c7 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,13 @@ +# These are supported funding model platforms + +github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] +patreon: # Replace with a single Patreon username +open_collective: # Replace with a single Open Collective username +ko_fi: krille +tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel +community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry +liberapay: KrilleChritzelius +issuehunt: # Replace with a single IssueHunt username +otechie: # Replace with a single Otechie username +lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry +custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 0000000..485bfd8 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,51 @@ +name: 🐛 Bug report +description: Create a report to help us improve +labels: bug +body: + - type: textarea + id: bug-description + attributes: + label: "Bug Description" + description: "A clear and concise description of what the bug is. Please add screenshots if you have as they usually help us a lot." + placeholder: "Describe the bug here..." + validations: + required: true + - type: textarea + id: reproduce-steps + attributes: + label: "Steps to Reproduce" + description: "Steps to reproduce the behavior:" + placeholder: "1. Go to '...'\n2. Click on '...'\n3. Scroll down to '...'\n4. See error" + validations: + required: true + - type: textarea + id: expected-behavior + attributes: + label: "Expected Behavior" + description: "A clear and concise description of what you expected to happen." + placeholder: "Describe what you expected to happen here..." + validations: + required: true + - type: input + id: app-version + attributes: + label: "App Version" + description: "Please provide the version of the app you are using." + placeholder: "e.g. 1.12.0" + validations: + required: true + - type: input + id: platform-info + attributes: + label: "Additional Platform Information" + description: "Please provide the following information:" + placeholder: "Device: [e.g. iPhone6, PC, Pixel 3]\nOS: [e.g. iOS, Android, Windows, Linux, macOS]\nBrowser (if applicable): [e.g. Chrome, Safari]" + validations: + required: true + - type: textarea + id: additional-context + attributes: + label: "Additional Context" + description: "Add any other context about the problem here." + validations: + required: false diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..780f692 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,5 @@ +blank_issues_enabled: true +contact_links: + - name: 👬 FluffyChat Community + url: https://matrix.to/#/#fluffychat:matrix.org + about: Please ask and answer questions here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 0000000..4007c88 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,34 @@ +name: 💡 Feature Request +description: Suggest an idea for this project +labels: enhancement +body: + - type: textarea + id: feature-description + attributes: + label: "Feature Description" + description: "Provide a clear and concise description of the feature." + placeholder: "Describe the feature here..." + validations: + required: true + - type: textarea + id: rationale + attributes: + label: "Rationale" + description: "Explain why this feature should be added." + placeholder: "Describe the rationale for the feature here..." + validations: + required: true + - type: textarea + id: mockup + attributes: + label: "Mockup" + description: "If applicable, add any visual mock-ups of the feature." + validations: + required: false + - type: textarea + id: additional-context + attributes: + label: "Additional Context" + description: "Add any other context or screenshots about the feature request here." + validations: + required: false diff --git a/.github/ISSUE_TEMPLATE/test_report.md b/.github/ISSUE_TEMPLATE/test_report.md new file mode 100644 index 0000000..9a7ed70 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/test_report.md @@ -0,0 +1,41 @@ +--- +name: 📝 Test +about: A detailed protocol for testing all features +title: 'Test Report' +labels: test +--- + +1. App receives push notifications over Firebase Cloud Messaging when it is in background/terminated: + - [ ] Android + - [ ] iOS +2. App receives push notifications over Unified Push when it is in background/terminated: + - [ ] Android +3. Notifications for rooms, which are not in foreground, are working: + - [ ] Web + - [ ] Linux +4. QR Code scanner can still scan links to start a new chat: + - [ ] Android + - [ ] iOS +5. Recording and playing voice messages works: + - [ ] Android + - [ ] iOS + - [ ] Web (play only) +6. Sending and downloading files/images works: + - [ ] Android + - [ ] iOS + - [ ] Web + - [ ] Linux +7. Sharing texts/files/images from other apps to FluffyChat works: + - [ ] Android + - [ ] iOS +8. Login with single sign on works: + - [ ] Android + - [ ] iOS + - [ ] Web + - [ ] Linux +9. Test if the app lock works as intended and appears on opening/resuming the app: + - [ ] Android + - [ ] iOS +10. Drag&Drop to send a file into a chat still works: + - [ ] Web + - [ ] Linux diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..2b993ea --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,20 @@ +version: 2 +updates: + - package-ecosystem: "pub" + directory: "/" + schedule: + interval: "daily" + allow: + - dependency-name: "*" + commit-message: + prefix: "build: " + include: "scope" + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "daily" + allow: + - dependency-name: "*" + commit-message: + prefix: "build: " + include: "scope" diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000..c925364 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,21 @@ +*Thank you so much for your contribution to FluffyChat ❤️❤️❤️* + +Please make sure that your Pull Request meet the following **acceptance criteria**: + +- [ ] Code formatting and import sorting has been done with `dart format lib/ test/` and `dart run import_sorter:main --no-comments` +- [ ] The commit message uses the format of [Conventional Commits](https://www.conventionalcommits.org) +- [ ] The commit message describes what has been changed, why it has been changed and how it has been changed +- [ ] Every new feature or change of the design/GUI is linked to an approved design proposal in an issue +- [ ] Every new feature in the app or the build system has a strategy how this will be tested and maintained from now on for every release, e.g. a volunteer who takes over maintainership + + +### Pull Request has been tested on: + +- [ ] Android +- [ ] iOS +- [ ] Browser (Chromium based) +- [ ] Browser (Firefox based) +- [ ] Browser (WebKit based) +- [ ] Desktop Linux +- [ ] Desktop Windows +- [ ] Desktop macOS \ No newline at end of file diff --git a/.github/workflows/integrate.yaml b/.github/workflows/integrate.yaml new file mode 100644 index 0000000..7f4b79e --- /dev/null +++ b/.github/workflows/integrate.yaml @@ -0,0 +1,95 @@ +name: Pull Request Workflow + +on: + pull_request: + merge_group: + +jobs: + code_tests: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - run: ./scripts/generate-locale-config.sh + - run: git diff --exit-code + - run: cat .github/workflows/versions.env >> $GITHUB_ENV + - uses: subosito/flutter-action@v2 + with: + flutter-version: ${{ env.FLUTTER_VERSION }} + cache: true + - run: flutter pub get + - run: flutter gen-l10n + - name: Check formatting + run: dart format lib/ test/ --set-exit-if-changed + - name: Check import formatting + run: dart run import_sorter:main --no-comments --exit-if-changed + - name: Check license compliance + run: dart run license_checker check-licenses -c licenses.yaml --problematic + - run: flutter analyze + - name: Apply google services patch + run: git apply ./scripts/enable-android-google-services.patch + - run: flutter analyze + - run: flutter test + + build_debug_apk: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - run: cat .github/workflows/versions.env >> $GITHUB_ENV + - uses: actions/setup-java@v4 + with: + java-version: ${{ env.JAVA_VERSION }} + distribution: "zulu" + - uses: subosito/flutter-action@v2 + with: + flutter-version: ${{ env.FLUTTER_VERSION }} + cache: true + - run: flutter pub get + - run: flutter build apk --debug + + build_debug_web: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - run: cat .github/workflows/versions.env >> $GITHUB_ENV + - uses: subosito/flutter-action@v2 + with: + flutter-version: ${{ env.FLUTTER_VERSION }} + cache: true + - run: flutter pub get + - name: Prepare web + run: ./scripts/prepare-web.sh + - run: flutter build web + + build_debug_linux: + strategy: + matrix: + arch: [ x64, arm64 ] + runs-on: ${{ matrix.arch == 'arm64' && 'self-hosted' || 'ubuntu-latest'}} + steps: + - uses: actions/checkout@v4 + - run: cat .github/workflows/versions.env >> $GITHUB_ENV + - name: Install dependencies + run: sudo apt-get update && sudo apt-get install git wget curl clang cmake ninja-build pkg-config libgtk-3-dev libblkid-dev liblzma-dev libjsoncpp-dev cmake-data libsecret-1-dev libsecret-1-0 librhash0 libssl-dev libwebkit2gtk-4.1-dev -y + - name: Install Flutter + run: | + git clone --branch ${{ env.FLUTTER_VERSION }} https://github.com/flutter/flutter.git + ./flutter/bin/flutter doctor + - run: ./flutter/bin/flutter pub get + - run: ./flutter/bin/flutter build linux --target-platform linux-${{ matrix.arch }} + + build_debug_ios: + runs-on: macos-15 + steps: + - uses: actions/checkout@v4 + - run: cat .github/workflows/versions.env >> $GITHUB_ENV + - uses: subosito/flutter-action@v2 + with: + flutter-version: ${{ env.FLUTTER_VERSION }} + cache: true + - name: Setup Xcode version + uses: maxim-lobanov/setup-xcode@v1.6.0 + with: + xcode-version: latest + - run: brew install sqlcipher + - run: flutter pub get + - run: flutter build ios --no-codesign diff --git a/.github/workflows/main_deploy.yaml b/.github/workflows/main_deploy.yaml new file mode 100644 index 0000000..1bfe956 --- /dev/null +++ b/.github/workflows/main_deploy.yaml @@ -0,0 +1,74 @@ +name: Main Deploy Workflow + +on: + push: + branches: + - main + workflow_dispatch: + +concurrency: + group: main_deploy + cancel-in-progress: true + +jobs: + deploy_web: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - run: cat .github/workflows/versions.env >> $GITHUB_ENV + - uses: subosito/flutter-action@v2 + with: + flutter-version: ${{ env.FLUTTER_VERSION }} + - run: flutter pub get + - name: Prepare web + run: ./scripts/prepare-web.sh + - name: Build Release Web + run: flutter build web --dart-define=FLUTTER_WEB_CANVASKIT_URL=canvaskit/ --release --source-maps --base-href "/nightly/" + - run: mv build/web/ public + - name: Deploy to GitHub Pages + uses: peaceiris/actions-gh-pages@v4 + with: + personal_token: ${{ secrets.PAGES_DEPLOY_TOKEN }} + publish_dir: ./public + publish_branch: gh-pages + destination_dir: nightly + + deploy_playstore_internal: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - run: cat .github/workflows/versions.env >> $GITHUB_ENV + - uses: actions/setup-java@v4 + with: + java-version: ${{ env.JAVA_VERSION }} + distribution: 'zulu' + - uses: subosito/flutter-action@v2 + with: + flutter-version: ${{ env.FLUTTER_VERSION }} + cache: true + - name: Set up Ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: '3.3' + - name: Install Fastlane + run: gem install fastlane -NV + - name: Apply Google Services Patch + run: git apply ./scripts/enable-android-google-services.patch + - run: flutter pub get + - name: Prepare Android Release Build + env: + FDROID_KEY: ${{ secrets.FDROID_KEY }} + FDROID_KEY_PASS: ${{ secrets.FDROID_KEY_PASS }} + PLAYSTORE_DEPLOY_KEY: ${{ secrets.PLAYSTORE_DEPLOY_KEY }} + run: ./scripts/prepare-android-release.sh + - name: Build Android Release + run: flutter build appbundle --target-platform android-arm,android-arm64,android-x64 + - name: Deploy Android Release + run: | + mkdir -p build/android + cp build/app/outputs/bundle/release/app-release.aab build/android/ + cd android + bundle install + bundle update fastlane + bundle exec fastlane deploy_internal_test + cd .. diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml new file mode 100644 index 0000000..b2deeaf --- /dev/null +++ b/.github/workflows/release.yaml @@ -0,0 +1,225 @@ +name: Release Workflow + +on: + release: + types: + - created + +concurrency: + group: release_workflow + cancel-in-progress: true + +env: + REGISTRY: ghcr.io + IMAGE_NAME: ${{ github.repository }} + +jobs: + build_web: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - run: cat .github/workflows/versions.env >> $GITHUB_ENV + - uses: subosito/flutter-action@v2 + with: + flutter-version: ${{ env.FLUTTER_VERSION }} + cache: true + - name: Install dependencies + run: sudo apt-get update && sudo apt-get install nodejs -y + - run: flutter pub get + - name: Prepare web + run: ./scripts/prepare-web.sh + - name: Build Release Web + run: flutter build web --dart-define=FLUTTER_WEB_CANVASKIT_URL=canvaskit/ --release --source-maps --base-href "/web/" + - name: Create archive + run: tar -czf fluffychat-web.tar.gz build/web/ + - name: Upload Web Build + uses: actions/upload-artifact@v4 + with: + name: Web Build + path: fluffychat-web.tar.gz + - name: Upload to release + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.PAGES_DEPLOY_TOKEN }} + with: + upload_url: ${{ github.event.release.upload_url }} + asset_path: fluffychat-web.tar.gz + asset_name: fluffychat-web.tar.gz + asset_content_type: application/gzip + - name: Install and build tailwindcss + working-directory: docs + run: | + npm install tailwindcss @tailwindcss/cli + npx tailwindcss -o ./tailwind.css + - name: Build Website + run: | + mv docs public + mv repo public || true + mv build/web/ public/web + cp public/web -r public/nightly + - name: Deploy to GitHub Pages + if: startsWith(github.ref, 'refs/tags/v') + uses: peaceiris/actions-gh-pages@v4 + with: + personal_token: ${{ secrets.PAGES_DEPLOY_TOKEN }} + publish_dir: ./public + publish_branch: gh-pages + cname: fluffychat.im + + build_apk: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - run: cat .github/workflows/versions.env >> $GITHUB_ENV + - uses: actions/setup-java@v4 + with: + java-version: ${{ env.JAVA_VERSION }} + distribution: 'zulu' + - uses: subosito/flutter-action@v2 + with: + flutter-version: ${{ env.FLUTTER_VERSION }} + cache: true + - name: Apply Google Services Patch + run: git apply ./scripts/enable-android-google-services.patch + - run: flutter pub get + - name: Prepare Android Release Build + env: + FDROID_KEY: ${{ secrets.FDROID_KEY }} + FDROID_KEY_PASS: ${{ secrets.FDROID_KEY_PASS }} + PLAYSTORE_DEPLOY_KEY: ${{ secrets.PLAYSTORE_DEPLOY_KEY }} + run: ./scripts/prepare-android-release.sh + - run: flutter build apk --release + - name: Upload to release + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.PAGES_DEPLOY_TOKEN }} + with: + upload_url: ${{ github.event.release.upload_url }} + asset_path: build/app/outputs/apk/release/app-release.apk + asset_name: fluffychat.apk + asset_content_type: application/vnd.android.package-archive + + build_linux: + strategy: + matrix: + arch: [ x64, arm64 ] + runs-on: ${{ matrix.arch == 'arm64' && 'self-hosted' || 'ubuntu-latest'}} + steps: + - uses: actions/checkout@v4 + - run: cat .github/workflows/versions.env >> $GITHUB_ENV + - name: Install dependencies + run: sudo apt-get update && sudo apt-get install curl clang cmake ninja-build pkg-config libgtk-3-dev libblkid-dev liblzma-dev libjsoncpp-dev cmake-data libsecret-1-dev libsecret-1-0 librhash0 libssl-dev libwebkit2gtk-4.1-dev -y + - name: Install Flutter + run: | + git clone --branch ${{ env.FLUTTER_VERSION }} https://github.com/flutter/flutter.git + ./flutter/bin/flutter doctor + - run: ./flutter/bin/flutter pub get + - run: ./flutter/bin/flutter build linux --target-platform linux-${{ matrix.arch }} + - name: Create archive + run: tar -czf fluffychat-linux-${{ matrix.arch }}.tar.gz -C build/linux/${{ matrix.arch }}/release/bundle/ . + - name: Upload to release + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.PAGES_DEPLOY_TOKEN }} + with: + upload_url: ${{ github.event.release.upload_url }} + asset_path: fluffychat-linux-${{ matrix.arch }}.tar.gz + asset_name: fluffychat-linux-${{ matrix.arch }}.tar.gz + asset_content_type: application/gzip + + deploy_playstore: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - run: cat .github/workflows/versions.env >> $GITHUB_ENV + - uses: actions/setup-java@v4 + with: + java-version: ${{ env.JAVA_VERSION }} + distribution: 'zulu' + - uses: subosito/flutter-action@v2 + with: + flutter-version: ${{ env.FLUTTER_VERSION }} + cache: true + - name: Set up Ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: '3.3' + - name: Install Fastlane + run: gem install fastlane -NV + - name: Apply Google Services Patch + run: git apply ./scripts/enable-android-google-services.patch + - run: flutter pub get + - name: Prepare Android Release Build + env: + FDROID_KEY: ${{ secrets.FDROID_KEY }} + FDROID_KEY_PASS: ${{ secrets.FDROID_KEY_PASS }} + PLAYSTORE_DEPLOY_KEY: ${{ secrets.PLAYSTORE_DEPLOY_KEY }} + run: ./scripts/prepare-android-release.sh + - name: Build Android Release + run: flutter build appbundle --target-platform android-arm,android-arm64,android-x64 + - name: Get Tag Name + id: tag_name + run: echo "::set-output name=tag::$(echo ${GITHUB_REF#refs/tags/})" + - name: Deploy Android Release + run: | + mkdir -p build/android + cp build/app/outputs/bundle/release/app-release.aab build/android/ + cd android + bundle install + bundle update fastlane + bundle exec fastlane deploy_internal_test + if [[ $GITHUB_REF_NAME == rc* ]]; then + bundle exec fastlane deploy_candidate + else + bundle exec fastlane deploy_release + fi + cd .. + + promote_snapcraft: + runs-on: ubuntu-latest + env: + SNAPCRAFT_STORE_CREDENTIALS: ${{ secrets.SNAPCRAFT_TOKEN }} + steps: + - name: Check out Git repository + uses: actions/checkout@v4 + - name: Install Snapcraft + uses: samuelmeuli/action-snapcraft@v3 + - name: Get Tag Name + id: tag_name + run: echo "::set-output name=tag::$(echo ${GITHUB_REF#refs/tags/})" + - name: Promote Snap + env: # Workaround for https://github.com/snapcore/snapcraft/issues/4439 + SNAPCRAFT_HAS_TTY: "true" + run: | + if [[ $GITHUB_REF_NAME == rc* ]]; then + yes | snapcraft promote fluffychat --from-channel edge --to-channel candidate + else + yes | snapcraft promote fluffychat --from-channel edge --to-channel stable + fi + + deploy_docker: + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + steps: + - name: Check out Git repository + uses: actions/checkout@v4 + - name: Log in to the Container registry + uses: docker/login-action@v3 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@v5 + with: + images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + - name: Build and push Docker image + uses: docker/build-push-action@v6 + with: + context: . + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} diff --git a/.github/workflows/versions.env b/.github/workflows/versions.env new file mode 100644 index 0000000..893fcdf --- /dev/null +++ b/.github/workflows/versions.env @@ -0,0 +1,2 @@ +FLUTTER_VERSION=3.29.3 +JAVA_VERSION=17 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ed83064 --- /dev/null +++ b/.gitignore @@ -0,0 +1,364 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +*.snap +.DS_Store +.local/ +.atom/ +.buildlog/ +.history +.svn/ +prime + +# libolm package +/assets/js/package + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.packages +.pub-cache/ +.pub/ +/build/ + +# Web related +docs/tailwind.css + +# Exceptions to above rules. +!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages + + +/key.jks +/android/key.properties +**/android/app/.cxx +android/key.jks +android/keys.json +android/Gemfile.lock +lib/l10n_old +ios/Flutter/.last_build_id +ios/Podfile.lock +ios/Runner.ipa + +/windows/out +/winuwp/out +/linux/out +/macos/out +.vs +olm +docs/node_modules/.package-lock.json +docs/node_modules/.bin/detect-libc +docs/node_modules/.bin/jiti +docs/node_modules/.bin/tailwindcss +docs/node_modules/@parcel/watcher/binding.gyp +docs/node_modules/@parcel/watcher/index.d.ts +docs/node_modules/@parcel/watcher/index.js +docs/node_modules/@parcel/watcher/index.js.flow +docs/node_modules/@parcel/watcher/LICENSE +docs/node_modules/@parcel/watcher/package.json +docs/node_modules/@parcel/watcher/README.md +docs/node_modules/@parcel/watcher/wrapper.js +docs/node_modules/@parcel/watcher/scripts/build-from-source.js +docs/node_modules/@parcel/watcher/src/Backend.cc +docs/node_modules/@parcel/watcher/src/Backend.hh +docs/node_modules/@parcel/watcher/src/binding.cc +docs/node_modules/@parcel/watcher/src/Debounce.cc +docs/node_modules/@parcel/watcher/src/Debounce.hh +docs/node_modules/@parcel/watcher/src/DirTree.cc +docs/node_modules/@parcel/watcher/src/DirTree.hh +docs/node_modules/@parcel/watcher/src/Event.hh +docs/node_modules/@parcel/watcher/src/Glob.cc +docs/node_modules/@parcel/watcher/src/Glob.hh +docs/node_modules/@parcel/watcher/src/PromiseRunner.hh +docs/node_modules/@parcel/watcher/src/Signal.hh +docs/node_modules/@parcel/watcher/src/Watcher.cc +docs/node_modules/@parcel/watcher/src/Watcher.hh +docs/node_modules/@parcel/watcher/src/kqueue/KqueueBackend.cc +docs/node_modules/@parcel/watcher/src/kqueue/KqueueBackend.hh +docs/node_modules/@parcel/watcher/src/linux/InotifyBackend.cc +docs/node_modules/@parcel/watcher/src/linux/InotifyBackend.hh +docs/node_modules/@parcel/watcher/src/macos/FSEventsBackend.cc +docs/node_modules/@parcel/watcher/src/macos/FSEventsBackend.hh +docs/node_modules/@parcel/watcher/src/shared/BruteForceBackend.cc +docs/node_modules/@parcel/watcher/src/shared/BruteForceBackend.hh +docs/node_modules/@parcel/watcher/src/unix/fts.cc +docs/node_modules/@parcel/watcher/src/unix/legacy.cc +docs/node_modules/@parcel/watcher/src/wasm/include.h +docs/node_modules/@parcel/watcher/src/wasm/WasmBackend.cc +docs/node_modules/@parcel/watcher/src/wasm/WasmBackend.hh +docs/node_modules/@parcel/watcher/src/watchman/BSER.cc +docs/node_modules/@parcel/watcher/src/watchman/BSER.hh +docs/node_modules/@parcel/watcher/src/watchman/IPC.hh +docs/node_modules/@parcel/watcher/src/watchman/WatchmanBackend.cc +docs/node_modules/@parcel/watcher/src/watchman/WatchmanBackend.hh +docs/node_modules/@parcel/watcher/src/windows/win_utils.cc +docs/node_modules/@parcel/watcher/src/windows/win_utils.hh +docs/node_modules/@parcel/watcher/src/windows/WindowsBackend.cc +docs/node_modules/@parcel/watcher/src/windows/WindowsBackend.hh +docs/node_modules/@parcel/watcher-linux-x64-glibc/LICENSE +docs/node_modules/@parcel/watcher-linux-x64-glibc/package.json +docs/node_modules/@parcel/watcher-linux-x64-glibc/README.md +docs/node_modules/@parcel/watcher-linux-x64-glibc/watcher.node +docs/node_modules/@tailwindcss/cli/LICENSE +docs/node_modules/@tailwindcss/cli/package.json +docs/node_modules/@tailwindcss/cli/README.md +docs/node_modules/@tailwindcss/cli/dist/index.mjs +docs/node_modules/@tailwindcss/node/LICENSE +docs/node_modules/@tailwindcss/node/package.json +docs/node_modules/@tailwindcss/node/README.md +docs/node_modules/@tailwindcss/node/dist/esm-cache.loader.d.mts +docs/node_modules/@tailwindcss/node/dist/esm-cache.loader.mjs +docs/node_modules/@tailwindcss/node/dist/index.d.mts +docs/node_modules/@tailwindcss/node/dist/index.d.ts +docs/node_modules/@tailwindcss/node/dist/index.js +docs/node_modules/@tailwindcss/node/dist/index.mjs +docs/node_modules/@tailwindcss/node/dist/require-cache.d.ts +docs/node_modules/@tailwindcss/node/dist/require-cache.js +docs/node_modules/@tailwindcss/oxide/index.d.ts +docs/node_modules/@tailwindcss/oxide/index.js +docs/node_modules/@tailwindcss/oxide/LICENSE +docs/node_modules/@tailwindcss/oxide/package.json +docs/node_modules/@tailwindcss/oxide-linux-x64-gnu/LICENSE +docs/node_modules/@tailwindcss/oxide-linux-x64-gnu/package.json +docs/node_modules/@tailwindcss/oxide-linux-x64-gnu/README.md +docs/node_modules/@tailwindcss/oxide-linux-x64-gnu/tailwindcss-oxide.linux-x64-gnu.node +docs/node_modules/braces/index.js +docs/node_modules/braces/LICENSE +docs/node_modules/braces/package.json +docs/node_modules/braces/README.md +docs/node_modules/braces/lib/compile.js +docs/node_modules/braces/lib/constants.js +docs/node_modules/braces/lib/expand.js +docs/node_modules/braces/lib/parse.js +docs/node_modules/braces/lib/stringify.js +docs/node_modules/braces/lib/utils.js +docs/node_modules/detect-libc/.npmignore +docs/node_modules/detect-libc/LICENSE +docs/node_modules/detect-libc/package.json +docs/node_modules/detect-libc/README.md +docs/node_modules/detect-libc/bin/detect-libc.js +docs/node_modules/detect-libc/lib/detect-libc.js +docs/node_modules/enhanced-resolve/LICENSE +docs/node_modules/enhanced-resolve/package.json +docs/node_modules/enhanced-resolve/README.md +docs/node_modules/enhanced-resolve/types.d.ts +docs/node_modules/enhanced-resolve/lib/AliasFieldPlugin.js +docs/node_modules/enhanced-resolve/lib/AliasPlugin.js +docs/node_modules/enhanced-resolve/lib/AppendPlugin.js +docs/node_modules/enhanced-resolve/lib/CachedInputFileSystem.js +docs/node_modules/enhanced-resolve/lib/CloneBasenamePlugin.js +docs/node_modules/enhanced-resolve/lib/ConditionalPlugin.js +docs/node_modules/enhanced-resolve/lib/createInnerContext.js +docs/node_modules/enhanced-resolve/lib/DescriptionFilePlugin.js +docs/node_modules/enhanced-resolve/lib/DescriptionFileUtils.js +docs/node_modules/enhanced-resolve/lib/DirectoryExistsPlugin.js +docs/node_modules/enhanced-resolve/lib/ExportsFieldPlugin.js +docs/node_modules/enhanced-resolve/lib/ExtensionAliasPlugin.js +docs/node_modules/enhanced-resolve/lib/FileExistsPlugin.js +docs/node_modules/enhanced-resolve/lib/forEachBail.js +docs/node_modules/enhanced-resolve/lib/getInnerRequest.js +docs/node_modules/enhanced-resolve/lib/getPaths.js +docs/node_modules/enhanced-resolve/lib/ImportsFieldPlugin.js +docs/node_modules/enhanced-resolve/lib/index.js +docs/node_modules/enhanced-resolve/lib/JoinRequestPartPlugin.js +docs/node_modules/enhanced-resolve/lib/JoinRequestPlugin.js +docs/node_modules/enhanced-resolve/lib/LogInfoPlugin.js +docs/node_modules/enhanced-resolve/lib/MainFieldPlugin.js +docs/node_modules/enhanced-resolve/lib/ModulesInHierachicDirectoriesPlugin.js +docs/node_modules/enhanced-resolve/lib/ModulesInHierarchicalDirectoriesPlugin.js +docs/node_modules/enhanced-resolve/lib/ModulesInRootPlugin.js +docs/node_modules/enhanced-resolve/lib/NextPlugin.js +docs/node_modules/enhanced-resolve/lib/ParsePlugin.js +docs/node_modules/enhanced-resolve/lib/PnpPlugin.js +docs/node_modules/enhanced-resolve/lib/Resolver.js +docs/node_modules/enhanced-resolve/lib/ResolverFactory.js +docs/node_modules/enhanced-resolve/lib/RestrictionsPlugin.js +docs/node_modules/enhanced-resolve/lib/ResultPlugin.js +docs/node_modules/enhanced-resolve/lib/RootsPlugin.js +docs/node_modules/enhanced-resolve/lib/SelfReferencePlugin.js +docs/node_modules/enhanced-resolve/lib/SymlinkPlugin.js +docs/node_modules/enhanced-resolve/lib/SyncAsyncFileSystemDecorator.js +docs/node_modules/enhanced-resolve/lib/TryNextPlugin.js +docs/node_modules/enhanced-resolve/lib/UnsafeCachePlugin.js +docs/node_modules/enhanced-resolve/lib/UseFilePlugin.js +docs/node_modules/enhanced-resolve/lib/util/entrypoints.js +docs/node_modules/enhanced-resolve/lib/util/identifier.js +docs/node_modules/enhanced-resolve/lib/util/module-browser.js +docs/node_modules/enhanced-resolve/lib/util/path.js +docs/node_modules/enhanced-resolve/lib/util/process-browser.js +docs/node_modules/fill-range/index.js +docs/node_modules/fill-range/LICENSE +docs/node_modules/fill-range/package.json +docs/node_modules/fill-range/README.md +docs/node_modules/graceful-fs/clone.js +docs/node_modules/graceful-fs/graceful-fs.js +docs/node_modules/graceful-fs/legacy-streams.js +docs/node_modules/graceful-fs/LICENSE +docs/node_modules/graceful-fs/package.json +docs/node_modules/graceful-fs/polyfills.js +docs/node_modules/graceful-fs/README.md +docs/node_modules/is-extglob/index.js +docs/node_modules/is-extglob/LICENSE +docs/node_modules/is-extglob/package.json +docs/node_modules/is-extglob/README.md +docs/node_modules/is-glob/index.js +docs/node_modules/is-glob/LICENSE +docs/node_modules/is-glob/package.json +docs/node_modules/is-glob/README.md +docs/node_modules/is-number/index.js +docs/node_modules/is-number/LICENSE +docs/node_modules/is-number/package.json +docs/node_modules/is-number/README.md +docs/node_modules/jiti/LICENSE +docs/node_modules/jiti/package.json +docs/node_modules/jiti/README.md +docs/node_modules/jiti/dist/babel.cjs +docs/node_modules/jiti/dist/jiti.cjs +docs/node_modules/jiti/lib/jiti-cli.mjs +docs/node_modules/jiti/lib/jiti-hooks.mjs +docs/node_modules/jiti/lib/jiti-native.mjs +docs/node_modules/jiti/lib/jiti-register.d.mts +docs/node_modules/jiti/lib/jiti-register.mjs +docs/node_modules/jiti/lib/jiti.cjs +docs/node_modules/jiti/lib/jiti.d.cts +docs/node_modules/jiti/lib/jiti.d.mts +docs/node_modules/jiti/lib/jiti.mjs +docs/node_modules/jiti/lib/types.d.ts +docs/node_modules/lightningcss/LICENSE +docs/node_modules/lightningcss/package.json +docs/node_modules/lightningcss/README.md +docs/node_modules/lightningcss/node/ast.d.ts +docs/node_modules/lightningcss/node/ast.js.flow +docs/node_modules/lightningcss/node/browserslistToTargets.js +docs/node_modules/lightningcss/node/composeVisitors.js +docs/node_modules/lightningcss/node/flags.js +docs/node_modules/lightningcss/node/index.d.ts +docs/node_modules/lightningcss/node/index.js +docs/node_modules/lightningcss/node/index.js.flow +docs/node_modules/lightningcss/node/index.mjs +docs/node_modules/lightningcss/node/targets.d.ts +docs/node_modules/lightningcss/node/targets.js.flow +docs/node_modules/lightningcss-linux-x64-gnu/LICENSE +docs/node_modules/lightningcss-linux-x64-gnu/lightningcss.linux-x64-gnu.node +docs/node_modules/lightningcss-linux-x64-gnu/package.json +docs/node_modules/lightningcss-linux-x64-gnu/README.md +docs/node_modules/micromatch/index.js +docs/node_modules/micromatch/LICENSE +docs/node_modules/micromatch/package.json +docs/node_modules/micromatch/README.md +docs/node_modules/mri/index.d.ts +docs/node_modules/mri/license.md +docs/node_modules/mri/package.json +docs/node_modules/mri/readme.md +docs/node_modules/mri/lib/index.js +docs/node_modules/mri/lib/index.mjs +docs/node_modules/node-addon-api/common.gypi +docs/node_modules/node-addon-api/except.gypi +docs/node_modules/node-addon-api/index.js +docs/node_modules/node-addon-api/LICENSE.md +docs/node_modules/node-addon-api/napi-inl.deprecated.h +docs/node_modules/node-addon-api/napi-inl.h +docs/node_modules/node-addon-api/napi.h +docs/node_modules/node-addon-api/node_addon_api.gyp +docs/node_modules/node-addon-api/node_api.gyp +docs/node_modules/node-addon-api/noexcept.gypi +docs/node_modules/node-addon-api/nothing.c +docs/node_modules/node-addon-api/package-support.json +docs/node_modules/node-addon-api/package.json +docs/node_modules/node-addon-api/README.md +docs/node_modules/node-addon-api/tools/check-napi.js +docs/node_modules/node-addon-api/tools/clang-format.js +docs/node_modules/node-addon-api/tools/conversion.js +docs/node_modules/node-addon-api/tools/eslint-format.js +docs/node_modules/node-addon-api/tools/README.md +docs/node_modules/picocolors/LICENSE +docs/node_modules/picocolors/package.json +docs/node_modules/picocolors/picocolors.browser.js +docs/node_modules/picocolors/picocolors.d.ts +docs/node_modules/picocolors/picocolors.js +docs/node_modules/picocolors/README.md +docs/node_modules/picocolors/types.d.ts +docs/node_modules/picomatch/CHANGELOG.md +docs/node_modules/picomatch/index.js +docs/node_modules/picomatch/LICENSE +docs/node_modules/picomatch/package.json +docs/node_modules/picomatch/README.md +docs/node_modules/picomatch/lib/constants.js +docs/node_modules/picomatch/lib/parse.js +docs/node_modules/picomatch/lib/picomatch.js +docs/node_modules/picomatch/lib/scan.js +docs/node_modules/picomatch/lib/utils.js +docs/node_modules/tailwindcss/index.css +docs/node_modules/tailwindcss/LICENSE +docs/node_modules/tailwindcss/package.json +docs/node_modules/tailwindcss/preflight.css +docs/node_modules/tailwindcss/README.md +docs/node_modules/tailwindcss/theme.css +docs/node_modules/tailwindcss/utilities.css +docs/node_modules/tailwindcss/dist/chunk-AZANAYY2.mjs +docs/node_modules/tailwindcss/dist/chunk-CH45MXZF.mjs +docs/node_modules/tailwindcss/dist/chunk-V2K3XTS4.mjs +docs/node_modules/tailwindcss/dist/colors-b_6i0Oi7.d.ts +docs/node_modules/tailwindcss/dist/colors.d.mts +docs/node_modules/tailwindcss/dist/colors.d.ts +docs/node_modules/tailwindcss/dist/colors.js +docs/node_modules/tailwindcss/dist/colors.mjs +docs/node_modules/tailwindcss/dist/default-theme.d.mts +docs/node_modules/tailwindcss/dist/default-theme.d.ts +docs/node_modules/tailwindcss/dist/default-theme.js +docs/node_modules/tailwindcss/dist/default-theme.mjs +docs/node_modules/tailwindcss/dist/flatten-color-palette.d.mts +docs/node_modules/tailwindcss/dist/flatten-color-palette.d.ts +docs/node_modules/tailwindcss/dist/flatten-color-palette.js +docs/node_modules/tailwindcss/dist/flatten-color-palette.mjs +docs/node_modules/tailwindcss/dist/lib.d.mts +docs/node_modules/tailwindcss/dist/lib.d.ts +docs/node_modules/tailwindcss/dist/lib.js +docs/node_modules/tailwindcss/dist/lib.mjs +docs/node_modules/tailwindcss/dist/plugin.d.mts +docs/node_modules/tailwindcss/dist/plugin.d.ts +docs/node_modules/tailwindcss/dist/plugin.js +docs/node_modules/tailwindcss/dist/plugin.mjs +docs/node_modules/tailwindcss/dist/resolve-config-BIFUA2FY.d.ts +docs/node_modules/tailwindcss/dist/resolve-config-QUZ9b-Gn.d.mts +docs/node_modules/tailwindcss/dist/types-B254mqw1.d.mts +docs/node_modules/tapable/LICENSE +docs/node_modules/tapable/package.json +docs/node_modules/tapable/README.md +docs/node_modules/tapable/tapable.d.ts +docs/node_modules/tapable/lib/AsyncParallelBailHook.js +docs/node_modules/tapable/lib/AsyncParallelHook.js +docs/node_modules/tapable/lib/AsyncSeriesBailHook.js +docs/node_modules/tapable/lib/AsyncSeriesHook.js +docs/node_modules/tapable/lib/AsyncSeriesLoopHook.js +docs/node_modules/tapable/lib/AsyncSeriesWaterfallHook.js +docs/node_modules/tapable/lib/Hook.js +docs/node_modules/tapable/lib/HookCodeFactory.js +docs/node_modules/tapable/lib/HookMap.js +docs/node_modules/tapable/lib/index.js +docs/node_modules/tapable/lib/MultiHook.js +docs/node_modules/tapable/lib/SyncBailHook.js +docs/node_modules/tapable/lib/SyncHook.js +docs/node_modules/tapable/lib/SyncLoopHook.js +docs/node_modules/tapable/lib/SyncWaterfallHook.js +docs/node_modules/tapable/lib/util-browser.js +docs/node_modules/to-regex-range/index.js +docs/node_modules/to-regex-range/LICENSE +docs/node_modules/to-regex-range/package.json +docs/node_modules/to-regex-range/README.md +docs/package.json +docs/package-lock.json diff --git a/.mailmap b/.mailmap new file mode 100644 index 0000000..b26a9d5 --- /dev/null +++ b/.mailmap @@ -0,0 +1,20 @@ +Aminda Suomalainen Mikaela Suomalainen +Aminda Suomalainen Mikaela Suomalainen +Aminda Suomalainen Mikaela Suomalainen +Anne Onyme 017 Anne017 +Brendan Abolivier Brendan Abolivier +Christian Pauly Christian +Christian Pauly Christian Pauly +Christian Pauly Christian Pauly +Christian Pauly Christian Pauly +Christian Pauly Christian Pauly +Christian Pauly Christian Pauly +Christian Pauly Christian Pauly +Christian Pauly Krille Fear +CuteTadpole <61086561+CuteTadpole@users.noreply.github.com> CuteTadpole +Drews Clausen Drews Clausen +Jelv Jelv +Kateřina Churanová Kateřina Churanová +Kateřina Churanová Katerina +NN708 NN708 +S1m S1m diff --git a/.metadata b/.metadata new file mode 100644 index 0000000..2368519 --- /dev/null +++ b/.metadata @@ -0,0 +1,30 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: "abb292a07e20d696c4568099f918f6c5f330e6b0" + channel: "stable" + +project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: abb292a07e20d696c4568099f918f6c5f330e6b0 + base_revision: abb292a07e20d696c4568099f918f6c5f330e6b0 + - platform: linux + create_revision: abb292a07e20d696c4568099f918f6c5f330e6b0 + base_revision: abb292a07e20d696c4568099f918f6c5f330e6b0 + + # User provided section + + # List of Local paths (relative to this file) that should be + # ignored by the migrate tool. + # + # Files that are not part of the templates will be ignored by default. + unmanaged_files: + - 'lib/main.dart' + - 'ios/Runner.xcodeproj/project.pbxproj' diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..b5d37d7 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "editor.detectIndentation": false +} \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..13b7d34 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,3016 @@ +## v1.26.0 + +- feat: Add advanced configuration page (Krille) +- feat: clearly mark when a video is to be downloaded (Rafał Hirsch) +- feat: Filter for room members page and easier approve knocking users (Krille) +- feat: Navigate in image viewer with keyboard keys (krille-chan) +- feat: New video file picker button (Krille) +- feat: Send optional message with images or files (Krille) +- feat: support inline video playback on macOS (Rafał Hirsch) +- build: Flutter 3.29.3 (Krille) +- build: Update gorouter package (Krille) +- build: Update kotlin gradle plugin (Krille) +- build: Update matrix dart sdk (Krille) +- build: Update openssl to 0.5.0 (Krille) +- build: use singleInstance as launchmode (krille-chan) +- chore: Add matrix notifications for issues (Krille) +- chore: Better error handling for image rendering (krille-chan) +- chore: Better no compression supported UX (Krille) +- chore: Correct availability of desktop builds (Lenni) +- chore: disable echoCancel for audio messages (Krille) +- chore: divider when scrolled up (krille-chan) +- chore: Improve avatar designg (Krille) +- chore: Make push gateway configurable (Krille) +- chore: Nicer colors for reactions (krille-chan) +- chore: Nicer scaffold dialog for column mode (Krille) +- chore: Simpler changing config variables (Krille) +- chore: Update locale config for localizations (Krille) +- chore: Update pubspec.lock (Krille) +- chore: upgrade chewie and video_player packages (Rafał Hirsch) +- chore: Use Cupertino Activity Indicator in ChatEventList (krille-chan) +- chore: Use other join endpoint for room upgrades (Krille) +- fix(macos): update dependencies to make the build work (Rafał Hirsch) +- fix: Add missing \ html tag to render (Krille) +- fix: Consistent element padding between server picker and login view (xegim) +- fix: Index of numbered lists are off (Krille) +- fix: never use a transition on the shell route (Rafał Hirsch) +- fix: Null error in ClientChooserButton (krille-chan) +- fix: prevent users from creating spaces with empty names (ggurdin) +- fix: properly dispose VideoPlayerController (Rafał Hirsch) +- fix: Remove too sensitive dismiss gesture on chat list items (Krille) +- fix: Text scale factor in Linkify widgets (Krille) +- fix: update condition in account deletion function to allow deletion to go through (ggurdin) +- refactor: Easier shift enter logic for text input (Krille) +- refactor: Formatting (Krille) +- refactor: Implement avatar image viewer and adjust design (Krille) +- refactor: Improved UX for room upgrades (Krille) +- refactor: Migrate more config options to config viewer (Krille) +- refactor: Move public room bottom sheet into dialog (Krille) +- refactor: Remove custom font and emoji font workaround (krille-chan) +- refactor: Replace user bottom sheet with menu and small dialog (Krille) +- Added translation using Weblate (Telugu) (katakam chakri) +- Translated using Weblate (Basque) (xabirequejo) +- Translated using Weblate (Chinese (Simplified Han script)) (Poesty Li) +- Translated using Weblate (Chinese (Simplified Han script)) (大王叫我来巡山) +- Translated using Weblate (Chinese (Traditional Han script)) (Mare JP) +- Translated using Weblate (Chinese (Traditional Han script)) (miullu) +- Translated using Weblate (Dutch) (Jelv) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (Filipino) (searinminecraft) +- Translated using Weblate (French) (Antonin Del Fabbro) +- Translated using Weblate (Galician) (josé m) +- Translated using Weblate (German) (nautilusx) +- Translated using Weblate (German) (Very Able) +- Translated using Weblate (Indonesian) (Linerly) +- Translated using Weblate (Irish) (Aindriú Mac Giolla Eoin) +- Translated using Weblate (Italian) (Angelo Schirinzi) +- Translated using Weblate (Korean) (kdh8219) +- Translated using Weblate (Latvian) (Edgars Andersons) +- Translated using Weblate (Latvian) (ℂ𝕠𝕠𝕠𝕝 (𝕘𝕚𝕥𝕙𝕦𝕓.𝕔𝕠𝕞/ℂ𝕠𝕠𝕠𝕝)) +- Translated using Weblate (Polish) (Piotr Orzechowski) +- Translated using Weblate (Russian) (Yurt Page) +- Translated using Weblate (Spanish) (José Muñoz) +- Translated using Weblate (Spanish) (Kimby) +- Translated using Weblate (Telugu) (katakam chakri) +- Translated using Weblate (Ukrainian) (Ihor Hordiichuk) + +## v1.25.0 + +- feat: Display all push rules and allow to enable disable them (Krille) +- feat: Inspect and delete push rules (Krille) +- feat: Pick share keys with (Krille) +- feat: Select share keys with property in security settings (Krille) +- feat: Use dynamic gradient for chat bubbles (Krille) +- fix: Image search rendering problem (krille-chan) +- build: Add locale config for android (krille-chan) +- build: Add missing permissions (Krille) +- build: Automerge weblate PRs (Krille) +- build: Fix ios debug build (krille-chan) +- build: Follow up auto merge weblate (Krille) +- build: remove weblate auto merge (Krille) +- build: Switch to flutter_shortcuts_new (Krille) +- build: Update dependencies for flutter (Krille) +- build: Update dependencies to remove more flutter android v1 references (Krille) +- build: Update fcm_shared_isolate (Krille) +- build: Update flutter web uild (Krille) +- build: Update flutter_olm to 2.0.0 (Krille) +- build: Update gradle version (Krille) +- build: Update native_imaging (Krille) +- build: Update PAT (Krille) +- build: Update to flutter 3.27.4 (Krille) +- build: Update weblate auto merge (Krille) +- build: Upgrade gradle (Krille) +- chore: Add explanation for PlayStore Safety Standards (Krille) +- chore: Add medium font (Krille) +- chore: Add start to ordered list (Krille) +- chore: Add tooltip to links in html (Krille) +- chore: Adjust button icon colors (Krille) +- chore: Adjust design of adaptive dialogs (krille-chan) +- chore: Adjust navrail design (Krille) +- chore: Adjust share scaffold dialog design (Krille) +- chore: Better connection status indicator (Krille) +- chore: Design adjustments (krille-chan) +- chore: Make login with matrix id more prominent again (krille-chan) +- chore: Message bubble color follow up (krille-chan) +- chore: Remove gradle workaround (Krille) +- chore: Slightly adjust welcome screen (Krille) +- chore: Use UbuntuMono (Krille) +- docs: Fix snap store icon (krille-chan) +- refactor: Display navigationrail in settings page (krille-chan) +- refactor: Follow up fix types in localization files (Krille) +- refactor: Improve sso login UX on web (krille-chan) +- refactor: Migrate to maintained badge package (Krille) +- refactor: Migrate uni_links to app_links (Krille) +- refactor: New html rendering (Krille) +- refactor: Remove broken callkeep implementation (Krille) +- refactor: Remove unused class (krille-chan) +- refactor: Switch to maintained qr code package (Krille) +- refactor: Switch to ubuntu font (krille-chan) +- refactor: Update arb file types (Krille) +- Translated using Weblate (Arabic) (Rex_sa) +- Translated using Weblate (Basque) (xabirequejo) +- Translated using Weblate (Catalan) (fadelkon) +- Translated using Weblate (Chinese (Simplified Han script)) (玖然) +- Translated using Weblate (Chinese (Simplified Han script)) (大王叫我来巡山) +- Translated using Weblate (Chinese (Traditional Han script)) (玖然) +- Translated using Weblate (Croatian) (Milo Ivir) +- Translated using Weblate (Dutch) (Jelv) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (Galician) (josé m) +- Translated using Weblate (German) (Christian) +- Translated using Weblate (German) (Ettore Atalan) +- Translated using Weblate (German) (Jana) +- Translated using Weblate (Indonesian) (Linerly) +- Translated using Weblate (Irish) (Aindriú Mac Giolla Eoin) +- Translated using Weblate (Italian) (Angelo Schirinzi) +- Translated using Weblate (Korean) (kdh8219) +- Translated using Weblate (Latvian) (Edgars Andersons) +- Translated using Weblate (Slovak) (Anonymous) +- Translated using Weblate (Spanish) (Alfredo Sola) +- Translated using Weblate (Ukrainian) (Bezruchenko Simon) +- Translated using Weblate (Ukrainian) (Ihor Hordiichuk) + +## v1.24.0 + +- build: Add missing libssl library (krille-chan) +- build: Update dart_webrtc package (Krille) +- build: Update matrix sdk and dependencies (Krille) +- build: Update to flutter 3.27 (Krille) +- chore: Better bottom sheets on desktop (krille-chan) +- chore: Check file size before loading (krille-chan) +- chore: Display normal Slider when no waveform provided in audioplayer (krille-chan) +- chore: Do not display sender prefix for DM rooms in notification ticker (krille-chan) +- chore: Enable share multiple files to app (krille-chan) +- chore: Improve alias UX in chat settings (Krille) +- chore: Improve join abandoned invite exception (Krille) +- chore: Improve UserBottomSheet UX (Krille) +- chore: Make message bubble color dark also in dark mode (krille-chan) +- chore: Remove conversationTitle if room is dm room in android notifications (krille-chan) +- feat: QR Code viewer for mxid sharing (Krille) +- fix: Do not set public visibility for private groups (Krille) +- fix: Use MB and KB instead of MiB and KiB for file sizes (Krille) +- refactor: Adjust chat list item UX (Krille) +- refactor: Better custom image resizer (Krille) +- refactor: Clean up android manifest (Krille) +- refactor: Implement own adaptive dialogs and remove package (krille-chan) +- refactor: Improve UX of user role in UserBottomSheet (Krille) +- refactor: Improved share / forward dialog (krille-chan) +- Translated using Weblate (Arabic) (Rex_sa) +- Translated using Weblate (Basque) (xabirequejo) +- Translated using Weblate (Catalan) (fadelkon) +- Translated using Weblate (Chinese (Simplified Han script)) (大王叫我来巡山) +- Translated using Weblate (Czech) (Erin) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (Galician) (josé m) +- Translated using Weblate (German) (Christian) +- Translated using Weblate (Indonesian) (Linerly) +- Translated using Weblate (Irish) (Aindriú Mac Giolla Eoin) +- Translated using Weblate (Italian) (Angelo Schirinzi) +- Translated using Weblate (Latvian) (Edgars Andersons) +- Translated using Weblate (Polish) (Piotr Orzechowski) +- Translated using Weblate (Russian) (-) +- Translated using Weblate (Tamil) (Christian) +- Translated using Weblate (Tamil) (தமிழ்நேரம்) +- Translated using Weblate (Turkish) (goknarbahceli) +- Translated using Weblate (Ukrainian) (Bezruchenko Simon) +- Translated using Weblate (Vietnamese) (Tewuzij) + +## v1.23.0 + +- design: Highlight emoji only messages (Krille) +- design: New login design (Krille) +- docs: fix snapstore badge on website (Krille) +- feat: Add about server page (Krille) +- feat: Add default chat wallpaper (Krille) +- feat: Add markdown context actions for text input (krille-chan) +- feat: Better wallpapers with blur and opacity sliders and improved styles page (krille-chan) +- feat: Display warning banner on unverified devices (krille-chan) +- feat: New audio message design with displayed body (krille-chan) +- feat: Nicer room creation UI (krille-chan) +- feat: Open account manage url when using MAS (krille-chan) +- feat: Sending multiple files at once (krille-chan) +- feat: Swipe to archive rooms (Krille) +- fix: Bypass image compression in flutter_file_picker (q234rty) +- fix: dont use thumbnails for emoticons (Marek Vospěl) +- fix: Public rooms always publicly visible even when turned off on creation (krille-chan) +- fix: Wait for room invite before open in pushhelper (krille-chan) +- refactor: Better future loading dialog without flickering (krille-chan) +- refactor: Display two lines on new messages (krille-chan) +- refactor: Improve delete device UX flow (krille-chan) +- refactor: Load bytes from sending files later to not let app crash (krille-chan) +- refactor: Migrate to newer keyboard shortcuts package (Krille) +- refactor: Move to upstream geolocator (Krille) +- refactor: Performance boost for avatar widget (Krille) +- refactor: Remove duplicated navigator workaround (krille-chan) +- refactor: Remove keyboard shortcuts (Krille) +- refactor: Remove unnecessary builder widget (krille-chan) +- refactor: Reuse flutter local notifications object (krille-chan) +- refactor: Use adaptive dialog action (Krille) +- refactor: Use file selector on linux (krille-chan) +- refactor: Use non nullable localizations builder and lazy load on web (krille-chan) +- Revert "chore: Follow up new chat design" (Krille) +- Revert "feat: Add default chat wallpaper" (Krille) +- Revert "refactor: Performance boost for avatar widget" (krille-chan) +- Translated using Weblate (Arabic) (Rex_sa) +- Translated using Weblate (Basque) (xabirequejo) +- Translated using Weblate (Catalan) (fadelkon) +- Translated using Weblate (Chinese (Simplified Han script)) (大王叫我来巡山) +- Translated using Weblate (Czech) (Michal Bedáň) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (Finnish) (Priit Jõerüüt) +- Translated using Weblate (Galician) (josé m) +- Translated using Weblate (German) (Christian) +- Translated using Weblate (German) (Ettore Atalan) +- Translated using Weblate (German) (Peter Wallerius) +- Translated using Weblate (Hungarian) (Zentropivity) +- Translated using Weblate (Indonesian) (Linerly) +- Translated using Weblate (Irish) (Aindriú Mac Giolla Eoin) +- Translated using Weblate (Irish) (Christian) +- Translated using Weblate (Italian) (Angelo Schirinzi) +- Translated using Weblate (Korean) (Bruno Roh) +- Translated using Weblate (Korean) (kdh8219) +- Translated using Weblate (Latvian) (Edgars Andersons) +- Translated using Weblate (Latvian) (GGLVXD) +- Translated using Weblate (Russian) (Pavel Kozhukhov) +- Translated using Weblate (Russian) (v1s7) +- Translated using Weblate (Spanish) (Kimby) +- Translated using Weblate (Turkish) (Oğuz Ersen) +- Translated using Weblate (Ukrainian) (Bezruchenko Simon) +- Translated using Weblate (Ukrainian) (Ihor Hordiichuk) + +## v1.22.0 + +FluffyChat v1.22.0 brings a new design for spaces, replaces the bottom navigation bar with filter +chips and makes it finally possible to play ogg audio messages on iOS. A lot of other fixes and +improvements have also been added to this release. + +FluffyChat also now uses the new authenticated media endpoints if the server supports Matrix v1.11 +or +mentions the msc with the key `org.matrix.msc3916.stable` in the `unstable_features`. + +- design: Add snackbar with link to changelog on new version (Krille) +- docs: Update privacy policy (krille-chan) +- feat: Support for matrix auth media endpoints +- feat: Convert opus to aac on iOS before playing (Krille) +- feat: New spaces and chat list design (krille-chan) +- feat: Record voice message with opus/ogg if supported (Krille) +- feat: Send voice messages from web (Krille) +- feat: Add about server page (Krille) +- feat: Add default chat wallpaper (Krille) +- feat: Add markdown context actions for text input (krille-chan) +- feat: Better wallpapers with blur and opacity sliders and improved styles page (krille-chan) +- feat: Display warning banner on unverified devices (krille-chan) +- feat: New audio message design with displayed body (krille-chan) +- feat: Nicer room creation UI (krille-chan) +- feat: Open account manage url when using MAS (krille-chan) +- feat: Sending multiple files at once (krille-chan) +- feat: Swipe to archive rooms (Krille) +- fix: Display only available join rules (Krille) +- fix: Path correct userId to ignore list (krille-chan) +- fix: Scroll to event missing the position (Krille) +- Fix web base url and privacy url configuration processing (dlyrsk) +- refactor: Clean up some widths (krille-chan) +- refactor: Design polishment and better user viewer (Krille) +- refactor: Migrate android gradle plugin (Krille) +- refactor: Only initialize FlutterLocalNotificationsPlugin once (krille-chan) +- refactor: Recording dialog (Krille) +- Refactor: Reduce .of(context) calls theme (Thomas Klein Langenhorst) +- refactor: Use cached network image for mxc image uris (Krille) +- Translated using Weblate (Arabic) (kdh8219) +- Translated using Weblate (Arabic) (Rex_sa) +- Translated using Weblate (Basque) (kdh8219) +- Translated using Weblate (Basque) (xabirequejo) +- Translated using Weblate (Chinese (Simplified)) (kdh8219) +- Translated using Weblate (Chinese (Simplified)) (大王叫我来巡山) +- Translated using Weblate (Chinese (Traditional)) (kdh8219) +- Translated using Weblate (Chinese (Traditional)) (Lukas) +- Translated using Weblate (Chinese (Traditional)) (Ricky From Hong Kong) +- Translated using Weblate (Chinese (Traditional)) (不知火 Shiranui) +- Translated using Weblate (Croatian) (Milo Ivir) +- Translated using Weblate (Czech) (Anonymous) +- Translated using Weblate (Czech) (Michal Bedáň) +- Translated using Weblate (Dutch) (Guacamolie) +- Translated using Weblate (Dutch) (Jelv) +- Translated using Weblate (Dutch) (Thomas Klein Langenhorst) +- Translated using Weblate (Esperanto) (Anonymous) +- Translated using Weblate (Estonian) (kdh8219) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (Finnish) (Anonymous) +- Translated using Weblate (French) (Sovkipyk) +- Translated using Weblate (Galician) (josé m) +- Translated using Weblate (German) (Christian) +- Translated using Weblate (German) (Pixelcode) +- Translated using Weblate (German) (tct123) +- Translated using Weblate (Hebrew) (Anonymous) +- Translated using Weblate (Indonesian) (Linerly) +- Translated using Weblate (Irish) (Anonymous) +- Translated using Weblate (Japanese) (Anonymous) +- Translated using Weblate (Korean) (kdh8219) +- Translated using Weblate (Lithuanian) (Anonymous) +- Translated using Weblate (Norwegian Bokmål) (Anonymous) +- Translated using Weblate (Persian) (Anonymous) +- Translated using Weblate (Portuguese (Portugal)) (Anonymous) +- Translated using Weblate (Romanian) (Anonymous) +- Translated using Weblate (Russian) (-) +- Translated using Weblate (Serbian) (Anonymous) +- Translated using Weblate (Slovenian) (Anonymous) +- Translated using Weblate (Spanish) (Anonymous) +- Translated using Weblate (Turkish) (kdh8219) +- Translated using Weblate (Turkish) (Oğuz Ersen) +- Translated using Weblate (Ukrainian) (Bezruchenko Simon) +- Translated using Weblate (Ukrainian) (Ihor Hordiichuk) + +## v1.21.2 + +Updates the Matrix Dart SDK to fix some minor bugs. + +- Added translation using Weblate (Lojban) (Zig-Rust-Odin) +- build: Update matrix dart sdk (Krille) +- chore: Update last event after decryption (Krille) +- fix: Correctly localize time of date (Krille) +- refactor: Omit local types (Krille) +- Translated using Weblate (Arabic) (Rex_sa) +- Translated using Weblate (Basque) (xabirequejo) +- Translated using Weblate (Chinese (Simplified)) (大王叫我来巡山) +- Translated using Weblate (Croatian) (Milo Ivir) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (Galician) (josé m) +- Translated using Weblate (Hungarian) (H Tamás) +- Translated using Weblate (Korean) (kdh8219) +- Translated using Weblate (Latvian) (Edgars Andersons) +- Translated using Weblate (Polish) (Eryk Michalak) +- Translated using Weblate (Portuguese (Brazil)) (lucasmz-dev) +- Translated using Weblate (Russian) (Nicholas Winterhalter) +- Translated using Weblate (Turkish) (Oğuz Ersen) + +## v1.21.1 + +- build: Update Matrix Dart SDK (Krille) +- build: Update to Flutter 3.22.2 (krille-chan) +- feat: add option to configure reply swipe direction (MrSpoony) +- fix: Add missing unlock button to lockscreen textfield (Krille) +- fix: Auto unlock lock screen (krille-chan) +- Translated using Weblate (Chinese (Simplified)) (大王叫我来巡山) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (Estonian) (Rauno Ots) +- Translated using Weblate (Galician) (josé m) +- Translated using Weblate (Turkish) (Oğuz Ersen) +- Translated using Weblate (Vietnamese) (Karo) + +## v1.21.0 + +FluffyChat v1.21.0 introduces the new search feature which also includes a gallery and files list +for each chat. Several performance improvements have been added under the hood, leading to a much +nicer user experience. + +- feat: Enable download images on iOS, not only share images (krille-chan) +- feat: Search feature (krille-chan) +- build: Update record package (krille-chan) +- build: Use correct pubspec.yaml format for hosted dependency (krille-chan) +- build: Use matrix sdk main branch (krille-chan) +- chore: Change default timeout to 30 min (krille-chan) +- chore: Go back to pub.dev matrix sdk (Krille) +- chore: Hotfix create missing objectbox (Krille) +- chore: Increase default network request timeout (Krille) +- chore: Make bottomnavbar labels always visible (krille-chan) +- chore: Nicer message animation (krille-chan) +- chore: Only load last event sender if necessary (Krille) +- chore: Set a maxsize for textfields (Krille) +- chore: upgrade flutter to 3.22.0 (lauren n. liberda) +- chore: upgrade flutter to 3.22.1 (lauren n. liberda) +- ci: run `flutter gen-l10n` on code_tests (lauren n. liberda) +- design: Improve design of Voice Messages and add 1.25 as speed (Krille) +- fastlane: i18n ru (Yurt Page) +- fastlane: improve full_description.txt (Yurt Page) +- fix: Broken localization with empty strings in it (krille-chan) +- fix: FakeMatrixApi check (krille-chan) +- fix: mxc reactions not rendered correctly (krille-chan) +- fix: Stickers from gboard have black background (Krille) +- fix: voip code breaking from 0.28 (td) +- refactor: Delete database file on failed app start (krille-chan) +- refactor: Display better command hints (Krille) +- refactor: Improve performance of chat list (krille-chan) +- refactor: Precache theme and directchatmatrixid to improve performance in chat list item ( + krille-chan) +- refactor: Update to Matrix Dart SDK 0.29.9 (Krille) +- Translated using Weblate (Croatian) (Milo Ivir) +- Translated using Weblate (Czech) (Jozef Mlich) +- Translated using Weblate (Georgian) (Nicholas Winterhalter) +- Translated using Weblate (German) (Gian Klug) +- Translated using Weblate (Korean) (kdh8219) +- Translated using Weblate (Latvian) (Edgars Andersons) +- Translated using Weblate (Norwegian Bokmål) (sunniva) +- Translated using Weblate (Turkish) (Oğuz Ersen) + +## v1.20.0 + +Design improvements and new advanced UI to manage rooms. + +- build: Fix google services patch (Krille) +- build: Update matrix dart sdk (krille-chan) +- build: Update to Flutter 3.19.6 (krille-chan) +- chore: Let error reporter fill out bug report (krille-chan) +- chore: More nicer event source display (krille-chan) +- chore: Update user has knocked localization with emoji (krille-chan) +- design: Adjust chat settings design (krille-chan) +- design: Adjust settings design (krille-chan) +- design: Fix color of invite button (krille-chan) +- design: Follow up chat settings design (krille-chan) +- design: Follow up settings design (krille-chan) +- design: Improve user permission settings (krille-chan) +- design: New chat access settings (krille-chan) +- design: Redesign permissions settings with dropdownbuttons (krille-chan) +- design: Remake UX of selecting messages and chats (krille-chan) +- refactor: Download on android and iOS with file_picker (krille-chan) +- Translated using Weblate (Arabic) (Rex_sa) +- Translated using Weblate (Basque) (xabirequejo) +- Translated using Weblate (Chinese (Simplified)) (大王叫我来巡山) +- Translated using Weblate (Dutch) (Anonymous) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (Filipino) (searinminecraft) +- Translated using Weblate (Finnish) (Anonymous) +- Translated using Weblate (Galician) (josé m) +- Translated using Weblate (German) (Christian) +- Translated using Weblate (Hungarian) (Máté Menyhárt) +- Translated using Weblate (Indonesian) (Linerly) +- Translated using Weblate (Latvian) (Edgars Andersons) +- Translated using Weblate (Portuguese (Brazil)) (lucasmz) +- Translated using Weblate (Portuguese (Brazil)) (Rudah Ximenes Alvarenga) + +## v1.19.2 + +Bugfix release to mostly fix the new database encryption on Linux and update the translations. + +- build: (deps): bump peaceiris/actions-gh-pages from 3 to 4 (dependabot[bot]) +- build: Update all dependencies and remove vibrator package (krille-chan) +- build: Update emoji picker package (krille-chan) +- build: Update flutter_map package (krille-chan) +- docs: Fix typo in android app description (Krille) +- fix: Allow unencrypted database if gnome keyring not present or platform does not support it ( + krille-chan) +- fix: Background color of images with transparency (Krille) +- fix: Localizations from weblate confused by unknownEvent locale (Krille) +- fix: More logs when database fails to init and trycatch sendInitNotification (Krille) +- Added translation using Weblate (Filipino) (searinminecraft) +- Translated using Weblate (Arabic) (Rex_sa) +- Translated using Weblate (Basque) (xabirequejo) +- Translated using Weblate (Catalan) (fadelkon) +- Translated using Weblate (Chinese (Simplified)) (大王叫我来巡山) +- Translated using Weblate (Chinese (Traditional)) (D0735) +- Translated using Weblate (Chinese (Traditional)) (Kyanos Chiu) +- Translated using Weblate (Croatian) (v1s7) +- Translated using Weblate (English) (v1s7) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (Filipino) (searinminecraft) +- Translated using Weblate (Galician) (josé m) +- Translated using Weblate (Indonesian) (Linerly) +- Translated using Weblate (Interlingua) (kdh8219) +- Translated using Weblate (Italian) (Krystian) +- Translated using Weblate (Korean) (kdh8219) +- Translated using Weblate (Persian) (EndermanXD) +- Translated using Weblate (Polish) (Adam Strączek) +- Translated using Weblate (Polish) (Krystian) +- Translated using Weblate (Russian) (v1s7) +- Translated using Weblate (Swedish) (Joaquim Homrighausen) +- Translated using Weblate (Turkish) (v1s7) +- Translated using Weblate (Ukrainian) (Ihor Hordiichuk) + +## v1.19.1 + +Minor bugfix release for login with SSO on web. + +- feat: Show/hide third column in chat view (krille-chan) +- design: Adjust some colors in inputbar (krille-chan) +- fix: Login with SSO on web (krille-chan) +- fix: Make chat permission settings null and type safe (krille-chan) +- chore: do not use static openssl (ShootingStarDragons) +- refactor: Move room headers into appbar bottom field (krille-chan) +- refactor: new flutter only typing animation (krille-chan) + +## v1.19.0 + +FluffyChat v1.19.0 features an improved design for message bubbles and a lot of fixes under the +hood. + +- build: Update matrix dart sdk (Krille) +- build: Update to flutter 3.19.5 (krille-chan) +- chore: Add missing command hints (krille-chan) +- chore: Add pagekey to custom page builder (Krille) +- chore: Adjust design of typing indicator (Krille) +- chore: Adjust ticker of notifications for Android (Krille) +- chore: Calc blurhash in other thread (Krille) +- chore: Mark muted unread rooms with bold text (krille-chan) +- chore: More minimal matrix pill (Krille) +- chore: Try out CupertinoPage instead of custom transition in router (krille-chan) +- ci: add a license compliance check (lauren n. liberda) +- design: Connect bubbles from same sender (krille-chan) +- design: Display images in correct ratio in timeline (krille-chan) +- design: Make appbar in material you design for mobile mode (krille-chan) +- design: New sticker picker next to emoji picker (krille-chan) +- design: Nicer QR Code design (krille-chan) +- design: Nicer reactions design with size animations (Krille) +- feat: Add insert content via gboard (krille-chan) +- feat: Reply with one button in desktop (krille-chan) +- fix: Do not sync in background mode (krille-chan) +- fix: FluffyChat should assume m.change_password capabilitiy is supported if not present per spec ( + krille-chan) +- fix: never use root navigator for bottom sheets (The one with the braid) +- fix: Remove pantalaimon message with normal error message (krille-chan) +- fix: Search in spaces view (krille-chan) +- fix: Set read marker on web (Krille) +- fix: Point to correct path for auth.html so completing sso login flow no longer 404s (Gavin Mogan) +- refactor: Better logic for removing outdated notifications (Krille) +- refactor: Enhance logic when to mark room as read (krille-chan) +- refactor: Remove old aliases workaround (Krille) +- refactor: Sticker widget code (Krille) +- refactor: Use dart blurhash (Krille) +- Translated using Weblate (Basque) (xabirequejo) +- Translated using Weblate (Interlingua) (Software In Interlingua) + +## v1.18.0 + +- feat: Add speed button for audioplayer (krille-chan) +- feat: enhanced send video functionality by adding toggle send original (Mubeen Rizvi) +- feat: add dialog to hide presence list with long-press (Marcus Hoffmann) +- feat: Add notification shortcuts to android (krille-chan) +- feat: make showing user presence info optional (Marcus Hoffmann) +- feat: Open chat on shortcut click on android (krille-chan) +- fix: BuildContext crash when joining room (krille-chan) +- fix: Export session (krille-chan) +- fix: Notifications open sometimes automatically on android (krille-chan) +- fix: Open room after join (krille-chan) +- fix: Open room by notification happened multiple times (krille-chan) +- fix: Open room links with event id (krille-chan) +- fix: properly initialize hideUnimportantStateEvents setting (Marcus Hoffmann) +- fix: Remove status msg not changeable from old cache (krille-chan) +- fix: use correct icons for chat pin/unpin (Marcus Hoffmann) +- fix: use correct icons for mark read/unread action (Marcus Hoffmann) +- build: Update Linux build files (krille-chan) +- build: Update to Flutter 3.19.1 (Krille) +- chore: Add more information to Person object in android notifications (krille-chan) +- chore: Thumbnail follow up for notifications (Krille) +- refactor: Better download UX with file picker for android and iOS (krille-chan) +- refactor: Use hashcode instead of string to id workaround for notifications (Krille) +- Added translation using Weblate (Belarusian) (kopatych) +- Added translation using Weblate (Interlingua) (Software In Interlingua) +- Translated using Weblate (Arabic) (Rex_sa) +- Translated using Weblate (Basque) (xabirequejo) +- Translated using Weblate (Chinese (Simplified)) (Poesty Li) +- Translated using Weblate (Chinese (Simplified)) (大王叫我来巡山) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (Galician) (josé m) +- Translated using Weblate (German) (Benjamin Wagner) +- Translated using Weblate (Greek) (Benjamin Wagner) +- Translated using Weblate (Russian) (Benjamin Wagner) +- Translated using Weblate (Russian) (v1s7) +- Translated using Weblate (Ukrainian) (Ihor Hordiichuk) +- Translated using Weblate (Ukrainian) (Сергій) + +## v1.17.3 + +- feat: New account data based wallpaper feature (Krille) +- build: Update dependencies (Krille) +- build: Update flutter to 3.16.9 (Krille) +- build: Update matrix dart sdk to 0.25.7 (Krille) +- build: Update minor versions (Krille) +- chore: Adjust status msg design (krille-chan) +- chore: Improved error handling for recovery key (Krille) +- chore: Make stickers smaller (Krille) +- chore: Wait for device keys before ask bootstrap (Krille) +- fix: Missing null check in public room bottom sheet (Krille) +- fix: onDragDone crashes when no files found (Krille) +- fix: Render tg-forward html tags (Krille) +- fix: Use HapticFeedback.selectionClick() for long press on message (Krille) +- fix: whitespaces sometimes encoded in html message (Krille) +- fix: Share invite links of public rooms (Krille) + +## v1.17.2 + +Another minor bugfix release which also implements private read receipts. + +- feat: Implement private read receipts (krille-chan) +- feat: Join room by alias by tpying alias in searchbar (krille-chan) +- fix: Add cancel button to key request dialog (Krille) +- fix: Encode component for links correctly (Krille) +- fix: Forward arbitrary message content (krille-chan) +- fix: Open publicroombottomsheet by alias (krille-chan) +- docs: Add noto animated emojis link (krille-chan) +- docs: New website (krille-chan) +- build: Do not load emojis at initial start on web (krille-chan) +- build: Update flutter to 3.16.8 (krille-chan) +- build: Update sdk to 0.25.6 (Krille) +- chore: Add more explaining text for key verification (krille-chan) +- chore: Resort settings and add more description text (krille-chan) +- refactor: Dialog BuildContext (krille-chan) +- refactor: Use popupmenudivider instead of workaround (krille-chan) +- Translated using Weblate (Arabic) (Rex_sa) +- Translated using Weblate (Basque) (xabirequejo) +- Translated using Weblate (Chinese (Simplified)) (Poesty Li) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (Galician) (josé m) +- Translated using Weblate (German) (nautilusx) +- Translated using Weblate (Russian) (v1s7) +- Translated using Weblate (Swedish) (Flat) +- Translated using Weblate (Ukrainian) (Ihor Hordiichuk) +- Translated using Weblate (Ukrainian) (Сергій) + +## v1.17.1 + +Minor bugfix release. + +- build: Update matrix sdk 0.25.5 (Krille) +- build: Update to flutter 3.16.7 (Krille) +- chore: Remove vibration on iOS for long press (Krille) +- design: Better paddings in tablet mode (krille-chan) +- docs: Fix typo in readme (Krille) +- Fix dependency. missing yq when invoking setup-web. also ensure updated config.json copied in ( + Isaac Johnson) +- fix: text nodes with multiple links crash the timeline (Krille) +- fix: URL too long when reporting bug (Krille) +- fix: Wait for user device keys before start verification (Krille) + +## v1.17.0 + +FluffyChat v1.17.0 refreshes the overall user experience, changes some design and fixes a lot of +bugs. It also replaces the stories feature with matrix presences, introduces a new kind of database +to store the messages locally and improves the performance and app stability. + +- change: Remove wallpaper feature (krille-chan) +- design: Adjust login page design (krille-chan) +- design: Adjust new chat page design (Krille) +- design: Adjust reply design (krille-chan) +- design: New design for login page (krille-chan) +- feat: Add registration buttons for servers with public registration url (krille-chan) +- feat: Animate in new events in timeline (krille-chan) +- feat: Block users who sent invites (krille-chan) +- feat: Display migration notification (Krille) +- feat: Hovermenu for messages for mouse (krille-chan) +- feat: New change password page with server capabilities check (krille-chan) +- feat: Search for public spaces (krille-chan) +- feat: Try out FluffyBox 2 database (Krille) +- fix: Add 3pid email for password reset (krille-chan) +- fix: Audiomessage break app (Krille) +- fix: Cannot change send on enter on desktop (krille-chan) +- fix: Darktheme contrast fixes with primary color (krille-chan) +- fix: Join public rooms (krille-chan) +- fix: Make user admin (krille-chan) +- fix: New json url for homeserver list (krille-chan) +- fix: Open notification for invite crashes app (krille-chan) +- fix: Remove web background (Krille) +- fix: Some links not clickable in messages (Krille) +- fix: Update manual endpoints (Krille) +- fix: Web SSO (Krille) +- refactor: More stable scroll to event (krille-chan) +- refactor: Reinvite other part instead of reopen dm (Krille) +- refactor: Remove todo list feature (krille-chan) +- refactor: Remove unnecessary setState in ChatPage for better performance (krille-chan) +- refactor: Remove unused code (krille-chan) +- refactor: Remove unused localization strings and add ci check (krille-chan) +- refactor: Replace stories feature with presence status msg (Krille) +- refactor: Spaces UX improvements (krille-chan) +- Translated using Weblate (Arabic) (Rex_sa) +- Translated using Weblate (Basque) (xabirequejo) +- Translated using Weblate (Chinese (Simplified)) (Eric) +- Translated using Weblate (Chinese (Simplified)) (Poesty Li) +- Translated using Weblate (Croatian) (Milo Ivir) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (Galician) (josé m) +- Translated using Weblate (German) (Christian) +- Translated using Weblate (German) (nautilusx) +- Translated using Weblate (Hindi) (immodded) +- Translated using Weblate (Italian) (Claudio Maradonna) +- Translated using Weblate (Italian) (Timothy Redaelli) +- Translated using Weblate (Portuguese (Brazil)) (Hermógenes Oliveira) +- Translated using Weblate (Russian) (v1s7) +- Translated using Weblate (Spanish) (José Muñoz) +- Translated using Weblate (Turkish) (Oğuz Ersen) +- Translated using Weblate (Ukrainian) (Ihor Hordiichuk) + +## v1.16.1 + +Test candidate for the new database. + +## v1.16.0 + +- build: Set olm to 1.3.2 to fix android build (krille-chan) +- build: Update dependencies (krille-chan) +- build: Update flutter_olm (Krille) +- build: Update matrix dart sdk to 0.23.0 (Krille) +- build: Update Matrix Dart SDK to 0.24.0 (Krille) +- build: Update openssl crypto (Krille) +- build: Update to flutter 3.16.2 (krille-chan) +- build: Workaround for broken flutter secure storage on linux (krille-chan) +- chore: Add error report for incorrect recovery key (Krille) +- chore: Always show notification popup on android (krille-chan) +- chore: Do not ship unused emoji font for android and iOS (krille-chan) +- chore: Fetch cached presence (Krille) +- chore: Update pubspec.lock (Krille) +- chore: upgrade flutter to 3.16.0 (lauren n. liberda) +- docs: Fix links to GitHub (Jérémie Roquet) +- feat: Display presences in the app (krille-chan) +- feat: Enable experimental suport for dehydrated devices (Krille) +- feat: Improved UX design for new chat page (krille-chan) +- feat: New UX design for create group chat (krille-chan) +- fix: Block users (krille-chan) +- fix: Blurhash crashes on height 0 (krille-chan) +- fix: Do not hide push if app romm in foreground but is in background (krille-chan) +- fix: Do not scroll up on enter chat (Krille) +- fix: emoji import from ZIP file (The one with the braid) +- fix: Encryption dialog crashes in column mode (krille-chan) +- fix: Error widget spamming with dialogs (Krille) +- fix: fcm patch (lauren n. liberda) +- fix: Glitch in event info dialog (krille-chan) +- fix: message bubble position on desktop devices (The one with the braid) +- fix: navigating back from full screen video (Aryan Arora) +- fix: Only load first pinned event (krille-chan) +- fix: Userbottomsheet crash on some edge cases (krille-chan) +- fix: whatever happens with android native libraries since flutter 3.16 (lauren n. liberda) +- refactor: Check if app is in foreground on pushhelper (krille-chan) +- refactor: Event list (krille-chan) +- refactor: Migrate for Flutter 3.16.0 (Krille) +- refactor: Remove copy dialog before opening links (krille-chan) +- Translated using Weblate (Arabic) (Rex_sa) +- Translated using Weblate (Basque) (xabirequejo) +- Translated using Weblate (Bengali) (Allan Nordhøy) +- Translated using Weblate (Bengali) (Anonymous) +- Translated using Weblate (Bengali) (Graeme Power) +- Translated using Weblate (Bengali) (Joaquim Homrighausen) +- Translated using Weblate (Bengali) (Raatty) +- Translated using Weblate (Bengali) (Sorunome) +- Translated using Weblate (Catalan) (Adolfo Jayme Barrientos) +- Translated using Weblate (Catalan) (Anonymous) +- Translated using Weblate (Catalan) (Auri B.P) +- Translated using Weblate (Catalan) (Joaquim Homrighausen) +- Translated using Weblate (Catalan) (Raatty) +- Translated using Weblate (Chinese (Simplified)) (Anonymous) +- Translated using Weblate (Chinese (Simplified)) (Eric) +- Translated using Weblate (Chinese (Traditional)) (Anonymous) +- Translated using Weblate (Chinese (Traditional)) (Joaquim Homrighausen) +- Translated using Weblate (Chinese (Traditional)) (Raatty) +- Translated using Weblate (Chinese (Traditional)) (SuperSonic) +- Translated using Weblate (Croatian) (Anonymous) +- Translated using Weblate (Czech) (Anonymous) +- Translated using Weblate (Czech) (Tomkoid) +- Translated using Weblate (Esperanto) (Anonymous) +- Translated using Weblate (Esperanto) (Joaquim Homrighausen) +- Translated using Weblate (Esperanto) (Raatty) +- Translated using Weblate (Esperanto) (Tirifto) +- Translated using Weblate (Finnish) (Anonymous) +- Translated using Weblate (French) (Anonymous) +- Translated using Weblate (French) (Mæve Rey) +- Translated using Weblate (Galician) (Anonymous) +- Translated using Weblate (Galician) (josé m) +- Translated using Weblate (German) (Bella) +- Translated using Weblate (German) (Christian) +- Translated using Weblate (Greek) (Anonymous) +- Translated using Weblate (Hebrew) (Anonymous) +- Translated using Weblate (Hebrew) (Joaquim Homrighausen) +- Translated using Weblate (Hebrew) (Raatty) +- Translated using Weblate (Hebrew) (Sorunome) +- Translated using Weblate (Hebrew) (y batvinik) +- Translated using Weblate (Hindi) (Anonymous) +- Translated using Weblate (Hungarian) (Anonymous) +- Translated using Weblate (Hungarian) (Joaquim Homrighausen) +- Translated using Weblate (Hungarian) (notramo) +- Translated using Weblate (Hungarian) (Raatty) +- Translated using Weblate (Indonesian) (Anonymous) +- Translated using Weblate (Irish) (Anonymous) +- Translated using Weblate (Irish) (Graeme Power) +- Translated using Weblate (Irish) (Joaquim Homrighausen) +- Translated using Weblate (Irish) (Raatty) +- Translated using Weblate (Italian) (Anonymous) +- Translated using Weblate (Italian) (J. Lavoie) +- Translated using Weblate (Italian) (Joaquim Homrighausen) +- Translated using Weblate (Italian) (Raatty) +- Translated using Weblate (Japanese) (Anonymous) +- Translated using Weblate (Japanese) (cPidx) +- Translated using Weblate (Korean) (Anonymous) +- Translated using Weblate (Korean) (Kim Tae Kyeong) +- Translated using Weblate (Korean) (Raatty) +- Translated using Weblate (Latvian) (Anonymous) +- Translated using Weblate (Lithuanian) (Anonymous) +- Translated using Weblate (Lithuanian) (Mind) +- Translated using Weblate (Norwegian Bokmål) (Allan Nordhøy) +- Translated using Weblate (Norwegian Bokmål) (Anonymous) +- Translated using Weblate (Norwegian Bokmål) (Joaquim Homrighausen) +- Translated using Weblate (Norwegian Bokmål) (Raatty) +- Translated using Weblate (Occidental) (Anonymous) +- Translated using Weblate (Occidental) (OIS) +- Translated using Weblate (Persian) (Anonymous) +- Translated using Weblate (Polish) (Anonymous) +- Translated using Weblate (Portuguese (Brazil)) (Anonymous) +- Translated using Weblate (Portuguese (Portugal)) (Anonymous) +- Translated using Weblate (Portuguese (Portugal)) (Joaquim Homrighausen) +- Translated using Weblate (Portuguese (Portugal)) (Raatty) +- Translated using Weblate (Portuguese (Portugal)) (Tmpod) +- Translated using Weblate (Portuguese) (Allan Nordhøy) +- Translated using Weblate (Portuguese) (Anonymous) +- Translated using Weblate (Portuguese) (Christian) +- Translated using Weblate (Portuguese) (Graeme Power) +- Translated using Weblate (Portuguese) (Joaquim Homrighausen) +- Translated using Weblate (Portuguese) (Raatty) +- Translated using Weblate (Portuguese) (Sorunome) +- Translated using Weblate (Romanian) (Anonymous) +- Translated using Weblate (Russian) (Anonymous) +- Translated using Weblate (Serbian) (Anonymous) +- Translated using Weblate (Serbian) (Joaquim Homrighausen) +- Translated using Weblate (Serbian) (Raatty) +- Translated using Weblate (Serbian) (Слободан Симић(Slobodan Simić)) +- Translated using Weblate (Slovak) (Allan Nordhøy) +- Translated using Weblate (Slovak) (Anonymous) +- Translated using Weblate (Slovak) (Graeme Power) +- Translated using Weblate (Slovak) (Joaquim Homrighausen) +- Translated using Weblate (Slovak) (Raatty) +- Translated using Weblate (Slovenian) (Anonymous) +- Translated using Weblate (Slovenian) (Joaquim Homrighausen) +- Translated using Weblate (Slovenian) (Raatty) +- Translated using Weblate (Spanish) (Anonymous) +- Translated using Weblate (Spanish) (Joaquim Homrighausen) +- Translated using Weblate (Spanish) (José Muñoz) +- Translated using Weblate (Spanish) (Mæve Rey) +- Translated using Weblate (Spanish) (programmerpony) +- Translated using Weblate (Spanish) (Raatty) +- Translated using Weblate (Swedish) (Anonymous) +- Translated using Weblate (Swedish) (Dennis) +- Translated using Weblate (Swedish) (Fredrik Lindqvist) +- Translated using Weblate (Swedish) (paintwithblue) +- Translated using Weblate (Tamil) (Anonymous) +- Translated using Weblate (Tamil) (Graeme Power) +- Translated using Weblate (Tamil) (Joaquim Homrighausen) +- Translated using Weblate (Tamil) (Raatty) +- Translated using Weblate (Tamil) (Sorunome) +- Translated using Weblate (Thai) (Anonymous) +- Translated using Weblate (Tibetan) (Anonymous) +- Translated using Weblate (Turkish) (Anonymous) +- Translated using Weblate (Turkish) (Yourredyknowwhoitisss) +- Translated using Weblate (Vietnamese) (Allan Nordhøy) +- Translated using Weblate (Vietnamese) (Anonymous) +- Translated using Weblate (Vietnamese) (Christian) +- Translated using Weblate (Vietnamese) (Graeme Power) +- Translated using Weblate (Vietnamese) (Joaquim Homrighausen) +- Translated using Weblate (Vietnamese) (Raatty) +- Translated using Weblate (Vietnamese) (Sorunome) + +## v1.15.1 + +- feat: Make all text in chat selectable on desktop (krille-chan) +- chore: Add border to images in timeline (krille-chan) +- chore: added android audio sharing intent (Aryan Arora) +- fix: Dockerfile: install jq in the builder image (David Douard) +- fix: Cannot pin messages of other users (Krille) +- fix: Emojipicker flickering because noRecent (krille-chan) +- fix: LoadProfileBottomSheet accessing disposed outerContext (Aryan Arora) +- fix: More stable scroll up to event (krille-chan) +- fix: Properly capitalize Linux window title (kramo) +- fix: Remove failed to sent events (krille-chan) +- fix: Routing glitch when using SSO on desktop (krille-chan) +- fix: SSO with no identity providers (krille-chan) +- refactor: Do not init client in background mode on Android (krille-chan) +- refactor: Store and fix missing persistence of some values (krille-chan) +- Translated using Weblate (Arabic) (Rex_sa) +- Translated using Weblate (Basque) (xabirequejo) +- Translated using Weblate (Chinese (Simplified)) (Eric) +- Translated using Weblate (Czech) (Vojtěch Fošnár) +- Translated using Weblate (Dutch) (Jelv) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (Finnish) (Aminda Suomalainen) +- Translated using Weblate (German) (Haui) +- Translated using Weblate (Ukrainian) (Ihor Hordiichuk) + +## v1.15.0 + +- feat: Add experimental todo list for rooms (krille-chan) +- feat: better scroll to last read message handling (krille-chan) +- build: Add appid suffix to android debug builds (krille-chan) +- build: Download canvaskit on build for flutter web (krille-chan) +- build: Update to Flutter 3.13.9 (krille-chan) +- chore: Add descriptions in the areYouSure dialogs for better UX (krille-chan) +- chore: Adjust bitrate for smaller voice messages (krille-chan) +- chore: Change way how to seek in audioplayer (Krille) +- chore: Limit image file and video picker until we have a background service (krille-chan) +- chore: Minor design fixes (Krille) +- design: Make incoming messages color more light (krille-chan) +- design: Make key verification an adaptive dialog (krille-chan) +- design: Make own chat bubble primary color for better contrast (krille-chan) +- fix: Create chat dialog crashes sometimes and power level textfield does not validate input ( + krille-chan) +- fix: Remove uncompatible dependencies connectivity_plus and wakelock (Krille) +- fix: Use correct localization for redactedBy (krille-chan) +- fix: noFCM warning dialog (krille-chan) +- fix: render tg-forward as blockquote style (krille-chan) +- fix: Archive does not update its state +- refactor: Change audio codec to opus where supported to have better compatibility with Element ( + Krille) +- refactor: Make file dialog adaptive and adjust design (krille-chan) +- refactor: Preload notification sound on web (Krille) +- refactor: Remove unused config (krille-chan) +- refactor: Remove unused config params (krille-chan) +- refactor: Update FutureLoadingDialog (krille-chan) +- refactor: use locally hosted canvaskit instead of calling google (root) +- Translated using Weblate (Arabic) (Rex_sa) +- Translated using Weblate (Basque) (xabirequejo) +- Translated using Weblate (Chinese (Simplified)) (Eric) +- Translated using Weblate (Croatian) (Milo Ivir) +- Translated using Weblate (German) (Christian) +- Translated using Weblate (German) (Ettore Atalan) +- Translated using Weblate (Hungarian) (H Tamás) +- Translated using Weblate (Polish) (Tomasz W) +- Translated using Weblate (Russian) (v1s7) +- Translated using Weblate (Slovak) (Jozef Gaal) +- Translated using Weblate (Thai) (Amy/Atius) + +## v1.14.5 + +- Hotfix iOS crashes on start +- Hotfix cannot reset applock + +## v1.14.4 + +Minor bugfix release. Please note that because of a Flutter update FluffyChat is no longer +compatible with iOS 11. + +- Translated using Weblate (Spanish) (José Muñoz) +- Translated using Weblate (Spanish) (Yotta Mxt) +- build: Add custom iOS notification sound (Krille) +- build: Set minimum iOS version to 12 +- design: Hide Navigationbar labels (krille-chan) +- design: New notification sound (krille-chan) +- fix: Flutter warnings because of applock animation (krille-chan) +- fix: UIA requests with navigator (krille-chan) +- fix: open story from push notification (Krille-chan) +- refactor: Only preload client for GUI start (krille-chan) + +## v1.14.3 + +- hotfix app lock still displayed even when account is logged out +- Update to Flutter 3.13.6 + +## v1.14.2 + +- hotfix for broken applock screen + +## v1.14.1 + +- fix: Routing bug when adding second account via password login + +## v1.14.0 + +Release with a lot of bugfixes and refactorings under the hood. FluffyChat now uses go_router +instead of vrouter, works with the newest Flutter SDK and supports "reason" field for redactions. +For Android there is a new "background-fetch mode" for Push Notifications which should make +notifications in background faster and more reliable and reduce battery-usage. + +- feat: Background fetch mode on Android (krille-chan) +- feat: Improved mouse support for selecting events (krille-chan) +- feat: Write and display reason for redacting a message (krille-chan) +- build: Add curl to build packages (krille-chan) +- build: Re-add handywindow linux code lines (Krille) +- build: Update Matrix dart sdk to 0.22.3 (Krille) +- build: Update targetSdkVersion to 33 (Android 13) (Krille) +- build: Update to Flutter 3.13.1 (Krille) +- change: Remove widgets feature (Krille) +- chore: Add tailwind.css to gitignore (Krille) +- chore: Display username in userbottomsheet (krille-chan) +- chore: Make appbar buttons correct size (krille-chan) +- chore: Update file picker (krille-chan) +- ci: Build snap on snapcraft again and only promote from ci (krille-chan) +- ci: Test if app builds for iOS (krille-chan) +- design: Add scale animation hover effects on navrail and story buttons (Krille) +- design: Big redesign of three column mode to advanced two column mode (krille-chan) +- design: Chat list design adjustments (Krille) +- design: Display last story as tiny message bubble in chat list (krille-chan) +- design: Improve invite chat UX (krille-chan) +- design: Move chatbackup in adaptive bottom sheet (krille-chan) +- design: New three column layout for wide screens (krille-chan) +- design: Nicer user bottom sheet (krille-chan) +- design: Redesign style page (Krille) +- docs: Update readme (Krille) +- feat/ChatListItem: small changes (gilice) +- fix: Bootstrap on first try fails sometimes (krille-chan) +- fix: Cancel search on back button tap on android (Krille) +- fix: Do not allow empty search server (krille-chan) +- fix: First story appears to be unencrypted sometimes (krille-chan) +- fix: Remove mpv and zenity to fix linux snap builds (krille-chan) +- fix: Unable to send files from snap version (krille-chan) +- refactor: Change group description to chat description (krille-chan) +- refactor: Make router static (Krille) +- refactor: Migrate from pathsegment routing (Krille) +- refactor: Migrate routes to go router (krille-chan) +- refactor: Remove bubble size slider (Krille) +- refactor: Replace vrouter with gorouter (Krille) +- refactor: Space routes to normal room routes (Krille) +- refactor: Update badge (krille-chan) +- refactor: Update html build files (krille-chan) +- Added translation using Weblate (Toki Pona) (Sollee) +- Deleted translation using Weblate (Toki Pona) (Christian) +- Translated using Weblate (Arabic) (Rex_sa) +- Translated using Weblate (Basque) (xabirequejo) +- Translated using Weblate (Chinese (Simplified)) (Eric) +- Translated using Weblate (Chinese (Simplified)) (Poesty Li) +- Translated using Weblate (Croatian) (Milo Ivir) +- Translated using Weblate (Czech) (Flibble) +- Translated using Weblate (Czech) (Matyáš Caras) +- Translated using Weblate (Dutch) (Jelv) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (Galician) (josé m) +- Translated using Weblate (German) (Christian) +- Translated using Weblate (German) (nautilusx) +- Translated using Weblate (Indonesian) (Linerly) +- Translated using Weblate (Japanese) (Christian) +- Translated using Weblate (Russian) (DarkCoder15) +- Translated using Weblate (Russian) (v1s7) +- Translated using Weblate (Turkish) (Oğuz Ersen) +- Translated using Weblate (Ukrainian) (Ihor Hordiichuk) +- Translated using Weblate (Ukrainian) (Skrripy) + +## v1.13.0 + +- feat: option to not send typing notifications (Bnyro) +- feat: small performance tweaks for Message (gilice) +- feat: New onboarding screen with SSO as first class feature +- feat: Import/Export emoji packs from/to zip file +- fix: Set iOS badge (Krille) +- refactor: Switch the dev hosting platform from GitLab to GitHub +- design: New more compact chat bubble design and other design tweaks +- design: Login now shows SSO more prominent and deprecates in-app registration in favor of SSO + registration +- Translated using Weblate (Arabic) (Rex_sa) +- Translated using Weblate (Chinese (Simplified)) (Poesty Li) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (German) (nautilusx) +- Translated using Weblate (Indonesian) (Linerly) +- Translated using Weblate (Ukrainian) (Ihor Hordiichuk) + +## v1.12.0 + +- Added translation using Weblate (Toki Pona) (Mæve Rey) +- Translated using Weblate (Arabic) (Rex_sa) +- Translated using Weblate (Chinese (Simplified)) (Eric) +- Translated using Weblate (Croatian) (Milo Ivir) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (Galician) (josé m) +- Translated using Weblate (Indonesian) (Linerly) +- Translated using Weblate (Polish) (lauren n. liberda) +- Translated using Weblate (Romanian) (Riley) +- Translated using Weblate (Russian) (DarkCoder15) +- Translated using Weblate (Spanish) (José Muñoz) +- Translated using Weblate (Ukrainian) (Ihor Hordiichuk) +- build: Remove dependency overwrite for ffi (Krille) +- build: Update dependencies (Krille) +- builds: Change minsdkversion of Android from 16 to 19 (Krille) +- builds: Do not allow failure for linux x86 (Krille) +- builds: Do not use verbose mode on building linux (Krille) +- builds: Linux with flutter 3.10 (Krille) +- builds: Remove workaround for building linux arm64 (Krille) +- builds: Update file_picker to 5.3.0 (Krille) +- builds: Update flutter table html (Krille) +- builds: Update flutter_html (Krille) +- builds: migrate to dart 3.0/flutter 3.10 (lauren n. liberda) +- chore: Add missing blockquote style (Krille) +- chore: Allow failure in build linux for now (Krille) +- chore: Ask for storage persistence (Krille) +- chore: Clean unused translations (Malin Errenst) +- chore: Enhance room pills (Krille) +- chore: Minor code clean up (Krille) +- chore: Update flutter webrtc (Krille) +- chore: Upgrade to Flutter 3.10.1 (Malin Errenst) +- chore: change release curl calls to use --fail-with-body (Tim Flink) +- chore: update macOS icons and add build script (TheOneWithTheBraid) +- design: Replace anime images with neutral cupertino icons (Krille) +- feat: Add toggle to mute notifications from chat groups (fbievan) +- feat: Allow ruby tags in html (Krille) +- feat: Display progress value for initial sync (Krille) +- feat: Implement new error reporting tool when critical features break like playing audio or video + messages or opening a chat (Krille) +- feat: clean up macOS build metadata (TheOneWithTheBraid) +- feat: set display information correctly (TheOneWithTheBraid) +- feat: update macOS build files (TheOneWithTheBraid) +- feat: update macOS build information for macOS Ventura (TheOneWithTheBraid) +- fix "Unhandled Exception: VRouter.of(context) was called with a context which does not contain a + VRouter." (Lauren N. Liberda) +- fix: Broken arb file (Krille) +- fix: Do not unnecessary request all members in public rooms (Krille) +- fix: Remove wrong rendered linebreak in html (Krille) +- fix: Scroll down button (Krille) +- fix: Scroll up and scroll down buttons in chat list (Krille) +- fix: Scrolldown button (Krille) +- fix: Too long file name cause a render overflow (Skying) +- fix: Try to reload timeline on IOException (Krille) +- fix: User pills (Krille) +- fix: broken CI artifact uploads (TheOneWithTheBraid) +- fix: custom emote placeholder (TheOneWithTheBraid) +- fix: path of libolm (TheOneWithTheBraid) +- fix: Quick account switching (JHansen) +- fix: read reciepts (JHansen) +- perf: Use valuenotifier to not rebuild chatlist (Krille) +- refactor: Reimplement flutter matrix html locally (Krille) +- refactor: Update Roboto and Noto Emoji (The one with the Braid) +- refactor: Use AnimatedSize for FAB (Krille) +- refactor: Use DateTime for weekday localization (Malin Errenst) + +## v1.11.2 + +- Translated using Weblate (Croatian) (Milo Ivir) +- Translated using Weblate (Dutch) (Jelv) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (Galician) (josé m) +- Translated using Weblate (Polish) (Eryk Michalak) +- Translated using Weblate (Turkish) (Oğuz Ersen) +- Translated using Weblate (Ukrainian) (Ihor Hordiichuk) +- feat: Permission dialog before open link in browser (Krille) +- fix: Chats do not load (Krille) + +## v1.11.1 - 2023-04-20 + +- fix: Download files on web and iOS with correct mimetype + +## v1.11.0 - 2023-04-14 + +- feat: Add visual read marker (Krille) +- feat: Jump to last read event (Krille) +- feat: Use fragmented timeline to jump to event (Krille) +- feat: change to flutterwebauth2 (ShootingStarDragons) +- fix: Join public room (Krille) +- fix: Set fcm priority to max on android (Krille) +- refactor: CI scripts and old workarounds for build scripts (Krille) +- refactor: Client in ChatPage (Krille) +- refactor: Not nullable room in ChatPage (Krille) +- refactor: Switch to file_picker package and get rid of some dependency overrides (Krille) +- refactor: Use correct Matrix instance (Krille) +- style: Make emptypage logo bigger (Krille) +- style: Minor adjustments for modal bottom sheets (Krille) +- style: Move chats to top (Krille) +- style: Use SliverList for chatlist (Krille) +- refactor: Container -> SizedBox.shrink() (noob_tea) +- Translated using Weblate (Chinese (Simplified)) (Eric) +- Translated using Weblate (Dutch) (Jelv) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (French) (Anne Onyme 017) +- Translated using Weblate (Galician) (josé m) +- Translated using Weblate (Indonesian) (Linerly) +- Translated using Weblate (Persian) (Parsa) +- Translated using Weblate (Persian) (Siavash) +- Translated using Weblate (Polish) (Luna) +- Translated using Weblate (Swedish) (Kristoffer Grundström) +- Translated using Weblate (Turkish) (Oğuz Ersen) +- Translated using Weblate (Ukrainian) (Ihor Hordiichuk) + +## v1.10.0 - 2023-02-25 + +- Added translation using Weblate (Thai) (Wphaoka) +- Added translation using Weblate (Tibetan) (Nathan Freitas) +- Default hardcoded message when l10n is not available (fabienli) +- Fix: The stable repo fingerprint (TODO the qr-code should be updated) (machiav3lli) +- Translated using Weblate (Basque) (xabirequejo) +- Translated using Weblate (Dutch) (Jelv) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (French) (Anne Onyme 017) +- Translated using Weblate (Galician) (josé m) +- Translated using Weblate (Galician) (josé m) +- Translated using Weblate (Indonesian) (Linerly) +- Translated using Weblate (Japanese) (Suguru Hirahara) +- Translated using Weblate (Persian) (Farooq Karimi Zadeh) +- Translated using Weblate (Swedish) (Joaquim Homrighausen) +- Translated using Weblate (Turkish) (Oğuz Ersen) +- Translated using Weblate (Ukrainian) (Ihor Hordiichuk) +- chore: Disable stable for web until script is fixed (Krille) +- chore: Display warning when logout without backup (Krille) +- chore: Downgrade flutter CI version (Krille) +- chore: Follow up audioplayer on linux (Krille) +- chore: Follow up chat encryption desgin (Krille) +- chore: Follow up fix audioplayer on android (Christian Pauly) +- chore: Follow up formatting (Christian Pauly) +- chore: Follow up formatting (Krille) +- chore: Follow up remove hero animation (Krille) +- chore: Follow up secrity settings design (Krille) +- chore: Follow up settings page (Krille) +- chore: Follow up settings page design (Christian Pauly) +- chore: Follow up style adjustments (Krille) +- chore: Lookup l10n in pushhelper if null (Krille) +- chore: Update matrix package to 0.17.0 (Krille) +- chore: Update to Flutter 3.7.1 (Krille) +- docs/qr-stable.svg: update the QR code (Aminda Suomalainen) +- feat: Enable audioplayer for web and linux (Christian Pauly) +- fix: Display error when user tries to send too large file (Christian Pauly) +- refactor: Do only instantiate AudioPlayer() object when in use (Christian Pauly) +- refactor: Remove syncstatus verbose logs (Christian Pauly) +- refactor: Store cached files in tmp directory so OS will clear file cache from time to time ( + Krille) +- style: Adjust key verification dialog (Christian Pauly) +- style: Bootstrap design adjustments (Christian Pauly) +- style: Encryption page adjustments (Christian Pauly) +- style: Enhance user device settings design (Krille) +- style: Enhanced chat details design (Krille) +- style: Give chat list list tiles rounded corners (Krille) +- style: Link underline color (Christian Pauly) +- style: Make adaptive bottom sheets scrollable by default (Krille) +- style: Make invite page more pretty (Krille) +- style: New settings design (Krille) +- style: Nicer chips in encryption settings and icons showing device status (Krille) +- style: Use emojis on web as well (Christian Pauly) +- style: Use robotomono to display device keys (Christian Pauly) +- utils/url_launcher: force opening http(s) links in external browser (Marcus Hoffmann) + +## v1.9.0 - 2023-01-29 + +- Translated using Weblate (Czech) (Michal Bedáň) +- Translated using Weblate (Czech) (grreby) +- Translated using Weblate (Dutch) (Jelv) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (Galician) (josé m) +- Translated using Weblate (German) (Christian) +- Translated using Weblate (German) (Vri 🌈) +- Translated using Weblate (Indonesian) (Linerly) +- Translated using Weblate (Korean) (Youngbin Han) +- Translated using Weblate (Polish) (Wiktor) +- Translated using Weblate (Turkish) (Oğuz Ersen) +- Translated using Weblate (Ukrainian) (Ihor Hordiichuk) +- chore: Change invite link textfield label (Krille) +- chore: Remove unused dependency (Krille) +- chore: Remove unused translations (Krille) +- chore: Update Matrix SDK and refactor (Krille) +- chore: Update dependencies (Krille) +- chore: Update flutter_map (Krille) +- chore: add integration tests (TheOneWithTheBraid) +- chore: add integration tests for spaces (TheOneWithTheBraid) +- design: More clear chat background and rounded popup menu (Krille) +- design: Nicer navigationrail (Krille) +- design: Upgrade to Flutter 3.7 +- feat: Bring back disabling the header bar on Linux desktop (q234rty) +- feat: Nicer design for abandonded DM rooms (Christian Pauly) +- fix: Archive (Krille) +- fix: Shared preferences package for flutter 3.7 (Christian Pauly) +- fix: permission of web builds (TheOneWithTheBraid) +- fix: Notification Settings (Krille) +- refactor: Migrate to Flutter 3.7.0 (Christian Pauly) +- refactor: Same animations everywhere in app (Krille) +- refactor: Stories header with futurebuilder (Krille) +- refactor: disable some redundant tests (TheOneWithTheBraid) +- style: Animate in out search results (Krille) +- style: New modal bottom sheets (Krille) +- style: Redesign public room bottomsheets (Krille) + +## v1.8.0 2022-12-30 + +- Added translation using Weblate (Yue (yue_HK)) (Raatty) +- Translated using Weblate (Chinese (Simplified)) (Mike Evans) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (French) (Anne Onyme 017) +- Translated using Weblate (Indonesian) (Linerly) +- Translated using Weblate (Turkish) (Oğuz Ersen) +- Translated using Weblate (Ukrainian) (Ihor Hordiichuk) +- design: New encryption page (Krille Fear) +- feat: Add audio message support to linux (Krille Fear) +- feat: Use Android system accent color (Krille Fear) +- feat: include olm to Windows builds (TheOneWithTheBraid) +- feat: Store drafts (Krille) +- fix: Android push notification follow-up (TheOneWithTheBraid) +- fix: Content banner (Krille Fear) +- fix: Correct redacted by username (Krille Fear) +- fix: Do not setup push on every app resume (Krille Fear) +- fix: Encryption button is orange in public rooms (Krille Fear) +- fix: File event design (Krille Fear) +- fix: Hide google services warning after marked (Krille Fear) +- fix: Improve story page appearance (Reinhart Previano Koentjoro) +- fix: Libhandy windows (Krille Fear) +- fix: Monochromatic icon rendering for Android 13+ (Reinhart Previano Koentjoro) +- fix: homeserver error text not visible in app bar (TheOneWithTheBraid) +- fix: minor issues in room list (TheOneWithTheBraid) + +## v1.7.2 2022-12-19 + +Update dependencies and translations. + +## v1.7.1 2022-11-23 + +Minor bugfix release to retrigger build for FlatPak and Android. Fixes some style bugs and updates +some translations + +## v1.7.0 2022-11-17 + +FluffyChat 1.7.0 features a new way to work with spaces via a bottom navigation bar. A lot of work +has also been done under the hood to make the app faster and more stable. The main color has +slightly changed and the design got some finetuning. + +- chore: Add keys to roomlist and stories header (Christian Pauly) +- chore: Add unread badge to navigation rail and adjust design (Christian Pauly) +- chore: Adjust colors (Christian Pauly) +- chore: Better design chat list items (Christian Pauly) +- chore: Better load first client (Christian Pauly) +- design: Hide unimportant state events instead of folding (Christian Pauly) +- design: Improve login design (Krille Fear) +- design: Nicer display notification short texts (Christian Pauly) +- feat: background and terminated calls [android] (td) +- feat: New navigation design (Christian Pauly) +- fix: Hide password at login page (Krille Fear) +- fix: Import session on iOS (Christian Pauly) +- fix: incorrect setState inside setState in ChatListController (td) +- fix: Password not obscure for a second when submitting login textfield (Christian Pauly) +- fix: Popup menu without elevation (Christian Pauly) +- fix: Push error message (Christian Pauly) +- fix: Remove emoji picker workaround (Christian Pauly) +- fix: Set theme after start app (Christian Pauly) +- fix: Settings profile picture (Christian Pauly) +- fix: Share files (Christian Pauly) +- fix: UIA request handler (Christian Pauly) +- fix: Update emoji picker for web and desktop (Christian Pauly) +- improved (most) icons/image scaling, including avatar scaling (Mg138) +- Mention Element instead of Riot (Has been renamed about a year ago) (jooooscha) +- refactor: Chat list body code (Christian Pauly) +- refactor: Minor chatlist refactoring (Christian Pauly) +- refactor: No longer need selected of chat list tile (Christian Pauly) +- refactor: Remove unused dependencies (Krille Fear) +- Added translation using Weblate (Hindi) (Hemish) +- Added translation using Weblate (Occidental) (OIS) +- Translated using Weblate (Basque) (xabirequejo) +- Translated using Weblate (Chinese (Simplified)) (Eric) +- Translated using Weblate (Chinese (Simplified)) (Raatty) +- Translated using Weblate (Dutch) (Jelv) +- Translated using Weblate (English) (Raatty) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (Estonian) (Raatty) +- Translated using Weblate (Finnish) (Aminda Suomalainen) +- Translated using Weblate (Finnish) (Raatty) +- Translated using Weblate (French) (Anne Onyme 017) +- Translated using Weblate (Galician) (Xosé M) +- Translated using Weblate (German) (Jana) +- Translated using Weblate (Indonesian) (Linerly) +- Translated using Weblate (Lithuanian) (Anonimas) +- Translated using Weblate (Occidental) (OIS) +- Translated using Weblate (Persian) (Anastázius Darián) +- Translated using Weblate (Persian) (Anastázius Kaejatídarján) +- Translated using Weblate (Persian) (Seyedmahdi Moosavyan) +- Translated using Weblate (Russian) (Nikita Epifanov) +- Translated using Weblate (Turkish) (Oğuz Ersen) +- Translated using Weblate (Turkish) (Raatty) +- Translated using Weblate (Ukrainian) (Ihor Hordiichuk) +- Translated using Weblate (Ukrainian) (Raatty) + +## v1.6.4 - 2022-09-08 + +- Translated using Weblate (Chinese (Simplified)) (Eric) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (Galician) (Xosé M) +- Translated using Weblate (Indonesian) (Linerly) +- Translated using Weblate (Slovak) (Marek Ľach) +- Translated using Weblate (Turkish) (Oğuz Ersen) +- Translated using Weblate (Ukrainian) (Ihor Hordiichuk) +- chore: Adjust bubble color in dark mode (Christian Pauly) +- chore: Update matrix sdk (Christian Pauly) +- chore: Update to flutter 3.3.0 (Christian Pauly) +- feat: Automatic key requests and better key error dialog (Christian Pauly) +- fix: Styling and notification settings (Christian Pauly) +- fix: add missing command localizations (Christian Pauly) + +## v1.6.3 - 2022-08-25 + +- Translated using Weblate (Chinese (Simplified)) (Eric) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (Finnish) (Aminda Suomalainen) +- Translated using Weblate (Russian) (Sergey Shavin) +- Translated using Weblate (Turkish) (Oğuz Ersen) +- Translated using Weblate (Ukrainian) (Ihor Hordiichuk) +- chore: Migrate back to flutter hive collections (Christian Pauly) +- chore: Update provider package and remove dep override (Christian Pauly) +- fix: Do not display push events for unknown event types (Christian Pauly) +- refactor: App widget (Christian Pauly) + +## v1.6.0 - 2022-07-31 + +FluffyChat 1.6.0 features a lot of bug fixes and improvements. The code base has been +simplified and the drawer on the chat list page got a come-back. Some new features like +the space hierarchy and session dump have been implemented. + +- feat: Added monochrome entry for themed icon support in Android 13 (James Reilly) +- feat: Display timeline of messages in android notification (Christian Pauly) +- feat: Emoji related fixes (TheOneWithTheBraid) +- feat: Implement deleting pushers in app (Christian Pauly) +- feat: New material 3 design (Christian Pauly) +- feat: Redesign bootsstrap and offer secure storage support (Christian Pauly) +- feat: Send multiple images at once (Christian Pauly) +- feat: implement session dump (TheOneWithTheBraid) +- feat: implement space hierarchy (TheOneWithTheBraid) +- feat: introduce extended integration tests (TheOneWithTheBraid) +- feat: libhandy integration (TheOneWithTheBraid) +- fix: Clearing push triggered when only one room got seen (Christian Pauly) +- fix: Dont display loading dialog when adding reaction (Christian Pauly) +- fix: Follow up for spaces hierarchy (TheOneWithTheBraid) +- fix: Missing null checks in chat details view (Christian Pauly) +- fix: Non FCM Android builds crash on start (Christian Pauly) +- fix: Permission chooser dialog on iOS (Christian Pauly) +- fix: Set avatar on only single action available (Christian Pauly) +- fix: Sharing on iOS and iPad (Christian Pauly) +- fix: Unread bubble is invisible in dark mode (Christian Pauly) +- fix: appimage builds (TheOneWithTheBraid) +- fix: only use custom http client on android (Jayesh Nirve) +- fix: pass isrg cert to http client (Jayesh Nirve) +- refactor: Chat view (Christian Pauly) +- refactor: Encryption button (Christian Pauly) +- refactor: Remove duplicated imports (Christian Pauly) +- refactor: Remove legacy store (Christian Pauly) +- refactor: Remove presence status feature (Christian Pauly) +- refactor: Simplify MxcImage and replace CachedNetworkImage (Christian Pauly) +- refactor: Switch to Hive Collections DB (Christian Pauly) +- refactor: move start chat FAB to implementation file (TheOneWithTheBraid) +- Translated using Weblate (Catalan) (Alfonso Montero López) +- Translated using Weblate (Catalan) (Auri B.P) +- Translated using Weblate (Chinese (Simplified)) (Eric) +- Translated using Weblate (Croatian) (Milo Ivir) +- Translated using Weblate (Dutch) (Jelv) +- Translated using Weblate (English) (Raatty) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (Finnish) (Aminda Suomalainen) +- Translated using Weblate (Galician) (Xosé M) +- Translated using Weblate (Indonesian) (Linerly) +- Translated using Weblate (Persian) (Amir Hossein Maher) +- Translated using Weblate (Polish) (Przemysław Romanik) +- Translated using Weblate (Russian) (Nikita Epifanov) +- Translated using Weblate (Turkish) (Oğuz Ersen) +- Translated using Weblate (Ukrainian) (Ihor Hordiichuk) +- chore: Add border to avatars (Christian Pauly) +- chore: Add fancy hero animations (Christian Pauly) +- chore: Adjust appbar design (Christian Pauly) +- chore: Adjust design (Christian Pauly) +- chore: Adjust search bar design (Christian Pauly) +- chore: Always display header elevation in chat (Christian Pauly) +- chore: Design follow up fixes (Christian Pauly) +- chore: Design follow up fixes (Christian Pauly) +- chore: Disable integration tests without runners (Krille Fear) +- chore: Enhance invitiation UX (Christian Pauly) +- chore: Make push helper more fail safe (Christian Pauly) +- chore: Make push helper more stable (Christian Pauly) +- chore: Minor design improvements (Christian Pauly) +- chore: Pinned events design (Christian Pauly) +- chore: Remove permission handler dependency and increase compileSdkVersion (Christian Pauly) +- chore: Switch to flutter 3.0.5 (Krille Fear) +- chore: Update SDK (Christian Pauly) +- chore: remove snapping sheet (TheOneWithTheBraid) + +## v1.5.0 - 2022-06-03 + +- Translated using Weblate (Ukrainian) (Ihor Hordiichuk) +- feat: Better sign up UX and allow signup without password (Christian Pauly) +- feat: Initial material you support (Christian Pauly) +- feat: include Synapse into integration test (TheOneWithTheBraid) +- fix: Broken dynamic color palette (Christian Pauly) +- fix: Build on iOS emulator (Christian Pauly) +- fix: Missing bottom padding in text only stories (Christian Pauly) +- fix: Send sticker without blocking the UI (Christian Pauly) +- fix: Sentry switch being broken (Sorunome) +- fix: add new Play patch (TheOneWithTheBraid) +- fix: handle matrix.to prefix when starting chat (TheOneWithTheBraid) +- fix: minor design bugs (TheOneWithTheBraid) +- fix: privacy in sign up (TheOneWithTheBraid) +- fix: properly set app title in embedder (TheOneWithTheBraid) +- fix: proprietory classes included into build (TheOneWithTheBraid) +- fix: remove proprietary classes from build (TheOneWithTheBraid) +- refactor: Sharing intent (Christian Pauly) +- refactor: Stories header (Christian Pauly) +- refactor: Update Matrix SDK (Christian Pauly) +- refactor: Upgrade to Flutter 3.0.0 (Christian Pauly) +- Translated using Weblate (Basque) (—X—) +- Translated using Weblate (Chinese (Simplified)) (Eric) +- Translated using Weblate (Croatian) (Milo Ivir) +- Translated using Weblate (Czech) (Milan Korecky) +- Translated using Weblate (Dutch) (Jelv) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (Galician) (Xosé M) +- Translated using Weblate (Indonesian) (Linerly) +- Translated using Weblate (Lithuanian) (Mind) +- Translated using Weblate (Portuguese (Brazil)) (Hermógenes Oliveira) +- Translated using Weblate (Portuguese (Brazil)) (mmagian) +- Translated using Weblate (Russian) (Nikita Epifanov) +- Translated using Weblate (Turkish) (Oğuz Ersen) + +## v1.4.0 - 2022-04-23 + +- design: Display icon for failed sent messages (Krille Fear) +- design: Display own stories at first place and combine with new stories button (Krille Fear) +- feat: Add "Show related DMs in spaces" settings (20kdc) +- feat: Better image sending experience (Krille Fear) +- feat: Display event timestamp if selected (Krille Fear) +- feat: Faster image resizing (Krille Fear) +- feat: Groups and Direct Chats virtual spaces option (20kdc) +- feat: New onboarding design (Krille Fear) +- feat: Onboarding with dynamic homeservers from joinmatrix.org (Krille Fear) +- feat: Play audio messages in stories (Krille Fear) +- feat: Use native imaging for much faster thumbnail calc on mobile (Krille Fear) +- feat: add Dockerfile for nginx/web builds (TheOneWithTheBraid) +- feat: allow to create widgets (TheOneWithTheBraid) +- feat: remove diacritics (henri2h) +- feat: irish language support (Graeme Power) +- feat: Enable screensharing on Mobile +- feat: support AppImage builds +- feat: Improve spaces design +- fix: Android theme is not auto updating when system theme changes (Krille Fear) +- fix: Chat view becomes gray for a second on sending reaction (Krille Fear) +- fix: Don't request new thumbnail resolution on every window resize (Samuel Mezger) +- fix: Dont display own failed-to-send events in stories (Krille Fear) +- fix: Hide markdown in chat list preview and local notifications (Krille Fear) +- fix: Hide pinned events if event is not accessable or loading (Krille Fear) +- fix: Image sending (Krille Fear) +- fix: Make audioplayer waveforms thinner and better clickable (Krille Fear) +- fix: Some story layout bugs (Krille Fear) +- fix: Widgets dialog crashes (Krille Fear) +- fix: login form supports switching fields via tab (Philip Molares) +- Added translation using Weblate (Lithuanian) (Mind) +- Translated using Weblate (Chinese (Simplified)) (Eric) +- Translated using Weblate (Croatian) (Milo Ivir) +- Translated using Weblate (Dutch) (Jelv) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (Finnish) (Aminda Suomalainen) +- Translated using Weblate (French) (Anne Onyme 017) +- Translated using Weblate (Galician) (Xosé M) +- Translated using Weblate (German) (Krille) +- Translated using Weblate (German) (qwerty287) +- Translated using Weblate (Indonesian) (Linerly) +- Translated using Weblate (Japanese) (Krille) +- Translated using Weblate (Lithuanian) (Mind) +- Translated using Weblate (Portuguese (Brazil)) (Hermógenes Oliveira) +- Translated using Weblate (Russian) (Arbo_Leet) +- Translated using Weblate (Russian) (Nikita Epifanov) +- Translated using Weblate (Russian) (alekseishaklov) +- Translated using Weblate (Swedish) (Joaquim Homrighausen) +- Translated using Weblate (Turkish) (Oğuz Ersen) +- Translated using Weblate (Ukrainian) (Ihor Hordiichuk) +- Update TRANSLATORS_GUIDE.md to have improved punctuation, capitalization (Scott Anecito) +- chore: Add initial integration tests (Krille Fear) +- refactor: New push (Krille Fear) + +## v1.3.1 - 2022-03-20 + +- Allow app to be moved to external storage (Marcel) +- Translated using Weblate (Arabic) (Mads Louis) +- Translated using Weblate (Basque) (Sorunome) +- Translated using Weblate (Basque) (—X—) +- Translated using Weblate (Chinese (Simplified)) (Eric) +- Translated using Weblate (Czech) (Sorunome) +- Translated using Weblate (Dutch) (Jelv) +- Translated using Weblate (English) (Raatty) +- Translated using Weblate (French) (Anne Onyme 017) +- Translated using Weblate (Galician) (Xosé M) +- Translated using Weblate (German) (Maciej Krüger) +- Translated using Weblate (Indonesian) (Linerly) +- Translated using Weblate (Irish) (Graeme Power) +- Translated using Weblate (Persian) (Anastázius Darián) +- Translated using Weblate (Russian) (Nikita Epifanov) +- Translated using Weblate (Swedish) (Joaquim Homrighausen) +- Translated using Weblate (Turkish) (Oğuz Ersen) +- Translated using Weblate (Ukrainian) (Ihor Hordiichuk) +- Update proguard rules to a more modern setup (MTRNord) +- chore: Minor story viewer fixes (Krille Fear) +- chore: Remove story line count and make answering to stories online (Krille Fear) +- chore: Update dependencies (Dependency Update Bot) +- design: Make pinned events use less vertical space (Krille Fear) +- feat: Extended stories (Krille Fear) +- feat: Restrict map zoom to tile server capabilities (Marcel) +- feat: implement keyboard shortcuts (TheOneWithTheBraid) +- fix: Build on macOS (Krille Fear) +- fix: Emojipicker issues (Krille Fear) +- fix: Hide redacted stories (Krille Fear) +- fix: Mark story as read (Krille Fear) +- fix: Open room from notification click produces errors (Krille Fear) +- fix: SSO on Android 12 (Krille Fear) +- fix: Send read receipts on all taps (Krille Fear) +- fix: make fluffy usable at 720 px wide (Raatty) +- fix: Add forgotten sendOnEnter (Krille Fear) +- refactor: Switch to just audio for playing sounds (Krille Fear) + +## v1.3.0 - 2022-02-12 + +FluffyChat 1.3.0 makes it possible to report offensive users to server admins (not only messages). +It fixes +the video player, improves Linux desktop notifications, and the stories design. + +The button to create a new story is now in the app bar of the main page so that users who don't want +to use +this feature no longer have a whole list item pinned at the top of the chat list. + +FluffyChat 1.3.0 is the first release with full null safe dart code. While this is a huge change +under the +hood, it should improve the stability and performance of the app. It also builds now with Flutter +2.10. + +Thanks to all contributors and translators!! <3 + +- Translated using Weblate (Arabic) (abidin toumi) +- Translated using Weblate (Chinese (Simplified)) (Eric) +- Translated using Weblate (Croatian) (Milo Ivir) +- Translated using Weblate (Czech) (Milan Korecky) +- Translated using Weblate (Dutch) (Jelv) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (French) (Anne Onyme 017) +- Translated using Weblate (Galician) (Xosé M) +- Translated using Weblate (German) (Krille) +- Translated using Weblate (Indonesian) (Linerly) +- Translated using Weblate (Russian) (Nikita Epifanov) +- Translated using Weblate (Swedish) (Joaquim Homrighausen) +- Translated using Weblate (Turkish) (Oğuz Ersen) +- Translated using Weblate (Ukrainian) (Ihor Hordiichuk) +- chore: Add missing link (Krille Fear) +- chore: Hide FAB story buttons on focus (Krille Fear) +- chore: Set compileSdkVersion to 31 (Krille Fear) +- chore: Update SDK (Krille Fear) +- chore: Update dependencies (Dependency Update Bot) +- chore: Update privacy (Krille Fear) +- chore: Upgrade to Flutter 2.10 (Krille Fear) +- ci: Update olm download link (Krille Fear) +- design: Improve create story page design (Krille Fear) +- design: Improve story header design (Krille Fear) +- design: Use IconButton instead of listTile for first story (Krille Fear) +- feat: Add button to report offensive users to server admins (Krille Fear) +- feat: Open chat button from Linux notification (Krille Fear) +- feat: implement retreiving widgets (TheOneWithTheBraid) +- fix: Set image width and height (Krille Fear) +- fix: Videoplayer filenames (Krille Fear) +- fix: cast error in html messages (Jayesh Nirve) +- fix: linux snap notification avatar (Krille Fear) +- fix: suggestions menu and use empty map in html messages null return (Jayesh Nirve) +- refactor: Migrate to null safety (Krille Fear) + +## v1.2.0 - 2022-01-27 + +FluffyChat 1.2.0 brings a new stories feature, a lot of bug fixes and improved +voice messages. + +- change: Set client ID in invite action link (Krille Fear) +- design: Improved animations in chat view when changing account (The one with the Braid) +- design: Remove redundant voice message button (S1m) +- design: Use more adaptive elements (Krille Fear) +- feat: Add button to record a video on Android (S1m) +- feat: Add static + button to pick reaction (S1m) +- feat: Better in app video player (Krille Fear) +- feat: Enable compression and thumbnails for videos (Krille Fear) +- feat: Nicer file event design (Krille Fear) +- feat: Recording dialog with displaying amplitude (Krille Fear) +- feat: Remember homeserver on search page (Krille Fear) +- feat: Save files images and videos (Krille Fear) +- feat: Settings for stories (Krille Fear) +- feat: Share to story (Krille Fear) +- feat: Stories (Krille Fear) +- fix: Add missing routes (Krille Fear) +- fix: Better thumbnails (Krille Fear) +- fix: Do not setup UP if init from an UP action (S1m) +- fix: linux notifications (Raatty) +- fix: Play video without thumbnail if none (S1m) +- fix: Show message bubble on download only video attachments (Drews Clausen) +- fix: Show scrollDownButton only if selectedEvents is empty (S1m) +- fix: Snapcraft image (Krille Fear) +- fix: Snapcraft.yaml (Krille Fear) +- fix: Use system fonts except for desktop (Krille Fear) +- fix: Video playback on iOS (John Francis Sukamto) +- fix: Videoplayer (Krille Fear) +- followup: Improve stories (Krille Fear) +- Improve website SEO tagging (Marcel) +- Increase font size granularity (S1m) +- refactor: /command hints add tooltips, test for missing hints, script to generate glue code, hints + for dm, create, clearcache, discardsession (Steef Hegeman) +- refactor: Make more files null safe (Krille Fear) +- refactor: Make style settings null safe (Krille Fear) +- systemNavigationBarColor ← appBar.backgroundColor (Steef Hegeman) +- Translated using Weblate (Chinese (Simplified)) (Eric) +- Translated using Weblate (Chinese (Simplified)) (Lynn Nakanishi Lin(林中西)) +- Translated using Weblate (Chinese (Traditional)) (Lynn Nakanishi Lin(林中西)) +- Translated using Weblate (Croatian) (Milo Ivir) +- Translated using Weblate (Czech) (Milan Korecky) +- Translated using Weblate (Dutch) (Jelv) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (Finnish) (Aminda Suomalainen) +- Translated using Weblate (French) (Anne Onyme 017) +- Translated using Weblate (Galician) (Xosé M) +- Translated using Weblate (German) (Krille) +- Translated using Weblate (German) (Jana) +- Translated using Weblate (German) (TeemoCell) +- Translated using Weblate (Hebrew) (MusiCode1) +- Translated using Weblate (Hebrew) (y batvinik) +- Translated using Weblate (Hungarian) (Balázs Meskó) +- Translated using Weblate (Indonesian) (Linerly) +- Translated using Weblate (Korean) (Kim Tae Kyeong) +- Translated using Weblate (Polish) (KSP Atlas) +- Translated using Weblate (Russian) (Nikita Epifanov) +- Translated using Weblate (Slovenian) (John Jazbec) +- Translated using Weblate (Spanish) (Valentino) +- Translated using Weblate (Turkish) (Oğuz Ersen) +- Translated using Weblate (Ukrainian) (Ihor Hordiichuk) + +## v1.1.0 - 2021-12-08 + +- CI: Add candidate release pipeline (Krille Fear) +- Translated using Weblate (Dutch) (Jelv) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (Finnish) (Mikaela Suomalainen) +- Translated using Weblate (Finnish) (Mikaela Suomalainen) +- Translated using Weblate (Indonesian) (Linerly) +- Translated using Weblate (Korean) (Kim Tae Kyeong) +- Translated using Weblate (Norwegian Bokmål) (Gigaa) +- Translated using Weblate (Norwegian Bokmål) (Raatty) +- change: Do not compress very small images (Krille Fear) +- chore: Update Matrix SDK (Krille Fear) +- design: Make not joined participants transparent in list (Krille Fear) +- docs: Fix screenshots on website (Krille Fear) +- fix: Update dependencies with flutter pub upgrade (Krille Fear) +- fix: Well known lookup at login (Krille Fear) +- refactor: Make most of the utils null safe (Krille Fear) +- refactor: Make send file dialog null safe (Krille Fear) +- refactor: Make user device list item null safe (Krille Fear) + +## v1.0.0 - 2021-11-29 + +- design: Chat backup dialog as a banner +- design: Encrypted by design, all users valid is normal not green +- design: Move video call button to menu +- design: Display edit marker in new bubbles +- design: Floating input bar +- design: Minor color changes +- design: Move device ID to menu +- design: Place share button under qr code +- design: Redesign and simplify bootstrap +- design: Remove cupertino icons +- feat: Display typing indicators with gif +- feat: Fancy chat list loading animation +- feat: New database backend with FluffyBox +- feat: Make the main color editable for users +- feat: Move styles one settings level up +- feat: Multiple mute, pin and mark unread +- feat: New chat design +- feat: New chat details design +- feat: New Public room bottom sheet +- feat: New settings design +- feat: Nicer images, stickers and videos +- feat: nicer loading bar +- feat: Open im.fluffychat uris +- feat: Redesign multiaccounts and spaces +- feat: Redesign start page +- feat: Send reactions to multiple events +- feat: Speed up app start +- feat: Use SalomonBottomBar +- feat: Drag&Drop to send multiple files on desktop and web +- fix: Adjust color +- fix: Automatic key requests +- fix: Bootstrap loop +- fix: Chat background +- fix: Chat list flickering +- fix: Contrast in dark mode +- fix: Crash when there is no prev message +- fix: Do display error image widget +- fix: Do not display bottombar in selectmode +- fix: Dont enable encryption with bots +- fix: Dont loose selected events +- fix: Dont rerun server checks +- fix: download path for saving files +- fix: Hide FAB in new chat page if textfield has focus +- fix: Let bottom space bar scroll +- fix: Load spaces on app start +- fix: Only mark unread if actually marked +- fix: Public room design +- fix: Remove avatar from room +- fix: Remove broken docker job +- fix: Report sync status error +- fix: Self sign while bootstrap +- fix: Sender name prefix in DM rooms +- fix: Set room avatar +- fix: Various multiaccount fixes +- fix: Wrong version in snap packages + +## v0.42.2 - 2021-11-04 + +Minor bugfix release which fixes signing up on matrix.org and make FluffyChats voice messages +playable in Element. + +- feat: Nicer registration form +- feat: Nicer audio message design and send duration +- fix: Signup on matrix.org +- fix: Mark voice messages with msc3245 +- fix: Play response voice messages +- fix: Crash on logout + +## v0.42.1 - 2021-10-26 + +Minor bugfix release. + +- feat: Ignore users directly from bottom sheet +- fix: Open an existing direct chat via invite link/QR scanning +- fix: Small fix for uia request +- fix: Enable E2EE by default in all start chat cases +- update: Translations - Thanks to all translators <3 +- design: Make homepicker page nicer + +## v0.42.0 - 2021-10-14 + +This release fixes several bugs and makes E2EE enabled by default. + +- feat: Enable E2EE by default for new rooms +- feat: Display all private rooms without encryption as red +- feat: New design for bootstrap +- feat: New design for emoji verification +- feat: Display own MXID in the settings +- feat: More finetuning for font sizes +- chore: Updated translations (Thanks to all translators!) +- fix: App crash on logout +- fix: Temporary disable sign-up for matrix.org (Currently gives "500: Internal Server Error" while + FluffyChat **should** send the same requests like Element) +- fix: Implement Roboto font to fix font issues on Linux Desktop and mobile +- fix: QR Code scanning + +## v0.41.3 - 2021-10-08 + +Minor bugfix release. + +- fix: Last space is not visible +- chore: Google services disabled by default for F-Droid + +## v0.41.1 - 2021-09-15 + +Minor bugfix release. + +- fix: Start up time waits for first sync +- fix: Registration -> matrix.org responses with 500 +- fix: Wellknown look up for multi accounts + +And some other minor bugs. + +## v0.41.0 - 2021-09-14 + +This release features a lot of bug fixes and the new multi account feature which also include +account bundles. + +- feat: Multiple accounts +- feat: New splash screen +- fix: Password reset +- fix: Dark text in cupertinodialogs +- fix: Voice messages on iOS +- fix: Emote settings +- chore: update flutter_matrix_html, Matrix Dart SDK and other libraries +- chore: Update to Flutter 2.5.1 +- chore: Updated translations + +## v0.40.1 - 2021-09-14 + +Minor bug fixes. + +## v0.40.0 - 2021-09-13 + +This release contains a security fix. Red more about it +here: https://matrix.org/blog/2021/09/13/vulnerability-disclosure-key-sharing + +- New in-app registration +- Design improvements +- Minor fixes + +## v0.39.0 - 2021-08-30 + +- Hotfix a bug which produces problems in downloading files and playing audios +- Hotfix a bug which breaks device management + +## v0.39.0 - 2021-08-28 + +This release fixes a bug which makes it impossible to send images in unencrypted rooms. It also +implements a complete new designed new chat page which now uses a QR code based workflow to start a +new chat. + +- feat: Dismiss keyboard on scroll in iOS +- feat: Implement QR code scanner +- feat: New design for new chat page +- feat: Use the stripped body for notifications and room previews +- feat: Send on enter configuration for mobile devices +- fix: Prefix of notification text +- fix: Display space as room if it contains unread events in timeline +- fix: missing null check +- fix: Open matrix.to urls +- fix: Padding and colors +- fix: Sharing invite link +- fix: Unread bubbles on iOS +- fix: Sending images in unencrypted rooms + +## v0.38.0 - 2021-08-22 + +This release adds more functionality for spaces, enhances the html viewer, adds a brand new video +player and brings some improvements for voice messages. Thanks to everyone involved! + +### All changes: + +- change: Nicer design for selecting items +- change: Placeholder at username login field should be just username +- chore: cleanup no longer used translation strings +- chore: switch image_picker back to upstream +- chore: update flutter_matrix_html +- chore: Update matrix sdk to 0.3.1 +- feat: Add option to not autoplay stickers and emotes +- feat: Add remove rooms to and from spaces +- feat: Add video player +- feat: Cupertino style record dialog +- feat: Display amplitude +- feat: Implement official emoji translations for emoji verification +- feat: Nicer displaying of verification requests in the timeline +- fix: Allow fallback to previous url if there is no homeserver on the mxid domain +- fix: Correctly size the unread bubble in the room list +- fix: Design of invite rooms +- fix: Disable autocorrect for the homeserver url field +- fix: Disable broken audioplayer for web +- fix: Display loading dialog on start DM +- fix: Dont add/remove DMs to space +- fix: Empty timelines crashing the room view +- fix: excessive CPU usage on Windows, as described + in https://github.com/flutter/flutter/issues/78517#issuecomment-846436695 +- fix: Joining room aliases not published into the room directory +- fix: Keep display alive while recording +- fix: Load space members to display DM rooms +- fix: Make translations use plural forms +- fix: Re-add login fixes with the new SDK +- fix: Reply with voice messages +- fix: Report content localizations +- fix: Requirements when to display report event button +- fix: too long file names +- fix: Try different directories on all kind of errors thrown for hive store +- fix: Use plural string in translation +- fix: use vrouter.toSegments +- fix: Wait for sync before enter a room a user has got invited +- fix: wallpaper on linux +- fix: Wrap login form into `AutofillGroup` + +## v0.37.0 - 2021-08-06 + +- Implement location sharing +- Updated translations +- Improved spaces support +- Minor bug fixes + +## v0.36.2 - 2021-08-03 + +Hotfix a routing problem on web and desktop + +## v0.36.1 - 2021-08-03 + +- Hotfix uploading to many OTKs +- Implement initial spaces UI + +## v0.36.0 - 2021-07-31 + +Minor design improvements and bug fixes. + +### All changes: + +* design: Make unread listtiles more visible +* design: Move pinned icon in title +* feat: Rate limit streams so that large accounts have a smoother UI +* feat: Display the room name in room pills +* feat: Increase the amount of suggestions for the input bar +* feat: Tapping on stickers shows the sticker body +* fix: Windows +* fix: Disable vrouter logs in release mode +* fix: No longer hide google services key file +* fix: Tests + +## v0.35.0 - 2021-07-24 + +This release introduces stickers and a lot of minor bug fixes and improvements. + +### All changes: + +### Feature + +* Add sticker picker [205d7e8] +* Also suggest username completions based on their slugs [3d980df] +* Nicer mentions [99bc819] +* Render stickers nicer [35523a5] +* Add download button to audio messages [bbb2f43] +* Android SSO in webview [befd8e1] + +### Fixes + +* Reset bootstrap on bad ssss [b78b654] +* Hide stickers button when there is not sticker pack [b71dd4b] +* Download files on iOS [a8201c4] +* Record voice messages on iOS [4c2e690] +* cropped sticker [a4ec2a0] +* busy loop due to CircularProgressIndicator [15856e1] +* Crash on timeline [a206f23] +* typo on webiste [00a693e] +* Make sure the aspect ratio of image bubbles stays the same [a4579a5] +* Linux failing on attempting to open hive [76e476e] +* Secure storage [0a52496] +* Make sure the textfield is unfocused before opening the camera [6821a42] +* Close safariviewcontroller on SSO [ba685b7] + +### Refactor + +* Rename store and allow storing custom values [b1c35e5] + +## v0.34.1 - 2021-07-14 + +Bugfix image picker on Android 11 + +## v0.34.0 - 2021-07-13 + +Mostly bugfixes and one new feature: Lottie file rendering. + +### All changes: + +* feat: Add rendering of lottie files +* fix: Check for jitsi server in well-known lookup also on login screen +* fix: show thumbnails in timeline on desktop +* feat: Add a proper file saver +* feat: Better detect the device type from the device name +* fix: Workaround for iOS not removing the app badge +* fix: Keyboard hides imagePicker buttons on iOS +* feat: Add rendering of lottie files +* fix: Don't allow backup of the android app + +## v0.33.3 - 2021-07-11 + +Another bugfixing release to solve some problems and republish the app on iOS. + +### Changes + +* Redesign SSO buttons +* Update dependencies +* Remove moor database (no migration from here possible) +* fix: Keyboard hides imagePicker buttons on iOS + +## v0.33.2 - 2021-06-29 + +* Fix Linux Flatpak persistent storing of data + +## v0.33.0 - 2021-06-26 + +Just a more minor bugfixing release with some design changes in the settings, updated missing +translations and for rebuilding the arm64 Linux Flatpak. + +### Features + +* redesigned settings +* Updated translations - thanks to all translators +* display progress bar in first sync +* changed Linux window default size +* update some dependencies + +### Fixes + +* Favicon on web +* Database not storing files correctly +* Linux builds for arm64 +* a lot of minor bugs + +## v0.32.2 - 2021-06-20 + +* fix: Broken hive keys + +## v0.32.1 - 2021-06-17 + +* fix: Hive breaks if room IDs contain emojis (yes there are users with hacked synapses out there + who needs this) +* feat: Also migrate inbound group sessions + +## v0.32.0 - 2021-06-16 + +FluffyChat 0.32.0 targets improved stability and a new onboarding flow where single sign on is now +the more prominent way to get new users into the app. This release also introduces a complete +rewritten database under the hood based on the key value store Hive instead of sqlite. This should +improve the overall stability and the performance of the web version. + +### Feat + +* Long-press reactions to see who sent this +* New login UI +* Shift+Enter makes a new line on web and desktop +* Updated translations - Thanks to all translators +* Brand new database backend +* Updated dependencies +* Minor design tweaks + +### Fixes + +* Single sign on on iOS and web +* Database corruptions +* Minor fixes + +## v0.31.3 - 2021-05-28 + +### Fixes + +* Build Linux +* Multiline keyboard on web and desktop + +## v0.31.2 - 2021-05-28 + +### Fixes + +* Setting up push was broken + +## v0.31.0 - 2021-05-26 + +### Chore + +* Format iOS stuff [584c873] +* LibOlm has been updated to 3.2.3 + +### Feature + +* Cute animation for hiding the + button in inputbar [37c40a2] +* Improved chat bubble design and splash animations [0b3734f] +* Zoom page transition on Android and Fuchsia [e6c20dd] + +### Fixes + +* "Pick an image" button in emote settings doesn't do anything [e6be684] +* Formatting and style [2540a6c] +* Emoji picker [e1bd4e1] +* Systemuioverlaystyle [c0d446b] +* Status bar and system navigation bar theme [d986986] +* Open URIs [6d7c52c] +* Status bar color [f347edd] +* add missing purpose string [3830b4b] +* Workaround for iOS not clearing notifications with fcm_shared_isolate [88a7e8d] +* Minor glitch in bootstrap [107a3aa] +* Send read markers [08dd2d7] + +### Docs + +* Update code style [3e7269d] + +### Refactor + +* Structure files in more directories [ebc598a] +* Rename UI to Views [e44de26] +* rename UI to View and MVC login page [cc113bb] +* Rename views to pages [a93165e] +* Move widgets to lib [56a2455] +* Move translations to assets [0526e66] +* Update SDK [4f13473] +* Use default systemUiOverlayStyle [8292ee7] + +## v0.30.2 - 2021-05-13 + +### Feature + +* Implement registration with email [19616f3] + +### Fixes + +* Android input after sending message [4488520] + +### Changes + +* Switch to tchncs.de as default homeserver + +### Refactor + +* UIA registering [48bf116] + +## v0.30.1 - 2021-05-07 + +### Chore + +* Update translations + +### Fixes + +* Record audio on iOS [cd1e9ae] + +## v0.30.0 - 2021-05-01 + +In this release we have mostly focused on bugfixing and stability. We have switched to the new +Flutter 2 framework and have done a lot of refactoring under the hood. The annoying freezing bug +should now be fixed. Voice messages now have a new backend which should improve the sound quality +and stability. There is now a more professional UI for editing aliases of a room. Users can now see +a list of all aliases, add new aliases, delete them and mark one alias as the canonical (or main) +alias. Some minor design changes and design fixes should improve the overall UX of the app +exspecially on tablets. + +Version 0.30.0 will be the first version with arm64 support. You can download binaries from the CI +and we will try to publish it on Flathub. Together with the new Linux Desktop Notifications feature, +this might be interesting for the Librem 5 or the PinePhone. Sadly I don't own one of these very +interesting devices. If you have one, I would very like to see some screenshots of it! :-) + +### Chore + +* Update UP and automatically re-register UP on startup [aa3348e] + +### Feature + +* Desktop notifications on Linux Desktop [25e76f0] +* Much better alias managing [642db67] +* Archive with clean up [f366ab6] + +### Fixes + +* Lock screen [f8ba7bd] +* Freeze bug [15c3178] +* UserBottomSheet [dbb0464] +* Message bubble wrong height [2b9bd9c] +* Low height layout [0d6b43d] +* Behaviour of homeserver textfield [2c8a8a4] +* Build Linux [d867a56] +* EmojiPicker background [0a5270b] +* e2ee files [ccd7964] +* Remove the goddamn package from hell circular checkbox!!! Shame on you! SHAME! [81c6906] +* Missing null check [586c248] +* Chat UI doesnt load [4f20ea4] + +### Refactor + +* Remove unused variable [b9f5c94] +* Remove flutter_sound [334d4c0] +* Switch to record package [2cf4f47] +* Sort dependencies [f2295f7] +* Widget file structure and MVC user bottom sheet [bd53745] +* Dialogs as views [69deae3] +* MVC Settings page [bc5e973] +* MVC Settings Notifications [c291b08] +* MVC multiple emote settings [a64ada5] +* MVC settings ignore list [f23fdcc] +* MVC emote settings [1f9f3f4] +* Null safe dependencies [ca82a46] +* MVC settings style [c6083b6] +* MVC settings 3pid [6bfe7b2] +* MVC search [b008d56] +* Folder structure and MVC chat ui [fb61824] +* Move some views to widgets [1fe5b78] +* MVC device settings view [15731b9] +* New private chat view [453d4f3] +* MVC chat permission settings [001e0ee] +* MVC chat list view [7658425] +* MVC chat encryption settings [576e840] +* MVC chat details [28ed394] +* Enable more lints [6a56ec4] +* MVC new group view [3f889e2] +* MVC invitation selection [c12e815] + +## v0.29.1 - 2021-04-13 + +### Chore + +* Bump version [215f3c8] + +### Fixes + +* Save file [3f854d6] +* Routing broken in chat details [f1166b2] +* Tests [e75a5a0] +* Minor sentry crashes [9aa7d52] +* nogooglewarning [7619941] + +### Refactor + +* MVC archive [c2cbad7] +* MVC sign up password view [fa0162a] +* MVC sign up view [db19b37] +* Controllers [f5f02c6] + +## v0.29.0 - 2021-04-09 + +### Chore + +* Clean up repo [ef7ccef] +* Bump version [81a4c26] +* Nicer FAB icon [3eeb9a9] +* Archive button in main menu [da3dc80] +* turn renderHtml and hideUnknownEvents on [29f8e05] +* Remove unused dependencies [c505c50] + +### Feature + +* Experimental support for room upgrades [a3af5a9] + +### Fixes + +* Room upgrade again [1d40705] +* Better padding [c79562f] +* Room upgrade [dac26dd] +* iOS [3a6b329] +* React if not allowed [0146767] +* iPad dividerwidth [a154db0] +* Playstore release job [47c9180] +* Remove blur [ebf73bf] +* Support for email registration [7e5eae5] +* Typo [6250fd0] +* #323 [56e5c81] +* Typo [b38b0e4] +* Buggy routing [62bf380] +* barrierDismissible: true, [de9e373] +* UserBottomSheet SafeArea [0e172c7] +* Add normal mode again to OnePageCard [c057d31] +* ScrollController in chatlist [93477d3] +* SafeArea on iPad [8911e64] +* Missing null check [7cb0dc4] +* Overflow in chat app bar [5bf5483] +* Select room version [2f5a73f] + +### Docs + +* Add code style [035ad96] + +### Refactor + +* Move app_config to /configs [8b9f4a4] +* homeserver picker view [8e828d8] +* widgets dir [c9ab69a] + +## v0.28.1 - 2021-03-28 + +### Chore + +* Update version [518634a] + +### Feature + +* Implement new search view design [e42dd4b] + +### Fixes + +* Share on iOS [ea31991] +* Permission to send video call [4de6d16] +* Unread badge color [49d5f86] +* Push on iOS [cb6217c] +* Add Podfile to gitignore [dd4b4c5] +* Own user in people list [ce047b7] +* Start chat [92ff960] +* Set status missing [17a3311] + +### Refactor + +* push stuff [b6eaf5b] + +## v0.28.0 - 2021-03-16 + +### Chore + +* Bump version [f8ee682] +* Change push gateway url [078aefa] +* Update file picker cross dependency [91c6912] +* Update snapcraft.yaml but still not working [1072379] +* Update changelog [a05f2f0] +* Change call icon [7403ac7] +* Update famedlySdk [ec64cf6] + +### Feature + +* Cache and resend status message [c8a7031] +* New experimental design [94aa9a3] +* Better verification design [9bcd6b2] +* Verify and block devices in devices list [8ebacfe] + +### Fixes + +* substring in reply key respects unicode runes [5695342] +* Resend status message [05cd699] +* Remove test push [a838d90] +* Email validation [c8e487c] +* CI [2e60322] +* CI [7275837] +* CI [1a8dc50] +* CI [c012081] +* CI [380732d] +* CI [06c31c0] +* CI [4d1a171] +* CI [597ceab] +* snapcraft CI [fee0eb9] +* Bootstrap in columnview [bcd2a03] +* Remove unnecessary snapcraft dependencies [3a816d1] +* Snapcraft and it builds now :-) [eb0eca4] +* flutter_matrix_html crash and flutter_maths stuffs [3caac92] +* Minor bugs [9fbfca6] +* add mail [53fc634] +* 3pid [887f3b1] +* Bootstrap hint [8651b37] +* Bootstrap hint [1331b10] +* Own presence at top of the list [ac6fcd1] +* Analyzer [e1ddfc8] +* Trim username on registration [61a8eb5] +* Password success banner if not succeeded [5150563] +* Status color [42d9bf5] +* Routes [6faa60e] +* Dialog using wrong Navigator [9458ab3] +* sso on web [aa396ac] +* Missing localizations in dialogs [9b1d7ec] +* Tap on notification to open room in (hopefully) all cases [57560ff] +* Allow screenshots again [6258b6a] +* Missing tooltips in IconButtons [57a021f] +* empty horizontal stories list [b1f6209] +* Line color [3d59d9a] +* Dont show random users in top bar [54e268b] +* Localize ok cancel alert dialogs [9f9b833] +* Use single-isolate push [949771d] + +### Docs + +* Update readme and contributing [449e46d] +* Update Turkish translation for website [4a664eb] + +### Refactor + +* Update SDK and enable login with email and phone [864b665] +* Migrate to flutter 2 [bb97b1b] +* Switch to TextButton [55803d1] + +## v0.27.0 - 2021-02-17 + +### Chore + +* Switch to experimental new hedwig [30a1fb0] +* update sdk & remove selfSign [26f7cb3] +* Update sdk [cde8a30] +* Update unified push [e73f5d5] +* Change push gateway port [8f36140] + +### Feature + +* localize bootstrap [395e62e] +* Add more bootstrap features [e4db84a] +* Add some tooltipps [b9eb8d1] +* Get jitsi instance from wellknown [bd24387] +* Make font size configurable [ea1bb89] +* Allow manual verification of other peoples devices [ad3c89b] +* Simplified bootstrap [d9984da] +* new design [33dd1d2] +* Implement reporting of events [d553685] +* Implement experimental new design [10cf8da] +* Deprecated authwebview and use platform browser [d7aae3a] +* Implement autofillhints [41a2457] + +### Fixes + +* Website [080a909] +* docs _site dir [875d652] +* Bootstrap dialog [c72da0a] +* Bootstrap wipe [774f674] +* MetaRow fontsize [a13e673] +* Stories displayname cropping [6f06c6a] +* Update read receipt display [de6e495] +* Bottom padding of chat list [aa5ce56] +* Hard to read titles in chat details [df90136] +* Website urls [295c113] +* applock enter non digits [5726c4f] +* Update contact list [d870ec3] +* Better error in discover [0c1864c] +* Minor fixes [c058d39] +* Share view [2bd00e6] +* Endless bootstrap loading [65d5f9a] +* More minor fixes [4c10ef5] +* Default offline state [72604c6] +* Remove old code [14f633b] +* Inputborder [6960618] +* Unlock the mutex [5789a86] +* Wrong fab action [5429697] +* SecureStorage sometimes reading wrong / bad values [d94f0d7] +* Wrong urls [29076db] +* Start chat with yourself from status [f3b3584] +* BottomNavigationbar colors [08f24d7] +* Emote settings and discovery fallback [8f8b8d8] +* reportEvent uses positive int [408c810] +* Autofillhints on readonly [baafebb] +* Bring back proper emote settings [6b01a83] +* Build ios [f5b1ae8] +* iOS bundle id [6a70830] +* iOS push [2bf184a] +* iOS push [c01bdf7] + +### Docs + +* Fix qr-codes [c7f0a74] +* grammar fixes [c4d569b] + +### Refactor + +* Theme colors [fe13778] +* border radius [ddd10d1] + +## v0.26.1 - 2021-01-26 + +### Chore + +* Update SDK [e9df6bf] +* Bump version [d79b356] +* Update dependencies [6159f99] + +### Feature + +* Add unified push as push provider [124a5ee] + +### Fixes + +* Link color [16d6623] + +## v0.26.0 - 2021-01-25 + +### Chore + +* Redesign textfields [aef8090] +* Simplify bootstrap [2df4a78] +* Update audio player icons [3f14d5e] +* Redesign homepicker page [e402a02] +* Remove unused dependency [2089e62] +* Update SDK [a05215f] +* Update readme [19f1df7] +* Change startpage design [4b8ad1b] +* Log warning if firebase token problem [90867e6] +* Update dependencies [a56f939] +* Redesign homeserver picker page [3c71351] +* Increase max size of message bubbles [8477385] +* Use correct paths on new server [2f00007] + +### Feature + +* emoji working on desktop [c3feb65] +* Implement sso [d1d470d] +* Implement app lock [77ee2ef] +* Dismiss keyboard on view scroll. [70f96bf] +* Display version number in app [e1e60c4] + +### Fixes + +* Dark mode fixes [36746c8] +* Dark theme [0bd0e58] +* clean up iOS dir [6ae59a8] +* Homeserver readonly if conifg wants it [c81158a] +* Search mxid for private chat [b6dca5b] +* Remove unnecessary padding [5f54057] +* Foreground push again [1d6c9cf] +* Foreground push [ea1cefa] +* embedding all fonts to fix the font error [55c6379] +* Minor desktop fixes [c224993] +* fonts in a standard path [bfa5601] +* Make tapping on pills join if remote directory is private [8ffb3db] +* key verification dialog button order [c5adfc2] +* Allow joining of unpublished aliases again [ed570a6] +* Make tap on pills and matrix.to links work again [48ad322] +* Load settings on startup [6906832] +* Persistent settings [03b00b7] +* Voice message recording dialog [d273b2a] +* UserBottomSheet [38e8e1b] +* Dialogs [5f0ce49] +* no exception if token is just null [db349a5] +* Load config.json only on web [a04c3ab] +* App lock [8d6642c] +* cross file picker [d47f855] +* Send file [fde2f8b] +* APL [913f3cf] +* app lock [6d12168] +* mxid validation [25da65f] +* Startpage textfield padding [81e706a] +* Provider in user bottom sheet [48d6fbd] +* Readme [dda0925] + +### Docs + +* Make howtofork.md less misunderstandable [96de54a] +* Add howtofork.md [f091469] +* Mention emoji font [bb53714] +* Add famedly contact link [7f2d61e] +* Update fdroid button [ea7e20b] + +### Refactor + +* Theme and iOS stuff [189f65a] +* Upgrade to latest flutter_sound_lite [2f7dece] + +## v0.25.1 - 2021-01-17 + +### Chore + +* Bump version [c881424] + +### Fixes + +* Change size [83e2385] + +### Refactor + +* remove deprecated approute [be08de5] + +## v0.25.0 - 2021-01-16 + +### Chore + +* Minor design improvements [d4dbe83] +* Minor design tweaks [06581e2] +* Bump version [7f51f7f] +* redesign start first chat [e13a732] +* Better authwebview [d76df0a] + +### Fixes + +* Share files [d018a4b] +* Typing update [9b5a3ca] +* Status [d27dbe0] +* Set status [7063b34] +* Column width [a35c4d0] +* Dont send only whitespaces [c0958c6] +* BuildContext in key verification dialog [c4866c7] +* Ignore list [0458064] +* Archive route [5e62267] +* Remove popup menu item [5945bcc] +* chat padding [079c35e] +* Remove logs [8910772] +* Video calls [672eca6] +* loading history [a5e9553] +* Missing divider [cf07eed] +* loading dialog configs [de2796e] +* Display current theme mode [41483dd] +* Better authwebview [5a1085a] +* authwebview [2f7749a] +* Minor apl bugs [05b9551] + +### Docs + +* Update fdroid logo [31d16a0] + +### Refactor + +* Use APL [cbcfa15] +* Use Provider [880f9cc] +* Use adaptive_theme [5d52c26] + +## v0.24.3 - 2021-01-15 + +### Chore + +* Bump version [46c8386] +* Update SDK [ba0726c] +* Update fdroid domain [f130681] +* Update dependencies [611e5e3] + +### Feature + +* Add Turkish translations for website [817c7dd] +* Handle matrix: URIs as per MSC2312 [1da643f] + +### Fixes + +* Format [84b2ac9] +* Push gateway url [ed2fbf7] + +## v0.24.2 - 2021-01-08 + +### Chore + +* Update linux version [ef9369c] +* Update SDK [4a006c9] + +### Feature + +* Regulate when thumbnails are animated as per MSC2705 [f5e11c2] + +### Fixes + +* Don't allow an empty ssss passphrase in key verification [3a0ce79] +* reactions [92684da] +* Reply fallback sometimes being stripped incorrectly [e9ec699] +* Don't show loading dialog on request history [e4b6e10] +* Properly handle url encoding in matrix.to URLs [baccd0a] + +### Refactor + +* Switch to loading dialog [e84bc25] + +## v0.24.1 - 2020-12-24 + +### Chore + +* Update linux build [a91407f] +* Add website to main repo [4df33a1] +* Update dependencies [0d9f418] +* Change main docs [56d97f6] +* Update SDK and logviewer [45b9c4f] +* Context icon improvements [6381cea] +* Update SDK [e802593] + +### Feature + +* Better invite search bar [3c4a29b] +* Open alias in discover page [f0d1f5a] +* Implement logger [714c7b4] + +### Fixes + +* auto-dep update [d9e8c5f] +* Read receipts and filtered events [0ae36f0] +* Don't re-render the lock icon nearly as often [00a56a7] +* Format [e0bc337] +* Analyzer [5d8bfa3] +* logger [64c5ea9] +* Have a space after mentions, making it consistent with @-completion [b18e81a] +* Display right key in key request dialog [f8e8e96] +* Respect hidden events when calculating read receipt message [702895f] +* Store emoji picker history and make sure you can't send the same emoji twice [0066a33] +* Logger [0abebdd] +* Allow key verification to scroll vertically [accd9b4] +* Make filter input field auto-lose focus when entering room view [bdb695e] +* Update file picker [6df75d1] + +## v0.24.0 - 2020-12-18 + +### Chore + +* Update dependencies [550cb4a] +* Update SDK [775a33b] +* Update dependencies [644433c] +* Switch to upstream noti settings [5cc4265] +* Go back to upstream open noti settings [6effebe] +* Update dependencies [5af4eab] + +### Feature + +* Add languages to iOS [68a5efb] +* Bring back config.json [b6a0d37] +* Implement emojipicker for reactions [20b3157] +* Add config hideTypingUsernames [19c0440] +* Implement hideAllStateEvents [721c0b2] +* Enhanced configuration [1e7bac3] +* Implement experimental bootstrapping [f6945f7] +* add ability to mark a room as unread [fe2b391] +* Try out new firebase [41a471e] +* Implement discover groups page [e728ccc] +* Add chat permissions settings [bf4b439] +* Multiline dialog text field [8d05a83] +* Implement rich notification settings [87a73dd] + +### Fixes + +* Update typing [3d70b1e] +* Build in dev [f892a9f] +* Fix that damn regex [8961bff] +* CI [ebb114d] +* CI [0adeb09] +* Format [9e5fb70] +* CI scripts [46b886f] +* join public room [30883e5] +* CI [7f44982] +* open_noti_settings [f4c1202] +* Missing localization [cb191e2] +* Analyzer bug [be428dd] +* Set chat avatar on web [621fcb7] +* CI [da5bc56] + +### Refactor + +* Update sdk [32acc21] + +## v0.23.1 - 2020-11-25 + +### Fixes + +* Release CI [14d8c80] + +## v0.23.0 - 2020-11-25 + +### Chore + +* Update adaptive dialogs [0061660] +* Prettier redacted events [d1e291e] +* Minor design changes in user viewer [b4fb283] +* Minor design changes in chatlist item [6977112] +* Implement playstore CD [4c5760c] +* Only load google services if needed [bae779a] + +### Feature + +* Next version [1af048e] +* Annoy user with dialog to add a recovery method [d9ec9f6] +* Implement password recovery [4b2fef5] +* Collapse room create states [fc0c038] +* Minor design improvements [0b8cc24] +* Improved encryption UI [2516848] + +### Fixes + +* Broken dialog [97bb692] +* set email dialog [72e325a] +* Minor fixes [11e2dd5] +* redacted icon color [d60709b] +* Unban [f056e65] +* Minor design issues [d9590dd] +* Buttons in chatlist [7d08817] +* Sendername prefix [a6b60ad] +* Sendername prefix [8aaff6f] +* Minor key request design fix [0ed29b6] +* removal of appbundle from the release artifacts [b1c248f] +* Copying an event did not obey edits [0cb262c] +* Suggest correct rooms [59ec9de] + +### Refactor + +* Make verification in dialogs [1f9e953] +* matrix to link prefix [1aa9c08] + +## v0.22.1 - 2020-11-21 + +### Fixes + +* Input bar not working, making app unusable [10773b4] + +## v0.22.0 - 2020-11-21 + +### Chore + +* fix CI [00ed0d6] +* fix CI [bb4bb9f] +* Fix CI variables [d3822b0] +* update flutter_matrix_html [ed27bee] +* update flutter_matrix_html [af36533] +* Update dependencies [57256fb] +* Update dependencies [40825e1] +* Switch to adaptive dialogs [9ea7afc] +* Switch from bottoast to flushbar [e219593] +* Clean up CI [7e84675] +* Remove unused dependency [d12de2d] + +### Feature + +* Add svg support and better image handling [f70bbc3] +* add config.json [4b7fb6b] +* persistent upload of release artifacts [1b2481b] +* Option to hide redacted and unknown events [36315a4] +* Better encryption / verification [1ff986e] + +### Fixes + +* iOS [26731ab] +* resolve some sentry issues [61f35e8] +* resolve some sentry issues [2c3693e] +* iOS build [9fee409] +* Automatic update deps job [255c05d] +* Don't re-render message widgets on insertion of new messages, making e.g. audio playing not + stop [25b2997] +* Add missing safearea [caab868] +* no pushers enpdoint [b3942ad] +* Sentry and small null fix [5dc22be] + +### Refactor + +* CI [34d7fdd] +* SDK update [7e23280] + +## v0.21.1 - 2020-10-28 + +### Chore + +* update version code [d1dfa9c] + +## v0.21.0 - 2020-10-28 + +### Chore + +* Change compileSdkVersion again [f93f9c2] +* Update packages [b471bd0] +* Update SDK [86a385d] +* New version [40d00b0] +* Update flutter_matrix_html [4981cf4] +* Update sdk [8773770] +* Only load google services if needed [051ec8f] +* release [844b4a8] + +### Fixes + +* CompileSDKVersion [bcf75fc] +* Target sdk [c3e23b6] +* File picker issue [aa191c1] +* Sentry [b903ea9] +* user bottom sheet design [7876164] +* Android Download [8a542bf] +* Avatar Border Radius [a8b617e] +* loading spinner stuck on broken images [e917879] +* send file dialog - prevent multiple file sending [941b211] +* Multiple related store things [36405f8] +* Logo background color [42a927e] + +## v0.20.0 - 2020-10-23 + +### Chore + +* update dependencies [427cdc0] +* upate matrix link text [0892ca9] +* Change default linux window size [719323a] +* Update changelog [ef22778] +* Update matrix_link_text [fc2a0c0] +* update flutter_secure_store [61c6aec] +* Minor snap fix [daf9969] +* Add privacy informations to app [e569be7] +* Make app ready for flutter 1 22 [e5b23fa] + +### Feature + +* Implement mouse select chat list items [6d41136] +* Implement linux desktop notifications [75cd6f1] +* Implement change device name [bfd3888] +* Publish as snap [46590d7] +* Enhance emote experience [cafd639] +* Implement new status feature [090795f] +* More beautiful status [d9c2d4f] +* Enhance roomlist context menu [493b700] +* Implement basic windows linux support [7fad316] +* Enable macOS build [a845209] + +### Fixes + +* return text field to the previous state after editing message [08e61c0] +* Web server picker [4cb19be] +* Some single-emoji names crashing [b29ebce] +* Snapcraft [c1eebc1] +* Minor design fix [a713a2f] +* Minor design fixes [e9aa285] +* Change device displayname [c5c7ee7] +* LocalStorage location on desktop [81e32c5] +* fixed mxid input method, removed code redundancy [060156c] +* overgo issues with flutter_secure_store [6d0f344] +* resize images in a separate isolate [56967a9] +* Build Linux CI [a941356] +* Build Linux CI [2a6b5d8] +* send images as images, not files [751dcb7] +* Show device name in account information correctly [468c258] +* Minor fixes [aee854e] +* Make theme loading work properly [f6ab1e0] +* CI [6b7d21d] +* User Status crash [0413b0c] +* small desktop fixes [540ff68] +* Desktop url launcher [4dfd0db] +* Snap [ec7dd2b] +* Snap [4648466] +* CI [4345df3] +* Linux database [772ff33] +* TextField [7ec349b] +* Inputbar focus [5e673c6] +* Desktop file picker [662e2f1] +* Desktop images [5409fe8] +* Try with select 1 [6e924cb] +* More debug logs [9b572f5] +* Minor design bugs [6ffbf16] +* Minor user status bugs [f84ac1d] +* Improve loading dialogs [41ceb84] +* Invite left members [fe649e5] +* tapping on aliases not always working [c0390ca] +* determine 12h/24h time based on settings, not locale [ca19e9f] +* fix up translations to use keys and fix arb files [74b15dd] + +## v0.19.0 - 2020-09-21 + +### Chore + +* Version update & olm-CI [0f805a2] +* Update SDK & Changelog [1825543] +* Add new language [c6d67ad] +* master --> main [1de3c54] +* switch to cached_network_image [bbca0c2] +* update dependencies [2a62cf8] +* Add more debugging logs to debug key decrypt issues [20d3ea9] +* Update SDK, re-enable transactions on mobile [1f4c2a1] +* update languages [40e9544] +* Updat changelog [d1e898c] +* update sdk [954eedb] + +### Feature + +* Implement send reactions [6bf25b7] +* Improve design [c8a63c6] +* Display emotes/emojis bigger [9cccd07] +* Add scroll-to-event [8547422] +* Implement ignore list [b2fa88c] +* Add license page [dcf4c4c] +* Implement rich push notifications on android [f4e4b90] +* Implement sentry [705ced8] +* Send image / video / file dialog [80114df] +* Blurhashes and better thumbnails [2321829] +* open links better [04cbf0c] +* Implement web audio player [0f6b46d] +* New notification sound [8a5be21] + +### Fixes + +* Last bits for the release [1db9bdd] +* Small stuff [9d3f272] +* Search bar [eca25de] +* font size being too large accidentally in some places [43dd222] +* Scroll down button not showing [8cd8f90] +* Don't double-confirm sending audio messages [168b8b0] +* Hotfix ignore list [94f8f34] +* Push on conduit [e5cd144] +* Images with an info block but no size crashing [5f58789] +* Allow requesting past messages if all events in the current timeline are filtered [0f9ff4a] +* annoying notification sound [739a70c] +* Status design [f7930fe] +* Send read receipt only on focus [98316f1] +* Desktop notifications [b05bfa6] + +This CHANGELOG.md was generated with [**Changelog for Dart +**](https://pub.dartlang.org/packages/changelog) diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..831ba87 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,18 @@ +FROM ghcr.io/cirruslabs/flutter as builder +RUN sudo apt update && sudo apt install curl wget jq -y + +WORKDIR /tmp +RUN wget https://github.com/mikefarah/yq/releases/download/v4.40.5/yq_linux_amd64.tar.gz +RUN tar -xzvf ./yq_linux_amd64.tar.gz +RUN mv yq_linux_amd64 /usr/bin/yq + +COPY . /app +WORKDIR /app +RUN ./scripts/prepare-web.sh +COPY config.* /app/ +RUN flutter pub get +RUN flutter build web --dart-define=FLUTTER_WEB_CANVASKIT_URL=canvaskit/ --release --source-maps + +FROM docker.io/nginx:alpine +RUN rm -rf /usr/share/nginx/html +COPY --from=builder /app/build/web /usr/share/nginx/html diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..7a60dc9 --- /dev/null +++ b/LICENSE @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) 2020 Christian Pauly + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. diff --git a/PRIVACY.md b/PRIVACY.md new file mode 100644 index 0000000..439899d --- /dev/null +++ b/PRIVACY.md @@ -0,0 +1,112 @@ +# Privacy + +FluffyChat is available on Android, iOS, Linux and as a web version. Desktop versions for Windows and macOS may follow. + +* [Matrix](#matrix) +* [Database](#database) +* [Encryption](#encryption) +* [App Permissions](#app-permissions) +* [Push Notifications](#push-notifications) + +## Matrix +FluffyChat uses the Matrix protocol. This means that FluffyChat is just a client that can be connected to any compatible matrix server. The respective data protection agreement of the server selected by the user then applies. + +For convenience, one or more servers are set as default that the FluffyChat developers consider trustworthy. The developers of FluffyChat do not guarantee their trustworthiness. Before the first communication, users are informed which server they are connecting to. + +FluffyChat only communicates with the selected server and with [OpenStreetMap](https://openstreetmap.org) to display maps. + +More information is available at: [https://matrix.org](https://matrix.org) + +## Database +FluffyChat caches some data received from the server in a local sqflite database on the device of the user. On web indexedDB is used. FluffyChat always tries to encrypt the database by using SQLCipher and stores the encryption key in the [Secure Storage](https://pub.dev/packages/flutter_secure_storage) of the device. + +More information is available at: [https://pub.dev/packages/sqflite](https://pub.dev/packages/sqflite) and [https://pub.dev/packages/sqlcipher_flutter_libs](https://pub.dev/packages/sqlcipher_flutter_libs) + +## Encryption +All communication of substantive content between Fluffychat and any server is done in secure way, using transport encryption to protect it. + +FluffyChat also uses End-To-End-Encryption by using [libolm](https://gitlab.matrix.org/matrix-org/olm) and enables it by default for private chats. + +## App Permissions + +The permissions are the same on Android and iOS but may differ in the name. This are the Android Permissions: + +#### Internet Access +FluffyChat needs to have internet access to communicate with the Matrix Server. + +#### Vibrate +FluffyChat uses vibration for local notifications. More informations about this are at the used package: +[https://pub.dev/packages/flutter_local_notifications](https://pub.dev/packages/flutter_local_notifications) + +#### Record Audio +FluffyChat can send voice messages in a chat and therefore needs to have the permission to record audio. + +#### Write External Storage +The user is able to save received files and therefore app needs this permission. + +#### Read External Storage +The user is able to send files from the device's file system. + +#### Location +FluffyChat makes it possible to share the current location via the chat. When the user shares their location, FluffyChat uses the device location service and sends the geo-data via Matrix. + +## Push Notifications +FluffyChat uses the Firebase Cloud Messaging service for push notifications on Android and iOS. This takes place in the following steps: +1. The matrix server sends the push notification to the FluffyChat Push Gateway +2. The FluffyChat Push Gateway forwards the message in a different format to Firebase Cloud Messaging +3. Firebase Cloud Messaging waits until the user's device is online again +4. The device receives the push notification from Firebase Cloud Messaging and displays it as a notification + +The source code of the push gateway can be viewed here: +[https://gitlab.com/famedly/services/famedly-push-gateway](https://gitlab.com/famedly/services/famedly-push-gateway) + +`event_id_only` is used as the format for the push notification. A typical push notification therefore only contains: +- Event ID +- Room ID +- Unread Count +- Information about the device that is to receive the message + +A typical push notification could look like this: +```json +{ + "notification": { + "event_id": "$3957tyerfgewrf384", + "room_id": "!slw48wfj34rtnrf:example.com", + "counts": { + "unread": 2, + "missed_calls": 1 + }, + "devices": [ + { + "app_id": "chat.fluffy.fluffychat", + "pushkey": "V2h5IG9uIGVhcnRoIGRpZCB5b3UgZGVjb2RlIHRoaXM/", + "pushkey_ts": 12345678, + "data": {}, + "tweaks": { + "sound": "bing" + } + } + ] + } +} +``` + +FluffyChat sets the `event_id_only` flag at the Matrix Server. This server is then responsible to send the correct data. + + +# Explanation of FluffyChat's Compliance with Google Play Store's Safety Standards + +FluffyChat is committed to promoting a safe and respectful environment for all users. As a Matrix client, FluffyChat connects users to various Matrix servers. Please note that FluffyChat does not host or manage any servers directly, and as such, we do not have the capability to enforce content moderation or deletion within the app itself. + +To enhance user safety and help protect against the sexual abuse and exploitation of children, FluffyChat enables users to report inappropriate content directly to server administrators. + +#### Reporting Content or Users: + +1. Mark a message in the chat: Tap and hold the message you wish to report. +2. Report the message: Select the "Report" option. +3. Provide a reason and score: Enter the reason for reporting and assign a score from 1-100 to indicate how offensive the content is. +4. Notification to admin: The server administrator will be notified of the reported content. + +In addition to reporting messages, users can also report other users following a similar process. + +We encourage server administrators to adhere to strict safety standards and provide mechanisms for addressing and moderating inappropriate content. For more information on the Matrix protocol and its safety standards, please refer to the following link: https://matrix.org/docs/older/moderation/ diff --git a/README.md b/README.md new file mode 100644 index 0000000..410df7c --- /dev/null +++ b/README.md @@ -0,0 +1,67 @@ +![Screenshot](https://github.com/krille-chan/fluffychat/blob/main/assets/banner_transparent.png?raw=true) + +[FluffyChat](https://fluffychat.im) is an open source, nonprofit and cute [[matrix](https://matrix.org)] client written in [Flutter](https://flutter.dev). The goal of the app is to create an easy to use instant messenger which is open source and accessible for everyone. + +### Links: + +- 🌐 [[Weblate] Translate FluffyChat into your language](https://hosted.weblate.org/projects/fluffychat/) +- 🌍 [[m] Join the community](https://matrix.to/#/#fluffychat:matrix.org) +- 📰 [[Mastodon] Get updates on social media](https://troet.cafe/@krille) +- 🖥️ [[Famedly] Server hosting and professional support](https://famedly.com/kontakt) +- 💝 [[Liberapay] Support FluffyChat development](https://de.liberapay.com/KrilleChritzelius) + +Buy Me a Coffee at ko-fi.com + +### Screenshots: + +![Screenshot](https://github.com/krille-chan/fluffychat/blob/main/docs/screenshots/product.jpeg?raw=true) + +# Features + +- 📩 Send all kinds of messages, images and files +- 🎙️ Voice messages +- 📍 Location sharing +- 🔔 Push notifications +- 💬 Unlimited private and public group chats +- 📣 Public channels with thousands of participants +- 🛠️ Feature rich group moderation including all matrix features +- 🔍 Discover and join public groups +- 🌙 Dark mode +- 🎨 Material You design +- 📟 Hides complexity of Matrix IDs behind simple QR codes +- 😄 Custom emotes and stickers +- 🌌 Spaces +- 🔄 Compatible with Element, Nheko, NeoChat and all other Matrix apps +- 🔐 End to end encryption +- 🔒 Encrypted chat backup +- 😀 Emoji verification & cross signing + +... and much more. + + +# Installation + +Please visit the website for installation instructions: + +- https://fluffychat.im + +# How to build + +Please visit the [Wiki](https://github.com/krille-chan/fluffychat/wiki) for build instructions: + +- https://github.com/krille-chan/fluffychat/wiki/How-To-Build + + +# Special thanks + +* Fabiyamada is a graphics designer and has made the fluffychat logo and the banner. Big thanks for her great designs. + +* Advocatux has made the Spanish translation with great love and care. He always stands by my side and supports my work with great commitment. + +* Thanks to MTRNord and Sorunome for developing. + +* Also thanks to all translators and testers! With your help, fluffychat is now available in more than 12 languages. + +* WoodenBeaver sound theme for the notification sound. + +* The Matrix Foundation for making and maintaining the [emoji translations](https://github.com/matrix-org/matrix-spec/blob/main/data-definitions/sas-emoji.json) used for emoji verification, licensed Apache 2.0 diff --git a/analysis_options.yaml b/analysis_options.yaml new file mode 100644 index 0000000..d74b363 --- /dev/null +++ b/analysis_options.yaml @@ -0,0 +1,54 @@ +include: package:flutter_lints/flutter.yaml + +linter: + rules: + - camel_case_types + - avoid_print + - constant_identifier_names + - prefer_final_locals + - prefer_final_in_for_each + - sort_pub_dependencies + - require_trailing_commas + - omit_local_variable_types + +analyzer: + errors: + todo: ignore + use_build_context_synchronously: ignore + exclude: + - lib/generated_plugin_registrant.dart + - lib/l10n/*.dart + +dart_code_metrics: + metrics: + cyclomatic-complexity: 20 + number-of-arguments: 4 + maximum-nesting-level: 5 + source-lines-of-code: 50 + maintainability-index: 40 + rules: + - no-boolean-literal-compare + - no-empty-block + - prefer-conditional-expressions + - no-equal-then-else + - no-magic-number: + severity: style + - avoid-late-keyword: + severity: style + - avoid-non-null-assertion: + severity: style + - avoid-unused-parameters + - binary-expression-operand-order + - avoid-unnecessary-setstate + - avoid-wrapping-in-padding + - prefer-const-border-radius + - prefer-single-widget-per-file: + ignore-private-widgets: true + - prefer-extracting-callbacks + metrics-exclude: + - test/** + rules-exclude: + - test/** + anti-patterns: + - long-method + - long-parameter-list diff --git a/android/.gitignore b/android/.gitignore new file mode 100644 index 0000000..6f56801 --- /dev/null +++ b/android/.gitignore @@ -0,0 +1,13 @@ +gradle-wrapper.jar +/.gradle +/captures/ +/gradlew +/gradlew.bat +/local.properties +GeneratedPluginRegistrant.java + +# Remember to never publicly share your keystore. +# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app +key.properties +**/*.keystore +**/*.jks diff --git a/android/Gemfile b/android/Gemfile new file mode 100644 index 0000000..7a118b4 --- /dev/null +++ b/android/Gemfile @@ -0,0 +1,3 @@ +source "https://rubygems.org" + +gem "fastlane" diff --git a/android/app/build.gradle b/android/app/build.gradle new file mode 100644 index 0000000..5552750 --- /dev/null +++ b/android/app/build.gradle @@ -0,0 +1,107 @@ +plugins { + id "com.android.application" + id "kotlin-android" + id "dev.flutter.flutter-gradle-plugin" + //id "com.google.gms.google-services" +} + +def localProperties = new Properties() +def localPropertiesFile = rootProject.file('local.properties') +if (localPropertiesFile.exists()) { + localPropertiesFile.withReader('UTF-8') { reader -> + localProperties.load(reader) + } +} + +def flutterVersionCode = localProperties.getProperty('flutter.versionCode') +if (flutterVersionCode == null) { + flutterVersionCode = '1' +} + +def flutterVersionName = localProperties.getProperty('flutter.versionName') +if (flutterVersionName == null) { + flutterVersionName = '1.0' +} + +def keystoreProperties = new Properties() +def keystorePropertiesFile = rootProject.file('key.properties') +if (keystorePropertiesFile.exists()) { + keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) +} + +android { + compileSdk = 35 + namespace = "xyz.extera.next" + + sourceSets { + main.java.srcDirs += 'src/main/kotlin' + } + + lintOptions { + disable 'InvalidPackage' + } + + defaultConfig { + applicationId "xyz.extera.next" + minSdkVersion 21 + targetSdkVersion 35 + versionCode flutterVersionCode.toInteger() + versionName flutterVersionName + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + multiDexEnabled true + } + + signingConfigs { + release { + if (keystorePropertiesFile.exists()) { + keyAlias keystoreProperties['keyAlias'] + keyPassword keystoreProperties['keyPassword'] + storeFile file(keystoreProperties['storeFile']) + storePassword keystoreProperties['storePassword'] + } + } + } + buildTypes { + debug { + signingConfig signingConfigs.debug + versionNameSuffix "-debug" + } + release { + minifyEnabled false + shrinkResources false + signingConfig signingConfigs.release + } + } + // https://stackoverflow.com/a/77494454/8222484 + packagingOptions { + pickFirst 'lib/x86/libc++_shared.so' + pickFirst 'lib/x86_64/libc++_shared.so' + pickFirst 'lib/armeabi-v7a/libc++_shared.so' + pickFirst 'lib/arm64-v8a/libc++_shared.so' + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_17 + targetCompatibility JavaVersion.VERSION_17 + coreLibraryDesugaringEnabled true + } + + kotlinOptions { + jvmTarget = "17" + } +} + + +flutter { + source '../..' +} + +dependencies { + //implementation 'com.google.firebase:firebase-messaging:19.0.1' // Workaround for https://github.com/microg/android_packages_apps_GmsCore/issues/313#issuecomment-617651698 + implementation 'androidx.multidex:multidex:2.0.1' + coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.1.4") +} + +configurations.all { + exclude group: 'com.google.android.gms' +} \ No newline at end of file diff --git a/android/app/google-services.json b/android/app/google-services.json new file mode 100644 index 0000000..e33988c --- /dev/null +++ b/android/app/google-services.json @@ -0,0 +1,46 @@ +{ + "project_info": { + "project_number": "865731724731", + "project_id": "fluffychat-ef3e8", + "storage_bucket": "fluffychat-ef3e8.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:865731724731:android:ec427b3b1dcd4a1e64309e", + "android_client_info": { + "package_name": "chat.fluffy.fluffychat" + } + }, + "oauth_client": [ + { + "client_id": "865731724731-od6969v178ul9970elgacpt936v5t7qg.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyBLdZpGSPjcinikB4lAU6awW_h88NG17Sg" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "865731724731-od6969v178ul9970elgacpt936v5t7qg.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "865731724731-ofdr7e6m04murgb1bvchlj9oaos0q5i3.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "im.fluffychat.app" + } + } + ] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/android/app/proguard-rules.pro b/android/app/proguard-rules.pro new file mode 100644 index 0000000..d0e0fbc --- /dev/null +++ b/android/app/proguard-rules.pro @@ -0,0 +1 @@ +-keep class net.sqlcipher.** { *; } \ No newline at end of file diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..08854a6 --- /dev/null +++ b/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,158 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android/app/src/main/kotlin/xyz/extera/next/FcmPushService.kt b/android/app/src/main/kotlin/xyz/extera/next/FcmPushService.kt new file mode 100644 index 0000000..02b5d11 --- /dev/null +++ b/android/app/src/main/kotlin/xyz/extera/next/FcmPushService.kt @@ -0,0 +1,28 @@ +/*package xyz.extera.next + +import com.famedly.fcm_shared_isolate.FcmSharedIsolateService + +import io.flutter.embedding.engine.FlutterEngine +import io.flutter.embedding.engine.dart.DartExecutor.DartEntrypoint +import android.content.Context + +class FcmPushService : FcmSharedIsolateService() { + override fun getEngine(): FlutterEngine { + return provideEngine(getApplicationContext()) + } + + companion object { + fun provideEngine(context: Context): FlutterEngine { + var engine = MainActivity.engine + if (engine == null) { + engine = MainActivity.provideEngine(context) + engine.getLocalizationPlugin().sendLocalesToFlutter( + context.getResources().getConfiguration()) + engine.getDartExecutor().executeDartEntrypoint( + DartEntrypoint.createDefault()) + } + return engine + } + } +} +*/ \ No newline at end of file diff --git a/android/app/src/main/kotlin/xyz/extera/next/MainActivity.kt b/android/app/src/main/kotlin/xyz/extera/next/MainActivity.kt new file mode 100644 index 0000000..2bb1576 --- /dev/null +++ b/android/app/src/main/kotlin/xyz/extera/next/MainActivity.kt @@ -0,0 +1,33 @@ +package xyz.extera.next + +import io.flutter.embedding.android.FlutterActivity +import io.flutter.embedding.engine.FlutterEngine + +import android.content.Context +import androidx.multidex.MultiDex + +class MainActivity : FlutterActivity() { + + override fun attachBaseContext(base: Context) { + super.attachBaseContext(base) + MultiDex.install(this) + } + + + override fun provideFlutterEngine(context: Context): FlutterEngine? { + return provideEngine(this) + } + + override fun configureFlutterEngine(flutterEngine: FlutterEngine) { + // do nothing, because the engine was been configured in provideEngine + } + + companion object { + var engine: FlutterEngine? = null + fun provideEngine(context: Context): FlutterEngine { + val eng = engine ?: FlutterEngine(context, emptyArray(), true, false) + engine = eng + return eng + } + } +} diff --git a/android/app/src/main/kotlin/xyz/extera/next/UnifiedPushService.kt b/android/app/src/main/kotlin/xyz/extera/next/UnifiedPushService.kt new file mode 100644 index 0000000..0de5eec --- /dev/null +++ b/android/app/src/main/kotlin/xyz/extera/next/UnifiedPushService.kt @@ -0,0 +1,23 @@ +package xyz.extera.next + +import io.flutter.embedding.engine.FlutterEngine +import io.flutter.embedding.engine.dart.DartExecutor +import org.unifiedpush.flutter.connector.UnifiedPushReceiver + +import android.content.Context + +class UnifiedPushReceiver : UnifiedPushReceiver() { + override fun getEngine(context: Context): FlutterEngine { + var engine = MainActivity.engine + if (engine == null) { + engine = MainActivity.provideEngine(context) + engine.localizationPlugin.sendLocalesToFlutter( + context.resources.configuration + ) + engine.dartExecutor.executeDartEntrypoint( + DartExecutor.DartEntrypoint.createDefault() + ) + } + return engine + } +} \ No newline at end of file diff --git a/android/app/src/main/res/drawable-anydpi-v24/notifications_icon.xml b/android/app/src/main/res/drawable-anydpi-v24/notifications_icon.xml new file mode 100644 index 0000000..08a60c8 --- /dev/null +++ b/android/app/src/main/res/drawable-anydpi-v24/notifications_icon.xml @@ -0,0 +1,12 @@ + + + + diff --git a/android/app/src/main/res/drawable-hdpi/notifications_icon.png b/android/app/src/main/res/drawable-hdpi/notifications_icon.png new file mode 100644 index 0000000..a70beeb Binary files /dev/null and b/android/app/src/main/res/drawable-hdpi/notifications_icon.png differ diff --git a/android/app/src/main/res/drawable-hdpi/splash.png b/android/app/src/main/res/drawable-hdpi/splash.png new file mode 100644 index 0000000..7af6e14 Binary files /dev/null and b/android/app/src/main/res/drawable-hdpi/splash.png differ diff --git a/android/app/src/main/res/drawable-mdpi/notifications_icon.png b/android/app/src/main/res/drawable-mdpi/notifications_icon.png new file mode 100644 index 0000000..a70beeb Binary files /dev/null and b/android/app/src/main/res/drawable-mdpi/notifications_icon.png differ diff --git a/android/app/src/main/res/drawable-mdpi/splash.png b/android/app/src/main/res/drawable-mdpi/splash.png new file mode 100644 index 0000000..7af6e14 Binary files /dev/null and b/android/app/src/main/res/drawable-mdpi/splash.png differ diff --git a/android/app/src/main/res/drawable-night-v21/background.png b/android/app/src/main/res/drawable-night-v21/background.png new file mode 100644 index 0000000..1b5df34 Binary files /dev/null and b/android/app/src/main/res/drawable-night-v21/background.png differ diff --git a/android/app/src/main/res/drawable-night-v21/launch_background.xml b/android/app/src/main/res/drawable-night-v21/launch_background.xml new file mode 100644 index 0000000..3fe6b2e --- /dev/null +++ b/android/app/src/main/res/drawable-night-v21/launch_background.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/drawable-night/background.png b/android/app/src/main/res/drawable-night/background.png new file mode 100644 index 0000000..1b5df34 Binary files /dev/null and b/android/app/src/main/res/drawable-night/background.png differ diff --git a/android/app/src/main/res/drawable-night/launch_background.xml b/android/app/src/main/res/drawable-night/launch_background.xml new file mode 100644 index 0000000..3fe6b2e --- /dev/null +++ b/android/app/src/main/res/drawable-night/launch_background.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/drawable-v21/background.png b/android/app/src/main/res/drawable-v21/background.png new file mode 100644 index 0000000..e29b3b5 Binary files /dev/null and b/android/app/src/main/res/drawable-v21/background.png differ diff --git a/android/app/src/main/res/drawable-v21/launch_background.xml b/android/app/src/main/res/drawable-v21/launch_background.xml new file mode 100644 index 0000000..3fe6b2e --- /dev/null +++ b/android/app/src/main/res/drawable-v21/launch_background.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/drawable-xhdpi/notifications_icon.png b/android/app/src/main/res/drawable-xhdpi/notifications_icon.png new file mode 100644 index 0000000..a70beeb Binary files /dev/null and b/android/app/src/main/res/drawable-xhdpi/notifications_icon.png differ diff --git a/android/app/src/main/res/drawable-xhdpi/splash.png b/android/app/src/main/res/drawable-xhdpi/splash.png new file mode 100644 index 0000000..7af6e14 Binary files /dev/null and b/android/app/src/main/res/drawable-xhdpi/splash.png differ diff --git a/android/app/src/main/res/drawable-xxhdpi/notifications_icon.png b/android/app/src/main/res/drawable-xxhdpi/notifications_icon.png new file mode 100644 index 0000000..a70beeb Binary files /dev/null and b/android/app/src/main/res/drawable-xxhdpi/notifications_icon.png differ diff --git a/android/app/src/main/res/drawable-xxhdpi/splash.png b/android/app/src/main/res/drawable-xxhdpi/splash.png new file mode 100644 index 0000000..7af6e14 Binary files /dev/null and b/android/app/src/main/res/drawable-xxhdpi/splash.png differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/notifications_icon.png b/android/app/src/main/res/drawable-xxxhdpi/notifications_icon.png new file mode 100644 index 0000000..a70beeb Binary files /dev/null and b/android/app/src/main/res/drawable-xxxhdpi/notifications_icon.png differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/splash.png b/android/app/src/main/res/drawable-xxxhdpi/splash.png new file mode 100644 index 0000000..7af6e14 Binary files /dev/null and b/android/app/src/main/res/drawable-xxxhdpi/splash.png differ diff --git a/android/app/src/main/res/drawable/background.png b/android/app/src/main/res/drawable/background.png new file mode 100644 index 0000000..e29b3b5 Binary files /dev/null and b/android/app/src/main/res/drawable/background.png differ diff --git a/android/app/src/main/res/drawable/ic_launcher_foreground.xml b/android/app/src/main/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 0000000..ae796a4 --- /dev/null +++ b/android/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + diff --git a/android/app/src/main/res/drawable/ic_launcher_monochrome.xml b/android/app/src/main/res/drawable/ic_launcher_monochrome.xml new file mode 100644 index 0000000..7903b52 --- /dev/null +++ b/android/app/src/main/res/drawable/ic_launcher_monochrome.xml @@ -0,0 +1,17 @@ + + + + + + diff --git a/android/app/src/main/res/drawable/launch_background.xml b/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 0000000..3fe6b2e --- /dev/null +++ b/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..1084c24 --- /dev/null +++ b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..7af6e14 Binary files /dev/null and b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..7af6e14 Binary files /dev/null and b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..7af6e14 Binary files /dev/null and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..7af6e14 Binary files /dev/null and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..7af6e14 Binary files /dev/null and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/values-night/styles.xml b/android/app/src/main/res/values-night/styles.xml new file mode 100644 index 0000000..7c806c6 --- /dev/null +++ b/android/app/src/main/res/values-night/styles.xml @@ -0,0 +1,19 @@ + + + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/values/ic_launcher_background.xml b/android/app/src/main/res/values/ic_launcher_background.xml new file mode 100644 index 0000000..c5d5899 --- /dev/null +++ b/android/app/src/main/res/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ + + + #FFFFFF + \ No newline at end of file diff --git a/android/app/src/main/res/values/styles.xml b/android/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..00fa441 --- /dev/null +++ b/android/app/src/main/res/values/styles.xml @@ -0,0 +1,8 @@ + + + + diff --git a/android/app/src/main/res/xml/locale_config.xml b/android/app/src/main/res/xml/locale_config.xml new file mode 100644 index 0000000..b3bb1ff --- /dev/null +++ b/android/app/src/main/res/xml/locale_config.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android/build.gradle b/android/build.gradle new file mode 100644 index 0000000..ff96015 --- /dev/null +++ b/android/build.gradle @@ -0,0 +1,17 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +rootProject.buildDir = '../build' + +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" + project.evaluationDependsOn(":app") +} + +tasks.register("clean", Delete) { + delete rootProject.buildDir +} \ No newline at end of file diff --git a/android/fastlane/Appfile b/android/fastlane/Appfile new file mode 100644 index 0000000..872e078 --- /dev/null +++ b/android/fastlane/Appfile @@ -0,0 +1,2 @@ +json_key_file("keys.json") # Path to the json secret file - Follow https://docs.fastlane.tools/actions/supply/#setup to get one +package_name("chat.fluffy.fluffychat") # e.g. com.krausefx.app diff --git a/android/fastlane/Fastfile b/android/fastlane/Fastfile new file mode 100644 index 0000000..804cd4b --- /dev/null +++ b/android/fastlane/Fastfile @@ -0,0 +1,71 @@ +# This file contains the fastlane.tools configuration +# You can find the documentation at https://docs.fastlane.tools +# +# For a list of all available actions, check out +# +# https://docs.fastlane.tools/actions +# +# For a list of all available plugins, check out +# +# https://docs.fastlane.tools/plugins/available-plugins +# + +# Workaround for https://github.com/fastlane/fastlane/issues/21507#issuecomment-1723116829 +ENV['SUPPLY_UPLOAD_MAX_RETRIES']='5' + +# Uncomment the line if you want fastlane to automatically update itself +update_fastlane + +default_platform(:android) + +platform :android do + lane :set_build_code_internal do + versions = google_play_track_version_codes( + track: "internal", + json_key: "./keys.json" + ) + last_version = versions[0].to_i + Dir.chdir("../..") do + re = /version:\s([0-9]*\.[0-9]*\.[0-9]*)\+[0-9]*/i + config = File.read("./pubspec.yaml") + version_name = config.match(re).captures + + subst = "version: #{version_name[0]}+#{last_version+2}" + + result = config.gsub(re, subst) + + File.open("./pubspec.yaml", 'w') { |file| file.write(result) } + end + end + + lane :deploy_internal_test do + versions = google_play_track_version_codes( + track: "internal", + json_key: "./keys.json" + ) + last_version = versions[0].to_i + upload_to_play_store( + track: 'internal', + aab: '../build/app/outputs/bundle/release/app-release.aab', + version_code: "#{last_version+1}", + ) + end + + lane :deploy_candidate do + upload_to_play_store( + track: 'internal', + track_promote_to: "beta", + deactivate_on_promote: false, + skip_upload_changelogs: true, + ) + end + + lane :deploy_release do + upload_to_play_store( + track: 'internal', + track_promote_to: "production", + deactivate_on_promote: false, + skip_upload_changelogs: true, + ) + end +end diff --git a/android/fastlane/README.md b/android/fastlane/README.md new file mode 100644 index 0000000..300ccee --- /dev/null +++ b/android/fastlane/README.md @@ -0,0 +1,56 @@ +fastlane documentation +---- + +# Installation + +Make sure you have the latest version of the Xcode command line tools installed: + +```sh +xcode-select --install +``` + +For _fastlane_ installation instructions, see [Installing _fastlane_](https://docs.fastlane.tools/#installing-fastlane) + +# Available Actions + +## Android + +### android set_build_code_internal + +```sh +[bundle exec] fastlane android set_build_code_internal +``` + + + +### android deploy_internal_test + +```sh +[bundle exec] fastlane android deploy_internal_test +``` + + + +### android deploy_candidate + +```sh +[bundle exec] fastlane android deploy_candidate +``` + + + +### android deploy_release + +```sh +[bundle exec] fastlane android deploy_release +``` + + + +---- + +This README.md is auto-generated and will be re-generated every time [_fastlane_](https://fastlane.tools) is run. + +More information about _fastlane_ can be found on [fastlane.tools](https://fastlane.tools). + +The documentation of _fastlane_ can be found on [docs.fastlane.tools](https://docs.fastlane.tools). diff --git a/android/fastlane/metadata/android/en-US/changelogs/2324 (1.6.0).txt b/android/fastlane/metadata/android/en-US/changelogs/2324 (1.6.0).txt new file mode 100644 index 0000000..b231850 --- /dev/null +++ b/android/fastlane/metadata/android/en-US/changelogs/2324 (1.6.0).txt @@ -0,0 +1,68 @@ +FluffyChat 1.6.0 features a lot of bug fixes and improvements. The code base has been +simplified and the drawer on the chat list page got a come-back. Some new features like +the space hierarchy and session dump have been implemented. + +- feat: Added monochrome entry for themed icon support in Android 13 (James Reilly) +- feat: Display timeline of messages in android notification (Christian Pauly) +- feat: Emoji related fixes (TheOneWithTheBraid) +- feat: Implement deleting pushers in app (Christian Pauly) +- feat: New material 3 design (Christian Pauly) +- feat: Redesign bootsstrap and offer secure storage support (Christian Pauly) +- feat: Send multiple images at once (Christian Pauly) +- feat: implement session dump (TheOneWithTheBraid) +- feat: implement space hierarchy (TheOneWithTheBraid) +- feat: introduce extended integration tests (TheOneWithTheBraid) +- feat: libhandy integration (TheOneWithTheBraid) +- fix: Clearing push triggered when only one room got seen (Christian Pauly) +- fix: Dont display loading dialog when adding reaction (Christian Pauly) +- fix: Follow up for spaces hierarchy (TheOneWithTheBraid) +- fix: Missing null checks in chat details view (Christian Pauly) +- fix: Non FCM Android builds crash on start (Christian Pauly) +- fix: Permission chooser dialog on iOS (Christian Pauly) +- fix: Set avatar on only single action available (Christian Pauly) +- fix: Sharing on iOS and iPad (Christian Pauly) +- fix: Unread bubble is invisible in dark mode (Christian Pauly) +- fix: appimage builds (TheOneWithTheBraid) +- fix: only use custom http client on android (Jayesh Nirve) +- fix: pass isrg cert to http client (Jayesh Nirve) +- refactor: Chat view (Christian Pauly) +- refactor: Encryption button (Christian Pauly) +- refactor: Remove duplicated imports (Christian Pauly) +- refactor: Remove legacy store (Christian Pauly) +- refactor: Remove presence status feature (Christian Pauly) +- refactor: Simplify MxcImage and replace CachedNetworkImage (Christian Pauly) +- refactor: Switch to Hive Collections DB (Christian Pauly) +- refactor: move start chat FAB to implementation file (TheOneWithTheBraid) +- Translated using Weblate (Catalan) (Alfonso Montero López) +- Translated using Weblate (Catalan) (Auri B.P) +- Translated using Weblate (Chinese (Simplified)) (Eric) +- Translated using Weblate (Croatian) (Milo Ivir) +- Translated using Weblate (Dutch) (Jelv) +- Translated using Weblate (English) (Raatty) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (Finnish) (Aminda Suomalainen) +- Translated using Weblate (Galician) (Xosé M) +- Translated using Weblate (Indonesian) (Linerly) +- Translated using Weblate (Persian) (Amir Hossein Maher) +- Translated using Weblate (Polish) (Przemysław Romanik) +- Translated using Weblate (Russian) (Nikita Epifanov) +- Translated using Weblate (Turkish) (Oğuz Ersen) +- Translated using Weblate (Ukrainian) (Ihor Hordiichuk) +- chore: Add border to avatars (Christian Pauly) +- chore: Add fancy hero animations (Christian Pauly) +- chore: Adjust appbar design (Christian Pauly) +- chore: Adjust design (Christian Pauly) +- chore: Adjust search bar design (Christian Pauly) +- chore: Always display header elevation in chat (Christian Pauly) +- chore: Design follow up fixes (Christian Pauly) +- chore: Design follow up fixes (Christian Pauly) +- chore: Disable integration tests without runners (Krille Fear) +- chore: Enhance invitiation UX (Christian Pauly) +- chore: Make push helper more fail safe (Christian Pauly) +- chore: Make push helper more stable (Christian Pauly) +- chore: Minor design improvements (Christian Pauly) +- chore: Pinned events design (Christian Pauly) +- chore: Remove permission handler dependency and increase compileSdkVersion (Christian Pauly) +- chore: Switch to flutter 3.0.5 (Krille Fear) +- chore: Update SDK (Christian Pauly) +- chore: remove snapping sheet (TheOneWithTheBraid) \ No newline at end of file diff --git a/android/fastlane/metadata/android/en-US/full_description.txt b/android/fastlane/metadata/android/en-US/full_description.txt new file mode 100644 index 0000000..338ecc2 --- /dev/null +++ b/android/fastlane/metadata/android/en-US/full_description.txt @@ -0,0 +1 @@ +Extera Next is an experimental fork of FluffyChat. \ No newline at end of file diff --git a/android/fastlane/metadata/android/en-US/images/featureGraphic.png b/android/fastlane/metadata/android/en-US/images/featureGraphic.png new file mode 100644 index 0000000..bafa743 Binary files /dev/null and b/android/fastlane/metadata/android/en-US/images/featureGraphic.png differ diff --git a/android/fastlane/metadata/android/en-US/images/icon.png b/android/fastlane/metadata/android/en-US/images/icon.png new file mode 100644 index 0000000..3c730b9 Binary files /dev/null and b/android/fastlane/metadata/android/en-US/images/icon.png differ diff --git a/android/fastlane/metadata/android/en-US/short_description.txt b/android/fastlane/metadata/android/en-US/short_description.txt new file mode 100644 index 0000000..338ecc2 --- /dev/null +++ b/android/fastlane/metadata/android/en-US/short_description.txt @@ -0,0 +1 @@ +Extera Next is an experimental fork of FluffyChat. \ No newline at end of file diff --git a/android/fastlane/metadata/android/en-US/title.txt b/android/fastlane/metadata/android/en-US/title.txt new file mode 100644 index 0000000..9cc65eb --- /dev/null +++ b/android/fastlane/metadata/android/en-US/title.txt @@ -0,0 +1 @@ +Extera Next \ No newline at end of file diff --git a/android/fastlane/metadata/android/en-US/video.txt b/android/fastlane/metadata/android/en-US/video.txt new file mode 100644 index 0000000..e69de29 diff --git a/android/fastlane/report.xml b/android/fastlane/report.xml new file mode 100644 index 0000000..96f7a8a --- /dev/null +++ b/android/fastlane/report.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android/gradle.properties b/android/gradle.properties new file mode 100644 index 0000000..975e44b --- /dev/null +++ b/android/gradle.properties @@ -0,0 +1,4 @@ +org.gradle.jvmargs=-Xmx4608m +android.useAndroidX=true +android.enableJetifier=true +kotlin.jvm.target.validation.mode=IGNORE \ No newline at end of file diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..e33907e --- /dev/null +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Mon Mar 17 08:36:03 CET 2025 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/android/settings.gradle b/android/settings.gradle new file mode 100644 index 0000000..dc540c5 --- /dev/null +++ b/android/settings.gradle @@ -0,0 +1,26 @@ +pluginManagement { + def flutterSdkPath = { + def properties = new Properties() + file("local.properties").withInputStream { properties.load(it) } + def flutterSdkPath = properties.getProperty("flutter.sdk") + assert flutterSdkPath != null, "flutter.sdk not set in local.properties" + return flutterSdkPath + }() + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id "dev.flutter.flutter-plugin-loader" version "1.0.0" + id "com.android.application" version "8.7.3" apply false + id "org.jetbrains.kotlin.android" version "2.1.10" apply false + // id "com.google.gms.google-services" version "4.3.8" apply false +} + +include ":app" \ No newline at end of file diff --git a/appimage/.gitignore b/appimage/.gitignore new file mode 100644 index 0000000..eeda4ed --- /dev/null +++ b/appimage/.gitignore @@ -0,0 +1,3 @@ +FluffyChat.AppDir +*.AppImage +*.AppImage.zsync diff --git a/appimage/AppRun b/appimage/AppRun new file mode 100755 index 0000000..95b7c05 --- /dev/null +++ b/appimage/AppRun @@ -0,0 +1,4 @@ +#!/bin/sh + +cd "$(dirname "$0")" +exec ./fluffychat \ No newline at end of file diff --git a/appimage/FluffyChat.desktop b/appimage/FluffyChat.desktop new file mode 100644 index 0000000..ceee4c9 --- /dev/null +++ b/appimage/FluffyChat.desktop @@ -0,0 +1,9 @@ +[Desktop Entry] +Type=Application +Version=1.0 +Name=FluffyChat +Comment=Matrix Client. Chat with your friends +Exec=AppRun +Icon=fluffychat +Terminal=false +Categories=Network;Chat;InstantMessaging;X-Matrix; \ No newline at end of file diff --git a/appimage/README.md b/appimage/README.md new file mode 100644 index 0000000..60f82de --- /dev/null +++ b/appimage/README.md @@ -0,0 +1,24 @@ +# FluffyChat AppImage + +FluffyChat is provided as AppImage too. To Download, visit fluffychat.im. + +## Building + +- Ensure you install `appimagetool` + +```shell +flutter build linux + +# copy binaries to appimage dir +cp -r build/linux/{x64,arm64}/release/bundle appimage/FluffyChat.AppDir +cd appimage + +# prepare AppImage files +cp FluffyChat.desktop FluffyChat.AppDir/ +mkdir -p FluffyChat.AppDir/usr/share/icons +cp ../assets/logo.svg FluffyChat.AppDir/fluffychat.svg +cp AppRun FluffyChat.AppDir + +# build the AppImage +appimagetool FluffyChat.AppDir +``` diff --git a/assets/banner.png b/assets/banner.png new file mode 100644 index 0000000..8e1bb36 Binary files /dev/null and b/assets/banner.png differ diff --git a/assets/banner_transparent.png b/assets/banner_transparent.png new file mode 100644 index 0000000..8e1bb36 Binary files /dev/null and b/assets/banner_transparent.png differ diff --git a/assets/favicon.png b/assets/favicon.png new file mode 100644 index 0000000..61d0656 Binary files /dev/null and b/assets/favicon.png differ diff --git a/assets/info-logo.png b/assets/info-logo.png new file mode 100644 index 0000000..61d0656 Binary files /dev/null and b/assets/info-logo.png differ diff --git a/assets/js/olm.zip b/assets/js/olm.zip new file mode 100644 index 0000000..8537307 --- /dev/null +++ b/assets/js/olm.zip @@ -0,0 +1 @@ +Not Found \ No newline at end of file diff --git a/assets/l10n/intl_ar.arb b/assets/l10n/intl_ar.arb new file mode 100644 index 0000000..65a6be0 --- /dev/null +++ b/assets/l10n/intl_ar.arb @@ -0,0 +1,3194 @@ +{ + "@@locale": "ar", + "@@last_modified": "2021-08-14 12:41:10.156221", + "about": "حول", + "@about": { + "type": "String", + "placeholders": {} + }, + "accept": "أقبل", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 {username} قبل الدعوة", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "الحساب", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐 تم تنشيط {username} التشفير من طرف إلى طرف", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "admin": "المدير", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "اللقب", + "@alias": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "{senderName} أجاب على المكالمة", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "يمكن لأي أحد الدخول", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "archive": "الأرشيف", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "هل يُسمح للزوار الدخول", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "أمتأكد؟", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "لتتمكن من التأكد من الشخص الآخر، يرجى إدخال عبارة المرور أو مفتاح الاسترداد.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "أتقبل طلب تحقق {username}؟", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "banFromChat": "حظر من المحادثة", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "محظور", + "@banned": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username} حظر {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "أُحظر الجهاز", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "cancel": "ألغِ", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "غيَّر {username} صورة المحادثة", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatDescriptionTo": "غيَّر {username} وصف المحادثة الى: '{description}'", + "@changedTheChatDescriptionTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "description": { + "type": "String" + } + } + }, + "changedTheChatNameTo": "غيَّر {username} اسم المحادثة الى: '{chatname}'", + "@changedTheChatNameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "chatname": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "غيَّر {username} أذون المحادثة", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username} غير إسمه العلني إلى: '{displayname}'", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "غيّر {username} قواعد وصول الزوار", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "غيّر {username} قواعد وصول الزوار الى: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "غيَّر {username} مرئية التأريخ", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "غيَّر {username} مرئية التأريخ الى: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "غيَّر {username} قواعد الانضمام", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "غيَّر {username} قواعد الانضمام الى: {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "غيّر {username} صورته الشخصية", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "غيّر {username} ألقاب الغرف", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "غيّر {username} رابط الدعوة", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changeTheHomeserver": "غيّر الخادم", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "غيّر أسلوبك", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "غيِّر اسم المجموعة", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "فسُد التشفير", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "chat": "محادثة", + "@chat": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "تفاصيل المحادثة", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "اختر كلمة سر قوية", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "close": "اغلق", + "@close": { + "type": "String", + "placeholders": {} + }, + "compareEmojiMatch": "يرجى مقارنة الرموز التعبيرية", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "الرجاء مقارنة الأرقام", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "confirm": "أكّد", + "@confirm": { + "type": "String", + "placeholders": {} + }, + "connect": "اتصل", + "@connect": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "دعيَ المراسل للمجموعة", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "نُسخ للحافظة", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "انسخ", + "@copy": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "تعذر فك تشفير الرسالة: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "countParticipants": "{count} منتسبا", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "create": "أنشئ", + "@create": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "💬 أنشأ {username} المحادثة", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "currentlyActive": "نشطٌ حاليا", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "داكن", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "dateWithoutYear": "{month}-{day}", + "@dateWithoutYear": { + "type": "String", + "placeholders": { + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "dateWithYear": "{day}/{month}/{year}", + "@dateWithYear": { + "type": "String", + "placeholders": { + "year": { + "type": "String" + }, + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "deactivateAccountWarning": "لا مجال للعودة، أتأكد تعطيل حسابك؟", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "delete": "احذف", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "احذف الحساب", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "حذف الرسالة", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "device": "جهاز", + "@device": { + "type": "String", + "placeholders": {} + }, + "devices": "الأجهزة", + "@devices": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "غُيِّر الاسم العلني", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "نزِّل الملف", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "editDisplayname": "حرر الاسم العلني", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "الانفعالة موجودة مسبقا!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "رمز الانفعالة غير صالح!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "اعدادات الانفعالات", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "emoteShortcode": "رمز الانفعالة", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emoteWarnNeedToPick": "اختر صورة ورمزا للانفعالة!", + "@emoteWarnNeedToPick": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "محادثة فارغة", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "لن يمكنك تعطيل التشفير أبدا، أمتأكد؟", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "encryption": "التشفير", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "التشفير معطل", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "أنهى {senderName} المكالمة", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "enterYourHomeserver": "أدخل الخادم", + "@enterYourHomeserver": { + "type": "String", + "placeholders": {} + }, + "fileName": "اسم الملف", + "@fileName": { + "type": "String", + "placeholders": {} + }, + "fluffychat": "فلافي-شات", + "@fluffychat": { + "type": "String", + "placeholders": {} + }, + "forward": "أعد التوجيه", + "@forward": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "من بعد الانضمام", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "من بعد الدعوة", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "group": "المجموعة", + "@group": { + "type": "String", + "placeholders": {} + }, + "groupIsPublic": "المجموعة عامة", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "groupWith": "في مجموعة مع {displayname}", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "guestsAreForbidden": "يمنع الزوار", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "يمكن للزوار الانضمام", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "سحب {username} دعوة {targetName}", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "help": "المساعدة", + "@help": { + "type": "String", + "placeholders": {} + }, + "id": "المعرّف", + "@id": { + "type": "String", + "placeholders": {} + }, + "identity": "المُعرّف", + "@identity": { + "type": "String", + "placeholders": {} + }, + "ignoredUsers": "المستخدمون المتجاهلون", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "عبارة مرور أو مفتاح استرداد خطأ", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "دعوة مراسل", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "أدعو مراسلا الى {groupName}", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "invited": "دُعيَ", + "@invited": { + "type": "String", + "placeholders": {} + }, + "invitedUser": "📩 {username} دعا {targetName}", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "invitedUsersOnly": "المستخدمون المدعوون فقط", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "inviteText": "دعاك {username} إلى Extera.\n1. قم بزيارة موقع fluffychat.im وقم بتثبيت التطبيق\n2. قم بإنشاءحساب أو تسجيل الدخول\n3. افتح رابط الدعوة:\n {link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "isTyping": "يكتب…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "👋 انضم {username} إلى المحادثة", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "joinRoom": "انضم للمحادثة", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "kicked": "👞 {username} ركل {targetName}", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickedAndBanned": "🙅 {username} ركل وحظر {targetName}", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickFromChat": "طرد من المحادثة", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "آخر نشاط: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "leave": "غادر", + "@leave": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "غادر المحادثة", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "license": "الرخصة", + "@license": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "فاتح", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "حمِّل {count} منتسبًا إضافيًا", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "loadingPleaseWait": "يحمّل… يرجى الانتظار.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "loadMore": "حمِّل المزيد…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "login": "لِج", + "@login": { + "type": "String", + "placeholders": {} + }, + "logInTo": "لِج ل {homeserver}", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "logout": "اخرج", + "@logout": { + "type": "String", + "placeholders": {} + }, + "moderator": "مشرف", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "muteChat": "أكتم الماحدثة", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "needPantalaimonWarning": "اعلم أننا نستخدم بانتاليمون للتشفير طرفا لطرف.", + "@needPantalaimonWarning": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "💬 رسالة جديدة في Extera", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "طلب تحقق جديد!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "no": "لا", + "@no": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "لم يُعثر على انفعالة. 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "يبدو أن خدمة Firebase Cloud Messaging غير متاحة على جهازك. لمواصلة تلقي الإشعارات، نوصي بتثبيت ntfy. باستخدام ntfy أو أي مزود خدمة Unified Push آخر، يمكنك تلقي إشعارات الدفع بطريقة آمنة للبيانات. يمكنك تنزيل ntfy من PlayStore أو من F-Droid.", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "none": "بدون", + "@none": { + "type": "String", + "placeholders": {} + }, + "noPermission": "بدون اذن", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "لم يُعثر على غرف…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "ok": "موافق", + "@ok": { + "type": "String", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "تم تفعيل النسخ الاحتياطي للمفاتيح عبر الإنترنت", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "عفوًا، حدث خطأ ما…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "افتح التطبيق لقراءة الرسائل", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "openCamera": "افتح الكميرا", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "عبارة المرور أو مفتاح الاستعادة", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "password": "كلمة السر", + "@password": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "غُيّرت كلمة السر", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "pickImage": "اختر صورة", + "@pickImage": { + "type": "String", + "placeholders": {} + }, + "pin": "ثبِّت", + "@pin": { + "type": "String", + "placeholders": {} + }, + "play": "شغّل {fileName}", + "@play": { + "type": "String", + "placeholders": { + "fileName": { + "type": "String" + } + } + }, + "pleaseEnterYourPassword": "أدخل كلمة السر", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "أدخل اسم المستخدم", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "privacy": "الخصوصية", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "الغرف العامة", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "recording": "يسجل", + "@recording": { + "type": "String", + "placeholders": {} + }, + "redactedAnEvent": "حذف {username} حدثًا", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "reject": "رفض", + "@reject": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "رفض {username} الدعوة", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "rejoin": "أعد الانضمام", + "@rejoin": { + "type": "String", + "placeholders": {} + }, + "remove": "أزِل", + "@remove": { + "type": "String", + "placeholders": {} + }, + "removeAllOtherDevices": "أزِل كل الأجهزة الأخرى", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "removedBy": "أزاله {username}", + "@removedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "removeDevice": "أزل جهازا", + "@removeDevice": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "فك حجبه من المحادثة", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "renderRichContent": "صيّر الرسائل ذات المحتوى الكبير", + "@renderRichContent": { + "type": "String", + "placeholders": {} + }, + "reply": "ردّ", + "@reply": { + "type": "String", + "placeholders": {} + }, + "requestPermission": "أطلب إذنا", + "@requestPermission": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "رُقيّت الغرفة", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "seenByUser": "رآه {username}", + "@seenByUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "send": "أرسل", + "@send": { + "type": "String", + "placeholders": {} + }, + "sendAMessage": "أرسل رسالة", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "sendAudio": "أرسل ملفًا صوتيًا", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendFile": "أرسل ملف", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendImage": "أرسل صورة", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendOriginal": "أرسل الملف الأصلي", + "@sendOriginal": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "أرسل فيديو", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "sentAFile": "📁 أرسل {username} ملفا", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAnAudio": "🎤 أرسل {username} ملفا صوتيا", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAPicture": "🖼️ {username} أرسل صورة", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentASticker": "😊 أرسل {username} ملصقا", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "🎥 أرسل {username} مقطع فيديو", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentCallInformations": "أرسل {senderName} معلومات مكالمة", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "setInvitationLink": "عيّن رابط الدعوة", + "@setInvitationLink": { + "type": "String", + "placeholders": {} + }, + "setStatus": "عيّن الحالة", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "settings": "الإعدادات", + "@settings": { + "type": "String", + "placeholders": {} + }, + "share": "شارك", + "@share": { + "type": "String", + "placeholders": {} + }, + "sharedTheLocation": "شارك {username} موقعه", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "skip": "تخط", + "@skip": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "الشفرة المصدرية", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "startedACall": "بدأ {senderName} مكالمة", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "statusExampleMessage": "ماهو وضعك؟", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "submit": "أرسل", + "@submit": { + "type": "String", + "placeholders": {} + }, + "systemTheme": "النظام", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "لا يتطبقان", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "متطبقان", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "title": "فلافي-شات", + "@title": { + "description": "Title for the application", + "type": "String", + "placeholders": {} + }, + "tryToSendAgain": "حاول إعادة الارسال", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "ألغى {username} حظر {targetName}", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "unblockDevice": "ألغ حظر الجهاز", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "جهز مجهول", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "unknownEncryptionAlgorithm": "خوارزمية تشفير مجهولة", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unknownEvent": "حدث مجهول '{type}'", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "unmuteChat": "ألغِ كتم المحادثة", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "unpin": "ألغِ التثبيت", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "unreadChats": "{unreadCount, plural, =1{1 محادثة غير مقروءة} other{{unreadCount} محادثات غير مقروءة}}", + "@unreadChats": { + "type": "String", + "placeholders": { + "unreadCount": { + "type": "int" + } + } + }, + "userAndOthersAreTyping": "{username} و {count} أخرون يكتبون…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "userAndUserAreTyping": "{username} و {username2} يكتبان…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userIsTyping": "{username} يكتب…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userLeftTheChat": "🚪 {username} غادر المحادثة", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "username": "اسم المستخدم", + "@username": { + "type": "String", + "placeholders": {} + }, + "userSentUnknownEvent": "أرسل {username} حدث {type}", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "verify": "تحقق", + "@verify": { + "type": "String", + "placeholders": {} + }, + "verifyStart": "ابدأ التحقق", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "تُحقق منك بنجاح!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "verifyTitle": "يتحقق من الحساب الآخر", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "videoCall": "مكالمة فيديو", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "مرئية تأريخ المحادثة", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "مرئي لكل المنتسبين", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "مرئي للجميع", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "رسالة صوتية", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "ينتظر قبول الشريك للطلب…", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "ينتظر قبول الشريك لإيموجي…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "ينتظر قبول الشريك للأرقام…", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "wallpaper": "الخلفية:", + "@wallpaper": { + "type": "String", + "placeholders": {} + }, + "warning": "تحذير!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "من يسمح له الانضمام للمجموعة", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "اكتب رسالة…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "yes": "نعم", + "@yes": { + "type": "String", + "placeholders": {} + }, + "you": "انت", + "@you": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "لم تعد منتسبا لهذه المحادثة", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "حُظرت من هذه المحادثة", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "people": "أشخاص", + "@people": { + "type": "String", + "placeholders": {} + }, + "scanQrCode": "امسح رمز الاستجابة السريعة", + "@scanQrCode": {}, + "noMatrixServer": "{server1} ليس خادم ماتريكس، بدلًا منه أتريد استخدام {server2}؟", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "noConnectionToTheServer": "انقطع الاتصال بالخادم", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "next": "التالي", + "@next": { + "type": "String", + "placeholders": {} + }, + "newChat": "محادثة جديدة", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "messages": "الرسائل", + "@messages": { + "type": "String", + "placeholders": {} + }, + "mention": "اذكر", + "@mention": { + "type": "String", + "placeholders": {} + }, + "memberChanges": "تغييرات تخص الأعضاء", + "@memberChanges": { + "type": "String", + "placeholders": {} + }, + "inoffensive": "غير مسيء", + "@inoffensive": { + "type": "String", + "placeholders": {} + }, + "iHaveClickedOnLink": "نقرت على الرابط", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "ignore": "تجاهل", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "howOffensiveIsThisContent": "ما مدى سوء هذا المحتوى؟", + "@howOffensiveIsThisContent": { + "type": "String", + "placeholders": {} + }, + "hideUnknownEvents": "اخف الأحداث المجهولة", + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "groups": "المجموعات", + "@groups": { + "type": "String", + "placeholders": {} + }, + "goToTheNewRoom": "انتقل للغرفة الجديدة", + "@goToTheNewRoom": { + "type": "String", + "placeholders": {} + }, + "fontSize": "حجم الخط", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "extremeOffensive": "مسيئة للغاية", + "@extremeOffensive": { + "type": "String", + "placeholders": {} + }, + "everythingReady": "كل شيء جاهز!", + "@everythingReady": { + "type": "String", + "placeholders": {} + }, + "homeserver": "الخادم", + "@homeserver": {}, + "enterAnEmailAddress": "أدخل عنوان بريد إلكتروني", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "encrypted": "مشفر", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "فعّل التشفير", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "emotePacks": "حزمة الوجوه التعبيرية للغرفة", + "@emotePacks": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "عدّل الصورة الرمزية للغرفة", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "عدّل الخوادم المحجوبة", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "edit": "عدّل", + "@edit": { + "type": "String", + "placeholders": {} + }, + "directChats": "محادثات مباشرة", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "deviceId": "معرّف الجهاز", + "@deviceId": { + "type": "String", + "placeholders": {} + }, + "createNewSpace": "مساحة جديدة", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "انسخ الى الحافظة", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "أّرسل الابلاغ الى مدير الخادم", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "containsUserName": "يحوي اسم المستخدم", + "@containsUserName": { + "type": "String", + "placeholders": {} + }, + "containsDisplayName": "يحوي الاسم العلني", + "@containsDisplayName": { + "type": "String", + "placeholders": {} + }, + "commandMissing": "{command} ليس بأمر.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "commandInvalid": "أمر غير صالح", + "@commandInvalid": { + "type": "String" + }, + "commandHint_unban": "فك الحظر عن المستخدم المذكور في هذه الغرفة", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "commandHint_send": "أرسل نصًا", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "commandHint_react": "أرسل ردًا كتفاعل", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "commandHint_plain": "أرسل نصًا غير منسق", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_op": "عين مستوى نفوذ المستخدم في هذه الغرفة (الافتراضي: 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_myroomnick": "عين اسمًا لك مخصص لهذه الغرفة", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "commandHint_me": "صف نفسك", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "commandHint_leave": "تغادر هذه الغرفة", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_kick": "يزيل المستخدم المذكور من الغرفة", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_join": "تنضم الى الغرفة المذكورة", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_invite": "يدعو المستخدم المذكور الى الغرفة", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "commandHint_html": "أرسل نصًا بتنسيق HTML", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_ban": "يحظر المستخدم المذكور من هذه الغرفة", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "clearArchive": "امسح الأرشيف", + "@clearArchive": {}, + "chats": "المحادثات", + "@chats": { + "type": "String", + "placeholders": {} + }, + "chatHasBeenAddedToThisSpace": "أُضيفت المحادثة الى هذا المساحة", + "@chatHasBeenAddedToThisSpace": {}, + "chatBackup": "النسخ الاحتياطي للمحادثات", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "changeYourAvatar": "غيّر الصورة الرمزية", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "changePassword": "غيّر كلمة السر", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeDeviceName": "غيّر اسم الجهاز", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "cantOpenUri": "تعذر فتح المسار {uri}", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "blocked": "محجوب", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "sendOnEnter": "أرسل عند الدخول", + "@sendOnEnter": {}, + "autoplayImages": "شغِّل الملصقات والوجوه المتحركة تلقائيا", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "areYouSureYouWantToLogout": "أمتأكد من الخروج؟", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "appLock": "قفل التطبيق", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "allChats": "كل المحادثات", + "@allChats": { + "type": "String", + "placeholders": {} + }, + "all": "الكل", + "@all": { + "type": "String", + "placeholders": {} + }, + "addToSpace": "أضف إلى المساحة", + "@addToSpace": {}, + "addEmail": "أضف بريدًا إلكترونيًا", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "noPasswordRecoveryDescription": "لم تضف أي طريقة لاستعادة كلمة السر.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "notifications": "الإشعارات", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "reason": "السبب", + "@reason": { + "type": "String", + "placeholders": {} + }, + "search": "ابحث", + "@search": { + "type": "String", + "placeholders": {} + }, + "locationDisabledNotice": "خدمات الموقع معطلة. مكنها لتتمكن من مشاركة موقعك.", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "errorObtainingLocation": "خطأ أثناء الحصول على الموقع: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "editRoomAliases": "عدّل الاسم المميز للغرفة", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "configureChat": "ضبط المحادثة", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "chatBackupDescription": "يتم تأمين رسائلك القديمة باستخدام مفتاح الاسترداد. يرجى التأكد من أنك لا تضيعه.", + "@chatBackupDescription": { + "type": "String", + "placeholders": {} + }, + "shareLocation": "شارك الموقع", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "pleaseChooseAPasscode": "اختر رمز المرور", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "pleaseChoose": "اختر رجاء", + "@pleaseChoose": { + "type": "String", + "placeholders": {} + }, + "passwordRecovery": "استعادة كلمة السر", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "نسيتَ كلمة السر", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "participant": "منتسب", + "@participant": { + "type": "String", + "placeholders": {} + }, + "or": "أو", + "@or": { + "type": "String", + "placeholders": {} + }, + "serverRequiresEmail": "يتطلب هذا الخادم التحقق من بريدك الإلكتروني.", + "@serverRequiresEmail": {}, + "link": "رابط", + "@link": {}, + "openInMaps": "افتح في الخريطة", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "enableMultiAccounts": "(ميزة تجربية) فعّل تعدد الحسابات", + "@enableMultiAccounts": {}, + "bundleName": "اسم الحزمة", + "@bundleName": {}, + "removeFromBundle": "أزله من الحزمة", + "@removeFromBundle": {}, + "addToBundle": "أضفه الى حزمة", + "@addToBundle": {}, + "editBundlesForAccount": "عدّل حزم هذا الحساب", + "@editBundlesForAccount": {}, + "addAccount": "أضف حسابًا", + "@addAccount": {}, + "online": "متصل", + "@online": { + "type": "String", + "placeholders": {} + }, + "offline": "غير متصل", + "@offline": { + "type": "String", + "placeholders": {} + }, + "numUsersTyping": "{count} يكتبون…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "notificationsEnabledForThisAccount": "الإشعارات مفعلة لهذا الحساب", + "@notificationsEnabledForThisAccount": { + "type": "String", + "placeholders": {} + }, + "spaceIsPublic": "عام في المساحة", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "toggleFavorite": "بدّل حالة التفضيل", + "@toggleFavorite": { + "type": "String", + "placeholders": {} + }, + "toggleUnread": "علّمه كمقروء/غير مقروء", + "@toggleUnread": { + "type": "String", + "placeholders": {} + }, + "unavailable": "غير متوفر", + "@unavailable": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "لماذا تريد الإبلاغ عنه؟", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "يمكنك استعادة كلمة السر بهذه العناوين.", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "singlesignon": "تسجيل دخول أحادي", + "@singlesignon": { + "type": "String", + "placeholders": {} + }, + "toggleMuted": "بدّل حالة الكتم", + "@toggleMuted": { + "type": "String", + "placeholders": {} + }, + "showPassword": "أظهر كلمة السر", + "@showPassword": { + "type": "String", + "placeholders": {} + }, + "verified": "موثّق", + "@verified": { + "type": "String", + "placeholders": {} + }, + "spaceName": "اسم المساحة", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWait": "يُزامن… يرجى الانتظار.", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "طابات كثيرة. حاول مجددًا لاحقًا!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "weSentYouAnEmail": "أرسلنا لك رسالة بالبريد الإلكتروني", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "yourPublicKey": "مفتاحك العمومي", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "status": "الحالة", + "@status": { + "type": "String", + "placeholders": {} + }, + "transferFromAnotherDevice": "أنقله من جهاز آخر", + "@transferFromAnotherDevice": { + "type": "String", + "placeholders": {} + }, + "wipeChatBackup": "مسح نسخة المحادثة الاحتياطية لإنشاء مفتاح استرداد جديد؟", + "@wipeChatBackup": { + "type": "String", + "placeholders": {} + }, + "saveFile": "احفظ الملف", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "security": "الأمان", + "@security": { + "type": "String", + "placeholders": {} + }, + "removeYourAvatar": "أزل الصورة الرمزية", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "botMessages": "رسائل البوت", + "@botMessages": { + "type": "String", + "placeholders": {} + }, + "sendAsText": "أرسل نصًا", + "@sendAsText": { + "type": "String" + }, + "sendMessages": "إرسال رسائل", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "inviteForMe": "دعوات لي", + "@inviteForMe": { + "type": "String", + "placeholders": {} + }, + "replaceRoomWithNewerVersion": "استبدل الغرفة باصدار أحدث", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "register": "سجّل", + "@register": { + "type": "String", + "placeholders": {} + }, + "obtainingLocation": "يحصل على الموقع…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "sendSticker": "أرسل ملصقًا", + "@sendSticker": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "مستوى الأذونات الافتراضية للمستخدمين الجدد", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "setPermissionsLevel": "تعيين مستوى الأذونات", + "@setPermissionsLevel": { + "type": "String", + "placeholders": {} + }, + "setCustomEmotes": "عيّن وجوهًا تعبيرية مخصصة", + "@setCustomEmotes": { + "type": "String", + "placeholders": {} + }, + "oneClientLoggedOut": "أُ خرج أحد العملاء الذي تسختدمها", + "@oneClientLoggedOut": {}, + "pleaseEnter4Digits": "أدخل 4 أرقام أو أتركه فارغ لتعطيل القفل.", + "@pleaseEnter4Digits": { + "type": "String", + "placeholders": {} + }, + "redactMessage": "احذف رسالة", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "أبلغ عن الرسالة", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "إصدار الغرفة", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "repeatPassword": "كرّر كلمة السر", + "@repeatPassword": {}, + "removeFromSpace": "أزل من المساحة", + "@removeFromSpace": {}, + "unverified": "غير مؤكد", + "@unverified": {}, + "whoCanPerformWhichAction": "من يستطيع القيام بأي عمل", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "messageInfo": "معلومات الرسالة", + "@messageInfo": {}, + "messageType": "نوع الرسالة", + "@messageType": {}, + "sender": "المرسل", + "@sender": {}, + "openGallery": "افتخ المعرض", + "@openGallery": {}, + "time": "الوقت", + "@time": {}, + "badServerLoginTypesException": "يدعم الخادم المستخدم أنواع تسجيل الدخول التالية:\n{serverVersions}\nلكن هذا التطبيق يدعم فقط:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "commandHint_clearcache": "مسح الذاكرة المؤقتة", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "enableEmotesGlobally": "تفعيل حزمة التعبيرات بشكل عام", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "hideRedactedEvents": "إخفاء الأحداث المنقحة", + "@hideRedactedEvents": { + "type": "String", + "placeholders": {} + }, + "commandHint_discardsession": "إنهاء الجلسة", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "locationPermissionDeniedNotice": "تم رفض إذن الموقع. الرجاء منح الإذن للقدرة على مشاركة موقعك.", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "badServerVersionsException": "يدعم الخادم الرئيسي المستخدم إصدارات المواصفات:\n{serverVersions}\nلكن هذا التطبيق يدعم فقط:\n{supportedVersions}", + "@badServerVersionsException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "offensive": "عدواني", + "@offensive": { + "type": "String", + "placeholders": {} + }, + "yourChatBackupHasBeenSetUp": "تم إعداد النسخ الاحتياطي لمحادثاتك.", + "@yourChatBackupHasBeenSetUp": {}, + "noEncryptionForPublicRooms": "يمكنك فقط تفعيل التشفير عندما تصبح الغرفة غير متاحة للعامة.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "emojis": "إيموجي", + "@emojis": {}, + "voiceCall": "مكالمة صوتية", + "@voiceCall": {}, + "unsupportedAndroidVersion": "نسخة أندرويد غير مدعومة", + "@unsupportedAndroidVersion": {}, + "unsupportedAndroidVersionLong": "تتطلب هذه الميزة إصدار Android أحدث. يرجى التحقق من وجود تحديثات أو دعم Lineage OS.", + "@unsupportedAndroidVersionLong": {}, + "experimentalVideoCalls": "مكالمات الفيديو التجريبية", + "@experimentalVideoCalls": {}, + "commandHint_create": "أنشأ محادثة جماعية فارغة\nاستخدم --لا-تشفير لتعطيل التشفير", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "commandHint_dm": "إبدأ محادثة مباشرة\nاستخدم --لا-تشفير لتعطيل التشفير", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "oopsPushError": "عذراً! للأسف، حدث خطأ أثناء إعداد الإشعارات.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "يرجى اتباع التعليمات الموجودة على الموقع والنقر على التالي.", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "commandHint_myroomavatar": "حدد صورتك لهذه الغرفة (عن طريق mxc-uri)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "videoCallsBetaWarning": "يرجى ملاحظة أن مكالمات الفيديو حالياً في مرحلة تجريبية. قد لا تعمل كما هو متوقع أو تعمل على الإطلاق على جميع المنصات.", + "@videoCallsBetaWarning": {}, + "placeCall": "إجراء مكالمة", + "@placeCall": {}, + "videoWithSize": "فيديو ({size})", + "@videoWithSize": { + "type": "String", + "placeholders": { + "size": { + "type": "String" + } + } + }, + "emailOrUsername": "البريد الإلكتروني أو اسم المستخدم", + "@emailOrUsername": {}, + "dismiss": "رفض", + "@dismiss": {}, + "setAsCanonicalAlias": "تعيين كاسم مستعار رئيسي", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "pleaseClickOnLink": "يرجى النقر على الرابط الموجود في البريد الإلكتروني ثم المتابعة.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPin": "الرجاء إدخال رقم التعريف الشخصي الخاص بك", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "pushRules": "قواعد الإشعارات", + "@pushRules": { + "type": "String", + "placeholders": {} + }, + "reactedWith": "{sender} تفاعل ب {reaction}", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "markAsRead": "حدد كمقروء", + "@markAsRead": {}, + "openVideoCamera": "افتح الكاميرا لمقطع فيديو", + "@openVideoCamera": { + "type": "String", + "placeholders": {} + }, + "start": "إبدأ", + "@start": {}, + "publish": "انشر", + "@publish": {}, + "addToSpaceDescription": "إختر مساحة لإضافة هذه المحادثة إليها.", + "@addToSpaceDescription": {}, + "reportUser": "التبيلغ عن المستخدم", + "@reportUser": {}, + "openChat": "فتح المحادثة", + "@openChat": {}, + "pinMessage": "تثبيت في الغرفة", + "@pinMessage": {}, + "confirmEventUnpin": "هل أنت متأكد من إلغاء تثبيت الحدث بشكل دائم؟", + "@confirmEventUnpin": {}, + "fileHasBeenSavedAt": "تم حفظ الملف في {path}", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "user": "مستخدم", + "@user": {}, + "custom": "مُخصّص", + "@custom": {}, + "googlyEyesContent": "{senderName} يرسل لك عيون googly", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "widgetVideo": "فيديو", + "@widgetVideo": {}, + "recoveryKeyLost": "هل فقدت مفتاح الاسترداد؟", + "@recoveryKeyLost": {}, + "pleaseEnterRecoveryKeyDescription": "لإلغاء قفل رسائلك القديمة ، يرجى إدخال مفتاح الاسترداد الذي تم إنشاؤه في جلسة سابقة. مفتاح الاسترداد ليس كلمة المرور الخاصة بك.", + "@pleaseEnterRecoveryKeyDescription": {}, + "confirmMatrixId": "يرجى تأكيد معرف Matrix الخاص بك من أجل حذف حسابك.", + "@confirmMatrixId": {}, + "supposedMxid": "يجب أن يكون هذا {mxid}", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "hydrateTor": "مستخدمو تور: استيراد تصدير الجلسة", + "@hydrateTor": {}, + "commandHint_googly": "أرسل بعض عيون googly", + "@commandHint_googly": {}, + "commandHint_cuddle": "أرسل عناق", + "@commandHint_cuddle": {}, + "commandHint_hug": "إرسال حضن", + "@commandHint_hug": {}, + "cuddleContent": "{senderName} يحتضنك", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "unlockOldMessages": "إلغاء قفل الرسائل القديمة", + "@unlockOldMessages": {}, + "commandHint_markasdm": "وضع علامة على أنها غرفة رسائل مباشرة لمعرف المصفوفة", + "@commandHint_markasdm": {}, + "allRooms": "جميع الدردشات الجماعية", + "@allRooms": { + "type": "String", + "placeholders": {} + }, + "dehydrate": "تصدير الجلسة ومسح الجهاز", + "@dehydrate": {}, + "dehydrateWarning": "لا يمكن التراجع عن هذا الإجراء. تأكد من تخزين ملف النسخ الاحتياطي بأمان.", + "@dehydrateWarning": {}, + "dehydrateTorLong": "بالنسبة لمستخدمي تور ، يوصى بتصدير الجلسة قبل إغلاق النافذة.", + "@dehydrateTorLong": {}, + "dehydrateTor": "مستخدمو تور: تصدير الجلسة", + "@dehydrateTor": {}, + "hydrate": "استعادة من ملف النسخ الاحتياطي", + "@hydrate": {}, + "pleaseEnterRecoveryKey": "الرجاء إدخال مفتاح الاسترداد:", + "@pleaseEnterRecoveryKey": {}, + "recoveryKey": "مفتاح الاسترداد", + "@recoveryKey": {}, + "startFirstChat": "ابدأ محادثتك الأولى", + "@startFirstChat": {}, + "widgetCustom": "مُخصّص", + "@widgetCustom": {}, + "widgetNameError": "يرجى تقديم اسم العرض.", + "@widgetNameError": {}, + "errorAddingWidget": "خطأ في إضافة الأداة.", + "@errorAddingWidget": {}, + "youRejectedTheInvitation": "لقد رفضت الدعوة", + "@youRejectedTheInvitation": {}, + "youJoinedTheChat": "لقد انضممت إلى المحادثة", + "@youJoinedTheChat": {}, + "youAcceptedTheInvitation": "👍 لقد قبلت الدعوة", + "@youAcceptedTheInvitation": {}, + "youBannedUser": "لقد حظرت {user}", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youHaveWithdrawnTheInvitationFor": "لقد سحبت الدعوة لـ {user}", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedBy": "📩 لقد تمت دعوتك من قبل {user}", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "storeInAndroidKeystore": "تخزين في سجل مفاتيح اندرويد", + "@storeInAndroidKeystore": {}, + "storeInAppleKeyChain": "تخزين في سلسلة مفاتيح ابل", + "@storeInAppleKeyChain": {}, + "storeSecurlyOnThisDevice": "احفظه بأمان على هذا الجهاز", + "@storeSecurlyOnThisDevice": {}, + "countFiles": "ملفات {count}", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "foregroundServiceRunning": "يظهر هذا الإشعار عند تشغيل الخدمة الأمامية.", + "@foregroundServiceRunning": {}, + "screenSharingTitle": "مشاركة الشاشة", + "@screenSharingTitle": {}, + "appearOnTop": "يظهر في الأعلى", + "@appearOnTop": {}, + "otherCallingPermissions": "الميكروفون والكاميرا وأذونات Extera الأخرى", + "@otherCallingPermissions": {}, + "enterSpace": "أدخل المساحة", + "@enterSpace": {}, + "enterRoom": "أدخل الغرفة", + "@enterRoom": {}, + "deviceKeys": "مفاتيح الجهاز:", + "@deviceKeys": {}, + "whyIsThisMessageEncrypted": "لماذا هذه الرسالة غير قابلة للقراءة؟", + "@whyIsThisMessageEncrypted": {}, + "nextAccount": "الحساب التالي", + "@nextAccount": {}, + "previousAccount": "الحساب السابق", + "@previousAccount": {}, + "encryptThisChat": "تشفير هذه المحادثة", + "@encryptThisChat": {}, + "screenSharingDetail": "أنت تشارك شاشتك في FuffyChat", + "@screenSharingDetail": {}, + "hideUnimportantStateEvents": "إخفاء أحداث الحالة غير المهمة", + "@hideUnimportantStateEvents": {}, + "newGroup": "مجموعة جديدة", + "@newGroup": {}, + "youKicked": "👞 لقد ركلت {user}", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "newSpace": "مساحة جديدة", + "@newSpace": {}, + "commandHint_markasgroup": "وضع علامة كمجموعة", + "@commandHint_markasgroup": {}, + "separateChatTypes": "الدردشات المباشرة والمجموعات المنفصلة", + "@separateChatTypes": { + "type": "String", + "placeholders": {} + }, + "hugContent": "{senderName} يعانقك", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "hydrateTorLong": "هل قمت بتصدير جلستك الأخيرة على تور؟ قم باستيرادها بسرعة واستمر في المحادثة.", + "@hydrateTorLong": {}, + "widgetUrlError": "هذا ليس عنوان URL صالحًا.", + "@widgetUrlError": {}, + "indexedDbErrorTitle": "مشاكل الوضع الخاص", + "@indexedDbErrorTitle": {}, + "indexedDbErrorLong": "للأسف ، لم يتم تمكين تخزين الرسائل في الوضع الخاص افتراضيا.\nيرجى زيارة\n - حول:التكوين\n - تعيين dom.indexedDB.privateBrowsing.enabled إلى true\nخلاف ذلك ، لا يمكن تشغيل Extera.", + "@indexedDbErrorLong": {}, + "switchToAccount": "التبديل إلى الحساب {number}", + "@switchToAccount": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "addWidget": "إضافة اداة", + "@addWidget": {}, + "widgetEtherpad": "ملاحظة نصية", + "@widgetEtherpad": {}, + "youKickedAndBanned": "🙅 لقد ركلت وحظرت {user}", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youUnbannedUser": "قمت بإلغاء الحظر {user}", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "saveKeyManuallyDescription": "احفظ هذا المفتاح يدويا عن طريق تشغيل مربع حوار مشاركة النظام أو الحافظة.", + "@saveKeyManuallyDescription": {}, + "widgetJitsi": "اجتماعات جيتسي", + "@widgetJitsi": {}, + "youInvitedUser": "📩 قمت بدعوة {user}", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "storeInSecureStorageDescription": "قم بتخزين مفتاح الاسترداد في التخزين الآمن لهذا الجهاز.", + "@storeInSecureStorageDescription": {}, + "widgetName": "الاسم", + "@widgetName": {}, + "users": "المستخدمون", + "@users": {}, + "callingPermissions": "أذونات الاتصال", + "@callingPermissions": {}, + "callingAccount": "الاتصال بالحساب", + "@callingAccount": {}, + "callingAccountDetails": "يسمح لـ Extera باستخدام تطبيق android Dialer الأصلي.", + "@callingAccountDetails": {}, + "appearOnTopDetails": "يسمح للتطبيق بالظهور في الأعلى (ليست هناك حاجة إذا قمت بالفعل بإعداد Fluffychat كحساب اتصال)", + "@appearOnTopDetails": {}, + "numChats": "{number} الدردشات", + "@numChats": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "jump": "قفز", + "@jump": {}, + "report": "تقرير", + "@report": {}, + "noKeyForThisMessage": "يمكن أن يحدث هذا إذا تم إرسال الرسالة قبل تسجيل الدخول إلى حسابك على هذا الجهاز.\n\nمن الممكن أيضا أن يكون المرسل قد حظر جهازك أو حدث خطأ ما في الاتصال بالإنترنت.\n\nهل يمكنك قراءة الرسالة في جلسة أخرى؟ ثم يمكنك نقل الرسالة منه! انتقل إلى الإعدادات > الأجهزة وتأكد من أن أجهزتك قد تحققت من بعضها البعض. عندما تفتح الغرفة في المرة التالية وتكون كلتا الجلستين في المقدمة ، سيتم إرسال المفاتيح تلقائيا.\n\nألا تريد أن تفقد المفاتيح عند تسجيل الخروج أو تبديل الأجهزة؟ تأكد من تمكين النسخ الاحتياطي للدردشة في الإعدادات.", + "@noKeyForThisMessage": {}, + "allSpaces": "كل المساحات", + "@allSpaces": {}, + "doNotShowAgain": "لا تظهر مرة أخرى", + "@doNotShowAgain": {}, + "wasDirectChatDisplayName": "محادثة فارغة (كانت {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "disableEncryptionWarning": "لأسباب أمنية ، لا يمكنك تعطيل التشفير في المحادثة ، حيث تم تمكينه من قبل.", + "@disableEncryptionWarning": {}, + "reportErrorDescription": "😭 أوه لا. هناك خطأ ما. إذا كنت تريد، يمكنك الإبلاغ عن هذا الخطأ إلى المطورين.", + "@reportErrorDescription": {}, + "newSpaceDescription": "يسمح لك تطبيق المساحات بتوحيد دردشاتك وبناء مجتمعات خاصة أو عامة.", + "@newSpaceDescription": {}, + "sorryThatsNotPossible": "معذرة... هذا غير ممكن", + "@sorryThatsNotPossible": {}, + "openLinkInBrowser": "فتح الرابط في المتصفح", + "@openLinkInBrowser": {}, + "reopenChat": "إعادة فتح المحادثة", + "@reopenChat": {}, + "noBackupWarning": "تحذير! بدون تمكين النسخ الاحتياطي للدردشة ، ستفقد الوصول إلى رسائلك المشفرة. يوصى بشدة بتمكين النسخ الاحتياطي للدردشة أولاً قبل تسجيل الخروج.", + "@noBackupWarning": {}, + "noOtherDevicesFound": "لم يتم العثور على أجهزة أخرى", + "@noOtherDevicesFound": {}, + "fileIsTooBigForServer": "تعذر الإرسال! لا يدعم الخادم سوى المرفقات التي تصل إلى {max}.", + "@fileIsTooBigForServer": {}, + "jumpToLastReadMessage": "الانتقال إلى آخر رسالة مقروءة", + "@jumpToLastReadMessage": {}, + "readUpToHere": "اقرأ حتى هنا", + "@readUpToHere": {}, + "signInWithPassword": "سجل الدخول بكلمة السر", + "@signInWithPassword": {}, + "pleaseTryAgainLaterOrChooseDifferentServer": "رجاء حاول مجددا أو اختر خادما مختلفا.", + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "signInWith": "تسجيل الدخول باستخدام {provider}", + "@signInWith": { + "type": "String", + "placeholders": { + "provider": { + "type": "String" + } + } + }, + "importNow": "استيراد الآن", + "@importNow": {}, + "importEmojis": "استيراد الرموز التعبيرية", + "@importEmojis": {}, + "exportEmotePack": "تصدير حزمة الرموز التعبيرية بتنسيق zip", + "@exportEmotePack": {}, + "notAnImage": "ليس ملف صورة.", + "@notAnImage": {}, + "importFromZipFile": "الاستيراد من ملف .zip", + "@importFromZipFile": {}, + "replace": "استبدال", + "@replace": {}, + "sendTypingNotifications": "إرسال إشعارات الكتابة", + "@sendTypingNotifications": {}, + "createGroup": "إنشاء مجموعة", + "@createGroup": {}, + "messagesStyle": "الرسائل:", + "@messagesStyle": {}, + "shareInviteLink": "شارك رابط الدعوة", + "@shareInviteLink": {}, + "profileNotFound": "لا يمكن العثور على المستخدم على الخادم. ربما هناك مشكلة في الاتصال أو المستخدم غير موجود.", + "@profileNotFound": {}, + "setTheme": "تعيين السمة:", + "@setTheme": {}, + "setColorTheme": "تعيين لون السمة:", + "@setColorTheme": {}, + "inviteContactToGroupQuestion": "هل تريد دعوة {contact} إلى المحادثة \"{groupName}\"؟?", + "@inviteContactToGroupQuestion": {}, + "tryAgain": "أعد المحاولة", + "@tryAgain": {}, + "redactMessageDescription": "سيتم تنقيح الرسالة لجميع المشاركين في هذه المحادثة. هذا لا يمكن التراجع عنها.", + "@redactMessageDescription": {}, + "optionalRedactReason": "(اختياري) سبب تنقيح هذه الرسالة ...", + "@optionalRedactReason": {}, + "redactedBy": "منقح بواسطة {username}", + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "redactedByBecause": "تم حجبه بواسطة {username} بسبب: \"{reason}\"", + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "invite": "دعوة", + "@invite": {}, + "addChatDescription": "أضف وصفًا للدردشة...", + "@addChatDescription": {}, + "chatPermissions": "صلاحيات المحادثة", + "@chatPermissions": {}, + "chatDescription": "وصف المحادثة", + "@chatDescription": {}, + "chatDescriptionHasBeenChanged": "تغير وصف المجموعة", + "@chatDescriptionHasBeenChanged": {}, + "noChatDescriptionYet": "لم يتم إنشاء وصف للمحادثة حتى الآن.", + "@noChatDescriptionYet": {}, + "invalidServerName": "اسم الخادم غير متاح", + "@invalidServerName": {}, + "setChatDescription": "تعيين وصفًا للدردشة", + "@setChatDescription": {}, + "directChat": "محادثة مباشرة", + "@directChat": {}, + "inviteGroupChat": "📨 دعوة للمحادثة الجماعية", + "@inviteGroupChat": {}, + "invitePrivateChat": "📨 دعوة دردشة خاصة", + "@invitePrivateChat": {}, + "emoteKeyboardNoRecents": "التعبيرات المستخدمة مؤخرًا ستظهر هنا ...", + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "invalidInput": "مدخل غير صالح!", + "@invalidInput": {}, + "wrongPinEntered": "تم إدخال رمز خاطئ! حاول مرة أخرى خلال {seconds} ثانية...", + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "hasKnocked": "🚪 لقد طرق {user}", + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "pleaseEnterANumber": "الرجاء إدخال رقم أكبر من 0", + "@pleaseEnterANumber": {}, + "banUserDescription": "سيتم حظر المستخدم من المحادثة ولن يتمكن من الدخول إلى المحادثة مرة أخرى حتى يتم رفع الحظر عنه.", + "@banUserDescription": {}, + "removeDevicesDescription": "سيتم تسجيل خروجك من هذا الجهاز ولن تتمكن بعد ذلك من تلقي الرسائل.", + "@removeDevicesDescription": {}, + "unbanUserDescription": "سيتمكن المستخدم من الدخول إلى المحادثة مرة أخرى إذا حاول.", + "@unbanUserDescription": {}, + "pushNotificationsNotAvailable": "دفع الإخطارات غير متوفرة", + "@pushNotificationsNotAvailable": {}, + "makeAdminDescription": "بمجرد تعيين هذا المستخدم كمسؤول، قد لا تتمكن من التراجع عن هذا لأنه سيكون لديه نفس الأذونات التي تتمتع بها.", + "@makeAdminDescription": {}, + "archiveRoomDescription": "سيتم نقل المحادثة إلى الأرشيف. سيتمكن المستخدمون الآخرون من رؤية أنك غادرت المحادثة.", + "@archiveRoomDescription": {}, + "learnMore": "تعلم المزيد", + "@learnMore": {}, + "roomUpgradeDescription": "سيتم بعد ذلك إعادة إنشاء المحادثة باستخدام إصدار الغرفة الجديد. سيتم إخطار جميع المشاركين بأنهم بحاجة إلى التبديل إلى المحادثة الجديدة. يمكنك معرفة المزيد حول إصدارات الغرف على https://spec.matrix.org/latest/rooms/", + "@roomUpgradeDescription": {}, + "kickUserDescription": "يتم طرد المستخدم من المحادثة ولكن لا يتم حظره. في المحادثات العامة، يمكن للمستخدم الانضمام مرة أخرى في أي وقت.", + "@kickUserDescription": {}, + "createGroupAndInviteUsers": "إنشاء مجموعة ودعوة المستخدمين", + "@createGroupAndInviteUsers": {}, + "groupCanBeFoundViaSearch": "يمكن العثور على المجموعة عبر البحث", + "@groupCanBeFoundViaSearch": {}, + "noUsersFoundWithQuery": "لسوء الحظ، لا يمكن العثور على مستخدم لديه \"{query}\". يرجى التحقق مما إذا كنت قد ارتكبت خطأ كتابي.", + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "yourGlobalUserIdIs": "معرف المستخدم العمومي الخاص بك هو: ", + "@yourGlobalUserIdIs": {}, + "groupName": "أسم المجموعة", + "@groupName": {}, + "searchChatsRooms": "ابحث عن #الدردشات، @المستخدمين...", + "@searchChatsRooms": {}, + "startConversation": "بدء محادثة", + "@startConversation": {}, + "commandHint_sendraw": "إرسال جيسون الخام", + "@commandHint_sendraw": {}, + "wrongRecoveryKey": "عذرًا... لا يبدو أن هذا هو مفتاح الاسترداد الصحيح.", + "@wrongRecoveryKey": {}, + "blockListDescription": "يمكنك حظر المستخدمين الذين يزعجونك. لن تتمكن من تلقي أي رسائل أو دعوات للغرفة من المستخدمين الموجودين في قائمة الحظر الشخصية الخاصة بك.", + "@blockListDescription": {}, + "blockedUsers": "المستخدمون المحظورون", + "@blockedUsers": {}, + "block": "حظر", + "@block": {}, + "blockUsername": "تجاهل اسم المستخدم", + "@blockUsername": {}, + "databaseMigrationTitle": "تم تحسين قاعدة البيانات", + "@databaseMigrationTitle": {}, + "databaseMigrationBody": "انتظر من فضلك. قد يستغرق ذلك بعض الوقت.", + "@databaseMigrationBody": {}, + "thisDevice": "هذا الجهاز:", + "@thisDevice": {}, + "publicSpaces": "مساحة عامة", + "@publicSpaces": {}, + "passwordIsWrong": "كلمة السر للدخول خاطئة", + "@passwordIsWrong": {}, + "pleaseEnterYourCurrentPassword": "من فضلك أدخل كلمة السر الحالية", + "@pleaseEnterYourCurrentPassword": {}, + "publicLink": "رابط عام", + "@publicLink": {}, + "nothingFound": "لم نجد شيئاً.", + "@nothingFound": {}, + "decline": "رفض", + "@decline": {}, + "newPassword": "كلمة المرور الجديدة", + "@newPassword": {}, + "passwordsDoNotMatch": "كلمات المرور لا تتطابق", + "@passwordsDoNotMatch": {}, + "subspace": "مساحة فرعية", + "@subspace": {}, + "select": "اختر", + "@select": {}, + "pleaseChooseAStrongPassword": "الرجاء اختيار كلمة مرور قوية", + "@pleaseChooseAStrongPassword": {}, + "addChatOrSubSpace": "إضافة دردشة أو مساحة فرعية", + "@addChatOrSubSpace": {}, + "leaveEmptyToClearStatus": "اتركه فارغًا لمسح حالتك.", + "@leaveEmptyToClearStatus": {}, + "joinSpace": "انضم إلى المساحة", + "@joinSpace": {}, + "searchForUsers": "ابحث عن @users...", + "@searchForUsers": {}, + "databaseBuildErrorBody": "غير قادر على بناء قاعدة بيانات SQlite. يحاول التطبيق استخدام قاعدة بيانات قديمة في الوقت الحالي. الرجاء الإبلاغ عن هذا الخطأ للمطورين على {url}. رسالة الخطأ هي: {error}", + "@databaseBuildErrorBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "initAppError": "حدث خطأ بداخل التطبيق", + "@initAppError": {}, + "sessionLostBody": "جلستك مفقودة يرجى إبلاغ المطورين بهذا الخطأ في {url}. رسالة الخطأ هي: {error}", + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "restoreSessionBody": "يحاول التطبيق الآن استعادة جلستك من النسخة الاحتياطية. الرجاء الإبلاغ عن هذا الخطأ للمطورين على {url}. رسالة الخطأ هي:{error}", + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "completedKeyVerification": "أكمل {sender} عملية التحقق من المفتاح", + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "requestedKeyVerification": "طلب {sender} التحقق من المفتاح", + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "transparent": "شفّاف", + "@transparent": {}, + "youInvitedToBy": "📩 تمت دعوتك عبر الرابط إلى:\n{alias}", + "@youInvitedToBy": { + "placeholders": { + "alias": { + "type": "String" + } + } + }, + "formattedMessagesDescription": "عرض محتوى الرسالة الغنية مثل النص الغامق باستخدام الماركداون.", + "@formattedMessagesDescription": {}, + "verifyOtherUserDescription": "إذا قمت بالتحقق من مستخدم آخر، فيمكنك التأكد من أنك تعرف من تكتب إليه حقًا. 💪\n\nعند بدء عملية التحقق، سترى أنت والمستخدم الآخر نافذة منبثقة في التطبيق. هناك سترى بعد ذلك سلسلة من الرموز التعبيرية أو الأرقام التي يتعين عليك مقارنتها مع بعضها البعض.\n\nأفضل طريقة للقيام بذلك هي الالتقاء أو بدء مكالمة فيديو. 👭", + "@verifyOtherUserDescription": {}, + "verifyOtherDeviceDescription": "عند التحقق من جهاز آخر، يمكن لهذه الأجهزة تبادل المفاتيح، مما يزيد من أمانك بشكل عام. 💪 عند بدء عملية التحقق، ستظهر نافذة منبثقة في التطبيق على كلا الجهازين. هناك سترى بعد ذلك سلسلة من الرموز التعبيرية أو الأرقام التي يتعين عليك مقارنتها مع بعضها البعض. من الأفضل أن يكون كلا الجهازين في متناول يديك قبل بدء عملية التحقق. 🤳", + "@verifyOtherDeviceDescription": {}, + "formattedMessages": "رسائل منسقة", + "@formattedMessages": {}, + "sendReadReceipts": "إرسال بالقراءة", + "@sendReadReceipts": {}, + "verifyOtherDevice": "🔐 التحقق من الجهاز الآخر", + "@verifyOtherDevice": {}, + "forwardMessageTo": "هل تريد إعادة توجيه الرسالة إلى {roomName}؟", + "@forwardMessageTo": { + "type": "String", + "placeholders": { + "roomName": { + "type": "String" + } + } + }, + "sendTypingNotificationsDescription": "يستطيع المشاركون الآخرون في المحادثة رؤيتك عند كتابة رسالة جديدة.", + "@sendTypingNotificationsDescription": {}, + "sendReadReceiptsDescription": "يمكن للمشاركين الآخرين في المحادثة معرفة متى قرأت الرسالة.", + "@sendReadReceiptsDescription": {}, + "verifyOtherUser": "🔐 التحقق من المستخدم الآخر", + "@verifyOtherUser": {}, + "acceptedKeyVerification": "وافق {sender} على التحقق من المفتاح", + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "canceledKeyVerification": "قام {sender} بإلغاء التحقق من المفتاح", + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "isReadyForKeyVerification": "{sender} جاهز للتحقق من المفتاح", + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "startedKeyVerification": "بدأ {sender} عملية التحقق من المفتاح", + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "hidePresences": "إخفاء قائمة الحالة؟", + "@hidePresences": {}, + "incomingMessages": "الرسائل الواردة", + "@incomingMessages": {}, + "presenceStyle": "الحضور:", + "@presenceStyle": { + "type": "String", + "placeholders": {} + }, + "presencesToggle": "إظهار رسائل الحالة من المستخدمين الآخرين", + "@presencesToggle": { + "type": "String", + "placeholders": {} + }, + "stickers": "الملصقات", + "@stickers": {}, + "discover": "استكشف", + "@discover": {}, + "commandHint_ignore": "تجاهل معرف المصفوفة المعطى", + "@commandHint_ignore": {}, + "commandHint_unignore": "إلغاء تجاهل معرف المصفوفة المحدد", + "@commandHint_unignore": {}, + "unreadChatsInApp": "{appname}: {unread} الدردشات غير المقروءة", + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "noDatabaseEncryption": "تشفير قاعدة البيانات غير مدعوم على هذا النظام الأساسي", + "@noDatabaseEncryption": {}, + "appLockDescription": "قفل التطبيق عند عدم استخدامه بالرمز السري", + "@appLockDescription": {}, + "accessAndVisibility": "الوصول والرؤية", + "@accessAndVisibility": {}, + "calls": "المكالمات", + "@calls": {}, + "customEmojisAndStickers": "الرموز التعبيرية والملصقات المخصصة", + "@customEmojisAndStickers": {}, + "hideRedactedMessagesBody": "إذا قام شخص ما بتنقيح رسالة، فلن تكون هذه الرسالة مرئية في المحادثة بعد الآن.", + "@hideRedactedMessagesBody": {}, + "hideInvalidOrUnknownMessageFormats": "إخفاء تنسيقات الرسائل غير الصالحة أو غير المعروفة", + "@hideInvalidOrUnknownMessageFormats": {}, + "overview": "نظرة عامة", + "@overview": {}, + "notifyMeFor": "أعلمني بـ", + "@notifyMeFor": {}, + "passwordRecoverySettings": "إعدادات استعادة كلمة المرور", + "@passwordRecoverySettings": {}, + "globalChatId": "معرف المحادثة العامة", + "@globalChatId": {}, + "accessAndVisibilityDescription": "من المسموح له بالانضمام إلى هذه المحادثة وكيف يمكن اكتشاف المحادثة.", + "@accessAndVisibilityDescription": {}, + "customEmojisAndStickersBody": "قم بإضافة أو مشاركة الرموز التعبيرية أو الملصقات المخصصة التي يمكن استخدامها في أي دردشة.", + "@customEmojisAndStickersBody": {}, + "hideRedactedMessages": "إخفاء الرسائل المكررة", + "@hideRedactedMessages": {}, + "hideMemberChangesInPublicChats": "إخفاء تغييرات الأعضاء في الدردشات العامة", + "@hideMemberChangesInPublicChats": {}, + "hideMemberChangesInPublicChatsBody": "لا تظهر في المخطط الزمني للدردشة إذا انضم شخص ما إلى محادثة عامة أو غادرها لتحسين إمكانية القراءة.", + "@hideMemberChangesInPublicChatsBody": {}, + "usersMustKnock": "المستخدم يجب أن يطرق الباب", + "@usersMustKnock": {}, + "chatCanBeDiscoveredViaSearchOnServer": "يمكن اكتشاف الشات عن طريق البحث في {server}", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "noOneCanJoin": "لا أحد يستطيع الانضمام", + "@noOneCanJoin": {}, + "knocking": "طرق", + "@knocking": {}, + "userWouldLikeToChangeTheChat": "{user} يرغب في الانضمام إلى المحادثة.", + "@userWouldLikeToChangeTheChat": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "noPublicLinkHasBeenCreatedYet": "لم يتم بعد إنشاء أي رابط عام", + "@noPublicLinkHasBeenCreatedYet": {}, + "knock": "دق", + "@knock": {}, + "thereAreCountUsersBlocked": "يوجد حاليًا {count} من المستخدمين المحظورين.", + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "publicChatAddresses": "عناوين المحادثة العامة", + "@publicChatAddresses": {}, + "createNewAddress": "إنشاء عنوان جديد", + "@createNewAddress": {}, + "userRole": "دور المستخدم", + "@userRole": {}, + "minimumPowerLevel": "{level} هو الحد الأدنى من مستوى الطاقة.", + "@minimumPowerLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "String" + } + } + }, + "searchIn": "بحث في {chat}...", + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "files": "الملفات", + "@files": {}, + "restricted": "مقيد", + "@restricted": {}, + "knockRestricted": "قيود النقر", + "@knockRestricted": {}, + "searchMore": "ابحث أكثر...", + "@searchMore": {}, + "gallery": "المعرض", + "@gallery": {}, + "swipeRightToLeftToReply": "اسحب من اليمين إلى اليسار للرد", + "@swipeRightToLeftToReply": {}, + "alwaysUse24HourFormat": "false", + "@alwaysUse24HourFormat": { + "description": "Set to true to always display time of day in 24 hour format." + }, + "countChatsAndCountParticipants": "{chats} دردشات و {participants} مشاركين", + "@countChatsAndCountParticipants": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + }, + "participants": { + "type": "int" + } + } + }, + "noMoreChatsFound": "لم يتم العثور على دردشات...", + "@noMoreChatsFound": {}, + "joinedChats": "انضم إلى الدردشة", + "@joinedChats": {}, + "unread": "غير المقروءة", + "@unread": {}, + "space": "المساحة", + "@space": {}, + "spaces": "المساحات", + "@spaces": {}, + "markAsUnread": "تحديد كغير مقروء", + "@markAsUnread": {}, + "goToSpace": "انتقل إلى المساحة: {space}", + "@goToSpace": { + "type": "String", + "space": {} + }, + "userLevel": "{level} - مستخدم", + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "moderatorLevel": "{level} - مشرف", + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "adminLevel": "{level} - مدير", + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "changeGeneralChatSettings": "تغيير إعدادات الدردشة العامة", + "@changeGeneralChatSettings": {}, + "inviteOtherUsers": "دعوة مستخدمين آخرين إلى هذه الدردشة", + "@inviteOtherUsers": {}, + "changeTheChatPermissions": "تغيير أذونات الدردشة", + "@changeTheChatPermissions": {}, + "changeTheVisibilityOfChatHistory": "تغيير رؤية سجل الدردشة", + "@changeTheVisibilityOfChatHistory": {}, + "changeTheCanonicalRoomAlias": "تغيير عنوان الدردشة العامة الرئيسي", + "@changeTheCanonicalRoomAlias": {}, + "sendRoomNotifications": "إرسال إشعارات @room", + "@sendRoomNotifications": {}, + "changeTheDescriptionOfTheGroup": "تغيير وصف الدردشة", + "@changeTheDescriptionOfTheGroup": {}, + "invitedBy": "📩 تمت دعوته من قبل {user}", + "@invitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "chatPermissionsDescription": "‪حدد مستوى الصلاحية الضروري لإجراءات معينة في هذه الدردشة. عادة ما تمثل مستويات الصلاحية 0 و 50 و 100 المستخدمين والمشرفين ولكن أي تدرج ممكن.", + "@chatPermissionsDescription": {}, + "changelog": "سجل التغييرات", + "@changelog": {}, + "updateInstalled": "تم تثبيت🎉 تحديث {version}!", + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "sendCanceled": "تم إلغاء الإرسال", + "@sendCanceled": {}, + "noChatsFoundHere": "لم يتم العثور على دردشات هنا حتى الآن. ابدأ محادثة جديدة مع شخص ما باستخدام الزر أدناه. ⤵️", + "@noChatsFoundHere": {}, + "loginWithMatrixId": "تسجيل الدخول باستخدام معرف ماتريكس", + "@loginWithMatrixId": {}, + "discoverHomeservers": "اكتشف الخوادم المنزلية", + "@discoverHomeservers": {}, + "whatIsAHomeserver": "ما هو خادم المنزل ؟", + "@whatIsAHomeserver": {}, + "homeserverDescription": "يتم تخزين جميع بياناتك على خادم المنزل، تمامًا مثل مزود خدمة البريد الإلكتروني. يمكنك اختيار خادم البيت الذي تريد استخدامه، بينما لا يزال بإمكانك التواصل مع الجميع. اعرف المزيد على https://matrix.org.", + "@homeserverDescription": {}, + "doesNotSeemToBeAValidHomeserver": "لا يبدو أنه خادم منزلي متوافق. عنوان URL غير صحيح ؟", + "@doesNotSeemToBeAValidHomeserver": {}, + "calculatingFileSize": "جارٍ حساب حجم الملف...", + "@calculatingFileSize": {}, + "prepareSendingAttachment": "إعداد مرفق الإرسال...", + "@prepareSendingAttachment": {}, + "sendingAttachment": "جارٍ إرسال المرفق...", + "@sendingAttachment": {}, + "generatingVideoThumbnail": "جارٍ إنشاء صورة مصغرة للفيديو...", + "@generatingVideoThumbnail": {}, + "compressVideo": "جارٍ ضغط الفيديو...", + "@compressVideo": {}, + "sendingAttachmentCountOfCount": "جارٍ إرسال المرفق {index} من {length}...", + "@sendingAttachmentCountOfCount": { + "type": "integer", + "placeholders": { + "index": { + "type": "int" + }, + "length": { + "type": "int" + } + } + }, + "serverLimitReached": "تم الوصول إلى حد الخادم! انتظر {seconds} ثانية...", + "@serverLimitReached": { + "type": "integer", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "oneOfYourDevicesIsNotVerified": "لم يتم التحقق من أحد أجهزتك", + "@oneOfYourDevicesIsNotVerified": {}, + "noticeChatBackupDeviceVerification": "ملاحظة: عند توصيل جميع أجهزتك بنسخة احتياطية للدردشة، يتم التحقق منها تلقائيًا.", + "@noticeChatBackupDeviceVerification": {}, + "continueText": "استمرار", + "@continueText": {}, + "welcomeText": "مرحبًا، 👋 معك Extera. يمكنك تسجيل الدخول إلى أي خادم منزلي، وهو متوافق مع https://matrix.org. ثم دردش مع أي شخص. إنها شبكة مراسلة لا مركزية ضخمة!", + "@welcomeText": {}, + "blur": "الضبابية:", + "@blur": {}, + "setWallpaper": "تعيين الخلفية", + "@setWallpaper": {}, + "opacity": "التعتيم:", + "@opacity": {}, + "manageAccount": "‫إدارة الحساب‬", + "@manageAccount": {}, + "noContactInformationProvided": "لا يقدم السيرفر أي معلومات اتصال صحيحة", + "@noContactInformationProvided": {}, + "contactServerAdmin": "اتصل بمسؤول الخادم", + "@contactServerAdmin": {}, + "contactServerSecurity": "الاتصال بمسؤول أمان ااخادم", + "@contactServerSecurity": {}, + "supportPage": "صفحة الدعم", + "@supportPage": {}, + "serverInformation": "معلومات الخادم:", + "@serverInformation": {}, + "name": "الإسم", + "@name": {}, + "version": "اﻹصدار", + "@version": {}, + "website": "الموقع اﻹلكتروني", + "@website": {}, + "aboutHomeserver": "حول {homeserver}", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "compressBeforeSending": "ضغط قبل الإرسال", + "@compressBeforeSending": {}, + "sendUncompressed": "إرسال غير مضغوط", + "@sendUncompressed": {}, + "boldText": "خط غامق", + "@boldText": {}, + "italicText": "خط مائل", + "@italicText": {}, + "strikeThrough": "يتوسطه خط", + "@strikeThrough": {}, + "invalidUrl": "رابط غير صحيح", + "@invalidUrl": {}, + "addLink": "إضافة رابط", + "@addLink": {}, + "pleaseFillOut": "من فضلك قم بتعبئته", + "@pleaseFillOut": {}, + "unableToJoinChat": "يتعذر الانضمام إلى الدردشة. ربما يكون الطرف الآخر قد أغلق المحادثة بالفعل.", + "@unableToJoinChat": {}, + "sendImages": "إرسال {count} صورة", + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "compress": "ضغط", + "@compress": {}, + "previous": "السابق", + "@previous": {}, + "otherPartyNotLoggedIn": "لم يقم الطرف الآخر بتسجيل الدخول حالياً وبالتالي لا يمكنه تلقي الرسائل!", + "@otherPartyNotLoggedIn": {} +} diff --git a/assets/l10n/intl_be.arb b/assets/l10n/intl_be.arb new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/assets/l10n/intl_be.arb @@ -0,0 +1 @@ +{} diff --git a/assets/l10n/intl_bn.arb b/assets/l10n/intl_bn.arb new file mode 100644 index 0000000..18d854a --- /dev/null +++ b/assets/l10n/intl_bn.arb @@ -0,0 +1,2111 @@ +{ + "@@last_modified": "2021-08-14 12:41:10.154280", + "about": "সম্পর্কে", + "@about": { + "type": "String", + "placeholders": {} + }, + "accept": "স্বীকার করি", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "{username} আমন্ত্রণ গ্রহণ করেছে", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "অ্যাকাউন্ট", + "@account": { + "type": "String", + "placeholders": {} + }, + "@showPassword": { + "type": "String", + "placeholders": {} + }, + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "@connect": { + "type": "String", + "placeholders": {} + }, + "@jumpToLastReadMessage": {}, + "@allRooms": { + "type": "String", + "placeholders": {} + }, + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "@commandHint_cuddle": {}, + "@chats": { + "type": "String", + "placeholders": {} + }, + "@widgetVideo": {}, + "@dismiss": {}, + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "@admin": { + "type": "String", + "placeholders": {} + }, + "@reportErrorDescription": {}, + "@directChats": { + "type": "String", + "placeholders": {} + }, + "@setPermissionsLevel": { + "type": "String", + "placeholders": {} + }, + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "@addAccount": {}, + "@close": { + "type": "String", + "placeholders": {} + }, + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "@chatHasBeenAddedToThisSpace": {}, + "@reply": { + "type": "String", + "placeholders": {} + }, + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "@unsupportedAndroidVersion": {}, + "@device": { + "type": "String", + "placeholders": {} + }, + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "@widgetJitsi": {}, + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "@encryption": { + "type": "String", + "placeholders": {} + }, + "@messageType": {}, + "@indexedDbErrorLong": {}, + "@oneClientLoggedOut": {}, + "@toggleMuted": { + "type": "String", + "placeholders": {} + }, + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@title": { + "description": "Title for the application", + "type": "String", + "placeholders": {} + }, + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "@startFirstChat": {}, + "@callingAccount": {}, + "@requestPermission": { + "type": "String", + "placeholders": {} + }, + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@invited": { + "type": "String", + "placeholders": {} + }, + "@setColorTheme": {}, + "@nextAccount": {}, + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "@singlesignon": { + "type": "String", + "placeholders": {} + }, + "@warning": { + "type": "String", + "placeholders": {} + }, + "@password": { + "type": "String", + "placeholders": {} + }, + "@allSpaces": {}, + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "@user": {}, + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "@youAcceptedTheInvitation": {}, + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@banUserDescription": {}, + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "@widgetEtherpad": {}, + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "@remove": { + "type": "String", + "placeholders": {} + }, + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "@id": { + "type": "String", + "placeholders": {} + }, + "@removeDevicesDescription": {}, + "@changedTheChatDescriptionTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "description": { + "type": "String" + } + } + }, + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@separateChatTypes": { + "type": "String", + "placeholders": {} + }, + "@tryAgain": {}, + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "@blocked": { + "type": "String", + "placeholders": {} + }, + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@dateWithoutYear": { + "type": "String", + "placeholders": { + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "@removeDevice": { + "type": "String", + "placeholders": {} + }, + "@unbanUserDescription": {}, + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "@sendOnEnter": {}, + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@youRejectedTheInvitation": {}, + "@otherCallingPermissions": {}, + "@messagesStyle": {}, + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "@link": {}, + "@widgetUrlError": {}, + "@emailOrUsername": {}, + "@newSpaceDescription": {}, + "@chatDescription": {}, + "@callingAccountDetails": {}, + "@next": { + "type": "String", + "placeholders": {} + }, + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@dateWithYear": { + "type": "String", + "placeholders": { + "year": { + "type": "String" + }, + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "@enterSpace": {}, + "@encryptThisChat": {}, + "@fileName": { + "type": "String", + "placeholders": {} + }, + "@unavailable": { + "type": "String", + "placeholders": {} + }, + "@previousAccount": {}, + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "@emoteWarnNeedToPick": { + "type": "String", + "placeholders": {} + }, + "@reopenChat": {}, + "@pleaseEnterRecoveryKey": {}, + "@create": { + "type": "String", + "placeholders": {} + }, + "@toggleFavorite": { + "type": "String", + "placeholders": {} + }, + "@no": { + "type": "String", + "placeholders": {} + }, + "@alias": { + "type": "String", + "placeholders": {} + }, + "@widgetNameError": {}, + "@inoffensive": { + "type": "String", + "placeholders": {} + }, + "@unpin": { + "type": "String", + "placeholders": {} + }, + "@addToBundle": {}, + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "@addWidget": {}, + "@all": { + "type": "String", + "placeholders": {} + }, + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@noKeyForThisMessage": {}, + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "@reason": { + "type": "String", + "placeholders": {} + }, + "@commandHint_markasgroup": {}, + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "@hydrateTor": {}, + "@pushNotificationsNotAvailable": {}, + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "@storeInAppleKeyChain": {}, + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "@hydrate": {}, + "@invalidServerName": {}, + "@chatPermissions": {}, + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "@wipeChatBackup": { + "type": "String", + "placeholders": {} + }, + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "@sender": {}, + "@storeInAndroidKeystore": {}, + "@hideRedactedEvents": { + "type": "String", + "placeholders": {} + }, + "@online": { + "type": "String", + "placeholders": {} + }, + "@signInWithPassword": {}, + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "@offensive": { + "type": "String", + "placeholders": {} + }, + "@needPantalaimonWarning": { + "type": "String", + "placeholders": {} + }, + "@makeAdminDescription": {}, + "@edit": { + "type": "String", + "placeholders": {} + }, + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "@transferFromAnotherDevice": { + "type": "String", + "placeholders": {} + }, + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "@pushRules": { + "type": "String", + "placeholders": {} + }, + "@goToTheNewRoom": { + "type": "String", + "placeholders": {} + }, + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "@copy": { + "type": "String", + "placeholders": {} + }, + "@saveKeyManuallyDescription": {}, + "@none": { + "type": "String", + "placeholders": {} + }, + "@editBundlesForAccount": {}, + "@renderRichContent": { + "type": "String", + "placeholders": {} + }, + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "@whyIsThisMessageEncrypted": {}, + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@setChatDescription": {}, + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "@importFromZipFile": {}, + "@toggleUnread": { + "type": "String", + "placeholders": {} + }, + "@or": { + "type": "String", + "placeholders": {} + }, + "@dehydrateWarning": {}, + "@sendOriginal": { + "type": "String", + "placeholders": {} + }, + "@noOtherDevicesFound": {}, + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "@seenByUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@yourChatBackupHasBeenSetUp": {}, + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@submit": { + "type": "String", + "placeholders": {} + }, + "@videoCallsBetaWarning": {}, + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "@participant": { + "type": "String", + "placeholders": {} + }, + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "@yes": { + "type": "String", + "placeholders": {} + }, + "@containsDisplayName": { + "type": "String", + "placeholders": {} + }, + "@signInWith": { + "type": "String", + "placeholders": { + "provider": { + "type": "String" + } + } + }, + "@username": { + "type": "String", + "placeholders": {} + }, + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@fileIsTooBigForServer": {}, + "@homeserver": {}, + "@help": { + "type": "String", + "placeholders": {} + }, + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "@people": { + "type": "String", + "placeholders": {} + }, + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "@verified": { + "type": "String", + "placeholders": {} + }, + "@repeatPassword": {}, + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "@callingPermissions": {}, + "@delete": { + "type": "String", + "placeholders": {} + }, + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "@readUpToHere": {}, + "@start": {}, + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "@deviceId": { + "type": "String", + "placeholders": {} + }, + "@register": { + "type": "String", + "placeholders": {} + }, + "@unlockOldMessages": {}, + "@identity": { + "type": "String", + "placeholders": {} + }, + "@numChats": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "@ignore": { + "type": "String", + "placeholders": {} + }, + "@recording": { + "type": "String", + "placeholders": {} + }, + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@moderator": { + "type": "String", + "placeholders": {} + }, + "@optionalRedactReason": {}, + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "@dehydrate": {}, + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "@send": { + "type": "String", + "placeholders": {} + }, + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "@banned": { + "type": "String", + "placeholders": {} + }, + "@sendAsText": { + "type": "String" + }, + "@inviteForMe": { + "type": "String", + "placeholders": {} + }, + "@archiveRoomDescription": {}, + "@exportEmotePack": {}, + "@changedTheChatNameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "chatname": { + "type": "String" + } + } + }, + "@sendSticker": { + "type": "String", + "placeholders": {} + }, + "@switchToAccount": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "@commandInvalid": { + "type": "String" + }, + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "@removedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@newChat": { + "type": "String", + "placeholders": {} + }, + "@notifications": { + "type": "String", + "placeholders": {} + }, + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "@experimentalVideoCalls": {}, + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "@pleaseEnterRecoveryKeyDescription": {}, + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "@mention": { + "type": "String", + "placeholders": {} + }, + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "@inviteContactToGroupQuestion": {}, + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@chat": { + "type": "String", + "placeholders": {} + }, + "@group": { + "type": "String", + "placeholders": {} + }, + "@leave": { + "type": "String", + "placeholders": {} + }, + "@skip": { + "type": "String", + "placeholders": {} + }, + "@appearOnTopDetails": {}, + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "@enterRoom": {}, + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@allChats": { + "type": "String", + "placeholders": {} + }, + "@reportUser": {}, + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@confirmEventUnpin": {}, + "@badServerVersionsException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "@license": { + "type": "String", + "placeholders": {} + }, + "@addToSpace": {}, + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "@redactMessageDescription": {}, + "@rejoin": { + "type": "String", + "placeholders": {} + }, + "@recoveryKey": {}, + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "@forward": { + "type": "String", + "placeholders": {} + }, + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "@invalidInput": {}, + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "@dehydrateTorLong": {}, + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "@offline": { + "type": "String", + "placeholders": {} + }, + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "@doNotShowAgain": {}, + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@report": {}, + "@status": { + "type": "String", + "placeholders": {} + }, + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "@memberChanges": { + "type": "String", + "placeholders": {} + }, + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "@unverified": {}, + "@fluffychat": { + "type": "String", + "placeholders": {} + }, + "@howOffensiveIsThisContent": { + "type": "String", + "placeholders": {} + }, + "@serverRequiresEmail": {}, + "@hideUnimportantStateEvents": {}, + "@screenSharingTitle": {}, + "@widgetCustom": {}, + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@addToSpaceDescription": {}, + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "@addChatDescription": {}, + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "@cancel": { + "type": "String", + "placeholders": {} + }, + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@publish": {}, + "@openLinkInBrowser": {}, + "@clearArchive": {}, + "@appLock": { + "type": "String", + "placeholders": {} + }, + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "@messageInfo": {}, + "@disableEncryptionWarning": {}, + "@directChat": {}, + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "@sendTypingNotifications": {}, + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "@inviteGroupChat": {}, + "@appearOnTop": {}, + "@invitePrivateChat": {}, + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "@foregroundServiceRunning": {}, + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "@voiceCall": {}, + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "@importEmojis": {}, + "@confirm": { + "type": "String", + "placeholders": {} + }, + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "@noChatDescriptionYet": {}, + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "@removeFromBundle": {}, + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "@confirmMatrixId": {}, + "@learnMore": {}, + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "@you": { + "type": "String", + "placeholders": {} + }, + "@notAnImage": {}, + "@users": {}, + "@openGallery": {}, + "@chatDescriptionHasBeenChanged": {}, + "@search": { + "type": "String", + "placeholders": {} + }, + "@newGroup": {}, + "@bundleName": {}, + "@dehydrateTor": {}, + "@removeFromSpace": {}, + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "@roomUpgradeDescription": {}, + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "@scanQrCode": {}, + "@logout": { + "type": "String", + "placeholders": {} + }, + "@pleaseEnterANumber": {}, + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@profileNotFound": {}, + "@jump": {}, + "@groups": { + "type": "String", + "placeholders": {} + }, + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@sorryThatsNotPossible": {}, + "@videoWithSize": { + "type": "String", + "placeholders": { + "size": { + "type": "String" + } + } + }, + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@shareInviteLink": {}, + "@commandHint_markasdm": {}, + "@recoveryKeyLost": {}, + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@containsUserName": { + "type": "String", + "placeholders": {} + }, + "@messages": { + "type": "String", + "placeholders": {} + }, + "@login": { + "type": "String", + "placeholders": {} + }, + "@deviceKeys": {}, + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "@everythingReady": { + "type": "String", + "placeholders": {} + }, + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "@setCustomEmotes": { + "type": "String", + "placeholders": {} + }, + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "@notificationsEnabledForThisAccount": { + "type": "String", + "placeholders": {} + }, + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "@settings": { + "type": "String", + "placeholders": {} + }, + "@setTheme": {}, + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "@youJoinedTheChat": {}, + "@wallpaper": { + "type": "String", + "placeholders": {} + }, + "@openVideoCamera": { + "type": "String", + "placeholders": {} + }, + "@play": { + "type": "String", + "placeholders": { + "fileName": { + "type": "String" + } + } + }, + "@chatBackupDescription": { + "type": "String", + "placeholders": {} + }, + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "@security": { + "type": "String", + "placeholders": {} + }, + "@markAsRead": {}, + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "@widgetName": {}, + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@errorAddingWidget": {}, + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "@commandHint_hug": {}, + "@replace": {}, + "@reject": { + "type": "String", + "placeholders": {} + }, + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "@archive": { + "type": "String", + "placeholders": {} + }, + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "@pleaseEnter4Digits": { + "type": "String", + "placeholders": {} + }, + "@newSpace": {}, + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "@devices": { + "type": "String", + "placeholders": {} + }, + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "@emojis": {}, + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "@pleaseChoose": { + "type": "String", + "placeholders": {} + }, + "@share": { + "type": "String", + "placeholders": {} + }, + "@commandHint_googly": {}, + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "@createGroup": {}, + "@privacy": { + "type": "String", + "placeholders": {} + }, + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "@hydrateTorLong": {}, + "@time": {}, + "@enterYourHomeserver": { + "type": "String", + "placeholders": {} + }, + "@botMessages": { + "type": "String", + "placeholders": {} + }, + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "@custom": {}, + "@noBackupWarning": {}, + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "@verify": { + "type": "String", + "placeholders": {} + }, + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "@storeInSecureStorageDescription": {}, + "@openChat": {}, + "@kickUserDescription": {}, + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "@pin": { + "type": "String", + "placeholders": {} + }, + "@importNow": {}, + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "@setInvitationLink": { + "type": "String", + "placeholders": {} + }, + "@pinMessage": {}, + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "@invite": {}, + "@enableMultiAccounts": {}, + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "@emotePacks": { + "type": "String", + "placeholders": {} + }, + "@indexedDbErrorTitle": {}, + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@unsupportedAndroidVersionLong": {}, + "@storeSecurlyOnThisDevice": {}, + "@ok": { + "type": "String", + "placeholders": {} + }, + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "@screenSharingDetail": {}, + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "@unreadChats": { + "type": "String", + "placeholders": { + "unreadCount": { + "type": "int" + } + } + }, + "@pickImage": { + "type": "String", + "placeholders": {} + }, + "@placeCall": {}, + "@extremeOffensive": { + "type": "String", + "placeholders": {} + } +} diff --git a/assets/l10n/intl_bo.arb b/assets/l10n/intl_bo.arb new file mode 100644 index 0000000..f7483ab --- /dev/null +++ b/assets/l10n/intl_bo.arb @@ -0,0 +1,2106 @@ +{ + "@showPassword": { + "type": "String", + "placeholders": {} + }, + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "@connect": { + "type": "String", + "placeholders": {} + }, + "@jumpToLastReadMessage": {}, + "@allRooms": { + "type": "String", + "placeholders": {} + }, + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "@commandHint_cuddle": {}, + "@chats": { + "type": "String", + "placeholders": {} + }, + "@widgetVideo": {}, + "@dismiss": {}, + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "@admin": { + "type": "String", + "placeholders": {} + }, + "@reportErrorDescription": {}, + "@directChats": { + "type": "String", + "placeholders": {} + }, + "@setPermissionsLevel": { + "type": "String", + "placeholders": {} + }, + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "@addAccount": {}, + "@close": { + "type": "String", + "placeholders": {} + }, + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "@chatHasBeenAddedToThisSpace": {}, + "@reply": { + "type": "String", + "placeholders": {} + }, + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "@unsupportedAndroidVersion": {}, + "@device": { + "type": "String", + "placeholders": {} + }, + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "@widgetJitsi": {}, + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "@encryption": { + "type": "String", + "placeholders": {} + }, + "@messageType": {}, + "@indexedDbErrorLong": {}, + "@oneClientLoggedOut": {}, + "@toggleMuted": { + "type": "String", + "placeholders": {} + }, + "@unsupportedAndroidVersionLong": {}, + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@title": { + "description": "Title for the application", + "type": "String", + "placeholders": {} + }, + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "@startFirstChat": {}, + "@callingAccount": {}, + "@requestPermission": { + "type": "String", + "placeholders": {} + }, + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@invited": { + "type": "String", + "placeholders": {} + }, + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "@setColorTheme": {}, + "@nextAccount": {}, + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "@singlesignon": { + "type": "String", + "placeholders": {} + }, + "@warning": { + "type": "String", + "placeholders": {} + }, + "@password": { + "type": "String", + "placeholders": {} + }, + "@allSpaces": {}, + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "@user": {}, + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "@youAcceptedTheInvitation": {}, + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@banUserDescription": {}, + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "@widgetEtherpad": {}, + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "@remove": { + "type": "String", + "placeholders": {} + }, + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "@id": { + "type": "String", + "placeholders": {} + }, + "@removeDevicesDescription": {}, + "@changedTheChatDescriptionTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "description": { + "type": "String" + } + } + }, + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@separateChatTypes": { + "type": "String", + "placeholders": {} + }, + "@tryAgain": {}, + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "@blocked": { + "type": "String", + "placeholders": {} + }, + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@dateWithoutYear": { + "type": "String", + "placeholders": { + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "@removeDevice": { + "type": "String", + "placeholders": {} + }, + "@unbanUserDescription": {}, + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "@sendOnEnter": {}, + "@pickImage": { + "type": "String", + "placeholders": {} + }, + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@youRejectedTheInvitation": {}, + "@otherCallingPermissions": {}, + "@messagesStyle": {}, + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "@link": {}, + "@widgetUrlError": {}, + "@emailOrUsername": {}, + "@newSpaceDescription": {}, + "@chatDescription": {}, + "@callingAccountDetails": {}, + "@next": { + "type": "String", + "placeholders": {} + }, + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@dateWithYear": { + "type": "String", + "placeholders": { + "year": { + "type": "String" + }, + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "@enterSpace": {}, + "@encryptThisChat": {}, + "@fileName": { + "type": "String", + "placeholders": {} + }, + "@unavailable": { + "type": "String", + "placeholders": {} + }, + "@previousAccount": {}, + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "@emoteWarnNeedToPick": { + "type": "String", + "placeholders": {} + }, + "@reopenChat": {}, + "@pleaseEnterRecoveryKey": {}, + "@create": { + "type": "String", + "placeholders": {} + }, + "@toggleFavorite": { + "type": "String", + "placeholders": {} + }, + "@no": { + "type": "String", + "placeholders": {} + }, + "@alias": { + "type": "String", + "placeholders": {} + }, + "@widgetNameError": {}, + "@inoffensive": { + "type": "String", + "placeholders": {} + }, + "@unpin": { + "type": "String", + "placeholders": {} + }, + "@addToBundle": {}, + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "@addWidget": {}, + "@all": { + "type": "String", + "placeholders": {} + }, + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@noKeyForThisMessage": {}, + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "@reason": { + "type": "String", + "placeholders": {} + }, + "@commandHint_markasgroup": {}, + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "@hydrateTor": {}, + "@pushNotificationsNotAvailable": {}, + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "@storeInAppleKeyChain": {}, + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "@hydrate": {}, + "@invalidServerName": {}, + "@chatPermissions": {}, + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "@wipeChatBackup": { + "type": "String", + "placeholders": {} + }, + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "@sender": {}, + "@storeInAndroidKeystore": {}, + "@hideRedactedEvents": { + "type": "String", + "placeholders": {} + }, + "@online": { + "type": "String", + "placeholders": {} + }, + "@signInWithPassword": {}, + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "@offensive": { + "type": "String", + "placeholders": {} + }, + "@needPantalaimonWarning": { + "type": "String", + "placeholders": {} + }, + "@makeAdminDescription": {}, + "@edit": { + "type": "String", + "placeholders": {} + }, + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "@transferFromAnotherDevice": { + "type": "String", + "placeholders": {} + }, + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "@pushRules": { + "type": "String", + "placeholders": {} + }, + "@goToTheNewRoom": { + "type": "String", + "placeholders": {} + }, + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "@copy": { + "type": "String", + "placeholders": {} + }, + "@saveKeyManuallyDescription": {}, + "@none": { + "type": "String", + "placeholders": {} + }, + "@editBundlesForAccount": {}, + "@renderRichContent": { + "type": "String", + "placeholders": {} + }, + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "@whyIsThisMessageEncrypted": {}, + "@unreadChats": { + "type": "String", + "placeholders": { + "unreadCount": { + "type": "int" + } + } + }, + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@setChatDescription": {}, + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "@importFromZipFile": {}, + "@toggleUnread": { + "type": "String", + "placeholders": {} + }, + "@or": { + "type": "String", + "placeholders": {} + }, + "@dehydrateWarning": {}, + "@sendOriginal": { + "type": "String", + "placeholders": {} + }, + "@noOtherDevicesFound": {}, + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "@seenByUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@storeSecurlyOnThisDevice": {}, + "@yourChatBackupHasBeenSetUp": {}, + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@submit": { + "type": "String", + "placeholders": {} + }, + "@videoCallsBetaWarning": {}, + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "@participant": { + "type": "String", + "placeholders": {} + }, + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "@yes": { + "type": "String", + "placeholders": {} + }, + "@containsDisplayName": { + "type": "String", + "placeholders": {} + }, + "@signInWith": { + "type": "String", + "placeholders": { + "provider": { + "type": "String" + } + } + }, + "@username": { + "type": "String", + "placeholders": {} + }, + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@fileIsTooBigForServer": {}, + "@homeserver": {}, + "@help": { + "type": "String", + "placeholders": {} + }, + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "@people": { + "type": "String", + "placeholders": {} + }, + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "@verified": { + "type": "String", + "placeholders": {} + }, + "@repeatPassword": {}, + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "@callingPermissions": {}, + "@delete": { + "type": "String", + "placeholders": {} + }, + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "@readUpToHere": {}, + "@start": {}, + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "@deviceId": { + "type": "String", + "placeholders": {} + }, + "@register": { + "type": "String", + "placeholders": {} + }, + "@unlockOldMessages": {}, + "@identity": { + "type": "String", + "placeholders": {} + }, + "@numChats": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "@ignore": { + "type": "String", + "placeholders": {} + }, + "@recording": { + "type": "String", + "placeholders": {} + }, + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@moderator": { + "type": "String", + "placeholders": {} + }, + "@optionalRedactReason": {}, + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "@ok": { + "type": "String", + "placeholders": {} + }, + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "@dehydrate": {}, + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "@send": { + "type": "String", + "placeholders": {} + }, + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "@banned": { + "type": "String", + "placeholders": {} + }, + "@sendAsText": { + "type": "String" + }, + "@inviteForMe": { + "type": "String", + "placeholders": {} + }, + "@archiveRoomDescription": {}, + "@exportEmotePack": {}, + "@changedTheChatNameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "chatname": { + "type": "String" + } + } + }, + "@sendSticker": { + "type": "String", + "placeholders": {} + }, + "@account": { + "type": "String", + "placeholders": {} + }, + "@switchToAccount": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "@commandInvalid": { + "type": "String" + }, + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "@placeCall": {}, + "@removedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@newChat": { + "type": "String", + "placeholders": {} + }, + "@notifications": { + "type": "String", + "placeholders": {} + }, + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "@experimentalVideoCalls": {}, + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "@pleaseEnterRecoveryKeyDescription": {}, + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "@mention": { + "type": "String", + "placeholders": {} + }, + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "@inviteContactToGroupQuestion": {}, + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@chat": { + "type": "String", + "placeholders": {} + }, + "@group": { + "type": "String", + "placeholders": {} + }, + "@leave": { + "type": "String", + "placeholders": {} + }, + "@skip": { + "type": "String", + "placeholders": {} + }, + "@appearOnTopDetails": {}, + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "@enterRoom": {}, + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@allChats": { + "type": "String", + "placeholders": {} + }, + "@reportUser": {}, + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@confirmEventUnpin": {}, + "@badServerVersionsException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "@license": { + "type": "String", + "placeholders": {} + }, + "@addToSpace": {}, + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "@redactMessageDescription": {}, + "@rejoin": { + "type": "String", + "placeholders": {} + }, + "@recoveryKey": {}, + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "@forward": { + "type": "String", + "placeholders": {} + }, + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "@invalidInput": {}, + "@about": { + "type": "String", + "placeholders": {} + }, + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "@dehydrateTorLong": {}, + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "@offline": { + "type": "String", + "placeholders": {} + }, + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "@doNotShowAgain": {}, + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@report": {}, + "@status": { + "type": "String", + "placeholders": {} + }, + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "@memberChanges": { + "type": "String", + "placeholders": {} + }, + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "@unverified": {}, + "@fluffychat": { + "type": "String", + "placeholders": {} + }, + "@howOffensiveIsThisContent": { + "type": "String", + "placeholders": {} + }, + "@serverRequiresEmail": {}, + "@hideUnimportantStateEvents": {}, + "@screenSharingTitle": {}, + "@widgetCustom": {}, + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@addToSpaceDescription": {}, + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "@addChatDescription": {}, + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "@cancel": { + "type": "String", + "placeholders": {} + }, + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@publish": {}, + "@openLinkInBrowser": {}, + "@clearArchive": {}, + "@appLock": { + "type": "String", + "placeholders": {} + }, + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "@messageInfo": {}, + "@disableEncryptionWarning": {}, + "@directChat": {}, + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "@sendTypingNotifications": {}, + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "@inviteGroupChat": {}, + "@appearOnTop": {}, + "@invitePrivateChat": {}, + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "@foregroundServiceRunning": {}, + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "@voiceCall": {}, + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "@importEmojis": {}, + "@confirm": { + "type": "String", + "placeholders": {} + }, + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "@noChatDescriptionYet": {}, + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "@removeFromBundle": {}, + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "@confirmMatrixId": {}, + "@learnMore": {}, + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "@you": { + "type": "String", + "placeholders": {} + }, + "@notAnImage": {}, + "@users": {}, + "@openGallery": {}, + "@chatDescriptionHasBeenChanged": {}, + "@search": { + "type": "String", + "placeholders": {} + }, + "@newGroup": {}, + "@bundleName": {}, + "@dehydrateTor": {}, + "@removeFromSpace": {}, + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "@roomUpgradeDescription": {}, + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "@scanQrCode": {}, + "@logout": { + "type": "String", + "placeholders": {} + }, + "@pleaseEnterANumber": {}, + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@profileNotFound": {}, + "@jump": {}, + "@groups": { + "type": "String", + "placeholders": {} + }, + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@sorryThatsNotPossible": {}, + "@videoWithSize": { + "type": "String", + "placeholders": { + "size": { + "type": "String" + } + } + }, + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@shareInviteLink": {}, + "@commandHint_markasdm": {}, + "@recoveryKeyLost": {}, + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@containsUserName": { + "type": "String", + "placeholders": {} + }, + "@messages": { + "type": "String", + "placeholders": {} + }, + "@login": { + "type": "String", + "placeholders": {} + }, + "@deviceKeys": {}, + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "@everythingReady": { + "type": "String", + "placeholders": {} + }, + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "@setCustomEmotes": { + "type": "String", + "placeholders": {} + }, + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "@notificationsEnabledForThisAccount": { + "type": "String", + "placeholders": {} + }, + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "@settings": { + "type": "String", + "placeholders": {} + }, + "@setTheme": {}, + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "@youJoinedTheChat": {}, + "@wallpaper": { + "type": "String", + "placeholders": {} + }, + "@openVideoCamera": { + "type": "String", + "placeholders": {} + }, + "@play": { + "type": "String", + "placeholders": { + "fileName": { + "type": "String" + } + } + }, + "@chatBackupDescription": { + "type": "String", + "placeholders": {} + }, + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "@security": { + "type": "String", + "placeholders": {} + }, + "@markAsRead": {}, + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "@widgetName": {}, + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@errorAddingWidget": {}, + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "@commandHint_hug": {}, + "@replace": {}, + "@reject": { + "type": "String", + "placeholders": {} + }, + "@extremeOffensive": { + "type": "String", + "placeholders": {} + }, + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "@archive": { + "type": "String", + "placeholders": {} + }, + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "@pleaseEnter4Digits": { + "type": "String", + "placeholders": {} + }, + "@newSpace": {}, + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "@devices": { + "type": "String", + "placeholders": {} + }, + "@accept": { + "type": "String", + "placeholders": {} + }, + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "@emojis": {}, + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "@pleaseChoose": { + "type": "String", + "placeholders": {} + }, + "@share": { + "type": "String", + "placeholders": {} + }, + "@commandHint_googly": {}, + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "@createGroup": {}, + "@privacy": { + "type": "String", + "placeholders": {} + }, + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "@hydrateTorLong": {}, + "@time": {}, + "@enterYourHomeserver": { + "type": "String", + "placeholders": {} + }, + "@botMessages": { + "type": "String", + "placeholders": {} + }, + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "@custom": {}, + "@noBackupWarning": {}, + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "@verify": { + "type": "String", + "placeholders": {} + }, + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "@storeInSecureStorageDescription": {}, + "@openChat": {}, + "@kickUserDescription": {}, + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "@pin": { + "type": "String", + "placeholders": {} + }, + "@importNow": {}, + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "@setInvitationLink": { + "type": "String", + "placeholders": {} + }, + "@pinMessage": {}, + "@screenSharingDetail": {}, + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "@invite": {}, + "@enableMultiAccounts": {}, + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "@emotePacks": { + "type": "String", + "placeholders": {} + }, + "@indexedDbErrorTitle": {}, + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + } +} diff --git a/assets/l10n/intl_ca.arb b/assets/l10n/intl_ca.arb new file mode 100644 index 0000000..57a4061 --- /dev/null +++ b/assets/l10n/intl_ca.arb @@ -0,0 +1,3332 @@ +{ + "@@last_modified": "2021-08-14 12:41:10.145728", + "about": "Quant a", + "@about": { + "type": "String", + "placeholders": {} + }, + "accept": "Accepta", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 {username} ha acceptat la invitació", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "Compte", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐 {username} ha activat el xifratge d’extrem a extrem", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "admin": "Administració", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "àlies", + "@alias": { + "type": "String", + "placeholders": {} + }, + "allChats": "Tots els xats", + "@allChats": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "{senderName} ha respost a la trucada", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "Qualsevol pot unir-se", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "appLock": "Blocatge de l’aplicació", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "archive": "Arxiu", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "Es pot entrar al xat com a convidadi", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "N’esteu seguri?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "Per a poder donar accés a l’altra persona, introduïu la frase de seguretat o clau de recuperació.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "Voleu acceptar aquesta sol·licitud de verificació de: {username}?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "banFromChat": "Veta del xat", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "Vetadi", + "@banned": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username} ha vetat a {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "Bloca el dispositiu", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "botMessages": "Missatges del bot", + "@botMessages": { + "type": "String", + "placeholders": {} + }, + "cancel": "Cancel·la", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "cantOpenUri": "No es pot obrir l’URI {uri}", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "changeDeviceName": "Canvia el nom del dispositiu", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "{username} ha canviat la imatge del xat", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatDescriptionTo": "{username} ha canviat la descripció del xat a: '{description}'", + "@changedTheChatDescriptionTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "description": { + "type": "String" + } + } + }, + "changedTheChatNameTo": "{username} ha canviat el nom del xat a: '{chatname}'", + "@changedTheChatNameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "chatname": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username} ha canviat els permisos del xat", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} ha canviat les normes d’accés dels convidats", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} ha canviat les normes d’accés dels convidats a: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username} ha canviat la visibilitat de l’historial", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username} ha canviat la visibilitat de l’historial a: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username} ha canviat les normes d’unió", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} ha canviat les normes d’unió a: {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} ha canviat la seva imatge de perfil", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "{username} ha canviat l’àlies de la sala", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username} ha canviat l’enllaç per a convidar", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changePassword": "Canvia la contrasenya", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "Canvia el servidor", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "Canvia l’estil", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "Canvia el nom del grup", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "El xifratge s’ha corromput", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "chat": "Xat", + "@chat": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Detalls del xat", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chats": "Xats", + "@chats": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "Trieu una contrasenya forta", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "close": "Tanca", + "@close": { + "type": "String", + "placeholders": {} + }, + "commandHint_html": "Envia text en format HTML", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_leave": "Abandona aquesta sala", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_op": "Estableix el nivell d'autoritat d'uni usuàriï (per defecte: 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_plain": "Envia text sense format", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_send": "Envia text", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "compareEmojiMatch": "Compareu aquests emojis", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "Compareu aquests números", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "confirm": "Confirma", + "@confirm": { + "type": "String", + "placeholders": {} + }, + "connect": "Connecta", + "@connect": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "El contacte ha estat convidat al grup", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "containsDisplayName": "Conté l'àlies", + "@containsDisplayName": { + "type": "String", + "placeholders": {} + }, + "containsUserName": "Inclou nom d'usuàriï", + "@containsUserName": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "S’ha copiat al porta-retalls", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "Copia", + "@copy": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "No s'ha pogut desxifrar el missatge: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "countParticipants": "{count} participants", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "create": "Crea", + "@create": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "💬 {username} ha creat el xat", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "currentlyActive": "Actiu actualment", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "Fosc", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "dateWithoutYear": "{day}-{month}", + "@dateWithoutYear": { + "type": "String", + "placeholders": { + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "dateWithYear": "{day}-{month}-{year}", + "@dateWithYear": { + "type": "String", + "placeholders": { + "year": { + "type": "String" + }, + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "deactivateAccountWarning": "Es desactivarà el vostre compte d’usuàriï. És irreversible! Voleu fer-ho igualment?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "delete": "Suprimeix", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "Suprimeix el compte", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "Suprimeix el missatge", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "device": "Dispositiu", + "@device": { + "type": "String", + "placeholders": {} + }, + "deviceId": "Id. de dispositiu", + "@deviceId": { + "type": "String", + "placeholders": {} + }, + "devices": "Dispositius", + "@devices": { + "type": "String", + "placeholders": {} + }, + "directChats": "Xats directes", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "Ha canviat l'àlies", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "Baixa el fitxer", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "edit": "Edita", + "@edit": { + "type": "String", + "placeholders": {} + }, + "editDisplayname": "Edita l'àlies", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "L'emoticona ja existeix!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "Codi d'emoticona invàlid!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emotePacks": "Paquet d'emoticones de la sala", + "@emotePacks": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "Paràmetres de les emoticones", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "emoteShortcode": "Codi d'emoticona", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emoteWarnNeedToPick": "Has de seleccionar un codi d'emoticona i una imatge!", + "@emoteWarnNeedToPick": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "Xat buit", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "Activa el paquet d'emoticones global", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "No podreu desactivar el xifratge mai més. N’esteu segur?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "encrypted": "Xifrat", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "encryption": "Xifratge", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "El xifratge no s’ha activat", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName} ha finalitzat la trucada", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "enterAnEmailAddress": "Introduïu una adreça electrònica", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "enterYourHomeserver": "Introdueix el teu servidor", + "@enterYourHomeserver": { + "type": "String", + "placeholders": {} + }, + "fileName": "Nom del fitxer", + "@fileName": { + "type": "String", + "placeholders": {} + }, + "fluffychat": "FluffyChat", + "@fluffychat": { + "type": "String", + "placeholders": {} + }, + "forward": "Reenvia", + "@forward": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "Des de la unió", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "Des de la invitació", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "group": "Grup", + "@group": { + "type": "String", + "placeholders": {} + }, + "groupIsPublic": "El grup és públic", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "groupWith": "Grup amb {displayname}", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "guestsAreForbidden": "Els convidats no poden unir-se", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "Els convidats es poden unir", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{username} ha retirat la invitació de {targetName}", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "help": "Ajuda", + "@help": { + "type": "String", + "placeholders": {} + }, + "hideRedactedEvents": "Amaga els esdeveniments estripats", + "@hideRedactedEvents": { + "type": "String", + "placeholders": {} + }, + "hideUnknownEvents": "Amaga els esdeveniments desconeguts", + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "id": "Id.", + "@id": { + "type": "String", + "placeholders": {} + }, + "identity": "Identitat", + "@identity": { + "type": "String", + "placeholders": {} + }, + "ignoredUsers": "Usuaris ignorats", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "iHaveClickedOnLink": "He fet clic a l'enllaç", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "Frase de seguretat o clau de recuperació incorrecta", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "Convida contacte", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "Convida contacte a {groupName}", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "invited": "Convidat", + "@invited": { + "type": "String", + "placeholders": {} + }, + "invitedUser": "📩 {username} ha convidat a {targetName}", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "invitedUsersOnly": "Només usuàriïs convidadis", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "inviteForMe": "Invitació per a mi", + "@inviteForMe": { + "type": "String", + "placeholders": {} + }, + "inviteText": "{username} t'ha convidat a FluffyChat.\n1. Visita fluffychat.im i instaŀla l'app\n2. Registra't o inicia sessió\n3. Obre l'enllaç d'invitació:\n{link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "isTyping": "escrivint…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "👋 {username} s'ha unit al xat", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "joinRoom": "Uneix-te a la sala", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "kicked": "👞 {username} ha expulsat a {targetName}", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickedAndBanned": "🙅 {username} ha expulsat i vetat a {targetName}", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickFromChat": "Expulsa del xat", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "Actiu per última vegada: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "leave": "Abandona", + "@leave": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "Ha marxat del xat", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "license": "Llicència", + "@license": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "Clar", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "Carrega {count} participants més", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "loadingPleaseWait": "S’està carregant… Espereu.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "loadMore": "Carrega’n més…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "locationDisabledNotice": "S’han desactivat els serveis d’ubicació. Activeu-los per a compartir la vostra ubicació.", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "locationPermissionDeniedNotice": "S’ha rebutjat el permís d’ubicació. Atorgueu-lo per a poder compartir la vostra ubicació.", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "login": "Inicia la sessió", + "@login": { + "type": "String", + "placeholders": {} + }, + "logInTo": "Inicia sessió a {homeserver}", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "logout": "Finalitza la sessió", + "@logout": { + "type": "String", + "placeholders": {} + }, + "memberChanges": "Canvis de participants", + "@memberChanges": { + "type": "String", + "placeholders": {} + }, + "mention": "Menciona", + "@mention": { + "type": "String", + "placeholders": {} + }, + "moderator": "Moderador", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "muteChat": "Silencia el xat", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "needPantalaimonWarning": "Tingueu en compte que, ara per ara, us cal el Pantalaimon per a poder utilitzar el xifratge d’extrem a extrem.", + "@needPantalaimonWarning": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "💬 Missatge nou al FluffyChat", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "Nova sol·licitud de verificació!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "no": "No", + "@no": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "Sense connexió al servidor", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "No s’ha trobat cap emoticona. 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "Sembla que no teniu els Serveis de Google al telèfon. Això és una bona decisió respecte a la vostra privadesa! Per a rebre notificacions automàtiques del FluffyChat, us recomanem instaŀlar ntfy. Amb ntfy o qualsevol altre proveïdor de Unified Push, pots rebre notificacions de forma segura i lliure. Pots instaŀlar ntfy des de la PlayStore o des de F-Droid.", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "none": "Cap", + "@none": { + "type": "String", + "placeholders": {} + }, + "noPasswordRecoveryDescription": "Encara no heu afegit cap mètode per a poder recuperar la contrasenya.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "noPermission": "Sense permís", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "No s’ha trobat cap sala…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "notifications": "Notificacions", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "notificationsEnabledForThisAccount": "Notificacions activades per a aquest compte", + "@notificationsEnabledForThisAccount": { + "type": "String", + "placeholders": {} + }, + "numUsersTyping": "{count} usuàriïs escrivint…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "offline": "Fora de línia", + "@offline": { + "type": "String", + "placeholders": {} + }, + "ok": "D'acord", + "@ok": { + "type": "String", + "placeholders": {} + }, + "online": "En línia", + "@online": { + "type": "String", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "La còpia de seguretat de claus en línia està activada", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "Alguna cosa ha anat malament…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "Obre l'aplicació per llegir els missatges", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "openCamera": "Obre la càmera", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "or": "O", + "@or": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "contrasenya o clau de recuperació", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "password": "Contrasenya", + "@password": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "Contrasenya oblidada", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "La contrasenya ha canviat", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "passwordRecovery": "Recuperació de contrassenya", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "pickImage": "Selecciona una imatge", + "@pickImage": { + "type": "String", + "placeholders": {} + }, + "pin": "Fixa", + "@pin": { + "type": "String", + "placeholders": {} + }, + "play": "Reproduir {fileName}", + "@play": { + "type": "String", + "placeholders": { + "fileName": { + "type": "String" + } + } + }, + "pleaseChooseAPasscode": "Tria un codi d'accés", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "pleaseClickOnLink": "Fes clic a l'enllaç del correu i, després, segueix.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "pleaseEnter4Digits": "Introdueix 4 dígits o deixa-ho buit per desactivar el bloqueig.", + "@pleaseEnter4Digits": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPassword": "Introdueix la teva contrasenya", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "Introdueix el teu nom d'usuàriï", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "privacy": "Privadesa", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "Sales públiques", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "pushRules": "Regles push", + "@pushRules": { + "type": "String", + "placeholders": {} + }, + "recording": "Enregistrant", + "@recording": { + "type": "String", + "placeholders": {} + }, + "redactedAnEvent": "{username} ha estripat un esdeveniment", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "reject": "Rebutja", + "@reject": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "{username} ha rebutjat la invitació", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "rejoin": "Torna-t'hi a unir", + "@rejoin": { + "type": "String", + "placeholders": {} + }, + "remove": "Elimina", + "@remove": { + "type": "String", + "placeholders": {} + }, + "removeAllOtherDevices": "Elimina tots els altres dispositius", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "removedBy": "Eliminat per {username}", + "@removedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "removeDevice": "Elimina dispositiu", + "@removeDevice": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "Aixeca el veto", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "renderRichContent": "Mostra el contingut enriquit dels missatges", + "@renderRichContent": { + "type": "String", + "placeholders": {} + }, + "reply": "Respon", + "@reply": { + "type": "String", + "placeholders": {} + }, + "requestPermission": "Sol·licita permís", + "@requestPermission": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "La sala s'ha actualitzat", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "security": "Seguretat", + "@security": { + "type": "String", + "placeholders": {} + }, + "seenByUser": "Vist per {username}", + "@seenByUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "send": "Envia", + "@send": { + "type": "String", + "placeholders": {} + }, + "sendAMessage": "Envia un missatge", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "sendAsText": "Envia com a text", + "@sendAsText": { + "type": "String" + }, + "sendAudio": "Envia un àudio", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendFile": "Envia un fitxer", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendImage": "Envia una imatge", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendOriginal": "Envia l’original", + "@sendOriginal": { + "type": "String", + "placeholders": {} + }, + "sendSticker": "Envia adhesiu", + "@sendSticker": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "Envia un vídeo", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "sentAFile": "📁 {username} ha enviat un fitxer", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAnAudio": "🎤 {username} ha enviat un àudio", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAPicture": "🖼️ {username} ha enviat una imatge", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentASticker": "😊 {username} ha enviat un adhesiu", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "🎥 {username} ha enviat un vídeo", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentCallInformations": "{senderName} ha enviat informació de trucada", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "setInvitationLink": "Defineix l’enllaç per a convidar", + "@setInvitationLink": { + "type": "String", + "placeholders": {} + }, + "setPermissionsLevel": "Defineix el nivell de permisos", + "@setPermissionsLevel": { + "type": "String", + "placeholders": {} + }, + "setStatus": "Defineix l’estat", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "settings": "Paràmetres", + "@settings": { + "type": "String", + "placeholders": {} + }, + "share": "Comparteix", + "@share": { + "type": "String", + "placeholders": {} + }, + "sharedTheLocation": "{username} n’ha compartit la ubicació", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "singlesignon": "Autenticació única", + "@singlesignon": { + "type": "String", + "placeholders": {} + }, + "skip": "Omet", + "@skip": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "Codi font", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "startedACall": "{senderName} ha iniciat una trucada", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "statusExampleMessage": "Com us sentiu avui?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "submit": "Envia", + "@submit": { + "type": "String", + "placeholders": {} + }, + "systemTheme": "Sistema", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "No coincideixen", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "Coincideixen", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "title": "FluffyChat", + "@title": { + "description": "Title for the application", + "type": "String", + "placeholders": {} + }, + "toggleUnread": "Marca com a llegit/sense llegir", + "@toggleUnread": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "Massa sol·licituds. Torna-ho a provar més tard!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "tryToSendAgain": "Intenta tornar a enviar", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "unavailable": "No disponible", + "@unavailable": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username} ha aixecat el veto a {targetName}", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "unblockDevice": "Desbloqueja dispositiu", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "Dispositiu desconegut", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "unknownEncryptionAlgorithm": "L’algorisme de xifratge és desconegut", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unknownEvent": "Esdeveniment desconegut '{type}'", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "unmuteChat": "Deixa de silenciar el xat", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "unpin": "Deixa de fixar", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "unreadChats": "{unreadCount, plural, =1{1 xat no llegit} other{{unreadCount} xats no llegits}}", + "@unreadChats": { + "type": "String", + "placeholders": { + "unreadCount": { + "type": "int" + } + } + }, + "userAndOthersAreTyping": "{username} i {count} més estan escrivint…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "userAndUserAreTyping": "{username} i {username2} estan escrivint…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userIsTyping": "{username} està escrivint…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userLeftTheChat": "🚪 {username} ha marxat del xat", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "username": "Nom d’usuàriï", + "@username": { + "type": "String", + "placeholders": {} + }, + "userSentUnknownEvent": "{username} ha enviat un esdeveniment {type}", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "verify": "Verifica", + "@verify": { + "type": "String", + "placeholders": {} + }, + "verifyStart": "Inicia la verificació", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "T'has verificat correctament!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "verifyTitle": "Verificant un altre compte", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "videoCall": "Videotrucada", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "Visibilitat de l’historial del xat", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "Visible per a tots els participants", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "Visible per a tothom", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "Missatge de veu", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "S’està esperant que l’altre accepti l’emoji…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "S’està esperant que l’altre accepti els nombres…", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "wallpaper": "Fons:", + "@wallpaper": { + "type": "String", + "placeholders": {} + }, + "warning": "Atenció!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "weSentYouAnEmail": "Us hem enviat un missatge de correu electrònic", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "Qui pot unir-se a aquest grup", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "Amb aquestes adreces, si ho necessiteu, podeu recuperar la vostra contrasenya.", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "Escriviu un missatge…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "yes": "Sí", + "@yes": { + "type": "String", + "placeholders": {} + }, + "you": "Vós", + "@you": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "Ja no participeu en aquest xat", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "T'han vetat en aquest xat", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "yourPublicKey": "La vostra clau pública", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "all": "Tot", + "@all": { + "type": "String", + "placeholders": {} + }, + "addToSpace": "Afegeix a un espai", + "@addToSpace": {}, + "areYouSureYouWantToLogout": "Segur que voleu finalitzar la sessió?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "addEmail": "Afegeix una adreça electrònica", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "commandInvalid": "L’ordre no és vàlida", + "@commandInvalid": { + "type": "String" + }, + "fontSize": "Mida de la lletra", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "goToTheNewRoom": "Ves a la sala nova", + "@goToTheNewRoom": { + "type": "String", + "placeholders": {} + }, + "next": "Següent", + "@next": { + "type": "String", + "placeholders": {} + }, + "link": "Enllaç", + "@link": {}, + "people": "Gent", + "@people": { + "type": "String", + "placeholders": {} + }, + "redactMessage": "Estripa el missatge", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "sendOnEnter": "Envia en prémer Retorn", + "@sendOnEnter": {}, + "clearArchive": "Neteja l’arxiu", + "@clearArchive": {}, + "chatBackupDescription": "Els teus xats antics estan protegits amb una clau de recuperació. Assegureu-vos de no perdre-la.", + "@chatBackupDescription": { + "type": "String", + "placeholders": {} + }, + "chatHasBeenAddedToThisSpace": "El xat s’ha afegit a aquest espai", + "@chatHasBeenAddedToThisSpace": {}, + "autoplayImages": "Reprodueix automàticament enganxines i emoticones animades", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "chatBackup": "Còpia de seguretat del xat", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "blocked": "Blocat", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "everythingReady": "Tot és a punt!", + "@everythingReady": { + "type": "String", + "placeholders": {} + }, + "spaceName": "Nom de l’espai", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "search": "Cerca", + "@search": { + "type": "String", + "placeholders": {} + }, + "verified": "Verificat", + "@verified": { + "type": "String", + "placeholders": {} + }, + "newChat": "Xat nou", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "changeYourAvatar": "Canvia l’avatar", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "ignore": "Ignora", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "commandHint_react": "Envia una resposta com a reacció", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "defaultPermissionLevel": "Nivell de permisos per defecte per nous membres", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "extremeOffensive": "Extremadament ofensiu", + "@extremeOffensive": { + "type": "String", + "placeholders": {} + }, + "yourChatBackupHasBeenSetUp": "S’ha configurat la còpia de seguretat del xat.", + "@yourChatBackupHasBeenSetUp": {}, + "contentHasBeenReported": "El contingut s’ha denunciat als administradors del servidor", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "Activa el xifratge", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "addAccount": "Afegeix un compte", + "@addAccount": {}, + "noEncryptionForPublicRooms": "Només podreu activar el xifratge quan la sala ja no sigui accessible públicament.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "Versió de la sala", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "sendMessages": "Envia missatges", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "saveFile": "Desa el fitxer", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "Seguiu les instruccions al lloc web i toqueu «Següent».", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "Denuncia el missatge", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "setAsCanonicalAlias": "Defineix com a àlies principal", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "status": "Estat", + "@status": { + "type": "String", + "placeholders": {} + }, + "toggleFavorite": "Commuta l’estat «preferit»", + "@toggleFavorite": { + "type": "String", + "placeholders": {} + }, + "toggleMuted": "Commuta l’estat «silenci»", + "@toggleMuted": { + "type": "String", + "placeholders": {} + }, + "transferFromAnotherDevice": "Transfereix des d’un altre dispositiu", + "@transferFromAnotherDevice": { + "type": "String", + "placeholders": {} + }, + "setCustomEmotes": "Defineix emoticones personalitzades", + "@setCustomEmotes": { + "type": "String", + "placeholders": {} + }, + "whoCanPerformWhichAction": "Qui pot efectuar quina acció", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "Per què voleu denunciar això?", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "wipeChatBackup": "Voleu suprimir la còpia de seguretat dels xats per a crear una clau de recuperació nova?", + "@wipeChatBackup": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "S’està esperant que l’altre accepti la sol·licitud…", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "unverified": "No verificat", + "@unverified": {}, + "commandHint_me": "Descriviu-vos", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "commandMissing": "{command} no és una ordre.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "configureChat": "Configura el xat", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "Copia al porta-retalls", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "createNewSpace": "Espai nou", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "errorObtainingLocation": "S’ha produït un error en obtenir la ubicació: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "groups": "Grups", + "@groups": { + "type": "String", + "placeholders": {} + }, + "messages": "Missatges", + "@messages": { + "type": "String", + "placeholders": {} + }, + "showPassword": "Mostra la contrasenya", + "@showPassword": { + "type": "String", + "placeholders": {} + }, + "spaceIsPublic": "L’espai és públic", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "scanQrCode": "Escaneja un codi QR", + "@scanQrCode": {}, + "obtainingLocation": "S’està obtenint la ubicació…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "shareLocation": "Comparteix la ubicació", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWait": "S’està sincronitzant… Espereu.", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "reason": "Raó", + "@reason": { + "type": "String", + "placeholders": {} + }, + "changedTheDisplaynameTo": "{username} ha canviat el seu àlies a: '{displayname}'", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "howOffensiveIsThisContent": "Com d’ofensiu és aquest contingut?", + "@howOffensiveIsThisContent": { + "type": "String", + "placeholders": {} + }, + "commandHint_clearcache": "Neteja la memòria cau", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_join": "Uneix-te a la sala", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_kick": "Expulsa uni usuàriï d'aquesta sala", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_myroomavatar": "Establiu la imatge per a aquesta sala (per mxc-uri)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_dm": "Inicia un xat directe\nUsa --no-encryption per desactivar l'encriptatge", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "commandHint_invite": "Convida uni usuàriï a aquesta sala", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "commandHint_ban": "Veta uni usuàriï d'aquesta sala", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_create": "Crea un xat de grup buit\nUsa --no-encryption per desactivar l'encriptatge", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "commandHint_discardsession": "Descarta la sessió", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "repeatPassword": "Repetiu la contrasenya", + "@repeatPassword": {}, + "commandHint_myroomnick": "Estableix el teu àlies per a aquesta sala", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "editBlockedServers": "Edita els servidors bloquejats", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "badServerLoginTypesException": "El servidor admet els inicis de sessió:\n{serverVersions}\nPerò l'aplicació només admet:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "hugContent": "{senderName} t'abraça", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "jumpToLastReadMessage": "Salta a l'últim missatge llegit", + "@jumpToLastReadMessage": {}, + "allRooms": "Tots els xats de grup", + "@allRooms": { + "type": "String", + "placeholders": {} + }, + "commandHint_cuddle": "Envia una carícia", + "@commandHint_cuddle": {}, + "widgetVideo": "Vídeo", + "@widgetVideo": {}, + "dismiss": "Ignora-ho", + "@dismiss": {}, + "reportErrorDescription": "😭 Oh no. Hi ha hagut algun error. Si vols, pots informar d'aquest bug a l'equip de desenvolupament.", + "@reportErrorDescription": {}, + "removeYourAvatar": "Esborra el teu avatar", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "unsupportedAndroidVersion": "Aquesta versió d'Android és incompatible", + "@unsupportedAndroidVersion": {}, + "widgetJitsi": "Jitsi Meet", + "@widgetJitsi": {}, + "messageType": "Tipus de missatge", + "@messageType": {}, + "indexedDbErrorLong": "L'emmagatzematge de missatges no està disponible per defecte en el mode privat.\nVisita\n - about:config\n - posa a true l'opció dom.indexedDB.privateBrowsing.enabled\nSi no ho fas, no podràs fer servir FluffyChat en mode privat.", + "@indexedDbErrorLong": {}, + "oneClientLoggedOut": "Una de les teves aplicacions ha tancat la sessió", + "@oneClientLoggedOut": {}, + "startFirstChat": "Comença el teu primer xat", + "@startFirstChat": {}, + "callingAccount": "Compte de la trucada", + "@callingAccount": {}, + "setColorTheme": "Tria el color del tema:", + "@setColorTheme": {}, + "nextAccount": "Compte següent", + "@nextAccount": {}, + "allSpaces": "Tots els espais", + "@allSpaces": {}, + "supposedMxid": "Això hauria de ser {mxid}", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "user": "Usuàrïi", + "@user": {}, + "youAcceptedTheInvitation": "👍 Has acceptat la invitació", + "@youAcceptedTheInvitation": {}, + "noMatrixServer": "{server1} no és un servidor de matrix, vols fer servir {server2} ?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "youInvitedBy": "📩 {user} t'ha convidat", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "banUserDescription": "Es vetarà li usuàriï al xat i no podrà tornar-hi a entrar fins que se li aixequi el veto.", + "@banUserDescription": {}, + "widgetEtherpad": "Nota de text", + "@widgetEtherpad": {}, + "removeDevicesDescription": "Tancaràs la sessió d'aquest dispositiu i no hi podràs rebre més missatges.", + "@removeDevicesDescription": {}, + "separateChatTypes": "Separa xats directes i grups", + "@separateChatTypes": { + "type": "String", + "placeholders": {} + }, + "tryAgain": "Torna-ho a provar", + "@tryAgain": {}, + "youKickedAndBanned": "🙅 Has expulsat i vetat a {user}", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "unbanUserDescription": "L'usuàrïi ja pot tornar a entrar al xat.", + "@unbanUserDescription": {}, + "youRejectedTheInvitation": "Has rebutjat la invitació", + "@youRejectedTheInvitation": {}, + "otherCallingPermissions": "Micròfon, càmera i altres permisos del FluffyChat", + "@otherCallingPermissions": {}, + "messagesStyle": "Missatges:", + "@messagesStyle": {}, + "widgetUrlError": "La URL no és vàlida.", + "@widgetUrlError": {}, + "emailOrUsername": "Email o nom d'usuàrïi", + "@emailOrUsername": {}, + "newSpaceDescription": "Els espais et permeten consolidar ls por", + "@newSpaceDescription": {}, + "chatDescription": "Descripció del xat", + "@chatDescription": {}, + "callingAccountDetails": "Permet al FluffyChat de fer servir l'app de trucades nativa de l'Android.", + "@callingAccountDetails": {}, + "editRoomAliases": "Canvia els àlies de la sala", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "enterSpace": "Obre l'espai", + "@enterSpace": {}, + "encryptThisChat": "Xifra aquest xat", + "@encryptThisChat": {}, + "previousAccount": "Compte anterior", + "@previousAccount": {}, + "reopenChat": "Reobre el xat", + "@reopenChat": {}, + "pleaseEnterRecoveryKey": "Introdueix la teva clau de recuperació:", + "@pleaseEnterRecoveryKey": {}, + "widgetNameError": "Posa el nom públic.", + "@widgetNameError": {}, + "inoffensive": "Inofensiu", + "@inoffensive": { + "type": "String", + "placeholders": {} + }, + "addToBundle": "Afegeix al pquet", + "@addToBundle": {}, + "addWidget": "Afegeix un giny", + "@addWidget": {}, + "countFiles": "{count} arxius", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "noKeyForThisMessage": "Això pot passar si el missatge es va enviar abans que haguessis iniciat sessió al teu compte des d'aquest dispositiu.\n\nTambé pot ser que l'emissor hagi bloquejat el teu dispositiu o que la connexió a internet anés malament.\n\nQue pots llegir el missatge des d'una altra sessió? Si és així, llavors pots transferir-lo! Ves a Paràmetres → Dispositius i assegura't que els teus dispositius s'ha verificat mútuament. Quan obris la sala la propera vegada i totes dues sessions estiguin executant-se, en primer pla, llavors les claus es trasnsmetran automàticament.\n\nVols evitar perdre les claus en tancar la sessió o en canviar de dispositiu? Llavors assegura't que has activat la còpia de seguretat del xat als paràmetres.", + "@noKeyForThisMessage": {}, + "commandHint_markasgroup": "Marca com un grup", + "@commandHint_markasgroup": {}, + "hydrateTor": "Usuàrïis de Tor: Importa una sessió anterior", + "@hydrateTor": {}, + "pushNotificationsNotAvailable": "Les notificacions push no estan disponibles", + "@pushNotificationsNotAvailable": {}, + "storeInAppleKeyChain": "Desa en la Apple KeyChain", + "@storeInAppleKeyChain": {}, + "replaceRoomWithNewerVersion": "Substitueix la sala amb la versió més recent", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "hydrate": "Restaura un arxiu de recuperació", + "@hydrate": {}, + "invalidServerName": "El nom del servidor és invàlid", + "@invalidServerName": {}, + "chatPermissions": "Permisos del xat", + "@chatPermissions": {}, + "sender": "Remitent", + "@sender": {}, + "storeInAndroidKeystore": "Desa en la Android KeyStore", + "@storeInAndroidKeystore": {}, + "signInWithPassword": "Inicia sessió amb contrasenya", + "@signInWithPassword": {}, + "offensive": "Ofensiu", + "@offensive": { + "type": "String", + "placeholders": {} + }, + "makeAdminDescription": "Un cop hagis fet admin aquesta persona ja no podràs desfer-ho, ja que llavors tindrà els mateixos permisos que tu.", + "@makeAdminDescription": {}, + "saveKeyManuallyDescription": "Per desar aquesta clau manualment, pica l'eina de compartir o copia-la al porta-retalls.", + "@saveKeyManuallyDescription": {}, + "editBundlesForAccount": "Edita paquets per aquest compte", + "@editBundlesForAccount": {}, + "whyIsThisMessageEncrypted": "Per què no es pot llegir aquest missatge?", + "@whyIsThisMessageEncrypted": {}, + "setChatDescription": "Posa una descripció de xat", + "@setChatDescription": {}, + "importFromZipFile": "Importa des d'un arxiu zip", + "@importFromZipFile": {}, + "dehydrateWarning": "Aquesta acció és irreversible. Assegura't que deses l'arxiu de recuperació en un lloc segur.", + "@dehydrateWarning": {}, + "noOtherDevicesFound": "No s'han trobat més dispositius", + "@noOtherDevicesFound": {}, + "redactedBy": "Estripat per {username}", + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "videoCallsBetaWarning": "Tingues en compte que les trucades de vídeo estan encara en beta. Pot ser que no funcioni bé o que falli en alguna plataforma.", + "@videoCallsBetaWarning": {}, + "participant": "Participant", + "@participant": { + "type": "String", + "placeholders": {} + }, + "signInWith": "Inicia sessió amb {provider}", + "@signInWith": { + "type": "String", + "placeholders": { + "provider": { + "type": "String" + } + } + }, + "fileIsTooBigForServer": "No s'ha pogut enviar! El servidor només accepta adjunts de fins a {max}.", + "@fileIsTooBigForServer": {}, + "homeserver": "Servidor", + "@homeserver": {}, + "callingPermissions": "Permisos de trucada", + "@callingPermissions": {}, + "readUpToHere": "Llegit fins aquí", + "@readUpToHere": {}, + "start": "Comença", + "@start": {}, + "register": "Registra't", + "@register": { + "type": "String", + "placeholders": {} + }, + "unlockOldMessages": "Desbloqueja els missatges antics", + "@unlockOldMessages": {}, + "numChats": "{number} xats", + "@numChats": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "optionalRedactReason": "(Opcional) El motiu per estripar el missatge...", + "@optionalRedactReason": {}, + "dehydrate": "Exporta la sessió i neteja el dispositiu", + "@dehydrate": {}, + "archiveRoomDescription": "Aquest xat serà arxivat. Els altres contactes del grup ho veuran com si haguessis abandonat el xat.", + "@archiveRoomDescription": {}, + "exportEmotePack": "Exporta com un pack Emote en .zip", + "@exportEmotePack": {}, + "switchToAccount": "Canvia al compte {number}", + "@switchToAccount": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "experimentalVideoCalls": "Trucades de vídeo experimentals", + "@experimentalVideoCalls": {}, + "pleaseEnterRecoveryKeyDescription": "Per desbloquejar els missatges antics, introdueix la clau de recuperació que vas generar en una sessió anterior. La clau de recuperació NO és la teva contrasenya.", + "@pleaseEnterRecoveryKeyDescription": {}, + "openInMaps": "Obre als mapes", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroupQuestion": "Vols convidar {contact} al xat \"{groupName}\"?", + "@inviteContactToGroupQuestion": {}, + "redactedByBecause": "Estripat per {username} per: \"{reason}\"", + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "youHaveWithdrawnTheInvitationFor": "Has rebutjat la invitació de {user}", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "appearOnTopDetails": "Permet a l'app que aparegui sobre d'altres apps. No cal si ja has afegit FluffyChat com a compte de trucades", + "@appearOnTopDetails": {}, + "enterRoom": "Entra a la sala", + "@enterRoom": {}, + "reportUser": "Denuncia l'usuàrïi", + "@reportUser": {}, + "confirmEventUnpin": "Vols desfixar l'esdeveniment permanentment?", + "@confirmEventUnpin": {}, + "badServerVersionsException": "Aquest servidor suporta aquestes versions de Matrix:\n{serverVersions}\nPerò aquesta aplicación només és compatible amb {supportedVersions}", + "@badServerVersionsException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "youInvitedUser": "📩 Has convidat a {user}", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "fileHasBeenSavedAt": "S'ha desat l'arxiu a {path}", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "redactMessageDescription": "S'estriparà el missatge per a totser d'aquesta conversa. Aquesta acció és irreversible.", + "@redactMessageDescription": {}, + "recoveryKey": "Clau de recuperació", + "@recoveryKey": {}, + "invalidInput": "L'entrada no és vàlida!", + "@invalidInput": {}, + "dehydrateTorLong": "Per a lis usuàrïis de Tor, es recomana exportar la sessió abans de tancar la finestra.", + "@dehydrateTorLong": {}, + "doNotShowAgain": "No ho tornis a mostrar", + "@doNotShowAgain": {}, + "report": "informa", + "@report": {}, + "serverRequiresEmail": "Aquest servidor necessita validar la teva adreça per registrar-t'hi.", + "@serverRequiresEmail": {}, + "hideUnimportantStateEvents": "Amaga canvis d'estat poc importants", + "@hideUnimportantStateEvents": {}, + "screenSharingTitle": "compartició de pantalla", + "@screenSharingTitle": {}, + "widgetCustom": "Personalització", + "@widgetCustom": {}, + "addToSpaceDescription": "Tria un espai per afegir-hi el xat.", + "@addToSpaceDescription": {}, + "googlyEyesContent": "{senderName} t'ha enviat un parell d'ulls", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "youBannedUser": "Has vetat a {user}", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "addChatDescription": "Afegeix una descripció al xat...", + "@addChatDescription": {}, + "editRoomAvatar": "Canvia la imatge de la sala", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "hasKnocked": "🚪 {user} pica a la porta", + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "publish": "Publica", + "@publish": {}, + "openLinkInBrowser": "Obre l'enllaç en un navegador", + "@openLinkInBrowser": {}, + "messageInfo": "Informació del missatge", + "@messageInfo": {}, + "disableEncryptionWarning": "Per motius de seguretat, un cop activat, no es pot desactivar el xifratge.", + "@disableEncryptionWarning": {}, + "directChat": "Xat directe", + "@directChat": {}, + "wrongPinEntered": "Pin incorrecte! Torna-ho a provar en {seconds} segons...", + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "sendTypingNotifications": "Envia notificacions d'escriptura", + "@sendTypingNotifications": {}, + "inviteGroupChat": "📨 Convida al grup", + "@inviteGroupChat": {}, + "appearOnTop": "Mostra per sobre", + "@appearOnTop": {}, + "invitePrivateChat": "📨 Convida a un xat privat", + "@invitePrivateChat": {}, + "foregroundServiceRunning": "Aquesta notificació apareix quan el servei de primer pla està corrent.", + "@foregroundServiceRunning": {}, + "voiceCall": "Videotrucada", + "@voiceCall": {}, + "commandHint_unban": "Aixeca el veto a aquesti usuàriï per aquesta sala", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "importEmojis": "Importa emojis", + "@importEmojis": {}, + "wasDirectChatDisplayName": "Xat buit ( era {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "noChatDescriptionYet": "No s'ha afegit una descripció de xat.", + "@noChatDescriptionYet": {}, + "removeFromBundle": "Esborra del paquet", + "@removeFromBundle": {}, + "confirmMatrixId": "Confirma la teva ID de Matrix per poder esborrar el compte.", + "@confirmMatrixId": {}, + "learnMore": "Llegeix-ne més", + "@learnMore": {}, + "notAnImage": "No és un arxiu d'image.", + "@notAnImage": {}, + "users": "Usuàrïis", + "@users": {}, + "openGallery": "Obre la galeria", + "@openGallery": {}, + "chatDescriptionHasBeenChanged": "Ha canviat la descripció del xat", + "@chatDescriptionHasBeenChanged": {}, + "newGroup": "Grup nou", + "@newGroup": {}, + "bundleName": "Nom del paquet", + "@bundleName": {}, + "dehydrateTor": "Usuàrïis de Tor: Exporta la sessió", + "@dehydrateTor": {}, + "removeFromSpace": "Esborra de l'espai", + "@removeFromSpace": {}, + "roomUpgradeDescription": "El xat serà recreat amb una versió de sala nova. Totis lis participants seran notificadis que han de canviar al nou xat. Pots llegir més sobre les versions de sala a https://spec.matrix.org/latest/rooms/", + "@roomUpgradeDescription": {}, + "pleaseEnterANumber": "Introdueix un número major que 0", + "@pleaseEnterANumber": {}, + "youKicked": "👞 Has expulsat a {user}", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "profileNotFound": "No s'ha trobat el compte en aquest servidor. Pot ser un error de connexió, o que realment no existeixi.", + "@profileNotFound": {}, + "jump": "Salta", + "@jump": {}, + "reactedWith": "{sender} ha reaccionat amb {reaction}", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "sorryThatsNotPossible": "Aquesta acció no és possible", + "@sorryThatsNotPossible": {}, + "videoWithSize": "Vídeo {size}", + "@videoWithSize": { + "type": "String", + "placeholders": { + "size": { + "type": "String" + } + } + }, + "shareInviteLink": "Comparteix un enllaç d'invitació", + "@shareInviteLink": {}, + "commandHint_markasdm": "Marca com a conversa directa la sala amb aquesta ID de Matrix", + "@commandHint_markasdm": {}, + "recoveryKeyLost": "Que has perdut la clau de recuperació?", + "@recoveryKeyLost": {}, + "cuddleContent": "{senderName} et fa una carícia", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "deviceKeys": "Claus del dispositiu:", + "@deviceKeys": {}, + "emoteKeyboardNoRecents": "Els últims emotes usats apareixeran aquí...", + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "setTheme": "Tria el tema:", + "@setTheme": {}, + "youJoinedTheChat": "T'has afegit al xat", + "@youJoinedTheChat": {}, + "openVideoCamera": "Obre la càmera per a fer un vídeo", + "@openVideoCamera": { + "type": "String", + "placeholders": {} + }, + "markAsRead": "Marca com a llegit", + "@markAsRead": {}, + "widgetName": "Nom", + "@widgetName": {}, + "errorAddingWidget": "S'ha produït un error en afegir el giny.", + "@errorAddingWidget": {}, + "commandHint_hug": "Envia una abraçada", + "@commandHint_hug": {}, + "replace": "Reemplaça", + "@replace": {}, + "oopsPushError": "Ep! Sembla que s'ha produït un error en configurar les notificacions.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "youUnbannedUser": "Has aixecat el veto a {user}", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "newSpace": "Espai nou", + "@newSpace": {}, + "emojis": "Emojis", + "@emojis": {}, + "pleaseEnterYourPin": "Introdueix el teu pin", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "pleaseChoose": "Escull", + "@pleaseChoose": { + "type": "String", + "placeholders": {} + }, + "commandHint_googly": "Envia uns ulls curiosos", + "@commandHint_googly": {}, + "pleaseTryAgainLaterOrChooseDifferentServer": "Torna-ho a provar més tard o tria un servidor diferent.", + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "createGroup": "Crea un grup", + "@createGroup": {}, + "hydrateTorLong": "Que vas exportar la teva última sessió a Tor? La pots importar ara i continuar xatejant.", + "@hydrateTorLong": {}, + "time": "Temps", + "@time": {}, + "custom": "Personalitzat", + "@custom": {}, + "noBackupWarning": "Compte! Si no actives la còpia de seguretat dels xats, perdràs accés als teus missatges xifrats. És molt recomanable activar-ho abans de tancar la sessió.", + "@noBackupWarning": {}, + "storeInSecureStorageDescription": "Desa la clau de recuperació en l'emmagatzematge segur d'aquest dispositiu.", + "@storeInSecureStorageDescription": {}, + "openChat": "Obre el xat", + "@openChat": {}, + "kickUserDescription": "Li usuàrïi ha estat expulsadi però no vetadi. Als xats públics, pot tornar-hi a entrar en qualsevol moment.", + "@kickUserDescription": {}, + "importNow": "Importa-ho ara", + "@importNow": {}, + "pinMessage": "Fixa a la sala", + "@pinMessage": {}, + "invite": "Convida", + "@invite": {}, + "enableMultiAccounts": "(Beta) Activa multi-compte en aquest dispositiu", + "@enableMultiAccounts": {}, + "indexedDbErrorTitle": "Problemes amb el mode privat", + "@indexedDbErrorTitle": {}, + "unsupportedAndroidVersionLong": "Aquesta funcionalitat només funciona amb versions d'Android més noves.", + "@unsupportedAndroidVersionLong": {}, + "storeSecurlyOnThisDevice": "Desa de forma segura en aquest dispositiu", + "@storeSecurlyOnThisDevice": {}, + "screenSharingDetail": "Estàs compartint la teva pantalla a FluffyChat", + "@screenSharingDetail": {}, + "placeCall": "Truca", + "@placeCall": {}, + "block": "Bloca", + "@block": {}, + "blockUsername": "Ignora aquesti usuàrïi", + "@blockUsername": {}, + "blockedUsers": "Usuàrïis blocadis", + "@blockedUsers": {}, + "blockListDescription": "Pots bloquejar usuàrïis que et molestin. No rebràs missatges seus ni invitacions de part seva a cap sala.", + "@blockListDescription": {}, + "pleaseChooseAStrongPassword": "Tria una contrasenya forta", + "@pleaseChooseAStrongPassword": {}, + "youInvitedToBy": "📩 T'han enviat un enllaç d'invitació per:\n{alias}", + "@youInvitedToBy": { + "placeholders": { + "alias": { + "type": "String" + } + } + }, + "groupName": "Nom del grup", + "@groupName": {}, + "createGroupAndInviteUsers": "Crea un grup i convida-hi usuàrïis", + "@createGroupAndInviteUsers": {}, + "wrongRecoveryKey": "Malauradament, aquesta clau de recuperació no és la correcta.", + "@wrongRecoveryKey": {}, + "publicLink": "Enllaç públic", + "@publicLink": {}, + "transparent": "Transparent", + "@transparent": {}, + "sendReadReceiptsDescription": "Lis altris participants d'un xat poden veure quan has llegit un missatge.", + "@sendReadReceiptsDescription": {}, + "yourGlobalUserIdIs": "La teva ID global és: ", + "@yourGlobalUserIdIs": {}, + "startConversation": "Comença una conversa", + "@startConversation": {}, + "commandHint_sendraw": "Envia un json pelat", + "@commandHint_sendraw": {}, + "databaseMigrationTitle": "La base de dades ha estat optimitzada", + "@databaseMigrationTitle": {}, + "pleaseEnterYourCurrentPassword": "Fica la teva contrasenya actual", + "@pleaseEnterYourCurrentPassword": {}, + "newPassword": "Contrasenya nova", + "@newPassword": {}, + "restoreSessionBody": "L'aplicació provarà de restaurar la teva sessió des de la còpia de seguretat. Si us plau, comunica aquest error a l'equi pde desenvolupament a {url}. El missatge d'error és {error}", + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "formattedMessages": "Missatges amb format", + "@formattedMessages": {}, + "formattedMessagesDescription": "Mostra contingut amb format enriquit com text en cursiva, fent servir markdown.", + "@formattedMessagesDescription": {}, + "verifyOtherUser": "🔐 Verifica uni altri usuàrïi", + "@verifyOtherUser": {}, + "verifyOtherDevice": "🔐 Verifica un altre dispositiu", + "@verifyOtherDevice": {}, + "databaseBuildErrorBody": "No s'ha pogut construir la base de dades SQLite. L'aplicació provarà de fer servir un format de base de dades antiquat. Si us plau, comunica aquesta situació a la comunitat de desenvolupament a {url}. El missatge d'error és: {error}", + "@databaseBuildErrorBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "initAppError": "S'ha produït un error mentre s'inicialitzava l'aplicació", + "@initAppError": {}, + "hidePresences": "Amagar la llista de Status?", + "@hidePresences": {}, + "noUsersFoundWithQuery": "No s'ha trobat cap usuàrïi amb \"{query}\". Revisa si ho has escrit malament.", + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "leaveEmptyToClearStatus": "Per esborrar el teu estat, deixa-ho en blanc.", + "@leaveEmptyToClearStatus": {}, + "select": "Tria", + "@select": {}, + "searchForUsers": "Cerca @usuariïs...", + "@searchForUsers": {}, + "subspace": "Subespai", + "@subspace": {}, + "addChatOrSubSpace": "Afegeix un xat o un subespai", + "@addChatOrSubSpace": {}, + "decline": "Denega", + "@decline": {}, + "sendReadReceipts": "Envia informes de tecleig", + "@sendReadReceipts": {}, + "sendTypingNotificationsDescription": "Lis altris participants d'un xat poden veure quan estàs teclejant un missatge nou.", + "@sendTypingNotificationsDescription": {}, + "incomingMessages": "Missatge d'entrada", + "@incomingMessages": {}, + "presenceStyle": "Presència:", + "@presenceStyle": { + "type": "String", + "placeholders": {} + }, + "acceptedKeyVerification": "{sender} ha acceptat la verificació de claus", + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "canceledKeyVerification": "{sender} ha canceŀlat la verificació de claus", + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "completedKeyVerification": "{sender} ha comletat la verificació de claus", + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "isReadyForKeyVerification": "{sender} està a punt per verificar les claus", + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "nothingFound": "No s'ha trobat res...", + "@nothingFound": {}, + "searchChatsRooms": "Cerca #sales, @usuariïs...", + "@searchChatsRooms": {}, + "groupCanBeFoundViaSearch": "El grup es pot trobar per la cerca general", + "@groupCanBeFoundViaSearch": {}, + "databaseMigrationBody": "Espereu un moment, si us plau.", + "@databaseMigrationBody": {}, + "passwordsDoNotMatch": "Les contrasenyes no coincideixen", + "@passwordsDoNotMatch": {}, + "passwordIsWrong": "La contrasenya introduïda és incorrecta", + "@passwordIsWrong": {}, + "joinSpace": "Fica't a l'espai", + "@joinSpace": {}, + "publicSpaces": "Espais públics", + "@publicSpaces": {}, + "thisDevice": "Aquest dispositiu:", + "@thisDevice": {}, + "sessionLostBody": "S'ha perdut la teva sessió. Si us plau, comunica aquest error a l'equip de desenvolupament a {url}. El missatge d'error és: {error}", + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "forwardMessageTo": "Vols reenviar el missatge a {roomName}?", + "@forwardMessageTo": { + "type": "String", + "placeholders": { + "roomName": { + "type": "String" + } + } + }, + "verifyOtherUserDescription": "Si verifiques aquesti usuàrïi, podràs estar seguri de a qui estàs escrivint. . 💪\n\nQuan inicies una verificació, l'altra persona i tu veureu un missatge emergent a l'app. Us sortiran un seguit d'emojis o números a cada pantalla, que haureu de comparar.\n\nLa millor manera de fer-ho és quedar en persona o fer una vídeo-trucada. 👭", + "@verifyOtherUserDescription": {}, + "verifyOtherDeviceDescription": "Quan verifiques un altre dispositiu, aquests poden intercanviar claus, així que es millora la seguretat total. 💪 Quan comences una verificació, apareixerà un missatge emergent a tots dos dispositius. A cadascun hi apareixerà un seguit d'emojis o de números que hauràs de comparar. El millor és tenir tots dos dispositius a mà abans d'iniciar la verificació. 🤳", + "@verifyOtherDeviceDescription": {}, + "requestedKeyVerification": "{sender} ha soŀlicitat verificar claus", + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "startedKeyVerification": "{sender} ha iniciat la verificació de claus", + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "presencesToggle": "Mostra els missatges d'estat d'altres usuàrïis", + "@presencesToggle": { + "type": "String", + "placeholders": {} + }, + "stickers": "Enganxines", + "@stickers": {}, + "discover": "Descobreix", + "@discover": {}, + "commandHint_ignore": "Ignora el compte de matrix especificat", + "@commandHint_ignore": {}, + "commandHint_unignore": "Deixa d'ignorar el compt de matrix especificat", + "@commandHint_unignore": {}, + "sendCanceled": "S'ha canceŀlat l'enviament", + "@sendCanceled": {}, + "noChatsFoundHere": "Encara no hi ha xats. Obre una conversa amb algú picant al botó de sota. ⤵️", + "@noChatsFoundHere": {}, + "hideMemberChangesInPublicChatsBody": "No mostres a l'històric de conversa de les sales públiques quan algú hi entra o surt. Això facilita la lectura.", + "@hideMemberChangesInPublicChatsBody": {}, + "invitedBy": "📩 Convidadi per {user}", + "@invitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "knock": "Pica", + "@knock": {}, + "knocking": "S'està picant", + "@knocking": {}, + "restricted": "Restringit", + "@restricted": {}, + "knockRestricted": "No es pot picar a la porta", + "@knockRestricted": {}, + "goToSpace": "Ves a l'espai {space}", + "@goToSpace": { + "type": "String", + "space": {} + }, + "adminLevel": "{level} - Admin", + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "changeGeneralChatSettings": "Canvia les opcions generals de xat", + "@changeGeneralChatSettings": {}, + "sendRoomNotifications": "Envia notificacions @room", + "@sendRoomNotifications": {}, + "changeTheDescriptionOfTheGroup": "Canvia la descripció del xat", + "@changeTheDescriptionOfTheGroup": {}, + "changelog": "Registre de canvis", + "@changelog": {}, + "userLevel": "{level} - Usuàriï", + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "moderatorLevel": "{level} - Moderadori", + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "inviteOtherUsers": "Convida més gent a la conversa", + "@inviteOtherUsers": {}, + "changeTheChatPermissions": "Canvia els permisos del xat", + "@changeTheChatPermissions": {}, + "changeTheVisibilityOfChatHistory": "Canvia la visibilitat de l'historial de conversa", + "@changeTheVisibilityOfChatHistory": {}, + "changeTheCanonicalRoomAlias": "Canvia l'adreça principal del xat", + "@changeTheCanonicalRoomAlias": {}, + "accessAndVisibilityDescription": "Qui pot entrar a aquesta conversa i com pot ser descoberta.", + "@accessAndVisibilityDescription": {}, + "customEmojisAndStickers": "Emojis i stickers propis", + "@customEmojisAndStickers": {}, + "accessAndVisibility": "Accés i visibilitat", + "@accessAndVisibility": {}, + "calls": "Trucades", + "@calls": {}, + "hideRedactedMessages": "Amaga els missatges estripats", + "@hideRedactedMessages": {}, + "hideInvalidOrUnknownMessageFormats": "Amaga els missatges que tinguin un format desconegut", + "@hideInvalidOrUnknownMessageFormats": {}, + "hideMemberChangesInPublicChats": "Amaga els canvis d'estat de lis membres a les sales públiques", + "@hideMemberChangesInPublicChats": {}, + "notifyMeFor": "Nofica'm que", + "@notifyMeFor": {}, + "overview": "Resum", + "@overview": {}, + "passwordRecoverySettings": "Recuperació de contrasenya", + "@passwordRecoverySettings": {}, + "userRole": "Rol d'usuàriï", + "@userRole": {}, + "minimumPowerLevel": "El nivell mínim de permisos és {level}.", + "@minimumPowerLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "String" + } + } + }, + "gallery": "Galeria", + "@gallery": {}, + "noDatabaseEncryption": "No es pot xifrar la base de dades en aquesta plataforma", + "@noDatabaseEncryption": {}, + "usersMustKnock": "Lis membres han de picar a la porta", + "@usersMustKnock": {}, + "noOneCanJoin": "Ningú s'hi pot ficar", + "@noOneCanJoin": {}, + "userWouldLikeToChangeTheChat": "{user} vol entrar al xat.", + "@userWouldLikeToChangeTheChat": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "customEmojisAndStickersBody": "Afegeix o comparteix emojis o stickers. Els podràs fer servir en qualsevol conversa.", + "@customEmojisAndStickersBody": {}, + "hideRedactedMessagesBody": "Si algú estripa un missatge, ja no apareixerà a l'historial de la conversa.", + "@hideRedactedMessagesBody": {}, + "searchIn": "Cerca al xat \"{chat}\"...", + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "markAsUnread": "Marca com a no llegit", + "@markAsUnread": {}, + "chatPermissionsDescription": "Defineix quin nivell de permisos cal per cada acció en aquest xat. Els nivells 0, 50 i 100 normalment representen usuàriïs, mods i admins, però es pot canviar.", + "@chatPermissionsDescription": {}, + "updateInstalled": "🎉 S'ha actualitzat a la versió {version}!", + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "alwaysUse24HourFormat": "true", + "@alwaysUse24HourFormat": { + "description": "Set to true to always display time of day in 24 hour format." + }, + "appLockDescription": "Bloca l'app amb un pin quan no la facis servir", + "@appLockDescription": {}, + "swipeRightToLeftToReply": "Llisca de dreta esquerra per respondre", + "@swipeRightToLeftToReply": {}, + "globalChatId": "Identificador global de xat", + "@globalChatId": {}, + "createNewAddress": "Crea una adreça nova", + "@createNewAddress": {}, + "searchMore": "Cerca més...", + "@searchMore": {}, + "files": "Arxius", + "@files": {}, + "publicChatAddresses": "Adreces públiques del xat", + "@publicChatAddresses": {}, + "unreadChatsInApp": "{appname}: {unread} converses pendents", + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "thereAreCountUsersBlocked": "Ara mateix hi ha {count} usuàriïs bloquejadis.", + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "loginWithMatrixId": "Entra amb l'id de Matrix", + "@loginWithMatrixId": {}, + "discoverHomeservers": "Descobreix servidors", + "@discoverHomeservers": {}, + "whatIsAHomeserver": "Què és un servidor de Matrix?", + "@whatIsAHomeserver": {}, + "homeserverDescription": "Totes les teves dades s'emmagatzemen al servidor, com passa amb el e-mail. Pots triar quin servidor vols fer servir sense témer a no poder comunicar gent d'altres servidors. Llegeix-ne més a https://matrix.org.", + "@homeserverDescription": {}, + "doesNotSeemToBeAValidHomeserver": "No sembla un servidor compatible. Pot ser que la URL estigui malament?", + "@doesNotSeemToBeAValidHomeserver": {}, + "countChatsAndCountParticipants": "{chats} xats i {participants} participants", + "@countChatsAndCountParticipants": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + }, + "participants": { + "type": "int" + } + } + }, + "noMoreChatsFound": "No hi ha més xats...", + "@noMoreChatsFound": {}, + "space": "Espai", + "@space": {}, + "joinedChats": "Xats on has entrat", + "@joinedChats": {}, + "unread": "Sense llegir", + "@unread": {}, + "spaces": "Espais", + "@spaces": {}, + "noPublicLinkHasBeenCreatedYet": "No s'ha creat cap enllaç públic", + "@noPublicLinkHasBeenCreatedYet": {}, + "chatCanBeDiscoveredViaSearchOnServer": "El xat es pot descobrir amb la cerca de {server}", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "calculatingFileSize": "S'està calculant la mida de l'arxiu...", + "@calculatingFileSize": {}, + "prepareSendingAttachment": "S'està preparant per enviar l'adjunt...", + "@prepareSendingAttachment": {}, + "generatingVideoThumbnail": "S'està generant la miniatura del vídeo...", + "@generatingVideoThumbnail": {}, + "noticeChatBackupDeviceVerification": "Nota: quan connectes tots els dispositius al backup del xat, es verifiquen automàticament.", + "@noticeChatBackupDeviceVerification": {}, + "continueText": "Continua", + "@continueText": {}, + "strikeThrough": "Text ratllat", + "@strikeThrough": {}, + "addLink": "Afegeix un enllaç", + "@addLink": {}, + "noContactInformationProvided": "El servidor no ofereix cap informació de contacte vàlida", + "@noContactInformationProvided": {}, + "setWallpaper": "Tria imatge de fons", + "@setWallpaper": {}, + "sendImages": "Envia {count} imatge", + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "sendingAttachment": "S'està enviant l'adjunt...", + "@sendingAttachment": {}, + "compressVideo": "S'està comprimint el vídeo...", + "@compressVideo": {}, + "sendingAttachmentCountOfCount": "S'està enviant l'adjunt {index} de {length}...", + "@sendingAttachmentCountOfCount": { + "type": "integer", + "placeholders": { + "index": { + "type": "int" + }, + "length": { + "type": "int" + } + } + }, + "serverLimitReached": "S'ha arribat al límit del servidor! Esperant {seconds} segons...", + "@serverLimitReached": { + "type": "integer", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "oneOfYourDevicesIsNotVerified": "Un dels teus dispositius no està verificat", + "@oneOfYourDevicesIsNotVerified": {}, + "welcomeText": "Hola hola! 👋 Això és FluffyChat. Pots iniciar sessió en qualsevol servidor compatible amb https://matrix.org. I llavors xatejar amb qualsevol. És una xarxa enorme de missatgeria descentralitzada !", + "@welcomeText": {}, + "blur": "Difumina:", + "@blur": {}, + "opacity": "Opacitat:", + "@opacity": {}, + "manageAccount": "Gestiona el compte", + "@manageAccount": {}, + "contactServerAdmin": "Contacta l'admin del servidor", + "@contactServerAdmin": {}, + "contactServerSecurity": "Contacta l'equip de seguretat del servidor", + "@contactServerSecurity": {}, + "version": "Versió", + "@version": {}, + "website": "Lloc web", + "@website": {}, + "compress": "Comprimeix", + "@compress": {}, + "pleaseFillOut": "Emplena", + "@pleaseFillOut": {}, + "invalidUrl": "URL invàlida", + "@invalidUrl": {}, + "unableToJoinChat": "No s'ha pogut entrar al xat. Pot ser que l'altri participant hagi tancat la conversa.", + "@unableToJoinChat": {}, + "aboutHomeserver": "Quant a {homeserver}", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "supportPage": "Pàgina de suport", + "@supportPage": {}, + "serverInformation": "Informació del servidor:", + "@serverInformation": {}, + "name": "Nom", + "@name": {}, + "boldText": "Text en negreta", + "@boldText": {}, + "italicText": "Text en cursiva", + "@italicText": {}, + "contentNotificationSettings": "Opcions de notificació de continguts", + "@contentNotificationSettings": {}, + "roomNotificationSettings": "Opcions de notificacions de sales", + "@roomNotificationSettings": {}, + "notificationRuleContainsUserName": "Conté el nom d'usuàriï", + "@notificationRuleContainsUserName": {}, + "notificationRuleContainsUserNameDescription": "Notifica l'usuàriï quan un missatge contingui el seu nom.", + "@notificationRuleContainsUserNameDescription": {}, + "notificationRuleMaster": "Silencia totes les notificacions", + "@notificationRuleMaster": {}, + "notificationRuleSuppressNotices": "Elimina els missatges automàtics", + "@notificationRuleSuppressNotices": {}, + "notificationRuleInviteForMe": "Invitació per a mi", + "@notificationRuleInviteForMe": {}, + "notificationRuleInviteForMeDescription": "Notifica l'usuàriï quan és convidadi a una sala.", + "@notificationRuleInviteForMeDescription": {}, + "notificationRuleMemberEventDescription": "Ignora les notificacions quan entra o surt algú d'una sala.", + "@notificationRuleMemberEventDescription": {}, + "notificationRuleIsUserMention": "Mencions", + "@notificationRuleIsUserMention": {}, + "notificationRuleContainsDisplayName": "Conté el nom visible", + "@notificationRuleContainsDisplayName": {}, + "notificationRuleIsRoomMention": "Menció de sala", + "@notificationRuleIsRoomMention": {}, + "notificationRuleIsRoomMentionDescription": "Notifica l'usuàriï quan es s'esmenti la sala.", + "@notificationRuleIsRoomMentionDescription": {}, + "notificationRuleRoomnotifDescription": "Notifica l'usuàriï quan un missatge contingui '@room'.", + "@notificationRuleRoomnotifDescription": {}, + "notificationRuleTombstone": "Làpida", + "@notificationRuleTombstone": {}, + "notificationRuleTombstoneDescription": "Notifica l'usuàriï dels missatges de desactivació de sales.", + "@notificationRuleTombstoneDescription": {}, + "notificationRuleReaction": "Reacció", + "@notificationRuleReaction": {}, + "notificationRuleReactionDescription": "Ignora les notificacions sobre reaccions.", + "@notificationRuleReactionDescription": {}, + "notificationRuleRoomServerAcl": "Regles ACL del servidor d'una sala", + "@notificationRuleRoomServerAcl": {}, + "notificationRuleRoomServerAclDescription": "Ignora les notificacions sobre les regles d'accés (ACL) del servidor d'una sala.", + "@notificationRuleRoomServerAclDescription": {}, + "notificationRuleSuppressEdits": "Elimina les edicions", + "@notificationRuleSuppressEdits": {}, + "notificationRuleSuppressEditsDescription": "Ignora les notificacions per missatges editats.", + "@notificationRuleSuppressEditsDescription": {}, + "notificationRuleCall": "Trucada", + "@notificationRuleCall": {}, + "notificationRuleCallDescription": "Notifica l'usuàriï de trucades.", + "@notificationRuleCallDescription": {}, + "notificationRuleEncryptedRoomOneToOneDescription": "Notifica l'usuàriï de missatges en sales xifrades un a un, converses de dues persones.", + "@notificationRuleEncryptedRoomOneToOneDescription": {}, + "notificationRuleEncryptedRoomOneToOne": "Converses xifrades", + "@notificationRuleEncryptedRoomOneToOne": {}, + "notificationRuleRoomOneToOne": "Converses", + "@notificationRuleRoomOneToOne": {}, + "notificationRuleMessageDescription": "Notifica l'usuàriï sobre missatges generals.", + "@notificationRuleMessageDescription": {}, + "notificationRuleEncrypted": "Xifrat", + "@notificationRuleEncrypted": {}, + "notificationRuleEncryptedDescription": "Notifica l'usuàriï de missatges en sales xifrades.", + "@notificationRuleEncryptedDescription": {}, + "notificationRuleJitsi": "Jitsi", + "@notificationRuleJitsi": {}, + "notificationRuleServerAcl": "Ignora canvis en ACL de servidor", + "@notificationRuleServerAcl": {}, + "unknownPushRule": "No es coneix la regla push '{rule}'", + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } + } + }, + "more": "Més", + "@more": {}, + "notificationRuleSuppressNoticesDescription": "No envia notificacions relacionades amb usuàriïs automàtics com els bots.", + "@notificationRuleSuppressNoticesDescription": {}, + "otherNotificationSettings": "Altres opcions de notificacions", + "@otherNotificationSettings": {}, + "notificationRuleIsUserMentionDescription": "Notifica quan mencionin l'usuàriï en un missatge.", + "@notificationRuleIsUserMentionDescription": {}, + "notificationRuleContainsDisplayNameDescription": "Notifica l'usuàriï quan un missatge contingui el seu nom per mostrar.", + "@notificationRuleContainsDisplayNameDescription": {}, + "notificationRuleJitsiDescription": "Notifica l'usuàriï sobre activitat del giny de Jitsi.", + "@notificationRuleJitsiDescription": {}, + "notificationRuleRoomnotif": "Notificació de sala", + "@notificationRuleRoomnotif": {}, + "deletePushRuleCanNotBeUndone": "Si esborres aquesta opció de notificació no ho podràs tornar a canviar.", + "@deletePushRuleCanNotBeUndone": {}, + "notificationRuleRoomOneToOneDescription": "Notifica l'usuàriï de missatges en converses de dues persones, sales un a un.", + "@notificationRuleRoomOneToOneDescription": {}, + "notificationRuleMemberEvent": "Canvis de membres", + "@notificationRuleMemberEvent": {}, + "otherPartyNotLoggedIn": "L'altra persona no està en línia ara mateix i per tant no pot rebre missatges!", + "@otherPartyNotLoggedIn": {}, + "userSpecificNotificationSettings": "Opcions de notificacions d'usuàriï", + "@userSpecificNotificationSettings": {}, + "generalNotificationSettings": "Opcions de notificacions generals", + "@generalNotificationSettings": {}, + "notificationRuleMessage": "Missatge", + "@notificationRuleMessage": {}, + "notificationRuleServerAclDescription": "Ignora les notificacions per canvis en les regles d'accés (ACL) de servidor.", + "@notificationRuleServerAclDescription": {}, + "shareKeysWithDescription": "Quins dispositius vols que puguin llegir els teus missatges xifrats?", + "@shareKeysWithDescription": {}, + "previous": "Anterior", + "@previous": {}, + "notificationRuleMasterDescription": "Ignora totes les altres regles i deshabilita totes les notificacions.", + "@notificationRuleMasterDescription": {}, + "newChatRequest": "📩 Soŀlicitud de missatge", + "@newChatRequest": {}, + "allDevices": "Tots els dispositius", + "@allDevices": {}, + "crossVerifiedDevices": "Els dispositius verificats mútuament", + "@crossVerifiedDevices": {}, + "verifiedDevicesOnly": "Només els dispositius verificats", + "@verifiedDevicesOnly": {}, + "synchronizingPleaseWaitCounter": " S'està sincronitzant... ({percentage}%)", + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "appWantsToUseForLogin": "Fes servir '{server}' per iniciar sessió", + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "appWantsToUseForLoginDescription": "Consenteixes que l'app i la web comparteixen informació sobre tu.", + "@appWantsToUseForLoginDescription": {}, + "open": "Obre", + "@open": {}, + "appIntroduction": "El FluffyChat et permet xatejar amb amiguis entre diverses aplicacions. Llegeix-ne més a https://matrix.org o pica \"Continua\".", + "@appIntroduction": {}, + "waitingForServer": "S'està esperant el servidor...", + "@waitingForServer": {}, + "shareKeysWith": "Comparteix les claus amb...", + "@shareKeysWith": {}, + "crossVerifiedDevicesIfEnabled": "Els dispositius verificats mútuament, si està activat", + "@crossVerifiedDevicesIfEnabled": {} +} diff --git a/assets/l10n/intl_cs.arb b/assets/l10n/intl_cs.arb new file mode 100644 index 0000000..72cc868 --- /dev/null +++ b/assets/l10n/intl_cs.arb @@ -0,0 +1,2678 @@ +{ + "@@locale": "cs", + "@@last_modified": "2021-08-14 12:41:10.131133", + "about": "O aplikaci", + "@about": { + "type": "String", + "placeholders": {} + }, + "accept": "Přijmout", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 {username} přijal/a pozvání", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "Účet", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐 {username} aktivoval/a koncové šifrování", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "addEmail": "Přidat e-mail", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "admin": "Správce", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "alias", + "@alias": { + "type": "String", + "placeholders": {} + }, + "all": "Vše", + "@all": { + "type": "String", + "placeholders": {} + }, + "allChats": "Všechny chaty", + "@allChats": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "{senderName} odpověděl na hovor", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "Kdokoliv se může připojit", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "appLock": "Zámek aplikace", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "archive": "Archivovat", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "Mohou se připojit hosté", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "Jste si jistý?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "areYouSureYouWantToLogout": "Opravdu se chcete odhlásit?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "Pro ověření této osoby zadejte prosím přístupovou frázi k „bezpečnému úložišti“ anebo „klíč pro obnovu“.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "Přijmout žádost o ověření od {username}?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "autoplayImages": "Automaticky přehrajte animované nálepky a emoce", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "badServerLoginTypesException": "Homeserver podporuje přihlášení typu:\n{serverVersions}\nAle tato aplikace podporuje pouze:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "badServerVersionsException": "Homeserver podporuje specifikaci verzí:\n{serverVersions}\nAle tato aplikace podporuje pouze verze {supportedVersions}", + "@badServerVersionsException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "banFromChat": "Zakázat chat", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "Zakázán", + "@banned": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username} zakázal {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "Blokovat zařízení", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "blocked": "Zakázán", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "botMessages": "Zprávy od bota", + "@botMessages": { + "type": "String", + "placeholders": {} + }, + "cancel": "Zrušit", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "cantOpenUri": "Nelze otevřít URI {uri}", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "changeDeviceName": "Změnit název zařízení", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "{username} změnil avatar chatu", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatDescriptionTo": "{username} změnil popis chatu na: „{description}“", + "@changedTheChatDescriptionTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "description": { + "type": "String" + } + } + }, + "changedTheChatNameTo": "{username} změnil jméno chatu na: „{chatname}“", + "@changedTheChatNameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "chatname": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username} změnili nastavení oprávnění v chatu", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username} změnili svoji přezdívku na: {displayname}", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} změnili přístupová práva pro hosty", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} změnili přístupová práva pro hosty na: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username} změnili nastavení viditelnosti historie diskuze", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username} změnili nastavení viditelnosti historie diskuze na: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username} změnili nastavení pravidel připojení", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} změnili nastavení pravidel připojení na: {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} změnili svůj avatar", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "{username} změnili nastavení aliasů místnosti", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username} změnili odkaz k pozvání do místnosti", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changePassword": "Změnit heslo", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "Změnit domovský server", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "Změňte svůj styl", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "Změnit název skupiny", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "changeYourAvatar": "Změňte svůj avatar", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "Šifrování bylo poškozeno", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "chat": "Chat", + "@chat": { + "type": "String", + "placeholders": {} + }, + "chatBackup": "Záloha chatu", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "chatBackupDescription": "Záloha chatu je zabezpečena bezpečnostním klíčem. Ujistěte se, prosím, že klíč neztratíte.", + "@chatBackupDescription": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Bližší údaje o chatu", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chats": "Chaty", + "@chats": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "Vyberte silné heslo", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "clearArchive": "Vymazat archiv", + "@clearArchive": {}, + "close": "Zavřít", + "@close": { + "type": "String", + "placeholders": {} + }, + "commandHint_ban": "Zakázat danému uživateli přístup do této místnosti", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_html": "Odeslat text ve formátu HTML", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_invite": "Pozvěte daného uživatele do této místnosti", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "commandHint_join": "Připojte se k dané místnosti", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_kick": "Odeberte daného uživatele z této místnosti", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_leave": "Opusťte tuto místnost", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_me": "Představ se", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "commandHint_myroomavatar": "Nastavte si obrázek pro tuto místnost (autor mxc-uri)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_myroomnick": "Nastavte si váš zobrazovaný název pro tuto místnost", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "commandHint_op": "Nastavit úroveň práv daného uživatele (výchozí: 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_plain": "Odeslat neformátovaný text", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_react": "Odeslat odpověď jako reakci", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "commandHint_send": "Poslat zprávu", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "commandHint_unban": "Zrušte zákaz přístupu daného uživatele do této místnosti", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "commandInvalid": "Příkaz je neplatný", + "@commandInvalid": { + "type": "String" + }, + "commandMissing": "{command} není příkaz.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "compareEmojiMatch": "Porovnejte a přesvědčete se, že následující emotikony se shodují na obou zařízeních:", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "Porovnejte a přesvědčete se, že následující čísla se shodují na obou zařízeních:", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "configureChat": "Nastavení chatu", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "confirm": "Potvrdit", + "@confirm": { + "type": "String", + "placeholders": {} + }, + "connect": "Připojit", + "@connect": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "Kontakt byl pozván do skupiny", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "containsDisplayName": "Obsahuje zobrazovaný název", + "@containsDisplayName": { + "type": "String", + "placeholders": {} + }, + "containsUserName": "Obsahuje uživatelské jméno", + "@containsUserName": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "Obsah byl nahlášen správcům serveru", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "Zkopírováno do schránky", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "Kopírovat", + "@copy": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "Zkopírovat do schránky", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "Nebylo možné dešifrovat zprávu: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "countParticipants": "{count} účastníků", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "create": "Vytvořit", + "@create": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "💬 {username} založil/a chat", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "createNewSpace": "Nový prostor", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "currentlyActive": "Aktuálně aktivní", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "Tmavé", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "dateWithoutYear": "{day}.{month}", + "@dateWithoutYear": { + "type": "String", + "placeholders": { + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "dateWithYear": "{day}. {month}. {year}", + "@dateWithYear": { + "type": "String", + "placeholders": { + "year": { + "type": "String" + }, + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "deactivateAccountWarning": "Tímto krokem se deaktivuje váš uživatelský účet. Akci nelze vrátit zpět! Jste si jistí?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "Výchozí úroveň oprávnění nových uživatelů", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "delete": "Smazat", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "Smazat účet", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "Smazat zprávu", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "device": "Zařízení", + "@device": { + "type": "String", + "placeholders": {} + }, + "deviceId": "ID zařízení", + "@deviceId": { + "type": "String", + "placeholders": {} + }, + "devices": "Zařízení", + "@devices": { + "type": "String", + "placeholders": {} + }, + "directChats": "Přímé chatování", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "Přezdívka byla změněna", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "Stáhnout soubor", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "edit": "Upravit", + "@edit": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "Upravit zakázané servery", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "editDisplayname": "Změnit přezdívku", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "editRoomAliases": "Upravit aliasy místností", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "Upravit avatara místnosti", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "Emotikona již existuje!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "Neplatný kód emotikony!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emotePacks": "Balíček emotikonů pro místnost", + "@emotePacks": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "Nastavení emotikonů", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "emoteShortcode": "Klávesová zkratka emotikonu", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emoteWarnNeedToPick": "Musíte si vybrat klávesovou zkratku emotikonu a obrázek!", + "@emoteWarnNeedToPick": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "Prázdný chat", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "Povolit balíček emotikon všude", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "Povolit šifrování", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "Šifrování již nebude možné vypnout. Jste si tím jisti?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "encrypted": "Šifrováno", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "encryption": "Šifrování", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "Šifrování není aktivní", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName} ukončil hovor", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "enterAnEmailAddress": "Zadejte e-mailovou adresu", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "enterYourHomeserver": "Zadejte svůj domovský server", + "@enterYourHomeserver": { + "type": "String", + "placeholders": {} + }, + "errorObtainingLocation": "Chyba při získávání polohy: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "everythingReady": "Vše připraveno!", + "@everythingReady": { + "type": "String", + "placeholders": {} + }, + "extremeOffensive": "Extrémně urážlivé", + "@extremeOffensive": { + "type": "String", + "placeholders": {} + }, + "fileName": "Název souboru", + "@fileName": { + "type": "String", + "placeholders": {} + }, + "fluffychat": "FluffyChat", + "@fluffychat": { + "type": "String", + "placeholders": {} + }, + "fontSize": "Velikost písma", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "forward": "Přeposlat", + "@forward": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "Od vstupu", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "Od pozvání", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "goToTheNewRoom": "Přejít do nové místnost", + "@goToTheNewRoom": { + "type": "String", + "placeholders": {} + }, + "group": "Skupina", + "@group": { + "type": "String", + "placeholders": {} + }, + "groupIsPublic": "Skupina je veřejná", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "groups": "Skupiny", + "@groups": { + "type": "String", + "placeholders": {} + }, + "groupWith": "Skupina s {displayname}", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "guestsAreForbidden": "Hosté jsou zakázáni", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "Hosté se mohou připojit", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{username} stáhl pozvánku pro {targetName}", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "help": "Pomoc", + "@help": { + "type": "String", + "placeholders": {} + }, + "hideRedactedEvents": "Skrýt redigované události", + "@hideRedactedEvents": { + "type": "String", + "placeholders": {} + }, + "hideUnknownEvents": "Skrýt neznámé události", + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "howOffensiveIsThisContent": "Jak urážlivý je tento obsah?", + "@howOffensiveIsThisContent": { + "type": "String", + "placeholders": {} + }, + "id": "ID", + "@id": { + "type": "String", + "placeholders": {} + }, + "identity": "Identita", + "@identity": { + "type": "String", + "placeholders": {} + }, + "ignore": "Ignorovat", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "ignoredUsers": "Ignorovaní uživatelé", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "iHaveClickedOnLink": "Klikl jsem na odkaz", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "Nesprávné přístupové heslo anebo klíč pro obnovu", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "inoffensive": "Neškodný", + "@inoffensive": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "Pozvat kontakt", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "Pozvat kontakt do {groupName}", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "invited": "Pozvaný", + "@invited": { + "type": "String", + "placeholders": {} + }, + "invitedUser": "📩 {username} pozval/a {targetName}", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "invitedUsersOnly": "Pouze pozvaní uživatelé", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "inviteForMe": "Pozvěte mě", + "@inviteForMe": { + "type": "String", + "placeholders": {} + }, + "inviteText": "{username} vás pozvali na FluffyChat.\n1. Navštivte fluffychat.im a nainstalujte si aplikaci.\n2. Zaregistrujte se anebo se přihlašte.\n3. Otevřete pozvánku: \n {link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "isTyping": "píše…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "👋 {username} se připojil/a k chatu", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "joinRoom": "Připojte se k místnosti", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "kicked": "👞 {username} vyhodil/a {targetName}", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickedAndBanned": "{username} vyhodili a zakázali {targetName}", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickFromChat": "Vyhodit z chatu", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "Naposledy aktivní: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "leave": "Opustit", + "@leave": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "Opustil chat", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "license": "Licence", + "@license": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "Světlé", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "Načíst dalších {count} účastníků", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "loadingPleaseWait": "Načítání… Prosíme vyčkejte.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "loadMore": "Načíst další…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "locationDisabledNotice": "Služby určování polohy jsou deaktivovány. Povolte jim, aby mohli sdílet vaši polohu.", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "locationPermissionDeniedNotice": "Oprávnění k poloze odepřeno. Udělte jim prosím možnost sdílet vaši polohu.", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "login": "Přihlásit se", + "@login": { + "type": "String", + "placeholders": {} + }, + "logInTo": "Přihlášení k {homeserver}", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "logout": "Odhlásit", + "@logout": { + "type": "String", + "placeholders": {} + }, + "memberChanges": "Změny členů", + "@memberChanges": { + "type": "String", + "placeholders": {} + }, + "mention": "Zmínit se", + "@mention": { + "type": "String", + "placeholders": {} + }, + "messages": "Zprávy", + "@messages": { + "type": "String", + "placeholders": {} + }, + "moderator": "Moderátor", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "muteChat": "Ztlumit chat", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "needPantalaimonWarning": "Prosím vezměte na vědomí, že pro použití koncového šifrování je prozatím potřeba použít Pantalaimon.", + "@needPantalaimonWarning": { + "type": "String", + "placeholders": {} + }, + "newChat": "Nový chat", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "Nová zpráva ve FluffyChatu", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "Nová žádost o ověření!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "next": "Další", + "@next": { + "type": "String", + "placeholders": {} + }, + "no": "Ne", + "@no": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "Žádné připojení k serveru", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "Nebyly nalezeny žádné emotikony. 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "Můžete aktivovat šifrování jakmile místnost přestane být veřejně dostupná.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "Zdá se, že služba Firebase Cloud Messaging není ve vašem zařízení k dispozici. Chcete-li i nadále přijímat push oznámení, doporučujeme nainstalovat ntfy. Pomocí ntfy nebo jiného poskytovatele Unified Push můžete přijímat oznámení push zabezpečeným způsobem přenosu dat. Aplikaci ntfy si můžete stáhnout z obchodu PlayStore nebo z webu F-Droid.", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "noMatrixServer": "{server1} není matrixový server, použít místo toho server {server2}?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "none": "Žádný", + "@none": { + "type": "String", + "placeholders": {} + }, + "noPasswordRecoveryDescription": "Dosud jste nepřidali způsob, jak obnovit své heslo.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "noPermission": "Chybí oprávnění", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "Nebyly nalezeny žádné místnosti…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "notifications": "Oznámení", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "notificationsEnabledForThisAccount": "Oznámení povolena pro tento účet", + "@notificationsEnabledForThisAccount": { + "type": "String", + "placeholders": {} + }, + "numUsersTyping": "{count} uživatelé píší…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "obtainingLocation": "Získávání polohy…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "offensive": "Urážlivé", + "@offensive": { + "type": "String", + "placeholders": {} + }, + "offline": "Odpojeni", + "@offline": { + "type": "String", + "placeholders": {} + }, + "ok": "Ok", + "@ok": { + "type": "String", + "placeholders": {} + }, + "online": "Připojeni", + "@online": { + "type": "String", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "Online záloha kíčů je zapnuta", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "oopsPushError": "Jejda! Při nastavování oznámení push došlo bohužel k chybě.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "Jejda, něco se pokazilo…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "Otevřete aplikaci pro přečtení zpráv", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "openCamera": "Otevřít fotoaparát", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "openInMaps": "Otevřít v mapách", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "or": "Nebo", + "@or": { + "type": "String", + "placeholders": {} + }, + "participant": "Účastník", + "@participant": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "heslo nebo klíč pro obnovení", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "password": "Heslo", + "@password": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "Zapomenuté heslo", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "Heslo bylo změněno", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "passwordRecovery": "Obnova hesla", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "people": "Lidé", + "@people": { + "type": "String", + "placeholders": {} + }, + "pickImage": "Zvolit obrázek", + "@pickImage": { + "type": "String", + "placeholders": {} + }, + "pin": "Připnout zprávu", + "@pin": { + "type": "String", + "placeholders": {} + }, + "play": "Přehrát {fileName}", + "@play": { + "type": "String", + "placeholders": { + "fileName": { + "type": "String" + } + } + }, + "pleaseChoose": "Prosím vyberte si", + "@pleaseChoose": { + "type": "String", + "placeholders": {} + }, + "pleaseChooseAPasscode": "Vyberte přístupový kód", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "pleaseClickOnLink": "Klikněte na odkaz v e-mailu a pokračujte.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "pleaseEnter4Digits": "Chcete-li deaktivovat zámek aplikace, zadejte 4 číslice nebo nechte prázdné.", + "@pleaseEnter4Digits": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPassword": "Zadejte prosím své heslo", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPin": "Zadejte svůj PIN", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "Zadejte prosím své uživatelské jméno", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "Postupujte podle pokynů na webu a klepněte na další.", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "privacy": "Soukromí", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "Veřejné místnosti", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "pushRules": "Pravidla push", + "@pushRules": { + "type": "String", + "placeholders": {} + }, + "reason": "Důvod", + "@reason": { + "type": "String", + "placeholders": {} + }, + "recording": "Nahrávání", + "@recording": { + "type": "String", + "placeholders": {} + }, + "redactedAnEvent": "{username} opravili událost", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "redactMessage": "Redigovat zprávu", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "register": "Registrovat", + "@register": { + "type": "String", + "placeholders": {} + }, + "reject": "Zamítnout", + "@reject": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "{username} odmítli pozvání", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "rejoin": "Znovu se připojte", + "@rejoin": { + "type": "String", + "placeholders": {} + }, + "remove": "Odstranit", + "@remove": { + "type": "String", + "placeholders": {} + }, + "removeAllOtherDevices": "Odstranit všechna další zařízení", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "removedBy": "Odstraněno {username}", + "@removedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "removeDevice": "Odstraňit zařízení", + "@removeDevice": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "Zrušit zákaz chatu", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "removeYourAvatar": "Odstraňte svého avatara", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "renderRichContent": "Zobrazit bohatě vykreslený obsah zpráv", + "@renderRichContent": { + "type": "String", + "placeholders": {} + }, + "replaceRoomWithNewerVersion": "Nahradit místnost novou verzí", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "reply": "Odpovědět", + "@reply": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "Nahlásit zprávu", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "requestPermission": "Vyžádat oprávnění", + "@requestPermission": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "Místnost byla upgradována", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "Verze místnosti", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "saveFile": "Uložit soubor", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "search": "Hledat", + "@search": { + "type": "String", + "placeholders": {} + }, + "security": "Bezpečnostní", + "@security": { + "type": "String", + "placeholders": {} + }, + "seenByUser": "Viděno uživatelem {username}", + "@seenByUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "send": "Odeslat", + "@send": { + "type": "String", + "placeholders": {} + }, + "sendAMessage": "Odeslat zprávu", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "sendAsText": "Odeslat jako text", + "@sendAsText": { + "type": "String" + }, + "sendAudio": "Odeslat audio", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendFile": "Odeslat soubor", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendImage": "Odeslat obrázek", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendMessages": "Odeslat zprávy", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "sendOriginal": "Odeslat originál", + "@sendOriginal": { + "type": "String", + "placeholders": {} + }, + "sendSticker": "Odeslat nálepku", + "@sendSticker": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "Odeslat video", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "sentAFile": "{username} poslali soubor", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAnAudio": "{username} poslali zvukovou nahrávku", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAPicture": "{username} poslali obrázek", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentASticker": "{username} poslali samolepku", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "{username} poslali video", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentCallInformations": "{senderName} odeslal informace o hovoru", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "setAsCanonicalAlias": "Nastavit jako hlavní alias", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "setCustomEmotes": "Nastavit vlastní emotikony", + "@setCustomEmotes": { + "type": "String", + "placeholders": {} + }, + "setInvitationLink": "Nastavit zvací odkaz", + "@setInvitationLink": { + "type": "String", + "placeholders": {} + }, + "setPermissionsLevel": "Nastavit úroveň oprávnění", + "@setPermissionsLevel": { + "type": "String", + "placeholders": {} + }, + "setStatus": "Nastavit stav", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "settings": "Nastavení", + "@settings": { + "type": "String", + "placeholders": {} + }, + "share": "Sdílet", + "@share": { + "type": "String", + "placeholders": {} + }, + "sharedTheLocation": "{username} sdílel jejich polohu", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "shareLocation": "Sdílet polohu", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "showPassword": "Zobrazit heslo", + "@showPassword": { + "type": "String", + "placeholders": {} + }, + "singlesignon": "Jedinečné přihlášení", + "@singlesignon": { + "type": "String", + "placeholders": {} + }, + "skip": "Přeskočit", + "@skip": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "Zdrojové kódy", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "spaceIsPublic": "Prostor je veřejný", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "spaceName": "Název prostoru", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "startedACall": "{senderName} zahájil hovor", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "status": "Stav", + "@status": { + "type": "String", + "placeholders": {} + }, + "statusExampleMessage": "Jak se dneska máš?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "submit": "Odeslat", + "@submit": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWait": "Synchronizace ... Čekejte prosím.", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "systemTheme": "Téma systému", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "Neshodují se", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "Shodují se", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "title": "FluffyChat", + "@title": { + "description": "Title for the application", + "type": "String", + "placeholders": {} + }, + "toggleFavorite": "Přepnout Oblíbené", + "@toggleFavorite": { + "type": "String", + "placeholders": {} + }, + "toggleMuted": "Přepnout ztlumené", + "@toggleMuted": { + "type": "String", + "placeholders": {} + }, + "toggleUnread": "Označit jako přečtené/nepřečtené", + "@toggleUnread": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "Příliš mnoho požadavků. Prosím zkuste to znovu později!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "transferFromAnotherDevice": "Přenos z jiného zařízení", + "@transferFromAnotherDevice": { + "type": "String", + "placeholders": {} + }, + "tryToSendAgain": "Zkuste odeslat znovu", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "unavailable": "Nedostupní", + "@unavailable": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username} zrušili zákaz pro {targetName}", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "unblockDevice": "Odblokovat zařízení", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "Neznámé zařízení", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "unknownEncryptionAlgorithm": "Neznámý šifrovací algoritmus", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unknownEvent": "Neznámá událost „{type}“", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "unmuteChat": "Zrušit ztlumení chatu", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "unpin": "Odepnout zprávu", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "unreadChats": "{unreadCount, plural, =1{1 nepřečtený chat} other{{unreadCount} nepřečtené chaty}}", + "@unreadChats": { + "type": "String", + "placeholders": { + "unreadCount": { + "type": "int" + } + } + }, + "userAndOthersAreTyping": "{username} a {count} dalších píší…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "userAndUserAreTyping": "{username} a {username2} píší…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userIsTyping": "{username} píše…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userLeftTheChat": "{username} opustili chat", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "username": "Uživatelské jméno", + "@username": { + "type": "String", + "placeholders": {} + }, + "userSentUnknownEvent": "{username} poslali událost {type}", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "verified": "Ověřeno", + "@verified": { + "type": "String", + "placeholders": {} + }, + "verify": "Ověřit", + "@verify": { + "type": "String", + "placeholders": {} + }, + "verifyStart": "Zahájit ověření", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "Ověření proběhlo úspěšně!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "verifyTitle": "Ověřuji druhý účet", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "videoCall": "Video hovor", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "Viditelnost historie chatu", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "Viditelné pro všechny účastnící se", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "Viditelné pro všechny", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "Hlasová zpráva", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "Čeká se na potvrzení žádosti partnerem…", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "Čeká se na potvrzení emoji partnerem…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "Čekání na partnera až přijme čísla…", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "wallpaper": "Pozadí:", + "@wallpaper": { + "type": "String", + "placeholders": {} + }, + "warning": "Varování!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "weSentYouAnEmail": "Zaslali jsme vám e-mail", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "whoCanPerformWhichAction": "Kdo může provést jakou akci", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "Kdo se může připojit do této skupiny", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "Proč to chcete nahlásit?", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "wipeChatBackup": "Chcete vymazat zálohu chatu a vytvořit nový bezpečnostní klíč?", + "@wipeChatBackup": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "S těmito adresami můžete obnovit své heslo.", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "Napište zprávu…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "yes": "Ano", + "@yes": { + "type": "String", + "placeholders": {} + }, + "you": "Vy", + "@you": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "Tohoto chatu se nadále neúčastníte", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "Byl vám zablokován přístup k tomuto chatu", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "yourPublicKey": "Váš veřejný klíč", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "chatHasBeenAddedToThisSpace": "Do tohoto prostoru byl přidán chat", + "@chatHasBeenAddedToThisSpace": {}, + "addToSpace": "Přidat do prostoru", + "@addToSpace": {}, + "scanQrCode": "Naskenujte QR kód", + "@scanQrCode": {}, + "sendOnEnter": "Odeslat při vstupu", + "@sendOnEnter": {}, + "homeserver": "Domácí server", + "@homeserver": {}, + "serverRequiresEmail": "Tento server potřebuje k registraci ověřit vaši e -mailovou adresu.", + "@serverRequiresEmail": {}, + "addToBundle": "Přidat do balíčku", + "@addToBundle": {}, + "addAccount": "Přidat účet", + "@addAccount": {}, + "bundleName": "Název balíčku", + "@bundleName": {}, + "link": "Odkaz", + "@link": {}, + "yourChatBackupHasBeenSetUp": "Vaše záloha chatu byla nastavena.", + "@yourChatBackupHasBeenSetUp": {}, + "editBundlesForAccount": "Upravit balíčky pro tento účet", + "@editBundlesForAccount": {}, + "enableMultiAccounts": "(BETA) Na tomto zařízení povolte více účtů", + "@enableMultiAccounts": {}, + "oneClientLoggedOut": "Jeden z vašich klientů byl odhlášen", + "@oneClientLoggedOut": {}, + "removeFromBundle": "Odstranit z tohoto balíčku", + "@removeFromBundle": {}, + "unverified": "Neověřeno", + "@unverified": {}, + "messageInfo": "Informace o zprávě", + "@messageInfo": {}, + "time": "Čas", + "@time": {}, + "messageType": "Typ zprávy", + "@messageType": {}, + "sender": "Odesílatel", + "@sender": {}, + "repeatPassword": "Zopakujte heslo", + "@repeatPassword": {}, + "openGallery": "Otevřít galerii", + "@openGallery": {}, + "addToSpaceDescription": "Vyberte umístění, do kterého chcete tento chat přidat.", + "@addToSpaceDescription": {}, + "start": "Start", + "@start": {}, + "removeFromSpace": "Odstranit z tohoto místa", + "@removeFromSpace": {}, + "commandHint_clearcache": "Vymazat mezipamět", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_discardsession": "Zahodit relaci", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "commandHint_dm": "Zahajte přímý chat\nK deaktivaci šifrování použijte --no-encryption", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "commandHint_create": "Vytvořte prázdný skupinový chat\n K deaktivaci šifrování použijte --no-encryption", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "openVideoCamera": "Otevřete fotoaparát pro video", + "@openVideoCamera": { + "type": "String", + "placeholders": {} + }, + "publish": "Uveřejnit", + "@publish": {}, + "videoWithSize": "Video ({size})", + "@videoWithSize": { + "type": "String", + "placeholders": { + "size": { + "type": "String" + } + } + }, + "markAsRead": "Označit jako přečtené", + "@markAsRead": {}, + "reportUser": "Nahlásit uživatele", + "@reportUser": {}, + "openChat": "Otevřete chat", + "@openChat": {}, + "dismiss": "Zavrhnout", + "@dismiss": {}, + "reactedWith": "{sender} reagoval s {reaction}", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "emojis": "Emojis", + "@emojis": {}, + "voiceCall": "Hlasový hovor", + "@voiceCall": {}, + "unsupportedAndroidVersion": "Nepodporovaná verze Androidu", + "@unsupportedAndroidVersion": {}, + "videoCallsBetaWarning": "Upozorňujeme, že videohovory jsou aktuálně ve verzi beta. Nemusí fungovat podle očekávání nebo fungovat vůbec na všech platformách.", + "@videoCallsBetaWarning": {}, + "placeCall": "Zavolejte", + "@placeCall": {}, + "emailOrUsername": "E-mail nebo uživatelské jméno", + "@emailOrUsername": {}, + "experimentalVideoCalls": "Experimentální videohovory", + "@experimentalVideoCalls": {}, + "unsupportedAndroidVersionLong": "Tato funkce vyžaduje novější verzi Android. Zkontrolujte prosím aktualizace nebo podporu Lineage OS.", + "@unsupportedAndroidVersionLong": {}, + "pinMessage": "Připnout zprávu do místnosti", + "@pinMessage": {}, + "confirmEventUnpin": "Opravdu chcete událost trvale odepnout?", + "@confirmEventUnpin": {}, + "separateChatTypes": "Odděĺlit přímé chaty, skupiny a prostory", + "@separateChatTypes": { + "type": "String", + "placeholders": {} + }, + "youKicked": "Vykopli jste uživatele {user}", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "switchToAccount": "Přepnout na účet {number}", + "@switchToAccount": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "previousAccount": "Předchozí účet", + "@previousAccount": {}, + "widgetJitsi": "Jitsi Meet", + "@widgetJitsi": {}, + "youAcceptedTheInvitation": "Přijal jsi pozvání", + "@youAcceptedTheInvitation": {}, + "youJoinedTheChat": "Připojili jste se k chatu", + "@youJoinedTheChat": {}, + "youInvitedBy": "Byli jste pozváni uživatelem {user}", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "nextAccount": "Další účet", + "@nextAccount": {}, + "addWidget": "Přidat widget", + "@addWidget": {}, + "widgetVideo": "Video", + "@widgetVideo": {}, + "widgetEtherpad": "Textová poznámka", + "@widgetEtherpad": {}, + "widgetName": "Jméno", + "@widgetName": {}, + "youBannedUser": "Zakázali jste uživatele {user}", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedUser": "Pozvali jste uživatele {user}", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKickedAndBanned": "Vykopli jste a zakázali jste uživatele {user}", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youUnbannedUser": "Zrušili jste zákaz uživateli {user}", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "widgetCustom": "Vlastní", + "@widgetCustom": {}, + "youRejectedTheInvitation": "Odmítli jste pozvání", + "@youRejectedTheInvitation": {}, + "youHaveWithdrawnTheInvitationFor": "Stáhli jste pozvánku pro uživatele {user}", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "widgetUrlError": "Toto není platná adresa URL.", + "@widgetUrlError": {}, + "widgetNameError": "Zadejte jméno pro zobrazení.", + "@widgetNameError": {}, + "errorAddingWidget": "Chyba při přidávání widgetu.", + "@errorAddingWidget": {}, + "disableEncryptionWarning": "Z bezpečnostních důvodů nemůžete vypnout šifrování v chatu, kde již bylo dříve zapnuto.", + "@disableEncryptionWarning": {}, + "confirmMatrixId": "Prosím, potvrďte vaše Matrix ID, abyste mohli smazat váš účet.", + "@confirmMatrixId": {}, + "commandHint_googly": "Poslat kroutící se očička", + "@commandHint_googly": {}, + "commandHint_cuddle": "Poslat mazlení", + "@commandHint_cuddle": {}, + "commandHint_hug": "Poslat obejmutí", + "@commandHint_hug": {}, + "hugContent": "{senderName} vás objímá", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "googlyEyesContent": "{senderName} vám posílá kroutící se očička", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "cuddleContent": "{senderName} se s vámi mazlí", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "notAnImage": "Není obrázek.", + "@notAnImage": {}, + "importNow": "Importovat nyní", + "@importNow": {}, + "redactedByBecause": "Smazáno uživatelem {username} s důvodem: \"{reason}\"", + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "storeInAndroidKeystore": "Uložit v Android KeyStore", + "@storeInAndroidKeystore": {}, + "dehydrateTorLong": "Uživatelům TOR se doporučuje exportovat sezení před zavřením okna.", + "@dehydrateTorLong": {}, + "numChats": "{number} konverzací", + "@numChats": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "dehydrate": "Exportovat sezení a promazat zařízení", + "@dehydrate": {}, + "newGroup": "Nová skupina", + "@newGroup": {}, + "hydrateTor": "TOR uživatelé: Import exportovaného sezení", + "@hydrateTor": {}, + "doNotShowAgain": "Nezobrazovat znovu", + "@doNotShowAgain": {}, + "commandHint_markasdm": "Označit jako místnost přímé konverzace s daným Matrix ID", + "@commandHint_markasdm": {}, + "recoveryKey": "Klíč k obnovení", + "@recoveryKey": {}, + "hydrateTorLong": "Exportovali jste vaše poslední sezení na TOR? Rychle jej importujte a pokračujte v konverzaci.", + "@hydrateTorLong": {}, + "hydrate": "Obnovit ze záložního souboru", + "@hydrate": {}, + "pleaseEnterRecoveryKey": "Prosím vložte váš klíč pro obnovení:", + "@pleaseEnterRecoveryKey": {}, + "createGroup": "Vytvořit skupinu", + "@createGroup": {}, + "shareInviteLink": "Sdílet pozvánku", + "@shareInviteLink": {}, + "pleaseEnterRecoveryKeyDescription": "K odemknutí vašich starých zpráv prosím vložte váš klíč k obnovení vygenerovaný v předchozím sezení. Váš klíč k obnovení NENÍ vaše heslo.", + "@pleaseEnterRecoveryKeyDescription": {}, + "setColorTheme": "Nastavit barvy:", + "@setColorTheme": {}, + "importEmojis": "Importovat Emoji", + "@importEmojis": {}, + "importFromZipFile": "Importovat ze .zip souboru", + "@importFromZipFile": {}, + "exportEmotePack": "Exportovat Emoji jako .zip", + "@exportEmotePack": {}, + "replace": "Nahradit", + "@replace": {}, + "users": "Uživatelé", + "@users": {}, + "storeInAppleKeyChain": "Uložit v Apple KeyChain", + "@storeInAppleKeyChain": {}, + "jumpToLastReadMessage": "Skočit na naposledy přečtenou zprávu", + "@jumpToLastReadMessage": {}, + "signInWithPassword": "Přihlásit se pomocí hesla", + "@signInWithPassword": {}, + "redactedBy": "Smazáno uživatelem {username}", + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "inviteContactToGroupQuestion": "Chcete pozvat {contact} do konverzace \"{groupName}\"?", + "@inviteContactToGroupQuestion": {}, + "dehydrateTor": "TOR uživatelé: Export sezení", + "@dehydrateTor": {}, + "tryAgain": "Zkuste to znovu", + "@tryAgain": {}, + "redactMessageDescription": "Tato zpráva bude smazána pro všechny účastníky konverzace. Tuto akci nelze vzít zpět.", + "@redactMessageDescription": {}, + "optionalRedactReason": "(Nepovinné) Důvod smazání této zprávy…", + "@optionalRedactReason": {}, + "messagesStyle": "Zprávy:", + "@messagesStyle": {}, + "allSpaces": "Všechny prostory", + "@allSpaces": {}, + "noOtherDevicesFound": "Žádná ostatní zařízení nebyla nalezena", + "@noOtherDevicesFound": {}, + "addChatDescription": "Přidejte popis konverzace", + "@addChatDescription": {}, + "chatDescription": "Popis konverzace", + "@chatDescription": {}, + "chatDescriptionHasBeenChanged": "Popis konverzace byl změněn", + "@chatDescriptionHasBeenChanged": {}, + "noChatDescriptionYet": "Zatím nebyl vytvořen žádný popis konverzace.", + "@noChatDescriptionYet": {}, + "invalidServerName": "Neplatné jméno serveru", + "@invalidServerName": {}, + "chatPermissions": "Oprávnění konverzace", + "@chatPermissions": {}, + "directChat": "Přímá konverzace", + "@directChat": {}, + "setChatDescription": "Nastavit popis konverzace", + "@setChatDescription": {}, + "startFirstChat": "Začněte svou první konverzaci", + "@startFirstChat": {}, + "callingPermissions": "Oprávnění volání", + "@callingPermissions": {}, + "whyIsThisMessageEncrypted": "Proč nelze přečíst tuto zprávu?", + "@whyIsThisMessageEncrypted": {}, + "wasDirectChatDisplayName": "Prázdná konverzace (dříve {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "newSpaceDescription": "Prostory umožňují organizovat vaše konverzace a vytvářet soukromé nebo veřejné komunity", + "@newSpaceDescription": {}, + "profileNotFound": "Uživatel nebyl na serveru nalezen. Možná je problém s připojením nebo uživatel neexistuje.", + "@profileNotFound": {}, + "setTheme": "Nastavit vzhled:", + "@setTheme": {}, + "sendTypingNotifications": "Posílat oznámení o psaní", + "@sendTypingNotifications": {}, + "commandHint_markasgroup": "Označit jako skupinu", + "@commandHint_markasgroup": {}, + "allRooms": "Všechny skupinové konverzace", + "@allRooms": { + "type": "String", + "placeholders": {} + }, + "recoveryKeyLost": "Ztracený klíč k obnovení?", + "@recoveryKeyLost": {}, + "unlockOldMessages": "Odemknout staré zprávy", + "@unlockOldMessages": {}, + "foregroundServiceRunning": "Toto oznámení se zobrazuje když běží služba na pozadí.", + "@foregroundServiceRunning": {}, + "screenSharingDetail": "Sdílíte svou obrazovku přes FluffyChat", + "@screenSharingDetail": {}, + "callingAccountDetails": "Opravňuje FluffyChat používat Android systémovou aplikaci pro vytáčení.", + "@callingAccountDetails": {}, + "appearOnTop": "Zobrazovat nahoře", + "@appearOnTop": {}, + "otherCallingPermissions": "Mikrofon, kamera a ostatní oprávnění FluffyChat", + "@otherCallingPermissions": {}, + "encryptThisChat": "Zašifrovat tuto konverzaci", + "@encryptThisChat": {}, + "sorryThatsNotPossible": "Omlouváme se… to není možné", + "@sorryThatsNotPossible": {}, + "deviceKeys": "Klíče zařízení:", + "@deviceKeys": {}, + "reopenChat": "Znovu otevřít konverzaci", + "@reopenChat": {}, + "fileIsTooBigForServer": "Server oznamuje že soubor je příliš velký na odeslání.", + "@fileIsTooBigForServer": {}, + "jump": "Skočit", + "@jump": {}, + "openLinkInBrowser": "Otevřít odkaz v prohlížeči", + "@openLinkInBrowser": {}, + "pleaseTryAgainLaterOrChooseDifferentServer": "Prosím zkuste to znovu nebo si vyberte jiný server.", + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "signInWith": "Přihlásit se pomocí {provider}", + "@signInWith": { + "type": "String", + "placeholders": { + "provider": { + "type": "String" + } + } + }, + "supposedMxid": "Tady by mělo být {mxid}", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "newSpace": "Nový prostor", + "@newSpace": {}, + "screenSharingTitle": "sdílení obrazovky", + "@screenSharingTitle": {}, + "user": "Uživatel", + "@user": {}, + "fileHasBeenSavedAt": "Soubor uložen do {path}", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "custom": "Vlastní", + "@custom": {}, + "dehydrateWarning": "Tuto akci nelze vzít zpět. Ujistěte se že záložní soubor máte bezpečně uložen.", + "@dehydrateWarning": {}, + "storeInSecureStorageDescription": "Klíč k obnovení uložte v zabezpečeném úložišti tohoto zařízení.", + "@storeInSecureStorageDescription": {}, + "saveKeyManuallyDescription": "Uložte tento klíč manuálně pomocí systémového dialogu sdílení nebo zkopírováním do schránky.", + "@saveKeyManuallyDescription": {}, + "storeSecurlyOnThisDevice": "Uložit bezpečně na tomto zařízení", + "@storeSecurlyOnThisDevice": {}, + "countFiles": "{count} souborů", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "emoteKeyboardNoRecents": "Naposledy použité emoce se zobrazí zde...", + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "appLockDescription": "Zamknout aplikaci pomocí PIN kódu když není používána", + "@appLockDescription": {}, + "globalChatId": "Globální ID chatu", + "@globalChatId": {}, + "accessAndVisibility": "Přístup a viditelnost", + "@accessAndVisibility": {}, + "calls": "Volání", + "@calls": {}, + "customEmojisAndStickers": "Vlastní emoji a nálepky", + "@customEmojisAndStickers": {}, + "accessAndVisibilityDescription": "Kdo se může připojit a najít tuto konverzaci.", + "@accessAndVisibilityDescription": {}, + "customEmojisAndStickersBody": "Přidat nebo sdílet vlastní emoji nebo nálepky, které mohou být použité v konverzaci.", + "@customEmojisAndStickersBody": {}, + "swipeRightToLeftToReply": "Potáhněte z prava do leva pro odpověď", + "@swipeRightToLeftToReply": {}, + "countChatsAndCountParticipants": "{chats} konverzaci a {participants} účastníci", + "@countChatsAndCountParticipants": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + }, + "participants": { + "type": "int" + } + } + }, + "noMoreChatsFound": "Žádné další konverzace nalezeny...", + "@noMoreChatsFound": {}, + "hideRedactedMessages": "Skrýt upravené zprávy", + "@hideRedactedMessages": {}, + "hideRedactedMessagesBody": "Pokud někdo zprávu zrediguje, nebude tato zpráva v chatu již viditelná.", + "@hideRedactedMessagesBody": {}, + "hideInvalidOrUnknownMessageFormats": "Skrytí nesprávných nebo neznámých formátů zpráv", + "@hideInvalidOrUnknownMessageFormats": {}, + "blockUsername": "Ignorovat uživatelské jméno", + "@blockUsername": {}, + "hideMemberChangesInPublicChats": "Skrýt změny členů ve veřejných chatech", + "@hideMemberChangesInPublicChats": {}, + "hideMemberChangesInPublicChatsBody": "Nezobrazovat na časové ose chatu, pokud se někdo připojí nebo opustí veřejný chat, aby se zlepšila čitelnost.", + "@hideMemberChangesInPublicChatsBody": {}, + "overview": "Přehled", + "@overview": {}, + "notifyMeFor": "Upozorněte mě na", + "@notifyMeFor": {}, + "passwordRecoverySettings": "Nastavení obnovení hesla", + "@passwordRecoverySettings": {}, + "presenceStyle": "Dostupnost:", + "@presenceStyle": { + "type": "String", + "placeholders": {} + }, + "block": "Blokovat", + "@block": {}, + "indexedDbErrorLong": "Ukládání zpráv bohužel není ve výchozím nastavení v soukromém režimu povoleno.\nNavštivte prosím\n - about:config\n - nastavte dom.indexedDB.privateBrowsing.enabled na true\nV opačném případě nebude možné FluffyChat spustit.", + "@indexedDbErrorLong": {}, + "youInvitedToBy": "📩 Prostřednictvím odkazu jste byli pozváni na:\n{alias}", + "@youInvitedToBy": { + "placeholders": { + "alias": { + "type": "String" + } + } + }, + "indexedDbErrorTitle": "Problémy privátního prostředí", + "@indexedDbErrorTitle": {}, + "blockListDescription": "Můžete blokovat uživatele, kteří vás obtěžují. Od uživatelů na vašem osobním seznamu blokovaných uživatelů nebudete moci přijímat žádné zprávy ani pozvánky do místnosti.", + "@blockListDescription": {}, + "blockedUsers": "Zablokování uživatelé", + "@blockedUsers": {}, + "alwaysUse24HourFormat": "Vypnuto", + "@alwaysUse24HourFormat": { + "description": "Set to true to always display time of day in 24 hour format." + }, + "noChatsFoundHere": "Nejsou zde žádné chaty. Začněte nový chat s někým, použitím níže uvedeného tlačítka. ⤵️", + "@noChatsFoundHere": {}, + "joinedChats": "Připojené chaty", + "@joinedChats": {}, + "unread": "Nepřečtené", + "@unread": {}, + "space": "Prostor", + "@space": {}, + "spaces": "Prostory", + "@spaces": {}, + "presencesToggle": "Zobrazení stavových zpráv od jiných uživatelů", + "@presencesToggle": { + "type": "String", + "placeholders": {} + }, + "aboutHomeserver": "O {homeserver}", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + } +} diff --git a/assets/l10n/intl_de.arb b/assets/l10n/intl_de.arb new file mode 100644 index 0000000..8fddf64 --- /dev/null +++ b/assets/l10n/intl_de.arb @@ -0,0 +1,3293 @@ +{ + "@@locale": "de", + "@@last_modified": "2021-08-14 12:41:10.119255", + "alwaysUse24HourFormat": "true", + "@alwaysUse24HourFormat": { + "description": "Set to true to always display time of day in 24 hour format." + }, + "about": "Über", + "@about": { + "type": "String", + "placeholders": {} + }, + "accept": "Annehmen", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 {username} hat die Einladung angenommen", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "Konto", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐 {username} hat Ende-zu-Ende Verschlüsselung aktiviert", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "addEmail": "E-Mail hinzufügen", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "admin": "Admin", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "Alias", + "@alias": { + "type": "String", + "placeholders": {} + }, + "all": "Alle", + "@all": { + "type": "String", + "placeholders": {} + }, + "allChats": "Alle Chats", + "@allChats": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "{senderName} hat den Anruf angenommen", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "Jeder darf beitreten", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "appLock": "Anwendungssperre", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "archive": "Archiv", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "Dürfen Gäste beitreten", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "Bist du sicher?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "areYouSureYouWantToLogout": "Willst du dich wirklich abmelden?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "Bitte gib, um die andere Person signieren zu können, dein Sicherheitsschlüssel oder Wiederherstellungsschlüssel ein.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "Diese Bestätigungsanfrage von {username} annehmen?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "badServerLoginTypesException": "Der Homeserver unterstützt diese Anmelde-Typen:\n{serverVersions}\nAber diese App unterstützt nur:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "badServerVersionsException": "Der Homeserver unterstützt die Spec-Versionen:\n{serverVersions}\nAber diese App unterstützt nur:\n{supportedVersions}", + "@badServerVersionsException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "banFromChat": "Aus dem Chat verbannen", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "Verbannt", + "@banned": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username} hat {targetName} verbannt", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "Blockiere Gerät", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "blocked": "Blockiert", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "botMessages": "Bot-Nachrichten", + "@botMessages": { + "type": "String", + "placeholders": {} + }, + "cancel": "Abbrechen", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "cantOpenUri": "Die URI {uri} kann nicht geöffnet werden", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "changeDeviceName": "Gerätenamen ändern", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "{username} hat den Chat-Avatar geändert", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatDescriptionTo": "{username} hat die Chatbeschreibung geändert in: '{description}'", + "@changedTheChatDescriptionTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "description": { + "type": "String" + } + } + }, + "changedTheChatNameTo": "{username} hat den Chatnamen geändert in: '{chatname}'", + "@changedTheChatNameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "chatname": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username} hat die Chat-Berechtigungen geändert", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username} hat den Spitznamen geändert in: '{displayname}'", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} hat die Zugangsregeln für Gäste geändert", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} hat die Zugangsregeln für Gäste geändert zu: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username} hat die Sichtbarkeit des Chat-Verlaufs geändert", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username} hat die Sichtbarkeit des Chat-Verlaufs geändert zu: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username} hat die Zugangsregeln geändert", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} hat die Zugangsregeln geändert zu: {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} hat das Profilbild geändert", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "{username} hat die Raum-Aliasse geändert", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username} hat den Einladungslink geändert", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changePassword": "Passwort ändern", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "Anderen Homeserver verwenden", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "Ändere Deinen Style", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "Gruppenname ändern", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "changeYourAvatar": "Deinen Avatar ändern", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "Die Verschlüsselung wurde korrumpiert", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "chat": "Chat", + "@chat": { + "type": "String", + "placeholders": {} + }, + "chatBackup": "Chat-Backup", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "chatBackupDescription": "Deine alten Nachrichten sind mit einem Wiederherstellungsschlüssel gesichert. Bitte stellen sicher, dass du ihn nicht verlierst.", + "@chatBackupDescription": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Chatdetails", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chats": "Chats", + "@chats": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "Wähle ein sicheres Passwort", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "clearArchive": "Archiv leeren", + "@clearArchive": {}, + "close": "Schließen", + "@close": { + "type": "String", + "placeholders": {} + }, + "commandHint_ban": "Banne ausgewählten Benutzer aus diesen Raum", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_html": "Sende HTML-formatierten Text", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_invite": "Lade den Benutzer in diesen Raum ein", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "commandHint_join": "Betritt den ausgewählten Raum", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_kick": "Entferne den übergebenen Benutzer aus diesem Raum", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_leave": "Diesen Raum verlassen", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_me": "Beschreibe dich selbst", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "commandHint_myroomavatar": "Setze dein Profilbild nur für diesen Raum (MXC-Uri)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_myroomnick": "Setze deinen Anzeigenamen nur für diesen Raum", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "commandHint_op": "Setze den übergeben Powerlevel des Benutzers (Standard: 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_plain": "Sende unformatierten Text", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_react": "Sende die Antwort als Reaction", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "commandHint_send": "Text senden", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "commandHint_unban": "Hebe die Verbannung dieses Benutzers in diesem Raum auf", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "commandInvalid": "Befehl ungültig", + "@commandInvalid": { + "type": "String" + }, + "commandMissing": "{command} ist kein Befehl.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "compareEmojiMatch": "Bitte vergleiche die Emojis", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "Bitte vergleiche die Zahlen", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "configureChat": "Chat konfigurieren", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "confirm": "Bestätigen", + "@confirm": { + "type": "String", + "placeholders": {} + }, + "connect": "Verbinden", + "@connect": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "Kontakt wurde in die Gruppe eingeladen", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "containsDisplayName": "Enthält Anzeigenamen", + "@containsDisplayName": { + "type": "String", + "placeholders": {} + }, + "containsUserName": "Enthält Benutzernamen", + "@containsUserName": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "Der Inhalt wurde den Serveradministratoren gemeldet", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "Wurde in die Zwischenablage kopiert", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "Kopieren", + "@copy": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "In Zwischenablage kopieren", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "Nachricht konnte nicht entschlüsselt werden: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "countParticipants": "{count} Mitglieder", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "create": "Erstellen", + "@create": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "💬 {username} hat den Chat erstellt", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "createNewSpace": "Neuer Space", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "currentlyActive": "Jetzt gerade online", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "Dunkel", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "dateWithoutYear": "{day}.{month}", + "@dateWithoutYear": { + "type": "String", + "placeholders": { + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "dateWithYear": "{day}.{month}.{year}", + "@dateWithYear": { + "type": "String", + "placeholders": { + "year": { + "type": "String" + }, + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "deactivateAccountWarning": "Dies deaktiviert dein Konto. Es kann nicht rückgängig gemacht werden! Bist du sicher?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "Standardberechtigungsstufe für neue Benutzer", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "delete": "Löschen", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "Konto löschen", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "Nachricht löschen", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "device": "Gerät", + "@device": { + "type": "String", + "placeholders": {} + }, + "deviceId": "Geräte-ID", + "@deviceId": { + "type": "String", + "placeholders": {} + }, + "devices": "Geräte", + "@devices": { + "type": "String", + "placeholders": {} + }, + "directChats": "Direkte Chats", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "Anzeigename wurde geändert", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "Datei herunterladen", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "edit": "Bearbeiten", + "@edit": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "Blockierte Server einstellen", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "editDisplayname": "Anzeigename ändern", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "editRoomAliases": "Raum-Aliase bearbeiten", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "Raumavatar bearbeiten", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "Emoticon existiert bereits!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "Ungültiges Emoticon-Kürzel!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emotePacks": "Emoticon-Bündel für Raum", + "@emotePacks": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "Emoticon-Einstellungen", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "emoteShortcode": "Emoticon-Kürzel", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emoteWarnNeedToPick": "Wähle ein Emoticon-Kürzel und ein Bild!", + "@emoteWarnNeedToPick": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "Leerer Chat", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "Aktiviere Emoticon-Bündel global", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "Verschlüsselung anschalten", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "Du wirst die Verschlüsselung nicht mehr ausstellen können. Bist Du sicher?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "encrypted": "Verschlüsselt", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "encryption": "Verschlüsselung", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "Verschlüsselung ist nicht aktiviert", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName} hat den Anruf beendet", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "enterAnEmailAddress": "Gib eine E-Mail-Adresse ein", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "enterYourHomeserver": "Gib Deinen Homeserver ein", + "@enterYourHomeserver": { + "type": "String", + "placeholders": {} + }, + "errorObtainingLocation": "Fehler beim Suchen des Standortes: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "everythingReady": "Alles fertig!", + "@everythingReady": { + "type": "String", + "placeholders": {} + }, + "extremeOffensive": "Extrem beleidigend", + "@extremeOffensive": { + "type": "String", + "placeholders": {} + }, + "fileName": "Dateiname", + "@fileName": { + "type": "String", + "placeholders": {} + }, + "fluffychat": "Extera", + "@fluffychat": { + "type": "String", + "placeholders": {} + }, + "fontSize": "Schriftgröße", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "forward": "Weiterleiten", + "@forward": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "Ab dem Beitritt", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "Ab der Einladung", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "goToTheNewRoom": "Zum neuen Raum wechseln", + "@goToTheNewRoom": { + "type": "String", + "placeholders": {} + }, + "group": "Gruppe", + "@group": { + "type": "String", + "placeholders": {} + }, + "groupIsPublic": "Öffentliche Gruppe", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "groups": "Gruppen", + "@groups": { + "type": "String", + "placeholders": {} + }, + "groupWith": "Gruppe mit {displayname}", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "guestsAreForbidden": "Gäste sind verboten", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "Gäste dürfen beitreten", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{username} hat die Einladung für {targetName} zurückgezogen", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "help": "Hilfe", + "@help": { + "type": "String", + "placeholders": {} + }, + "hideRedactedEvents": "Gelöschte Nachrichten ausblenden", + "@hideRedactedEvents": { + "type": "String", + "placeholders": {} + }, + "hideUnknownEvents": "Unbekannte Ereignisse ausblenden", + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "howOffensiveIsThisContent": "Wie beleidigend ist dieser Inhalt?", + "@howOffensiveIsThisContent": { + "type": "String", + "placeholders": {} + }, + "id": "ID", + "@id": { + "type": "String", + "placeholders": {} + }, + "identity": "Identität", + "@identity": { + "type": "String", + "placeholders": {} + }, + "ignore": "Ignorieren", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "ignoredUsers": "Ignorierte Personen", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "iHaveClickedOnLink": "Ich habe den Link angeklickt", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "Falsches Passwort oder Wiederherstellungsschlüssel", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "inoffensive": "Harmlos", + "@inoffensive": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "Kontakt einladen", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "Kontakt in die Gruppe {groupName} einladen", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "invited": "Eingeladen", + "@invited": { + "type": "String", + "placeholders": {} + }, + "invitedUser": "📩 {username} hat {targetName} eingeladen", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "invitedUsersOnly": "Nur eingeladene Mitglieder", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "inviteForMe": "Einladung für mich", + "@inviteForMe": { + "type": "String", + "placeholders": {} + }, + "inviteText": "{username} hat Dich zu Extera eingeladen. \n1. Gehe auf fluffychat.im und installiere die App \n2. Melde Dich in der App an \n3. Öffne den Einladungslink: \n {link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "isTyping": "schreibt …", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "👋 {username} ist dem Chat beigetreten", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "joinRoom": "Raum beitreten", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "kicked": "👞 {username} hat {targetName} hinausgeworfen", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickedAndBanned": "🙅 {username} hat {targetName} hinausgeworfen und verbannt", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickFromChat": "Aus dem Chat hinauswerfen", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "Zuletzt aktiv: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "leave": "Verlassen", + "@leave": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "Hat den Chat verlassen", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "license": "Lizenz", + "@license": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "Hell", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "{count} weitere Mitglieder laden", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "loadingPleaseWait": "Lade … Bitte warten.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "loadMore": "Mehr laden …", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "locationDisabledNotice": "Standort ist deaktiviert. Bitte aktivieren, um den Standort teilen zu können.", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "locationPermissionDeniedNotice": "Standort-Berechtigung wurde abgelehnt. Bitte akzeptieren, um den Standort teilen zu können.", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "login": "Anmelden", + "@login": { + "type": "String", + "placeholders": {} + }, + "logInTo": "Bei {homeserver} anmelden", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "logout": "Abmelden", + "@logout": { + "type": "String", + "placeholders": {} + }, + "memberChanges": "Änderungen der Mitglieder", + "@memberChanges": { + "type": "String", + "placeholders": {} + }, + "mention": "Erwähnen", + "@mention": { + "type": "String", + "placeholders": {} + }, + "messages": "Nachrichten", + "@messages": { + "type": "String", + "placeholders": {} + }, + "moderator": "Moderator", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "muteChat": "Stummschalten", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "needPantalaimonWarning": "Bitte beachte, dass du Pantalaimon brauchst, um Ende-zu-Ende-Verschlüsselung benutzen zu können.", + "@needPantalaimonWarning": { + "type": "String", + "placeholders": {} + }, + "newChat": "Neuer Chat", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "💬 Neue Nachricht in Extera", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "Neue Verifikationsanfrage!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "next": "Weiter", + "@next": { + "type": "String", + "placeholders": {} + }, + "no": "Nein", + "@no": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "Keine Verbindung zum Server", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "Keine Emoticons gefunden. 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "Du kannst die Verschlüsselung erst aktivieren, sobald dieser Raum nicht mehr öffentlich zugänglich ist.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "Firebase Cloud Messaging scheint auf deinem Gerät nicht verfügbar zu sein. Um trotzdem Push-Benachrichtigungen zu erhalten, empfehlen wir die Installation von ntfy. Mit ntfy oder einem anderen Unified-Push-Anbieter kannst du Push-Benachrichtigungen datensicher empfangen. Du kannst ntfy im PlayStore oder bei F-Droid herunterladen.", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "none": "Keiner", + "@none": { + "type": "String", + "placeholders": {} + }, + "noPasswordRecoveryDescription": "Du hast bisher keine Möglichkeit hinzugefügt, um dein Passwort zurückzusetzen.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "noPermission": "Keine Berechtigung", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "Keine Räume gefunden …", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "notifications": "Benachrichtigungen", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "notificationsEnabledForThisAccount": "Benachrichtigungen für dieses Konto aktiviert", + "@notificationsEnabledForThisAccount": { + "type": "String", + "placeholders": {} + }, + "numUsersTyping": "{count} Mitglieder schreiben …", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "obtainingLocation": "Standort wird ermittelt …", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "offensive": "Beleidigend", + "@offensive": { + "type": "String", + "placeholders": {} + }, + "offline": "Offline", + "@offline": { + "type": "String", + "placeholders": {} + }, + "ok": "Ok", + "@ok": { + "type": "String", + "placeholders": {} + }, + "online": "Online", + "@online": { + "type": "String", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "Online-Schlüsselsicherung ist aktiviert", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "oopsPushError": "Hoppla! Leider ist beim Einrichten der Push-Benachrichtigungen ein Fehler aufgetreten.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "Hoppla, da ist etwas schiefgelaufen…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "App öffnen, um Nachrichten zu lesen", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "openCamera": "Kamera öffnen", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "openInMaps": "In Maps öffnen", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "or": "Oder", + "@or": { + "type": "String", + "placeholders": {} + }, + "participant": "Mitglied", + "@participant": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "Passwort oder Wiederherstellungsschlüssel", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "password": "Passwort", + "@password": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "Passwort vergessen", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "Passwort wurde geändert", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "passwordRecovery": "Passwort wiederherstellen", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "people": "Personen", + "@people": { + "type": "String", + "placeholders": {} + }, + "pickImage": "Bild wählen", + "@pickImage": { + "type": "String", + "placeholders": {} + }, + "pin": "Anpinnen", + "@pin": { + "type": "String", + "placeholders": {} + }, + "play": "{fileName} abspielen", + "@play": { + "type": "String", + "placeholders": { + "fileName": { + "type": "String" + } + } + }, + "pleaseChoose": "Bitte wählen", + "@pleaseChoose": { + "type": "String", + "placeholders": {} + }, + "pleaseChooseAPasscode": "Bitte einen Code festlegen", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "pleaseClickOnLink": "Bitte auf den Link in der E-Mail klicken und dann fortfahren.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "pleaseEnter4Digits": "Bitte 4 Ziffern eingeben oder leer lassen, um die Anwendungssperre zu deaktivieren.", + "@pleaseEnter4Digits": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPassword": "Bitte dein Passwort eingeben", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPin": "Bitte gib deine Pin ein", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "Bitte deinen Benutzernamen eingeben", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "Bitte folge den Anweisungen auf der Website und tippe auf Weiter.", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "privacy": "Privatsphäre", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "Öffentliche Räume", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "pushRules": "Push-Regeln", + "@pushRules": { + "type": "String", + "placeholders": {} + }, + "reason": "Grund", + "@reason": { + "type": "String", + "placeholders": {} + }, + "recording": "Aufnahme", + "@recording": { + "type": "String", + "placeholders": {} + }, + "redactedAnEvent": "{username} hat ein Ereignis gelöscht", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "redactMessage": "Nachricht löschen", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "register": "Registrieren", + "@register": { + "type": "String", + "placeholders": {} + }, + "reject": "Ablehnen", + "@reject": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "{username} hat die Einladung abgelehnt", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "rejoin": "Wieder beitreten", + "@rejoin": { + "type": "String", + "placeholders": {} + }, + "remove": "Entfernen", + "@remove": { + "type": "String", + "placeholders": {} + }, + "removeAllOtherDevices": "Alle anderen Geräte entfernen", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "removedBy": "Entfernt von {username}", + "@removedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "removeDevice": "Gerät entfernen", + "@removeDevice": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "Verbannung aufheben", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "removeYourAvatar": "Deinen Avatar löschen", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "renderRichContent": "Zeige Nachrichtenformatierungen an", + "@renderRichContent": { + "type": "String", + "placeholders": {} + }, + "replaceRoomWithNewerVersion": "Raum mit neuer Version ersetzen", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "reply": "Antworten", + "@reply": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "Nachricht melden", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "requestPermission": "Berechtigung anfragen", + "@requestPermission": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "Der Raum wurde ge-upgraded", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "Raumversion", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "saveFile": "Datei speichern", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "search": "Suchen", + "@search": { + "type": "String", + "placeholders": {} + }, + "security": "Sicherheit", + "@security": { + "type": "String", + "placeholders": {} + }, + "seenByUser": "Gelesen von {username}", + "@seenByUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "send": "Senden", + "@send": { + "type": "String", + "placeholders": {} + }, + "sendAMessage": "Nachricht schreiben", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "sendAsText": "Sende als Text", + "@sendAsText": { + "type": "String" + }, + "sendAudio": "Sende Audiodatei", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendFile": "Datei senden", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendImage": "Bild senden", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendMessages": "Nachrichten senden", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "sendOriginal": "Sende Original", + "@sendOriginal": { + "type": "String", + "placeholders": {} + }, + "sendSticker": "Sticker senden", + "@sendSticker": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "Sende Video", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "sentAFile": "📁 {username} hat eine Datei gesendet", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAnAudio": "🎤 {username} hat eine Audio-Datei gesendet", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAPicture": "🖼️ {username} hat ein Bild gesendet", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentASticker": "😊 {username} hat einen Sticker gesendet", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "🎥 {username} hat ein Video gesendet", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentCallInformations": "{senderName} hat Anrufinformationen geschickt", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "setAsCanonicalAlias": "Als Haupt-Alias festlegen", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "setCustomEmotes": "Eigene Emoticons einstellen", + "@setCustomEmotes": { + "type": "String", + "placeholders": {} + }, + "setInvitationLink": "Einladungslink festlegen", + "@setInvitationLink": { + "type": "String", + "placeholders": {} + }, + "setPermissionsLevel": "Berechtigungsstufe einstellen", + "@setPermissionsLevel": { + "type": "String", + "placeholders": {} + }, + "setStatus": "Status ändern", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "settings": "Einstellungen", + "@settings": { + "type": "String", + "placeholders": {} + }, + "share": "Teilen", + "@share": { + "type": "String", + "placeholders": {} + }, + "sharedTheLocation": "{username} hat den Standort geteilt", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "shareLocation": "Standort teilen", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "showPassword": "Passwort anzeigen", + "@showPassword": { + "type": "String", + "placeholders": {} + }, + "singlesignon": "Einmalige Anmeldung", + "@singlesignon": { + "type": "String", + "placeholders": {} + }, + "skip": "Überspringe", + "@skip": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "Quellcode", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "spaceIsPublic": "Space ist öffentlich", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "spaceName": "Space-Name", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "startedACall": "{senderName} hat einen Anruf getätigt", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "status": "Status", + "@status": { + "type": "String", + "placeholders": {} + }, + "statusExampleMessage": "Wie geht es dir heute?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "submit": "Absenden", + "@submit": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWait": "Synchronisiere... Bitte warten.", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "systemTheme": "System", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "Stimmen nicht überein", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "Stimmen überein", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "title": "Extera", + "@title": { + "description": "Title for the application", + "type": "String", + "placeholders": {} + }, + "toggleFavorite": "Favorite umschalten", + "@toggleFavorite": { + "type": "String", + "placeholders": {} + }, + "toggleMuted": "Stummgeschaltete umschalten", + "@toggleMuted": { + "type": "String", + "placeholders": {} + }, + "toggleUnread": "Markieren als gelesen/ungelesen", + "@toggleUnread": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "Zu viele Anfragen. Bitte versuche es später noch einmal!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "transferFromAnotherDevice": "Von anderem Gerät übertragen", + "@transferFromAnotherDevice": { + "type": "String", + "placeholders": {} + }, + "tryToSendAgain": "Noch mal versuchen zu senden", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "unavailable": "Nicht verfügbar", + "@unavailable": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username} hat die Verbannung von {targetName} aufgehoben", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "unblockDevice": "Geräteblockierung aufheben", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "Unbekanntes Gerät", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "unknownEncryptionAlgorithm": "Unbekannter Verschlüsselungsalgorithmus", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unknownEvent": "Unbekanntes Ereignis '{type}'", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "unmuteChat": "Stumm aus", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "unpin": "Nicht mehr anpinnen", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "unreadChats": "{unreadCount, plural, =1{1 ungelesene Unterhaltung} other{{unreadCount} ungelesene Unterhaltungen}}", + "@unreadChats": { + "type": "String", + "placeholders": { + "unreadCount": { + "type": "int" + } + } + }, + "userAndOthersAreTyping": "{username} und {count} andere schreiben …", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "userAndUserAreTyping": "{username} und {username2} schreiben …", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userIsTyping": "{username} schreibt …", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userLeftTheChat": "🚪 {username} hat den Chat verlassen", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "username": "Benutzername", + "@username": { + "type": "String", + "placeholders": {} + }, + "userSentUnknownEvent": "{username} hat ein {type}-Ereignis gesendet", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "verified": "Verifiziert", + "@verified": { + "type": "String", + "placeholders": {} + }, + "verify": "Verifizieren", + "@verify": { + "type": "String", + "placeholders": {} + }, + "verifyStart": "Starte Verifikation", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "Erfolgreich verifiziert!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "verifyTitle": "Anderes Konto wird verifiziert", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "videoCall": "Videoanruf", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "Sichtbarkeit des Chat-Verlaufs", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "Sichtbar für alle Mitglieder", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "Für jeden sichtbar", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "Sprachnachricht", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "Warte darauf, dass der Partner die Anfrage annimmt …", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "Warte darauf, dass der Partner die Emoji annimmt …", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "Warten, dass der Partner die Zahlen annimmt …", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "wallpaper": "Hintergrund:", + "@wallpaper": { + "type": "String", + "placeholders": {} + }, + "warning": "Achtung!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "weSentYouAnEmail": "Wir haben dir eine E-Mail gesendet", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "whoCanPerformWhichAction": "Wer kann welche Aktion ausführen", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "Wer darf der Gruppe beitreten", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "Warum willst du dies melden?", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "wipeChatBackup": "Den Chat-Backup löschen, um einen neuen Wiederherstellungsschlüssel zu erstellen?", + "@wipeChatBackup": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "Mit diesen Adressen kannst du dein Passwort wiederherstellen, wenn du es vergessen hast.", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "Schreibe eine Nachricht …", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "yes": "Ja", + "@yes": { + "type": "String", + "placeholders": {} + }, + "you": "Du", + "@you": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "Du bist kein Mitglied mehr in diesem Chat", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "Du wurdest aus dem Chat verbannt", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "yourPublicKey": "Dein öffentlicher Schlüssel", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "noMatrixServer": "{server1} ist kein Matrix-Server, stattdessen {server2} benutzen?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "scanQrCode": "QR-Code scannen", + "@scanQrCode": {}, + "chatHasBeenAddedToThisSpace": "Chat wurde zum Space hinzugefügt", + "@chatHasBeenAddedToThisSpace": {}, + "autoplayImages": "Animierte Sticker und Emotes automatisch abspielen", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "addToSpace": "Zum Space hinzufügen", + "@addToSpace": {}, + "serverRequiresEmail": "Dieser Server muss deine E-Mail-Adresse für die Registrierung überprüfen.", + "@serverRequiresEmail": {}, + "enableMultiAccounts": "(BETA) Aktiviere Multi-Accounts für dieses Gerät", + "@enableMultiAccounts": {}, + "bundleName": "Name des Bundles", + "@bundleName": {}, + "removeFromBundle": "Von diesem Bundle entfernen", + "@removeFromBundle": {}, + "addToBundle": "Zu einem Bundle hinzufügen", + "@addToBundle": {}, + "editBundlesForAccount": "Bundles für dieses Konto bearbeiten", + "@editBundlesForAccount": {}, + "addAccount": "Konto hinzufügen", + "@addAccount": {}, + "oneClientLoggedOut": "Einer deiner Clients wurde abgemeldet", + "@oneClientLoggedOut": {}, + "homeserver": "Homeserver", + "@homeserver": {}, + "sendOnEnter": "Senden mit Enter", + "@sendOnEnter": {}, + "link": "Link", + "@link": {}, + "yourChatBackupHasBeenSetUp": "Dein Chat-Backup wurde eingerichtet.", + "@yourChatBackupHasBeenSetUp": {}, + "unverified": "Unverifiziert", + "@unverified": {}, + "messageInfo": "Nachrichten-Info", + "@messageInfo": {}, + "time": "Zeit", + "@time": {}, + "messageType": "Nachrichtentyp", + "@messageType": {}, + "sender": "Absender:in", + "@sender": {}, + "openGallery": "Galerie öffnen", + "@openGallery": {}, + "removeFromSpace": "Aus dem Space entfernen", + "@removeFromSpace": {}, + "addToSpaceDescription": "Wähle einen Space aus, um diesen Chat hinzuzufügen.", + "@addToSpaceDescription": {}, + "start": "Start", + "@start": {}, + "repeatPassword": "Passwort wiederholen", + "@repeatPassword": {}, + "commandHint_dm": "Starte einen direkten Chat\nBenutze --no-encryption, um die Verschlüsselung auszuschalten", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "commandHint_discardsession": "Sitzung verwerfen", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "commandHint_clearcache": "Zwischenspeicher löschen", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_create": "Erstelle ein leeren Gruppenchat\nBenutze --no-encryption, um die Verschlüsselung auszuschalten", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "openVideoCamera": "Video aufnehmen", + "@openVideoCamera": { + "type": "String", + "placeholders": {} + }, + "videoWithSize": "Video ({size})", + "@videoWithSize": { + "type": "String", + "placeholders": { + "size": { + "type": "String" + } + } + }, + "publish": "Veröffentlichen", + "@publish": {}, + "pinMessage": "An Raum anheften", + "@pinMessage": {}, + "emojis": "Emojis", + "@emojis": {}, + "placeCall": "Anruf tätigen", + "@placeCall": {}, + "voiceCall": "Sprachanruf", + "@voiceCall": {}, + "unsupportedAndroidVersion": "Nicht unterstützte Android-Version", + "@unsupportedAndroidVersion": {}, + "videoCallsBetaWarning": "Bitte beachte, dass sich Videoanrufe derzeit in der Beta-Phase befinden. Sie funktionieren möglicherweise nicht wie erwartet oder überhaupt nicht auf allen Plattformen.", + "@videoCallsBetaWarning": {}, + "emailOrUsername": "E-Mail oder Benutzername", + "@emailOrUsername": {}, + "unsupportedAndroidVersionLong": "Diese Funktion erfordert eine neuere Android-Version. Bitte suche nach Updates oder prüfe die Lineage-OS-Unterstützung.", + "@unsupportedAndroidVersionLong": {}, + "experimentalVideoCalls": "Experimentelle Videoanrufe", + "@experimentalVideoCalls": {}, + "reactedWith": "{sender} reagierte mit {reaction}", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "markAsRead": "Als gelesen markiert", + "@markAsRead": {}, + "reportUser": "Benutzer melden", + "@reportUser": {}, + "openChat": "Chat öffnen", + "@openChat": {}, + "confirmEventUnpin": "Möchtest du das Ereignis wirklich dauerhaft lösen?", + "@confirmEventUnpin": {}, + "dismiss": "Verwerfen", + "@dismiss": {}, + "switchToAccount": "Zu Konto {number} wechseln", + "@switchToAccount": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "nextAccount": "Nächstes Konto", + "@nextAccount": {}, + "widgetJitsi": "Jitsi Meet", + "@widgetJitsi": {}, + "widgetCustom": "Angepasst", + "@widgetCustom": {}, + "widgetEtherpad": "Textnotiz", + "@widgetEtherpad": {}, + "addWidget": "Widget hinzufügen", + "@addWidget": {}, + "widgetVideo": "Video", + "@widgetVideo": {}, + "widgetName": "Name", + "@widgetName": {}, + "widgetUrlError": "Das ist keine gültige URL.", + "@widgetUrlError": {}, + "errorAddingWidget": "Fehler beim Hinzufügen des Widgets.", + "@errorAddingWidget": {}, + "previousAccount": "Vorheriges Konto", + "@previousAccount": {}, + "separateChatTypes": "Separate Direktchats und Gruppen", + "@separateChatTypes": { + "type": "String", + "placeholders": {} + }, + "widgetNameError": "Bitte gib einen Anzeigenamen an.", + "@widgetNameError": {}, + "youKicked": "👞 Du hast {user} rausgeworfen", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKickedAndBanned": "🙅 Du hast {user} rausgeworfen und verbannt", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youUnbannedUser": "Du hast die Verbannung von {user} rückgängig gemacht", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youRejectedTheInvitation": "Du hast die Einladung abgelehnt", + "@youRejectedTheInvitation": {}, + "youJoinedTheChat": "Du bist dem Chat beigetreten", + "@youJoinedTheChat": {}, + "youAcceptedTheInvitation": "👍 Du hast die Einladung angenommen", + "@youAcceptedTheInvitation": {}, + "youBannedUser": "Du hast den {user} verbannt", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youHaveWithdrawnTheInvitationFor": "Du hast die Einladung für {user} zurückgezogen", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedBy": "📩 Du wurdest von {user} eingeladen", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedUser": "📩 Du hast {user} eingeladen", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "recoveryKey": "Wiederherstellungs-Schlüssel", + "@recoveryKey": {}, + "recoveryKeyLost": "Wiederherstellungsschlüssel verloren?", + "@recoveryKeyLost": {}, + "user": "Benutzer", + "@user": {}, + "custom": "Benutzerdefiniert", + "@custom": {}, + "storeInAndroidKeystore": "Im Android KeyStore speichern", + "@storeInAndroidKeystore": {}, + "storeSecurlyOnThisDevice": "Auf diesem Gerät sicher speichern", + "@storeSecurlyOnThisDevice": {}, + "dehydrate": "Sitzung exportieren und Gerät löschen", + "@dehydrate": {}, + "dehydrateWarning": "Diese Aktion kann nicht rückgängig gemacht werden. Stelle sicher, dass du die Sicherungsdatei sicher aufbewahrst.", + "@dehydrateWarning": {}, + "dehydrateTor": "TOR-Benutzer: Sitzung exportieren", + "@dehydrateTor": {}, + "dehydrateTorLong": "Für TOR-Benutzer wird empfohlen, die Sitzung zu exportieren, bevor das Fenster geschlossen wird.", + "@dehydrateTorLong": {}, + "hydrateTor": "TOR-Benutzer: Session-Export importieren", + "@hydrateTor": {}, + "hydrate": "Aus Sicherungsdatei wiederherstellen", + "@hydrate": {}, + "indexedDbErrorTitle": "Probleme im Privatmodus", + "@indexedDbErrorTitle": {}, + "unlockOldMessages": "Entsperre alte Nachrichten", + "@unlockOldMessages": {}, + "pleaseEnterRecoveryKeyDescription": "Um deine alten Nachrichten zu entsperren, gib bitte den Wiederherstellungsschlüssel ein, der in einer früheren Sitzung generiert wurde. Dein Wiederherstellungsschlüssel ist NICHT dein Passwort.", + "@pleaseEnterRecoveryKeyDescription": {}, + "saveKeyManuallyDescription": "Speicher diesen Schlüssel manuell, indem du den Systemfreigabedialog oder die Zwischenablage auslöst.", + "@saveKeyManuallyDescription": {}, + "hydrateTorLong": "Hast du deine Sitzung das letzte Mal auf TOR exportiert? Importiere sie schnell und chatte weiter.", + "@hydrateTorLong": {}, + "pleaseEnterRecoveryKey": "Bitte gib deinen Wiederherstellungsschlüssel ein:", + "@pleaseEnterRecoveryKey": {}, + "countFiles": "{count} Dateien", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "users": "Benutzer", + "@users": {}, + "storeInSecureStorageDescription": "Speicher den Wiederherstellungsschlüssel im sicheren Speicher dieses Geräts.", + "@storeInSecureStorageDescription": {}, + "storeInAppleKeyChain": "Im Apple KeyChain speichern", + "@storeInAppleKeyChain": {}, + "indexedDbErrorLong": "Die Nachrichtenspeicherung ist im privaten Modus standardmäßig leider nicht aktiviert.\nBitte besuche\n- about:config\n- Setze dom.indexedDB.privateBrowsing.enabled auf true\nAndernfalls ist es nicht möglich, Extera auszuführen.", + "@indexedDbErrorLong": {}, + "confirmMatrixId": "Bitte bestätigen deine Matrix-ID, um dein Konto zu löschen.", + "@confirmMatrixId": {}, + "supposedMxid": "das sollte sein {mxid}", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "commandHint_markasdm": "Als Direktnachrichtenraum für die angegebene Matrix-ID markieren", + "@commandHint_markasdm": {}, + "commandHint_markasgroup": "Als Gruppe markieren", + "@commandHint_markasgroup": {}, + "hideUnimportantStateEvents": "Blende unwichtige Zustandsereignisse aus", + "@hideUnimportantStateEvents": {}, + "doNotShowAgain": "Nicht mehr anzeigen", + "@doNotShowAgain": {}, + "appearOnTopDetails": "Ermöglicht, dass die App oben angezeigt wird (nicht erforderlich, wenn du Fluffychat bereits als Anrufkonto eingerichtet haben)", + "@appearOnTopDetails": {}, + "noKeyForThisMessage": "Dies kann passieren, wenn die Nachricht gesendet wurde, bevor du dich auf diesem Gerät bei deinem Konto angemeldet hast.\n\nEs ist auch möglich, dass der Absender dein Gerät blockiert hat oder etwas mit der Internetverbindung schief gelaufen ist.\n\nKannst du die Nachricht in einer anderen Sitzung lesen? Dann kannst du die Nachricht davon übertragen! Gehe zu den Einstellungen > Geräte und vergewissere dich, dass sich deine Geräte gegenseitig verifiziert haben. Wenn du den Raum das nächste Mal öffnest und beide Sitzungen im Vordergrund sind, werden die Schlüssel automatisch übertragen.\n\nDu möchtest die Schlüssel beim Abmelden oder Gerätewechsel nicht verlieren? Stelle sicher, dass du das Chat-Backup in den Einstellungen aktiviert hast.", + "@noKeyForThisMessage": {}, + "foregroundServiceRunning": "Diese Benachrichtigung wird angezeigt, wenn der Vordergrunddienst ausgeführt wird.", + "@foregroundServiceRunning": {}, + "screenSharingTitle": "Bildschirm teilen", + "@screenSharingTitle": {}, + "callingPermissions": "Anrufberechtigungen", + "@callingPermissions": {}, + "callingAccount": "Anrufkonto", + "@callingAccount": {}, + "callingAccountDetails": "Ermöglicht Extera, die native Android-Dialer-App zu verwenden.", + "@callingAccountDetails": {}, + "appearOnTop": "Oben erscheinen", + "@appearOnTop": {}, + "otherCallingPermissions": "Mikrofon, Kamera und andere Extera-Berechtigungen", + "@otherCallingPermissions": {}, + "whyIsThisMessageEncrypted": "Warum ist diese Nachricht nicht lesbar?", + "@whyIsThisMessageEncrypted": {}, + "newGroup": "Neue Gruppe", + "@newGroup": {}, + "newSpace": "Neuer Space", + "@newSpace": {}, + "enterSpace": "Raum betreten", + "@enterSpace": {}, + "enterRoom": "Raum betreten", + "@enterRoom": {}, + "allSpaces": "Alle Spaces", + "@allSpaces": {}, + "screenSharingDetail": "Du teilst deinen Bildschirm in FuffyChat", + "@screenSharingDetail": {}, + "numChats": "{number} Chats", + "@numChats": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "newSpaceDescription": "Mit Spaces kannst du deine Chats zusammenfassen und private oder öffentliche Communities aufbauen.", + "@newSpaceDescription": {}, + "wasDirectChatDisplayName": "Leerer Chat (war {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "encryptThisChat": "Diesen Chat verschlüsseln", + "@encryptThisChat": {}, + "googlyEyesContent": "{senderName} hat dir Googly Eyes gesendet", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "startFirstChat": "Starte deinen ersten Chat", + "@startFirstChat": {}, + "deviceKeys": "Geräteschlüssel:", + "@deviceKeys": {}, + "commandHint_cuddle": "Umarmung senden", + "@commandHint_cuddle": {}, + "commandHint_hug": "Umarmung senden", + "@commandHint_hug": {}, + "cuddleContent": "{senderName} knuddelt dich", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "sorryThatsNotPossible": "Sorry ... das ist nicht möglich", + "@sorryThatsNotPossible": {}, + "hugContent": "{senderName} umarmt dich", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "commandHint_googly": "Glupschaugen senden", + "@commandHint_googly": {}, + "disableEncryptionWarning": "Aus Sicherheitsgründen kannst du die Verschlüsselung in einem Chat nicht deaktivieren, wo sie zuvor aktiviert wurde.", + "@disableEncryptionWarning": {}, + "reopenChat": "Chat wieder eröffnen", + "@reopenChat": {}, + "noBackupWarning": "Achtung! Ohne Aktivierung des Chat-Backups verlierst du den Zugriff auf deine verschlüsselten Nachrichten. Vor dem Ausloggen wird dringend empfohlen, das Chat-Backup zu aktivieren.", + "@noBackupWarning": {}, + "noOtherDevicesFound": "Keine anderen Geräte anwesend", + "@noOtherDevicesFound": {}, + "allRooms": "Alle Gruppenchats", + "@allRooms": { + "type": "String", + "placeholders": {} + }, + "fileHasBeenSavedAt": "Datei wurde gespeichert unter {path}", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "jumpToLastReadMessage": "Zur letzten ungelesenen Nachricht", + "@jumpToLastReadMessage": {}, + "readUpToHere": "Bis hier gelesen", + "@readUpToHere": {}, + "pleaseTryAgainLaterOrChooseDifferentServer": "Bitte versuche es später noch einmal oder wähle einen anderen Server.", + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "jump": "Springen", + "@jump": {}, + "openLinkInBrowser": "Link im Browser öffnen", + "@openLinkInBrowser": {}, + "reportErrorDescription": "😭 Oh nein. Etwas ist schief gelaufen. Wenn du möchtest, kannst du den Bug bei den Entwicklern melden.", + "@reportErrorDescription": {}, + "report": "Melden", + "@report": {}, + "signInWithPassword": "Anmelden mit Passwort", + "@signInWithPassword": {}, + "signInWith": "Anmelden mit {provider}", + "@signInWith": { + "type": "String", + "placeholders": { + "provider": { + "type": "String" + } + } + }, + "importNow": "Jetzt importieren", + "@importNow": {}, + "importEmojis": "Emojis importieren", + "@importEmojis": {}, + "importFromZipFile": "Aus ZIP-Datei importieren", + "@importFromZipFile": {}, + "exportEmotePack": "Emote-Paket als ZIP-Datei exportieren", + "@exportEmotePack": {}, + "notAnImage": "Keine Bilddatei.", + "@notAnImage": {}, + "replace": "Ersetzen", + "@replace": {}, + "sendTypingNotifications": "Tippbenachrichtigungen senden", + "@sendTypingNotifications": {}, + "profileNotFound": "Der Benutzer konnte auf dem Server nicht gefunden werden. Vielleicht gibt es ein Verbindungsproblem oder der Benutzer existiert nicht.", + "@profileNotFound": {}, + "createGroup": "Gruppe erstellen", + "@createGroup": {}, + "shareInviteLink": "Einladungslink teilen", + "@shareInviteLink": {}, + "inviteContactToGroupQuestion": "Willst du {contact} zum Chat {groupName} einladen?", + "@inviteContactToGroupQuestion": {}, + "tryAgain": "Neuer Versuch", + "@tryAgain": {}, + "redactMessageDescription": "Die Nachricht wird für alle Teilnehmer dieses Gesprächs gelöscht. Dies kann nicht rückgängig gemacht werden.", + "@redactMessageDescription": {}, + "redactedBy": "Gelöscht von {username}", + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "redactedByBecause": "Gelöscht von {username} weil: \"{reason}\"", + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "setTheme": "Design festlegen:", + "@setTheme": {}, + "setColorTheme": "Farbdesign einstellen:", + "@setColorTheme": {}, + "invite": "Einladen", + "@invite": {}, + "optionalRedactReason": "(Optional) Grund für die Löschung dieser Nachricht...", + "@optionalRedactReason": {}, + "messagesStyle": "Nachrichten:", + "@messagesStyle": {}, + "chatPermissions": "Chatberechtigungen", + "@chatPermissions": {}, + "chatDescription": "Chatbeschreibung", + "@chatDescription": {}, + "chatDescriptionHasBeenChanged": "Chatbeschreibung geändert", + "@chatDescriptionHasBeenChanged": {}, + "noChatDescriptionYet": "Noch keine Chatbeschreibung vorhanden.", + "@noChatDescriptionYet": {}, + "invalidServerName": "Ungültiger Servername", + "@invalidServerName": {}, + "directChat": "Privater Chat", + "@directChat": {}, + "addChatDescription": "Chatbeschreibung hinzufügen ...", + "@addChatDescription": {}, + "setChatDescription": "Chatbeschreibung festlegen", + "@setChatDescription": {}, + "inviteGroupChat": "📨 Einladungen zum Gruppenchat", + "@inviteGroupChat": {}, + "invitePrivateChat": "📨 Einladungen zum privaten Chat", + "@invitePrivateChat": {}, + "invalidInput": "Ungültige Eingabe!", + "@invalidInput": {}, + "hasKnocked": "🚪 {user} hat angeklopft", + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "wrongPinEntered": "Falsche PIN eingegeben! Bitte in {seconds} Sekunden erneut versuchen ...", + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "pleaseEnterANumber": "Bitte eine Zahl größer 0 eingeben", + "@pleaseEnterANumber": {}, + "emoteKeyboardNoRecents": "Kürzlich verwendete Emotes werden hier angezeigt ...", + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "banUserDescription": "Der Benutzer wird aus dem Chat gebannt und kann den Chat erst wieder betreten, wenn die Verbannung aufgehoben wird.", + "@banUserDescription": {}, + "removeDevicesDescription": "Du wirst von diesem Gerät abgemeldet und kannst dann dort keine Nachrichten mehr empfangen.", + "@removeDevicesDescription": {}, + "unbanUserDescription": "Der Benutzer kann den Chat dann wieder betreten, wenn er es versucht.", + "@unbanUserDescription": {}, + "pushNotificationsNotAvailable": "Push-Benachrichtigungen nicht verfügbar", + "@pushNotificationsNotAvailable": {}, + "makeAdminDescription": "Sobald du diesen Benutzer zum Administrator gemacht hast, kannst du das möglicherweise nicht mehr rückgängig machen, da er dann über dieselben Berechtigungen wie du verfügt.", + "@makeAdminDescription": {}, + "archiveRoomDescription": "Der Chat wird in das Archiv verschoben. Andere Benutzer können sehen, dass du den Chat verlassen hast.", + "@archiveRoomDescription": {}, + "learnMore": "Erfahre mehr", + "@learnMore": {}, + "roomUpgradeDescription": "Der Chat wird dann mit der neuen Raumversion neu erstellt. Alle Teilnehmer werden benachrichtigt, dass sie zum neuen Chat wechseln müssen. Mehr über Raumversionen erfährst du unter https://spec.matrix.org/latest/rooms/", + "@roomUpgradeDescription": {}, + "kickUserDescription": "Der Benutzer wird aus dem Chat geworfen, aber nicht gebannt. In öffentlichen Chats kann der Benutzer jederzeit wieder beitreten.", + "@kickUserDescription": {}, + "blockListDescription": "Du kannst Benutzer blockieren, die dich stören. Von Benutzern auf deiner persönlichen Blocklierliste kannst du keine Nachrichten oder Raumeinladungen mehr erhalten.", + "@blockListDescription": {}, + "createGroupAndInviteUsers": "Gruppe erstellen und Nutzer einladen", + "@createGroupAndInviteUsers": {}, + "startConversation": "Unterhaltung starten", + "@startConversation": {}, + "blockedUsers": "Blockierte Benutzer", + "@blockedUsers": {}, + "groupCanBeFoundViaSearch": "Gruppe kann über die Suche gefunden werden", + "@groupCanBeFoundViaSearch": {}, + "noUsersFoundWithQuery": "Leider konnte mit \"{query}\" kein Benutzer gefunden werden. Bitte schau nach, ob dir ein Tippfehler unterlaufen ist.", + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "block": "Blockieren", + "@block": {}, + "yourGlobalUserIdIs": "Deine globale Benutzer-ID ist: ", + "@yourGlobalUserIdIs": {}, + "commandHint_sendraw": "Rohes JSON senden", + "@commandHint_sendraw": {}, + "wrongRecoveryKey": "Entschuldigung ... das scheint nicht der richtige Wiederherstellungsschlüssel zu sein.", + "@wrongRecoveryKey": {}, + "blockUsername": "Blockiere Benutzername", + "@blockUsername": {}, + "groupName": "Gruppenname", + "@groupName": {}, + "searchChatsRooms": "Suche nach #Chats, @Nutzer ...", + "@searchChatsRooms": {}, + "databaseMigrationTitle": "Datenbank wird optimiert", + "@databaseMigrationTitle": {}, + "databaseMigrationBody": "Bitte warten. Dies kann einen Moment dauern.", + "@databaseMigrationBody": {}, + "thisDevice": "Dieses Gerät:", + "@thisDevice": {}, + "publicSpaces": "Öffentliche Spaces", + "@publicSpaces": {}, + "passwordIsWrong": "Dein eingegebenes Passwort ist falsch", + "@passwordIsWrong": {}, + "pleaseEnterYourCurrentPassword": "Bitte dein aktuelles Passwort eingeben", + "@pleaseEnterYourCurrentPassword": {}, + "publicLink": "Öffentlicher Link", + "@publicLink": {}, + "nothingFound": "Nichts gefunden ...", + "@nothingFound": {}, + "decline": "Ablehnen", + "@decline": {}, + "newPassword": "Neues Passwort", + "@newPassword": {}, + "passwordsDoNotMatch": "Passwörter stimmen nicht überein", + "@passwordsDoNotMatch": {}, + "subspace": "Sub-Space", + "@subspace": {}, + "select": "Auswählen", + "@select": {}, + "pleaseChooseAStrongPassword": "Bitte wähle ein starkes Passwort", + "@pleaseChooseAStrongPassword": {}, + "addChatOrSubSpace": "Chat oder Sub-Space hinzufügen", + "@addChatOrSubSpace": {}, + "leaveEmptyToClearStatus": "Leer lassen, um den Status zu löschen.", + "@leaveEmptyToClearStatus": {}, + "joinSpace": "Space beitreten", + "@joinSpace": {}, + "searchForUsers": "Suche nach @benutzer ...", + "@searchForUsers": {}, + "initAppError": "Beim Starten der App ist ein Fehler aufgetreten", + "@initAppError": {}, + "databaseBuildErrorBody": "Die SQlite-Datenbank kann nicht erstellt werden. Die App versucht vorerst, die Legacy-Datenbank zu verwenden. Bitte melde diesen Fehler an die Entwickler unter {url}. Die Fehlermeldung lautet: {error}", + "@databaseBuildErrorBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "sessionLostBody": "Die App versucht nun, deine Sitzung aus der Sicherung wiederherzustellen. Bitte melde diesen Fehler an die Entwickler unter {url}. Die Fehlermeldung lautet: {error}", + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "restoreSessionBody": "Die App versucht nun, deine Sitzung aus der Sicherung wiederherzustellen. Bitte melde diesen Fehler an die Entwickler unter {url}. Die Fehlermeldung lautet: {error}", + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "youInvitedToBy": "📩 Du wurdest per Link eingeladen zu:\n{alias}", + "@youInvitedToBy": { + "placeholders": { + "alias": { + "type": "String" + } + } + }, + "sendReadReceipts": "Lesebestätigungen senden", + "@sendReadReceipts": {}, + "formattedMessages": "Formatierte Nachrichten", + "@formattedMessages": {}, + "forwardMessageTo": "Nachricht weiterleiten an {roomName}?", + "@forwardMessageTo": { + "type": "String", + "placeholders": { + "roomName": { + "type": "String" + } + } + }, + "sendTypingNotificationsDescription": "Andere Teilnehmer in einem Chat können sehen, wenn du eine neue Nachricht tippst.", + "@sendTypingNotificationsDescription": {}, + "formattedMessagesDescription": "Formatierte Nachrichteninhalte wie fettgedruckten Text mit Markdown anzeigen.", + "@formattedMessagesDescription": {}, + "verifyOtherUser": "🔐 Anderen Benutzer verifizieren", + "@verifyOtherUser": {}, + "sendReadReceiptsDescription": "Andere Teilnehmer in einem Chat können sehen, ob du eine Nachricht gelesen hast.", + "@sendReadReceiptsDescription": {}, + "transparent": "Transparent", + "@transparent": {}, + "verifyOtherDevice": "🔐 Anderes Gerät verifizieren", + "@verifyOtherDevice": {}, + "verifyOtherUserDescription": "Wenn du einen anderen Benutzer verifizierst, kannst du sicher sein, dass du weißt, an wen du wirklich schreibst. 💪\n\nWenn du eine Verifizierung startest, wird dir und dem anderen Nutzer ein Popup in der App angezeigt. Dort siehst du dann eine Reihe von Emojis oder Zahlen, die ihr miteinander vergleichen müsst.\n\nDas geht am besten, wenn man sich trifft oder einen Videoanruf startet. 👭", + "@verifyOtherUserDescription": {}, + "acceptedKeyVerification": "{sender} hat die Schlüsselverifikation akzeptiert", + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "canceledKeyVerification": "{sender} hat die Schlüsselverifikation abgebrochen", + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "completedKeyVerification": "{sender} hat die Schlüsselverifikation abgeschlossen", + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "isReadyForKeyVerification": "{sender} ist bereit für die Schlüsselverifikation", + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "requestedKeyVerification": "{sender} hat eine Schlüsselverifikation angefragt", + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "startedKeyVerification": "{sender} hat die Schlüsselverifikation gestartet", + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "verifyOtherDeviceDescription": "Wenn du ein anderes Gerät verifizieren, können diese Geräteschlüssel austauschen, was die Sicherheit insgesamt erhöht. 💪\n\nSobald du eine Verifizierung starten, erscheint ein Pop-up in der App auf beiden Geräten. Dort siehst du dann eine Reihe von Emojis oder Zahlen, die du miteinander vergleichen musst.\n\nAm besten hältst du beide Geräte bereit, bevor du die Verifizierung startest. 🤳", + "@verifyOtherDeviceDescription": {}, + "presenceStyle": "Statusmeldungen:", + "@presenceStyle": { + "type": "String", + "placeholders": {} + }, + "presencesToggle": "Status-Nachrichten anderer Benutzer anzeigen", + "@presencesToggle": { + "type": "String", + "placeholders": {} + }, + "incomingMessages": "Eingehende Nachrichten", + "@incomingMessages": {}, + "commandHint_unignore": "Angegebene Matrix-ID nicht mehr ignorieren", + "@commandHint_unignore": {}, + "commandHint_ignore": "Angegebene Matrix-ID ignorieren", + "@commandHint_ignore": {}, + "noDatabaseEncryption": "Datenbankverschlüsselung wird auf dieser Plattform nicht unterstützt", + "@noDatabaseEncryption": {}, + "hidePresences": "Status-Liste verbergen?", + "@hidePresences": {}, + "stickers": "Sticker", + "@stickers": {}, + "discover": "Entdecken", + "@discover": {}, + "unreadChatsInApp": "{appname}: {unread} ungelesene Chats", + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "customEmojisAndStickersBody": "Eigene Emojis oder Sticker zur Nutzung im Chat hinzufügen oder teilen.", + "@customEmojisAndStickersBody": {}, + "globalChatId": "Globale Chat-ID", + "@globalChatId": {}, + "accessAndVisibility": "Zugang und Sichtbarkeit", + "@accessAndVisibility": {}, + "hideMemberChangesInPublicChats": "Mitglieder-Änderungen in öffentlichen Chats ausblenden", + "@hideMemberChangesInPublicChats": {}, + "accessAndVisibilityDescription": "Wer darf dem Chat beitreten und wie kann der Chat gefunden werden.", + "@accessAndVisibilityDescription": {}, + "hideMemberChangesInPublicChatsBody": "Zeige keine Beitritt- oder Verlassen-Ereignisse von Mitgliedern in der Timeline an, um die Lesbarkeit in öffentlichen Chats zu verbessern.", + "@hideMemberChangesInPublicChatsBody": {}, + "userWouldLikeToChangeTheChat": "{user} würde dem Chat gerne beitreten.", + "@userWouldLikeToChangeTheChat": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "noPublicLinkHasBeenCreatedYet": "Es wurde noch kein öffentlicher Link erstellt", + "@noPublicLinkHasBeenCreatedYet": {}, + "chatCanBeDiscoveredViaSearchOnServer": "Chat kann über die Suche auf {server} gefunden werden", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "appLockDescription": "App mit einer PIN sperren, wenn sie nicht verwendet wird", + "@appLockDescription": {}, + "calls": "Anrufe", + "@calls": {}, + "customEmojisAndStickers": "Eigene Emojis und Sticker", + "@customEmojisAndStickers": {}, + "hideRedactedMessages": "Geschwärzte Nachrichten verstecken", + "@hideRedactedMessages": {}, + "hideRedactedMessagesBody": "Wenn jemand eine Nachricht schwärzt/löscht, dann wird diese Nachricht im Chat nicht mehr sichtbar sein.", + "@hideRedactedMessagesBody": {}, + "hideInvalidOrUnknownMessageFormats": "Ungültige und unbekannte Nachrichten-Formate ausblenden", + "@hideInvalidOrUnknownMessageFormats": {}, + "overview": "Übersicht", + "@overview": {}, + "notifyMeFor": "Benachrichtige mich für", + "@notifyMeFor": {}, + "passwordRecoverySettings": "Passwort-Wiederherstellungs-Einstellungen", + "@passwordRecoverySettings": {}, + "knock": "Anklopfen", + "@knock": {}, + "knocking": "Klopft", + "@knocking": {}, + "thereAreCountUsersBlocked": "Im Augenblick werden {count} Benutzer blockiert.", + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "usersMustKnock": "Benutzer müssen anklopfen", + "@usersMustKnock": {}, + "noOneCanJoin": "Niemand kann beitreten", + "@noOneCanJoin": {}, + "createNewAddress": "Neue Adresse erstellen", + "@createNewAddress": {}, + "userRole": "Benutzerrolle", + "@userRole": {}, + "minimumPowerLevel": "{level} is das minimale Power-Level.", + "@minimumPowerLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "String" + } + } + }, + "publicChatAddresses": "Öffentliche Chat-Adressen", + "@publicChatAddresses": {}, + "gallery": "Galerie", + "@gallery": {}, + "files": "Dateien", + "@files": {}, + "restricted": "Beschränkt", + "@restricted": {}, + "knockRestricted": "Anklopfen beschränkt", + "@knockRestricted": {}, + "searchIn": "In Chat \"{chat}\" suchen ...", + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "searchMore": "Weiter suchen ...", + "@searchMore": {}, + "unread": "Ungelesen", + "@unread": {}, + "noMoreChatsFound": "Keine weiteren Chats gefunden ...", + "@noMoreChatsFound": {}, + "joinedChats": "Beigetretene Chats", + "@joinedChats": {}, + "space": "Space", + "@space": {}, + "spaces": "Spaces", + "@spaces": {}, + "goToSpace": "Geh zum Space: {space}", + "@goToSpace": { + "type": "String", + "space": {} + }, + "markAsUnread": "Als ungelesen markieren", + "@markAsUnread": {}, + "swipeRightToLeftToReply": "Wische von rechts nach links zum Antworten", + "@swipeRightToLeftToReply": {}, + "countChatsAndCountParticipants": "{chats} Chats und {participants} Teilnehmer", + "@countChatsAndCountParticipants": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + }, + "participants": { + "type": "int" + } + } + }, + "changeGeneralChatSettings": "Allgemeine Chat-Einstellungen ändern", + "@changeGeneralChatSettings": {}, + "userLevel": "{level} - Benutzer", + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "moderatorLevel": "{level} - Moderator", + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "changeTheChatPermissions": "Ändere die Chat-Berechtigungen", + "@changeTheChatPermissions": {}, + "changeTheVisibilityOfChatHistory": "Wechsele die Sichtbarkeit der Chat-Historie", + "@changeTheVisibilityOfChatHistory": {}, + "chatPermissionsDescription": "Einstellen, welches Level für bestimmte Aktionen in diesem Chat erforderlich ist. Die Level 0, 50 und 100 stehen üblicherweise für Benutzer, Moderatoren und Admins, aber jede Abstufung ist möglich.", + "@chatPermissionsDescription": {}, + "invitedBy": "📩 Eingeladen von {user}", + "@invitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "adminLevel": "{level} - Administrator", + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "inviteOtherUsers": "Lade andere Benutzer in diesen Chat ein", + "@inviteOtherUsers": {}, + "changeTheCanonicalRoomAlias": "Ändern der Hauptadresse für den öffentlichen Chat", + "@changeTheCanonicalRoomAlias": {}, + "sendRoomNotifications": "Sende eine @room-Benachrichtigung", + "@sendRoomNotifications": {}, + "changeTheDescriptionOfTheGroup": "Chat-Beschreibung ändern", + "@changeTheDescriptionOfTheGroup": {}, + "updateInstalled": "🎉 Update {version} installiert!", + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "changelog": "Änderungsprotokoll", + "@changelog": {}, + "sendCanceled": "Senden abgebrochen", + "@sendCanceled": {}, + "noChatsFoundHere": "Hier wurden noch keine Chats gefunden. Starte einen neuen Chat mit jemandem, indem du die Schaltfläche unten verwenden. ⤵️", + "@noChatsFoundHere": {}, + "whatIsAHomeserver": "Was ist ein Homeserver?", + "@whatIsAHomeserver": {}, + "doesNotSeemToBeAValidHomeserver": "Scheint kein kompatibler Homeserver zu sein. Falsche URL?", + "@doesNotSeemToBeAValidHomeserver": {}, + "loginWithMatrixId": "Mit Matrix-ID anmelden", + "@loginWithMatrixId": {}, + "discoverHomeservers": "Server suchen", + "@discoverHomeservers": {}, + "homeserverDescription": "Alle deine Daten werden auf einem Homeserver gespeichert, so wie bei einem E-Mail Anbieter. Du kannst aussuchen, welchen Homeserver du benutzen willst und kannst trotzdem mit allen kommunizieren. Erfahre mehr auf https://matrix.org.", + "@homeserverDescription": {}, + "sendingAttachment": "Anhang wird gesendet ...", + "@sendingAttachment": {}, + "generatingVideoThumbnail": "Generiere Video-Vorschaubild ...", + "@generatingVideoThumbnail": {}, + "serverLimitReached": "Server-Limit erreicht! Warte {seconds} Sekunden ...", + "@serverLimitReached": { + "type": "integer", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "calculatingFileSize": "Dateigröße wird berechnet ...", + "@calculatingFileSize": {}, + "prepareSendingAttachment": "Anhang zum Senden vorbereiten ...", + "@prepareSendingAttachment": {}, + "compressVideo": "Video wird komprimiert ...", + "@compressVideo": {}, + "sendingAttachmentCountOfCount": "Sende Anhang {index} von {length} ...", + "@sendingAttachmentCountOfCount": { + "type": "integer", + "placeholders": { + "index": { + "type": "int" + }, + "length": { + "type": "int" + } + } + }, + "fileIsTooBigForServer": "Kann nicht gesendet werden! Der Server unterstützt nur Anhänge bis höchstens {max}.", + "@fileIsTooBigForServer": { + "type": "String", + "placeholders": { + "max": { + "type": "String" + } + } + }, + "oneOfYourDevicesIsNotVerified": "Eines deiner Geräte ist nicht verifiziert", + "@oneOfYourDevicesIsNotVerified": {}, + "noticeChatBackupDeviceVerification": "Hinweis: Wenn du alle deine Geräte mit dem Chat-Backup verbindest, sind sie automatisch verifiziert.", + "@noticeChatBackupDeviceVerification": {}, + "setWallpaper": "Hintergrund ändern", + "@setWallpaper": {}, + "opacity": "Deckkraft:", + "@opacity": {}, + "welcomeText": "Hey Hey 👋 Das ist Extera. Du kannst sich bei jedem Homeserver anmelden, der mit https://matrix.org kompatibel ist. Und dann mit jedem chatten. Das hier ist ein riesiges dezentrales Nachrichtennetzwerk!", + "@welcomeText": {}, + "blur": "Verwischen:", + "@blur": {}, + "manageAccount": "Konto verwalten", + "@manageAccount": {}, + "continueText": "Fortfahren", + "@continueText": {}, + "noContactInformationProvided": "Der Server stellt keine gültigen Kontaktinformationen bereit", + "@noContactInformationProvided": {}, + "contactServerAdmin": "Serveradministrator kontaktieren", + "@contactServerAdmin": {}, + "name": "Name", + "@name": {}, + "version": "Version", + "@version": {}, + "website": "Website", + "@website": {}, + "aboutHomeserver": "Über {homeserver}", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "sendUncompressed": "Unkomprimiert senden", + "@sendUncompressed": {}, + "boldText": "Fetter Text", + "@boldText": {}, + "invalidUrl": "Ungültige URL", + "@invalidUrl": {}, + "addLink": "Link hinzufügen", + "@addLink": {}, + "unableToJoinChat": "Chat kann nicht beigetreten werden. Möglicherweise hat die Gegenseite das Gespräch bereits beendet.", + "@unableToJoinChat": {}, + "italicText": "Kursiver Text", + "@italicText": {}, + "strikeThrough": "Durchgestrichen", + "@strikeThrough": {}, + "pleaseFillOut": "Bitte ausfüllen", + "@pleaseFillOut": {}, + "sendImages": "Sende {count} Bilder", + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "contactServerSecurity": "Server-Sicherheit kontaktieren", + "@contactServerSecurity": {}, + "compress": "Komprimieren", + "@compress": {}, + "supportPage": "Support-Seite", + "@supportPage": {}, + "serverInformation": "Server-Informationen:", + "@serverInformation": {}, + "appIntroduction": "Mit Extera kannst du über verschiedene Messenger hinweg mit deinen Freunden chatten. Erfahre mehr dazu auf https://matrix.org oder tippe einfach auf *Fortfahren*.", + "@appIntroduction": {}, + "newChatRequest": "📩 Neue Chat-Anfrage", + "@newChatRequest": {}, + "synchronizingPleaseWaitCounter": " Synchronisierung… ({percentage}%)", + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "waitingForServer": "Auf Server warten...", + "@waitingForServer": {}, + "previous": "Vorige", + "@previous": {}, + "otherPartyNotLoggedIn": "Der User ist aktuell nicht eingeloggt und kann daher keine Nachrichten empfangen!", + "@otherPartyNotLoggedIn": {}, + "appWantsToUseForLogin": "Nutze '{server}' um dich einzuloggen", + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "appWantsToUseForLoginDescription": "Hiermit erlaubst du der App und der Website, Informationen über dich weiterzugeben.", + "@appWantsToUseForLoginDescription": {}, + "open": "Offen", + "@open": {}, + "notificationRuleContainsUserName": "Enthält Benutzernamen", + "@notificationRuleContainsUserName": {}, + "notificationRuleContainsUserNameDescription": "Benachrichtigt den Benutzer, wenn eine Nachricht seinen Benutzernamen enthält.", + "@notificationRuleContainsUserNameDescription": {}, + "notificationRuleMaster": "Alle Benachrichtigungen stummschalten", + "@notificationRuleMaster": {}, + "notificationRuleSuppressNotices": "Automatisierte Nachrichten unterdrücken", + "@notificationRuleSuppressNotices": {}, + "notificationRuleMasterDescription": "Setzt alle anderen Regeln außer Kraft und deaktiviert alle Benachrichtigungen.", + "@notificationRuleMasterDescription": {}, + "generalNotificationSettings": "Allgemeine Benachrichtigungseinstellungen", + "@generalNotificationSettings": {}, + "otherNotificationSettings": "Andere Benachrichtigungseinstellungen", + "@otherNotificationSettings": {}, + "contentNotificationSettings": "Einstellungen für Inhaltsbenachrichtigungen", + "@contentNotificationSettings": {}, + "userSpecificNotificationSettings": "Benutzerspezifische Benachrichtigungseinstellungen", + "@userSpecificNotificationSettings": {}, + "roomNotificationSettings": "Einstellungen für Raumbenachrichtigungen", + "@roomNotificationSettings": {}, + "notificationRuleSuppressNoticesDescription": "Unterdrückt Benachrichtigungen von automatisierten Clients wie Bots.", + "@notificationRuleSuppressNoticesDescription": {}, + "notificationRuleInviteForMe": "Einladung für mich", + "@notificationRuleInviteForMe": {}, + "notificationRuleReaction": "Reaktion", + "@notificationRuleReaction": {}, + "notificationRuleReactionDescription": "Unterdrückt Benachrichtigungen für Reaktionen.", + "@notificationRuleReactionDescription": {}, + "notificationRuleSuppressEditsDescription": "Unterdrückt Benachrichtigungen für bearbeitete Nachrichten.", + "@notificationRuleSuppressEditsDescription": {}, + "notificationRuleCall": "Anruf", + "@notificationRuleCall": {}, + "notificationRuleCallDescription": "Benachrichtigt den Benutzer über Anrufe.", + "@notificationRuleCallDescription": {}, + "notificationRuleEncrypted": "Verschlüsselt", + "@notificationRuleEncrypted": {}, + "more": "Mehr", + "@more": {}, + "notificationRuleSuppressEdits": "Unterdrückt Bearbeitungen", + "@notificationRuleSuppressEdits": {}, + "notificationRuleRoomServerAclDescription": "Unterdrückt Benachrichtigungen für Raumserver-Zugriffskontrolllisten (ACL).", + "@notificationRuleRoomServerAclDescription": {}, + "notificationRuleMessage": "Nachricht", + "@notificationRuleMessage": {}, + "notificationRuleMessageDescription": "Informiert den Benutzer über allgemeine Nachrichten.", + "@notificationRuleMessageDescription": {}, + "notificationRuleJitsi": "Jitsi", + "@notificationRuleJitsi": {}, + "allDevices": "Alle Geräte", + "@allDevices": {}, + "enterNewChat": "Neuen Chat starten", + "@enterNewChat": {}, + "shareKeysWith": "Schlüssel teilen mit...", + "@shareKeysWith": {}, + "shareKeysWithDescription": "Welchen Geräten sollte vertraut werden, damit sie deine Nachrichten in verschlüsselten Chats mitlesen können?", + "@shareKeysWithDescription": {}, + "verifiedDevicesOnly": "Nur verifizierte Geräte", + "@verifiedDevicesOnly": {}, + "takeAPhoto": "Foto aufnehmen", + "@takeAPhoto": {}, + "recordAVideo": "Video aufnehmen", + "@recordAVideo": {}, + "optionalMessage": "(Optionale) Nachricht...", + "@optionalMessage": {}, + "notSupportedOnThisDevice": "Nicht unterstützt auf diesem Gerät", + "@notSupportedOnThisDevice": {} +} diff --git a/assets/l10n/intl_el.arb b/assets/l10n/intl_el.arb new file mode 100644 index 0000000..fa27942 --- /dev/null +++ b/assets/l10n/intl_el.arb @@ -0,0 +1,2156 @@ +{ + "@showPassword": { + "type": "String", + "placeholders": {} + }, + "hugContent": "{senderName} σε αγκαλιάζει", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "@connect": { + "type": "String", + "placeholders": {} + }, + "@jumpToLastReadMessage": {}, + "@allRooms": { + "type": "String", + "placeholders": {} + }, + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "commandHint_cuddle": "Στείλτε μια αγκαλιά", + "@commandHint_cuddle": {}, + "@chats": { + "type": "String", + "placeholders": {} + }, + "@widgetVideo": {}, + "@dismiss": {}, + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "admin": "Διαχειριστής", + "@admin": { + "type": "String", + "placeholders": {} + }, + "@reportErrorDescription": {}, + "@directChats": { + "type": "String", + "placeholders": {} + }, + "@setPermissionsLevel": { + "type": "String", + "placeholders": {} + }, + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "@addAccount": {}, + "@close": { + "type": "String", + "placeholders": {} + }, + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "@chatHasBeenAddedToThisSpace": {}, + "@reply": { + "type": "String", + "placeholders": {} + }, + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "@unsupportedAndroidVersion": {}, + "@device": { + "type": "String", + "placeholders": {} + }, + "blockDevice": "Συσκευή μπλοκ", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "@widgetJitsi": {}, + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "@encryption": { + "type": "String", + "placeholders": {} + }, + "@messageType": {}, + "@indexedDbErrorLong": {}, + "@oneClientLoggedOut": {}, + "@toggleMuted": { + "type": "String", + "placeholders": {} + }, + "@unsupportedAndroidVersionLong": {}, + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@title": { + "description": "Title for the application", + "type": "String", + "placeholders": {} + }, + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "@startFirstChat": {}, + "@callingAccount": {}, + "@requestPermission": { + "type": "String", + "placeholders": {} + }, + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@invited": { + "type": "String", + "placeholders": {} + }, + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "@setColorTheme": {}, + "@nextAccount": {}, + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "@singlesignon": { + "type": "String", + "placeholders": {} + }, + "@warning": { + "type": "String", + "placeholders": {} + }, + "@password": { + "type": "String", + "placeholders": {} + }, + "@allSpaces": {}, + "supposedMxid": "Αυτό θα πρέπει να είναι {mxid}", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "@user": {}, + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "@youAcceptedTheInvitation": {}, + "banFromChat": "Απαγόρευση από τη συνομιλία", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@banUserDescription": {}, + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "Για να μπορέσετε να υπογράψετε το άλλο άτομο, πληκτρολογήστε τη συνθηματική φράση ασφαλούς αποθήκευσης ή το κλειδί ανάκτησης.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "@widgetEtherpad": {}, + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "remove": "Αφαιρέστε το", + "@remove": { + "type": "String", + "placeholders": {} + }, + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "@id": { + "type": "String", + "placeholders": {} + }, + "@removeDevicesDescription": {}, + "@changedTheChatDescriptionTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "description": { + "type": "String" + } + } + }, + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@separateChatTypes": { + "type": "String", + "placeholders": {} + }, + "@tryAgain": {}, + "areGuestsAllowedToJoin": "Επιτρέπεται στους φιλοξενούμενους χρήστες να συμμετάσχουν", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "blocked": "Αποκλεισμένο", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@dateWithoutYear": { + "type": "String", + "placeholders": { + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "@removeDevice": { + "type": "String", + "placeholders": {} + }, + "@unbanUserDescription": {}, + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "sendOnEnter": "Αποστολή με enter", + "@sendOnEnter": {}, + "@pickImage": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "{senderName} απάντησε στην κλήση", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@youRejectedTheInvitation": {}, + "@otherCallingPermissions": {}, + "@messagesStyle": {}, + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "@link": {}, + "@widgetUrlError": {}, + "@emailOrUsername": {}, + "@newSpaceDescription": {}, + "@chatDescription": {}, + "@callingAccountDetails": {}, + "@next": { + "type": "String", + "placeholders": {} + }, + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@dateWithYear": { + "type": "String", + "placeholders": { + "year": { + "type": "String" + }, + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "@enterSpace": {}, + "@encryptThisChat": {}, + "@fileName": { + "type": "String", + "placeholders": {} + }, + "@unavailable": { + "type": "String", + "placeholders": {} + }, + "@previousAccount": {}, + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "@emoteWarnNeedToPick": { + "type": "String", + "placeholders": {} + }, + "@reopenChat": {}, + "@pleaseEnterRecoveryKey": {}, + "@create": { + "type": "String", + "placeholders": {} + }, + "@toggleFavorite": { + "type": "String", + "placeholders": {} + }, + "@no": { + "type": "String", + "placeholders": {} + }, + "alias": "ψευδώνυμο", + "@alias": { + "type": "String", + "placeholders": {} + }, + "@widgetNameError": {}, + "@inoffensive": { + "type": "String", + "placeholders": {} + }, + "@unpin": { + "type": "String", + "placeholders": {} + }, + "@addToBundle": {}, + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "@addWidget": {}, + "all": "Όλα", + "@all": { + "type": "String", + "placeholders": {} + }, + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@noKeyForThisMessage": {}, + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "@reason": { + "type": "String", + "placeholders": {} + }, + "@commandHint_markasgroup": {}, + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "@hydrateTor": {}, + "@pushNotificationsNotAvailable": {}, + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "@storeInAppleKeyChain": {}, + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "@hydrate": {}, + "@invalidServerName": {}, + "@chatPermissions": {}, + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "badServerLoginTypesException": "Ο homeserver υποστηρίζει τους τύπους σύνδεσης:\n{serverVersions}\nΑλλά αυτή η εφαρμογή υποστηρίζει μόνο:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "@wipeChatBackup": { + "type": "String", + "placeholders": {} + }, + "cantOpenUri": "Δεν μπορεί να ανοίξει το URI {uri}", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "@sender": {}, + "@storeInAndroidKeystore": {}, + "@hideRedactedEvents": { + "type": "String", + "placeholders": {} + }, + "@online": { + "type": "String", + "placeholders": {} + }, + "@signInWithPassword": {}, + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "@offensive": { + "type": "String", + "placeholders": {} + }, + "@needPantalaimonWarning": { + "type": "String", + "placeholders": {} + }, + "@makeAdminDescription": {}, + "@edit": { + "type": "String", + "placeholders": {} + }, + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "@transferFromAnotherDevice": { + "type": "String", + "placeholders": {} + }, + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "@pushRules": { + "type": "String", + "placeholders": {} + }, + "@goToTheNewRoom": { + "type": "String", + "placeholders": {} + }, + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "@copy": { + "type": "String", + "placeholders": {} + }, + "@saveKeyManuallyDescription": {}, + "@none": { + "type": "String", + "placeholders": {} + }, + "@editBundlesForAccount": {}, + "@renderRichContent": { + "type": "String", + "placeholders": {} + }, + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "@whyIsThisMessageEncrypted": {}, + "@unreadChats": { + "type": "String", + "placeholders": { + "unreadCount": { + "type": "int" + } + } + }, + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@setChatDescription": {}, + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "importFromZipFile": "Εισαγωγή από αρχείο .zip", + "@importFromZipFile": {}, + "@toggleUnread": { + "type": "String", + "placeholders": {} + }, + "@or": { + "type": "String", + "placeholders": {} + }, + "@dehydrateWarning": {}, + "@sendOriginal": { + "type": "String", + "placeholders": {} + }, + "@noOtherDevicesFound": {}, + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "@seenByUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@storeSecurlyOnThisDevice": {}, + "@yourChatBackupHasBeenSetUp": {}, + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@submit": { + "type": "String", + "placeholders": {} + }, + "@videoCallsBetaWarning": {}, + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "autoplayImages": "Αυτόματη αναπαραγωγή κινούμενων αυτοκόλλητων και emotes", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "@participant": { + "type": "String", + "placeholders": {} + }, + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "@yes": { + "type": "String", + "placeholders": {} + }, + "@containsDisplayName": { + "type": "String", + "placeholders": {} + }, + "@signInWith": { + "type": "String", + "placeholders": { + "provider": { + "type": "String" + } + } + }, + "@username": { + "type": "String", + "placeholders": {} + }, + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@fileIsTooBigForServer": {}, + "@homeserver": {}, + "@help": { + "type": "String", + "placeholders": {} + }, + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "@people": { + "type": "String", + "placeholders": {} + }, + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "@verified": { + "type": "String", + "placeholders": {} + }, + "repeatPassword": "Επανάληψη κωδικού πρόσβασης", + "@repeatPassword": {}, + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "@callingPermissions": {}, + "@delete": { + "type": "String", + "placeholders": {} + }, + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "@readUpToHere": {}, + "@start": {}, + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "@deviceId": { + "type": "String", + "placeholders": {} + }, + "@register": { + "type": "String", + "placeholders": {} + }, + "@unlockOldMessages": {}, + "@identity": { + "type": "String", + "placeholders": {} + }, + "@numChats": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "@ignore": { + "type": "String", + "placeholders": {} + }, + "@recording": { + "type": "String", + "placeholders": {} + }, + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@moderator": { + "type": "String", + "placeholders": {} + }, + "@optionalRedactReason": {}, + "acceptedTheInvitation": "👍 {username} αποδέχτηκε την πρόσκληση", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "@ok": { + "type": "String", + "placeholders": {} + }, + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "@dehydrate": {}, + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "@send": { + "type": "String", + "placeholders": {} + }, + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "banned": "Απαγορευμένο", + "@banned": { + "type": "String", + "placeholders": {} + }, + "@sendAsText": { + "type": "String" + }, + "@inviteForMe": { + "type": "String", + "placeholders": {} + }, + "@archiveRoomDescription": {}, + "exportEmotePack": "Εξαγωγή πακέτου Emote ως .zip", + "@exportEmotePack": {}, + "@changedTheChatNameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "chatname": { + "type": "String" + } + } + }, + "@sendSticker": { + "type": "String", + "placeholders": {} + }, + "account": "Λογαριασμός", + "@account": { + "type": "String", + "placeholders": {} + }, + "@switchToAccount": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "@commandInvalid": { + "type": "String" + }, + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "@placeCall": {}, + "@removedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@newChat": { + "type": "String", + "placeholders": {} + }, + "@notifications": { + "type": "String", + "placeholders": {} + }, + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "@experimentalVideoCalls": {}, + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "@pleaseEnterRecoveryKeyDescription": {}, + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "@mention": { + "type": "String", + "placeholders": {} + }, + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "@inviteContactToGroupQuestion": {}, + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@chat": { + "type": "String", + "placeholders": {} + }, + "@group": { + "type": "String", + "placeholders": {} + }, + "@leave": { + "type": "String", + "placeholders": {} + }, + "@skip": { + "type": "String", + "placeholders": {} + }, + "@appearOnTopDetails": {}, + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "@enterRoom": {}, + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "Είσαι σίγουρος;", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "allChats": "Όλες οι συνομιλίες", + "@allChats": { + "type": "String", + "placeholders": {} + }, + "@reportUser": {}, + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@confirmEventUnpin": {}, + "badServerVersionsException": "Ο homeserver υποστηρίζει τις εκδόσεις Spec:\n{serverVersions}\nΑλλά αυτή η εφαρμογή υποστηρίζει μόνο τις {supportedVersions}", + "@badServerVersionsException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "@license": { + "type": "String", + "placeholders": {} + }, + "addToSpace": "Προσθήκη στο χώρο", + "@addToSpace": {}, + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "@redactMessageDescription": {}, + "@rejoin": { + "type": "String", + "placeholders": {} + }, + "@recoveryKey": {}, + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "@forward": { + "type": "String", + "placeholders": {} + }, + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "@invalidInput": {}, + "about": "Σχετικά με το", + "@about": { + "type": "String", + "placeholders": {} + }, + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "@dehydrateTorLong": {}, + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "@offline": { + "type": "String", + "placeholders": {} + }, + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "@doNotShowAgain": {}, + "activatedEndToEndEncryption": "🔐 {username} ενεργοποίησε κρυπτογράφηση από άκρη σε άκρη", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@report": {}, + "@status": { + "type": "String", + "placeholders": {} + }, + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "@memberChanges": { + "type": "String", + "placeholders": {} + }, + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "@unverified": {}, + "@fluffychat": { + "type": "String", + "placeholders": {} + }, + "@howOffensiveIsThisContent": { + "type": "String", + "placeholders": {} + }, + "@serverRequiresEmail": {}, + "@hideUnimportantStateEvents": {}, + "@screenSharingTitle": {}, + "@widgetCustom": {}, + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@addToSpaceDescription": {}, + "googlyEyesContent": "{senderName} σας στέλνει googly eyes", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "addChatDescription": "Προσθέστε μια περιγραφή συνομιλίας...", + "@addChatDescription": {}, + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "cancel": "Ακύρωση", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@publish": {}, + "@openLinkInBrowser": {}, + "@clearArchive": {}, + "appLock": "Κλείδωμα εφαρμογών", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "@messageInfo": {}, + "@disableEncryptionWarning": {}, + "@directChat": {}, + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "sendTypingNotifications": "Αποστολή ειδοποιήσεων δακτυλογράφησης", + "@sendTypingNotifications": {}, + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "@inviteGroupChat": {}, + "@appearOnTop": {}, + "@invitePrivateChat": {}, + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "@foregroundServiceRunning": {}, + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "@voiceCall": {}, + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "importEmojis": "Εισαγωγή Emojis", + "@importEmojis": {}, + "@confirm": { + "type": "String", + "placeholders": {} + }, + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "@noChatDescriptionYet": {}, + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "@removeFromBundle": {}, + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "confirmMatrixId": "Παρακαλούμε επιβεβαιώστε το Matrix ID σας για να διαγράψετε τον λογαριασμό σας.", + "@confirmMatrixId": {}, + "@learnMore": {}, + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "@you": { + "type": "String", + "placeholders": {} + }, + "notAnImage": "Δεν είναι αρχείο εικόνας.", + "@notAnImage": {}, + "@users": {}, + "@openGallery": {}, + "@chatDescriptionHasBeenChanged": {}, + "@search": { + "type": "String", + "placeholders": {} + }, + "@newGroup": {}, + "@bundleName": {}, + "@dehydrateTor": {}, + "@removeFromSpace": {}, + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "@roomUpgradeDescription": {}, + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "@scanQrCode": {}, + "@logout": { + "type": "String", + "placeholders": {} + }, + "@pleaseEnterANumber": {}, + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "areYouSureYouWantToLogout": "Σίγουρα θέλετε να αποσυνδεθείτε;", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@profileNotFound": {}, + "@jump": {}, + "@groups": { + "type": "String", + "placeholders": {} + }, + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "bannedUser": "{username} banned {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@sorryThatsNotPossible": {}, + "@videoWithSize": { + "type": "String", + "placeholders": { + "size": { + "type": "String" + } + } + }, + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@shareInviteLink": {}, + "@commandHint_markasdm": {}, + "@recoveryKeyLost": {}, + "cuddleContent": "{senderName} σε αγκαλιάζει", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "askVerificationRequest": "Αποδοχή αυτού του αιτήματος επαλήθευσης από {username};", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@containsUserName": { + "type": "String", + "placeholders": {} + }, + "@messages": { + "type": "String", + "placeholders": {} + }, + "@login": { + "type": "String", + "placeholders": {} + }, + "@deviceKeys": {}, + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "@everythingReady": { + "type": "String", + "placeholders": {} + }, + "addEmail": "Προσθήκη email", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "@setCustomEmotes": { + "type": "String", + "placeholders": {} + }, + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "@notificationsEnabledForThisAccount": { + "type": "String", + "placeholders": {} + }, + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "@settings": { + "type": "String", + "placeholders": {} + }, + "@setTheme": {}, + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "@youJoinedTheChat": {}, + "@wallpaper": { + "type": "String", + "placeholders": {} + }, + "@openVideoCamera": { + "type": "String", + "placeholders": {} + }, + "@play": { + "type": "String", + "placeholders": { + "fileName": { + "type": "String" + } + } + }, + "@chatBackupDescription": { + "type": "String", + "placeholders": {} + }, + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "@security": { + "type": "String", + "placeholders": {} + }, + "@markAsRead": {}, + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "@widgetName": {}, + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@errorAddingWidget": {}, + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "commandHint_hug": "Στείλτε μια αγκαλιά", + "@commandHint_hug": {}, + "replace": "Αντικαταστήστε το", + "@replace": {}, + "@reject": { + "type": "String", + "placeholders": {} + }, + "@extremeOffensive": { + "type": "String", + "placeholders": {} + }, + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "archive": "Αρχείο", + "@archive": { + "type": "String", + "placeholders": {} + }, + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "@pleaseEnter4Digits": { + "type": "String", + "placeholders": {} + }, + "@newSpace": {}, + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "@devices": { + "type": "String", + "placeholders": {} + }, + "accept": "Αποδοχή", + "@accept": { + "type": "String", + "placeholders": {} + }, + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "@emojis": {}, + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "@pleaseChoose": { + "type": "String", + "placeholders": {} + }, + "@share": { + "type": "String", + "placeholders": {} + }, + "commandHint_googly": "Στείλτε μερικά μάτια", + "@commandHint_googly": {}, + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "@createGroup": {}, + "@privacy": { + "type": "String", + "placeholders": {} + }, + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "@hydrateTorLong": {}, + "@time": {}, + "@enterYourHomeserver": { + "type": "String", + "placeholders": {} + }, + "botMessages": "Μηνύματα bot", + "@botMessages": { + "type": "String", + "placeholders": {} + }, + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "@custom": {}, + "@noBackupWarning": {}, + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "@verify": { + "type": "String", + "placeholders": {} + }, + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "@storeInSecureStorageDescription": {}, + "@openChat": {}, + "@kickUserDescription": {}, + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "@pin": { + "type": "String", + "placeholders": {} + }, + "importNow": "Εισαγωγή τώρα", + "@importNow": {}, + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "@setInvitationLink": { + "type": "String", + "placeholders": {} + }, + "@pinMessage": {}, + "@screenSharingDetail": {}, + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "@invite": {}, + "@enableMultiAccounts": {}, + "anyoneCanJoin": "Οποιοσδήποτε μπορεί να συμμετάσχει", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "@emotePacks": { + "type": "String", + "placeholders": {} + }, + "@indexedDbErrorTitle": {}, + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + } +} diff --git a/assets/l10n/intl_en.arb b/assets/l10n/intl_en.arb new file mode 100644 index 0000000..6939b58 --- /dev/null +++ b/assets/l10n/intl_en.arb @@ -0,0 +1,3275 @@ +{ + "@@locale": "en", + "@@last_modified": "2025-06-05 12:38:37.885451", + "noSendPermission": "You can't send messages here", + "@noSendPermission": {}, + "alwaysUse24HourFormat": "false", + "@alwaysUse24HourFormat": { + "description": "Set to true to always display time of day in 24 hour format." + }, + "repeatPassword": "Repeat password", + "@repeatPassword": {}, + "notAnImage": "Not an image file.", + "@notAnImage": {}, + "setCustomPermissionLevel": "Set custom permission level", + "setPermissionsLevelDescription": "Please choose a predefined role below or enter a custom permission level between 0 and 100.", + "ignoreUser": "Ignore user", + "normalUser": "Normal user", + "remove": "Remove", + "@remove": { + "type": "String", + "placeholders": {} + }, + "importNow": "Import now", + "@importNow": {}, + "importEmojis": "Import Emojis", + "@importEmojis": {}, + "importFromZipFile": "Import from .zip file", + "@importFromZipFile": {}, + "exportEmotePack": "Export Emote pack as .zip", + "@exportEmotePack": {}, + "replace": "Replace", + "@replace": {}, + "about": "About", + "aboutHomeserver": "About {homeserver}", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "accept": "Accept", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 {username} accepted the invitation", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "Account", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐 {username} activated end to end encryption", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "addEmail": "Add email", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "confirmMatrixId": "Please confirm your Matrix ID in order to delete your account.", + "@confirmMatrixId": {}, + "supposedMxid": "This should be {mxid}", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "addChatDescription": "Add a chat description...", + "@addChatDescription": {}, + "addToSpace": "Add to space", + "@addToSpace": {}, + "admin": "Admin", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "alias", + "@alias": { + "type": "String", + "placeholders": {} + }, + "all": "All", + "@all": { + "type": "String", + "placeholders": {} + }, + "allChats": "All chats", + "@allChats": { + "type": "String", + "placeholders": {} + }, + "commandHint_roomupgrade": "Upgrade this room to the given room version", + "commandHint_googly": "Send some googly eyes", + "@commandHint_googly": {}, + "commandHint_cuddle": "Send a cuddle", + "@commandHint_cuddle": {}, + "commandHint_hug": "Send a hug", + "@commandHint_hug": {}, + "googlyEyesContent": "{senderName} sends you googly eyes", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "cuddleContent": "{senderName} cuddles you", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "hugContent": "{senderName} hugs you", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "answeredTheCall": "{senderName} answered the call", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "Anyone can join", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "appLock": "App lock", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "appLockDescription": "Lock the app when not using with a pin code", + "@appLockDescription": {}, + "archive": "Archive", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "Are guest users allowed to join", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "Are you sure?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "areYouSureYouWantToLogout": "Are you sure you want to log out?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "To be able to sign the other person, please enter your secure store passphrase or recovery key.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "Accept this verification request from {username}?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "autoplayImages": "Automatically play animated stickers and emotes", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "badServerLoginTypesException": "The homeserver supports the login types:\n{serverVersions}\nBut this app supports only:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "sendTypingNotifications": "Send typing notifications", + "@sendTypingNotifications": {}, + "swipeRightToLeftToReply": "Swipe right to left to reply", + "@swipeRightToLeftToReply": {}, + "sendOnEnter": "Send on enter", + "@sendOnEnter": {}, + "badServerVersionsException": "The homeserver supports the Spec versions:\n{serverVersions}\nBut this app supports only {supportedVersions}", + "@badServerVersionsException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "countChatsAndCountParticipants": "{chats} chats and {participants} participants", + "@countChatsAndCountParticipants": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + }, + "participants": { + "type": "int" + } + } + }, + "noMoreChatsFound": "No more chats found...", + "noChatsFoundHere": "No chats found here yet. Start a new chat with someone by using the button below. ⤵️", + "joinedChats": "Joined chats", + "unread": "Unread", + "space": "Space", + "spaces": "Spaces", + "banFromChat": "Ban from chat", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "Banned", + "@banned": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username} banned {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "Block Device", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "blocked": "Blocked", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "botMessages": "Bot messages", + "@botMessages": { + "type": "String", + "placeholders": {} + }, + "cancel": "Cancel", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "cantOpenUri": "Can't open the URI {uri}", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "changeDeviceName": "Change device name", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "{username} changed the chat avatar", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatDescriptionTo": "{username} changed the chat description to: '{description}'", + "@changedTheChatDescriptionTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "description": { + "type": "String" + } + } + }, + "changedTheChatNameTo": "{username} changed the chat name to: '{chatname}'", + "@changedTheChatNameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "chatname": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username} changed the chat permissions", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username} changed their displayname to: '{displayname}'", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} changed the guest access rules", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} changed the guest access rules to: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username} changed the history visibility", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username} changed the history visibility to: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username} changed the join rules", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} changed the join rules to: {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} changed their avatar", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "{username} changed the room aliases", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username} changed the invitation link", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changePassword": "Change password", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "Change the homeserver", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "Change your style", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "Change the name of the group", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "changeYourAvatar": "Change your avatar", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "The encryption has been corrupted", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "chat": "Chat", + "@chat": { + "type": "String", + "placeholders": {} + }, + "yourChatBackupHasBeenSetUp": "Your chat backup has been set up.", + "@yourChatBackupHasBeenSetUp": {}, + "chatBackup": "Chat backup", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "chatBackupDescription": "Your old messages are secured with a recovery key. Please make sure you don't lose it.", + "@chatBackupDescription": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Chat details", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chatHasBeenAddedToThisSpace": "Chat has been added to this space", + "@chatHasBeenAddedToThisSpace": {}, + "chats": "Chats", + "@chats": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "Choose a strong password", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "clearArchive": "Clear archive", + "@clearArchive": {}, + "close": "Close", + "@close": { + "type": "String", + "placeholders": {} + }, + "commandHint_markasdm": "Mark as direct message room for the giving Matrix ID", + "@commandHint_markasdm": {}, + "commandHint_markasgroup": "Mark as group", + "@commandHint_markasgroup": {}, + "commandHint_ban": "Ban the given user from this room", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_clearcache": "Clear cache", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_create": "Create an empty group chat\nUse --no-encryption to disable encryption", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "commandHint_discardsession": "Discard session", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "commandHint_dm": "Start a direct chat\nUse --no-encryption to disable encryption", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "commandHint_html": "Send HTML-formatted text", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_invite": "Invite the given user to this room", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "commandHint_join": "Join the given room", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_kick": "Remove the given user from this room", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_leave": "Leave this room", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_me": "Describe yourself", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "commandHint_myroomavatar": "Set your picture for this room (by mxc-uri)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_myroomnick": "Set your display name for this room", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "commandHint_op": "Set the given user's power level (default: 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_plain": "Send unformatted text", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_react": "Send reply as a reaction", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "commandHint_send": "Send text", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "commandHint_unban": "Unban the given user from this room", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "commandInvalid": "Command invalid", + "@commandInvalid": { + "type": "String" + }, + "commandMissing": "{command} is not a command.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "compareEmojiMatch": "Please compare the emojis", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "Please compare the numbers", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "configureChat": "Configure chat", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "confirm": "Confirm", + "@confirm": { + "type": "String", + "placeholders": {} + }, + "connect": "Connect", + "@connect": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "Contact has been invited to the group", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "containsDisplayName": "Contains display name", + "@containsDisplayName": { + "type": "String", + "placeholders": {} + }, + "containsUserName": "Contains username", + "@containsUserName": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "The content has been reported to the server admins", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "Copied to clipboard", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "Copy", + "@copy": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "Copy to clipboard", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "Could not decrypt message: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "countParticipants": "{count} participants", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "create": "Create", + "@create": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "💬 {username} created the chat", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "createGroup": "Create group", + "@createGroup": {}, + "createNewSpace": "New space", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "currentlyActive": "Currently active", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "Dark", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "dateWithoutYear": "{month}-{day}", + "@dateWithoutYear": { + "type": "String", + "placeholders": { + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "dateWithYear": "{year}-{month}-{day}", + "@dateWithYear": { + "type": "String", + "placeholders": { + "year": { + "type": "String" + }, + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "deactivateAccountWarning": "This will deactivate your user account. This can not be undone! Are you sure?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "Default permission level for new users", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "delete": "Delete", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "Delete account", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "Delete message", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "device": "Device", + "@device": { + "type": "String", + "placeholders": {} + }, + "deviceId": "Device ID", + "@deviceId": { + "type": "String", + "placeholders": {} + }, + "devices": "Devices", + "@devices": { + "type": "String", + "placeholders": {} + }, + "directChats": "Direct Chats", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "allRooms": "All Group Chats", + "@allRooms": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "Displayname has been changed", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "Download file", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "edit": "Edit", + "@edit": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "Edit blocked servers", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "chatPermissions": "Chat permissions", + "@chatPermissions": {}, + "editDisplayname": "Edit displayname", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "editRoomAliases": "Edit room aliases", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "Edit room avatar", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "Emote already exists!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "Invalid emote shortcode!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emoteKeyboardNoRecents": "Recently-used emotes will appear here...", + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "emotePacks": "Emote packs for room", + "@emotePacks": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "Emote Settings", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "globalChatId": "Global chat ID", + "@globalChatId": {}, + "accessAndVisibility": "Access and visibility", + "@accessAndVisibility": {}, + "accessAndVisibilityDescription": "Who is allowed to join this chat and how the chat can be discovered.", + "@accessAndVisibilityDescription": {}, + "calls": "Calls", + "@calls": {}, + "customEmojisAndStickers": "Custom emojis and stickers", + "@customEmojisAndStickers": {}, + "customEmojisAndStickersBody": "Add or share custom emojis or stickers which can be used in any chat.", + "@customEmojisAndStickersBody": {}, + "emoteShortcode": "Emote shortcode", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emoteWarnNeedToPick": "You need to pick an emote shortcode and an image!", + "@emoteWarnNeedToPick": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "Empty chat", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "Enable emote pack globally", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "Enable encryption", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "You won't be able to disable the encryption anymore. Are you sure?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "encrypted": "Encrypted", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "encryption": "Encryption", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "Encryption is not enabled", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName} ended the call", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "enterAnEmailAddress": "Enter an email address", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "homeserver": "Homeserver", + "@homeserver": {}, + "enterYourHomeserver": "Enter your homeserver", + "@enterYourHomeserver": { + "type": "String", + "placeholders": {} + }, + "errorObtainingLocation": "Error obtaining location: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "everythingReady": "Everything ready!", + "@everythingReady": { + "type": "String", + "placeholders": {} + }, + "extremeOffensive": "Extremely offensive", + "@extremeOffensive": { + "type": "String", + "placeholders": {} + }, + "fileName": "File name", + "@fileName": { + "type": "String", + "placeholders": {} + }, + "fluffychat": "Extera", + "@fluffychat": { + "type": "String", + "placeholders": {} + }, + "fontSize": "Font size", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "forward": "Forward", + "@forward": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "From joining", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "From the invitation", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "goToTheNewRoom": "Go to the new room", + "@goToTheNewRoom": { + "type": "String", + "placeholders": {} + }, + "group": "Group", + "@group": { + "type": "String", + "placeholders": {} + }, + "chatDescription": "Chat description", + "@chatDescription": {}, + "chatDescriptionHasBeenChanged": "Chat description changed", + "@chatDescriptionHasBeenChanged": {}, + "groupIsPublic": "Group is public", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "groups": "Groups", + "@groups": { + "type": "String", + "placeholders": {} + }, + "groupWith": "Group with {displayname}", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "guestsAreForbidden": "Guests are forbidden", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "Guests can join", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{username} has withdrawn the invitation for {targetName}", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "help": "Help", + "@help": { + "type": "String", + "placeholders": {} + }, + "hideRedactedEvents": "Hide redacted events", + "@hideRedactedEvents": { + "type": "String", + "placeholders": {} + }, + "hideRedactedMessages": "Hide redacted messages", + "@hideRedactedMessages": {}, + "hideRedactedMessagesBody": "If someone redacts a message, this message won't be visible in the chat anymore.", + "@hideRedactedMessagesBody": {}, + "hideInvalidOrUnknownMessageFormats": "Hide invalid or unknown message formats", + "@hideInvalidOrUnknownMessageFormats": {}, + "howOffensiveIsThisContent": "How offensive is this content?", + "@howOffensiveIsThisContent": { + "type": "String", + "placeholders": {} + }, + "id": "ID", + "@id": { + "type": "String", + "placeholders": {} + }, + "identity": "Identity", + "@identity": { + "type": "String", + "placeholders": {} + }, + "block": "Block", + "@block": {}, + "blockedUsers": "Blocked users", + "@blockedUsers": {}, + "blockListDescription": "You can block users who are disturbing you. You won't be able to receive any messages or room invites from the users on your personal block list.", + "@blockListDescription": {}, + "blockUsername": "Ignore username", + "@blockUsername": {}, + "iHaveClickedOnLink": "I have clicked on the link", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "Incorrect passphrase or recovery key", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "inoffensive": "Inoffensive", + "@inoffensive": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "Invite contact", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroupQuestion": "Do you want to invite {contact} to the chat \"{groupName}\"?", + "@inviteContactToGroupQuestion": {}, + "inviteContactToGroup": "Invite contact to {groupName}", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "noChatDescriptionYet": "No chat description created yet.", + "@noChatDescriptionYet": {}, + "tryAgain": "Try again", + "@tryAgain": {}, + "invalidServerName": "Invalid server name", + "@invalidServerName": {}, + "invited": "Invited", + "@invited": { + "type": "String", + "placeholders": {} + }, + "redactMessageDescription": "The message will be redacted for all participants in this conversation. This cannot be undone.", + "@redactMessageDescription": {}, + "optionalRedactReason": "(Optional) Reason for redacting this message...", + "@optionalRedactReason": {}, + "invitedUser": "📩 {username} invited {targetName}", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "invitedUsersOnly": "Invited users only", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "inviteForMe": "Invite for me", + "@inviteForMe": { + "type": "String", + "placeholders": {} + }, + "inviteText": "{username} invited you to Extera.\n1. Visit fluffychat.im and install the app \n2. Sign up or sign in \n3. Open the invite link: \n {link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "isTyping": "is typing…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "👋 {username} joined the chat", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "joinRoom": "Join room", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "kicked": "👞 {username} kicked {targetName}", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickedAndBanned": "🙅 {username} kicked and banned {targetName}", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickFromChat": "Kick from chat", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "Last active: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "leave": "Leave", + "@leave": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "Left the chat", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "license": "License", + "@license": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "Light", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "Load {count} more participants", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "dehydrate": "Export session and wipe device", + "@dehydrate": {}, + "dehydrateWarning": "This action cannot be undone. Ensure you safely store the backup file.", + "@dehydrateWarning": {}, + "dehydrateTor": "TOR Users: Export session", + "@dehydrateTor": {}, + "dehydrateTorLong": "For TOR users, it is recommended to export the session before closing the window.", + "@dehydrateTorLong": {}, + "hydrateTor": "TOR Users: Import session export", + "@hydrateTor": {}, + "hydrateTorLong": "Did you export your session last time on TOR? Quickly import it and continue chatting.", + "@hydrateTorLong": {}, + "hydrate": "Restore from backup file", + "@hydrate": {}, + "loadingPleaseWait": "Loading… Please wait.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "loadMore": "Load more…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "locationDisabledNotice": "Location services are disabled. Please enable them to be able to share your location.", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "locationPermissionDeniedNotice": "Location permission denied. Please grant them to be able to share your location.", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "login": "Login", + "@login": { + "type": "String", + "placeholders": {} + }, + "logInTo": "Log in to {homeserver}", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "logout": "Logout", + "@logout": { + "type": "String", + "placeholders": {} + }, + "memberChanges": "Member changes", + "@memberChanges": { + "type": "String", + "placeholders": {} + }, + "mention": "Mention", + "@mention": { + "type": "String", + "placeholders": {} + }, + "messages": "Messages", + "@messages": { + "type": "String", + "placeholders": {} + }, + "messagesStyle": "Messages:", + "@messagesStyle": {}, + "moderator": "Moderator", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "muteChat": "Mute chat", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "needPantalaimonWarning": "Please be aware that you need Pantalaimon to use end-to-end encryption for now.", + "@needPantalaimonWarning": { + "type": "String", + "placeholders": {} + }, + "newChat": "New chat", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "💬 New message in Extera", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "New verification request!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "next": "Next", + "@next": { + "type": "String", + "placeholders": {} + }, + "no": "No", + "@no": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "No connection to the server", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "No emotes found. 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "You can only activate encryption as soon as the room is no longer publicly accessible.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "Firebase Cloud Messaging doesn't appear to be available on your device. To still receive push notifications, we recommend installing ntfy. With ntfy or another Unified Push provider you can receive push notifications in a data secure way. You can download ntfy from the PlayStore or from F-Droid.", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "noMatrixServer": "{server1} is no matrix server, use {server2} instead?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "shareInviteLink": "Share invite link", + "@shareInviteLink": {}, + "scanQrCode": "Scan QR code", + "@scanQrCode": {}, + "none": "None", + "@none": { + "type": "String", + "placeholders": {} + }, + "noPasswordRecoveryDescription": "You have not added a way to recover your password yet.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "noPermission": "No permission", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "No rooms found…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "notifications": "Notifications", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "notificationsEnabledForThisAccount": "Notifications enabled for this account", + "@notificationsEnabledForThisAccount": { + "type": "String", + "placeholders": {} + }, + "numUsersTyping": "{count} users are typing…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "obtainingLocation": "Obtaining location…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "offensive": "Offensive", + "@offensive": { + "type": "String", + "placeholders": {} + }, + "offline": "Offline", + "@offline": { + "type": "String", + "placeholders": {} + }, + "ok": "Ok", + "@ok": { + "type": "String", + "placeholders": {} + }, + "online": "Online", + "@online": { + "type": "String", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "Online Key Backup is enabled", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "oopsPushError": "Oops! Unfortunately, an error occurred when setting up the push notifications.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "Oops, something went wrong…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "Open app to read messages", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "openCamera": "Open camera", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "openVideoCamera": "Open camera for a video", + "@openVideoCamera": { + "type": "String", + "placeholders": {} + }, + "oneClientLoggedOut": "One of your clients has been logged out", + "@oneClientLoggedOut": {}, + "addAccount": "Add account", + "@addAccount": {}, + "editBundlesForAccount": "Edit bundles for this account", + "@editBundlesForAccount": {}, + "addToBundle": "Add to bundle", + "@addToBundle": {}, + "removeFromBundle": "Remove from this bundle", + "@removeFromBundle": {}, + "bundleName": "Bundle name", + "@bundleName": {}, + "enableMultiAccounts": "(BETA) Enable multi accounts on this device", + "@enableMultiAccounts": {}, + "openInMaps": "Open in maps", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "link": "Link", + "@link": {}, + "serverRequiresEmail": "This server needs to validate your email address for registration.", + "@serverRequiresEmail": {}, + "or": "Or", + "@or": { + "type": "String", + "placeholders": {} + }, + "participant": "Participant", + "@participant": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "passphrase or recovery key", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "password": "Password", + "@password": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "Password forgotten", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "Password has been changed", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "hideMemberChangesInPublicChats": "Hide member changes in public chats", + "@hideMemberChangesInPublicChats": {}, + "hideMemberChangesInPublicChatsBody": "Do not show in the chat timeline if someone joins or leaves a public chat to improve readability.", + "@hideMemberChangesInPublicChatsBody": {}, + "overview": "Overview", + "@overview": {}, + "notifyMeFor": "Notify me for", + "@notifyMeFor": {}, + "passwordRecoverySettings": "Password recovery settings", + "@passwordRecoverySettings": {}, + "passwordRecovery": "Password recovery", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "people": "People", + "@people": { + "type": "String", + "placeholders": {} + }, + "pickImage": "Pick an image", + "@pickImage": { + "type": "String", + "placeholders": {} + }, + "pin": "Pin", + "@pin": { + "type": "String", + "placeholders": {} + }, + "play": "Play {fileName}", + "@play": { + "type": "String", + "placeholders": { + "fileName": { + "type": "String" + } + } + }, + "pleaseChoose": "Please choose", + "@pleaseChoose": { + "type": "String", + "placeholders": {} + }, + "pleaseChooseAPasscode": "Please choose a pass code", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "pleaseClickOnLink": "Please click on the link in the email and then proceed.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "pleaseEnter4Digits": "Please enter 4 digits or leave empty to disable app lock.", + "@pleaseEnter4Digits": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterRecoveryKey": "Please enter your recovery key:", + "@pleaseEnterRecoveryKey": {}, + "pleaseEnterYourPassword": "Please enter your password", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPin": "Please enter your pin", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "Please enter your username", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "Please follow the instructions on the website and tap on next.", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "privacy": "Privacy", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "Public Rooms", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "pushRules": "Push rules", + "@pushRules": { + "type": "String", + "placeholders": {} + }, + "reason": "Reason", + "@reason": { + "type": "String", + "placeholders": {} + }, + "recording": "Recording", + "@recording": { + "type": "String", + "placeholders": {} + }, + "redactedBy": "Redacted by {username}", + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "directChat": "Direct chat", + "@directChat": {}, + "redactedByBecause": "Redacted by {username} because: \"{reason}\"", + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "redactedAnEvent": "{username} redacted an event", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "redactMessage": "Redact message", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "register": "Register", + "@register": { + "type": "String", + "placeholders": {} + }, + "reject": "Reject", + "@reject": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "{username} rejected the invitation", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "rejoin": "Rejoin", + "@rejoin": { + "type": "String", + "placeholders": {} + }, + "removeAllOtherDevices": "Remove all other devices", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "removedBy": "Removed by {username}", + "@removedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "removeDevice": "Remove device", + "@removeDevice": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "Unban from chat", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "removeYourAvatar": "Remove your avatar", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "replaceRoomWithNewerVersion": "Replace room with newer version", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "reply": "Reply", + "@reply": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "Report message", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "translateMessage": "Translate message", + "@translateMessage": { + "type": "String", + "placeholders": {} + }, + "translatedMessage": "Translated message", + "@translatedMessage": { + "type": "String", + "placeholders": {} + }, + "errorTranslatingMessage": "An error has occured while translating the message.", + "@errorTranslatingMessage": { + "type": "String", + "placeholders": {} + }, + "recoverMessage": "Recover message", + "@recoverMessage": { + "type": "String", + "placeholders": {} + }, + "recoveredMessage": "Recovered message", + "@recoveredMessage": { + "type": "String", + "placeholders": {} + }, + "errorRecoveringMessage": "An error has occured while recovering the message.", + "@errorRecoveringMessage": { + "type": "String", + "placeholders": {} + }, + "errorRecoveringMessageNoAdmin": "This feature is available on Synapse homeservers only for adminstrators.", + "@errorRecoveringMessageNoAdmin": { + "type": "String", + "placeholders": {} + }, + "requestPermission": "Request permission", + "@requestPermission": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "Room has been upgraded", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "Room version", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "saveFile": "Save file", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "retry": "Retry", + "@retry": { + "type": "String", + "placeholders": {} + }, + "search": "Search", + "@search": { + "type": "String", + "placeholders": {} + }, + "security": "Security", + "@security": { + "type": "String", + "placeholders": {} + }, + "recoveryKey": "Recovery key", + "@recoveryKey": {}, + "recoveryKeyLost": "Recovery key lost?", + "@recoveryKeyLost": {}, + "seenByUser": "Seen by {username}", + "@seenByUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "send": "Send", + "@send": { + "type": "String", + "placeholders": {} + }, + "sendAMessage": "Send a message", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "sendAsText": "Send as text", + "@sendAsText": { + "type": "String" + }, + "sendAudio": "Send audio", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendFile": "Send file", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendImage": "Send image", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendImages": "Send {count} image", + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "sendMessages": "Send messages", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "sendOriginal": "Send original", + "@sendOriginal": { + "type": "String", + "placeholders": {} + }, + "sendSticker": "Send sticker", + "@sendSticker": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "Send video", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "sentAFile": "📁 {username} sent a file", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAnAudio": "🎤 {username} sent an audio", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAPicture": "🖼️ {username} sent a picture", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentASticker": "😊 {username} sent a sticker", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "🎥 {username} sent a video", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentCallInformations": "{senderName} sent call information", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "separateChatTypes": "Separate Direct Chats and Groups", + "@separateChatTypes": { + "type": "String", + "placeholders": {} + }, + "setAsCanonicalAlias": "Set as main alias", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "setCustomEmotes": "Set custom emotes", + "@setCustomEmotes": { + "type": "String", + "placeholders": {} + }, + "setChatDescription": "Set chat description", + "@setChatDescription": {}, + "setInvitationLink": "Set invitation link", + "@setInvitationLink": { + "type": "String", + "placeholders": {} + }, + "setPermissionsLevel": "Set permissions level", + "@setPermissionsLevel": { + "type": "String", + "placeholders": {} + }, + "setStatus": "Set status", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "settings": "Settings", + "@settings": { + "type": "String", + "placeholders": {} + }, + "share": "Share", + "@share": { + "type": "String", + "placeholders": {} + }, + "sharedTheLocation": "{username} shared their location", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "shareLocation": "Share location", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "showPassword": "Show password", + "@showPassword": { + "type": "String", + "placeholders": {} + }, + "presenceStyle": "Presence:", + "@presenceStyle": { + "type": "String", + "placeholders": {} + }, + "hideAvatarsInInvites": "Hide avatars in invites", + "@hideAvatarsInInvites": { + "type": "String", + "placeholders": {} + }, + "hideAvatarsInInvitesDescription": "Do not show room avatars in invites", + "@hideAvatarsInInvitesDescription": { + "type": "String", + "placeholders": {} + }, + "presencesToggle": "Show status messages from other users", + "@presencesToggle": { + "type": "String", + "placeholders": {} + }, + "pureBlackToggle": "Pure Black", + "@pureBlackToggle": { + "type": "String", + "placeholders": {} + }, + "singlesignon": "Single Sign on", + "@singlesignon": { + "type": "String", + "placeholders": {} + }, + "skip": "Skip", + "@skip": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "Source code", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "spaceIsPublic": "Space is public", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "spaceName": "Space name", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "startedACall": "{senderName} started a call", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "startFirstChat": "Start your first chat", + "@startFirstChat": {}, + "status": "Status", + "@status": { + "type": "String", + "placeholders": {} + }, + "statusExampleMessage": "How are you today?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "submit": "Submit", + "@submit": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWait": "Synchronizing… Please wait.", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWaitCounter": " Synchronizing… ({percentage}%)", + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "systemTheme": "System", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "They Don't Match", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "They Match", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "title": "Extera", + "@title": { + "description": "Title for the application", + "type": "String", + "placeholders": {} + }, + "toggleFavorite": "Toggle Favorite", + "@toggleFavorite": { + "type": "String", + "placeholders": {} + }, + "toggleMuted": "Toggle Muted", + "@toggleMuted": { + "type": "String", + "placeholders": {} + }, + "toggleUnread": "Mark Read/Unread", + "@toggleUnread": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "Too many requests. Please try again later!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "transferFromAnotherDevice": "Transfer from another device", + "@transferFromAnotherDevice": { + "type": "String", + "placeholders": {} + }, + "tryToSendAgain": "Try to send again", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "unavailable": "Unavailable", + "@unavailable": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username} unbanned {targetName}", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "unblockDevice": "Unblock Device", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "Unknown device", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "unknownEncryptionAlgorithm": "Unknown encryption algorithm", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unknownEvent": "Unknown event '{type}'", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "unmuteChat": "Unmute chat", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "unpin": "Unpin", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "unreadChats": "{unreadCount, plural, =1{1 unread chat} other{{unreadCount} unread chats}}", + "@unreadChats": { + "type": "String", + "placeholders": { + "unreadCount": { + "type": "int" + } + } + }, + "userAndOthersAreTyping": "{username} and {count} others are typing…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "userAndUserAreTyping": "{username} and {username2} are typing…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userIsTyping": "{username} is typing…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userLeftTheChat": "🚪 {username} left the chat", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "username": "Username", + "@username": { + "type": "String", + "placeholders": {} + }, + "userSentUnknownEvent": "{username} sent a {type} event", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "unverified": "Unverified", + "@unverified": {}, + "verified": "Verified", + "@verified": { + "type": "String", + "placeholders": {} + }, + "verify": "Verify", + "@verify": { + "type": "String", + "placeholders": {} + }, + "verifyStart": "Start Verification", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "You successfully verified!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "verifyTitle": "Verifying other account", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "videoCall": "Video call", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "Visibility of the chat history", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "Visible for all participants", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "Visible for everyone", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "Voice message", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "Waiting for partner to accept the request…", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "Waiting for partner to accept the emoji…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "Waiting for partner to accept the numbers…", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "wallpaper": "Wallpaper:", + "@wallpaper": { + "type": "String", + "placeholders": {} + }, + "warning": "Warning!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "weSentYouAnEmail": "We sent you an email", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "whoCanPerformWhichAction": "Who can perform which action", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "Who is allowed to join this group", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "Why do you want to report this?", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "wipeChatBackup": "Wipe your chat backup to create a new recovery key?", + "@wipeChatBackup": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "With these addresses you can recover your password.", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "Write a message…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "yes": "Yes", + "@yes": { + "type": "String", + "placeholders": {} + }, + "you": "You", + "@you": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "You are no longer participating in this chat", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "You have been banned from this chat", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "yourPublicKey": "Your public key", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "messageInfo": "Message info", + "@messageInfo": {}, + "time": "Time", + "@time": {}, + "messageType": "Message Type", + "@messageType": {}, + "sender": "Sender", + "@sender": {}, + "openGallery": "Open gallery", + "@openGallery": {}, + "removeFromSpace": "Remove from space", + "@removeFromSpace": {}, + "addToSpaceDescription": "Select a space to add this chat to it.", + "@addToSpaceDescription": {}, + "start": "Start", + "@start": {}, + "pleaseEnterRecoveryKeyDescription": "To unlock your old messages, please enter your recovery key that has been generated in a previous session. Your recovery key is NOT your password.", + "@pleaseEnterRecoveryKeyDescription": {}, + "publish": "Publish", + "@publish": {}, + "videoWithSize": "Video ({size})", + "@videoWithSize": { + "type": "String", + "placeholders": { + "size": { + "type": "String" + } + } + }, + "openChat": "Open Chat", + "@openChat": {}, + "markAsRead": "Mark as read", + "@markAsRead": {}, + "reportUser": "Report user", + "@reportUser": {}, + "dismiss": "Dismiss", + "@dismiss": {}, + "reactedWith": "{sender} reacted with {reaction}", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "pinMessage": "Pin to room", + "@pinMessage": {}, + "confirmEventUnpin": "Are you sure to permanently unpin the event?", + "@confirmEventUnpin": {}, + "emojis": "Emojis", + "@emojis": {}, + "placeCall": "Place call", + "@placeCall": {}, + "voiceCall": "Voice call", + "@voiceCall": {}, + "unsupportedAndroidVersion": "Unsupported Android version", + "@unsupportedAndroidVersion": {}, + "unsupportedAndroidVersionLong": "This feature requires a newer Android version. Please check for updates or Lineage OS support.", + "@unsupportedAndroidVersionLong": {}, + "videoCallsBetaWarning": "Please note that video calls are currently in beta. They might not work as expected or work at all on all platforms.", + "@videoCallsBetaWarning": {}, + "experimentalVideoCalls": "Experimental video calls", + "@experimentalVideoCalls": {}, + "emailOrUsername": "Email or username", + "@emailOrUsername": {}, + "indexedDbErrorTitle": "Private mode issues", + "@indexedDbErrorTitle": {}, + "indexedDbErrorLong": "The message storage is unfortunately not enabled in private mode by default.\nPlease visit\n - about:config\n - set dom.indexedDB.privateBrowsing.enabled to true\nOtherwise, it is not possible to run Extera.", + "@indexedDbErrorLong": {}, + "switchToAccount": "Switch to account {number}", + "@switchToAccount": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "nextAccount": "Next account", + "@nextAccount": {}, + "previousAccount": "Previous account", + "@previousAccount": {}, + "addWidget": "Add widget", + "@addWidget": {}, + "widgetVideo": "Video", + "@widgetVideo": {}, + "widgetEtherpad": "Text note", + "@widgetEtherpad": {}, + "widgetJitsi": "Jitsi Meet", + "@widgetJitsi": {}, + "widgetCustom": "Custom", + "@widgetCustom": {}, + "widgetName": "Name", + "@widgetName": {}, + "widgetUrlError": "This is not a valid URL.", + "@widgetUrlError": {}, + "widgetNameError": "Please provide a display name.", + "@widgetNameError": {}, + "errorAddingWidget": "Error adding the widget.", + "@errorAddingWidget": {}, + "youRejectedTheInvitation": "You rejected the invitation", + "@youRejectedTheInvitation": {}, + "youJoinedTheChat": "You joined the chat", + "@youJoinedTheChat": {}, + "youAcceptedTheInvitation": "👍 You accepted the invitation", + "@youAcceptedTheInvitation": {}, + "youBannedUser": "You banned {user}", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youHaveWithdrawnTheInvitationFor": "You have withdrawn the invitation for {user}", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedToBy": "📩 You have been invited via link to:\n{alias}", + "@youInvitedToBy": { + "placeholders": { + "alias": { + "type": "String" + } + } + }, + "youInvitedBy": "📩 You have been invited by {user}", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "invitedBy": "📩 Invited by {user}", + "@invitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedUser": "📩 You invited {user}", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKicked": "👞 You kicked {user}", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKickedAndBanned": "🙅 You kicked and banned {user}", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youUnbannedUser": "You unbanned {user}", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "hasKnocked": "🚪 {user} has knocked", + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "usersMustKnock": "Users must knock", + "@usersMustKnock": {}, + "noOneCanJoin": "No one can join", + "@noOneCanJoin": {}, + "userWouldLikeToChangeTheChat": "{user} would like to join the chat.", + "@userWouldLikeToChangeTheChat": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "noPublicLinkHasBeenCreatedYet": "No public link has been created yet", + "@noPublicLinkHasBeenCreatedYet": {}, + "knock": "Knock", + "@knock": {}, + "users": "Users", + "@users": {}, + "unlockOldMessages": "Unlock old messages", + "@unlockOldMessages": {}, + "storeInSecureStorageDescription": "Store the recovery key in the secure storage of this device.", + "@storeInSecureStorageDescription": {}, + "saveKeyManuallyDescription": "Save this key manually by triggering the system share dialog or clipboard.", + "@saveKeyManuallyDescription": {}, + "storeInAndroidKeystore": "Store in Android KeyStore", + "@storeInAndroidKeystore": {}, + "storeInAppleKeyChain": "Store in Apple KeyChain", + "@storeInAppleKeyChain": {}, + "storeSecurlyOnThisDevice": "Store securely on this device", + "@storeSecurlyOnThisDevice": {}, + "countFiles": "{count} files", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "user": "User", + "@user": {}, + "custom": "Custom", + "@custom": {}, + "foregroundServiceRunning": "This notification appears when the foreground service is running.", + "@foregroundServiceRunning": {}, + "screenSharingTitle": "screen sharing", + "@screenSharingTitle": {}, + "screenSharingDetail": "You are sharing your screen in Extera", + "@screenSharingDetail": {}, + "callingPermissions": "Calling permissions", + "@callingPermissions": {}, + "callingAccount": "Calling account", + "@callingAccount": {}, + "callingAccountDetails": "Allows Extera to use the native android dialer app.", + "@callingAccountDetails": {}, + "appearOnTop": "Appear on top", + "@appearOnTop": {}, + "appearOnTopDetails": "Allows the app to appear on top (not needed if you already have Fluffychat setup as a calling account)", + "@appearOnTopDetails": {}, + "otherCallingPermissions": "Microphone, camera and other Extera permissions", + "@otherCallingPermissions": {}, + "whyIsThisMessageEncrypted": "Why is this message unreadable?", + "@whyIsThisMessageEncrypted": {}, + "noKeyForThisMessage": "This can happen if the message was sent before you have signed in to your account at this device.\n\nIt is also possible that the sender has blocked your device or something went wrong with the internet connection.\n\nAre you able to read the message on another session? Then you can transfer the message from it! Go to Settings > Devices and make sure that your devices have verified each other. When you open the room the next time and both sessions are in the foreground, the keys will be transmitted automatically.\n\nDo you not want to lose the keys when logging out or switching devices? Make sure that you have enabled the chat backup in the settings.", + "@noKeyForThisMessage": {}, + "newGroup": "New group", + "@newGroup": {}, + "newSpace": "New space", + "@newSpace": {}, + "enterSpace": "Enter space", + "@enterSpace": {}, + "enterRoom": "Enter room", + "@enterRoom": {}, + "allSpaces": "All spaces", + "@allSpaces": {}, + "numChats": "{number} chats", + "@numChats": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "hideUnimportantStateEvents": "Hide unimportant state events", + "@hideUnimportantStateEvents": {}, + "hidePresences": "Hide Status List?", + "@hidePresences": {}, + "doNotShowAgain": "Do not show again", + "@doNotShowAgain": {}, + "wasDirectChatDisplayName": "Empty chat (was {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "newSpaceDescription": "Spaces allows you to consolidate your chats and build private or public communities.", + "@newSpaceDescription": {}, + "encryptThisChat": "Encrypt this chat", + "@encryptThisChat": {}, + "disableEncryptionWarning": "For security reasons you can not disable encryption in a chat, where it has been enabled before.", + "@disableEncryptionWarning": {}, + "sorryThatsNotPossible": "Sorry... that is not possible", + "@sorryThatsNotPossible": {}, + "deviceKeys": "Device keys:", + "@deviceKeys": {}, + "reopenChat": "Reopen chat", + "@reopenChat": {}, + "noBackupWarning": "Warning! Without enabling chat backup, you will lose access to your encrypted messages. It is highly recommended to enable the chat backup first before logging out.", + "@noBackupWarning": {}, + "noOtherDevicesFound": "No other devices found", + "@noOtherDevicesFound": {}, + "fileIsTooBigForServer": "Unable to send! The server only supports attachments up to {max}.", + "@fileIsTooBigForServer": { + "type": "String", + "placeholders": { + "max": { + "type": "String" + } + } + }, + "fileHasBeenSavedAt": "File has been saved at {path}", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "jumpToLastReadMessage": "Jump to last read message", + "@jumpToLastReadMessage": {}, + "readUpToHere": "Read up to here", + "@readUpToHere": {}, + "jump": "Jump", + "@jump": {}, + "openLinkInBrowser": "Open link in browser", + "@openLinkInBrowser": {}, + "reportErrorDescription": "😭 Oh no. Something went wrong. If you want, you can report this bug to the developers.", + "@reportErrorDescription": {}, + "report": "Report", + "@report": {}, + "signInWithPassword": "Sign in with password", + "@signInWithPassword": {}, + "pleaseTryAgainLaterOrChooseDifferentServer": "Please try again later or choose a different server.", + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "signInWith": "Sign in with {provider}", + "@signInWith": { + "type": "String", + "placeholders": { + "provider": { + "type": "String" + } + } + }, + "profileNotFound": "The user could not be found on the server. Maybe there is a connection problem or the user doesn't exist.", + "@profileNotFound": {}, + "setTheme": "Set theme:", + "@setTheme": {}, + "setColorTheme": "Set color theme:", + "@setColorTheme": {}, + "invite": "Invite", + "@invite": {}, + "inviteGroupChat": "📨 Invite group chat", + "@inviteGroupChat": {}, + "invitePrivateChat": "📨 Invite private chat", + "@invitePrivateChat": {}, + "invalidInput": "Invalid input!", + "@invalidInput": {}, + "wrongPinEntered": "Wrong pin entered! Try again in {seconds} seconds...", + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "pleaseEnterANumber": "Please enter a number greater than 0", + "@pleaseEnterANumber": {}, + "archiveRoomDescription": "The chat will be moved to the archive. Other users will be able to see that you have left the chat.", + "@archiveRoomDescription": {}, + "roomUpgradeDescription": "The chat will then be recreated with the new room version. All participants will be notified that they need to switch to the new chat. You can find out more about room versions at https://spec.matrix.org/latest/rooms/", + "@roomUpgradeDescription": {}, + "removeDevicesDescription": "You will be logged out of this device and will no longer be able to receive messages.", + "@removeDevicesDescription": {}, + "banUserDescription": "The user will be banned from the chat and will not be able to enter the chat again until they are unbanned.", + "@banUserDescription": {}, + "unbanUserDescription": "The user will be able to enter the chat again if they try.", + "@unbanUserDescription": {}, + "kickUserDescription": "The user is kicked out of the chat but not banned. In public chats, the user can rejoin at any time.", + "@kickUserDescription": {}, + "makeAdminDescription": "Once you make this user admin, you may not be able to undo this as they will then have the same permissions as you.", + "@makeAdminDescription": {}, + "pushNotificationsNotAvailable": "Push notifications not available", + "@pushNotificationsNotAvailable": {}, + "learnMore": "Learn more", + "@learnMore": {}, + "yourGlobalUserIdIs": "Your global user-ID is: ", + "@yourGlobalUserIdIs": {}, + "noUsersFoundWithQuery": "Unfortunately no user could be found with \"{query}\". Please check whether you made a typo.", + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "knocking": "Knocking", + "@knocking": {}, + "chatCanBeDiscoveredViaSearchOnServer": "Chat can be discovered via the search on {server}", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "searchChatsRooms": "Search for #chats, @users...", + "@searchChatsRooms": {}, + "nothingFound": "Nothing found...", + "@nothingFound": {}, + "groupName": "Group name", + "@groupName": {}, + "createGroupAndInviteUsers": "Create a group and invite users", + "@createGroupAndInviteUsers": {}, + "groupCanBeFoundViaSearch": "Group can be found via search", + "@groupCanBeFoundViaSearch": {}, + "wrongRecoveryKey": "Sorry... this does not seem to be the correct recovery key.", + "@wrongRecoveryKey": {}, + "startConversation": "Start conversation", + "@startConversation": {}, + "commandHint_sendraw": "Send raw json", + "@commandHint_sendraw": {}, + "databaseMigrationTitle": "Database is optimized", + "@databaseMigrationTitle": {}, + "databaseMigrationBody": "Please wait. This may take a moment.", + "@databaseMigrationBody": {}, + "leaveEmptyToClearStatus": "Leave empty to clear your status.", + "@leaveEmptyToClearStatus": {}, + "select": "Select", + "@select": {}, + "searchForUsers": "Search for @users...", + "@searchForUsers": {}, + "pleaseEnterYourCurrentPassword": "Please enter your current password", + "@pleaseEnterYourCurrentPassword": {}, + "newPassword": "New password", + "@newPassword": {}, + "pleaseChooseAStrongPassword": "Please choose a strong password", + "@pleaseChooseAStrongPassword": {}, + "passwordsDoNotMatch": "Passwords do not match", + "@passwordsDoNotMatch": {}, + "passwordIsWrong": "Your entered password is wrong", + "@passwordIsWrong": {}, + "publicLink": "Public link", + "@publicLink": {}, + "publicChatAddresses": "Public chat addresses", + "@publicChatAddresses": {}, + "createNewAddress": "Create new address", + "@createNewAddress": {}, + "joinSpace": "Join space", + "@joinSpace": {}, + "publicSpaces": "Public spaces", + "@publicSpaces": {}, + "addChatOrSubSpace": "Add chat or sub space", + "@addChatOrSubSpace": {}, + "subspace": "Subspace", + "@subspace": {}, + "decline": "Decline", + "@decline": {}, + "thisDevice": "This device:", + "@thisDevice": {}, + "initAppError": "An error occured while init the app", + "@initAppError": {}, + "userRole": "User role", + "@userRole": {}, + "minimumPowerLevel": "{level} is the minimum power level.", + "@minimumPowerLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "String" + } + } + }, + "searchIn": "Search in chat \"{chat}\"...", + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "searchMore": "Search more...", + "@searchMore": {}, + "gallery": "Gallery", + "@gallery": {}, + "files": "Files", + "@files": {}, + "databaseBuildErrorBody": "Unable to build the SQlite database. The app tries to use the legacy database for now. Please report this error to the developers at {url}. The error message is: {error}", + "@databaseBuildErrorBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "sessionLostBody": "Your session is lost. Please report this error to the developers at {url}. The error message is: {error}", + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "restoreSessionBody": "The app now tries to restore your session from the backup. Please report this error to the developers at {url}. The error message is: {error}", + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "forwardMessageTo": "Forward message to {roomName}?", + "@forwardMessageTo": { + "type": "String", + "placeholders": { + "roomName": { + "type": "String" + } + } + }, + "sendReadReceipts": "Send read receipts", + "@sendReadReceipts": {}, + "sendTypingNotificationsDescription": "Other participants in a chat can see when you are typing a new message.", + "@sendTypingNotificationsDescription": {}, + "sendReadReceiptsDescription": "Other participants in a chat can see when you have read a message.", + "@sendReadReceiptsDescription": {}, + "formattedMessages": "Formatted messages", + "@formattedMessages": {}, + "formattedMessagesDescription": "Display rich message content like bold text using markdown.", + "@formattedMessagesDescription": {}, + "verifyOtherUser": "🔐 Verify other user", + "@verifyOtherUser": {}, + "verifyOtherUserDescription": "If you verify another user, you can be sure that you know who you are really writing to. 💪\n\nWhen you start a verification, you and the other user will see a popup in the app. There you will then see a series of emojis or numbers that you have to compare with each other.\n\nThe best way to do this is to meet up or start a video call. 👭", + "@verifyOtherUserDescription": {}, + "verifyOtherDevice": "🔐 Verify other device", + "@verifyOtherDevice": {}, + "verifyOtherDeviceDescription": "When you verify another device, those devices can exchange keys, increasing your overall security. 💪 When you start a verification, a popup will appear in the app on both devices. There you will then see a series of emojis or numbers that you have to compare with each other. It's best to have both devices handy before you start the verification. 🤳", + "@verifyOtherDeviceDescription": {}, + "acceptedKeyVerification": "{sender} accepted key verification", + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "canceledKeyVerification": "{sender} canceled key verification", + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "completedKeyVerification": "{sender} completed key verification", + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "isReadyForKeyVerification": "{sender} is ready for key verification", + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "requestedKeyVerification": "{sender} requested key verification", + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "startedKeyVerification": "{sender} started key verification", + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "transparent": "Transparent", + "@transparent": {}, + "incomingMessages": "Incoming messages", + "@incomingMessages": {}, + "stickers": "Stickers", + "@stickers": {}, + "discover": "Discover", + "@discover": {}, + "commandHint_ignore": "Ignore the given matrix ID", + "@commandHint_ignore": {}, + "commandHint_unignore": "Unignore the given matrix ID", + "@commandHint_unignore": {}, + "unreadChatsInApp": "{appname}: {unread} unread chats", + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "noDatabaseEncryption": "Database encryption is not supported on this platform", + "@noDatabaseEncryption": {}, + "thereAreCountUsersBlocked": "Right now there are {count} users blocked.", + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "restricted": "Restricted", + "@restricted": {}, + "knockRestricted": "Knock restricted", + "@knockRestricted": {}, + "goToSpace": "Go to space: {space}", + "@goToSpace": { + "type": "String", + "space": {} + }, + "markAsUnread": "Mark as unread", + "userLevel": "{level} - User", + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "moderatorLevel": "{level} - Moderator", + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "adminLevel": "{level} - Admin", + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "changeGeneralChatSettings": "Change general chat settings", + "inviteOtherUsers": "Invite other users to this chat", + "changeTheChatPermissions": "Change the chat permissions", + "changeTheVisibilityOfChatHistory": "Change the visibility of the chat history", + "changeTheCanonicalRoomAlias": "Change the main public chat address", + "sendRoomNotifications": "Send a @room notifications", + "changeTheDescriptionOfTheGroup": "Change the description of the chat", + "chatPermissionsDescription": "Define which power level is necessary for certain actions in this chat. The power levels 0, 50 and 100 are usually representing users, moderators and admins, but any gradation is possible.", + "updateInstalled": "🎉 Update {version} installed!", + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "changelog": "Changelog", + "sendCanceled": "Sending canceled", + "loginWithMatrixId": "Login with Matrix-ID", + "discoverHomeservers": "Discover homeservers", + "whatIsAHomeserver": "What is a homeserver?", + "homeserverDescription": "All your data is stored on the homeserver, just like an email provider. You can choose which homeserver you want to use, while you can still communicate with everyone. Learn more at at https://matrix.org.", + "doesNotSeemToBeAValidHomeserver": "Doesn't seem to be a compatible homeserver. Wrong URL?", + "calculatingFileSize": "Calculating file size...", + "prepareSendingAttachment": "Prepare sending attachment...", + "sendingAttachment": "Sending attachment...", + "generatingVideoThumbnail": "Generating video thumbnail...", + "compressVideo": "Compressing video...", + "sendingAttachmentCountOfCount": "Sending attachment {index} of {length}...", + "@sendingAttachmentCountOfCount": { + "type": "integer", + "placeholders": { + "index": { + "type": "int" + }, + "length": { + "type": "int" + } + } + }, + "serverLimitReached": "Server limit reached! Waiting {seconds} seconds...", + "@serverLimitReached": { + "type": "integer", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "oneOfYourDevicesIsNotVerified": "One of your devices is not verified", + "noticeChatBackupDeviceVerification": "Note: When you connect all your devices to the chat backup, they are automatically verified.", + "continueText": "Continue", + "welcomeText": "Hey Hey 👋 This is Extera. You can sign in to any homeserver, which is compatible with https://matrix.org. And then chat with anyone. It's a huge decentralized messaging network!", + "blur": "Blur:", + "opacity": "Opacity:", + "setWallpaper": "Set wallpaper", + "manageAccount": "Manage account", + "noContactInformationProvided": "Server does not provide any valid contact information", + "contactServerAdmin": "Contact server admin", + "contactServerSecurity": "Contact server security", + "supportPage": "Support page", + "serverInformation": "Server information:", + "name": "Name", + "version": "Version", + "website": "Website", + "compress": "Compress", + "boldText": "Bold text", + "italicText": "Italic text", + "strikeThrough": "Strikethrough", + "pleaseFillOut": "Please fill out", + "invalidUrl": "Invalid url", + "addLink": "Add link", + "unableToJoinChat": "Unable to join chat. Maybe the other party has already closed the conversation.", + "previous": "Previous", + "otherPartyNotLoggedIn": "The other party is currently not logged in and therefore cannot receive messages!", + "appWantsToUseForLogin": "Use '{server}' to log in", + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "appWantsToUseForLoginDescription": "You hereby allow the app and website to share information about you.", + "open": "Open", + "waitingForServer": "Waiting for server...", + "appIntroduction": "Extera lets you chat with your friends across different messengers. Learn more at https://matrix.org or just tap *Continue*.", + "newChatRequest": "📩 New chat request", + "contentNotificationSettings": "Content notification settings", + "generalNotificationSettings": "General notification settings", + "roomNotificationSettings": "Room notification settings", + "userSpecificNotificationSettings": "User specific notification settings", + "otherNotificationSettings": "Other notification settings", + "notificationRuleContainsUserName": "Contains User Name", + "notificationRuleContainsUserNameDescription": "Notifies the user when a message contains their username.", + "notificationRuleMaster": "Mute all notifications", + "notificationRuleMasterDescription": "Overrides all other rules and disables all notifications.", + "notificationRuleSuppressNotices": "Suppress Automated Messages", + "notificationRuleSuppressNoticesDescription": "Suppresses notifications from automated clients like bots.", + "notificationRuleInviteForMe": "Invite for Me", + "notificationRuleInviteForMeDescription": "Notifies the user when they are invited to a room.", + "notificationRuleMemberEvent": "Member Event", + "notificationRuleMemberEventDescription": "Suppresses notifications for membership events.", + "notificationRuleIsUserMention": "User Mention", + "notificationRuleIsUserMentionDescription": "Notifies the user when they are directly mentioned in a message.", + "notificationRuleContainsDisplayName": "Contains Display Name", + "notificationRuleContainsDisplayNameDescription": "Notifies the user when a message contains their display name.", + "notificationRuleIsRoomMention": "Room Mention", + "notificationRuleIsRoomMentionDescription": "Notifies the user when there is a room mention.", + "notificationRuleRoomnotif": "Room Notification", + "notificationRuleRoomnotifDescription": "Notifies the user when a message contains '@room'.", + "notificationRuleTombstone": "Tombstone", + "notificationRuleTombstoneDescription": "Notifies the user about room deactivation messages.", + "notificationRuleReaction": "Reaction", + "notificationRuleReactionDescription": "Suppresses notifications for reactions.", + "notificationRuleRoomServerAcl": "Room Server ACL", + "notificationRuleRoomServerAclDescription": "Suppresses notifications for room server access control lists (ACL).", + "notificationRuleSuppressEdits": "Suppress Edits", + "notificationRuleSuppressEditsDescription": "Suppresses notifications for edited messages.", + "notificationRuleCall": "Call", + "notificationRuleCallDescription": "Notifies the user about calls.", + "notificationRuleEncryptedRoomOneToOne": "Encrypted Room One-to-One", + "notificationRuleEncryptedRoomOneToOneDescription": "Notifies the user about messages in encrypted one-to-one rooms.", + "notificationRuleRoomOneToOne": "Room One-to-One", + "notificationRuleRoomOneToOneDescription": "Notifies the user about messages in one-to-one rooms.", + "notificationRuleMessage": "Message", + "notificationRuleMessageDescription": "Notifies the user about general messages.", + "notificationRuleEncrypted": "Encrypted", + "notificationRuleEncryptedDescription": "Notifies the user about messages in encrypted rooms.", + "notificationRuleJitsi": "Jitsi", + "notificationRuleJitsiDescription": "Notifies the user about Jitsi widget events.", + "notificationRuleServerAcl": "Suppress Server ACL Events", + "notificationRuleServerAclDescription": "Suppresses notifications for Server ACL events.", + "unknownPushRule": "Unknown push rule '{rule}'", + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } + } + }, + "deletePushRuleCanNotBeUndone": "If you delete this notification setting, this can not be undone.", + "more": "More", + "shareKeysWith": "Share keys with...", + "shareKeysWithDescription": "Which devices should be trusted so that they can read along your messages in encrypted chats?", + "allDevices": "All devices", + "crossVerifiedDevicesIfEnabled": "Cross verified devices if enabled", + "crossVerifiedDevices": "Cross verified devices", + "verifiedDevicesOnly": "Verified devices only", + "takeAPhoto": "Take a photo", + "recordAVideo": "Record a video", + "optionalMessage": "(Optional) message...", + "notSupportedOnThisDevice": "Not supported on this device", + "enterNewChat": "Enter new chat", + "approve": "Approve", + "youHaveKnocked": "You have knocked", + "pleaseWaitUntilInvited": "Please wait now, until someone from the room invites you." +} diff --git a/assets/l10n/intl_eo.arb b/assets/l10n/intl_eo.arb new file mode 100644 index 0000000..78e56cc --- /dev/null +++ b/assets/l10n/intl_eo.arb @@ -0,0 +1,2082 @@ +{ + "@@last_modified": "2021-08-14 12:41:10.107750", + "about": "Prio", + "@about": { + "type": "String", + "placeholders": {} + }, + "accept": "Akcepti", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "{username} akceptis la inviton", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "Konto", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "{username} aktivigis tutvojan ĉifradon", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "addEmail": "Aldoni retpoŝtadreson", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "admin": "Administranto", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "kromnomo", + "@alias": { + "type": "String", + "placeholders": {} + }, + "all": "Ĉio", + "@all": { + "type": "String", + "placeholders": {} + }, + "allChats": "Ĉiuj babiloj", + "@allChats": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "{senderName} respondis la vokon", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "Ĉiu ajn povas aliĝi", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "appLock": "Ŝlosado", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "archive": "Arĥivo", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "Ĉu gastoj rajtas aliĝi", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "Ĉu vi certas?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "areYouSureYouWantToLogout": "Ĉu vi certe volas adiaŭi?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "Por ke vi povu kontroli (subskribi) la alian personon, bonvolu enigi pasfrazon de via sekreta deponejo aŭ vian rehavan ŝlosilon.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "Ĉu akcepti ĉi tiun kontrolpeton de {username}?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "badServerLoginTypesException": "La hejmservilo subtenas la jenajn specojn de salutoj:\n{serverVersions}\nSed ĉi tiu aplikaĵo subtenas nur:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "badServerVersionsException": "La hejmservilo subtenas la jenajn version de la specifaĵo:\n{serverVersions}\nSed ĉi tiu aplikaĵo subtenas nur {supportedVersions}", + "@badServerVersionsException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "banFromChat": "Forbari de babilo", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "Forbarita", + "@banned": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username} forbaris uzanton {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "Bloki aparaton", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "blocked": "Blokita", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "botMessages": "Mesaĝoj de robotoj", + "@botMessages": { + "type": "String", + "placeholders": {} + }, + "cancel": "Nuligi", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "cantOpenUri": "Ne povis malfermi URI {uri}", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "changeDeviceName": "Ŝanĝi nomon de aparato", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "{username} ŝanĝis bildon de la babilo", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatDescriptionTo": "{username} ŝanĝis priskribon de la babilo al: «{description}»", + "@changedTheChatDescriptionTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "description": { + "type": "String" + } + } + }, + "changedTheChatNameTo": "{username} ŝanĝis nomon de la babilo al: «{chatname}»", + "@changedTheChatNameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "chatname": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username} ŝanĝis permesojn pri la babilo", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username} ŝanĝis sian prezentan nomon al: {username}", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} ŝanĝis regulojn pri aliro de gastoj", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} ŝanĝis regulojn pri aliro de gastoj al: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username} ŝanĝis videblecon de la historio", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username} ŝanĝis videblecon de la historio al: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username} ŝanĝis regulojn pri aliĝado", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} ŝanĝis regulojn pri aliĝado al: {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} ŝanĝis sian profilbildon", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "{username} ŝanĝis la kromnomojn de la ĉambro", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username} ŝanĝis la invitan ligilon", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changePassword": "Ŝanĝi pasvorton", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "Ŝanĝi hejmservilon", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "Ŝanĝu la haŭton", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "Ŝanĝi nomon de la grupo", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "changeYourAvatar": "Ŝanĝi vian profilbildon", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "La ĉifrado estas difektita", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "chat": "Babilo", + "@chat": { + "type": "String", + "placeholders": {} + }, + "chatBackup": "Savkopiado de babilo", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "chatBackupDescription": "Via savkopio de babilo estas sekurigita per sekureca ŝlosilo. Bonvolu certigi, ke vi ne perdos ĝin.", + "@chatBackupDescription": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Detaloj pri babilo", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chats": "Babiloj", + "@chats": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "Elektu fortan pasvorton", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "clearArchive": "Vakigi arĥivon", + "@clearArchive": {}, + "close": "Fermi", + "@close": { + "type": "String", + "placeholders": {} + }, + "commandHint_ban": "Forbari la donitan uzanton de ĉi tiu ĉambro", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_html": "Sendi tekston formatan je HTML", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_invite": "Inviti la donitan uzanton al ĉi tiu ĉambro", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "commandHint_join": "Aliĝi al la donita ĉambro", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_kick": "Forigi la donitan uzanton de ĉi tiu ĉambro", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_leave": "Foriri de ĉi tiu ĉambro", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_me": "Priskribu vian agon", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "commandHint_myroomavatar": "Agordi vian profilbildon por ĉi tiu ĉambro (laŭ mxc-uri)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_myroomnick": "Agordi vian prezentan nomon en ĉi tiu ĉambro", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "commandHint_op": "Agordi povnivelon de la donita uzanto (implicite: 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_plain": "Sendi senformatan tekston", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_react": "Sendi respondon kiel reagon", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "commandHint_unban": "Malforbari la donitan uzanton de ĉi tiu ĉambro", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "commandInvalid": "Nevalida ordono", + "@commandInvalid": { + "type": "String" + }, + "commandMissing": "{command} ne estas ordono.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "compareEmojiMatch": "Komparu kaj certigu, ke la jenaj bildosignoj samas en ambaŭ aparatoj:", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "Komparu kaj certigu, ke la jenaj numeroj samas en ambaŭ aparatoj:", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "configureChat": "Agordi babilon", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "confirm": "Konfirmi", + "@confirm": { + "type": "String", + "placeholders": {} + }, + "connect": "Konektiĝi", + "@connect": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "Kontakto invitiĝis al la grupo", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "containsDisplayName": "Enhavas prezentan nomon", + "@containsDisplayName": { + "type": "String", + "placeholders": {} + }, + "containsUserName": "Enhavas uzantonomon", + "@containsUserName": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "La enhavo raportiĝis al la administrantoj de la servilo", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "Kopiite al tondujo", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "Kopii", + "@copy": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "Kopii al tondujo", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "Ne povis malĉifri mesaĝon: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "countParticipants": "{count} partoprenantoj", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "create": "Krei", + "@create": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "{username} kreis la babilon", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "createNewSpace": "Nova aro", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "currentlyActive": "Nun aktiva", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "Malhela", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "dateWithoutYear": "{day}a de la {month}a", + "@dateWithoutYear": { + "type": "String", + "placeholders": { + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "dateWithYear": "{day}a de la {month}a de {year}", + "@dateWithYear": { + "type": "String", + "placeholders": { + "year": { + "type": "String" + }, + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "deactivateAccountWarning": "Ĉi tio malaktivigos vian konton de uzanto. Ne eblas tion malfari! Ĉu certe vi certas?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "Norma nivelo de permesoj", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "delete": "Forigi", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "Forigi konton", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "Forigi mesaĝon", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "device": "Aparato", + "@device": { + "type": "String", + "placeholders": {} + }, + "deviceId": "Identigilo de aparato", + "@deviceId": { + "type": "String", + "placeholders": {} + }, + "devices": "Aparatoj", + "@devices": { + "type": "String", + "placeholders": {} + }, + "directChats": "Rektaj babiloj", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "Prezenta nomo ŝanĝiĝis", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "Elŝuti dosieron", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "edit": "Redakti", + "@edit": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "Redakti blokitajn servilojn", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "editDisplayname": "Redakti prezentan nomon", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "editRoomAliases": "Ŝanĝi kromnomojn de ĉambro", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "Redakti bildon de ĉambro", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "Mieneto jam ekzistas!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "Nevalida mallongigo de mieneto!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emotePacks": "Mienetaroj por la ĉambro", + "@emotePacks": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "Agordoj pri mienetoj", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "emoteShortcode": "Mallongigo de mieneto", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emoteWarnNeedToPick": "Vi devas elekti mallongigon de mieneto kaj bildon!", + "@emoteWarnNeedToPick": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "Malplena babilo", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "Ŝalti mienetaron ĉie", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "Ŝalti ĉifradon", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "Vi ne povos malŝalti la ĉifradon. Ĉu vi certas?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "encrypted": "Ĉifrite", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "encryption": "Ĉifrado", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "Ĉifrado ne estas ŝaltita", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName} finis la vokon", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "enterAnEmailAddress": "Enigu retpoŝtadreson", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "enterYourHomeserver": "Enigu vian hejmservilon", + "@enterYourHomeserver": { + "type": "String", + "placeholders": {} + }, + "errorObtainingLocation": "Eraris akirado de loko: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "everythingReady": "Ĉio pretas!", + "@everythingReady": { + "type": "String", + "placeholders": {} + }, + "extremeOffensive": "Tre ofenda", + "@extremeOffensive": { + "type": "String", + "placeholders": {} + }, + "fileName": "Dosiernomo", + "@fileName": { + "type": "String", + "placeholders": {} + }, + "fluffychat": "FluffyChat", + "@fluffychat": { + "type": "String", + "placeholders": {} + }, + "fontSize": "Grandeco de tiparo", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "forward": "Plusendi", + "@forward": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "Ekde aliĝo", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "Ekde la invito", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "goToTheNewRoom": "Iri al la nova ĉambro", + "@goToTheNewRoom": { + "type": "String", + "placeholders": {} + }, + "group": "Grupo", + "@group": { + "type": "String", + "placeholders": {} + }, + "groupIsPublic": "Grupo estas publika", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "groups": "Grupoj", + "@groups": { + "type": "String", + "placeholders": {} + }, + "groupWith": "Grupo kun {displayname}", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "guestsAreForbidden": "Gastoj estas malpermesitaj", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "Gastoj povas aliĝi", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{username} nuligis la inviton por {targetName}", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "help": "Helpo", + "@help": { + "type": "String", + "placeholders": {} + }, + "hideRedactedEvents": "Kaŝi obskurigitajn eventojn", + "@hideRedactedEvents": { + "type": "String", + "placeholders": {} + }, + "hideUnknownEvents": "Kaŝi nekonatajn eventojn", + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "howOffensiveIsThisContent": "Kiel ofenda estas ĉi tiu enhavo?", + "@howOffensiveIsThisContent": { + "type": "String", + "placeholders": {} + }, + "id": "Identigilo", + "@id": { + "type": "String", + "placeholders": {} + }, + "identity": "Identeco", + "@identity": { + "type": "String", + "placeholders": {} + }, + "ignore": "Malatenti", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "ignoredUsers": "Malatentitaj uzantoj", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "iHaveClickedOnLink": "Mi klakis la ligilon", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "Neĝusta pasfrazo aŭ rehava ŝlosilo", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "inoffensive": "Neofenda", + "@inoffensive": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "Inviti kontakton", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "Inviti kontakton al {groupName}", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "invited": "Invitita", + "@invited": { + "type": "String", + "placeholders": {} + }, + "invitedUser": "{username} invitis uzanton {targetName}", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "invitedUsersOnly": "Nur invititoj", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "inviteForMe": "Invito por mi", + "@inviteForMe": { + "type": "String", + "placeholders": {} + }, + "inviteText": "{username} invitis vin al FluffyChat. \n1. Instalu la aplikaĵon FluffyChat: https://fluffychat.im \n2. Registriĝu aŭ salutu \n3. Malfermu la invitan ligilon: {link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "isTyping": "tajpas…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "{username} aliĝis al la babilo", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "joinRoom": "Aliĝi al ĉambro", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "kicked": "{username} forpelis uzanton {targetName}", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickedAndBanned": "{username} forpelis kaj forbaris uzanton {targetName}", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickFromChat": "Forpeli de babilo", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "Lastafoje aktiva: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "leave": "Foriri", + "@leave": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "Foriris de la ĉambro", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "license": "Permesilo", + "@license": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "Hela", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "Enlegi {count} pliajn partoprenantojn", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "loadingPleaseWait": "Enlegante… bonvolu atendi.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "loadMore": "Enlegi pli…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "login": "Saluti", + "@login": { + "type": "String", + "placeholders": {} + }, + "logInTo": "Saluti servilon {homeserver}", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "logout": "Adiaŭi", + "@logout": { + "type": "String", + "placeholders": {} + }, + "memberChanges": "Ŝanĝoj de anoj", + "@memberChanges": { + "type": "String", + "placeholders": {} + }, + "mention": "Mencii", + "@mention": { + "type": "String", + "placeholders": {} + }, + "messages": "Mesaĝoj", + "@messages": { + "type": "String", + "placeholders": {} + }, + "moderator": "Reguligisto", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "muteChat": "Silentigi babilon", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "needPantalaimonWarning": "Bonvolu scii, ke vi ankoraŭ bezonas la programon Pantalaimon por uzi tutvojan ĉifradon.", + "@needPantalaimonWarning": { + "type": "String", + "placeholders": {} + }, + "newChat": "Nova babilo", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "Nova mesaĝo en FluffyChat", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "Nova kontrolpeto!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "next": "Sekva", + "@next": { + "type": "String", + "placeholders": {} + }, + "no": "Ne", + "@no": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "Neniu konekto al la servilo", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "Neniuj mienetoj troviĝis. 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "Vi nur povas aktivigi ĉifradon kiam la ĉambro ne plu estas publike alirebla.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "Ŝajnas, ke via telefono ne havas servojn de Google. Tio estas bona decido por via privateco! Por ricevadi pasivajn sciigojn en FluffyChat, ni rekomendas, ke vi uzu la https://microg.org/ aŭ https://unifiedpush.org/.", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "none": "Neniu", + "@none": { + "type": "String", + "placeholders": {} + }, + "noPasswordRecoveryDescription": "Vi ankoraŭ ne aldonis manieron rehavi vian pasvorton.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "noPermission": "Neniu permeso", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "Neniuj ĉambroj troviĝis…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "notifications": "Sciigoj", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "notificationsEnabledForThisAccount": "Sciigoj ŝaltiĝis por ĉi tiu konto", + "@notificationsEnabledForThisAccount": { + "type": "String", + "placeholders": {} + }, + "numUsersTyping": "{count} uzantoj tajpas…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "obtainingLocation": "Akirante lokon…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "offensive": "Ofenda", + "@offensive": { + "type": "String", + "placeholders": {} + }, + "offline": "Eksterrete", + "@offline": { + "type": "String", + "placeholders": {} + }, + "ok": "bone", + "@ok": { + "type": "String", + "placeholders": {} + }, + "online": "Enrete", + "@online": { + "type": "String", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "Enreta savkopiado de ŝlosiloj estas ŝaltita", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "oopsPushError": "Oj! Bedaŭrinde eraris la agordado de pasivaj sciigoj.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "Oj! Io misokazis…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "Malfermu la aplikaĵon por legi mesaĝojn", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "openCamera": "Malfermi fotilon", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "or": "Aŭ", + "@or": { + "type": "String", + "placeholders": {} + }, + "participant": "Partoprenanto", + "@participant": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "pasfrazo aŭ rehava ŝlosilo", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "password": "Pasvorto", + "@password": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "Forgesita pasvorto", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "Pasvorto ŝanĝiĝis", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "passwordRecovery": "Rehavo de pasvorto", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "people": "Personoj", + "@people": { + "type": "String", + "placeholders": {} + }, + "pickImage": "Elekti bildon", + "@pickImage": { + "type": "String", + "placeholders": {} + }, + "pin": "Fiksi", + "@pin": { + "type": "String", + "placeholders": {} + }, + "play": "Ludi {fileName}", + "@play": { + "type": "String", + "placeholders": { + "fileName": { + "type": "String" + } + } + }, + "pleaseChoose": "Bonvolu elekti", + "@pleaseChoose": { + "type": "String", + "placeholders": {} + }, + "pleaseChooseAPasscode": "Bonvolu elekti paskodon", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "pleaseClickOnLink": "Bonvolu klaki la ligilon en la retletero kaj pluiĝi.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "pleaseEnter4Digits": "Bonvolu enigi 4 ciferojn, aŭ nenion por malŝalti ŝlosadon de la aplikaĵo.", + "@pleaseEnter4Digits": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPassword": "Bonvolu enigi vian pasvorton", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPin": "Bonvolu enigi vian personan identigan numeron", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "Bonvolu enigi vian uzantonomon", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "Bonvolu sekvi la instrukciojn de la retejo kaj tuŝetu al «Sekva».", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "privacy": "Privateco", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "Publikaj ĉambroj", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "pushRules": "Reguloj de pasivaj sciigoj", + "@pushRules": { + "type": "String", + "placeholders": {} + }, + "reason": "Kialo", + "@reason": { + "type": "String", + "placeholders": {} + }, + "recording": "Registrante", + "@recording": { + "type": "String", + "placeholders": {} + }, + "redactedAnEvent": "{username} obskurigis eventon", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "redactMessage": "Obskurigi mesaĝon", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "register": "Registriĝi", + "@register": { + "type": "String", + "placeholders": {} + }, + "reject": "Rifuzi", + "@reject": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "{username} rifuzis la inviton", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "rejoin": "Ree aliĝi", + "@rejoin": { + "type": "String", + "placeholders": {} + }, + "remove": "Forigi", + "@remove": { + "type": "String", + "placeholders": {} + }, + "removeAllOtherDevices": "Forigi ĉiujn aliajn aparatojn", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "removedBy": "Forigita de {username}", + "@removedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "removeDevice": "Forigi aparaton", + "@removeDevice": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "Malforbari", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "removeYourAvatar": "Forigi vian profilbildon", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "renderRichContent": "Bildigi riĉforman enhavon de mesaĝoj", + "@renderRichContent": { + "type": "String", + "placeholders": {} + }, + "replaceRoomWithNewerVersion": "Anstataŭigi ĉambron per nova versio", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "reply": "Respondi", + "@reply": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "Raporti mesaĝon", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "requestPermission": "Peti permeson", + "@requestPermission": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "Ĉambro gradaltiĝis", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "Versio de ĉambro", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "saveFile": "Konservi dosieron", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "search": "Serĉi", + "@search": { + "type": "String", + "placeholders": {} + }, + "security": "Sekureco", + "@security": { + "type": "String", + "placeholders": {} + }, + "seenByUser": "Vidita de {username}", + "@seenByUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "send": "Sendi", + "@send": { + "type": "String", + "placeholders": {} + }, + "sendAMessage": "Sendi mesaĝon", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "sendAudio": "Sendi sondosieron", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendFile": "Sendi dosieron", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendImage": "Sendi bildon", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendMessages": "Sendi mesaĝojn", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "sendOriginal": "Sendi originalon", + "@sendOriginal": { + "type": "String", + "placeholders": {} + }, + "sendSticker": "Sendi glumarkon", + "@sendSticker": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "Sendi filmon", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "sentAFile": "{username} sendis dosieron", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAnAudio": "{username} sendis sondosieron", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAPicture": "{username} sendis bildon", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentASticker": "{username} sendis glumarkon", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "{username} sendis filmon", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentCallInformations": "{senderName} sendis informojn pri voko", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "setAsCanonicalAlias": "Agordi kiel ĉefan kromnomon", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "setCustomEmotes": "Agordi proprajn mienetojn", + "@setCustomEmotes": { + "type": "String", + "placeholders": {} + }, + "setInvitationLink": "Agordi invitan ligilon", + "@setInvitationLink": { + "type": "String", + "placeholders": {} + }, + "setPermissionsLevel": "Agordi nivelon de permesoj", + "@setPermissionsLevel": { + "type": "String", + "placeholders": {} + }, + "setStatus": "Agordi staton", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "settings": "Agordoj", + "@settings": { + "type": "String", + "placeholders": {} + }, + "share": "Konigi", + "@share": { + "type": "String", + "placeholders": {} + }, + "sharedTheLocation": "{username} konigis sian lokon", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "shareLocation": "Konigi lokon", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "showPassword": "Montri pasvorton", + "@showPassword": { + "type": "String", + "placeholders": {} + }, + "singlesignon": "Ununura saluto", + "@singlesignon": { + "type": "String", + "placeholders": {} + }, + "skip": "Preterpasi", + "@skip": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "Fontkodo", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "spaceIsPublic": "Aro estas publika", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "spaceName": "Nomo de aro", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "startedACall": "{senderName} komencis vokon", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "status": "Stato", + "@status": { + "type": "String", + "placeholders": {} + }, + "statusExampleMessage": "Kiel vi fartas?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "submit": "Sendi", + "@submit": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWait": "Spegulante… Bonvolu atendi.", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "systemTheme": "Sistema", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "Ili ne akordas", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "Ili akordas", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "title": "FluffyChat", + "@title": { + "description": "Title for the application", + "type": "String", + "placeholders": {} + }, + "toggleFavorite": "Baskuli elstarigon", + "@toggleFavorite": { + "type": "String", + "placeholders": {} + }, + "toggleMuted": "Basklui silentigon", + "@toggleMuted": { + "type": "String", + "placeholders": {} + }, + "toggleUnread": "Baskuli legitecon", + "@toggleUnread": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "Tro multaj petoj. Bonvolu reprovi poste!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "transferFromAnotherDevice": "Transporti de alia aparato", + "@transferFromAnotherDevice": { + "type": "String", + "placeholders": {} + }, + "tryToSendAgain": "Reprovi sendi", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "unavailable": "Nedisponeble", + "@unavailable": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username} malforbaris uzanton {targetName}", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "unblockDevice": "Malbloki aparaton", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "Nekonata aparato", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "unknownEncryptionAlgorithm": "Nekonata ĉifra algoritmo", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unknownEvent": "Nekonata evento «{type}»", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "unmuteChat": "Malsilentigi babilon", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "unpin": "Malfiksi", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "unreadChats": "{unreadCount, plural, =1{1 nelegita babilo} other{{unreadCount} nelegitaj babiloj}}", + "@unreadChats": { + "type": "String", + "placeholders": { + "unreadCount": { + "type": "int" + } + } + }, + "userAndOthersAreTyping": "{username} kaj {count} aliaj tajpas…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "userAndUserAreTyping": "{username} kaj {username2} tajpas…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userIsTyping": "{username} tajpas…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userLeftTheChat": "{username} foriris de la babilo", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "username": "Uzantonomo", + "@username": { + "type": "String", + "placeholders": {} + }, + "userSentUnknownEvent": "{username} sendis eventon de speco {type}", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "verified": "Kontrolita", + "@verified": { + "type": "String", + "placeholders": {} + }, + "verify": "Kontroli", + "@verify": { + "type": "String", + "placeholders": {} + }, + "verifyStart": "Komenci kontrolon", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "Vi sukcese kontrolis!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "verifyTitle": "Kontrolante alian konton", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "videoCall": "Vidvoko", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "Videbleco de historio de la babilo", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "Videbla al ĉiuj partoprenantoj", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "Videbla al ĉiuj", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "Voĉmesaĝo", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "Atendante konfirmon de peto de la kunulo…", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "Atendante akcepton de la bildosignoj de la kunulo…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "Atendante akcepton de la numeroj, de la kunulo…", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "wallpaper": "Fonbildo", + "@wallpaper": { + "type": "String", + "placeholders": {} + }, + "warning": "Averto!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "weSentYouAnEmail": "Ni sendis retleteron al vi", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "whoCanPerformWhichAction": "Kiu povas kion", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "Kiu rajtas aliĝi al ĉi tiu grupo", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "Kial vi volas tion ĉi raporti?", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "wipeChatBackup": "Ĉu forviŝi la savkopion de via babilo por krei novan sekurecan ŝlosilon?", + "@wipeChatBackup": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "Per tiuj ĉi adresoj vi povas rehavi vian pasvorton.", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "Skribi mesaĝon…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "yes": "Jes", + "@yes": { + "type": "String", + "placeholders": {} + }, + "you": "Vi", + "@you": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "Vi ne plu partoprenas ĉi tiun babilon", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "Vi estas forbarita de ĉi tiu babilo", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "yourPublicKey": "Via publika ŝlosilo", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "sendAsText": "Sendi kiel tekston", + "@sendAsText": { + "type": "String" + }, + "noMatrixServer": "{server1} ne estas matriksa servilo, eble provu anstataŭe servilon {server2}?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "commandHint_send": "Sendi tekston", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "chatHasBeenAddedToThisSpace": "Babilo aldoniĝis al ĉi tiu aro", + "@chatHasBeenAddedToThisSpace": {}, + "autoplayImages": "Memage ludi movbildajn glumarkojn kaj mienetojn", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "addToSpace": "Aldoni al aro", + "@addToSpace": {}, + "homeserver": "Hejmservilo", + "@homeserver": {}, + "sendOnEnter": "Sendi per eniga klavo", + "@sendOnEnter": {} +} diff --git a/assets/l10n/intl_es.arb b/assets/l10n/intl_es.arb new file mode 100644 index 0000000..e10dea5 --- /dev/null +++ b/assets/l10n/intl_es.arb @@ -0,0 +1,3350 @@ +{ + "@@locale": "es", + "@@last_modified": "2021-08-14 12:41:10.097243", + "about": "Acerca de", + "@about": { + "type": "String", + "placeholders": {} + }, + "accept": "Aceptar", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 {username} aceptó la invitación", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "Cuenta", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐 {username} activó el cifrado de extremo a extremo", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "addEmail": "Añadir dirección de correo", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "admin": "Administrador", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "alias", + "@alias": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "{senderName} respondió a la llamada", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "Cualquiera puede unirse", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "archive": "Archivo", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "¿Pueden unirse usuarios de visita?", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "¿Estás seguro?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "areYouSureYouWantToLogout": "¿Confirma que quiere cerrar sesión?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "Para poder confirmar a la otra persona, ingrese su contraseña de almacenamiento segura o la clave de recuperación.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "¿Aceptar esta solicitud de verificación de {username}?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "badServerLoginTypesException": "El servidor soporta los siguientes mecanismos para autenticación:\n{serverVersions}\npero esta aplicación sólo soporta:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "badServerVersionsException": "El servidor soporta las siguientes versiones de la especificación:\n{serverVersions}\npero esta aplicación sólo soporta las versiones {supportedVersions}", + "@badServerVersionsException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "banFromChat": "Vetar del chat", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "Vetado", + "@banned": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username} vetó a {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "Bloquear dispositivo", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "blocked": "Bloqueado", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "cancel": "Cancelar", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "changeDeviceName": "Cambiar el nombre del dispositivo", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "{username} cambió el icono del chat", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatDescriptionTo": "{username} cambió la descripción del chat a: '{description}'", + "@changedTheChatDescriptionTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "description": { + "type": "String" + } + } + }, + "changedTheChatNameTo": "{username} cambió el nombre del chat a: '{chatname}'", + "@changedTheChatNameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "chatname": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username} cambió los permisos del chat", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username} cambió su nombre visible a: '{displayname}'", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} cambió las reglas de acceso de visitantes", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} cambió las reglas de acceso de visitantes a: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username} cambió la visibilidad del historial", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username} cambió la visibilidad del historial a: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username} cambió las reglas de ingreso", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} cambió las reglas de ingreso a {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} cambió su imagen de perfil", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "{username} cambió el alias de la sala", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username} cambió el enlace de invitación", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changePassword": "Cambiar la contraseña", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "Cambiar el servidor", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "Cambia tu estilo", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "Cambiar el nombre del grupo", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "El cifrado se ha corrompido", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "chat": "Chat", + "@chat": { + "type": "String", + "placeholders": {} + }, + "chatBackup": "Copia de respaldo del chat", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "chatBackupDescription": "La copia de respaldo del chat está protegida por una llave de seguridad. Procure no perderla.", + "@chatBackupDescription": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Detalles del chat", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chats": "Conversaciones", + "@chats": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "Elija una contraseña segura", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "clearArchive": "Borrar archivo", + "@clearArchive": {}, + "close": "Cerrar", + "@close": { + "type": "String", + "placeholders": {} + }, + "compareEmojiMatch": "Por favor compare los emojis", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "Por favor compare los números", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "confirm": "Confirmar", + "@confirm": { + "type": "String", + "placeholders": {} + }, + "connect": "Conectar", + "@connect": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "El contacto ha sido invitado al grupo", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "Copiado al portapapeles", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "Copiar", + "@copy": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "Copiar al portapapeles", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "No se pudo descifrar el mensaje: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "countParticipants": "{count} participantes", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "create": "Crear", + "@create": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "💬{username} creó el chat", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "currentlyActive": "Actualmente activo", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "Oscuro", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "dateWithoutYear": "{day}-{month}", + "@dateWithoutYear": { + "type": "String", + "placeholders": { + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "dateWithYear": "{day}-{month}-{year}", + "@dateWithYear": { + "type": "String", + "placeholders": { + "year": { + "type": "String" + }, + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "deactivateAccountWarning": "Se desactivará su cuenta de usuario. ¡La operación no se puede cancelar! ¿Está seguro?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "delete": "Eliminar", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "Cancelar cuenta", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "Eliminar mensaje", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "device": "Dispositivo", + "@device": { + "type": "String", + "placeholders": {} + }, + "devices": "Dispositivos", + "@devices": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "El nombre visible ha cambiado", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "Descargar archivo", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "editDisplayname": "Editar nombre visible", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "editRoomAliases": "Editar alias de la sala", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "¡El emote ya existe!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "¡El atajo del emote es inválido!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emotePacks": "Paquetes de emoticonos para la habitación", + "@emotePacks": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "Configuración de emotes", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "emoteShortcode": "Atajo de emote", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emoteWarnNeedToPick": "¡Debes elegir un atajo de emote y una imagen!", + "@emoteWarnNeedToPick": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "Chat vacío", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "Habilitar paquete de emoticonos a nivel general", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "Ya no podrá deshabilitar el cifrado. ¿Estás seguro?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "encryption": "Cifrado", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "El cifrado no está habilitado", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName} terminó la llamada", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "enterAnEmailAddress": "Introducir una dirección de correo electrónico", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "enterYourHomeserver": "Ingrese su servidor", + "@enterYourHomeserver": { + "type": "String", + "placeholders": {} + }, + "everythingReady": "¡Todo listo!", + "@everythingReady": { + "type": "String", + "placeholders": {} + }, + "fileName": "Nombre del archivo", + "@fileName": { + "type": "String", + "placeholders": {} + }, + "fluffychat": "Extera", + "@fluffychat": { + "type": "String", + "placeholders": {} + }, + "forward": "Reenviar", + "@forward": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "Desde que se unió", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "Desde la invitación", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "group": "Grupo", + "@group": { + "type": "String", + "placeholders": {} + }, + "groupIsPublic": "El grupo es público", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "groupWith": "Grupo con {displayname}", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "guestsAreForbidden": "Los visitantes están prohibidos", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "Los visitantes pueden unirse", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{username} ha retirado la invitación para {targetName}", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "help": "Ayuda", + "@help": { + "type": "String", + "placeholders": {} + }, + "hideRedactedEvents": "Ocultar sucesos censurados", + "@hideRedactedEvents": { + "type": "String", + "placeholders": {} + }, + "hideUnknownEvents": "Ocultar sucesos desconocidos", + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "id": "Identificación", + "@id": { + "type": "String", + "placeholders": {} + }, + "identity": "Identidad", + "@identity": { + "type": "String", + "placeholders": {} + }, + "ignoredUsers": "Usuarios ignorados", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "Frase de contraseña o clave de recuperación incorrecta", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "Invitar contacto", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "Invitar contacto a {groupName}", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "invited": "Invitado", + "@invited": { + "type": "String", + "placeholders": {} + }, + "invitedUser": "📩{username} invitó a {targetName}", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "invitedUsersOnly": "Sólo usuarios invitados", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "inviteText": "{username} te invitó a Extera.\n1.Visita fluffychat.im e instala la app\n2. Regístrate o inicia sesión\n3. Abre el enlace de invitación:\n{link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "isTyping": "está escribiendo…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "👋{username} se unió al chat", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "joinRoom": "Unirse a la sala", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "kicked": "👞{username} echó a {targetName}", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickedAndBanned": "🙅{username} echó y vetó a {targetName}", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickFromChat": "Echar del chat", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "Última vez activo: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "leave": "Abandonar", + "@leave": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "Abandonó el chat", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "license": "Licencia", + "@license": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "Claro", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "Mostrar {count} participantes más", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "loadingPleaseWait": "Cargando… Por favor espere.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "loadMore": "Mostrar más…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "login": "Acceso", + "@login": { + "type": "String", + "placeholders": {} + }, + "logInTo": "Iniciar sesión en {homeserver}", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "logout": "Cerrar sesión", + "@logout": { + "type": "String", + "placeholders": {} + }, + "mention": "Mencionar", + "@mention": { + "type": "String", + "placeholders": {} + }, + "moderator": "Moderador", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "muteChat": "Silenciar chat", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "needPantalaimonWarning": "Tenga en cuenta que necesita Pantalaimon para utilizar el cifrado de extremo a extremo por ahora.", + "@needPantalaimonWarning": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "Nuevo mensaje en Extera", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "¡Nueva solicitud de verificación!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "next": "Siguiente", + "@next": { + "type": "String", + "placeholders": {} + }, + "no": "No", + "@no": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "Ningún emote encontrado. 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "Sólo se puede activar el cifrado en cuanto la sala deja de ser de acceso público.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "Parece que no tienes servicios de Firebase Cloud Messaging en tu dispositivo. Para recibir de todas formas notificaciones, recomendamos instalar ntfy. Con ntfy o cualquier proveedor Unified Push, puedes recibir notificaciones manteniendo seguridad de datos. Puedes descargar ntfy de la PlayStore o de F-Droid.", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "none": "Ninguno", + "@none": { + "type": "String", + "placeholders": {} + }, + "noPermission": "Sin autorización", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "Ninguna sala encontrada…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "offline": "Desconectado", + "@offline": { + "type": "String", + "placeholders": {} + }, + "ok": "Ok", + "@ok": { + "type": "String", + "placeholders": {} + }, + "online": "Conectado", + "@online": { + "type": "String", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "La copia de seguridad de la clave en línea está habilitada", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "Ups, algo salió mal…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "Abrir la aplicación para leer los mensajes", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "openCamera": "Abrir cámara", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "contraseña o clave de recuperación", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "password": "Contraseña", + "@password": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "La contraseña ha sido cambiada", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "people": "Personas", + "@people": { + "type": "String", + "placeholders": {} + }, + "pickImage": "Elegir imagen", + "@pickImage": { + "type": "String", + "placeholders": {} + }, + "pin": "Pin", + "@pin": { + "type": "String", + "placeholders": {} + }, + "play": "Reproducir {fileName}", + "@play": { + "type": "String", + "placeholders": { + "fileName": { + "type": "String" + } + } + }, + "pleaseClickOnLink": "Haga clic en el enlace del correo electrónico y luego continúe.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPassword": "Por favor ingrese su contraseña", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "Por favor ingrese su nombre de usuario", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "Por favor, siga las instrucciones del sitio web y presione \"siguiente\".", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "privacy": "Privacidad", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "Salas públicas", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "recording": "Grabando", + "@recording": { + "type": "String", + "placeholders": {} + }, + "redactedAnEvent": "{username} censuró un suceso", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "reject": "Rechazar", + "@reject": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "{username} rechazó la invitación", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "rejoin": "Volver a unirse", + "@rejoin": { + "type": "String", + "placeholders": {} + }, + "remove": "Eliminar", + "@remove": { + "type": "String", + "placeholders": {} + }, + "removeAllOtherDevices": "Eliminar todos los otros dispositivos", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "removedBy": "Eliminado por {username}", + "@removedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "removeDevice": "Eliminar dispositivo", + "@removeDevice": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "Eliminar la expulsión", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "renderRichContent": "Mostrar el contenido con mensajes enriquecidos", + "@renderRichContent": { + "type": "String", + "placeholders": {} + }, + "reply": "Responder", + "@reply": { + "type": "String", + "placeholders": {} + }, + "requestPermission": "Solicitar permiso", + "@requestPermission": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "La sala ha subido de categoría", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "Versión de sala", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "seenByUser": "Visto por {username}", + "@seenByUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "send": "Enviar", + "@send": { + "type": "String", + "placeholders": {} + }, + "sendAMessage": "Enviar un mensaje", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "sendAudio": "Enviar audio", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendFile": "Enviar un archivo", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendImage": "Enviar una imagen", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendOriginal": "Enviar el original", + "@sendOriginal": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "Enviar video", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "sentAFile": "{username} envió un archivo", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAnAudio": "{username} envió un audio", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAPicture": "{username} envió una imagen", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentASticker": "{username} envió un sticker", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "{username} envió un video", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentCallInformations": "{senderName} envió información de la llamada", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "setAsCanonicalAlias": "Fijar alias principal", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "setInvitationLink": "Establecer enlace de invitación", + "@setInvitationLink": { + "type": "String", + "placeholders": {} + }, + "setStatus": "Establecer estado", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "settings": "Ajustes", + "@settings": { + "type": "String", + "placeholders": {} + }, + "share": "Compartir", + "@share": { + "type": "String", + "placeholders": {} + }, + "sharedTheLocation": "{username} compartió la ubicación", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "showPassword": "Mostrar contraseña", + "@showPassword": { + "type": "String", + "placeholders": {} + }, + "skip": "Omitir", + "@skip": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "Código fuente", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "startedACall": "{senderName} comenzó una llamada", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "statusExampleMessage": "¿Cómo estás hoy?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "submit": "Enviar", + "@submit": { + "type": "String", + "placeholders": {} + }, + "systemTheme": "Sistema", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "No coinciden", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "Coinciden", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "title": "Extera", + "@title": { + "description": "Title for the application", + "type": "String", + "placeholders": {} + }, + "transferFromAnotherDevice": "Transferir desde otro dispositivo", + "@transferFromAnotherDevice": { + "type": "String", + "placeholders": {} + }, + "tryToSendAgain": "Intentar enviar nuevamente", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "unavailable": "Indisponible", + "@unavailable": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username} admitió a {targetName} nuevamente", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "unblockDevice": "Desbloquear dispositivo", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "Dispositivo desconocido", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "unknownEncryptionAlgorithm": "Algoritmo de cifrado desconocido", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unknownEvent": "Evento desconocido '{type}'", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "unmuteChat": "Dejar de silenciar el chat", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "unpin": "Despinchar", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "unreadChats": "{unreadCount, plural, =1{1 chat no leído} other{{unreadCount} chats no leídos}}", + "@unreadChats": { + "type": "String", + "placeholders": { + "unreadCount": { + "type": "int" + } + } + }, + "userAndOthersAreTyping": "{username} y {count} más están escribiendo…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "userAndUserAreTyping": "{username} y {username2} están escribiendo…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userIsTyping": "{username} está escribiendo…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userLeftTheChat": "{username} abandonó el chat", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "username": "Nombre de usuario", + "@username": { + "type": "String", + "placeholders": {} + }, + "userSentUnknownEvent": "{username} envió un evento {type}", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "verified": "Verificado", + "@verified": { + "type": "String", + "placeholders": {} + }, + "verify": "Verificar", + "@verify": { + "type": "String", + "placeholders": {} + }, + "verifyStart": "Comenzar verificación", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "¡Has verificado exitosamente!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "verifyTitle": "Verificando la otra cuenta", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "videoCall": "Video llamada", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "Visibilidad del historial del chat", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "Visible para todos los participantes", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "Visible para todo el mundo", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "Mensaje de voz", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "Esperando a que el socio acepte la solicitud…", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "Esperando a que el socio acepte los emojis…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "Esperando a que el socio acepte los números…", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "wallpaper": "Fondo de pantalla:", + "@wallpaper": { + "type": "String", + "placeholders": {} + }, + "warning": "¡Advertencia!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "weSentYouAnEmail": "Te enviamos un correo electrónico", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "Quién tiene permitido unirse al grupo", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "Escribe un mensaje…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "yes": "Sí", + "@yes": { + "type": "String", + "placeholders": {} + }, + "you": "Tú", + "@you": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "Ya no estás participando en este chat", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "Has sido vetado de este chat", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "autoplayImages": "Reproducir emoticonos y stickers animados automáticamente", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "allChats": "Todos los chats", + "@allChats": { + "type": "String", + "placeholders": {} + }, + "addToSpace": "Agregar al espacio", + "@addToSpace": {}, + "cantOpenUri": "No puedo abrir el URI {uri}", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "all": "Todo", + "@all": { + "type": "String", + "placeholders": {} + }, + "appLock": "Bloqueo de aplicación", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "botMessages": "Mensajes de bot", + "@botMessages": { + "type": "String", + "placeholders": {} + }, + "oneClientLoggedOut": "Se ha cerrado en la sesión de uno de sus clientes", + "@oneClientLoggedOut": {}, + "addAccount": "Añadir cuenta", + "@addAccount": {}, + "editBundlesForAccount": "Editar paquetes para esta cuenta", + "@editBundlesForAccount": {}, + "addToBundle": "Agregar al paquete", + "@addToBundle": {}, + "bundleName": "Nombre del paquete", + "@bundleName": {}, + "saveFile": "Guardar el archivo", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "sendSticker": "Enviar stickers", + "@sendSticker": { + "type": "String", + "placeholders": {} + }, + "setPermissionsLevel": "Establecer nivel de permisos", + "@setPermissionsLevel": { + "type": "String", + "placeholders": {} + }, + "shareLocation": "Compartir ubicación", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "singlesignon": "Inicio de sesión único", + "@singlesignon": { + "type": "String", + "placeholders": {} + }, + "status": "Estado", + "@status": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWait": "Sincronizando... por favor espere.", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "iHaveClickedOnLink": "He hecho clic en el enlace", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "directChats": "Chat directo", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "errorObtainingLocation": "Error al obtener la ubicación: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "howOffensiveIsThisContent": "¿Cuán ofensivo es este contenido?", + "@howOffensiveIsThisContent": { + "type": "String", + "placeholders": {} + }, + "inviteForMe": "Invitar por mí", + "@inviteForMe": { + "type": "String", + "placeholders": {} + }, + "noPasswordRecoveryDescription": "Aún no ha agregado una forma de recuperar su contraseña.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "numUsersTyping": "{count} usuarios están escribiendo…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "or": "O", + "@or": { + "type": "String", + "placeholders": {} + }, + "spaceIsPublic": "El espacio es público", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "chatHasBeenAddedToThisSpace": "El chat se ha agregado a este espacio", + "@chatHasBeenAddedToThisSpace": {}, + "commandInvalid": "Comando inválido", + "@commandInvalid": { + "type": "String" + }, + "passwordRecovery": "Recuperación de contraseña", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "security": "Seguridad", + "@security": { + "type": "String", + "placeholders": {} + }, + "extremeOffensive": "Extremadamente ofensivo", + "@extremeOffensive": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "Editar servidores bloqueado", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "configureChat": "Configurar chat", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "Sin conexión al servidor", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "yourPublicKey": "Tu clave pública", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "Contraseña olvidada", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "inoffensive": "Inofensivo", + "@inoffensive": { + "type": "String", + "placeholders": {} + }, + "reason": "Razón", + "@reason": { + "type": "String", + "placeholders": {} + }, + "memberChanges": "Cambios de miembros", + "@memberChanges": { + "type": "String", + "placeholders": {} + }, + "createNewSpace": "Nuevo espacio", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "edit": "Editar", + "@edit": { + "type": "String", + "placeholders": {} + }, + "setCustomEmotes": "Establecer emoticonos personalizados", + "@setCustomEmotes": { + "type": "String", + "placeholders": {} + }, + "ignore": "Ignorar", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "notifications": "Notificaciones", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "notificationsEnabledForThisAccount": "Notificaciones habilitadas para esta cuenta", + "@notificationsEnabledForThisAccount": { + "type": "String", + "placeholders": {} + }, + "offensive": "Ofensiva", + "@offensive": { + "type": "String", + "placeholders": {} + }, + "serverRequiresEmail": "Este servidor necesita validar su dirección de correo electrónico para registrarse.", + "@serverRequiresEmail": {}, + "pleaseChoose": "Por favor elija", + "@pleaseChoose": { + "type": "String", + "placeholders": {} + }, + "replaceRoomWithNewerVersion": "Reemplazar habitación con una versión más nueva", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "El contenido ha sido reportado a los administradores del servidor", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "groups": "Grupos", + "@groups": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "Mensaje de informe", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "search": "Buscar", + "@search": { + "type": "String", + "placeholders": {} + }, + "locationPermissionDeniedNotice": "Permiso de ubicación denegado. Concédeles que puedan compartir tu ubicación.", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "Nivel de permiso predeterminado para nuevo usuarios", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "obtainingLocation": "Obteniendo ubicación…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "participant": "Participante", + "@participant": { + "type": "String", + "placeholders": {} + }, + "pushRules": "Regla de Push", + "@pushRules": { + "type": "String", + "placeholders": {} + }, + "register": "Registrarse", + "@register": { + "type": "String", + "placeholders": {} + }, + "sendAsText": "Enviar como texto", + "@sendAsText": { + "type": "String" + }, + "toggleMuted": "Alternar silenciado", + "@toggleMuted": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "Demasiadas solicitudes. ¡Por favor inténtelo más tarde!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "Con esta dirección puede recuperar su contraseña.", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "commandHint_send": "Enviar texto", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "deviceId": "ID del dispositivo", + "@deviceId": { + "type": "String", + "placeholders": {} + }, + "containsUserName": "Contiene nombre de usuario", + "@containsUserName": { + "type": "String", + "placeholders": {} + }, + "oopsPushError": "¡UPS¡ Desafortunadamente, se produjo un error al configurar las notificaciones push.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "removeYourAvatar": "Quitar tu avatar", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "Habilitar la encriptación", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "messages": "Mensajes", + "@messages": { + "type": "String", + "placeholders": {} + }, + "fontSize": "Tamaño de fuente", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "commandHint_ban": "Prohibir al usuario dado en esta sala", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_unban": "Des banear al usuario dado en esta sala", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "commandMissing": "{command} no es un comando.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "scanQrCode": "Escanear código QR", + "@scanQrCode": {}, + "homeserver": "Servidor inicial", + "@homeserver": {}, + "newChat": "Nuevo chat", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "commandHint_join": "Únete a la sala indicada", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "sendOnEnter": "Enviar con enter", + "@sendOnEnter": {}, + "changeYourAvatar": "Cambiar tu avatar", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "commandHint_me": "Descríbete", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "commandHint_html": "Enviar texto con formato HTML", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_invite": "Invitar al usuario indicado a esta sala", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "commandHint_kick": "Eliminar el usuario indicado de esta sala", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_leave": "Deja esta sala", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_myroomavatar": "Selecciona tu foto para esta sala (by mxc-uri)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_myroomnick": "Establece tu nombre para mostrar para esta sala", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "commandHint_op": "Establece el nivel de potencia del usuario dado (default: 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_plain": "Enviar texto sin formato", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_react": "Enviar respuesta como reacción", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "containsDisplayName": "Contiene nombre para mostrar", + "@containsDisplayName": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "Editar avatar de sala", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "locationDisabledNotice": "Los servicios de ubicación están deshabilitado. Habilite para poder compartir su ubicación.", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "encrypted": "Encriptado", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "goToTheNewRoom": "Ir a la nueva sala", + "@goToTheNewRoom": { + "type": "String", + "placeholders": {} + }, + "noMatrixServer": "{server1} no es un servidor matrix, usar {server2} en su lugar?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "openInMaps": "Abrir en maps", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "removeFromBundle": "Quitar de este paquete", + "@removeFromBundle": {}, + "link": "Link", + "@link": {}, + "enableMultiAccounts": "(BETA) habilite varias cuenta en este dispositivo", + "@enableMultiAccounts": {}, + "pleaseEnter4Digits": "Ingrese 4 dígitos o déjelo en blanco para deshabilitar el bloqueo de la aplicación.", + "@pleaseEnter4Digits": { + "type": "String", + "placeholders": {} + }, + "pleaseChooseAPasscode": "Elija un código de acceso", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPin": "Por favor ingrese su PIN", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "redactMessage": "Censurar mensaje", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "sendMessages": "Enviar mensajes", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "spaceName": "Nombre del espacio", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "toggleFavorite": "Alternar favorito", + "@toggleFavorite": { + "type": "String", + "placeholders": {} + }, + "toggleUnread": "Marcar como: leído / no leído", + "@toggleUnread": { + "type": "String", + "placeholders": {} + }, + "whoCanPerformWhichAction": "Quién puede realizar qué acción", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "¿Por qué quieres denunciar esto?", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "wipeChatBackup": "¿Limpiar la copia de seguridad de tu chat para crear una nueva clave de recuperación?", + "@wipeChatBackup": { + "type": "String", + "placeholders": {} + }, + "yourChatBackupHasBeenSetUp": "Se ha configurado la copia de respaldo del chat.", + "@yourChatBackupHasBeenSetUp": {}, + "unverified": "No verificado", + "@unverified": {}, + "commandHint_clearcache": "Limpiar cache", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "messageInfo": "Información del mensaje", + "@messageInfo": {}, + "time": "Tiempo", + "@time": {}, + "openVideoCamera": "Abrir la cámara para un video", + "@openVideoCamera": { + "type": "String", + "placeholders": {} + }, + "repeatPassword": "Repite la contraseña", + "@repeatPassword": {}, + "removeFromSpace": "Eliminar del espacio", + "@removeFromSpace": {}, + "addToSpaceDescription": "Elige un espacio para añadirle este chat.", + "@addToSpaceDescription": {}, + "openGallery": "Abrir galería", + "@openGallery": {}, + "start": "Iniciar", + "@start": {}, + "commandHint_discardsession": "Descartar sesión", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "messageType": "Tipo de Mensaje", + "@messageType": {}, + "videoWithSize": "Video ({size})", + "@videoWithSize": { + "type": "String", + "placeholders": { + "size": { + "type": "String" + } + } + }, + "publish": "Publicar", + "@publish": {}, + "newSpace": "Nuevo espacio", + "@newSpace": {}, + "allSpaces": "Todos los espacios", + "@allSpaces": {}, + "widgetUrlError": "Esta no es una URL válida.", + "@widgetUrlError": {}, + "commandHint_markasgroup": "Marcar como grupo", + "@commandHint_markasgroup": {}, + "nextAccount": "Siguiente cuenta", + "@nextAccount": {}, + "youRejectedTheInvitation": "Rechazaste la invitación", + "@youRejectedTheInvitation": {}, + "newGroup": "Nuevo grupo", + "@newGroup": {}, + "widgetJitsi": "Jitsi Meet", + "@widgetJitsi": {}, + "previousAccount": "Cuenta anterior", + "@previousAccount": {}, + "users": "Usuarios", + "@users": {}, + "youInvitedBy": "📩 Has sido invitado por {user}", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youAcceptedTheInvitation": "👍 Aceptaste la invitación", + "@youAcceptedTheInvitation": {}, + "widgetEtherpad": "Nota de texto", + "@widgetEtherpad": {}, + "commandHint_cuddle": "Enviar un abrazo", + "@commandHint_cuddle": {}, + "supposedMxid": "Esto debería ser {mxid}", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "importFromZipFile": "Importar de un archivo .zip", + "@importFromZipFile": {}, + "exportEmotePack": "Exportar paquete de emotes a .zip", + "@exportEmotePack": {}, + "addChatDescription": "Añadir una descripción del chat...", + "@addChatDescription": {}, + "sendTypingNotifications": "Enviar notificaciones \"está escribiendo\"", + "@sendTypingNotifications": {}, + "importEmojis": "Importar emojis", + "@importEmojis": {}, + "confirmMatrixId": "Por favor confirma tu Matrix ID para borrar tu cuenta.", + "@confirmMatrixId": {}, + "notAnImage": "El archivo no es una imagen.", + "@notAnImage": {}, + "commandHint_hug": "Mandar un abrazo", + "@commandHint_hug": {}, + "importNow": "Importar ahora", + "@importNow": {}, + "hugContent": "{senderName} te abraza", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "otherCallingPermissions": "Micrófono, cámara y otros permisos de Extera", + "@otherCallingPermissions": {}, + "emailOrUsername": "Correo electrónico o nombre de usuario", + "@emailOrUsername": {}, + "countFiles": "{count} archivos", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "reportUser": "Reportar usuario", + "@reportUser": {}, + "voiceCall": "Llamada de voz", + "@voiceCall": {}, + "reactedWith": "{sender} reaccionó con {reaction}", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "markAsRead": "Marcar como leído", + "@markAsRead": {}, + "widgetName": "Nombre", + "@widgetName": {}, + "replace": "Reemplazar", + "@replace": {}, + "unsupportedAndroidVersionLong": "Esta característica requiere una versión más reciente de Android. Por favor, compruebe las actualizaciones o la compatibilidad de LineageOS.", + "@unsupportedAndroidVersionLong": {}, + "storeSecurlyOnThisDevice": "Almacenar de forma segura en este dispositivo", + "@storeSecurlyOnThisDevice": {}, + "openChat": "Abrir chat", + "@openChat": {}, + "screenSharingDetail": "Usted está compartiendo su pantalla en Extera", + "@screenSharingDetail": {}, + "allRooms": "Todos los chats grupales", + "@allRooms": { + "type": "String", + "placeholders": {} + }, + "widgetVideo": "Vídeo", + "@widgetVideo": {}, + "dismiss": "Descartar", + "@dismiss": {}, + "unsupportedAndroidVersion": "Versión de Android no compatible", + "@unsupportedAndroidVersion": {}, + "indexedDbErrorLong": "El almacenamiento de mensajes, por desgracia, no está habilitado en el modo privado por defecto.\nPor favor, visite\n - about:config\n - Establezca dom.indexedDB.privateBrowsing.enabled a true\nDe otra forma, no es posible usar Extera.", + "@indexedDbErrorLong": {}, + "startFirstChat": "Comience su primer chat", + "@startFirstChat": {}, + "commandHint_create": "Crear un chat grupal vacío\nUse --no-encryption para deshabilitar el cifrado", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "user": "Usuario", + "@user": {}, + "separateChatTypes": "Separar chats directos de grupos", + "@separateChatTypes": { + "type": "String", + "placeholders": {} + }, + "tryAgain": "Inténtelo de nuevo", + "@tryAgain": {}, + "youKickedAndBanned": "🙅 Usted expulsó y prohibió el acceso a {user}", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "messagesStyle": "Mensajes:", + "@messagesStyle": {}, + "chatDescription": "Descripción del chat", + "@chatDescription": {}, + "callingAccountDetails": "Permite a Extera utilizar la aplicación de llamadas nativa de Android.", + "@callingAccountDetails": {}, + "enterSpace": "Unirse al espacio", + "@enterSpace": {}, + "pleaseEnterRecoveryKey": "Por favor, introduzca su clave de recuperación:", + "@pleaseEnterRecoveryKey": {}, + "widgetNameError": "Por favor proporciona un nombre para mostrar.", + "@widgetNameError": {}, + "addWidget": "Añadir widget", + "@addWidget": {}, + "hydrateTor": "TOR: Importar sesión exportada", + "@hydrateTor": {}, + "storeInAppleKeyChain": "Almacenar en la KeyChain de Apple", + "@storeInAppleKeyChain": {}, + "hydrate": "Restaurar desde fichero de copia de seguridad", + "@hydrate": {}, + "invalidServerName": "Nombre del servidor no válido", + "@invalidServerName": {}, + "chatPermissions": "Permisos del chat", + "@chatPermissions": {}, + "sender": "Remitente", + "@sender": {}, + "storeInAndroidKeystore": "Almacenar en la KeyStore de Android", + "@storeInAndroidKeystore": {}, + "saveKeyManuallyDescription": "Compartir esta clave manualmente usando el diálogo de compartir del sistema o el portapapeles.", + "@saveKeyManuallyDescription": {}, + "whyIsThisMessageEncrypted": "¿Por qué no se puede leer este mensaje?", + "@whyIsThisMessageEncrypted": {}, + "setChatDescription": "Establecer descripción del chat", + "@setChatDescription": {}, + "dehydrateWarning": "Esta acción no se puede deshacer. Asegúrese de que ha almacenado de forma segura el fichero de copia de seguridad.", + "@dehydrateWarning": {}, + "redactedBy": "Censurado por {username}", + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "videoCallsBetaWarning": "Tenga en cuenta que las videollamadas están actualmente en fase beta. Es posible que no funcionen como se espera o que no funcionen de ninguna manera en algunas plataformas.", + "@videoCallsBetaWarning": {}, + "callingPermissions": "Permisos de llamadas", + "@callingPermissions": {}, + "unlockOldMessages": "Desbloquear mensajes viejos", + "@unlockOldMessages": {}, + "numChats": "{number} chats", + "@numChats": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "optionalRedactReason": "(Opcional) Motivo para censurar este mensaje...", + "@optionalRedactReason": {}, + "dehydrate": "Exportar sesión y limpiar dispositivo", + "@dehydrate": {}, + "switchToAccount": "Cambiar a la cuenta {number}", + "@switchToAccount": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "experimentalVideoCalls": "Videollamadas experimentales", + "@experimentalVideoCalls": {}, + "pleaseEnterRecoveryKeyDescription": "Para desbloquear sus viejos mensajes, introduzca su clave de recuperación que se generó en una sesión anterior. Su clave de recuperación NO es su contraseña.", + "@pleaseEnterRecoveryKeyDescription": {}, + "inviteContactToGroupQuestion": "¿Quieres invitar a {contact} al chat {groupName}?", + "@inviteContactToGroupQuestion": {}, + "redactedByBecause": "Censurado por {username} porque: \"{reason}\"", + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "youHaveWithdrawnTheInvitationFor": "Usted retiró la invitación a {user}", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "enterRoom": "Unirse a la sala", + "@enterRoom": {}, + "confirmEventUnpin": "¿Seguro que quiere desfijar permanentemente el evento?", + "@confirmEventUnpin": {}, + "youInvitedUser": "📩 Usted invitó a {user}", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "redactMessageDescription": "El mensaje será censurado para todas las personas participantes en la conversación. Esto no se puede deshacer.", + "@redactMessageDescription": {}, + "recoveryKey": "Clave de recuperación", + "@recoveryKey": {}, + "dehydrateTorLong": "Si está usando TOR, es recomendable exportar la sesión antes de cerrar la ventana.", + "@dehydrateTorLong": {}, + "doNotShowAgain": "No mostrar de nuevo", + "@doNotShowAgain": {}, + "hideUnimportantStateEvents": "Ocultar eventos de estado no importantes", + "@hideUnimportantStateEvents": {}, + "screenSharingTitle": "Compartir la pantalla", + "@screenSharingTitle": {}, + "widgetCustom": "Personalizado", + "@widgetCustom": {}, + "youBannedUser": "Usted prohibió el acceso a {user}", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "directChat": "Chat directo", + "@directChat": {}, + "appearOnTop": "Aparecer en la cima", + "@appearOnTop": {}, + "foregroundServiceRunning": "Esta notificación aparece cuando el servicio en segundo plano se está ejecutando.", + "@foregroundServiceRunning": {}, + "wasDirectChatDisplayName": "Chat vacío (era {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "noChatDescriptionYet": "No se ha creado una descripción del chat aún.", + "@noChatDescriptionYet": {}, + "chatDescriptionHasBeenChanged": "Se ha cambiado la descripción del chat", + "@chatDescriptionHasBeenChanged": {}, + "dehydrateTor": "TOR: Exportar sesión", + "@dehydrateTor": {}, + "youKicked": "👞 Usted expulsó a {user}", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "shareInviteLink": "Compartir enlace de invitación", + "@shareInviteLink": {}, + "commandHint_markasdm": "Marcar como sala de mensajes directos para el ID de Matrix", + "@commandHint_markasdm": {}, + "recoveryKeyLost": "¿Perdió su clave de recuperación?", + "@recoveryKeyLost": {}, + "emoteKeyboardNoRecents": "Los emotes usados recientemente aparecerán aquí...", + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "youJoinedTheChat": "Usted se ha unido al chat", + "@youJoinedTheChat": {}, + "errorAddingWidget": "Fallo al añadir el widget.", + "@errorAddingWidget": {}, + "commandHint_dm": "Iniciar un chat directo\nUse --no-encryption para deshabilitar el cifrado", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "youUnbannedUser": "Usted volvió a permitir el acceso a {user}", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "emojis": "Emojis", + "@emojis": {}, + "createGroup": "Crear grupo", + "@createGroup": {}, + "hydrateTorLong": "¿Exportó su sesión la última vez que estuvo en TOR? Impórtela rápidamente y continúe chateando.", + "@hydrateTorLong": {}, + "custom": "Personalizado", + "@custom": {}, + "storeInSecureStorageDescription": "Almacenar la clave de recuperación en el almacenamiento seguro de este dispositivo.", + "@storeInSecureStorageDescription": {}, + "pinMessage": "Anclar a la sala", + "@pinMessage": {}, + "indexedDbErrorTitle": "Problemas con el modo privado", + "@indexedDbErrorTitle": {}, + "googlyEyesContent": "{senderName} te manda ojos saltones", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "cuddleContent": "{senderName} se acurruca contigo", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "commandHint_googly": "Enviar unos ojos saltones", + "@commandHint_googly": {}, + "noChatsFoundHere": "No se han encontrado chats. Inicia un nuevo chat usando el botón de abajo. ⤵️", + "@noChatsFoundHere": {}, + "joinedChats": "Chats Unidos", + "@joinedChats": {}, + "space": "Espacio", + "@space": {}, + "spaces": "Espacios", + "@spaces": {}, + "block": "Bloquear", + "@block": {}, + "blockListDescription": "Puedes bloquear usuarios que te estén molestando. No podrás recibir mensajes ni invitaciones de chat de los usuarios de tu lista de bloqueo.", + "@blockListDescription": {}, + "aboutHomeserver": "Acerca de {homeserver}", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "unread": "No leídos", + "@unread": {}, + "swipeRightToLeftToReply": "Desliza a la izquierda para responder", + "@swipeRightToLeftToReply": {}, + "hideRedactedMessagesBody": "Si alguien elimina un mensaje, este mensaje ya no será visible en el chat.", + "@hideRedactedMessagesBody": {}, + "hideInvalidOrUnknownMessageFormats": "Esconde formatos de mensajes inválidos o desconocidos", + "@hideInvalidOrUnknownMessageFormats": {}, + "hideRedactedMessages": "Esconde mensajes eliminados", + "@hideRedactedMessages": {}, + "appLockDescription": "Bloquear la aplicación cuando no se use con código pin", + "@appLockDescription": {}, + "alwaysUse24HourFormat": "falso", + "@alwaysUse24HourFormat": { + "description": "Set to true to always display time of day in 24 hour format." + }, + "accessAndVisibility": "Acceso y visibilidad", + "@accessAndVisibility": {}, + "globalChatId": "ID de chat Global", + "@globalChatId": {}, + "accessAndVisibilityDescription": "A quién se le permite unirse a este chat y cómo se puede descubrir el chat.", + "@accessAndVisibilityDescription": {}, + "calls": "Llamadas", + "@calls": {}, + "customEmojisAndStickers": "Emojis y stickers personalizados", + "@customEmojisAndStickers": {}, + "customEmojisAndStickersBody": "Agrega o comparte emojis y stickers personalizados que se pueden utilizar en cualquier chat.", + "@customEmojisAndStickersBody": {}, + "blockedUsers": "Usuarios bloqueados", + "@blockedUsers": {}, + "blockUsername": "Ignorar nombre de usuario", + "@blockUsername": {}, + "noMoreChatsFound": "No se encontraron más chats...", + "@noMoreChatsFound": {}, + "countChatsAndCountParticipants": "{chats} chats y {participants} participantes", + "@countChatsAndCountParticipants": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + }, + "participants": { + "type": "int" + } + } + }, + "notifyMeFor": "Notificarme", + "@notifyMeFor": {}, + "presencesToggle": "Mostrar mensajes de estado de otros usuarios", + "@presencesToggle": { + "type": "String", + "placeholders": {} + }, + "placeCall": "Llamar", + "@placeCall": {}, + "callingAccount": "Llamando a cuenta", + "@callingAccount": {}, + "appearOnTopDetails": "Permite que la app aparezca delante (no hace falta si ya tienes Fluffychat configurado como cuenta llamante)", + "@appearOnTopDetails": {}, + "disableEncryptionWarning": "Por motivos de seguridad no es posible deshabilitar el cifrado en un chat si ha sido habilitado previamente.", + "@disableEncryptionWarning": {}, + "setColorTheme": "Poner tema de color:", + "@setColorTheme": {}, + "inviteGroupChat": "📨 Invitar a grupo de chat", + "@inviteGroupChat": {}, + "invalidInput": "¡Entrada no válida!", + "@invalidInput": {}, + "wrongPinEntered": "¡Pin erróneo! Vuelve a intenrarlo en {seconds} segundos...", + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "decline": "Declinar", + "@decline": {}, + "thisDevice": "Este dispositivo:", + "@thisDevice": {}, + "minimumPowerLevel": "{level} es el nivel mínimo.", + "@minimumPowerLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "String" + } + } + }, + "verifyOtherDevice": "🔐 Verificar otro dispositivo", + "@verifyOtherDevice": {}, + "chatPermissionsDescription": "Definir el nivel necesario para ciertas acciones en este chat. Los niveles 0, 50 y 100 habitualmente representan usuarios, moderadores y administradores, pero se puede establecer cualquier escala.", + "@chatPermissionsDescription": {}, + "updateInstalled": "¡🎉 Actualización {version} instalada!", + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "changelog": "Cambios", + "@changelog": {}, + "sendCanceled": "Envío cancelado", + "@sendCanceled": {}, + "invite": "Invitación", + "@invite": {}, + "searchIn": "Buscar en chat \"{chat}\"...", + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "appWantsToUseForLogin": "Usar '{server}' para entrar", + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "appWantsToUseForLoginDescription": "Por la presente permites a la app y web compartir información sobre ti.", + "@appWantsToUseForLoginDescription": {}, + "encryptThisChat": "Cifrar este chat", + "@encryptThisChat": {}, + "publicLink": "Enlace público", + "@publicLink": {}, + "transparent": "Transparente", + "@transparent": {}, + "select": "Elegir", + "@select": {}, + "newPassword": "Nueva clave", + "@newPassword": {}, + "nothingFound": "No se encontró nada...", + "@nothingFound": {}, + "subspace": "Sub espacio", + "@subspace": {}, + "openLinkInBrowser": "Abrir enlace en navegador", + "@openLinkInBrowser": {}, + "presenceStyle": "Presencia:", + "@presenceStyle": { + "type": "String", + "placeholders": {} + }, + "youInvitedToBy": "📩 Te han invitado con un enlace a:\n{alias}", + "@youInvitedToBy": { + "placeholders": { + "alias": { + "type": "String" + } + } + }, + "signInWith": "Entrar con {provider}", + "@signInWith": { + "type": "String", + "placeholders": { + "provider": { + "type": "String" + } + } + }, + "setTheme": "Poner tema:", + "@setTheme": {}, + "learnMore": "Aprender más", + "@learnMore": {}, + "incomingMessages": "Mensajes entrantes", + "@incomingMessages": {}, + "noOtherDevicesFound": "No se han encontrado otros dispositivos", + "@noOtherDevicesFound": {}, + "generalNotificationSettings": "Ajustes de notificación generales", + "@generalNotificationSettings": {}, + "roomNotificationSettings": "Ajustes de notificación de salas", + "@roomNotificationSettings": {}, + "userSpecificNotificationSettings": "Ajustes de notificación por usuario", + "@userSpecificNotificationSettings": {}, + "contentNotificationSettings": "Ajustes de notificación de contenido", + "@contentNotificationSettings": {}, + "otherNotificationSettings": "Otros ajustes de notificación", + "@otherNotificationSettings": {}, + "notificationRuleContainsUserName": "Contiene nombre de usuario", + "@notificationRuleContainsUserName": {}, + "notificationRuleContainsUserNameDescription": "Notifica al usuario cuando un mensaje contiene su nombre de usuario.", + "@notificationRuleContainsUserNameDescription": {}, + "notificationRuleMaster": "Silenciar todas las notificaciones", + "@notificationRuleMaster": {}, + "notificationRuleMasterDescription": "Anula todas las demás reglas y desactiva todas las notificaciones.", + "@notificationRuleMasterDescription": {}, + "notificationRuleSuppressNotices": "Suprimir los mensajes automáticos", + "@notificationRuleSuppressNotices": {}, + "notificationRuleSuppressNoticesDescription": "Suprimir notificaciones de clientes automáticos, como bots.", + "@notificationRuleSuppressNoticesDescription": {}, + "notificationRuleInviteForMe": "Invitación para mí", + "@notificationRuleInviteForMe": {}, + "notificationRuleInviteForMeDescription": "Notifica al usuario cuando se les invita a una sala.", + "@notificationRuleInviteForMeDescription": {}, + "notificationRuleMemberEvent": "Evento para miembros", + "@notificationRuleMemberEvent": {}, + "notificationRuleMemberEventDescription": "Suprimir notificaciones de eventos para miembros.", + "@notificationRuleMemberEventDescription": {}, + "notificationRuleIsUserMention": "Mención al usuario", + "@notificationRuleIsUserMention": {}, + "notificationRuleIsUserMentionDescription": "Notifica al usuario cuando son mencionados directamente en un mensaje.", + "@notificationRuleIsUserMentionDescription": {}, + "notificationRuleContainsDisplayName": "Contiene el nombre visible", + "@notificationRuleContainsDisplayName": {}, + "notificationRuleContainsDisplayNameDescription": "Notifica al usuario cuando un mensaje contiene su nombre visible.", + "@notificationRuleContainsDisplayNameDescription": {}, + "notificationRuleIsRoomMention": "Mención de sala", + "@notificationRuleIsRoomMention": {}, + "notificationRuleIsRoomMentionDescription": "Notifica al usuario cuando hay una mención de sala.", + "@notificationRuleIsRoomMentionDescription": {}, + "notificationRuleRoomnotif": "Notificación de sala", + "@notificationRuleRoomnotif": {}, + "notificationRuleRoomnotifDescription": "Notifica al usuario cuando un mensaje contiene '@sala'.", + "@notificationRuleRoomnotifDescription": {}, + "notificationRuleTombstone": "Lápida", + "@notificationRuleTombstone": {}, + "notificationRuleTombstoneDescription": "Notifica al usuario sobre mensajes de desactivación de sala.", + "@notificationRuleTombstoneDescription": {}, + "notificationRuleReaction": "Reacción", + "@notificationRuleReaction": {}, + "notificationRuleReactionDescription": "Suprime notificaciones por reacciones.", + "@notificationRuleReactionDescription": {}, + "notificationRuleRoomServerAcl": "ACL de servidor de sala", + "@notificationRuleRoomServerAcl": {}, + "notificationRuleRoomServerAclDescription": "Suprime notificaciones de listas de control de acceso de servidores de sala.", + "@notificationRuleRoomServerAclDescription": {}, + "notificationRuleSuppressEdits": "Suprimir ediciones", + "@notificationRuleSuppressEdits": {}, + "notificationRuleSuppressEditsDescription": "Suprime las notificaciones de mensajes editados.", + "@notificationRuleSuppressEditsDescription": {}, + "notificationRuleCall": "Llamar", + "@notificationRuleCall": {}, + "notificationRuleCallDescription": "Notifica al usuario de llamadas.", + "@notificationRuleCallDescription": {}, + "notificationRuleEncryptedRoomOneToOne": "Sala cifrada uno a uno", + "@notificationRuleEncryptedRoomOneToOne": {}, + "notificationRuleEncryptedRoomOneToOneDescription": "Notifica al usuario sobre mensajes en salas cifradas uno a uno.", + "@notificationRuleEncryptedRoomOneToOneDescription": {}, + "notificationRuleRoomOneToOne": "Sala uno a uno", + "@notificationRuleRoomOneToOne": {}, + "notificationRuleRoomOneToOneDescription": "Notifica al usuario sobre mensajes en salas uno a uno.", + "@notificationRuleRoomOneToOneDescription": {}, + "notificationRuleMessage": "Mensaje", + "@notificationRuleMessage": {}, + "notificationRuleMessageDescription": "Notifica al usuario sobre mensajes generales.", + "@notificationRuleMessageDescription": {}, + "notificationRuleEncrypted": "Cifrado", + "@notificationRuleEncrypted": {}, + "notificationRuleEncryptedDescription": "Notifica al usuario sobre mensajes en salas cifradas.", + "@notificationRuleEncryptedDescription": {}, + "notificationRuleJitsi": "Jitsi", + "@notificationRuleJitsi": {}, + "notificationRuleJitsiDescription": "Notifica al usuario sobre eventos del componente de Jitsi.", + "@notificationRuleJitsiDescription": {}, + "notificationRuleServerAcl": "Suprimir eventos de ACL del servidor", + "@notificationRuleServerAcl": {}, + "notificationRuleServerAclDescription": "Suprime notificaciones de eventos de ACL del servidor.", + "@notificationRuleServerAclDescription": {}, + "unknownPushRule": "Regla de notificación desconocida '{rule}'", + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } + } + }, + "deletePushRuleCanNotBeUndone": "Si eliminas este ajuste de notificación, esto no se puede deshacer.", + "@deletePushRuleCanNotBeUndone": {}, + "more": "Más", + "@more": {}, + "serverLimitReached": "¡Alcanzado límite del servidor! Esperando {seconds} segundos...", + "@serverLimitReached": { + "type": "integer", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "groupCanBeFoundViaSearch": "Los grupos se pueden encontrar buscando", + "@groupCanBeFoundViaSearch": {}, + "addChatOrSubSpace": "Añadir chat o sub espacio", + "@addChatOrSubSpace": {}, + "sendRoomNotifications": "Mandar notificación @sala", + "@sendRoomNotifications": {}, + "changeTheChatPermissions": "Cambiar los permisos de chat", + "@changeTheChatPermissions": {}, + "setWallpaper": "Poner fondo", + "@setWallpaper": {}, + "sendImages": "Envío de la imagen {count}", + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "invitedBy": "📩 Invitado por {user}", + "@invitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "usersMustKnock": "Los usuarios han de avisar", + "@usersMustKnock": {}, + "noOneCanJoin": "Nadie puede unirse", + "@noOneCanJoin": {}, + "reopenChat": "Reabrir chat", + "@reopenChat": {}, + "hidePresences": "¿Esconder la lista de estado?", + "@hidePresences": {}, + "fileIsTooBigForServer": "¡No se pudo mandar! El servidor solamente permite adjuntos de hasta {max}.", + "@fileIsTooBigForServer": { + "type": "String", + "placeholders": { + "max": { + "type": "String" + } + } + }, + "jumpToLastReadMessage": "Saltar al último mensaje leído", + "@jumpToLastReadMessage": {}, + "report": "informe", + "@report": {}, + "readUpToHere": "Leer hasta aquí", + "@readUpToHere": {}, + "signInWithPassword": "Entrar con clave", + "@signInWithPassword": {}, + "formattedMessages": "Mensajes con formato", + "@formattedMessages": {}, + "publicSpaces": "Espacios públicos", + "@publicSpaces": {}, + "formattedMessagesDescription": "Mostrar contenido de mensaje enriquecido, como texto en negrita, usando markdown.", + "@formattedMessagesDescription": {}, + "userLevel": "{level} - Usuario", + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "completedKeyVerification": "{sender} completó la verificación de clave", + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "sendingAttachment": "Enviando adjunto...", + "@sendingAttachment": {}, + "compress": "Comprimir", + "@compress": {}, + "pleaseFillOut": "Por favor, rellenar", + "@pleaseFillOut": {}, + "newChatRequest": "📩 Nueva petición de chat", + "@newChatRequest": {}, + "unbanUserDescription": "El usuario podrá entrar al chat de nuevo si lo intenta.", + "@unbanUserDescription": {}, + "roomUpgradeDescription": "El chat se volverá a crear con la nueva versión de sala. Todos los participantes serán notificados de que tienen que cambiarse al nuevo chat. Puedes encontrar más información sobre versiones de salas en https://spec.matrix.org/latest/rooms/", + "@roomUpgradeDescription": {}, + "makeAdminDescription": "Una vez hagas que este usuario sea admin, puede que no puedas deshacerlo porque tendrá los mismos permisos que tú.", + "@makeAdminDescription": {}, + "knocking": "Avisando", + "@knocking": {}, + "chatCanBeDiscoveredViaSearchOnServer": "El chat se puede descubrir buscando en {server}", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "searchChatsRooms": "Buscar #chats, @usuarios...", + "@searchChatsRooms": {}, + "groupName": "Nombre de grupo", + "@groupName": {}, + "createGroupAndInviteUsers": "Crear un grupo e invitar usuarios", + "@createGroupAndInviteUsers": {}, + "databaseMigrationTitle": "La base de datos está optimizada", + "@databaseMigrationTitle": {}, + "searchForUsers": "Buscar @usuarios...", + "@searchForUsers": {}, + "startConversation": "Iniciar conversación", + "@startConversation": {}, + "gallery": "Galería", + "@gallery": {}, + "files": "Archivos", + "@files": {}, + "initAppError": "Hubo un error al arrancar la app", + "@initAppError": {}, + "sessionLostBody": "Se perdió tu sesión. Por favor, informa de este error a los desarrolladores en {url}. El mensaje de error es: {error}", + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "unreadChatsInApp": "{appname}: {unread} chats no leídos", + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "restricted": "Restringido", + "@restricted": {}, + "requestedKeyVerification": "{sender} ha pedido verificación de clave", + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "adminLevel": "{level} - Administrador", + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "changeGeneralChatSettings": "Cambiar los ajustes generales de chat", + "@changeGeneralChatSettings": {}, + "inviteOtherUsers": "Invitar a otros usuarios a este chat", + "@inviteOtherUsers": {}, + "calculatingFileSize": "Calculando tamaño de archivo...", + "@calculatingFileSize": {}, + "prepareSendingAttachment": "Prepara envío del adjunto...", + "@prepareSendingAttachment": {}, + "generatingVideoThumbnail": "Generando miniatura de vídeo...", + "@generatingVideoThumbnail": {}, + "sendingAttachmentCountOfCount": "Enviando adjunto {index} de {length}...", + "@sendingAttachmentCountOfCount": { + "type": "integer", + "placeholders": { + "index": { + "type": "int" + }, + "length": { + "type": "int" + } + } + }, + "compressVideo": "Comprimiendo vídeo...", + "@compressVideo": {}, + "blur": "Difuminar:", + "@blur": {}, + "continueText": "Continuar", + "@continueText": {}, + "welcomeText": "Eh, eh, 👋 Esto es Extera. Puedes acceder a cualquier homeserver, que sea compatible con https://matrix.org. Y luego chatear con cualquiera. ¡Es una red de mensajería descentralizada enorme!", + "@welcomeText": {}, + "opacity": "Opacidad:", + "@opacity": {}, + "version": "Versión", + "@version": {}, + "serverInformation": "Información del servidor:", + "@serverInformation": {}, + "website": "Web", + "@website": {}, + "name": "Nombre", + "@name": {}, + "knockRestricted": "Aviso restringido", + "@knockRestricted": {}, + "hideMemberChangesInPublicChats": "Ocultar cambios de miembros en salas públicas", + "@hideMemberChangesInPublicChats": {}, + "hideMemberChangesInPublicChatsBody": "No mostrar en el chat que alguien entra o sale de una sala pública para mejorar la inteligibilidad.", + "@hideMemberChangesInPublicChatsBody": {}, + "passwordRecoverySettings": "Ajustes de recuperación de clave", + "@passwordRecoverySettings": {}, + "acceptedKeyVerification": "{sender} aceptó la verificación de clave", + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "stickers": "Pegatinas", + "@stickers": {}, + "shareKeysWith": "Compartir claves con...", + "@shareKeysWith": {}, + "shareKeysWithDescription": "¿Qué dispositivos deben ser de confianza para que puedan leer tus mensajes en chats cifrados?", + "@shareKeysWithDescription": {}, + "crossVerifiedDevicesIfEnabled": "Dispositivos verificados si están habilitados", + "@crossVerifiedDevicesIfEnabled": {}, + "allDevices": "Todos los dispositivos", + "@allDevices": {}, + "crossVerifiedDevices": "Dispositivos verificados", + "@crossVerifiedDevices": {}, + "verifiedDevicesOnly": "Solo dispositivos verificados", + "@verifiedDevicesOnly": {}, + "deviceKeys": "Claves de dispositivo:", + "@deviceKeys": {}, + "overview": "Vista general", + "@overview": {}, + "removeDevicesDescription": "Vas a salir en este dispositivo y ya no podrás recibir mensajes.", + "@removeDevicesDescription": {}, + "databaseMigrationBody": "Por favor espera. Esto llevará un momento.", + "@databaseMigrationBody": {}, + "pleaseEnterYourCurrentPassword": "Por favor, pon tu clave actual", + "@pleaseEnterYourCurrentPassword": {}, + "pleaseChooseAStrongPassword": "Por favor, pon una clave fuerte", + "@pleaseChooseAStrongPassword": {}, + "joinSpace": "Unirse al espacio", + "@joinSpace": {}, + "wrongRecoveryKey": "Lo siento... esta no parece ser la clave de recuperación correcta.", + "@wrongRecoveryKey": {}, + "leaveEmptyToClearStatus": "Deja vacío para limpiar tu estado.", + "@leaveEmptyToClearStatus": {}, + "databaseBuildErrorBody": "No pude crear la base de datos SQlite. La app intenta usar la base de datos heredada por ahora. Por favor, informa de este error a los desarrolladores en {url}. El mensaje de error es: {error}", + "@databaseBuildErrorBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "restoreSessionBody": "La app ahora trata de recuperar tu sesión de la copia de seguridad. Por favor, informa de este error a los desarrolladores en {url}. El mensaje de error es: {error}", + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "sendReadReceipts": "Mandar recibos de lectura", + "@sendReadReceipts": {}, + "sendTypingNotificationsDescription": "Otros participantes en un chat pueden ver cuándo estás escribiendo un mensaje.", + "@sendTypingNotificationsDescription": {}, + "sendReadReceiptsDescription": "Otros participantes en un chat pueden ver cuándo has leído un mensaje.", + "@sendReadReceiptsDescription": {}, + "verifyOtherUserDescription": "Si verificas a otro usuario, puedes estar seguro de a quién estás escribiendo realmente. 💪\n\nCuando empiezas una verificación, tú y el otro usuario veréis una ventana emergente en la app. En ella veréis una serie de emojiso números que tenéis que comparar.\n\nLa mejor forma de hacer esto es quedar o una videollamada. 👭", + "@verifyOtherUserDescription": {}, + "verifyOtherDeviceDescription": "Cuando verificas otro dispositivo, esos dispositivos pueden intercambiar claves, incrementando tu seguridad global. 💪 Cuando inicias una verificación, aparece una ventana en la app en ambos dispositivos. En ella, verás una serie de emojis o números que tienes que comparar. Es mejor tener ambos dispositivos a mano antes de empezar la verificación. 🤳", + "@verifyOtherDeviceDescription": {}, + "canceledKeyVerification": "{sender} canceló la verificación de clave", + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "commandHint_unignore": "No ignorar la ID de matrix dada", + "@commandHint_unignore": {}, + "noDatabaseEncryption": "En esta plataforma no hay cifrado de base de datos", + "@noDatabaseEncryption": {}, + "startedKeyVerification": "{sender} ha comenzado verificación de clave", + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "discover": "Descubrir", + "@discover": {}, + "thereAreCountUsersBlocked": "Ahora mismo, hay {count} usuarios bloqueados.", + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "commandHint_ignore": "Ignorar la ID de matrix dada", + "@commandHint_ignore": {}, + "jump": "Saltar", + "@jump": {}, + "commandHint_sendraw": "Mandar json pelado", + "@commandHint_sendraw": {}, + "kickUserDescription": "Se expulsa al usuario del chat, pero no se le prohíbe volver a entrar. En chats públicos, el usuario podrá volver a entrar en cualquier momento.", + "@kickUserDescription": {}, + "fileHasBeenSavedAt": "Archivo guardado en {path}", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "markAsUnread": "Marcar no leído", + "@markAsUnread": {}, + "changeTheDescriptionOfTheGroup": "Cambiar la descripción del chat", + "@changeTheDescriptionOfTheGroup": {}, + "sorryThatsNotPossible": "Lo siento... eso no es posible", + "@sorryThatsNotPossible": {}, + "publicChatAddresses": "Dirección de chat pública", + "@publicChatAddresses": {}, + "createNewAddress": "Crear nueva dirección", + "@createNewAddress": {}, + "userRole": "Rol de usuario", + "@userRole": {}, + "boldText": "Texto en negrita", + "@boldText": {}, + "italicText": "Texto en cursiva", + "@italicText": {}, + "strikeThrough": "Tachado", + "@strikeThrough": {}, + "searchMore": "Buscar más...", + "@searchMore": {}, + "noPublicLinkHasBeenCreatedYet": "No se ha creado un enlace público aún", + "@noPublicLinkHasBeenCreatedYet": {}, + "knock": "Aviso", + "@knock": {}, + "newSpaceDescription": "Los espacios permiten consolidar los chats y montar comunidades privadas o públicas.", + "@newSpaceDescription": {}, + "pleaseTryAgainLaterOrChooseDifferentServer": "Por favor, intente luego o elija un servidor distinto.", + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "pleaseEnterANumber": "Por favor pon un número mayor que 0", + "@pleaseEnterANumber": {}, + "archiveRoomDescription": "El chat se moverá al archivo. Otros usuarios podrán ver que has abandonado el chat.", + "@archiveRoomDescription": {}, + "pushNotificationsNotAvailable": "No están disponibles las notificaciones emergentes", + "@pushNotificationsNotAvailable": {}, + "passwordsDoNotMatch": "Las claves no coinciden", + "@passwordsDoNotMatch": {}, + "passwordIsWrong": "La clave que has puesto es incorrecta", + "@passwordIsWrong": {}, + "verifyOtherUser": "🔐 Verificar a otro usuario", + "@verifyOtherUser": {}, + "isReadyForKeyVerification": "{sender} está preparado para verificación de clave", + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "goToSpace": "Ir al espacio: {space}", + "@goToSpace": { + "type": "String", + "space": {} + }, + "oneOfYourDevicesIsNotVerified": "Uno de tus dispositivos no está verificado", + "@oneOfYourDevicesIsNotVerified": {}, + "noticeChatBackupDeviceVerification": "Nota: Cuando conectas todos tus dispositivos a la copia de seguridad del chat, son verificados automáticamente.", + "@noticeChatBackupDeviceVerification": {}, + "manageAccount": "Gestionar cuenta", + "@manageAccount": {}, + "contactServerAdmin": "Contactar con el administrador del servidor", + "@contactServerAdmin": {}, + "contactServerSecurity": "Contactar con seguridad del servidor", + "@contactServerSecurity": {}, + "supportPage": "Página de atención", + "@supportPage": {}, + "invalidUrl": "URL incorrecta", + "@invalidUrl": {}, + "addLink": "Añadir enlace", + "@addLink": {}, + "unableToJoinChat": "No se puede entrar al chat. Puede que la otra parte ya haya cerrado la conversación.", + "@unableToJoinChat": {}, + "waitingForServer": "Esperando al servidor...", + "@waitingForServer": {}, + "discoverHomeservers": "Descubrir homeservers", + "@discoverHomeservers": {}, + "profileNotFound": "El usuario no se encontró en el servidor. Puede que haya un problema de conexión o el usuario no exista.", + "@profileNotFound": {}, + "synchronizingPleaseWaitCounter": " Sincronizando… ({percentage}%)", + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "reportErrorDescription": "😭 Oh, no. Algo ha salido mal. Si quieres, puedes informar de este fallo a los desarrolladores.", + "@reportErrorDescription": {}, + "hasKnocked": "🚪 {user} ha avisado", + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "noBackupWarning": "¡Cuidado! Si no se habilita la copia de seguridad del chat, perderás acceso a tus mensajes cifrados. Se recomienda encarecidamente habilitar la copia de seguridad del chat antes de salir.", + "@noBackupWarning": {}, + "userWouldLikeToChangeTheChat": "{user} quiere unirse al chat.", + "@userWouldLikeToChangeTheChat": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "yourGlobalUserIdIs": "Tu id de usuario global es: ", + "@yourGlobalUserIdIs": {}, + "noKeyForThisMessage": "Esto puede ocurrir si el mensaje se envió antes de que entraras en tu cuenta en este dispositivo.\n\nTambién puede que el remitente haya bloqueado tu dispositivo o haya fallado algo en la conexión a Internet.\n\n¿Puedes leer el mensaje en otra sesión? Entonces, ¡puedes transferir el mensaje desde allí! Ve a Ajustes > Dispositivos y asegúrate de que tus dispositivos se han verificado mutuamente. Cuando abras la sala la próxima vez y ambas sesiones estén en primer plano, las claves se transmitirán automáticamente.\n\n¿No quieres perder las claves al salir o al cambiar de dispositivo? Asegúrate de que has habilitado la copia de seguridad del chat en los ajustes.", + "@noKeyForThisMessage": {}, + "invitePrivateChat": "📨 Invitar a chat privado", + "@invitePrivateChat": {}, + "banUserDescription": "Se expulsará al usuario del chat y no podrá volver a entrar hasta que se le permita.", + "@banUserDescription": {}, + "loginWithMatrixId": "Entrar con un ID de Matrix", + "@loginWithMatrixId": {}, + "changeTheCanonicalRoomAlias": "Cambiar la dirección pública principal de chat", + "@changeTheCanonicalRoomAlias": {}, + "noContactInformationProvided": "El servidor no suministra ninguna información de contacto válida", + "@noContactInformationProvided": {}, + "noUsersFoundWithQuery": "Desgraciadamente, no se encontró ningún usuario con \"{query}\". Por favor, revisa si cometiste un error.", + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "changeTheVisibilityOfChatHistory": "Cambiar la visibilidad de la historia de chat", + "@changeTheVisibilityOfChatHistory": {}, + "doesNotSeemToBeAValidHomeserver": "No parece ser un homeserver compatible. ¿URL equivocada?", + "@doesNotSeemToBeAValidHomeserver": {}, + "moderatorLevel": "{level} - Moderador", + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "homeserverDescription": "Todos tus datos se guardan en el homeserver, como en un proveedor de correo electrónico. Puedes elegir el homeserver que quieres usar, a la par que te puedes comunicar con todos. Más en https://matrix.org.", + "@homeserverDescription": {}, + "whatIsAHomeserver": "¿Qué es un homeserver?", + "@whatIsAHomeserver": {}, + "open": "Abrir", + "@open": {}, + "appIntroduction": "Extera te permite chatear con tus amigos con diferentes mensajerías. Aprende más en https://matrix.org o simplemente pincha *Continuar*.", + "@appIntroduction": {}, + "forwardMessageTo": "¿Reenviar mensaje a {roomName}?", + "@forwardMessageTo": { + "type": "String", + "placeholders": { + "roomName": { + "type": "String" + } + } + }, + "previous": "Anterior", + "@previous": {}, + "otherPartyNotLoggedIn": "La otra parte ahora mismo no está conectada y por tanto ¡no puede recibir mensajes!", + "@otherPartyNotLoggedIn": {}, + "takeAPhoto": "Tomar foto", + "@takeAPhoto": {}, + "recordAVideo": "Grabar video", + "@recordAVideo": {}, + "optionalMessage": "(Opcional) mensaje...", + "@optionalMessage": {}, + "notSupportedOnThisDevice": "No es compatible con este dispositivo", + "@notSupportedOnThisDevice": {}, + "enterNewChat": "Ingresar a nuevo chat", + "@enterNewChat": {} +} diff --git a/assets/l10n/intl_et.arb b/assets/l10n/intl_et.arb new file mode 100644 index 0000000..5cefa83 --- /dev/null +++ b/assets/l10n/intl_et.arb @@ -0,0 +1,3349 @@ +{ + "@@locale": "et", + "@@last_modified": "2021-08-14 12:41:10.079944", + "about": "Rakenduse teave", + "@about": { + "type": "String", + "placeholders": {} + }, + "accept": "Nõustu", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 {username} võttis kutse vastu", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "Kasutajakonto", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐{username} võttis kasutusele läbiva krüptimise", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "addEmail": "Lisa e-posti aadress", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "admin": "Peakasutaja", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "alias", + "@alias": { + "type": "String", + "placeholders": {} + }, + "all": "Kõik", + "@all": { + "type": "String", + "placeholders": {} + }, + "allChats": "Kõik vestlused", + "@allChats": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "{senderName} vastas kõnele", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "Kõik võivad liituda", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "appLock": "Rakenduse lukustus", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "archive": "Arhiiv", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "Kas külalised võivad liituda", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "Kas sa oled kindel?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "areYouSureYouWantToLogout": "Kas sa oled kindel, et soovid välja logida?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "Selleks, et teist osapoolt identifitseerivat allkirja anda, palun sisesta oma turvahoidla paroolifraas või taastevõti.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "Kas võtad vastu selle verifitseerimispalve kasutajalt {username}?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "autoplayImages": "Esita liikuvad kleepse ja emotikone automaatselt", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "badServerLoginTypesException": "See koduserver toetab Matrixi võrku sisselogimiseks:\n{serverVersions}\nAga see rakendus toetab vaid järgmisi võimalusi:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "badServerVersionsException": "See koduserver toetab Matrixi spetsifikatsioonist järgmisi versioone:\n{serverVersions}\nAga see rakendus toetab vaid järgmisi versioone: {supportedVersions}", + "@badServerVersionsException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "banFromChat": "Keela ligipääs vestlusele", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "Ligipääs vestlusele on keelatud", + "@banned": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username} keelas ligipääsu kasutajale {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "Blokeeri seade", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "blocked": "Blokeeritud", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "botMessages": "Robotite sõnumid", + "@botMessages": { + "type": "String", + "placeholders": {} + }, + "cancel": "Katkesta", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "cantOpenUri": "{uri} aadressi avamine ei õnnestu", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "changeDeviceName": "Muuda seadme nime", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "{username} muutis vestluse tunnuspilti", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatDescriptionTo": "{username} muutis vestluse uueks kirjelduseks '{description}'", + "@changedTheChatDescriptionTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "description": { + "type": "String" + } + } + }, + "changedTheChatNameTo": "{username} muutis oma uueks vestlusnimeks '{chatname}'", + "@changedTheChatNameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "chatname": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username} muutis vestlusega seotud õigusi", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username} muutis oma uueks kuvatavaks nimeks: '{displayname}'", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} muutis külaliste ligipääsureegleid", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} muutis külaliste ligipääsureegleid järgnevalt: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username} muutis sõnumite ajaloo nähtavust", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username} muutis sõnumite ajaloo nähtavust järgnevalt: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username} muutis liitumise reegleid", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} muutis liitumise reegleid järgnevalt: {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} muutis oma tunnuspilti", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "{username} muutis jututoa aliast", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username} muutis kutse linki", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changePassword": "Muuda salasõna", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "Muuda koduserverit", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "Muuda oma stiili", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "Muuda vestlusrühma nime", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "changeYourAvatar": "Muuda oma tunnuspilti", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "Kasutatud krüptimine on vigane", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "chat": "Vestlus", + "@chat": { + "type": "String", + "placeholders": {} + }, + "chatBackup": "Varunda vestlus", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "chatBackupDescription": "Sinu vestluste varukoopia on krüptitud taastamiseks mõeldud turvavõtmega. Palun vaata, et sa seda ei kaota.", + "@chatBackupDescription": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Vestluse teave", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chats": "Vestlused", + "@chats": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "Vali korralik salasõna", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "clearArchive": "Kustuta arhiiv", + "@clearArchive": {}, + "close": "Sulge", + "@close": { + "type": "String", + "placeholders": {} + }, + "commandHint_ban": "Sea sellele kasutajale antud jututoas suhtluskeeld", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_html": "Saada HTML-vormingus tekst", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_invite": "Kutsu see kasutaja antud jututuppa", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "commandHint_join": "Liitu selle jututoaga", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_kick": "Eemalda antud kasutaja sellest jututoast", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_leave": "Lahku sellest jututoast", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_me": "Kirjelda ennast", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "commandHint_myroomavatar": "Määra selles jututoas oma tunnuspilt (mxc-uri vahendusel)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_myroomnick": "Määra selles jututoas oma kuvatav nimi", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "commandHint_op": "Seadista selle kasutaja õigusi (vaikimisi: 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_plain": "Saada vormindamata tekst", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_react": "Saada vastus reaktsioonina", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "commandHint_send": "Saada sõnum", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "commandHint_unban": "Eemalda sellelt kasutajalt antud jututoas suhtluskeeld", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "commandInvalid": "Vigane käsk", + "@commandInvalid": { + "type": "String" + }, + "commandMissing": "{command} ei ole käsk.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "compareEmojiMatch": "Palun võrdle emotikone", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "Palun võrdle numbreid", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "configureChat": "Seadista vestlust", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "confirm": "Kinnita", + "@confirm": { + "type": "String", + "placeholders": {} + }, + "connect": "Ühenda", + "@connect": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "Sinu kontakt on kutsutud liituma vestlusrühma", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "containsDisplayName": "Sisaldab kuvatavat nime", + "@containsDisplayName": { + "type": "String", + "placeholders": {} + }, + "containsUserName": "Sisaldab kasutajanime", + "@containsUserName": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "Saatsime selle sisu kohta teate koduserveri haldajate", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "Kopeerisin lõikelauale", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "Kopeeri", + "@copy": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "Kopeeri lõikelauale", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "Sõnumi dekrüptimine ei õnnestunud: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "countParticipants": "{count} osalejat", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "create": "Loo", + "@create": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "💬 {username} algatas vestluse", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "createNewSpace": "Uus kogukond", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "currentlyActive": "Hetkel aktiivne", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "Tume", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "dateWithoutYear": "{day}.{month}", + "@dateWithoutYear": { + "type": "String", + "placeholders": { + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "dateWithYear": "{year}.{month}.{day}", + "@dateWithYear": { + "type": "String", + "placeholders": { + "year": { + "type": "String" + }, + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "deactivateAccountWarning": "Järgnevaga eemaldatakse sinu konto kasutusest. Seda tegevust ei saa tagasi pöörata! Kas sa ikka oled kindel?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "Vaikimisi õigused uutele kasutajatele", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "delete": "Kustuta", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "Kustuta kasutajakonto", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "Kustuta sõnum", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "device": "Seade", + "@device": { + "type": "String", + "placeholders": {} + }, + "deviceId": "Seadme tunnus", + "@deviceId": { + "type": "String", + "placeholders": {} + }, + "devices": "Seadmed", + "@devices": { + "type": "String", + "placeholders": {} + }, + "directChats": "Otsevestlused", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "Kuvatav nimi on muudetud", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "Laadi fail alla", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "edit": "Muuda", + "@edit": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "Muuda blokeeritud serverite loendit", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "editDisplayname": "Muuda kuvatavat nime", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "editRoomAliases": "Muuda jututoa aliast", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "Muuda jututoa tunnuspilti", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "Selline emotsioonitegevus on juba olemas!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "Vigane emotsioonitegevuse lühikood!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emotePacks": "Emotsioonitegevuste pakid jututoa jaoks", + "@emotePacks": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "Emotsioonitegevuste seadistused", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "emoteShortcode": "Emotsioonitegevuse lühikood", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emoteWarnNeedToPick": "Sa pead valima emotsioonitegevuse lühikoodi ja pildi!", + "@emoteWarnNeedToPick": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "Vestlust pole olnud", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "Võta emotsioonitegevuste pakid läbivalt kasutusele", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "Kasuta krüptimist", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "Sa ei saa hiljem enam krüptimist välja lülitada. Kas oled kindel?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "encrypted": "Krüptitud", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "encryption": "Krüptimine", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "Krüptimine ei ole kasutusel", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName} lõpetas kõne", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "enterAnEmailAddress": "Sisesta e-posti aadress", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "enterYourHomeserver": "Sisesta oma koduserveri aadress", + "@enterYourHomeserver": { + "type": "String", + "placeholders": {} + }, + "errorObtainingLocation": "Viga asukoha tuvastamisel: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "everythingReady": "Kõik on valmis!", + "@everythingReady": { + "type": "String", + "placeholders": {} + }, + "extremeOffensive": "Äärmiselt solvav", + "@extremeOffensive": { + "type": "String", + "placeholders": {} + }, + "fileName": "Faili nimi", + "@fileName": { + "type": "String", + "placeholders": {} + }, + "fluffychat": "FluffyChat", + "@fluffychat": { + "type": "String", + "placeholders": {} + }, + "fontSize": "Fondi suurus", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "forward": "Edasta", + "@forward": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "Alates liitumise hetkest", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "Kutse saamisest", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "goToTheNewRoom": "Hakka kasutama uut jututuba", + "@goToTheNewRoom": { + "type": "String", + "placeholders": {} + }, + "group": "Vestlusrühm", + "@group": { + "type": "String", + "placeholders": {} + }, + "groupIsPublic": "Vestlusrühm on avalik", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "groups": "Vestlusrühmad", + "@groups": { + "type": "String", + "placeholders": {} + }, + "groupWith": "Vestlusrühm {displayname} kasutajanimega", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "guestsAreForbidden": "Külalised ei ole lubatud", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "Külalised võivad liituda", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{username} on võtnud tagasi {targetName} kutse", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "help": "Abiteave", + "@help": { + "type": "String", + "placeholders": {} + }, + "hideRedactedEvents": "Peida muudetud sündmused", + "@hideRedactedEvents": { + "type": "String", + "placeholders": {} + }, + "hideUnknownEvents": "Peida tundmatud sündmused", + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "howOffensiveIsThisContent": "Kui solvav see sisu on?", + "@howOffensiveIsThisContent": { + "type": "String", + "placeholders": {} + }, + "id": "ID", + "@id": { + "type": "String", + "placeholders": {} + }, + "identity": "Identiteet", + "@identity": { + "type": "String", + "placeholders": {} + }, + "ignore": "Eira", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "ignoredUsers": "Eiratud kasutajad", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "iHaveClickedOnLink": "Ma olen klõpsinud saadetud linki", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "Vigane paroolifraas või taastevõti", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "inoffensive": "Kahjutu", + "@inoffensive": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "Kutsu sõpru ja tuttavaid", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "Kutsu sõpru ja tuttavaid {groupName} liikmeks", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "invited": "Kutsutud", + "@invited": { + "type": "String", + "placeholders": {} + }, + "invitedUser": "📩 {username} saatis kutse kasutajale {targetName}", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "invitedUsersOnly": "Ainult kutsutud kasutajatele", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "inviteForMe": "Kutse minu jaoks", + "@inviteForMe": { + "type": "String", + "placeholders": {} + }, + "inviteText": "{username} kutsus sind kasutama Matrix'i-põhist suhtlusrakendust FluffyChat. \n1. Ava fluffychat.im ja paigalda FluffyChat'i rakendus \n2. Liitu kasutajaks või logi sisse olemasoleva Matrix'i kasutajakontoga\n3. Ava kutse link: \n {link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "isTyping": "kirjutab…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "👋 {username} liitus vestlusega", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "joinRoom": "Liitu jututoaga", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "kicked": "👞 {username} müksas kasutaja {targetName} välja", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickedAndBanned": "🙅{username} müksas kasutaja {targetName} välja ning seadis talle suhtluskeelu", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickFromChat": "Müksa vestlusest välja", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "Viimati nähtud: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "leave": "Lahku", + "@leave": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "Lahkus vestlusest", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "license": "Litsents", + "@license": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "Hele", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "Lisa veel {count} osalejat", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "loadingPleaseWait": "Laadin andmeid… Palun oota.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "loadMore": "Laadi veel…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "locationDisabledNotice": "Asukohateenused on seadmes väljalülitatud. Asukoha jagamiseks palun lülita nad sisse.", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "locationPermissionDeniedNotice": "Puudub luba asukohateenuste kasutamiseks. Asukoha jagamiseks palun anna rakendusele vastavad õigused.", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "login": "Logi sisse", + "@login": { + "type": "String", + "placeholders": {} + }, + "logInTo": "Logi sisse {homeserver} serverisse", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "logout": "Logi välja", + "@logout": { + "type": "String", + "placeholders": {} + }, + "memberChanges": "Muudatused liikmeskonnas", + "@memberChanges": { + "type": "String", + "placeholders": {} + }, + "mention": "Märgi ära", + "@mention": { + "type": "String", + "placeholders": {} + }, + "messages": "Sõnumid", + "@messages": { + "type": "String", + "placeholders": {} + }, + "moderator": "Moderaator", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "muteChat": "Summuta vestlus", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "needPantalaimonWarning": "Palun arvesta, et sa saad hetkel kasutada läbivat krüptimist vaid siis, kui koduserver kasutab Pantalaimon'it.", + "@needPantalaimonWarning": { + "type": "String", + "placeholders": {} + }, + "newChat": "Uus vestlus", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "💬 Uus sõnum FluffyChat'i vahendusel", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "Uus verifitseerimispäring!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "next": "Edasi", + "@next": { + "type": "String", + "placeholders": {} + }, + "no": "Ei", + "@no": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "Puudub ühendus koduserveriga", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "Ühtegi emotsioonitegevust ei leidunud. 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "Sa võid krüptimise kasutusele võtta niipea, kui jututuba pole enam avalik.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "Tundub, et sinu nutiseadmes pole Firebase Cloud Messaging teenuseid. Sinu privaatsuse mõttes on see kindlasti hea otsus! Kui sa soovid FluffyChatis näha tõuketeavitusi, siis soovitame, et selle jaoks kasutad ntfy liidestust. Kasutades ntfyd või mõnda muud Unified Push standardil põhinevat liidestust saad tõuketeavitusi turvalisel moel. Ntfy rakendus on saadaval nii PlayStore kui F-Droidi rakendusepoodides.", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "noMatrixServer": "{server1} pole Matrix'i server, kas kasutame selle asemel {server2} serverit?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "none": "Mitte midagi", + "@none": { + "type": "String", + "placeholders": {} + }, + "noPasswordRecoveryDescription": "Sa pole veel lisanud võimalust salasõna taastamiseks.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "noPermission": "Õigused puuduvad", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "Jututubasid ei leidunud…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "notifications": "Teavitused", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "notificationsEnabledForThisAccount": "Teavitused on sellel kontol kasutusel", + "@notificationsEnabledForThisAccount": { + "type": "String", + "placeholders": {} + }, + "numUsersTyping": "{count} kasutajat kirjutavad…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "obtainingLocation": "Tuvastan asukohta…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "offensive": "Solvav", + "@offensive": { + "type": "String", + "placeholders": {} + }, + "offline": "Väljas", + "@offline": { + "type": "String", + "placeholders": {} + }, + "ok": "Sobib", + "@ok": { + "type": "String", + "placeholders": {} + }, + "online": "Saadaval", + "@online": { + "type": "String", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "Krüptovõtmete veebipõhine varundus on kasutusel", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "oopsPushError": "Hopsti! Kahjuks tekkis tõuketeavituste seadistamisel viga.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "Hopsti! Midagi läks nüüd viltu…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "Sõnumite lugemiseks ava rakendus", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "openCamera": "Ava kaamera", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "openInMaps": "Ava kaardirakendusega", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "or": "või", + "@or": { + "type": "String", + "placeholders": {} + }, + "participant": "Osaleja", + "@participant": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "paroolifraas või taastevõti", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "password": "Salasõna", + "@password": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "Salasõna on ununenud", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "Salasõna on muudetud", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "passwordRecovery": "Salasõna taastamine", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "people": "Inimesed", + "@people": { + "type": "String", + "placeholders": {} + }, + "pickImage": "Vali pilt", + "@pickImage": { + "type": "String", + "placeholders": {} + }, + "pin": "Klammerda", + "@pin": { + "type": "String", + "placeholders": {} + }, + "play": "Esita {fileName}", + "@play": { + "type": "String", + "placeholders": { + "fileName": { + "type": "String" + } + } + }, + "pleaseChoose": "Palun vali", + "@pleaseChoose": { + "type": "String", + "placeholders": {} + }, + "pleaseChooseAPasscode": "Palun vali rakenduse PIN-kood", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "pleaseClickOnLink": "Jätkamiseks palun klõpsi sulle saadetud e-kirjas leiduvat linki.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "pleaseEnter4Digits": "Rakenduse luku jaoks sisesta 4 numbrit või kui sa sellist võimalust ei soovi kasutada, siis jäta nad tühjaks.", + "@pleaseEnter4Digits": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPassword": "Palun sisesta oma salasõna", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPin": "Palun sisesta oma PIN-kood", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "Palun sisesta oma kasutajanimi", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "Palun järgi veebilehel olevaid juhiseid ja klõpsi nuppu Edasi.", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "privacy": "Privaatsus", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "Avalikud jututoad", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "pushRules": "Tõukereeglid", + "@pushRules": { + "type": "String", + "placeholders": {} + }, + "reason": "Põhjus", + "@reason": { + "type": "String", + "placeholders": {} + }, + "recording": "Salvestan", + "@recording": { + "type": "String", + "placeholders": {} + }, + "redactedAnEvent": "{username} muutis sündmust", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "redactMessage": "Muuda sõnumit", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "register": "Registreeru", + "@register": { + "type": "String", + "placeholders": {} + }, + "reject": "Lükka tagasi", + "@reject": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "{username} lükkas kutse tagasi", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "rejoin": "Liitu uuesti", + "@rejoin": { + "type": "String", + "placeholders": {} + }, + "remove": "Eemalda", + "@remove": { + "type": "String", + "placeholders": {} + }, + "removeAllOtherDevices": "Eemalda kõik muud seadmed", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "removedBy": "{username} eemaldas sündmuse", + "@removedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "removeDevice": "Eemalda seade", + "@removeDevice": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "Eemalda suhtluskeeld", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "removeYourAvatar": "Kustuta oma tunnuspilt", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "renderRichContent": "Visualiseeri vormindatud sõnumite sisu", + "@renderRichContent": { + "type": "String", + "placeholders": {} + }, + "replaceRoomWithNewerVersion": "Asenda jututoa senine versioon uuega", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "reply": "Vasta", + "@reply": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "Teata sõnumist", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "requestPermission": "Palu õigusi", + "@requestPermission": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "Jututoa vesrioon on uuendatud", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "Jututoa versioon", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "saveFile": "Salvesta fail", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "search": "Otsi", + "@search": { + "type": "String", + "placeholders": {} + }, + "security": "Turvalisus", + "@security": { + "type": "String", + "placeholders": {} + }, + "seenByUser": "Sõnumit nägi {username}", + "@seenByUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "send": "Saada", + "@send": { + "type": "String", + "placeholders": {} + }, + "sendAMessage": "Saada sõnum", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "sendAsText": "Saada tekstisõnumina", + "@sendAsText": { + "type": "String" + }, + "sendAudio": "Saada helifail", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendFile": "Saada fail", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendImage": "Saada pilt", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendMessages": "Saada sõnumeid", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "sendOriginal": "Saada fail muutmata kujul", + "@sendOriginal": { + "type": "String", + "placeholders": {} + }, + "sendSticker": "Saada kleeps", + "@sendSticker": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "Saada videofail", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "sentAFile": "📁 {username} saatis faili", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAnAudio": "🎤 {username} saatis helifaili", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAPicture": "🖼️ {username} saatis pildi", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentASticker": "😊 {username} saatis kleepsu", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "🎥 {username} saatis video", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentCallInformations": "{senderName} saatis teavet kõne kohta", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "setAsCanonicalAlias": "Määra põhinimeks", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "setCustomEmotes": "Kohanda emotsioonitegevusi", + "@setCustomEmotes": { + "type": "String", + "placeholders": {} + }, + "setInvitationLink": "Tee kutselink", + "@setInvitationLink": { + "type": "String", + "placeholders": {} + }, + "setPermissionsLevel": "Seadista õigusi", + "@setPermissionsLevel": { + "type": "String", + "placeholders": {} + }, + "setStatus": "Määra olek", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "settings": "Seadistused", + "@settings": { + "type": "String", + "placeholders": {} + }, + "share": "Jaga", + "@share": { + "type": "String", + "placeholders": {} + }, + "sharedTheLocation": "{username} jagas oma asukohta", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "shareLocation": "Jaga asukohta", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "showPassword": "Näita salasõna", + "@showPassword": { + "type": "String", + "placeholders": {} + }, + "singlesignon": "Ühekordne sisselogimine", + "@singlesignon": { + "type": "String", + "placeholders": {} + }, + "skip": "Jäta vahele", + "@skip": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "Lähtekood", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "spaceIsPublic": "Kogukond on avalik", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "spaceName": "Kogukonna nimi", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "startedACall": "{senderName} alustas kõnet", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "status": "Olek", + "@status": { + "type": "String", + "placeholders": {} + }, + "statusExampleMessage": "Kuidas sul täna läheb?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "submit": "Saada", + "@submit": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWait": "Sünkroniseerin andmeid… Palun oota.", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "systemTheme": "Süsteem", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "Nad ei klapi omavahel", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "Nad klapivad omavahel", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "title": "FluffyChat", + "@title": { + "description": "Title for the application", + "type": "String", + "placeholders": {} + }, + "toggleFavorite": "Muuda olekut lemmikuna", + "@toggleFavorite": { + "type": "String", + "placeholders": {} + }, + "toggleMuted": "Lülita summutamine sisse või välja", + "@toggleMuted": { + "type": "String", + "placeholders": {} + }, + "toggleUnread": "Märgi loetuks / lugemata", + "@toggleUnread": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "Liiga palju päringuid. Palun proovi hiljem uuesti!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "transferFromAnotherDevice": "Tõsta teisest seadmest", + "@transferFromAnotherDevice": { + "type": "String", + "placeholders": {} + }, + "tryToSendAgain": "Proovi uuesti saata", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "unavailable": "Eemal", + "@unavailable": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username} eemaldas ligipääsukeelu kasutajalt {targetName}", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "unblockDevice": "Eemalda seadmelt blokeering", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "Tundmatu seade", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "unknownEncryptionAlgorithm": "Tundmatu krüptoalgoritm", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unknownEvent": "Tundmatu sündmuse tüüp '{type}'", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "unmuteChat": "Lõpeta vestluse vaigistamine", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "unpin": "Eemalda klammerdus", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "unreadChats": "{unreadCount, plural, =1{1 lugemata vestlus} other{{unreadCount} lugemata vestlust}}", + "@unreadChats": { + "type": "String", + "placeholders": { + "unreadCount": { + "type": "int" + } + } + }, + "userAndOthersAreTyping": "{username} ja {count} muud kirjutavad…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "userAndUserAreTyping": "{username} ja {username2} kirjutavad…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userIsTyping": "{username} kirjutab…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userLeftTheChat": "🚪{username} lahkus vestlusest", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "username": "Kasutajanimi", + "@username": { + "type": "String", + "placeholders": {} + }, + "userSentUnknownEvent": "{username} saatis {type} sündmuse", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "verified": "Verifitseeritud", + "@verified": { + "type": "String", + "placeholders": {} + }, + "verify": "Verifitseeri", + "@verify": { + "type": "String", + "placeholders": {} + }, + "verifyStart": "Alusta verifitseerimist", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "Sinu verifitseerimine õnnestus!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "verifyTitle": "Verifitseerin teist kasutajakontot", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "videoCall": "Videokõne", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "Vestluse ajaloo nähtavus", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "Nähtav kõikidele osalejatele", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "Nähtav kõikidele", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "Häälsõnum", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "Ootan, et teine osapool nõustuks päringuga…", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "Ootan teise osapoole kinnitust, et tegemist on samade emojidega…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "Ootan teise osapoole kinnitust, et tegemist on samade numbritega…", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "wallpaper": "Taustapilt:", + "@wallpaper": { + "type": "String", + "placeholders": {} + }, + "warning": "Hoiatus!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "weSentYouAnEmail": "Me saatsime sulle e-kirja", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "whoCanPerformWhichAction": "Erinevatele kasutajatele lubatud toimingud", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "Kes võivad selle vestlusrühmaga liituda", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "Miks sa soovid sellest teatada?", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "wipeChatBackup": "Kas kustutame sinu vestluste varukoopia ja loome uue taastamiseks mõeldud krüptovõtme?", + "@wipeChatBackup": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "Nende e-posti aadresside abil saad taastada oma salasõna.", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "Kirjuta üks sõnum…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "yes": "Jah", + "@yes": { + "type": "String", + "placeholders": {} + }, + "you": "Sina", + "@you": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "Sa enam ei osale selles vestluses", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "Sinule on selles vestluses seatud suhtluskeeld", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "yourPublicKey": "Sinu avalik võti", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "chatHasBeenAddedToThisSpace": "Lisasime vestluse kogukonda", + "@chatHasBeenAddedToThisSpace": {}, + "addToSpace": "Lisa kogukonda", + "@addToSpace": {}, + "scanQrCode": "Skaneeri QR-koodi", + "@scanQrCode": {}, + "sendOnEnter": "Saada sõnum sisestusklahvi vajutusel", + "@sendOnEnter": {}, + "homeserver": "Koduserver", + "@homeserver": {}, + "serverRequiresEmail": "See koduserver eeldab registreerimisel kasutatava e-postiaadressi kinnitamist.", + "@serverRequiresEmail": {}, + "enableMultiAccounts": "(KATSELINE) Pruugi selles seadmes mitut Matrix'i kasutajakontot", + "@enableMultiAccounts": {}, + "bundleName": "Köite nimi", + "@bundleName": {}, + "removeFromBundle": "Eemalda sellest köitest", + "@removeFromBundle": {}, + "addToBundle": "Lisa köitesse", + "@addToBundle": {}, + "editBundlesForAccount": "Muuda selle kasutajakonto köiteid", + "@editBundlesForAccount": {}, + "addAccount": "Lisa kasutajakonto", + "@addAccount": {}, + "oneClientLoggedOut": "Üks sinu klientrakendustest on Matrix'i võrgust välja loginud", + "@oneClientLoggedOut": {}, + "link": "Link", + "@link": {}, + "yourChatBackupHasBeenSetUp": "Sinu vestluste varundus on seadistatud.", + "@yourChatBackupHasBeenSetUp": {}, + "unverified": "Verifitseerimata", + "@unverified": {}, + "repeatPassword": "Korda salasõna", + "@repeatPassword": {}, + "messageInfo": "Sõnumi teave", + "@messageInfo": {}, + "time": "Kellaaeg", + "@time": {}, + "messageType": "Sõnumi tüüp", + "@messageType": {}, + "sender": "Saatja", + "@sender": {}, + "openGallery": "Ava galerii", + "@openGallery": {}, + "addToSpaceDescription": "Vali kogukond, kuhu soovid seda vestlust lisada.", + "@addToSpaceDescription": {}, + "removeFromSpace": "Eemalda kogukonnast", + "@removeFromSpace": {}, + "start": "Alusta", + "@start": {}, + "commandHint_discardsession": "Loobu sessioonist", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "commandHint_clearcache": "Tühjenda vahemälu", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_dm": "Alusta otsevestlust\nKrüptimise keelamiseks kasuta --no-encryption võtit", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "commandHint_create": "Loo tühi vestlusrühm\nKrüptimise keelamiseks kasuta --no-encryption võtit", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "openVideoCamera": "Tee video", + "@openVideoCamera": { + "type": "String", + "placeholders": {} + }, + "markAsRead": "Märgi loetuks", + "@markAsRead": {}, + "reportUser": "Teata kasutajast", + "@reportUser": {}, + "openChat": "Ava vestlus", + "@openChat": {}, + "dismiss": "Loobu", + "@dismiss": {}, + "reactedWith": "{sender} reageeris nii {reaction}", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "emojis": "Emotikonid", + "@emojis": {}, + "placeCall": "Helista", + "@placeCall": {}, + "unsupportedAndroidVersion": "See Androidi versioon ei ole toetatud", + "@unsupportedAndroidVersion": {}, + "voiceCall": "Häälkõne", + "@voiceCall": {}, + "confirmEventUnpin": "Kas sa oled kindel, et tahad klammerdatud sündmuse eemaldada?", + "@confirmEventUnpin": {}, + "pinMessage": "Klammerda sõnum jututuppa", + "@pinMessage": {}, + "videoCallsBetaWarning": "Palun arvesta, et videokõned on veel beetajärgus. Nad ei pruugi veel toimida kõikidel platvormidel korrektselt.", + "@videoCallsBetaWarning": {}, + "emailOrUsername": "E-posti aadress või kasutajanimi", + "@emailOrUsername": {}, + "experimentalVideoCalls": "Katselised videokõned", + "@experimentalVideoCalls": {}, + "unsupportedAndroidVersionLong": "See funktsionaalsus eeldab uuemat Androidi versiooni. Palun kontrolli, kas sinu nutiseadmele leidub süsteemiuuendusi või saaks seal Lineage OSi kasutada.", + "@unsupportedAndroidVersionLong": {}, + "nextAccount": "Järgmine kasutajakonto", + "@nextAccount": {}, + "separateChatTypes": "Eraldi vestlused ja jututoad", + "@separateChatTypes": { + "type": "String", + "placeholders": {} + }, + "errorAddingWidget": "Vidina lisamisel tekkis viga.", + "@errorAddingWidget": {}, + "widgetNameError": "Palun sisesta kuvatav nimi.", + "@widgetNameError": {}, + "addWidget": "Lisa vidin", + "@addWidget": {}, + "previousAccount": "Eelmine kasutajakonto", + "@previousAccount": {}, + "widgetUrlError": "See pole korrektne URL.", + "@widgetUrlError": {}, + "widgetName": "Nimi", + "@widgetName": {}, + "widgetCustom": "Kohandatud", + "@widgetCustom": {}, + "widgetJitsi": "Jitsi Meet", + "@widgetJitsi": {}, + "widgetEtherpad": "Märkmed ja tekstid", + "@widgetEtherpad": {}, + "widgetVideo": "Video", + "@widgetVideo": {}, + "switchToAccount": "Pruugi kasutajakontot # {number}", + "@switchToAccount": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "youAcceptedTheInvitation": "👍 Sa võtsid kutse vastu", + "@youAcceptedTheInvitation": {}, + "youUnbannedUser": "Sa eemaldasid suhtluskeelu kasutajalt {user}", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youHaveWithdrawnTheInvitationFor": "Sa oled tühistanud kutse kasutajale {user}", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youBannedUser": "Sa seadsid suhtluskeelu kasutajale {user}", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youJoinedTheChat": "Sa liitusid vestlusega", + "@youJoinedTheChat": {}, + "youKickedAndBanned": "🙅Sa müksasid kasutaja {user} välja ning seadsid talle suhtluskeelu", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "videoWithSize": "Video ({size})", + "@videoWithSize": { + "type": "String", + "placeholders": { + "size": { + "type": "String" + } + } + }, + "youRejectedTheInvitation": "Sa lükkasid kutse tagasi", + "@youRejectedTheInvitation": {}, + "youKicked": "👞 Sa müksasid kasutaja {user} välja", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedUser": "📩 Sa saatsid kutse kasutajale {user}", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedBy": "📩 {user} saatis sulle kutse", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "publish": "Avalda", + "@publish": {}, + "pleaseEnterRecoveryKey": "Palun sisesta oma taastevõti:", + "@pleaseEnterRecoveryKey": {}, + "recoveryKey": "Taastevõti", + "@recoveryKey": {}, + "users": "Kasutajad", + "@users": {}, + "storeInSecureStorageDescription": "Salvesta taastevõti selle seadme turvahoidlas.", + "@storeInSecureStorageDescription": {}, + "saveKeyManuallyDescription": "Salvesta see krüptovõti kasutades selle süsteemi jagamisvalikuid või lõikelauda.", + "@saveKeyManuallyDescription": {}, + "storeInAndroidKeystore": "Vali salvestuskohaks Android KeyStore", + "@storeInAndroidKeystore": {}, + "storeInAppleKeyChain": "Vali salvestuskohaks Apple KeyChain", + "@storeInAppleKeyChain": {}, + "recoveryKeyLost": "Kas taasetvõti on kadunud?", + "@recoveryKeyLost": {}, + "pleaseEnterRecoveryKeyDescription": "Vanade sõnumite lugemiseks palun siseta oma varasemas sessioonis loodud taastevõti. Taastamiseks mõeldud krüptovõti EI OLE sinu salasõna.", + "@pleaseEnterRecoveryKeyDescription": {}, + "storeSecurlyOnThisDevice": "Salvesta turvaliselt selles seadmes", + "@storeSecurlyOnThisDevice": {}, + "unlockOldMessages": "Muuda vanad sõnumid loetavaks", + "@unlockOldMessages": {}, + "countFiles": "{count} faili", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "dehydrate": "Ekspordi sessiooni teave ja kustuta nutiseadmest rakenduse andmed", + "@dehydrate": {}, + "dehydrateTor": "TOR'i kasutajad: Ekspordi sessioon", + "@dehydrateTor": {}, + "hydrateTor": "TOR'i kasutajatele: impordi viimati eksporditud sessiooni andmed", + "@hydrateTor": {}, + "hydrateTorLong": "Kui viimati TOR'i võrku kasutasid, siis kas sa eksportisid oma sessiooni andmed? Kui jah, siis impordi nad mugavasti ja jätka suhtlemist.", + "@hydrateTorLong": {}, + "indexedDbErrorTitle": "Brauseri privaatse akna kasutamisega seotud asjaolud", + "@indexedDbErrorTitle": {}, + "dehydrateWarning": "Seda tegevust ei saa tagasi pöörata. Palun kontrolli, et sa oled varukoopia turvaliselt salvestanud.", + "@dehydrateWarning": {}, + "dehydrateTorLong": "Kui oled TOR'i võrgu kasutaja, siis enne akna sulgemist palun ekspordi viimase sessiooni andmed.", + "@dehydrateTorLong": {}, + "indexedDbErrorLong": "Privaatse akna puhul andmete salvestamine vaikimisi pole kasutusel.\nPalun toimi alljärgnevalt:\n- ava about:config\n- määra dom.indexedDB.privateBrowsing.enabled väärtuseks true\nVastasel juhul sa ei saa FluffyChat'i kasutada.", + "@indexedDbErrorLong": {}, + "hydrate": "Taasta varundatud failist", + "@hydrate": {}, + "user": "Kasutaja", + "@user": {}, + "custom": "Kohandatud", + "@custom": {}, + "confirmMatrixId": "Konto kustutamiseks palun kinnitage oma Matrix'i ID.", + "@confirmMatrixId": {}, + "supposedMxid": "See peaks olema {mxid}", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "commandHint_markasgroup": "Märgi vestlusrühmaks", + "@commandHint_markasgroup": {}, + "commandHint_markasdm": "Märgi otsevestusluseks antud Matrixi ID jaoks", + "@commandHint_markasdm": {}, + "whyIsThisMessageEncrypted": "Miks see sõnum pole loetav?", + "@whyIsThisMessageEncrypted": {}, + "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": {}, + "callingPermissions": "Helistamise õigused", + "@callingPermissions": {}, + "callingAccountDetails": "Võimaldab FluffyChat'il kasutada Androidi helistamisrakendust.", + "@callingAccountDetails": {}, + "appearOnTop": "Luba pealmise rakendusena", + "@appearOnTop": {}, + "otherCallingPermissions": "Mikrofoni, kaamera ja muud FluffyChat'i õigused", + "@otherCallingPermissions": {}, + "newGroup": "Uus jututuba", + "@newGroup": {}, + "newSpace": "Uus kogukond", + "@newSpace": {}, + "enterSpace": "Sisene kogukonda", + "@enterSpace": {}, + "enterRoom": "Ava jututuba", + "@enterRoom": {}, + "appearOnTopDetails": "Sellega lubad rakendust avada kõige pealmisena (pole vajalik, kui Fluffychat on juba seadistatud toimima helistamiskontoga)", + "@appearOnTopDetails": {}, + "callingAccount": "Helistamiskonto", + "@callingAccount": {}, + "screenSharingTitle": "ekraani jagamine", + "@screenSharingTitle": {}, + "foregroundServiceRunning": "See teavitus toimib siis, kui esiplaaniteenus töötab.", + "@foregroundServiceRunning": {}, + "allSpaces": "Kõik kogukonnad", + "@allSpaces": {}, + "screenSharingDetail": "Sa jagad oma ekraani FuffyChati vahendusel", + "@screenSharingDetail": {}, + "numChats": "{number} vestlust", + "@numChats": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "hideUnimportantStateEvents": "Peida väheolulised olekuteated", + "@hideUnimportantStateEvents": {}, + "doNotShowAgain": "Ära näita uuesti", + "@doNotShowAgain": {}, + "commandHint_cuddle": "Saada üks kaisutus", + "@commandHint_cuddle": {}, + "commandHint_hug": "Saada üks kallistus", + "@commandHint_hug": {}, + "googlyEyesContent": "{senderName} saatis sulle otsivad silmad", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "cuddleContent": "{senderName} kaisutab sind", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "hugContent": "{senderName} kallistab sind", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "commandHint_googly": "Saada ühed otsivad silmad", + "@commandHint_googly": {}, + "wasDirectChatDisplayName": "Sõnumiteta vestlus (vana nimega {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "startFirstChat": "Alusta oma esimest vestlust", + "@startFirstChat": {}, + "encryptThisChat": "Krüpti see vestlus", + "@encryptThisChat": {}, + "disableEncryptionWarning": "Kui vestluses on krüptimine kasutusele võetud, siis turvalisuse huvides ei saa seda hiljem välja lülitada.", + "@disableEncryptionWarning": {}, + "sorryThatsNotPossible": "Vabandust... see ei ole võimalik", + "@sorryThatsNotPossible": {}, + "deviceKeys": "Seadme võtmed:", + "@deviceKeys": {}, + "newSpaceDescription": "Kogukonnad võimaldavad sul koondada erinevaid vestlusi ning korraldada avalikku või privaatset ühistegevust.", + "@newSpaceDescription": {}, + "reopenChat": "Alusta vestlust uuesti", + "@reopenChat": {}, + "noOtherDevicesFound": "Muid seadmeid ei leidu", + "@noOtherDevicesFound": {}, + "noBackupWarning": "Hoiatus! Kui sa ei lülita sisse vestluse varundust, siis sul puudub hiljem ligipääs krüptitud sõnumitele. Me tungivalt soovitame, et palun lülita vestluse varundamine sisse enne väljalogimist.", + "@noBackupWarning": {}, + "fileIsTooBigForServer": "Saatmine ei õnnestu! Serveri vaid kuni {max} suurusega manuseid.", + "@fileIsTooBigForServer": {}, + "fileHasBeenSavedAt": "Fail on salvestatud kausta: {path}", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "jumpToLastReadMessage": "Liigu viimase loetud sõnumini", + "@jumpToLastReadMessage": {}, + "readUpToHere": "Siiamaani on loetud", + "@readUpToHere": {}, + "jump": "Hüppa", + "@jump": {}, + "openLinkInBrowser": "Ava link veebibrauseris", + "@openLinkInBrowser": {}, + "report": "teata", + "@report": {}, + "allRooms": "Kõik vestlusrühmad", + "@allRooms": { + "type": "String", + "placeholders": {} + }, + "reportErrorDescription": "😭 Oh appike! Midagi läks valesti. Kui soovid, võid sellest veast arendajatele teatada.", + "@reportErrorDescription": {}, + "signInWithPassword": "Logi sisse salasõnaga", + "@signInWithPassword": {}, + "pleaseTryAgainLaterOrChooseDifferentServer": "Palun proovi hiljem uuesti või muuda serveri nime.", + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "signInWith": "Logi sisse kasutades teenusepakkujat {provider}", + "@signInWith": { + "type": "String", + "placeholders": { + "provider": { + "type": "String" + } + } + }, + "importFromZipFile": "Impordi zip-failist", + "@importFromZipFile": {}, + "exportEmotePack": "Ekspordi emotikonide pakk zip-failina", + "@exportEmotePack": {}, + "replace": "Asenda", + "@replace": {}, + "notAnImage": "See pole pildifail.", + "@notAnImage": {}, + "importNow": "Impordi kohe", + "@importNow": {}, + "importEmojis": "Impordi emojid", + "@importEmojis": {}, + "sendTypingNotifications": "Saada kirjutamise teavitusi", + "@sendTypingNotifications": {}, + "createGroup": "Loo vestlusrühm", + "@createGroup": {}, + "setTheme": "Vali teema:", + "@setTheme": {}, + "inviteContactToGroupQuestion": "Kas sa soovid kutsuda kasutajat {contact} „{groupName}“ jututuppa?", + "@inviteContactToGroupQuestion": {}, + "tryAgain": "Proovi uuesti", + "@tryAgain": {}, + "chatPermissions": "Vestluse õigused", + "@chatPermissions": {}, + "chatDescription": "Vestluse kirjeldus", + "@chatDescription": {}, + "noChatDescriptionYet": "Vestluse kirjeldus on puudu.", + "@noChatDescriptionYet": {}, + "optionalRedactReason": "(Kui soovid lisada) Sõnumi muutmise põhjus...", + "@optionalRedactReason": {}, + "messagesStyle": "Sõnumid:", + "@messagesStyle": {}, + "shareInviteLink": "Jaga kutse linki", + "@shareInviteLink": {}, + "directChat": "Otsevestlus", + "@directChat": {}, + "setChatDescription": "Lisa vestluse kirjeldus", + "@setChatDescription": {}, + "profileNotFound": "Sellist kasutajat serveris ei leidu. Tegemist võib olla kas võrguühenduse probleemiga või sellist kasutajat tõesti pole olemas.", + "@profileNotFound": {}, + "setColorTheme": "Vali värviteema:", + "@setColorTheme": {}, + "invite": "Kutsu", + "@invite": {}, + "invalidServerName": "Vigane serveri nimi", + "@invalidServerName": {}, + "addChatDescription": "Lisa vestluse kirjeldus...", + "@addChatDescription": {}, + "chatDescriptionHasBeenChanged": "Vestluse kirjeldus on muutunud", + "@chatDescriptionHasBeenChanged": {}, + "redactMessageDescription": "Sõnumi muudatus kehtib kõikidele vestluses osalejatele. Seda muudatust ei saa tagasi pöörata.", + "@redactMessageDescription": {}, + "redactedBy": "Muutja: {username}", + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "redactedByBecause": "Muutja {username} märkis põhjuseks: „{reason}“", + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "inviteGroupChat": "📨 Kutsu vestlusrühma", + "@inviteGroupChat": {}, + "invitePrivateChat": "📨 Kutsu omavahelisele vestlusele", + "@invitePrivateChat": {}, + "emoteKeyboardNoRecents": "Hiljuti kasutatud emotikonid kuvame siin...", + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "invalidInput": "Vigane sisend!", + "@invalidInput": {}, + "wrongPinEntered": "Sisestasid vale PIN-koodi! Proovi uuesti {seconds} sekundi pärast...", + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "banUserDescription": "Sellele kasutajale on nüüd selles jututoas seatud suhtluskeeld ning ta ei saa vestluses osaleda seni, kuni suhtluskeeld pole eemaldatud.", + "@banUserDescription": {}, + "removeDevicesDescription": "Sind logitakse sellest seadmest välja ja sa enam ei saa sõnumeid.", + "@removeDevicesDescription": {}, + "unbanUserDescription": "Uuesti proovimisel saab see kasutaja nüüd vestlusega liituda.", + "@unbanUserDescription": {}, + "pushNotificationsNotAvailable": "Tõuketeavitused pole saadaval", + "@pushNotificationsNotAvailable": {}, + "makeAdminDescription": "Kui annad sellele kasutajale peakasutaja õigused, siis kuna tal on sinuga samad õigused, sa ei saa seda toimingut enam tagasi pöörata.", + "@makeAdminDescription": {}, + "archiveRoomDescription": "Selle vestluse tõstame nüüd arhiivi. Muud osalejad näevad, et sa oled vestlusest lahkunud.", + "@archiveRoomDescription": {}, + "hasKnocked": "🚪{user} on jututoa uksele koputanud", + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "learnMore": "Loe lisaks", + "@learnMore": {}, + "roomUpgradeDescription": "See vestlus luuakse nüüd uuesti jututoa uue versioonina. Kõik senised osalejad saavad teate, et nad peavad liituma uue vestlusega. Jututubade versioonide kohta leiad teavet https://spec.matrix.org/latest/rooms/ lehelt", + "@roomUpgradeDescription": {}, + "pleaseEnterANumber": "Palun sisesta 0'st suurem number", + "@pleaseEnterANumber": {}, + "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": {}, + "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": {}, + "createGroupAndInviteUsers": "Lisavestlusrühm ja kutsu sinna kasutajaid", + "@createGroupAndInviteUsers": {}, + "startConversation": "Alusta vestlust", + "@startConversation": {}, + "blockedUsers": "Blokeeritud kasutajad", + "@blockedUsers": {}, + "groupCanBeFoundViaSearch": "Vestlusrühm on leitav otsinguga", + "@groupCanBeFoundViaSearch": {}, + "noUsersFoundWithQuery": "Päringuga „{query}“ ei leidunud kahkus ühtegi kasutajat. Palun kontrolli, et päringus poleks vigu.", + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "block": "Blokeeri", + "@block": {}, + "yourGlobalUserIdIs": "Sinu üldine kasutajatunnus on: ", + "@yourGlobalUserIdIs": {}, + "commandHint_sendraw": "Saada json oma algupärasel kujul", + "@commandHint_sendraw": {}, + "wrongRecoveryKey": "Vabandust..., see ei tundu olema korrektne taastevõti.", + "@wrongRecoveryKey": {}, + "blockUsername": "Eira kasutajanime", + "@blockUsername": {}, + "groupName": "Vestlusrühma nimi", + "@groupName": {}, + "databaseMigrationTitle": "Andmebaas on optimeeritud", + "@databaseMigrationTitle": {}, + "searchChatsRooms": "Otsi #vestlusi, @kasutajaid...", + "@searchChatsRooms": {}, + "databaseMigrationBody": "Palun oota üks hetk. Natuke võib kuluda aega.", + "@databaseMigrationBody": {}, + "thisDevice": "See seade:", + "@thisDevice": {}, + "publicSpaces": "Avalikud kogukonnad", + "@publicSpaces": {}, + "passwordIsWrong": "Sinu sisestatud salasõna on vale", + "@passwordIsWrong": {}, + "pleaseEnterYourCurrentPassword": "Palun sisesta oma praegune salasõna", + "@pleaseEnterYourCurrentPassword": {}, + "publicLink": "Avalik link", + "@publicLink": {}, + "nothingFound": "Ei leidnud mitte midagi...", + "@nothingFound": {}, + "decline": "Keeldu", + "@decline": {}, + "newPassword": "Uus salasõna", + "@newPassword": {}, + "passwordsDoNotMatch": "Salasõnad ei klapi omavahel", + "@passwordsDoNotMatch": {}, + "subspace": "Jututuba või alamkogukond", + "@subspace": {}, + "select": "Vali", + "@select": {}, + "pleaseChooseAStrongPassword": "Palun sisesta korralik salasõna", + "@pleaseChooseAStrongPassword": {}, + "addChatOrSubSpace": "Lisa vestlus või jututuba", + "@addChatOrSubSpace": {}, + "leaveEmptyToClearStatus": "Senise oleku eemaldamiseks jäta väärtus tühjaks.", + "@leaveEmptyToClearStatus": {}, + "joinSpace": "Liitu kogukonnaga", + "@joinSpace": {}, + "searchForUsers": "Otsi kasutajat @kasutajanimi ...", + "@searchForUsers": {}, + "databaseBuildErrorBody": "SQlite andmebaasi loomine ei õnnestu. Seetõttu üritab rakendus kasutada senist andmehoidlat. Palun teata sellest veast arendajatele siin: {url} märkides veateate: {error}", + "@databaseBuildErrorBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "initAppError": "Rakenduse käivitamisel tekkis viga", + "@initAppError": {}, + "sessionLostBody": "Sinu sessioon on kadunud. Palun teata sellest veast arendajatele siin: {url} märkides veateate: {error}", + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "restoreSessionBody": "Nüüd üritab rakendus taastada sinu sessiooni varukoopiast. Palun teata sellest veast arendajatele siin: {url} märkides veateate: {error}", + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "transparent": "Läbipaistev", + "@transparent": {}, + "youInvitedToBy": "📩 Sa oled lingiga saanud kutse jututuppa:\n{alias}", + "@youInvitedToBy": { + "placeholders": { + "alias": { + "type": "String" + } + } + }, + "sendReadReceipts": "Saada lugemisteatisi", + "@sendReadReceipts": {}, + "verifyOtherUserDescription": "Kui sa oled vestluse teise osapoole verifitseerinud, siis saad kindel olla, et tead, kellega suhtled. 💪\n\nKui alustad verifitseerimist, siis sinul ja teisel osapoolel tekib rakenduses hüpikaken. Seal kuvatakse emotikonide või numbrite jada, mida peate omavahel võrdlema.\n\nKõige lihtsam on seda teha kas omavahelise kohtumise ajal või videokõne kestel. 👭", + "@verifyOtherUserDescription": {}, + "forwardMessageTo": "Kas edastame sõnumi jututuppa {roomName}?", + "@forwardMessageTo": { + "type": "String", + "placeholders": { + "roomName": { + "type": "String" + } + } + }, + "sendTypingNotificationsDescription": "Muud vestluses osalejad saavad näha, kui sa oled uut sõnumit kirjutamas.", + "@sendTypingNotificationsDescription": {}, + "sendReadReceiptsDescription": "Muud vestluses osalejad näevad, kas oled sõnumit lugenud.", + "@sendReadReceiptsDescription": {}, + "formattedMessages": "Vormindatud sõnumid", + "@formattedMessages": {}, + "verifyOtherUser": "🔐 Verifitseeri teine kasutaja", + "@verifyOtherUser": {}, + "verifyOtherDevice": "🔐 Verifitseeri oma muu seade", + "@verifyOtherDevice": {}, + "canceledKeyVerification": "{sender} katkestas krüptovõtmete verifitseerimise", + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "completedKeyVerification": "{sender} sai valmis krüptovõtmete verifitseerimise", + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "formattedMessagesDescription": "Kasutades markdown-süntaksit kuva vormindust, nagu rasvases kirjas tekst.", + "@formattedMessagesDescription": {}, + "verifyOtherDeviceDescription": "Kui sa oled oma muu seadme verifitseerinud, siis need seadmed võivad vahetada krüptovõtmeid ning see parandab üldist turvalisust. 💪 Kui alustad verifitseerimist, siis sinu mõlemas seadmes tekib rakenduses hüpikaken. Seal kuvatakse emotikonide või numbrite jada, mida pead omavahel võrdlema. On oluline, et mõlemad seadmed on verifitseerimise alustamisel sinu kõrval. 🤳", + "@verifyOtherDeviceDescription": {}, + "acceptedKeyVerification": "{sender} nõustus krüptovõtmete verifitseerimisega", + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "isReadyForKeyVerification": "{sender} on valmis krüptovõtmete verifitseerimiseks", + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "requestedKeyVerification": "{sender} palus krüptovõtmete verifitseerimist", + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "startedKeyVerification": "{sender} alustas krüptovõtmete verifitseerimist", + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "presenceStyle": "Olekuteated:", + "@presenceStyle": { + "type": "String", + "placeholders": {} + }, + "presencesToggle": "Näita teiste kasutajate olekuteateid", + "@presencesToggle": { + "type": "String", + "placeholders": {} + }, + "incomingMessages": "Saabuvad sõnumid", + "@incomingMessages": {}, + "hidePresences": "Peida olekute loend?", + "@hidePresences": {}, + "stickers": "Kleepsud", + "@stickers": {}, + "discover": "Otsi ja leia", + "@discover": {}, + "commandHint_ignore": "Eira seda Matrixi kasutajatunnust", + "@commandHint_ignore": {}, + "commandHint_unignore": "Lõpeta selle Matrixi kasutajatunnuse eiramine", + "@commandHint_unignore": {}, + "unreadChatsInApp": "{appname}: {unread} lugemata vestlust", + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "globalChatId": "Üldine vestluse tunnus", + "@globalChatId": {}, + "accessAndVisibilityDescription": "Kes võib selle vestlusega liituda ja kuidas on võimalik seda vestlust leida.", + "@accessAndVisibilityDescription": {}, + "hideRedactedMessagesBody": "Kui keegi muudab sõnumit, siis teda enam ei kuvataks vestluses.", + "@hideRedactedMessagesBody": {}, + "userWouldLikeToChangeTheChat": "{user} soovib liituda vestlusega.", + "@userWouldLikeToChangeTheChat": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "hideMemberChangesInPublicChats": "Peida avalike vestluste liikmelisuse muutused", + "@hideMemberChangesInPublicChats": {}, + "notifyMeFor": "Teavita mind kui", + "@notifyMeFor": {}, + "usersMustKnock": "Kasutajad peavad uksele koputama", + "@usersMustKnock": {}, + "noOneCanJoin": "Mitte keegi ei saa liituda", + "@noOneCanJoin": {}, + "knocking": "Koputus uksele", + "@knocking": {}, + "chatCanBeDiscoveredViaSearchOnServer": "Vestluse või jututoa saad leida otsingust serveris {server}", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "publicChatAddresses": "Vestluse avalik aadress", + "@publicChatAddresses": {}, + "minimumPowerLevel": "{level} on väikseim võimalik õiguste tase.", + "@minimumPowerLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "String" + } + } + }, + "noDatabaseEncryption": "Andmebaasi krüptimine pole sellel platvormil toetatud", + "@noDatabaseEncryption": {}, + "noPublicLinkHasBeenCreatedYet": "Avalikult kasutatavat linki pole veel olemas", + "@noPublicLinkHasBeenCreatedYet": {}, + "knock": "Koputa uksele", + "@knock": {}, + "appLockDescription": "Kui sa rakendust parasjagu ei kasuta, siis lukusta ta PIN-koodiga", + "@appLockDescription": {}, + "accessAndVisibility": "Ligipääsetavus ja nähtavus", + "@accessAndVisibility": {}, + "calls": "Kõned", + "@calls": {}, + "customEmojisAndStickers": "Kohandatud emotikonid ja kleepsud", + "@customEmojisAndStickers": {}, + "customEmojisAndStickersBody": "Lisa või jaga kohandatud emotikone või kleepsupakke, mida võiks kasutada igas vestluses.", + "@customEmojisAndStickersBody": {}, + "hideRedactedMessages": "Peida muudetud sõnumid", + "@hideRedactedMessages": {}, + "hideInvalidOrUnknownMessageFormats": "Peida vigase või tundmatu vorminguga sõnumid", + "@hideInvalidOrUnknownMessageFormats": {}, + "hideMemberChangesInPublicChatsBody": "Parema loetavuse nimel ära näita vestluse ajajoonel avaliku jututoaga liitumisi ja sealt lahkumisi.", + "@hideMemberChangesInPublicChatsBody": {}, + "overview": "Ülevaade", + "@overview": {}, + "passwordRecoverySettings": "Salasõna taastamise seadistused", + "@passwordRecoverySettings": {}, + "createNewAddress": "Loo uus aadress", + "@createNewAddress": {}, + "userRole": "Kasutaja roll", + "@userRole": {}, + "thereAreCountUsersBlocked": "Hetkel on {count} blokeeritud kasutajat.", + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "searchIn": "Otsi vestlusest „{chat}“...", + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "searchMore": "Otsi veel...", + "@searchMore": {}, + "knockRestricted": "Koputa piiratud ligipääsuga jututoa uksele", + "@knockRestricted": {}, + "restricted": "Piiratud", + "@restricted": {}, + "gallery": "Galerii", + "@gallery": {}, + "files": "Failid", + "@files": {}, + "swipeRightToLeftToReply": "Vastamiseks viipa paremalt vasakule", + "@swipeRightToLeftToReply": {}, + "alwaysUse24HourFormat": "false", + "@alwaysUse24HourFormat": { + "description": "Set to true to always display time of day in 24 hour format." + }, + "noMoreChatsFound": "Rohkem vestlusi ei leidu...", + "@noMoreChatsFound": {}, + "joinedChats": "Vestlusi, millega oled liitunud", + "@joinedChats": {}, + "unread": "Lugemata", + "@unread": {}, + "space": "Kogukond", + "@space": {}, + "spaces": "Kogukonnad", + "@spaces": {}, + "goToSpace": "Ava kogukond: {space}", + "@goToSpace": { + "type": "String", + "space": {} + }, + "markAsUnread": "Märgi mitteloetuks", + "@markAsUnread": {}, + "countChatsAndCountParticipants": "{chats} vestlust ja {participants} osalejat", + "@countChatsAndCountParticipants": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + }, + "participants": { + "type": "int" + } + } + }, + "userLevel": "{level} - kasutaja", + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "moderatorLevel": "{level} - moderaator", + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "adminLevel": "{level} - peakasutaja", + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "changeTheVisibilityOfChatHistory": "Muuda vestluse ajaloo nähtavust", + "@changeTheVisibilityOfChatHistory": {}, + "sendRoomNotifications": "Saada @jututuba teavitusi", + "@sendRoomNotifications": {}, + "changeTheCanonicalRoomAlias": "Muuda vestluse põhilist avalikult nähtavat aadressi", + "@changeTheCanonicalRoomAlias": {}, + "changeGeneralChatSettings": "Muuda vestluse üldiseid seadistusi", + "@changeGeneralChatSettings": {}, + "inviteOtherUsers": "Kutsu teisi osalejaid sellesse vestlusesse", + "@inviteOtherUsers": {}, + "changeTheChatPermissions": "Muuda vestluse õigusi", + "@changeTheChatPermissions": {}, + "changeTheDescriptionOfTheGroup": "Muuda vestluse kirjeldust", + "@changeTheDescriptionOfTheGroup": {}, + "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": {}, + "invitedBy": "📩 Kutsujaks {user}", + "@invitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "updateInstalled": "🎉 Versiooniuuendus {version} on paigaldatud!", + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "changelog": "Muudatuste logi", + "@changelog": {}, + "sendCanceled": "Saatmine on katkestatud", + "@sendCanceled": {}, + "noChatsFoundHere": "Siin ei leidu veel ühtegi vestlust. Alusta uut vestlust klõpsides allpool asuvat nuppu. ⤵️", + "@noChatsFoundHere": {}, + "loginWithMatrixId": "Logi sisse Matrix-ID alusel", + "@loginWithMatrixId": {}, + "discoverHomeservers": "Leia koduservereid", + "@discoverHomeservers": {}, + "whatIsAHomeserver": "Mis on koduserver?", + "@whatIsAHomeserver": {}, + "homeserverDescription": "Sarnaselt e-postiteenuse pakkujale on kõik sinu sõnumid salvestatud koduserveris. Sa võid valida sellise koduserveri, nagu sulle meeldib ja nad kõik suudavad teiste koduserveritega suhelda. Lisateavet leiad veebisaidist https://matrix.org.", + "@homeserverDescription": {}, + "doesNotSeemToBeAValidHomeserver": "Ei tundu olema ühilduv koduserver. Kas võrguaadress on ikka õige?", + "@doesNotSeemToBeAValidHomeserver": {}, + "prepareSendingAttachment": "Valmistume manuse saatmiseks...", + "@prepareSendingAttachment": {}, + "generatingVideoThumbnail": "Loome video pisipilti...", + "@generatingVideoThumbnail": {}, + "compressVideo": "Pakime videot väiksemaks...", + "@compressVideo": {}, + "sendingAttachmentCountOfCount": "Saadame manust: {index} pikkusega {length}...", + "@sendingAttachmentCountOfCount": { + "type": "integer", + "placeholders": { + "index": { + "type": "int" + }, + "length": { + "type": "int" + } + } + }, + "serverLimitReached": "Serveri poolt lubatud ülempiir on käes. Ootame {seconds} sekundit...", + "@serverLimitReached": { + "type": "integer", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "sendingAttachment": "Saadame manust...", + "@sendingAttachment": {}, + "calculatingFileSize": "Arvutame faili suurust...", + "@calculatingFileSize": {}, + "oneOfYourDevicesIsNotVerified": "Üks sinu seadmetest pole verifitseeritud", + "@oneOfYourDevicesIsNotVerified": {}, + "noticeChatBackupDeviceVerification": "Märkus: kui liidad kõik oma seadmed vestluste varundamisega, siis on nad sellega ka automaatselt verifitseeritud.", + "@noticeChatBackupDeviceVerification": {}, + "continueText": "Jätka", + "@continueText": {}, + "welcomeText": "Tere, tere 👋 See on FluffyChat. Sa võid sisse logida igasse koduserverisse, mis ühildub https://matrix.org serveriga. Ja seejärel saad suhelda kõigiga. Tegemist on ikka väga suure detsentraliseeritud sõnumivõrguga!", + "@welcomeText": {}, + "setWallpaper": "Määra taustapildiks", + "@setWallpaper": {}, + "manageAccount": "Halda kasutajakontot", + "@manageAccount": {}, + "blur": "Hägusus:", + "@blur": {}, + "opacity": "Läbipaistmatus:", + "@opacity": {}, + "contactServerSecurity": "Võta ühendust serveri andmeturbe eest vastutajaga", + "@contactServerSecurity": {}, + "supportPage": "Kasutajatugi", + "@supportPage": {}, + "serverInformation": "Serveri teave:", + "@serverInformation": {}, + "name": "Nimi", + "@name": {}, + "version": "Versioon", + "@version": {}, + "noContactInformationProvided": "Server ei jaga asjakohast kontaktteavet", + "@noContactInformationProvided": {}, + "contactServerAdmin": "Võta ühendust serveri haldajaga", + "@contactServerAdmin": {}, + "website": "Veebisait", + "@website": {}, + "aboutHomeserver": "Koduserveri teave: {homeserver}", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "compressBeforeSending": "Paki enne saatmist kokku", + "@compressBeforeSending": {}, + "pleaseFillOut": "Palun täida", + "@pleaseFillOut": {}, + "invalidUrl": "Vigane võrguaadress", + "@invalidUrl": {}, + "addLink": "Lisa link", + "@addLink": {}, + "strikeThrough": "Läbikriipsutatud kiri", + "@strikeThrough": {}, + "sendUncompressed": "Saada pakkimata kujul", + "@sendUncompressed": {}, + "boldText": "Paks kiri", + "@boldText": {}, + "italicText": "Kaldkiri", + "@italicText": {}, + "unableToJoinChat": "Vestlusega liitumine ei õnnestu. Võib-olla on teine osapool juba vestluse sulgenud.", + "@unableToJoinChat": {}, + "sendImages": "Saada {count} pilti", + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "compress": "Paki kokku", + "@compress": {}, + "previous": "Eelmine", + "@previous": {}, + "otherPartyNotLoggedIn": "Vestluse teine osapool pole hetkel võrku loginud ega seega saa neid sõnumeid kohe kätte!", + "@otherPartyNotLoggedIn": {}, + "open": "Ava", + "@open": {}, + "appWantsToUseForLoginDescription": "Järgnevaga lubad sa, et rakendus ja veebisait jagavad teavet sinu kohta.", + "@appWantsToUseForLoginDescription": {}, + "appWantsToUseForLogin": "Sisselogimiseks kasuta serverit '{server}'", + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "waitingForServer": "Ootame serveri vastust...", + "@waitingForServer": {}, + "appIntroduction": "FluffyChat võimaldab sul suhelda sõprade ja tuttavatega, kes kasutavad erinevaid sõnumikliente. Lisateavet leiad https://matrix.org saidist või lihtsalt klõpsi „Jätka“.", + "@appIntroduction": {}, + "synchronizingPleaseWaitCounter": " Sünkroniseerime… ({percentage}%)", + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "newChatRequest": "📩 Uus vestluskutse", + "@newChatRequest": {}, + "notificationRuleCallDescription": "Teavita kasutajat saabuvast video- või häälkõnest.", + "@notificationRuleCallDescription": {}, + "notificationRuleEncryptedRoomOneToOneDescription": "Teavita kasutajat kahepoolse krüptitud vestluse sõnumitest.", + "@notificationRuleEncryptedRoomOneToOneDescription": {}, + "notificationRuleMasterDescription": "Ära järgi muid reegleid ja lülita kõik teavitused välja.", + "@notificationRuleMasterDescription": {}, + "notificationRuleSuppressNoticesDescription": "Ära teavita sõnumite puhul, mis on genereeritud masinate, nt jututubade robotite poolt.", + "@notificationRuleSuppressNoticesDescription": {}, + "notificationRuleSuppressEdits": "Peida muutmised", + "@notificationRuleSuppressEdits": {}, + "notificationRuleInviteForMeDescription": "Teavita kasutajat jututoa kutse saamisel.", + "@notificationRuleInviteForMeDescription": {}, + "notificationRuleIsUserMentionDescription": "Teavita kasutajat, kui ta on sõnumis otseselt mainitud.", + "@notificationRuleIsUserMentionDescription": {}, + "notificationRuleContainsDisplayNameDescription": "Teavita kasutajat, kui sõnumis leidub ta kuvatav nimi.", + "@notificationRuleContainsDisplayNameDescription": {}, + "notificationRuleJitsi": "Jitsi videokõned", + "@notificationRuleJitsi": {}, + "notificationRuleRoomnotif": "Jututoa üldteavitus", + "@notificationRuleRoomnotif": {}, + "notificationRuleRoomnotifDescription": "Teavita kasutajat, kui jututuba on sõnumis otseselt mainitud viisil „@toanimi“.", + "@notificationRuleRoomnotifDescription": {}, + "generalNotificationSettings": "Üldised teavituste seadistused", + "@generalNotificationSettings": {}, + "roomNotificationSettings": "Jututoa teavituste seadistused", + "@roomNotificationSettings": {}, + "userSpecificNotificationSettings": "Kasutajakohaste teavituste seadistused", + "@userSpecificNotificationSettings": {}, + "notificationRuleContainsUserName": "Kasutajanime olemasolul", + "@notificationRuleContainsUserName": {}, + "notificationRuleSuppressNotices": "Ära teavita automaatsete sõnumite korral", + "@notificationRuleSuppressNotices": {}, + "notificationRuleMemberEventDescription": "Ära teavita sõnumite puhul, mis seotud jututubade liikmelisusega.", + "@notificationRuleMemberEventDescription": {}, + "notificationRuleIsUserMention": "Kasutaja mainimised", + "@notificationRuleIsUserMention": {}, + "notificationRuleContainsDisplayName": "Kuvatava nime sisaldumisel", + "@notificationRuleContainsDisplayName": {}, + "notificationRuleIsRoomMention": "Jututoa mainimine", + "@notificationRuleIsRoomMention": {}, + "notificationRuleIsRoomMentionDescription": "Teavita kasutajat, kui jututuba on sõnumis otseselt mainitud.", + "@notificationRuleIsRoomMentionDescription": {}, + "notificationRuleTombstone": "Jututoa tegevuse lõpetamine", + "@notificationRuleTombstone": {}, + "notificationRuleTombstoneDescription": "Teavita kasutajat jututoa väljalülitamisega seotud sõnumite korral.", + "@notificationRuleTombstoneDescription": {}, + "notificationRuleReaction": "Reageerimised", + "@notificationRuleReaction": {}, + "notificationRuleRoomServerAcl": "Jututoa ligipääsuõigused serveris", + "@notificationRuleRoomServerAcl": {}, + "notificationRuleSuppressEditsDescription": "Peida teavitused sõnumite muutmise kohta.", + "@notificationRuleSuppressEditsDescription": {}, + "notificationRuleCall": "Kõned", + "@notificationRuleCall": {}, + "notificationRuleEncryptedRoomOneToOne": "Kahepoolne vestlus krüptitud jututoas", + "@notificationRuleEncryptedRoomOneToOne": {}, + "notificationRuleRoomOneToOne": "Kahepoolne vestlus krüptimata jututoas", + "@notificationRuleRoomOneToOne": {}, + "notificationRuleMessageDescription": "Teavita kasutajat üldistest sõnumitest.", + "@notificationRuleMessageDescription": {}, + "notificationRuleEncrypted": "Krüptitud sõnumid", + "@notificationRuleEncrypted": {}, + "notificationRuleEncryptedDescription": "Teavita kasutajat sõnumitest krüptitud jututubades.", + "@notificationRuleEncryptedDescription": {}, + "notificationRuleJitsiDescription": "Teavita kasutajat sündmustest Jitsi vidinas.", + "@notificationRuleJitsiDescription": {}, + "notificationRuleMessage": "Üldised sõnumid", + "@notificationRuleMessage": {}, + "notificationRuleServerAclDescription": "Peida teavitused ligipääsuõiguste muutuste korral serveris.", + "@notificationRuleServerAclDescription": {}, + "unknownPushRule": "Tõuketeavituse tundmatu reegel '{rule}'", + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } + } + }, + "more": "Lisateave", + "@more": {}, + "notificationRuleInviteForMe": "Kutsed mulle", + "@notificationRuleInviteForMe": {}, + "notificationRuleContainsUserNameDescription": "Teavita kasutajat, kui sõnumis on tema kasutajanimi.", + "@notificationRuleContainsUserNameDescription": {}, + "contentNotificationSettings": "Sisuteavituste seadistused", + "@contentNotificationSettings": {}, + "notificationRuleRoomServerAclDescription": "Peida teavitused jututoa ligipääsuõiguste muutuste korral serveris.", + "@notificationRuleRoomServerAclDescription": {}, + "notificationRuleRoomOneToOneDescription": "Teavita kasutajat kahepoolse krüptimata vestluse sõnumitest.", + "@notificationRuleRoomOneToOneDescription": {}, + "notificationRuleServerAcl": "Ligipääsuõigused serveris", + "@notificationRuleServerAcl": {}, + "notificationRuleMemberEvent": "Jututoa liikmelisusega seotud sündmus", + "@notificationRuleMemberEvent": {}, + "notificationRuleMaster": "Summuta kõik teavitused", + "@notificationRuleMaster": {}, + "notificationRuleReactionDescription": "Teavita kasutajat sõnumitele reageerimise korral.", + "@notificationRuleReactionDescription": {}, + "otherNotificationSettings": "Muud teavituste seadistused", + "@otherNotificationSettings": {}, + "deletePushRuleCanNotBeUndone": "Kui sa kustutad selle teavituse seadistuse, siis seda tegevust tagasi võtta ei saa.", + "@deletePushRuleCanNotBeUndone": {}, + "shareKeysWith": "Jaga võtmeid seadmega...", + "@shareKeysWith": {}, + "shareKeysWithDescription": "Missuguseid seadmeid sa usaldad, et neist võiks lugeda krüptitud vestluste sõnumeid?", + "@shareKeysWithDescription": {}, + "allDevices": "Kõiki seadmeid", + "@allDevices": {}, + "crossVerifiedDevicesIfEnabled": "Risttunnustatud seadmeid, kui see võimalus on kasutusel", + "@crossVerifiedDevicesIfEnabled": {}, + "crossVerifiedDevices": "Risttunnustatud seadmeid", + "@crossVerifiedDevices": {}, + "verifiedDevicesOnly": "Vaid verifitseeritud seadmeid", + "@verifiedDevicesOnly": {}, + "recordAVideo": "Salvesta video", + "@recordAVideo": {}, + "takeAPhoto": "Pildista", + "@takeAPhoto": {}, + "optionalMessage": "Sõnum (kui soovid lisada)...", + "@optionalMessage": {}, + "notSupportedOnThisDevice": "See pole antud seadmes toetatud", + "@notSupportedOnThisDevice": {}, + "enterNewChat": "Liitu uue vestlusega", + "@enterNewChat": {}, + "commandHint_roomupgrade": "Uuenda see jututuba antud jututoa versioonini", + "@commandHint_roomupgrade": {} +} diff --git a/assets/l10n/intl_eu.arb b/assets/l10n/intl_eu.arb new file mode 100644 index 0000000..fb500a2 --- /dev/null +++ b/assets/l10n/intl_eu.arb @@ -0,0 +1,3343 @@ +{ + "@@locale": "eu", + "@@last_modified": "2021-08-14 12:41:10.062383", + "about": "Honi buruz", + "@about": { + "type": "String", + "placeholders": {} + }, + "accept": "Onartu", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 {username}(e)k gonbidapena onartu du", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "Kontua", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐 {username}(e)k ertzetik ertzerako zifratzea gaitu du", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "admin": "Administratzailea", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "ezizena", + "@alias": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "{senderName}(e)k deia erantzun du", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "Edonor batu daiteke", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "archive": "Fitxategia", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "Batu daitezke bisitan dauden erabiltzaileak?", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "Ziur zaude?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "Beste pertsona egiaztatzeko, sartu zure biltegiratze segururako pasaesaldia edo berreskuratze-gakoa.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "{username}(r)en egiaztaketa-eskaera onartu?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "banFromChat": "Txatera batzeko debekua ezarri", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "Kanporatuta", + "@banned": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username}(e)k {targetName}(r)i debekua ezarri dio", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "Blokeatu gailua", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "cancel": "Utzi", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "{username}(e)k txataren abatarra aldatu du", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatDescriptionTo": "{username}(e)k txataren deskribapena aldatu du: '{description}'", + "@changedTheChatDescriptionTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "description": { + "type": "String" + } + } + }, + "changedTheChatNameTo": "{username}(e)k txataren izena '{chatname}'(e)ra aldatu du", + "@changedTheChatNameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "chatname": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username}(e)k txataren baimenak aldatu ditu", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username}(e)k bere ezizena aldatu du. Aurrerantzean '{displayname}' izango da", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username}(e)k bisitarien sarbide-arauak aldatu ditu", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username}(e)k bisitarien arauak aldatu ditu: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username}(e)k historiaren ikusgaitasuna aldatu du", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username}(e)k historiaren ikusgaitasuna {rules}-(e)ra aldatu du", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username}(e)k batzeko arauak aldatu ditu", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username}(e)k batzeko arauak aldatu ditu: {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username}(e)k profileko abatarra aldatu du", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "{username}(e)k gelaren ezizena aldatu du", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username}(e)k gonbidapen-esteka aldatu du", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changeTheHomeserver": "Aldatu zerbitzaria", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "Aldatu itxura", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "Taldearen izena aldatu", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "Zifratzea hondatu egin da", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "chat": "Txata", + "@chat": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Txataren xehetasunak", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "Aukeratu pasahitz sendo bat", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "close": "Itxi", + "@close": { + "type": "String", + "placeholders": {} + }, + "compareEmojiMatch": "Konparatu emojiak", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "Konparatu zenbakiak", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "confirm": "Baieztatu", + "@confirm": { + "type": "String", + "placeholders": {} + }, + "connect": "Konektatu", + "@connect": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "Kontaktua taldera gonbidatu da", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "Arbelera kopiatu da", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "Kopiatu", + "@copy": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "Ezin izan da mezua deszifratu: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "countParticipants": "{count} partaide", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "create": "Sortu", + "@create": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "💬 {username}(e)k txata sortu du", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "currentlyActive": "Une honetan aktibo", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "Iluna", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "dateWithoutYear": "{month}/{day}", + "@dateWithoutYear": { + "type": "String", + "placeholders": { + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "dateWithYear": "{year}/{month}/{day}", + "@dateWithYear": { + "type": "String", + "placeholders": { + "year": { + "type": "String" + }, + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "delete": "Ezabatu", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "Mezuak ezabatu", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "device": "Gailua", + "@device": { + "type": "String", + "placeholders": {} + }, + "devices": "Gailuak", + "@devices": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "Ezizena aldatu da", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "Deskargatu fitxategia", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "editDisplayname": "Editatu ezizena", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "Emotea badago lehendik ere!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "Emotearen laburdura ez da baliozkoa!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "Emote-ezarpenak", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "emoteShortcode": "Laburdura", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emoteWarnNeedToPick": "Emote-laburdura eta irudi bat aukeratu behar dituzu!", + "@emoteWarnNeedToPick": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "Txata hutsik dago", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "Ezingo duzu zifratzea ezgaitu. Ziur zaude?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "encryption": "Zifratzea", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "Zifratzea ez dago gaituta", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName}(e)k deia amaitu du", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "enterYourHomeserver": "Sartu zure zerbitzaria", + "@enterYourHomeserver": { + "type": "String", + "placeholders": {} + }, + "fileName": "Fitxategiaren izena", + "@fileName": { + "type": "String", + "placeholders": {} + }, + "fluffychat": "Extera", + "@fluffychat": { + "type": "String", + "placeholders": {} + }, + "forward": "Birbidali", + "@forward": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "Batzeaz geroztik", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "Gonbidapenaz geroztik", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "group": "Taldea", + "@group": { + "type": "String", + "placeholders": {} + }, + "groupIsPublic": "Taldea publikoa da", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "groupWith": "{displayname} duen taldea", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "guestsAreForbidden": "Ez, bisitariak ez daude baimenduta", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "Bai, bisitariak batu daitezke", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{username}(e)k {targetName}(r)en gonbidapena atzera bota du", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "help": "Laguntza", + "@help": { + "type": "String", + "placeholders": {} + }, + "id": "IDa", + "@id": { + "type": "String", + "placeholders": {} + }, + "identity": "Identitatea", + "@identity": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "Pasaesaldi edo berreskuratze-gakoa ez da zuzena", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "Kontaktuak gonbidatu", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "Gonbidatu kontaktua {groupName}(e)ra", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "invited": "Gonbidatuta", + "@invited": { + "type": "String", + "placeholders": {} + }, + "invitedUser": "📩 {username}(e)k {targetName} gonbidatu du", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "invitedUsersOnly": "Gonbidatutako erabiltzaileak solik", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "inviteText": "{username}(e)k FluffyChatera gonbidatu zaitu.\n1. Bisitatu https://fluffychat.im eta instalatu aplikazioa\n2. Eman izena edo hasi saioa\n3. Ireki gonbidapen-esteka:\n{link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "isTyping": "idazten ari da…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "👋 {username} txatera batu da", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "joinRoom": "Batu gelara", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "kicked": "👞 {username}(e)k {targetName} kanporatu du", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickedAndBanned": "🙅 {username}(e)k {targetName} kanporatu eta debekua ezarri dio", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickFromChat": "Txatetik kanporatu", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "Azkenekoz aktibo: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "leave": "Irten", + "@leave": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "Txatetik irten da", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "license": "Lizentzia", + "@license": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "Argia", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "Kargatu {count} partaide gehiago", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "loadingPleaseWait": "Kargatzen… itxaron.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "loadMore": "Kargatu gehiago…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "login": "Hasi saioa", + "@login": { + "type": "String", + "placeholders": {} + }, + "logInTo": "Hasi saioa {homeserver}(e)n", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "logout": "Amaitu saioa", + "@logout": { + "type": "String", + "placeholders": {} + }, + "moderator": "Moderatzailea", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "muteChat": "Mututu txata", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "needPantalaimonWarning": "Kontuan izan oraingoz Pantalaimon behar duzula ertzetik ertzerako zifratzerako.", + "@needPantalaimonWarning": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "💬 Mezu berria FluffyChaten", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "Egiaztaketa-eskaera berria!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "no": "Ez", + "@no": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "Ez da emoterik aurkitu. 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "Ez dirudi Firebase Cloud Messaging zure mugikorrean erabilgarri dagoenik. Jakinarazpenak jasotzeko ntfy instalatzea gomendatzen dugu. ntfy edo beste Unified Push hornitzaileren batekin, push jakinarazpenak jaso ditzazkezu datuentzako segurua den modu batean. ntfy PlayStore edo F-Droid dendetatik deskarga dezakezu.", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "none": "Bat ere ez", + "@none": { + "type": "String", + "placeholders": {} + }, + "noPermission": "Baimenik gabe", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "Ez da gelarik aurkitu…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "ok": "Ados", + "@ok": { + "type": "String", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "Gakoen online babeskopia gaituta dago", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "Hara, zerbaitek huts egin du…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "Ireki aplikazioa mezuak irakurtzeko", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "openCamera": "Ireki kamera", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "pasaesaldia edo berreskuratze-gakoa", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "password": "Pasahitza", + "@password": { + "type": "String", + "placeholders": {} + }, + "pickImage": "Aukeratu irudi bat", + "@pickImage": { + "type": "String", + "placeholders": {} + }, + "pin": "Finkatu", + "@pin": { + "type": "String", + "placeholders": {} + }, + "play": "Abiarazi {fileName}", + "@play": { + "type": "String", + "placeholders": { + "fileName": { + "type": "String" + } + } + }, + "pleaseEnterYourPassword": "Sartu zure pasahitza", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "Sartu zure erabiltzaile-izena", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "Gela publikoak", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "recording": "Grabatzen", + "@recording": { + "type": "String", + "placeholders": {} + }, + "redactedAnEvent": "{username}(e)k gertaera bat atzera bota du", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "reject": "Baztertu", + "@reject": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "{username}(e)k gonbidapena baztertu du", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "rejoin": "Batu berriro", + "@rejoin": { + "type": "String", + "placeholders": {} + }, + "remove": "Kendu", + "@remove": { + "type": "String", + "placeholders": {} + }, + "removeAllOtherDevices": "Kendu gainerako gailu guztiak", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "removedBy": "{username}(e)k kendu du", + "@removedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "removeDevice": "Kendu gailua", + "@removeDevice": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "Kendu txatean duen debekua", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "renderRichContent": "Kargatu mezu aberatseko edukia", + "@renderRichContent": { + "type": "String", + "placeholders": {} + }, + "reply": "Erantzun", + "@reply": { + "type": "String", + "placeholders": {} + }, + "requestPermission": "Eskatu baimena", + "@requestPermission": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "Gela bertsio-berritu da", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "seenByUser": "{username}(e)k ikusi du", + "@seenByUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "send": "Bidali", + "@send": { + "type": "String", + "placeholders": {} + }, + "sendAMessage": "Bidali mezua", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "sendAudio": "Bidali audioa", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendFile": "Bidali fitxategia", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendImage": "Bidali irudia", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendOriginal": "Bidali jatorrizkoa", + "@sendOriginal": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "Bidali bideoa", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "sentAFile": "📁 {username}(e)k fitxategia bidali du", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAnAudio": "🎤 {username}(e)k audioa bidali du", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAPicture": "🖼️ {username}(e)k irudia bidali du", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentASticker": "😊 {username}(e)k pegatina bidali du", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "🎥 {username}(e)k bideoa bidali du", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentCallInformations": "{senderName}(e)k deiaren informazioa bidali du", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "setInvitationLink": "Gonbidapen-esteka ezarri", + "@setInvitationLink": { + "type": "String", + "placeholders": {} + }, + "setStatus": "Ezarri egoera", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "settings": "Ezarpenak", + "@settings": { + "type": "String", + "placeholders": {} + }, + "share": "Partekatu", + "@share": { + "type": "String", + "placeholders": {} + }, + "sharedTheLocation": "{username}(e)k kokapena partekatu du", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "skip": "Saltatu", + "@skip": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "Iturburu kodea", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "startedACall": "{senderName}(e)k deia hasi du", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "statusExampleMessage": "Zer moduz zaude gaur?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "submit": "Bidali", + "@submit": { + "type": "String", + "placeholders": {} + }, + "systemTheme": "Sistemak darabilena", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "Ez datoz bat", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "Bat datoz", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "title": "Extera", + "@title": { + "description": "Title for the application", + "type": "String", + "placeholders": {} + }, + "tryToSendAgain": "Saiatu berriro bidaltzen", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username}(e)k {targetName}(r)i debekua kendu dio", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "unblockDevice": "Desblokeatu gailua", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "Gailu ezezaguna", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "unknownEncryptionAlgorithm": "Zifratze-algoritmo ezezaguna", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unknownEvent": "'{type}' gertaera ezezaguna", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "unmuteChat": "Utzi txata mututzeari", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "unpin": "Utzi finkatzeari", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "userAndOthersAreTyping": "{username} eta beste {count} idazten ari dira…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "userAndUserAreTyping": "{username} eta {username2} idazten ari dira…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userIsTyping": "{username} idazten ari da…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userLeftTheChat": "🚪 {username}(e)k txata utzi du", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "username": "Erabiltzaile-izena", + "@username": { + "type": "String", + "placeholders": {} + }, + "userSentUnknownEvent": "{username}(e)k {type} gertaera bat bidali du", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "verify": "Egiaztatu", + "@verify": { + "type": "String", + "placeholders": {} + }, + "verifyStart": "Abiarazi egiaztaketa", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "Ondo egiaztatu duzu!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "verifyTitle": "Beste kontua egiaztatzen", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "videoCall": "Bideo-deia", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "Txat-historiaren ikusgaitasuna", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "Partaide guztientzat ikusgai", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "Edonorentzat ikusgai", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "Ahozko mezua", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "Kideak eskaera onartuko zain…", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "Kideak emojia onartuko zain…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "Kideak zenbakiak onartuko zain…", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "wallpaper": "Horma-irudia:", + "@wallpaper": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "Nor batu daiteke talde honetara?", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "Idatzi mezua…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "yes": "Bai", + "@yes": { + "type": "String", + "placeholders": {} + }, + "you": "Zeu", + "@you": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "Ez duzu txat honetan parte hartzen honezkero", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "Txat honetan debekua ezarri dizute", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "editRoomAliases": "Editatu gelaren aliasak", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "chats": "Txatak", + "@chats": { + "type": "String", + "placeholders": {} + }, + "emojis": "Emojiak", + "@emojis": {}, + "placeCall": "Egin deia", + "@placeCall": {}, + "voiceCall": "Ahozko deia", + "@voiceCall": {}, + "unsupportedAndroidVersion": "Android bertsioa ez da bateragarria", + "@unsupportedAndroidVersion": {}, + "unsupportedAndroidVersionLong": "Funtzio honek Android bertsio berriago bat behar du. Egiaztatu eguneraketak ote dauden edo begiratu Lineage OS-ek zure gailuarentzat aukerarik eskaintzen duen.", + "@unsupportedAndroidVersionLong": {}, + "commandHint_ban": "Debekatu erabiltzailea gela honetan", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_clearcache": "Ezabatu katxea", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_create": "Sortu taldeko-txat huts bat\nErabili --no-encyption zifratzea desgaitzeko", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "commandHint_op": "Zehaztu erabiltzaile honen botere-maila (defektuz: 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_plain": "Bidali formaturik gabeko testua", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_react": "Bidali erantzuna erreakzio gisa", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "commandHint_send": "Bidali testua", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "createNewSpace": "Gune berria", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "Editatu blokeatutako zerbitzariak", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "Gelaren abatarra editatu", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "encrypted": "Zifratuta", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "enterAnEmailAddress": "Sartu helbide elektroniko bat", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "homeserver": "Zerbitzaria", + "@homeserver": {}, + "errorObtainingLocation": "Errorea kokapena lortzerakoan: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "everythingReady": "Dena prest!", + "@everythingReady": { + "type": "String", + "placeholders": {} + }, + "extremeOffensive": "Izugarri iraingarria", + "@extremeOffensive": { + "type": "String", + "placeholders": {} + }, + "goToTheNewRoom": "Joan gela berrira", + "@goToTheNewRoom": { + "type": "String", + "placeholders": {} + }, + "groups": "Taldeak", + "@groups": { + "type": "String", + "placeholders": {} + }, + "hideRedactedEvents": "Ezkutatu atzera botatako gertaerak", + "@hideRedactedEvents": { + "type": "String", + "placeholders": {} + }, + "hideUnknownEvents": "Ezkutatu gertaera ezezagunak", + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "inviteForMe": "Niretzako gonbidapenak", + "@inviteForMe": { + "type": "String", + "placeholders": {} + }, + "notificationsEnabledForThisAccount": "Gaitu kontu honentzako jakinarazpenak", + "@notificationsEnabledForThisAccount": { + "type": "String", + "placeholders": {} + }, + "numUsersTyping": "{count} erabiltzaile idazten ari dira…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "notifications": "Jakinarazpenak", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "oneClientLoggedOut": "Zure gailuetako batek saioa amaitu du", + "@oneClientLoggedOut": {}, + "addAccount": "Gehitu kontua", + "@addAccount": {}, + "editBundlesForAccount": "Editatu kontu honetarako sortak", + "@editBundlesForAccount": {}, + "oopsPushError": "Hara! Zoritxarrez, errore bat gertatu da push jakinarazpenak ezartzerakoan.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "pleaseChoose": "Aukeratu", + "@pleaseChoose": { + "type": "String", + "placeholders": {} + }, + "saveFile": "Gorde fitxategia", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "singlesignon": "Single Sign on", + "@singlesignon": { + "type": "String", + "placeholders": {} + }, + "unreadChats": "{unreadCount, plural, =1{irakurri gabeko txat 1} other {irakurri gabeko {unreadCount} txat}}", + "@unreadChats": { + "type": "String", + "placeholders": { + "unreadCount": { + "type": "int" + } + } + }, + "videoCallsBetaWarning": "Kontuan izan bideo-deiak beta fasean daudela. Litekeena da behar bezala erabili ezin izatea —erabili ahal badira—.", + "@videoCallsBetaWarning": {}, + "toggleMuted": "Ikusi / Ezkutatu mutututakoak", + "@toggleMuted": { + "type": "String", + "placeholders": {} + }, + "all": "Guztia", + "@all": { + "type": "String", + "placeholders": {} + }, + "next": "Hurrengoa", + "@next": { + "type": "String", + "placeholders": {} + }, + "experimentalVideoCalls": "Bideo-dei esperimentalak", + "@experimentalVideoCalls": {}, + "emailOrUsername": "ePosta edo erabiltzaile-izena", + "@emailOrUsername": {}, + "enableMultiAccounts": "(BETA) Gaitu kontu bat baino gehiago gailu honetan", + "@enableMultiAccounts": {}, + "openVideoCamera": "Ireki kamera bideorako", + "@openVideoCamera": { + "type": "String", + "placeholders": {} + }, + "removeFromBundle": "Kendu sorta honetatik", + "@removeFromBundle": {}, + "serverRequiresEmail": "Zerbitzari honek zure posta elektronikoa egiaztatu behar du izena eman dezazun.", + "@serverRequiresEmail": {}, + "or": "Edo", + "@or": { + "type": "String", + "placeholders": {} + }, + "link": "Esteka", + "@link": {}, + "privacy": "Pribatutasuna", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "redactMessage": "Bota mezua atzera", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "register": "Eman izena", + "@register": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "Jarraitu webguneko argibideak eta sakatu 'Hurrengoa'.", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "reason": "Arrazoia", + "@reason": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "Salatu mezua", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "status": "Egoera", + "@status": { + "type": "String", + "placeholders": {} + }, + "yourPublicKey": "Zure gako publikoa", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "messageType": "Mezu mota", + "@messageType": {}, + "time": "Ordua", + "@time": {}, + "dismiss": "Baztertu", + "@dismiss": {}, + "switchToAccount": "Aldatu {number} kontura", + "@switchToAccount": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "previousAccount": "Aurreko kontua", + "@previousAccount": {}, + "edit": "Editatu", + "@edit": { + "type": "String", + "placeholders": {} + }, + "mention": "Aipatu", + "@mention": { + "type": "String", + "placeholders": {} + }, + "repeatPassword": "Idatzi berriro pasahitza", + "@repeatPassword": {}, + "addEmail": "Gehitu ePosta", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "areYouSureYouWantToLogout": "Ziur zaude saioa amaitu nahi duzula?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "Kopiatu arbelera", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "ignoredUsers": "Ez ikusia egindako erabiltzaileak", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "security": "Segurtasuna", + "@security": { + "type": "String", + "placeholders": {} + }, + "autoplayImages": "Automatikoki abiarazi pegatina eta emote animatuak", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "sendOnEnter": "Bidali enter sakatuz", + "@sendOnEnter": {}, + "badServerVersionsException": "Zerbitzariak ondorengo ezaugarriak onartzen ditu:\n{serverVersions}\nBaina aplikazioak hauek onartzen ditu bakarrik: {supportedVersions}", + "@badServerVersionsException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "botMessages": "Boten mezuak", + "@botMessages": { + "type": "String", + "placeholders": {} + }, + "cantOpenUri": "Ezin da {uri} URIa ireki", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "changeDeviceName": "Aldatu gailuaren izena", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changePassword": "Aldatu pasahitza", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeYourAvatar": "Aldatu abatarra", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "chatBackup": "Txataren babeskopia", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "chatBackupDescription": "Txat zaharrak berreskuratze-gako batekin daude babestuta. Ez galdu gako hori.", + "@chatBackupDescription": { + "type": "String", + "placeholders": {} + }, + "chatHasBeenAddedToThisSpace": "Txata gune honetara gehitu da", + "@chatHasBeenAddedToThisSpace": {}, + "configureChat": "Txata konfiguratu", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "Edukia zerbitzariko administratzaileei jakinarazi zaie", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "memberChanges": "Kideen aldaketak", + "@memberChanges": { + "type": "String", + "placeholders": {} + }, + "setAsCanonicalAlias": "Ezarri alias nagusi bezala", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "setCustomEmotes": "Ezarri zure emoteak", + "@setCustomEmotes": { + "type": "String", + "placeholders": {} + }, + "appLock": "Aplikazioa blokeatzea", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "addToSpace": "Gehitu gunera", + "@addToSpace": {}, + "allChats": "Txat guztiak", + "@allChats": { + "type": "String", + "placeholders": {} + }, + "badServerLoginTypesException": "Zerbitzariak ondorengo aukerak onartzen ditu saioa hasteko:\n{serverVersions}\nBaina aplikazioak hauek onartzen ditu bakarrik:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "commandHint_dm": "Hasi banakako txat bat\nErabili --no-encyption zifratzea desgaitzeko", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "commandHint_leave": "Utzi gela hau", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "blocked": "Blokeatuta", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "commandInvalid": "Komandoa ez da baliozkoa", + "@commandInvalid": { + "type": "String" + }, + "commandHint_myroomnick": "Ezarri zure ezizena gela honetarako", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "ignore": "Ezikusi", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "containsUserName": "Erabiltzaile-izena dauka", + "@containsUserName": { + "type": "String", + "placeholders": {} + }, + "containsDisplayName": "Ezizena dauka", + "@containsDisplayName": { + "type": "String", + "placeholders": {} + }, + "locationDisabledNotice": "Kokapen zerbitzuak ezgaituta daude. Gaitu zure kokapena partekatu ahal izateko.", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "directChats": "Banakako txatak", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "Gaitu zifratzea", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "iHaveClickedOnLink": "Estekan sakatu dut", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "noPasswordRecoveryDescription": "Oraindik ez duzu pasahitza berreskuratzeko modurik gehitu.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "online": "Linean", + "@online": { + "type": "String", + "placeholders": {} + }, + "pushRules": "Push arauak", + "@pushRules": { + "type": "String", + "placeholders": {} + }, + "pleaseEnter4Digits": "Sartu lau zenbaki edo utzi hutsik aplikazioa babestu nahi ez baduzu.", + "@pleaseEnter4Digits": { + "type": "String", + "placeholders": {} + }, + "replaceRoomWithNewerVersion": "Ordezkatu gela bertsio berriago batekin", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "search": "Bilatu", + "@search": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "Helbide hauekin pasahitza berreskuratu dezakezu.", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "Zergatik salatu nahi duzu?", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "videoWithSize": "Bideoa ({size})", + "@videoWithSize": { + "type": "String", + "placeholders": { + "size": { + "type": "String" + } + } + }, + "openGallery": "Ireki bilduma", + "@openGallery": {}, + "pinMessage": "Finkatu gelan", + "@pinMessage": {}, + "reactedWith": "{sender}(e)k {reaction}(r)ekin erreakzionatu du", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "confirmEventUnpin": "Ziur zaude gertaera finaktzeari utzi nahi diozula?", + "@confirmEventUnpin": {}, + "nextAccount": "Hurrengo kontua", + "@nextAccount": {}, + "markAsRead": "Markatu irakurritzat", + "@markAsRead": {}, + "yourChatBackupHasBeenSetUp": "Txaten babeskopiak ezarri dira.", + "@yourChatBackupHasBeenSetUp": {}, + "clearArchive": "Ezabatu artxiboa", + "@clearArchive": {}, + "commandHint_html": "Bidali testua HTML formatuan", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_invite": "Gonbidatu erabiltzailea gela honetara", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "commandHint_join": "Batu gelara", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_kick": "Kendu erabiltzaile hori gela honetatik", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_me": "Deskribatu zure burua", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "commandHint_myroomavatar": "Ezarri zure irudia gela honetarako (mxc-uri bidez)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_unban": "Kendu erabiltzaileak gela honetan duen debekua", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "commandMissing": "{command} ez da komandoa.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "commandHint_discardsession": "Baztertu saioa", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "deactivateAccountWarning": "Honek zure kontua desaktibatuko du. Ezin da desegin! Ziur zaude?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "Erabiltzaile berrien defektuzko botere-maila", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "Ezabatu kontua", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "deviceId": "Gailuaren IDa", + "@deviceId": { + "type": "String", + "placeholders": {} + }, + "emotePacks": "Gelarako emote-sortak", + "@emotePacks": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "Gaitu emote-sorta txat guztietarako", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "fontSize": "Letraren tamaina", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "howOffensiveIsThisContent": "Zenbaterainoko iraingarria da eduki hau?", + "@howOffensiveIsThisContent": { + "type": "String", + "placeholders": {} + }, + "inoffensive": "Ez da iraingarria", + "@inoffensive": { + "type": "String", + "placeholders": {} + }, + "locationPermissionDeniedNotice": "Kokapen baimena ukatu da. Eman zure kokapena partekatzeko baimena.", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "messages": "Mezuak", + "@messages": { + "type": "String", + "placeholders": {} + }, + "newChat": "Txat berria", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "Ez dago konexiorik zerbitzariarekin", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "Zifratzea aktiba dezakezu soilik gelak publikoa izateari utzi badio.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "noMatrixServer": "{server1} ez da matrix zerbitzari bat, {server2} erabili nahi duzu haren ordez?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "scanQrCode": "Eskaneatu QR kodea", + "@scanQrCode": {}, + "obtainingLocation": "Kokapena atzitzen…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "offensive": "Iraingarria", + "@offensive": { + "type": "String", + "placeholders": {} + }, + "offline": "Lineaz kanpo", + "@offline": { + "type": "String", + "placeholders": {} + }, + "addToBundle": "Gehitu sortara", + "@addToBundle": {}, + "bundleName": "Sortaren izena", + "@bundleName": {}, + "openInMaps": "Ireki mapen aplikazioan", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "participant": "Partaide", + "@participant": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "Pasahitza ahaztu dut", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "Pasahitza aldatu da", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "passwordRecovery": "Pasahitzaren berreskurapena", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "people": "Jendea", + "@people": { + "type": "String", + "placeholders": {} + }, + "pleaseChooseAPasscode": "Aukeratu sartzeko kode bat", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "pleaseClickOnLink": "Sakatu ePostako estekan eta ondoren jarraitu.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPin": "Sartu zure PINa", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "removeYourAvatar": "Kendu zure abatarra", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "Gelaren bertsioa", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "sendAsText": "Bidali testu bezala", + "@sendAsText": { + "type": "String" + }, + "sendMessages": "Mezuak bidali", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "sendSticker": "Bidali pegatina", + "@sendSticker": { + "type": "String", + "placeholders": {} + }, + "setPermissionsLevel": "Ezarri baimen-maila", + "@setPermissionsLevel": { + "type": "String", + "placeholders": {} + }, + "shareLocation": "Partekatu kokapena", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "showPassword": "Erakutsi pasahitza", + "@showPassword": { + "type": "String", + "placeholders": {} + }, + "spaceIsPublic": "Gunea publikoa da", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "spaceName": "Gunearen izena", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWait": "Sinkronizatzen… itxaron.", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "toggleFavorite": "Ikusi / Ezkutatu gogokoak", + "@toggleFavorite": { + "type": "String", + "placeholders": {} + }, + "toggleUnread": "Markatu irakurrita / irakurri gabe", + "@toggleUnread": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "Eskaera gehiegi. Saiatu berriro geroago!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "transferFromAnotherDevice": "Beste gailu batetik transferitu", + "@transferFromAnotherDevice": { + "type": "String", + "placeholders": {} + }, + "unavailable": "Ez dago eskuragai", + "@unavailable": { + "type": "String", + "placeholders": {} + }, + "unverified": "Egiaztatu gabe(a)", + "@unverified": {}, + "verified": "Egiaztatuta", + "@verified": { + "type": "String", + "placeholders": {} + }, + "warning": "Kontuz!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "weSentYouAnEmail": "ePosta bat bidali dizugu", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "whoCanPerformWhichAction": "Nork zer egin dezakeen", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "wipeChatBackup": "Ezabatu txataren babeskopia berreskuratze-gako berria sortzeko?", + "@wipeChatBackup": { + "type": "String", + "placeholders": {} + }, + "messageInfo": "Mezuaren xehetasunak", + "@messageInfo": {}, + "sender": "Igorlea", + "@sender": {}, + "removeFromSpace": "Kendu gunetik", + "@removeFromSpace": {}, + "addToSpaceDescription": "Hautatu gune bat txat hau bertara gehitzeko.", + "@addToSpaceDescription": {}, + "start": "Hasi", + "@start": {}, + "publish": "Argitaratu", + "@publish": {}, + "reportUser": "Salatu erabiltzailea", + "@reportUser": {}, + "openChat": "Ireki txata", + "@openChat": {}, + "addWidget": "Gehitu widgeta", + "@addWidget": {}, + "widgetVideo": "Bideoa", + "@widgetVideo": {}, + "widgetEtherpad": "Testu-oharra", + "@widgetEtherpad": {}, + "widgetJitsi": "Jitsi Meet", + "@widgetJitsi": {}, + "widgetCustom": "Norberak ezarritakoa", + "@widgetCustom": {}, + "widgetName": "Izena", + "@widgetName": {}, + "youJoinedTheChat": "Txatera batu zara", + "@youJoinedTheChat": {}, + "youAcceptedTheInvitation": "👍 Gonbidapena onartu duzu", + "@youAcceptedTheInvitation": {}, + "youBannedUser": "{user}(r)i debekua ezarri diozu", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youHaveWithdrawnTheInvitationFor": "{user}(r)i luzatutako gonbidapena baliogabetu duzu", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedBy": "📩 {user}(e)k gonbidatu zaitu", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedUser": "📩 {user} gonbidatu duzu", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKicked": "👞 {user} kanporatu duzu", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKickedAndBanned": "🙅 {user} kanporatu eta debekua ezarri diozu", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youUnbannedUser": "{user}(r)i debekua kendu diozu", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youRejectedTheInvitation": "Gonbidapena baztertu duzu", + "@youRejectedTheInvitation": {}, + "separateChatTypes": "Bereizi banakako mezuak eta taldeak", + "@separateChatTypes": { + "type": "String", + "placeholders": {} + }, + "widgetUrlError": "Ez da baliozko URLa.", + "@widgetUrlError": {}, + "widgetNameError": "Zehaztu ezizen bat.", + "@widgetNameError": {}, + "errorAddingWidget": "Errorea widgeta gehitzerakoan.", + "@errorAddingWidget": {}, + "pleaseEnterRecoveryKey": "Sartu berreskuratze-gakoa:", + "@pleaseEnterRecoveryKey": {}, + "recoveryKey": "Berreskuratze-gakoa", + "@recoveryKey": {}, + "recoveryKeyLost": "Berreskuratze-gakoa galdu duzu?", + "@recoveryKeyLost": {}, + "users": "Erabiltzaileak", + "@users": {}, + "storeInAndroidKeystore": "Gorde Android KeyStore-n", + "@storeInAndroidKeystore": {}, + "dehydrate": "Esportatu saioa eta ezabatu gailua", + "@dehydrate": {}, + "dehydrateWarning": "Ekintza hau ezin da desegin. Egiaztatu babeskopia toki seguruan gorde duzula.", + "@dehydrateWarning": {}, + "hydrate": "Lehengoratu babeskopia bat erabiliz", + "@hydrate": {}, + "pleaseEnterRecoveryKeyDescription": "Mezu zaharrak ikusi ahal izateko, sartu aurreko saioan sortu zen berreskuratze-gakoa. Berreskuratze-gakoa EZ da zure pasahitza.", + "@pleaseEnterRecoveryKeyDescription": {}, + "indexedDbErrorLong": "Mezuen artxibatzea ez dago defektuz gaituta modu pribatua erabiltzean.\nGaitzeko:\n - about:config\n - dom.indexedDB.privateBrowsing.enabled aukerak true erakutsi dezala\nBestela ezin da Extera erabili.", + "@indexedDbErrorLong": {}, + "storeSecurlyOnThisDevice": "Gorde gailu honetan modu seguruan", + "@storeSecurlyOnThisDevice": {}, + "countFiles": "{count} fitxategi", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "user": "Erabiltzailea", + "@user": {}, + "custom": "Neurrira egindakoa", + "@custom": {}, + "storeInSecureStorageDescription": "Gorde berreskuratze-gakoa gailu honetako biltegiratze seguruan.", + "@storeInSecureStorageDescription": {}, + "storeInAppleKeyChain": "Gorde Apple KeyChain-en", + "@storeInAppleKeyChain": {}, + "unlockOldMessages": "Desblokeatu mezu zaharrak", + "@unlockOldMessages": {}, + "dehydrateTorLong": "TOR erabiltzaileentzat gomendioa leihoa itxi baino lehen saioa esportatzea da.", + "@dehydrateTorLong": {}, + "hydrateTorLong": "Esportatu al zenuen zure saioa TOR erabili zenuen azken aldian? Inportatu segidan eta jarraitu txateatzen.", + "@hydrateTorLong": {}, + "dehydrateTor": "TOR Erabiltzaileak: Esportatu saioa", + "@dehydrateTor": {}, + "hydrateTor": "TOR Erabiltzaileak: Inportatu esportatutako saioa", + "@hydrateTor": {}, + "saveKeyManuallyDescription": "Gorde eskuz gako hau gailuko partekatze-menua edo arbela erabiliz.", + "@saveKeyManuallyDescription": {}, + "indexedDbErrorTitle": "Arazoak modu pribatuarekin", + "@indexedDbErrorTitle": {}, + "confirmMatrixId": "Baieztatu zure Matrix IDa kontua ezabatu ahal izateko.", + "@confirmMatrixId": {}, + "newSpace": "Gune berria", + "@newSpace": {}, + "enterRoom": "Sartu gelara", + "@enterRoom": {}, + "whyIsThisMessageEncrypted": "Zergatik ezin da mezu hau irakurri?", + "@whyIsThisMessageEncrypted": {}, + "allSpaces": "Gune guztiak", + "@allSpaces": {}, + "newGroup": "Talde berria", + "@newGroup": {}, + "enterSpace": "Sartu gunera", + "@enterSpace": {}, + "appearOnTopDetails": "Aplikazioa goikaldean agertzea baimentzen du (ez da beharrezkoa Extera deitzeko kontutzat ezarri baduzu)", + "@appearOnTopDetails": {}, + "screenSharingTitle": "pantaila-partekatzea", + "@screenSharingTitle": {}, + "screenSharingDetail": "Pantaila FluffyChaten partekatzen ari zara", + "@screenSharingDetail": {}, + "callingPermissions": "Deitzeko baimenak", + "@callingPermissions": {}, + "callingAccount": "Deitzen ari den kontua", + "@callingAccount": {}, + "callingAccountDetails": "Baimendu Extera Android gailuko telefono-markagailua erabiltzea.", + "@callingAccountDetails": {}, + "appearOnTop": "Gainean erakutsi", + "@appearOnTop": {}, + "otherCallingPermissions": "Mikrofono, kamera eta FluffyChaten beste baimen batzuk", + "@otherCallingPermissions": {}, + "numChats": "{number} txat", + "@numChats": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "hideUnimportantStateEvents": "Ezkutatu garrantzirik gabeko gertaerak", + "@hideUnimportantStateEvents": {}, + "noKeyForThisMessage": "Mezua gailu honetan saioa hasi baino lehen bidali bazen gertatu daiteke.\n\nBeste aukera bat igorleak zure gailua blokeatu izana da, edo zerbaitek huts egin izana interneteko konexioan.\n\nMezua beste saio batean irakur dezakezu? Hala bada, mezua transferitu dezakezu! Zoaz Ezrpenetara > Gailuak eta baieztatu zure gailuek bata bestea egiaztatu dutela. Gela irekiko duzun hurrengo aldian eta bi saioak aurreko planoan irekita daudenean, gakoak automatikoki partekatuko dira.\n\nEz duzu gakorik galdu nahi saioa amaitu edo gailuak aldatzen dituzunean? Baieztatu ezarpenetan txaten babeskopiak gaituta dituzula.", + "@noKeyForThisMessage": {}, + "supposedMxid": "Hau {mxid} izan behar da", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "commandHint_markasgroup": "Markatu talde bezala", + "@commandHint_markasgroup": {}, + "foregroundServiceRunning": "Jakinarazpen hau zerbitzua martxan dagoenean agertzen da.", + "@foregroundServiceRunning": {}, + "commandHint_markasdm": "Markatu mezu-zuzen gela bezala Matrix ID jakin honentzat", + "@commandHint_markasdm": {}, + "wasDirectChatDisplayName": "Txata hutsik dago ({oldDisplayName} zen lehen)", + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "deviceKeys": "Gailuaren gakoak:", + "@deviceKeys": {}, + "noBackupWarning": "Adi! Txataren babeskopia gaitzen ez baduzu, ezingo dituzu zifratutako txatak atzitu. Oso gomendagarria da txaten babeskopia gaitzea saioa amaitu baino lehen.", + "@noBackupWarning": {}, + "doNotShowAgain": "Ez erakutsi berriro", + "@doNotShowAgain": {}, + "fileIsTooBigForServer": "Ezin da bidali! Zerbitzariak gehienez {max}-ko eranskinak onartzen ditu.", + "@fileIsTooBigForServer": {}, + "noOtherDevicesFound": "Ez da beste gailurik aurkitu", + "@noOtherDevicesFound": {}, + "startFirstChat": "Hasi zure lehen txata", + "@startFirstChat": {}, + "newSpaceDescription": "Guneek txatak taldekatzea ahalbidetzen dute eta komunitate pribatu edo publikoak osatzea.", + "@newSpaceDescription": {}, + "disableEncryptionWarning": "Segurtasun arrazoiak direla-eta, ezin duzu lehendik zifratuta zegoen txat bateko zifratzea ezgaitu.", + "@disableEncryptionWarning": {}, + "encryptThisChat": "Zifratu txata", + "@encryptThisChat": {}, + "commandHint_hug": "Bidali besarkada", + "@commandHint_hug": {}, + "hugContent": "{senderName}(e)k besarkatu zaitu", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "sorryThatsNotPossible": "Barka… hori ez da posible", + "@sorryThatsNotPossible": {}, + "reopenChat": "Ireki txata berriro", + "@reopenChat": {}, + "commandHint_googly": "Bidali begi dibertigarri batzuk", + "@commandHint_googly": {}, + "commandHint_cuddle": "Bidali besarkada samurra", + "@commandHint_cuddle": {}, + "googlyEyesContent": "{senderName}(e)k begi dibertigarri batzuk bidali dizkizu", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "allRooms": "Talde-txat guztiak", + "@allRooms": { + "type": "String", + "placeholders": {} + }, + "jumpToLastReadMessage": "Joan irakurritako azken mezura", + "@jumpToLastReadMessage": {}, + "reportErrorDescription": "😭 O ez! Zerbaitek huts egin du. Nahi izanez gero, eman garatzaileei errorearen berri.", + "@reportErrorDescription": {}, + "cuddleContent": "{senderName}(e)k samurki besarkatu zaitu", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "readUpToHere": "Honaino irakurrita", + "@readUpToHere": {}, + "fileHasBeenSavedAt": "Fitxategia {path}(e)n gorde da", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "jump": "Joan", + "@jump": {}, + "openLinkInBrowser": "Ireki esteka nabigatzailean", + "@openLinkInBrowser": {}, + "report": "salatu", + "@report": {}, + "signInWithPassword": "Hasi saioa pasahitzarekin", + "@signInWithPassword": {}, + "pleaseTryAgainLaterOrChooseDifferentServer": "Saiatu geroago edo aukeratu beste zerbitzari bat.", + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "signInWith": "Hasi saioa {provider}(r)ekin", + "@signInWith": { + "type": "String", + "placeholders": { + "provider": { + "type": "String" + } + } + }, + "notAnImage": "Ez da irudi-fitxategia.", + "@notAnImage": {}, + "importNow": "Inportatu orain", + "@importNow": {}, + "importEmojis": "Inportatu emojiak", + "@importEmojis": {}, + "importFromZipFile": "Inportatu .zip fitxategi batetik", + "@importFromZipFile": {}, + "exportEmotePack": "Esportatu emote-sorta .zip gisa", + "@exportEmotePack": {}, + "replace": "Ordezkatu", + "@replace": {}, + "sendTypingNotifications": "Jakinarazi idazten nagoela", + "@sendTypingNotifications": {}, + "setColorTheme": "Ezarri kolore-gaia:", + "@setColorTheme": {}, + "tryAgain": "Saiatu berriro", + "@tryAgain": {}, + "messagesStyle": "Mezuak:", + "@messagesStyle": {}, + "chatDescription": "Txataren deskribapena", + "@chatDescription": {}, + "invalidServerName": "Zerbitzari-izenak ez du balio", + "@invalidServerName": {}, + "chatPermissions": "Txataren baimenak", + "@chatPermissions": {}, + "setChatDescription": "Ezarri txataren deskribapena", + "@setChatDescription": {}, + "redactedBy": "{username}(e)k atzera bota du", + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "optionalRedactReason": "(Aukerakoa) Mezua atzera botatzearen arrazoia…", + "@optionalRedactReason": {}, + "inviteContactToGroupQuestion": "{contact} \"{groupName}\" txatera gonbidatu nahi duzu?", + "@inviteContactToGroupQuestion": {}, + "redactedByBecause": "{username}(e)k atzera bota du \"{reason}\" dela-eta", + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "redactMessageDescription": "Mezua elkarrizketa honetako partaide guztientzat botako da atzera. Ezin da desegin.", + "@redactMessageDescription": {}, + "addChatDescription": "Gehitu txataren deskribapena…", + "@addChatDescription": {}, + "directChat": "Banakako txata", + "@directChat": {}, + "wrongPinEntered": "PIN okerra! Saiatu berriro {seconds} segundu barru…", + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "noChatDescriptionYet": "Ez da txaterako deskribapenik sortu oraindik.", + "@noChatDescriptionYet": {}, + "chatDescriptionHasBeenChanged": "Txataren deskribapena aldatu da", + "@chatDescriptionHasBeenChanged": {}, + "profileNotFound": "Ezin izan da erabiltzailea zerbitzarian aurkitu. Agian arazo bat dago konexioarekin edo erabiltzailea ez da existitzen.", + "@profileNotFound": {}, + "shareInviteLink": "Partekatu gonbidapen-esteka", + "@shareInviteLink": {}, + "emoteKeyboardNoRecents": "Oraintsu erabilitako emoteak hemen ageriko dira…", + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "setTheme": "Ezarri gaia:", + "@setTheme": {}, + "createGroup": "Sortu taldea", + "@createGroup": {}, + "invite": "Gonbidatu", + "@invite": {}, + "invalidInput": "Sartu duzunak ez du balio!", + "@invalidInput": {}, + "inviteGroupChat": "📨 Gonbidatu taldeko txatera", + "@inviteGroupChat": {}, + "invitePrivateChat": "📨 Gonbidatu txat pribatura", + "@invitePrivateChat": {}, + "banUserDescription": "Erabiltzailea txatetik kanporatu eta berriro sartzeko debekua ezarriko zaio; ezingo da berriro sartu debekua kendu arte.", + "@banUserDescription": {}, + "removeDevicesDescription": "Gailu honetako saioa amaituko da eta ezingo duzu mezurik jaso aurrerantzean.", + "@removeDevicesDescription": {}, + "unbanUserDescription": "Erabiltzailea txatera berriro sartu ahal izango da berak nahi izanez gero.", + "@unbanUserDescription": {}, + "pushNotificationsNotAvailable": "Push jakinarazpenak ez daude erabilgarri", + "@pushNotificationsNotAvailable": {}, + "makeAdminDescription": "Behin erabiltzaile hau administratzaile eginda, litekeena da desegin ezin izatea zuk dituzun baimenak izango dituelako.", + "@makeAdminDescription": {}, + "archiveRoomDescription": "Txata artxibategira mugituko da. Beste erabiltzaileek txatetik alde egin duzula ikusi ahal izango dute.", + "@archiveRoomDescription": {}, + "hasKnocked": "🚪 {user}(e)k baimena eskatu du", + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "learnMore": "Gehiago irakurri", + "@learnMore": {}, + "roomUpgradeDescription": "Gela bertsio berri gisa birsortuko da txata. Partaide guztiei jakinaraziko zaie txat berrira aldatu behar direla. Gehiago irakur dezakezu gela bertsioei buruz ondorengo estekan: https://spec.matrix.org/latest/rooms/", + "@roomUpgradeDescription": {}, + "pleaseEnterANumber": "Sartu 0 baino zenbaki handiago bat", + "@pleaseEnterANumber": {}, + "kickUserDescription": "Erabiltzailea txatetik kanporatu da baina ez zaio debekua ezarri. Txat publikoen kasuan, edozein momentutan batu daiteke berriro.", + "@kickUserDescription": {}, + "createGroupAndInviteUsers": "Sortu talde bat eta gonbidatu partaideak", + "@createGroupAndInviteUsers": {}, + "startConversation": "Hasi elkarrizketa", + "@startConversation": {}, + "groupCanBeFoundViaSearch": "Bilaketa erabiliz aurkitu daiteke taldea", + "@groupCanBeFoundViaSearch": {}, + "noUsersFoundWithQuery": "Zoritxarrez ez da \"{query}\" duen erabiltzailerik aurkitu. Egiaztatu zuzen idatzi duzula.", + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "yourGlobalUserIdIs": "Zure erabiltzaile-ID orokorra: ", + "@yourGlobalUserIdIs": {}, + "commandHint_sendraw": "Bidali json gordina", + "@commandHint_sendraw": {}, + "wrongRecoveryKey": "Barka baina ez dirudi berreskuratze-gako zuzena denik.", + "@wrongRecoveryKey": {}, + "groupName": "Taldearen izena", + "@groupName": {}, + "searchChatsRooms": "Bilatu #txatak, @erabiltzaileak…", + "@searchChatsRooms": {}, + "blockListDescription": "Gogaitzen zaituzten erabiltzaileak blokeatu ditzakezu. Ez duzu blokeatutakoen zerrendan dituzun erabiltzaileen mezurik edo gelara batzeko gonbidapenik jasoko.", + "@blockListDescription": {}, + "blockedUsers": "Blokeatutako erabiltzaileak", + "@blockedUsers": {}, + "block": "Blokeatu", + "@block": {}, + "blockUsername": "Ezikusi erabiltzaile-izena", + "@blockUsername": {}, + "databaseMigrationTitle": "Datu-basea optimizatu da", + "@databaseMigrationTitle": {}, + "databaseMigrationBody": "Itxaron, litekeena da tarte bat behar izatea.", + "@databaseMigrationBody": {}, + "publicSpaces": "Gune publikoak", + "@publicSpaces": {}, + "passwordIsWrong": "Sartu duzun pasahitza okerra da", + "@passwordIsWrong": {}, + "pleaseEnterYourCurrentPassword": "Sartu oraingo pasahitza", + "@pleaseEnterYourCurrentPassword": {}, + "publicLink": "Esteka publikoa", + "@publicLink": {}, + "nothingFound": "Ez da ezer aurkitu…", + "@nothingFound": {}, + "newPassword": "Pasahitz berria", + "@newPassword": {}, + "passwordsDoNotMatch": "Pasahitzak ez datoz bat", + "@passwordsDoNotMatch": {}, + "subspace": "Azpi-gunea", + "@subspace": {}, + "select": "Hautatu", + "@select": {}, + "pleaseChooseAStrongPassword": "Aukeratu pasahitz sendo bat", + "@pleaseChooseAStrongPassword": {}, + "addChatOrSubSpace": "Gehitu txata edo azpi-gunea", + "@addChatOrSubSpace": {}, + "leaveEmptyToClearStatus": "Utzi hutsik zure egoera garbitzeko.", + "@leaveEmptyToClearStatus": {}, + "joinSpace": "Batu gunera", + "@joinSpace": {}, + "searchForUsers": "Bilatu @erabiltzaileak…", + "@searchForUsers": {}, + "thisDevice": "Gailu hau:", + "@thisDevice": {}, + "decline": "Baztertu", + "@decline": {}, + "databaseBuildErrorBody": "Ezin da SQlite datu-basea eraiki. Aplikazioa aurreko datu-basea erabiltzen saiatuko da oraingoz. Jakinarazi errorea garatzaileei {url} helbidean. Errorearen mezua ondorengoa da: {error}", + "@databaseBuildErrorBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "initAppError": "Errorea aplikazioa abiaraztean", + "@initAppError": {}, + "sessionLostBody": "Zure saioa galdu da. Jakinarazi errorea garatzaileei {url} helbidean. Errorearen mezua ondorengoa da: {error}", + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "restoreSessionBody": "Aplikazioa babeskopia erabiliz saioa leheneratzen saiatuko da. Jakinarazi errorea garatzaileei {url} helbidean. Errorearen mezua ondorengoa da: {error}", + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "youInvitedToBy": "📩 Esteka baten bidez gonbidatu zaituzte:\n{alias}", + "@youInvitedToBy": { + "placeholders": { + "alias": { + "type": "String" + } + } + }, + "transparent": "Gardena", + "@transparent": {}, + "sendReadReceipts": "Bidali irakurri izanaren agiria", + "@sendReadReceipts": {}, + "formattedMessages": "Formatua duten mezuak", + "@formattedMessages": {}, + "verifyOtherDevice": "🔐 Egiaztatu beste gailu bat", + "@verifyOtherDevice": {}, + "acceptedKeyVerification": "{sender}(e)k gakoaren egiaztapena onartu du", + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "canceledKeyVerification": "{sender}(e)k gakoen egiaztapena ezeztatu du", + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "requestedKeyVerification": "{sender}(e)k gakoen egiaztapena galdegin du", + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "sendReadReceiptsDescription": "Txateko beste partaideek mezu bat irakurri duzula ikus dezakete.", + "@sendReadReceiptsDescription": {}, + "forwardMessageTo": "Birbidali mezua {roomName}(e)ra?", + "@forwardMessageTo": { + "type": "String", + "placeholders": { + "roomName": { + "type": "String" + } + } + }, + "completedKeyVerification": "{sender}(e)k gakoen egiaztapena osatu du", + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "isReadyForKeyVerification": "{sender} gakoak egiaztatzeko prest dago", + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "verifyOtherDeviceDescription": "Beste gailu bat egiaztatzean, gailu horiek gakoak truka ditzakete, eta segurtasun orokorra handitu. 💪 Egiaztapena hasten duzunean, laster-leiho bat agertuko da bi gailuetan. Bertan, elkarrekin alderatu behar diren emoji edo zenbaki batzuk ikusiko dituzu. Hobe da bi gailuak eskura izatea egiaztapena hasi aurretik. 🤳", + "@verifyOtherDeviceDescription": {}, + "verifyOtherUserDescription": "Beste erabiltzaile bat egiaztatzen baduzu, ziur egon zaitezke nori idazten ari zaren. 💪\n\nEgiaztapena hasten duzunean, zuk eta beste erabiltzaileak laster-leiho bat ikusiko duzue aplikazioan. Bertan, elkarrekin alderatu behar diren emoji edo zenbaki batzuk erakutsiko dira.\n\nBideo-dei bat hastea edo aurrez-aurre batzea da horretarako modurik onena. 👭", + "@verifyOtherUserDescription": {}, + "formattedMessagesDescription": "Erakutsi mezu aberatsen edukia markdown erabiliz, testu lodia esaterako.", + "@formattedMessagesDescription": {}, + "sendTypingNotificationsDescription": "Txateko beste partaideek mezu berri bat idazten ari zarela ikus dezakete.", + "@sendTypingNotificationsDescription": {}, + "verifyOtherUser": "🔐 Egiaztatu beste erabiltzaile bat", + "@verifyOtherUser": {}, + "startedKeyVerification": "{sender}(e)k gakoen egiaztapena hasi du", + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "presencesToggle": "Erakutsi beste erabiltzaileen egoera-mezuak", + "@presencesToggle": { + "type": "String", + "placeholders": {} + }, + "presenceStyle": "Presentzia:", + "@presenceStyle": { + "type": "String", + "placeholders": {} + }, + "incomingMessages": "Jasotako mezuak", + "@incomingMessages": {}, + "hidePresences": "Ezkutatu Egoeren Zerrenda?", + "@hidePresences": {}, + "discover": "Arakatu", + "@discover": {}, + "stickers": "Pegatinak", + "@stickers": {}, + "commandHint_unignore": "Utzi Matrix ID honi muzin egiteari", + "@commandHint_unignore": {}, + "commandHint_ignore": "Muzin egin Matrix ID honi", + "@commandHint_ignore": {}, + "unreadChatsInApp": "{appname}: {unread} mezu irakurri gabe", + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "noDatabaseEncryption": "Plataforma honetan ezin da datu-basea zifratu", + "@noDatabaseEncryption": {}, + "usersMustKnock": "Erabiltzaileek baimena eskatu behar dute", + "@usersMustKnock": {}, + "userWouldLikeToChangeTheChat": "{user}(e)k txatera batu nahiko luke.", + "@userWouldLikeToChangeTheChat": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "knock": "Eskatu baimena", + "@knock": {}, + "knocking": "Baimena eskatzen", + "@knocking": {}, + "chatCanBeDiscoveredViaSearchOnServer": "Txata {server}(e)n bilaketa eginez aurkitu daiteke", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "thereAreCountUsersBlocked": "Une honetan {count} erabiltzaile daude blokeatuta.", + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "appLockDescription": "Blokeatu aplikazioa pin kode batekin erabiltzen ari ez zarenean", + "@appLockDescription": {}, + "accessAndVisibility": "Sarbidea eta ikusgaitasuna", + "@accessAndVisibility": {}, + "accessAndVisibilityDescription": "Nork du txat honetara batzeko baimena eta nola aurkitu daiteke txata.", + "@accessAndVisibilityDescription": {}, + "customEmojisAndStickers": "Emoji eta pegatina propioak", + "@customEmojisAndStickers": {}, + "customEmojisAndStickersBody": "Gehitu edo partekatu edozein txatetan erabil daitezkeen emoji edo pegatina propioak.", + "@customEmojisAndStickersBody": {}, + "hideRedactedMessages": "Ezkutatu atzera botatako mezuak", + "@hideRedactedMessages": {}, + "hideRedactedMessagesBody": "Norbaitek mezuren bat atzera botaz gero, mezua txatetik kenduko da, abisurik gabe.", + "@hideRedactedMessagesBody": {}, + "hideInvalidOrUnknownMessageFormats": "Ezkutatu mezuen formatu ezezagun edo baliogabea", + "@hideInvalidOrUnknownMessageFormats": {}, + "overview": "Ikuspegi orokorra", + "@overview": {}, + "notifyMeFor": "Jakinarazi…", + "@notifyMeFor": {}, + "passwordRecoverySettings": "Pasahitza berreskuratzeko ezarpenak", + "@passwordRecoverySettings": {}, + "hideMemberChangesInPublicChats": "Ezkutatu kideen egoera aldaketak txat publikoetan", + "@hideMemberChangesInPublicChats": {}, + "globalChatId": "Txat ID orokorra", + "@globalChatId": {}, + "calls": "Deiak", + "@calls": {}, + "hideMemberChangesInPublicChatsBody": "Ez erakutsi txataren denbora-lerroan norbait txat publikora batu edo txatetik irteten dela, irakurgaitasuna hobetzeko.", + "@hideMemberChangesInPublicChatsBody": {}, + "noOneCanJoin": "Ezin da inor batu", + "@noOneCanJoin": {}, + "noPublicLinkHasBeenCreatedYet": "Oraindik ez da esteka publikorik sortu", + "@noPublicLinkHasBeenCreatedYet": {}, + "userRole": "Erabiltzailearen rola", + "@userRole": {}, + "minimumPowerLevel": "{level} da gutxieneko botere-maila.", + "@minimumPowerLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "String" + } + } + }, + "publicChatAddresses": "Txataren helbide publikoak", + "@publicChatAddresses": {}, + "createNewAddress": "Sortu helbide berria", + "@createNewAddress": {}, + "files": "Fitxategiak", + "@files": {}, + "gallery": "Galeria", + "@gallery": {}, + "searchIn": "Bilatu {chat} txatean...", + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "searchMore": "Bilatu gehiago...", + "@searchMore": {}, + "restricted": "Mugatuta", + "@restricted": {}, + "knockRestricted": "Eskatu baimena sarrera mugatua duen txatean", + "@knockRestricted": {}, + "swipeRightToLeftToReply": "Herrestatu eskuin-ezker erantzuteko", + "@swipeRightToLeftToReply": {}, + "alwaysUse24HourFormat": "false", + "@alwaysUse24HourFormat": { + "description": "Set to true to always display time of day in 24 hour format." + }, + "noMoreChatsFound": "Ez da beste txatik aurkitu...", + "@noMoreChatsFound": {}, + "unread": "Irakurtzeke", + "@unread": {}, + "space": "Gunea", + "@space": {}, + "joinedChats": "Batu zaren txatak", + "@joinedChats": {}, + "goToSpace": "Joan {space} gunera", + "@goToSpace": { + "type": "String", + "space": {} + }, + "markAsUnread": "Markatu irakurri gabetzat", + "@markAsUnread": {}, + "countChatsAndCountParticipants": "{chats} txat eta {participants} partaide", + "@countChatsAndCountParticipants": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + }, + "participants": { + "type": "int" + } + } + }, + "spaces": "Guneak", + "@spaces": {}, + "adminLevel": "{level} - Administratzailea", + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "changeTheChatPermissions": "Aldatu txataren baimenak", + "@changeTheChatPermissions": {}, + "inviteOtherUsers": "Gonbidatu beste erabiltzaileak txat honetara", + "@inviteOtherUsers": {}, + "userLevel": "{level} - Erabiltzailea", + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "moderatorLevel": "{level} - Moderatzailea", + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "sendRoomNotifications": "Bidali @gela jakinarazpena", + "@sendRoomNotifications": {}, + "changeTheDescriptionOfTheGroup": "Aldatu txataren deskribapena", + "@changeTheDescriptionOfTheGroup": {}, + "changeGeneralChatSettings": "Aldatu txataren ezarpen orokorrak", + "@changeGeneralChatSettings": {}, + "changeTheVisibilityOfChatHistory": "Aldatu txataren historiaren ikusgaitasuna", + "@changeTheVisibilityOfChatHistory": {}, + "changeTheCanonicalRoomAlias": "Aldatu txataren helbide publiko nagusia", + "@changeTheCanonicalRoomAlias": {}, + "invitedBy": "📩 {user}(e)k gonbidatua", + "@invitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "updateInstalled": "🎉 {version} bertsioa instalatu da!", + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "changelog": "Aldaketak", + "@changelog": {}, + "chatPermissionsDescription": "Definitu zer botere-maila behar den txat honetako ekintza jakinetarako. 0, 50 eta 100 botere-mailek erabiltzaileak, moderatzaileak eta administratzaileak ordezkatzen dituzte, baina edozein graduazio posible da.", + "@chatPermissionsDescription": {}, + "sendCanceled": "Bidalketa bertan behera utzi da", + "@sendCanceled": {}, + "noChatsFoundHere": "Ez da txatik aurkitu. Hasi norbaitekin txateatzen beheko botoia erabiliz. ⤵️", + "@noChatsFoundHere": {}, + "homeserverDescription": "Zerbitzariak datuak gordetzen ditu, ePosta hornitzaileek mezuak gordetzen dituzten bezala. Nahi duzun zerbitzaria aukeratu dezakezu eta, hala ere, besteetako edonorekin hitz egin. Ikasi gehiago https://matrix.org webgunean.", + "@homeserverDescription": {}, + "loginWithMatrixId": "Hasi saioa Matrix IDarekin", + "@loginWithMatrixId": {}, + "discoverHomeservers": "Arakatu zerbitzariak", + "@discoverHomeservers": {}, + "whatIsAHomeserver": "Zer da zerbitzari bat?", + "@whatIsAHomeserver": {}, + "doesNotSeemToBeAValidHomeserver": "Ez dirudi zerbitzaria bateragarria denik. Zuzena da URLa?", + "@doesNotSeemToBeAValidHomeserver": {}, + "calculatingFileSize": "Fitxategiaren tamaina kalkulatzen…", + "@calculatingFileSize": {}, + "prepareSendingAttachment": "Eranskinaren bidalketa prestatzen…", + "@prepareSendingAttachment": {}, + "sendingAttachment": "Eranskina bidaltzen…", + "@sendingAttachment": {}, + "compressVideo": "Bideoa konprimatzen…", + "@compressVideo": {}, + "generatingVideoThumbnail": "Bideoaren iruditxoa sortzen…", + "@generatingVideoThumbnail": {}, + "serverLimitReached": "Zerbitzariaren muga gainditu da! Itxaron {seconds} segundo…", + "@serverLimitReached": { + "type": "integer", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "sendingAttachmentCountOfCount": "{index}. eranskina bidaltzen ({length} guztira)…", + "@sendingAttachmentCountOfCount": { + "type": "integer", + "placeholders": { + "index": { + "type": "int" + }, + "length": { + "type": "int" + } + } + }, + "oneOfYourDevicesIsNotVerified": "Zure gailuetako bat ez dago egiaztatuta", + "@oneOfYourDevicesIsNotVerified": {}, + "noticeChatBackupDeviceVerification": "Oharra: gailu guztiak txat-babeskopiarekin konektatzen dituzunean, automatikoki egiaztatzen dira.", + "@noticeChatBackupDeviceVerification": {}, + "opacity": "Opakutasuna:", + "@opacity": {}, + "manageAccount": "Kudeatu kontua", + "@manageAccount": {}, + "setWallpaper": "Ezarri horma-irudia", + "@setWallpaper": {}, + "blur": "Lausotu:", + "@blur": {}, + "continueText": "Jarraitu", + "@continueText": {}, + "welcomeText": "Ieup 👋 Ongi etorri Extera-era. https://matrix.org-rekin bateragarria den edozein zerbitzaritan hasi dezakezu saioa eta edonorekin txateatu. Mezularitza-sare deszentralizatu eraraldoia da!", + "@welcomeText": {}, + "contactServerAdmin": "Jarri harremanetan zerbitzariaren administratzailearekin", + "@contactServerAdmin": {}, + "aboutHomeserver": "{homeserver}(e)ri buruz", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "supportPage": "Laguntza orria", + "@supportPage": {}, + "serverInformation": "Zerbitzariaren informazioa:", + "@serverInformation": {}, + "name": "Izena", + "@name": {}, + "version": "Bertsioa", + "@version": {}, + "website": "Webgunea", + "@website": {}, + "contactServerSecurity": "Jakinarazi segurtasun arazo bat", + "@contactServerSecurity": {}, + "noContactInformationProvided": "Zerbitzariak ez du harremanetarako informaziorik zehaztu", + "@noContactInformationProvided": {}, + "compressBeforeSending": "Konprimatu bidali baino lehen", + "@compressBeforeSending": {}, + "boldText": "Testu lodia", + "@boldText": {}, + "italicText": "Testu etzana", + "@italicText": {}, + "invalidUrl": "URL baliogabea", + "@invalidUrl": {}, + "addLink": "Gehitu esteka", + "@addLink": {}, + "sendUncompressed": "Bidali konprimatu gabe", + "@sendUncompressed": {}, + "strikeThrough": "Zirrimarra", + "@strikeThrough": {}, + "pleaseFillOut": "Bete ezazu", + "@pleaseFillOut": {}, + "unableToJoinChat": "Ezin da txatera batu. Agian besteak elkarrizketa itxiko zuen honezkero.", + "@unableToJoinChat": {}, + "sendImages": "Bidali {count} irudi", + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "compress": "Konprimatu", + "@compress": {}, + "previous": "Aurrekoa", + "@previous": {}, + "otherPartyNotLoggedIn": "Besteak ez du saiorik hasita eta, beraz, ezin du mezurik jaso!", + "@otherPartyNotLoggedIn": {}, + "appWantsToUseForLogin": "Erabili '{server}' saioa hasteko", + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "appWantsToUseForLoginDescription": "Honenbestez, aplikazioak eta webguneak zuri buruzko informazioa partekatzea baimentzen duzu.", + "@appWantsToUseForLoginDescription": {}, + "open": "Ireki", + "@open": {}, + "generalNotificationSettings": "Jakinarazpen orokorren ezarpenak", + "@generalNotificationSettings": {}, + "notificationRuleContainsUserName": "Erabiltzaile-izena dauka", + "@notificationRuleContainsUserName": {}, + "notificationRuleMaster": "Isilarazi jakinarazpen guztiak", + "@notificationRuleMaster": {}, + "userSpecificNotificationSettings": "Erabiltzaile zehatzen jakinarazpenen ezarpenak", + "@userSpecificNotificationSettings": {}, + "more": "Gehiago", + "@more": {}, + "newChatRequest": "📩 Txat-eskaera berria", + "@newChatRequest": {}, + "contentNotificationSettings": "Edukiaren jakinarazpenen ezarpenak", + "@contentNotificationSettings": {}, + "notificationRuleContainsUserNameDescription": "Mezuan erabiltzaile-izena aipatzen denean jakinarazten du.", + "@notificationRuleContainsUserNameDescription": {}, + "notificationRuleMasterDescription": "Gainerako arauak gainidatzi eta jakinarazpenak ezgaitzen ditu.", + "@notificationRuleMasterDescription": {}, + "roomNotificationSettings": "Gelen jakinarazpenen ezarpenak", + "@roomNotificationSettings": {}, + "otherNotificationSettings": "Beste jakinarazpenen ezarpenak", + "@otherNotificationSettings": {}, + "waitingForServer": "Zerbitzariaren zain…", + "@waitingForServer": {}, + "appIntroduction": "FluffyChatek mezularitza-programa desberdinak erabiltzen dituzten lagunekin txateatzea ahalbidetzen dizu. Ikasi gehiago https://matrix.org estekan edo sakatu *Jarraitu*.", + "@appIntroduction": {}, + "synchronizingPleaseWaitCounter": " Sinkronizatzen… (%{percentage})", + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "notificationRuleInviteForMe": "Gonbidapena niretzat", + "@notificationRuleInviteForMe": {}, + "notificationRuleInviteForMeDescription": "Erabiltzailea gela batera gonbidatzen dutenean jakinarazten du.", + "@notificationRuleInviteForMeDescription": {}, + "notificationRuleSuppressNotices": "Ezkutatu mezu automatikoak", + "@notificationRuleSuppressNotices": {}, + "notificationRuleSuppressNoticesDescription": "BOTen eta bestelako bezero automatikoen jakinarazpenak ezkutatzen ditu.", + "@notificationRuleSuppressNoticesDescription": {}, + "notificationRuleMemberEvent": "Kideen gertaera", + "@notificationRuleMemberEvent": {}, + "notificationRuleMemberEventDescription": "Kideen gertaeren jakinarazpenak ezkutatzen ditu.", + "@notificationRuleMemberEventDescription": {}, + "notificationRuleIsUserMention": "Erabiltzailea aipatzea", + "@notificationRuleIsUserMention": {}, + "notificationRuleContainsDisplayName": "Pantaila-izena dauka", + "@notificationRuleContainsDisplayName": {}, + "notificationRuleIsUserMentionDescription": "Erabiltzailea mezu zuzen batean aipatzen dutenean jakinarazten du.", + "@notificationRuleIsUserMentionDescription": {}, + "notificationRuleContainsDisplayNameDescription": "Mezu batek erabiltzailearen pantaila-izena duenean jakinarazten du.", + "@notificationRuleContainsDisplayNameDescription": {}, + "notificationRuleIsRoomMention": "Gelaren aipamena", + "@notificationRuleIsRoomMention": {}, + "notificationRuleIsRoomMentionDescription": "Gela aipatzen denean erabiltzailea jakinarazten du.", + "@notificationRuleIsRoomMentionDescription": {}, + "notificationRuleRoomnotif": "Gelaren jakinarazpena", + "@notificationRuleRoomnotif": {}, + "notificationRuleRoomnotifDescription": "Mezu batek '@room' duenean erabiltzaileari jakinarazten dio.", + "@notificationRuleRoomnotifDescription": {}, + "notificationRuleTombstone": "Hilarria", + "@notificationRuleTombstone": {}, + "notificationRuleReaction": "Erreakzioa", + "@notificationRuleReaction": {}, + "notificationRuleReactionDescription": "Erreakzioen jakinarazpenak ezkutatzen ditu.", + "@notificationRuleReactionDescription": {}, + "notificationRuleTombstoneDescription": "Gela desaktibatzeko mezuei buruz jakinarazten dio erabiltzaileari.", + "@notificationRuleTombstoneDescription": {}, + "notificationRuleRoomServerAcl": "Gelaren zerbitzariaren ACLa", + "@notificationRuleRoomServerAcl": {}, + "notificationRuleSuppressEdits": "Ezkutatu edizioak", + "@notificationRuleSuppressEdits": {}, + "notificationRuleCall": "Deia", + "@notificationRuleCall": {}, + "notificationRuleEncryptedRoomOneToOne": "Zifratutako bien arteko gela", + "@notificationRuleEncryptedRoomOneToOne": {}, + "notificationRuleSuppressEditsDescription": "Editatutako mezuen jakinarazpenak ezkutatzen ditu.", + "@notificationRuleSuppressEditsDescription": {}, + "notificationRuleCallDescription": "Erabiltzaileari deiei buruz jakinarazten dio.", + "@notificationRuleCallDescription": {}, + "notificationRuleEncryptedRoomOneToOneDescription": "Erabiltzailea jakinarazten du zifratutako bien arteko geletako mezuei buruz.", + "@notificationRuleEncryptedRoomOneToOneDescription": {}, + "notificationRuleRoomOneToOne": "Bien arteko gela", + "@notificationRuleRoomOneToOne": {}, + "notificationRuleRoomOneToOneDescription": "Erabiltzailea jakinarazten du bien arteko geletako mezuei buruz.", + "@notificationRuleRoomOneToOneDescription": {}, + "notificationRuleMessage": "Mezua", + "@notificationRuleMessage": {}, + "notificationRuleMessageDescription": "Erabiltzailea jakinarazten du mezu orokorrei buruz.", + "@notificationRuleMessageDescription": {}, + "notificationRuleEncrypted": "Zifratuak", + "@notificationRuleEncrypted": {}, + "notificationRuleEncryptedDescription": "Erabiltzailea jakinarazten du zifratutako geletako mezuei buruz.", + "@notificationRuleEncryptedDescription": {}, + "notificationRuleJitsi": "Jitsi", + "@notificationRuleJitsi": {}, + "notificationRuleJitsiDescription": "Erabiltzailea jakinarazten du Jitsi widgetaren gertaerei buruz.", + "@notificationRuleJitsiDescription": {}, + "notificationRuleServerAcl": "Ezkutatu zerbitzariaren ACL gertaerak", + "@notificationRuleServerAcl": {}, + "notificationRuleServerAclDescription": "Zerbitzariaren ACL gertaerak ezkutatzen ditu.", + "@notificationRuleServerAclDescription": {}, + "unknownPushRule": "Push arau ezezaguna '{rule}'", + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } + } + }, + "deletePushRuleCanNotBeUndone": "Jakinarazpen ezarpen hau ezabatzen baduzu, ezin da desegin.", + "@deletePushRuleCanNotBeUndone": {}, + "shareKeysWith": "Partekatu gakoak…", + "@shareKeysWith": {}, + "allDevices": "Gailu guztiekin", + "@allDevices": {}, + "shareKeysWithDescription": "Zein gailu hartu beharko litzateke fidagarritzat zifratutako txaten mezuak irakur ditzaten?", + "@shareKeysWithDescription": {}, + "crossVerifiedDevicesIfEnabled": "Egiaztapen gurutzatuko gailuekin, gaituta badaude", + "@crossVerifiedDevicesIfEnabled": {}, + "verifiedDevicesOnly": "Egiaztatutako gailuekin soilik", + "@verifiedDevicesOnly": {}, + "crossVerifiedDevices": "Egiaztapen gurutzatuko gailuekin", + "@crossVerifiedDevices": {}, + "takeAPhoto": "Egin argazkia", + "@takeAPhoto": {}, + "recordAVideo": "Grabatu bideoa", + "@recordAVideo": {}, + "optionalMessage": "Mezua (aukerakoa)…", + "@optionalMessage": {}, + "notSupportedOnThisDevice": "Ez da gailu honekin bateragarria", + "@notSupportedOnThisDevice": {} +} diff --git a/assets/l10n/intl_fa.arb b/assets/l10n/intl_fa.arb new file mode 100644 index 0000000..67837a0 --- /dev/null +++ b/assets/l10n/intl_fa.arb @@ -0,0 +1,2519 @@ +{ + "@@last_modified": "2021-08-14 12:41:10.061080", + "repeatPassword": "تکرار رمزعبور", + "@repeatPassword": {}, + "about": "درباره", + "@about": { + "type": "String", + "placeholders": {} + }, + "accept": "پذیرش", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 {username} دعوت را پذیرفت", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "حساب", + "@account": { + "type": "String", + "placeholders": {} + }, + "addToSpace": "به فضا اضافه کنید", + "@addToSpace": {}, + "appLock": "قفل برنامه", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "all": "همه", + "@all": { + "type": "String", + "placeholders": {} + }, + "allChats": "همه گپ‌ها", + "@allChats": { + "type": "String", + "placeholders": {} + }, + "addEmail": "افزودن ایمیل", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "{senderName} پاسخ تماس را داد", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "هرکسی می‌تواند بپیوندد", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "archive": "بایگانی", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "مطمئن هستید؟", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "areYouSureYouWantToLogout": "مطمئن هستید می‌خواهید خارج شوید؟", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐 {username} رمزگذاری سرتاسر را فعال کرد", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "admin": "ادمین", + "@admin": { + "type": "String", + "placeholders": {} + }, + "supposedMxid": "این باید {mxid} باشد", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "botMessages": "پیام‌های روبات", + "@botMessages": { + "type": "String", + "placeholders": {} + }, + "changedTheDisplaynameTo": "{username} نام نمایشی خود را تغییر داد به: «{displayname}»", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "confirmMatrixId": "برای حذف حسابتان، لطفا هویت ماتریکستان را تایید کنید.", + "@confirmMatrixId": {}, + "changeDeviceName": "نام دستگاه را تغییر دهید", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "alias": "نام مستعار", + "@alias": { + "type": "String", + "placeholders": {} + }, + "banFromChat": "از گپ محروم کنید", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "این درخواست تایید را از {username} می‌پذیرید؟", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "areGuestsAllowedToJoin": "آیا کاربران مهمان اجازه پیوستن دارند", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "autoplayImages": "اموجی و برچسب‌های متحرک به طور خودکار پخش شوند", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "sendOnEnter": "ارسال با کلید تعويض سطر", + "@sendOnEnter": {}, + "cancel": "لغو", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "changedTheChatDescriptionTo": "{username} توصیف گپ را تغییر داد به: «{description}»", + "@changedTheChatDescriptionTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "description": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username} اجازه‌های گپ را تغییر داد", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatNameTo": "{username} نام گپ را تغییر داد به: «{chatname}»", + "@changedTheChatNameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "chatname": { + "type": "String" + } + } + }, + "cantOpenUri": "نمی‌توانیم این آدرس اینترنتی را باز کنیم: {uri}", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "banned": "محروم شده", + "@banned": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username} {targetName} را محروم کرد", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "دستگاه را مسدود کنید", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "blocked": "مسدود شده", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "badServerLoginTypesException": "سرور می‌تواند این گونه‌های ورود‮ را پشتیباتی کند:\n{serverVersions}\nولی این برنامه فقط می‌تواند این‌ها را پشتیبانی کند:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "badServerVersionsException": "سرور می‌تواند این نسخه‌های مشخصات را پشتیبانی کند:\n{serverVersions}\nولی این برنامه فقط می‌تواند این‌ها را پشتیبانی کند:\n{supportedVersions}", + "@badServerVersionsException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "changedTheChatAvatar": "{username} تصویر گپ را تغییر داد", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} قوانین دسترسی مهمان را تغییر داد", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} عکس پروفایل خود را تغییر داد", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "chats": "گپ‌ها", + "@chats": { + "type": "String", + "placeholders": {} + }, + "messages": "پیام‌ها", + "@messages": { + "type": "String", + "placeholders": {} + }, + "send": "ارسال", + "@send": { + "type": "String", + "placeholders": {} + }, + "sendAudio": "ارسال صدا", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendOriginal": "ارسال اصل", + "@sendOriginal": { + "type": "String", + "placeholders": {} + }, + "changedTheRoomAliases": "{username} نام‌های مستعار اتاق را تغییر داد", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username} لینک دعوت را تغییر داد", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "close": "بستن", + "@close": { + "type": "String", + "placeholders": {} + }, + "sendImage": "ارسال تصویر", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendMessages": "ارسال پیام‌ها", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "changedTheHistoryVisibility": "{username} قابليت‌ ديدن‌ تاریخچه را تغییر داد", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} قوانین دسترسی مهمان را تغییر داد به: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} قوانین پیوستن را تغییر داد به: {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username} قابليت‌ ديدن‌ تاریخچه را تغییر داد به: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "chooseAStrongPassword": "رمز عبور قوی انتخاب کنید", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "yourChatBackupHasBeenSetUp": "پشتیبان گپ‌تان تنظیم شده است.", + "@yourChatBackupHasBeenSetUp": {}, + "changeTheme": "سبک خود را تغییر دهید", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "نام گروه را تغییر دهید", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "changeYourAvatar": "عکس پروفایل خود را تغییر دهید", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "رمزگذاری مخدوش شده‌ است", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "clearArchive": "بایگانی را پاک کنید", + "@clearArchive": {}, + "commandHint_create": "یک گپ گروهی خالی بسازید\nاز «--no-encryption» برای غیرفعال کردن رمزگذاری استفاده کنید", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "commandHint_dm": "یک گپ مستقیم شروع کنید\nاز «--no-encryption» برای غیرفعال کردن رمزگذاری استفاده کنید", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "sendSticker": "ارسال برچسب", + "@sendSticker": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "ارسال ویدئو", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "sender": "فرستنده", + "@sender": {}, + "changedTheJoinRules": "{username} قوانین پیوستن را تغییر داد", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "chatDetails": "جزئیات گپ", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "commandHint_markasdm": "برای دادن شناسه ماتریکس به عنوان اتاق پیام‌های مستقیم علامت بگذارید", + "@commandHint_markasdm": {}, + "commandHint_markasgroup": "به عنوان گروه علامت بگذارید", + "@commandHint_markasgroup": {}, + "commandHint_clearcache": "حافظه پنھان را پاک کنید", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_discardsession": "طرد نشست", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "groups": "گروه‌ها", + "@groups": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "برای خواندن پیام‌ها، برنامه را باز کنید", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "sendAMessage": "ارسال پیام", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "sentCallInformations": "{senderName} اطلاعات تماس را فرستاد", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "sendAsText": "ارسال به عنوان متن", + "@sendAsText": { + "type": "String" + }, + "sendFile": "ارسال فایل", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "startedACall": "{senderName} تماسی را شروع کرد", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "tryToSendAgain": "تلاش برای ارسال مجدد", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "reactedWith": "{sender} با {reaction} واکنش نشان داد", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "askSSSSSign": "لطفا عبارت عبور یا کلید بازیابی حافظه امن خود را وارد کنید تا بتوانید شخص دیگر را امضا کنید.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "chatHasBeenAddedToThisSpace": "گپ به این فضا اضافه شده است", + "@chatHasBeenAddedToThisSpace": {}, + "chat": "گپ", + "@chat": { + "type": "String", + "placeholders": {} + }, + "chatBackup": "پشتیبان گپ", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "changePassword": "تغییر رمز عبور", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "تغییر سرور خانه", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "separateChatTypes": "گپ‌های مستقیم را از گروه‌ها جدا کنید", + "@separateChatTypes": { + "type": "String", + "placeholders": {} + }, + "sentAPicture": "🖼️ {username} یک عکس فرستاد", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "🎥 {username} یک ویدئو فرستاد", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "commandInvalid": "دستور نامعتبر", + "@commandInvalid": { + "type": "String" + }, + "commandMissing": "{command} یک دستور نیست.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "contactHasBeenInvitedToTheGroup": "مخاطب به گروه دعوت شده است", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "sentAFile": "📁 {username} یک فایل فرستاد", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAnAudio": "🎤 {username} یک صدای ضبط شده فرستاد", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userSentUnknownEvent": "{username} یک رویداد {type} فرستاد", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "weSentYouAnEmail": "یک ایمیل برایتان فرستادیم", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "بارگیری {count} شرکت کنندۀ بیشتر", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "sentASticker": "😊 {username} یک برچسب فرستاد", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "connect": "اتصال", + "@connect": { + "type": "String", + "placeholders": {} + }, + "confirm": "تایید", + "@confirm": { + "type": "String", + "placeholders": {} + }, + "allSpaces": "همه فضاها", + "@allSpaces": {}, + "commandHint_ban": "کاربر مشخص شده را از این اتاق محروم کنید", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_kick": "کاربر مشخص شده را از این اتاق حذف کنید", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_plain": "متن بی‌فرمت بفرستید", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_unban": "محرومیت کاربر مشخص شده را از این اتاق لغو کنید", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "containsDisplayName": "شامل نام نمایشی است", + "@containsDisplayName": { + "type": "String", + "placeholders": {} + }, + "containsUserName": "شامل نام کاربری است", + "@containsUserName": { + "type": "String", + "placeholders": {} + }, + "device": "دستگاه", + "@device": { + "type": "String", + "placeholders": {} + }, + "copy": "کپی", + "@copy": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "درجه اجازۀ پیشفرض", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "delete": "حذف", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "حساب را حذف کنید", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "پیام را حذف کنید", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "commandHint_html": "متن با فرمت HTML بفرستید", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_join": "به اتاق مشخص شده بپیوندید", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_leave": "این اتاق را ترک کنید", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_myroomnick": "نام نمایشی خود را برای این اتاق تنظیم کنید", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "commandHint_myroomavatar": "عکس پروفایل خود را برای این اتاق تنظیم کنید (با mxc-uri)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_op": "درجه اختیار کاربر مشخص شده را تنظیم کنید (پیشفرض: ۵۰)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_react": "پاسخ را به عنوان یک واکنش بفرستید", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "compareEmojiMatch": "لطفا ایموجی‌ها را مقایسه کنید", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "در حافظه کپی کنید", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "countParticipants": "{count} شرکت کننده", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "create": "ایجاد", + "@create": { + "type": "String", + "placeholders": {} + }, + "createNewSpace": "فضای جدید", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "dateWithYear": "{year}-{month}-{day}", + "@dateWithYear": { + "type": "String", + "placeholders": { + "year": { + "type": "String" + }, + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "deviceId": "هویت دستگاه", + "@deviceId": { + "type": "String", + "placeholders": {} + }, + "devices": "دستگاه‌ها", + "@devices": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "نام نمایشی تغییر یافته است", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "بارگیری فایل", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "edit": "ویرایش", + "@edit": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "سرور‌های مسدود را ویرایش کنید", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "editRoomAliases": "نام‌های مستعار اتاق را ویرایش کنید", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "عکس اتاق را ویرایش کنید", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "شکلک از پیش وجود دارد!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteWarnNeedToPick": "باید یک کد کوتاه شکلک و یک تصویر انتخاب کنید!", + "@emoteWarnNeedToPick": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "کد کوتاه شکلک نامعتبر!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "گپ خالی", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "در حافظه کپی شد", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "💬 {username} گپ را ایجاد کرد", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "darkTheme": "تاریک", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "directChats": "گپ‌های مستقیم", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "emotePacks": "بسته‌های شکلک برای اتاق", + "@emotePacks": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "‏تنظیمات شکلک", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "emoteShortcode": "کد کوتاه شکلک", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "commandHint_me": "خود را توصیف کنید", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "commandHint_send": "متن را بفرستید", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "couldNotDecryptMessage": "نتوانستیم پیام را رمزگشایی کنیم: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "chatBackupDescription": "پیام‌های قدیمی‌تان با یک کلید باز یابی، امن می‌شوند. لطفا مطمئن شوید که آن را گم نمی‌کنید.", + "@chatBackupDescription": { + "type": "String", + "placeholders": {} + }, + "deactivateAccountWarning": "این کار حساب کاربری‌تان را غیرفعال خواهد کرد. این عمل قابل جبران و بازگشت نیست! آیا اطمینان دارید؟", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "commandHint_invite": "کاربر مشخص شده را به این اتاق دعوت کنید", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "compareNumbersMatch": "لطفا اعداد را مقایسه کنید", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "configureChat": "گپ را تنظیم کنید", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "dateWithoutYear": "{month}-{day}", + "@dateWithoutYear": { + "type": "String", + "placeholders": { + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "currentlyActive": "اکنون فعال", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date}، {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "editDisplayname": "ویرایش نام نمایشی", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "id": "آی‌دی", + "@id": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{username} دعوت‌نامه {targetName} را پس گرفته است", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "guestsAreForbidden": "مهمان‌ها ممنوع شده‌اند", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "hideRedactedEvents": "پنهان کردن رویدادهای ویرایش شده", + "@hideRedactedEvents": { + "type": "String", + "placeholders": {} + }, + "hideUnknownEvents": "پنهان کردن رویدادهای ناشناخته", + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "محتوا به مدیران سرور گزارش شده است", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "از پیوستن", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "از دعوت", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "goToTheNewRoom": "به اتاق جدید بروید", + "@goToTheNewRoom": { + "type": "String", + "placeholders": {} + }, + "group": "گروه", + "@group": { + "type": "String", + "placeholders": {} + }, + "groupIsPublic": "گروه عمومی است", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "groupWith": "گروه با {displayname}", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "howOffensiveIsThisContent": "این محتوا چه مقدار توهین آمیز است؟", + "@howOffensiveIsThisContent": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "بسته شکلک را به طور سراسری فعال کنید", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "رمزگذاری را فعال کنید", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "شما دیگر قادر به غیرفعال کردن رمزگذاری نخواهید بود. آیا مطمئن هستید؟", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "encrypted": "رمزگذاری شده", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "encryption": "رمزگذاری", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "رمزگذاری فعال نیست", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "enterAnEmailAddress": "یک آدرس رایانامه(ایمیل) وارد کنید", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName} به تماس پایان داد", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "homeserver": "سرور خانه", + "@homeserver": {}, + "enterYourHomeserver": "سرور خانه خود را وارد کنید", + "@enterYourHomeserver": { + "type": "String", + "placeholders": {} + }, + "errorObtainingLocation": "خطا هنگام بدست آوردن مکان: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "everythingReady": "همه‌چیز آماده است!", + "@everythingReady": { + "type": "String", + "placeholders": {} + }, + "extremeOffensive": "به شدت توهین آمیز", + "@extremeOffensive": { + "type": "String", + "placeholders": {} + }, + "fileName": "نام فایل", + "@fileName": { + "type": "String", + "placeholders": {} + }, + "fluffychat": "فلافی‌چت", + "@fluffychat": { + "type": "String", + "placeholders": {} + }, + "fontSize": "اندازه قلم", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "forward": "ارسال", + "@forward": { + "type": "String", + "placeholders": {} + }, + "help": "کمک", + "@help": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "مهمان‌ها می‌توانند بپیوندند", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "ignoredUsers": "کاربران نادیده‌گرفته شده", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "commandHint_googly": "ارسال چند چشم گوگولی", + "@commandHint_googly": {}, + "googlyEyesContent": "{senderName} به شما چشمان گوگولی می‌فرستد", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "ignore": "نادیده‌گرفتن", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "cuddleContent": "{senderName} شما را در آغوش می‌گیرد", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "identity": "هویت", + "@identity": { + "type": "String", + "placeholders": {} + }, + "hugContent": "{senderName} شما را بغل می‌کند", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "commandHint_cuddle": "ارسال آغوش", + "@commandHint_cuddle": {}, + "commandHint_hug": "ارسال بغل", + "@commandHint_hug": {}, + "editBundlesForAccount": "بسته‌های این حساب را ویرایش کنید", + "@editBundlesForAccount": {}, + "logout": "خارج شدن", + "@logout": { + "type": "String", + "placeholders": {} + }, + "mention": "نام‌‌بردن‌", + "@mention": { + "type": "String", + "placeholders": {} + }, + "muteChat": "بی‌صدا کردن گپ", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "newChat": "گپ جدید", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "💬 پیام جدید در فلافی‌چت", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "عدم اتصال به سرور", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "no": "نه", + "@no": { + "type": "String", + "placeholders": {} + }, + "noPasswordRecoveryDescription": "شما هنوز راهی برای بازیابی رمز عبور خود اضافه نکرده‌اید.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "notificationsEnabledForThisAccount": "اعلان‌ها برای این حساب فعال شد", + "@notificationsEnabledForThisAccount": { + "type": "String", + "placeholders": {} + }, + "or": "یا", + "@or": { + "type": "String", + "placeholders": {} + }, + "participant": "شرکت‌کننده", + "@participant": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "عبارت عبور یا کلید بازیابی", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "password": "رمز عبور", + "@password": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "رمز عبور تغییر کرد", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "passwordRecovery": "بازیابی رمز عبور", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "pin": "سنجاق کردن", + "@pin": { + "type": "String", + "placeholders": {} + }, + "play": "پخش {fileName}", + "@play": { + "type": "String", + "placeholders": { + "fileName": { + "type": "String" + } + } + }, + "pleaseEnter4Digits": "لطفا ۴ رقم وارد کنید یا خالی بگذارید تا قفل برنامه غیرفعال شود.", + "@pleaseEnter4Digits": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPin": "لطفا کد خود را وارد کنید", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPassword": "لطفا رمزعبور خود را وارد کنید", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "لطفا دستورالعمل‌های وب‌سایت را دنبال کنید و روی بعدی بزنید.", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "اتاق‌های عمومی", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "obtainingLocation": "به دست آوردن مکان…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "اوه، مشکلی پیش آمد…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "addToBundle": "به بسته نرم‌افزاری اضافه کنید", + "@addToBundle": {}, + "passwordForgotten": "رمز عبور را فراموش کرده‌ام", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterRecoveryKey": "لطفا کلید بازیابی خود را وارد کنید:", + "@pleaseEnterRecoveryKey": {}, + "link": "پیوند", + "@link": {}, + "iHaveClickedOnLink": "من روی پیوند کلیک کردم", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "عبارت عبور یا کلید بازیابی اشتباه است", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "inoffensive": "بی ضرر", + "@inoffensive": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "دعوت از مخاطب به {groupName}", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "invitedUsersOnly": "فقط کاربران دعوت شده", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "inviteForMe": "دعوت برای من", + "@inviteForMe": { + "type": "String", + "placeholders": {} + }, + "isTyping": "در حال نوشتن…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "joinRoom": "پیوستن به اتاق", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "kicked": "👞 {username} {targetName} را بیرون کرد", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickFromChat": "از گفتگو بیرون کردن", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "گپ را ترک کرد", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "dehydrate": "صدور جلسه و پاک کردن دستگاه", + "@dehydrate": {}, + "hydrateTorLong": "آیا آخرین بار جلسه خود را با تور (TOR) صادر کردید؟ به سرعت آن را وارد کنید و به گپ‌زنی ادامه دهید.", + "@hydrateTorLong": {}, + "loadingPleaseWait": "در حال بارگیری... لطفا صبر کنید.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "loadMore": "بارگیری بیشتر…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "locationPermissionDeniedNotice": "مجوز مکان رد شد. برای به اشتراک گذاشتن موقعیت مکانی شما لطفا به آن اجازه دهید.", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "logInTo": "وارد شدن به {homeserver}", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "memberChanges": "تغییرات اعضا", + "@memberChanges": { + "type": "String", + "placeholders": {} + }, + "moderator": "مدیر", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "درخواست تایید جدید!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "noPermission": "بدون اجازه", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "اتاقی پیدا نشد…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "offline": "آفلاین", + "@offline": { + "type": "String", + "placeholders": {} + }, + "online": "آنلاین", + "@online": { + "type": "String", + "placeholders": {} + }, + "oopsPushError": "اوه! متاسفانه هنگام تنظیم اعلان‌ها خطایی روی داد.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "openCamera": "باز کردن دوربین", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "addAccount": "اضافه کردن حساب کاربری", + "@addAccount": {}, + "people": "مردم", + "@people": { + "type": "String", + "placeholders": {} + }, + "pickImage": "یک عکس انتخاب کنید", + "@pickImage": { + "type": "String", + "placeholders": {} + }, + "pleaseChoose": "لطفا انتخاب کنید", + "@pleaseChoose": { + "type": "String", + "placeholders": {} + }, + "pleaseChooseAPasscode": "لطفا یک کد عبور انتخاب کنید", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "لطفا نام‌کاربری خود را وارد کنید", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "privacy": "حریم خصوصی", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "license": "پروانه", + "@license": { + "type": "String", + "placeholders": {} + }, + "numUsersTyping": "{count} کاربر در حال نوشتن…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "invited": "دعوت شده", + "@invited": { + "type": "String", + "placeholders": {} + }, + "invitedUser": "📩 {username} از {targetName} دعوت کرد", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "joinedTheChat": "👋 {username} به گپ پیوست", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "kickedAndBanned": "🙅 {username} {targetName} را بیرون و محروم کرد", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "dehydrateWarning": "این عمل قابل لغو نیست. مطمئن شوید که فایل پشتیبان را به صورت امن ذخیره می کنید.", + "@dehydrateWarning": {}, + "locationDisabledNotice": "خدمات مکان غیرفعال است. لطفا آن را فعال کنید تا بتوانید موقعیت مکانی خود را به اشتراک بگذارید.", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "dehydrateTorLong": "برای کاربران تور (TOR)، توصیه می شود قبل از بستن پنجره، جلسه را صادر کنند.", + "@dehydrateTorLong": {}, + "needPantalaimonWarning": "لطفا توجه داشته باشید که در حال حاضر برای استفاده از رمزگذاری انتها به انتها به Pantalaimon نیاز دارید.", + "@needPantalaimonWarning": { + "type": "String", + "placeholders": {} + }, + "next": "بعدی", + "@next": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "هیچ شکلکی پیدا نشد. 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "به نظر می رسد که شما سرویس‌های گوگل را در گوشی خود ندارید. این تصمیم خوبی برای حفظ حریم خصوصی شماست! برای دریافت اعلان‌ها در فلافی‌چت توصیه می‌کنیم ازhttps://ntfy.sh استفاده کنید. با ntfy یا یک ارائه دهنده UnifiedPush می توانید اعلان‌های فشار را به روش داده امن دریافت کنید. می توانید ntfy را از پلی استور یا از اف‌دروید بارگیری کنید.", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "فقط زمانی می‌توانید رمزگذاری را فعال کنید که اتاق، دیگر در دسترس عموم نباشد.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "پشتیبان‌گیری آنلاین از کلید فعال است", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "enableMultiAccounts": "(آزمایشی) چند حساب را در این دستگاه فعال کنید", + "@enableMultiAccounts": {}, + "pleaseClickOnLink": "لطفا روی لینک موجود در رایانامه(ایمیل) کلیک کنید و سپس ادامه دهید.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "hydrateTor": "کاربران تور (TOR): صادرات جلسه را وارد کنید", + "@hydrateTor": {}, + "hydrate": "بازیابی از فایل پشتیبان", + "@hydrate": {}, + "inviteContact": "دعوت از مخاطب", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "noMatrixServer": "{server1} سرور ماتریکس نیست، به جای آن از {server2} استفاده شود؟", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "openVideoCamera": "بازکردن دوربین برای فیلم‌برداری", + "@openVideoCamera": { + "type": "String", + "placeholders": {} + }, + "oneClientLoggedOut": "یکی از کلاینت(برنامه)های شما از سیستم خارج شده است", + "@oneClientLoggedOut": {}, + "removeFromBundle": "از این بسته حذف کنید", + "@removeFromBundle": {}, + "bundleName": "اسم بسته", + "@bundleName": {}, + "openInMaps": "باز کردن در نقشه", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "serverRequiresEmail": "برای ثبت‌نام، این سرور باید آدرس ایمیل شما را تایید کند.", + "@serverRequiresEmail": {}, + "inviteText": "{username} شما را به فلافی‌چت دعوت کرد.\n۱. به fluffychat.im مراجعه کرده و کاره را نصب کنید\n۲. ثبت نام کنید یا وارد شوید.\n۳. لینک دعوت را باز کنید:\n {link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "leave": "ترک کردن", + "@leave": { + "type": "String", + "placeholders": {} + }, + "none": "هیچ‌کدام", + "@none": { + "type": "String", + "placeholders": {} + }, + "offensive": "توهین آمیز", + "@offensive": { + "type": "String", + "placeholders": {} + }, + "scanQrCode": "کد QR را اسکن کنید", + "@scanQrCode": {}, + "lastActiveAgo": "آخرین فعالیت: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "lightTheme": "روشن", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "dehydrateTor": "کاربران تور (TOR): صدور جلسه", + "@dehydrateTor": {}, + "login": "وارد شدن", + "@login": { + "type": "String", + "placeholders": {} + }, + "notifications": "اعلان‌ها", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "ok": "تایید", + "@ok": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "اتاق ارتقا پیدا کرد", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "register": "ثبت نام", + "@register": { + "type": "String", + "placeholders": {} + }, + "reject": "رد کردن", + "@reject": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "{username} دعوت را رد کرد", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "rejoin": "دوباره پیوستن", + "@rejoin": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "لغو محرومیت از گپ", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "reply": "پاسخ", + "@reply": { + "type": "String", + "placeholders": {} + }, + "requestPermission": "درخواست اجازه", + "@requestPermission": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "نسخه اتاق", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "search": "جستجو", + "@search": { + "type": "String", + "placeholders": {} + }, + "security": "امنیت", + "@security": { + "type": "String", + "placeholders": {} + }, + "seenByUser": "دیده شده توسط {username}", + "@seenByUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "setAsCanonicalAlias": "به عنوان نام مستعار اصلی تنظیم کنید", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "removeYourAvatar": "آواتار(عکس حساب) خود را حذف کنید", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "recording": "در حال ضبط", + "@recording": { + "type": "String", + "placeholders": {} + }, + "redactedAnEvent": "{username} یک رویداد را ویرایش کرد", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "remove": "حذف کردن", + "@remove": { + "type": "String", + "placeholders": {} + }, + "removeAllOtherDevices": "حذف تمام دستگاه‌های دیگر", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "removedBy": "حذف شده توسط {username}", + "@removedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "removeDevice": "حذف دستگاه", + "@removeDevice": { + "type": "String", + "placeholders": {} + }, + "renderRichContent": "تبدیل و نمایش محتوای پیام به صورت کامل", + "@renderRichContent": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "گزارش دادن پیام", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "saveFile": "ذخیره فایل", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "recoveryKey": "کلید بازیابی", + "@recoveryKey": {}, + "setInvitationLink": "تنظیم پیوند دعوت", + "@setInvitationLink": { + "type": "String", + "placeholders": {} + }, + "pushRules": "قواعد دریافت اعلان", + "@pushRules": { + "type": "String", + "placeholders": {} + }, + "reason": "دلیل", + "@reason": { + "type": "String", + "placeholders": {} + }, + "setCustomEmotes": "شکلک سفارشی را تنظیم کنید", + "@setCustomEmotes": { + "type": "String", + "placeholders": {} + }, + "redactMessage": "ویرایش پیام", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "replaceRoomWithNewerVersion": "اتاق را با نسخه جدیدتر جایگزین کنید", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "recoveryKeyLost": "کلید بازیابی را گم کردید؟", + "@recoveryKeyLost": {}, + "fileHasBeenSavedAt": "فایل در {path} ذخیره شده است", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "enterSpace": "ورود به فضا", + "@enterSpace": {}, + "wasDirectChatDisplayName": "گپ خالی ({oldDisplayName} بود)", + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "newSpaceDescription": "فضاها به شما امکان می‌دهند گپ‌های خود را یکپارچه کنید و جوامع خصوصی یا عمومی بسازید.", + "@newSpaceDescription": {}, + "encryptThisChat": "این گپ را رمزگذاری کنید", + "@encryptThisChat": {}, + "sorryThatsNotPossible": "متاسفم... این امکان‌پذیر نیست", + "@sorryThatsNotPossible": {}, + "deviceKeys": "کلیدهای دستگاه:", + "@deviceKeys": {}, + "fileIsTooBigForServer": "سرور گزارش می‌دهد که فایل برای ارسال بسیار بزرگ است.", + "@fileIsTooBigForServer": {}, + "jumpToLastReadMessage": "پرش به آخرین پیام خوانده شده", + "@jumpToLastReadMessage": {}, + "hideUnimportantStateEvents": "رویدادهای غیر مهم مربوط به وضعیت را پنهان کنید", + "@hideUnimportantStateEvents": {}, + "doNotShowAgain": "دوباره نشان نده", + "@doNotShowAgain": {}, + "readUpToHere": "تا اینجا خوانده شده", + "@readUpToHere": {}, + "noBackupWarning": "هشدار! بدون فعال کردن پشتیبان گپ، دسترسی به پیام های رمزگذاری شده خود را از دست خواهید داد. قویا توصیه می‌شود قبل از خروج از سیستم، ابتدا پشتیبان‌گیری گپ را فعال کنید.", + "@noBackupWarning": {}, + "noOtherDevicesFound": "دستگاه دیگری پیدا نشد", + "@noOtherDevicesFound": {}, + "countFiles": "{count} فایل", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "callingAccountDetails": "به فلافی‌چت اجازه می‌دهد تا از برنامه شماره‌گیر بومی اندروید استفاده کند.", + "@callingAccountDetails": {}, + "noKeyForThisMessage": "اگر پیام قبل از ورود به حسابتان در این دستگاه ارسال شده باشد، ممکن است این اتفاق بیفتد.\n\nهمچنین ممکن است فرستنده، دستگاه شما را مسدود کرده باشد یا مشکلی در اتصال اینترنت رخ داده باشد.\n\nآیا می توانید پیام را در نشست دیگری بخوانید؟ بنابراین می توانید پیام را از آن منتقل کنید! به تنظیمات > دستگاه‌ها بروید و مطمئن شوید که دستگاه های شما یکدیگر را تایید کرده‌اند. هنگامی که دفعه بعد اتاق را باز می‌کنید و هر دو جلسه در پیش‌زمینه هستند، کلیدها به طور خودکار منتقل می‌شوند.\n\nآیا نمی‌خواهید هنگام خروج از سیستم یا تعویض دستگاه، کلیدها را گم کنید؟ مطمئن شوید که پشتیبان گپ را در تنظیمات فعال کرده‌اید.", + "@noKeyForThisMessage": {}, + "numChats": "{number} گپ", + "@numChats": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "disableEncryptionWarning": "به دلایل امنیتی نمی‌توانید رمزگذاری را در گپ غیرفعال کنید، در حالی که از قبل فعال شده است.", + "@disableEncryptionWarning": {}, + "enterRoom": "ورود به اتاق", + "@enterRoom": {}, + "newGroup": "گروه جدید", + "@newGroup": {}, + "foregroundServiceRunning": "این اعلان زمانی وقتی ظاهر می شود که سرویس پیش‌زمینه در حال اجرا است.", + "@foregroundServiceRunning": {}, + "appearOnTopDetails": "به برنامه اجازه می‌دهد در بالا ظاهر شود (اگر قبلا فلافی‌‌چت را به عنوان حساب تماس تنظیم کرده‌اید، لازم نیست)", + "@appearOnTopDetails": {}, + "storeSecurlyOnThisDevice": "به طور ایمن در دستگاه ذخیره کنید", + "@storeSecurlyOnThisDevice": {}, + "screenSharingDetail": "شما در حال به اشتراک‌گذاری صفحه‌نمایش خود در فلافی‌چت هستید", + "@screenSharingDetail": {}, + "newSpace": "فضای جدید", + "@newSpace": {}, + "saveKeyManuallyDescription": "این کلید را به صورت دستی با فعال کردن گفتگوی اشتراک گذاری سیستم یا کلیپ بورد ذخیره کنید.", + "@saveKeyManuallyDescription": {}, + "storeInAndroidKeystore": "در Android KeyStore ذخیره کنید", + "@storeInAndroidKeystore": {}, + "storeInAppleKeyChain": "در Apple KeyChain ذخیره کنید", + "@storeInAppleKeyChain": {}, + "user": "کاربر", + "@user": {}, + "custom": "سفارشی", + "@custom": {}, + "screenSharingTitle": "اشتراک گذاری صفحه نمایش", + "@screenSharingTitle": {}, + "callingPermissions": "اجازه‌های تماس", + "@callingPermissions": {}, + "callingAccount": "حساب تماس", + "@callingAccount": {}, + "appearOnTop": "در بالا ظاهر شود", + "@appearOnTop": {}, + "otherCallingPermissions": "میکروفون، دوربین و سایر مجوزهای فلافی‌چت", + "@otherCallingPermissions": {}, + "whyIsThisMessageEncrypted": "چرا این پیام قابل خواندن نیست؟", + "@whyIsThisMessageEncrypted": {}, + "reopenChat": "گپ را دوباره باز کنید", + "@reopenChat": {}, + "unmuteChat": "بازکردن صدای گپ", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "nextAccount": "حساب بعدی", + "@nextAccount": {}, + "unlockOldMessages": "گشودن قفل پیام‌های قدیمی", + "@unlockOldMessages": {}, + "share": "اشتراک‌گذاری", + "@share": { + "type": "String", + "placeholders": {} + }, + "skip": "رد شدن", + "@skip": { + "type": "String", + "placeholders": {} + }, + "systemTheme": "سیستم", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "با هم منطبق نیستند", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "toggleFavorite": "تغییر حالت محبوبیت", + "@toggleFavorite": { + "type": "String", + "placeholders": {} + }, + "toggleMuted": "تغییر حالت بی‌صدا", + "@toggleMuted": { + "type": "String", + "placeholders": {} + }, + "toggleUnread": "علامت‌گذاشتن به عنوان خوانده‌شده/خوانده‌نشده", + "@toggleUnread": { + "type": "String", + "placeholders": {} + }, + "unavailable": "خارج از دسترس", + "@unavailable": { + "type": "String", + "placeholders": {} + }, + "unblockDevice": "برداشتن مسدود بودن دستگاه", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "verifyStart": "شروع بازبینی و تایید", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "بازبینی و تایید با موفقیت انجام شد!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "در انتظار پذیرفتن شکلک از جانب فرد دیگر…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "wallpaper": "کاغذدیواری:", + "@wallpaper": { + "type": "String", + "placeholders": {} + }, + "whoCanPerformWhichAction": "چه کسی توان انجام کدام عمل را داراست", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "نوشتن پیام…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "widgetVideo": "ویدئو", + "@widgetVideo": {}, + "youHaveBeenBannedFromThisChat": "شما از این گپ محروم شده‌اید", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "setPermissionsLevel": "تنظیم درجه اجازه‌ها", + "@setPermissionsLevel": { + "type": "String", + "placeholders": {} + }, + "setStatus": "تنظیم وضعیت", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "settings": "تنظیمات", + "@settings": { + "type": "String", + "placeholders": {} + }, + "showPassword": "نمایش رمز عبور", + "@showPassword": { + "type": "String", + "placeholders": {} + }, + "singlesignon": "شناسایی یگانه(Single Sign on)", + "@singlesignon": { + "type": "String", + "placeholders": {} + }, + "spaceName": "نام فضا", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "startFirstChat": "اولین گپ خود را شروع کنید", + "@startFirstChat": {}, + "theyMatch": "با هم منطبق هستند", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "title": "فلافی‌چت", + "@title": { + "description": "Title for the application", + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "تعداد درخواست‌های بیش از حد. لطفا بعدا دوباره امتحان کنید!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username} محرومیت {targetName} را برداشت", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "unknownEncryptionAlgorithm": "الگوریتم رمزگذاری ناشناخته", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unpin": "برداشتن سنجاق", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "userAndUserAreTyping": "{username} و {username2} در حال تایپ کردن…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "videoCall": "تماس تصویری", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "قابل رویت برای تمام شرکت‌کنندگان", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "قابل رویت برای همه", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "پیام صوتی", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "در انتظار پذیرفتن درخواست از جانب فرد دیگر…", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "warning": "هشدار!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "شما دیگر در این گپ شرکت نمی‌کنید", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "messageInfo": "اطلاعات پیام", + "@messageInfo": {}, + "time": "زمان", + "@time": {}, + "messageType": "نوع پیام", + "@messageType": {}, + "addToSpaceDescription": "فضایی برای افزودن این گپ به آن انتخاب کنید.", + "@addToSpaceDescription": {}, + "start": "شروع", + "@start": {}, + "videoWithSize": "ویدئو ({size})", + "@videoWithSize": { + "type": "String", + "placeholders": { + "size": { + "type": "String" + } + } + }, + "userIsTyping": "{username} در حال تایپ کردن…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "username": "نام‌کاربری", + "@username": { + "type": "String", + "placeholders": {} + }, + "yes": "بله", + "@yes": { + "type": "String", + "placeholders": {} + }, + "yourPublicKey": "کلید عمومی شما", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "publish": "انتشار", + "@publish": {}, + "shareLocation": "اشتراک‌گذاری وضعیت مکانی", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "youInvitedUser": "📩 شما {user} را دعوت کردید", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "unverified": "تاییدنشده", + "@unverified": {}, + "verify": "بازبینی و تایید", + "@verify": { + "type": "String", + "placeholders": {} + }, + "openChat": "بازکردن گپ", + "@openChat": {}, + "dismiss": "رد كردن‌", + "@dismiss": {}, + "unsupportedAndroidVersion": "نسخه اندروید پشتیبانی نشده", + "@unsupportedAndroidVersion": {}, + "youUnbannedUser": "شما محرومیت {user} را برداشتید", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "verified": "تاییدشده", + "@verified": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "چرا می‌خواهید گزارش دهید؟", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "you": "شما", + "@you": { + "type": "String", + "placeholders": {} + }, + "widgetJitsi": "جیتسی‌میت(Jitsi Meet)", + "@widgetJitsi": {}, + "sourceCode": "کد منبع", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "spaceIsPublic": "فضا عمومی است", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWait": "در حال همگام‌سازی... لطفا صبر کنید.", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "unknownEvent": "رویداد ناشناخته «{type}»", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "userAndOthersAreTyping": "{username} و {count} نفر دیگر در حال تایپ کردن…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "userLeftTheChat": "🚪{username} گپ را ترک کرد", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "verifyTitle": "در حال تایید حساب دیگر", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "قابلیت دیدن تاریخچه گپ", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "چه کسی اجازه پیوستن به این گروه را دارد", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "در انتظار پذیرفتن اعداد از جانب فرد دیگر…", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "wipeChatBackup": "برای ایجاد کلید بازیابی جدید، پشتیبان گپ خود را پاک می‌کنید؟", + "@wipeChatBackup": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "با این آدرس‌ها می‌توانید رمز خود را بازیابی کنید.", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "openGallery": "بازکردن گالری", + "@openGallery": {}, + "removeFromSpace": "حذف از فضا", + "@removeFromSpace": {}, + "pleaseEnterRecoveryKeyDescription": "برای گشودن قفل پیام‌های قدیمیتان، لطفا کلید بازیابی‌ای که در یک نشست پیشین تولید شده را وارد کنید. کلید بازیابی شما، رمز عبور شما نیست.", + "@pleaseEnterRecoveryKeyDescription": {}, + "confirmEventUnpin": "آیا از برداشتن سنجاق رویداد به صورت دائمی مطمئن هستید؟", + "@confirmEventUnpin": {}, + "indexedDbErrorLong": "متاسفانه فضای ذخیره‌سازی پیام‌ها، به صورت پیش‌فرض در حالت خصوصی فعال نیست.\nلطفا آدرس زیر را باز کنید:\nabout:config\nمقدار «dom.indexedDB.privateBrowsing.enabled» را به «true» تغییر دهید\nدر غیر این صورت، امکان اجرای فلافی‌چت وجود ندارد.", + "@indexedDbErrorLong": {}, + "widgetEtherpad": "یادداشت متنی", + "@widgetEtherpad": {}, + "youKickedAndBanned": "🙅 شما {user} را بیرون و محروم کردید", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "statusExampleMessage": "امروز حالتان چطور است؟", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "submit": "ارسال", + "@submit": { + "type": "String", + "placeholders": {} + }, + "youRejectedTheInvitation": "شما دعوت را رد کردید", + "@youRejectedTheInvitation": {}, + "youAcceptedTheInvitation": "👍 شما دعوت را پذیرفتید", + "@youAcceptedTheInvitation": {}, + "emailOrUsername": "رایانامه(ایمیل) یا نام کاربری", + "@emailOrUsername": {}, + "transferFromAnotherDevice": "انتقال از دستگاهی دیگر", + "@transferFromAnotherDevice": { + "type": "String", + "placeholders": {} + }, + "videoCallsBetaWarning": "لطفا توجه داشته باشید که تماس‌های تصویری در حال حاضر آزمایشی هستند. ممکن است طبق انتظار کار نکنند یا روی همه پلتفرم‌ها اصلا کار نکنند.", + "@videoCallsBetaWarning": {}, + "experimentalVideoCalls": "تماس‌های تصویری آزمایشی", + "@experimentalVideoCalls": {}, + "placeCall": "برقراری تماس", + "@placeCall": {}, + "unsupportedAndroidVersionLong": "این ویژگی به نسخه تازه‌تری از اندروید نیاز دارد. لطفا به‌روزرسانی یا پشتیبانی لینیج‌اواس(LineageOS) را بررسی کنید.", + "@unsupportedAndroidVersionLong": {}, + "sharedTheLocation": "{username} وضعیت مکانی خود را به اشتراک گذاشت", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "unreadChats": "{unreadCount, plural, other{{unreadCount} گپ خوانده نشده}}", + "@unreadChats": { + "type": "String", + "placeholders": { + "unreadCount": { + "type": "int" + } + } + }, + "status": "وضعیت", + "@status": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "دستگاه ناشناس", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "markAsRead": "علامت‌گذاشتن به عنوان خوانده شده", + "@markAsRead": {}, + "reportUser": "گزارش دادن کاربر", + "@reportUser": {}, + "pinMessage": "سنجاق کردن به اتاق", + "@pinMessage": {}, + "emojis": "شکلک‌ها", + "@emojis": {}, + "voiceCall": "تماس صوتی", + "@voiceCall": {}, + "indexedDbErrorTitle": "اشکالات حالت خصوصی", + "@indexedDbErrorTitle": {}, + "switchToAccount": "تغییر به حساب {number}", + "@switchToAccount": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "previousAccount": "حساب قبلی", + "@previousAccount": {}, + "addWidget": "افزودن ویجت", + "@addWidget": {}, + "widgetCustom": "سفارشی", + "@widgetCustom": {}, + "widgetName": "نام", + "@widgetName": {}, + "widgetUrlError": "این آدرس وب معتبر نیست.", + "@widgetUrlError": {}, + "widgetNameError": "لطفا یک نام نمایشی مشخص کنید.", + "@widgetNameError": {}, + "errorAddingWidget": "بروز خطا هنگام افزودن ویجت.", + "@errorAddingWidget": {}, + "youJoinedTheChat": "شما به گپ پیوستید", + "@youJoinedTheChat": {}, + "youBannedUser": "شما {user} را محروم کردید", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youHaveWithdrawnTheInvitationFor": "شما دعوت {user} را پس‌گرفتید", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedBy": "📩 شما توسط {user} دعوت شده‌اید", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKicked": "👞 شما {user} را بیرون کردید", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "users": "کاربرها", + "@users": {}, + "storeInSecureStorageDescription": "کلید بازیابی را در محل ذخیره‌سازی امن این دستگاه ذخیره کنید.", + "@storeInSecureStorageDescription": {}, + "jump": "پرش", + "@jump": {}, + "allRooms": "تمام چت‌های گروهی", + "@allRooms": { + "type": "String", + "placeholders": {} + }, + "report": "گزارش", + "@report": {}, + "openLinkInBrowser": "بازکردن پیوند در مرورگر", + "@openLinkInBrowser": {}, + "reportErrorDescription": "اوه نه. اشتباهی رخ داد. اگر تمایل دارید، می‌توانید این اشکال را با توسعه‌دهندگان گزارش دهید.", + "@reportErrorDescription": {}, + "signInWithPassword": "ورود با رمزعبور", + "@signInWithPassword": {}, + "pleaseTryAgainLaterOrChooseDifferentServer": "لطفا بعدا تلاش کنید یا سرور دیگری انتخاب کنید.", + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "notAnImage": "یک فایل تصویری نیست.", + "@notAnImage": {} +} diff --git a/assets/l10n/intl_fi.arb b/assets/l10n/intl_fi.arb new file mode 100644 index 0000000..cdd3a32 --- /dev/null +++ b/assets/l10n/intl_fi.arb @@ -0,0 +1,2640 @@ +{ + "repeatPassword": "Salasana uudelleen", + "@repeatPassword": {}, + "about": "Tietoa FluffyChatista", + "@about": { + "type": "String", + "placeholders": {} + }, + "accept": "Hyväksy", + "@accept": { + "type": "String", + "placeholders": {} + }, + "account": "Tili", + "@account": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "{username} hyväksyi kutsun", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "activatedEndToEndEncryption": "🔐 {username} otti käyttöön päästä-päähän salauksen", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "archive": "Arkisto", + "@archive": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "Voidaksesi allekirjoittaa toisen henkilön, syötä turvavaraston salalause tai palautusavain.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "addEmail": "Lisää sähköpostiosoite", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "addToSpace": "Lisää tilaan", + "@addToSpace": {}, + "admin": "Ylläpitäjä", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "alias", + "@alias": { + "type": "String", + "placeholders": {} + }, + "all": "Kaikki", + "@all": { + "type": "String", + "placeholders": {} + }, + "allChats": "Kaikki keskustelut", + "@allChats": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "{senderName} vastasi puheluun", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "Kuka tahansa voi liittyä", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "appLock": "Sovelluksen lukitus", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "Sallitaanko vieraiden liittyminen", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSureYouWantToLogout": "Haluatko varmasti kirjautua ulos?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "Oletko varma?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "autoplayImages": "Toista animoidut tarrat ja emojit automaattisesti", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "askVerificationRequest": "Hyväksytäänkö tämä varmennuspyyntö käyttäjältä {username}?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sendOnEnter": "Lähetä painamalla rivinvaihtonäppäintä", + "@sendOnEnter": {}, + "badServerVersionsException": "Kotipalvelin tukee Matrix Spec versio(it)a:\n{serverVersions}, mutta tämä sovellus tukee vain versio(it)a {supportedVersions}", + "@badServerVersionsException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "badServerLoginTypesException": "Tämä kotipalvelin tukee sisäänkirjautumistapoja: \n{serverVersions},\nmutta tämä sovellus tukee vain -tapoja: \n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "banFromChat": "Anna porttikielto keskusteluun", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "Porttikiellossa", + "@banned": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username} antoi porttikiellon käyttäjälle {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "Estä laite", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "blocked": "Estetty", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "botMessages": "Bottien lähettämät viestit", + "@botMessages": { + "type": "String", + "placeholders": {} + }, + "cancel": "Peruuta", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "changeDeviceName": "Vaihda laitteen nimeä", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "{username} muutti keskustelun kuvaa", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatNameTo": "{username} asetti keskustelun nimeksi: '{chatname}'", + "@changedTheChatNameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "chatname": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username} asetti näyttönimekseen: '{displayname}'", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} muutti vieraspääsyn sääntöjä", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} asetti vieraspääsyn säännö(i)ksi: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username} muutti historian näkyvyyttä", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username} asetti historian näkymissäännöksi: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username} muutti liittymissääntöjä", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} asetti liittymissäännöiksi: {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} vaihtoi profiilikuvaansa", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username} muutti kutsulinkkiä", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changePassword": "Vaihda salasana", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changedTheRoomAliases": "{username} muutti huoneen aliaksia", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "cantOpenUri": "URI-osoitetta {uri} ei voida avata", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "changedTheChatDescriptionTo": "{username} asetti keskustelun kuvaukseksi: '{description}'", + "@changedTheChatDescriptionTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "description": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username} muutti keskustelun oikeuksia", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changeTheme": "Vaihda tyyliäsi", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "yourChatBackupHasBeenSetUp": "Keskustelujesi varmuuskopiointi on asetettu.", + "@yourChatBackupHasBeenSetUp": {}, + "chatBackup": "Keskustelun varmuuskopiointi", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "chatBackupDescription": "Vanhat viestisi on suojattu palautusavaimella. Varmistathan ettet hävitä sitä.", + "@chatBackupDescription": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Keskustelun tiedot", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chatHasBeenAddedToThisSpace": "Keskustelu on lisätty tähän tilaan", + "@chatHasBeenAddedToThisSpace": {}, + "chats": "Keskustelut", + "@chats": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "Valitse vahva salasana", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "close": "Sulje", + "@close": { + "type": "String", + "placeholders": {} + }, + "commandHint_html": "Lähetä HTML-muotoiltua tekstiä", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_ban": "Anna syötetylle käyttäjälle porttikielto tähän huoneeseen", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_invite": "Kutsu syötetty käyttäjä tähän huoneeseen", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "commandHint_leave": "Poistu tästä huoneesta", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_myroomavatar": "Aseta profiilikuvasi tähän huoneeseen (syöttämällä mxc-uri)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_myroomnick": "Aseta näyttönimesi vain tässä huoneessa", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "commandHint_op": "Aseta käyttäjän voimataso (oletus: 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_plain": "Lähetä muotoilematonta tekstiä", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_react": "Lähetä vastaus reaktiona", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "create": "Luo", + "@create": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "{username} loi keskustelun", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "createNewSpace": "Uusi tila", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "currentlyActive": "Aktiivinen nyt", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "dateWithoutYear": "{day}.{month}", + "@dateWithoutYear": { + "type": "String", + "placeholders": { + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "dateWithYear": "{day}.{month}.{year}", + "@dateWithYear": { + "type": "String", + "placeholders": { + "year": { + "type": "String" + }, + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "deactivateAccountWarning": "Tämä poistaa tunnuksesi käytöstä. Tätä ei voi kumota! Oletko varma?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "Uusien käyttäjien oikeuksien oletustaso", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "delete": "Poista", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "Poista tunnus", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "Poista viesti", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "device": "Laite", + "@device": { + "type": "String", + "placeholders": {} + }, + "deviceId": "Laite-ID", + "@deviceId": { + "type": "String", + "placeholders": {} + }, + "devices": "Laitteet", + "@devices": { + "type": "String", + "placeholders": {} + }, + "directChats": "Suorat keskustelut", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "Näyttönimi on vaihdettu", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "Lataa tiedosto", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "edit": "Muokkaa", + "@edit": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "Muokkaa estettyjä palvelimia", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "editDisplayname": "Muokkaa näyttönimeä", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "editRoomAliases": "Muokkaa huoneen aliaksia", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "Muokkaa huoneen profiilikuvaa", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "Emote on jo olemassa!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "Epäkelpo emote-lyhytkoodi", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emotePacks": "Huoneen emote-paketit", + "@emotePacks": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "Emote-asetukset", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "emoteShortcode": "Emote-lyhytkoodi", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emoteWarnNeedToPick": "Emote-lyhytkoodi ja kuva on valittava!", + "@emoteWarnNeedToPick": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "Tyhjä keskustelu", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "Et voi poistaa salausta myöhemmin. Oletko varma?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "Salaus ei ole käytössä", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName} päätti puhelun", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "enterAnEmailAddress": "Syötä sähköposti-osoite", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "homeserver": "Kotipalvelin", + "@homeserver": {}, + "enterYourHomeserver": "Syötä kotipalvelimesi", + "@enterYourHomeserver": { + "type": "String", + "placeholders": {} + }, + "errorObtainingLocation": "Virhe paikannuksessa: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "everythingReady": "Kaikki on valmista!", + "@everythingReady": { + "type": "String", + "placeholders": {} + }, + "extremeOffensive": "Erittäin loukkaavaa", + "@extremeOffensive": { + "type": "String", + "placeholders": {} + }, + "fileName": "Tiedostonimi", + "@fileName": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "Alkaen liittymisestä", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "Alkaen kutsumisesta", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "goToTheNewRoom": "Mene uuteen huoneeseen", + "@goToTheNewRoom": { + "type": "String", + "placeholders": {} + }, + "group": "Ryhmä", + "@group": { + "type": "String", + "placeholders": {} + }, + "groupIsPublic": "Ryhmä on julkinen", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "groups": "Ryhmät", + "@groups": { + "type": "String", + "placeholders": {} + }, + "groupWith": "Ryhmä seuralaisina {displayname}", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "guestsAreForbidden": "Vieraat on kielletty", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "Vieraat voivat liittyä", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{username} on perunnut käyttäjän {targetName} kutsun", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "help": "Apua", + "@help": { + "type": "String", + "placeholders": {} + }, + "hideRedactedEvents": "Piilota poistetut tapahtumat", + "@hideRedactedEvents": { + "type": "String", + "placeholders": {} + }, + "hideUnknownEvents": "Piilota tuntemattomat tapahtumat", + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "howOffensiveIsThisContent": "Kuinka loukkaavaa tämä sisältö on?", + "@howOffensiveIsThisContent": { + "type": "String", + "placeholders": {} + }, + "id": "ID", + "@id": { + "type": "String", + "placeholders": {} + }, + "identity": "Identiteetti", + "@identity": { + "type": "String", + "placeholders": {} + }, + "ignore": "Jätä huomioitta", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "ignoredUsers": "Huomiotta jätetyt käyttäjät", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "Kutsu yhteystieto", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "invited": "Kutsuttu", + "@invited": { + "type": "String", + "placeholders": {} + }, + "invitedUser": "📩 {username} kutsui käyttäjän {targetName}", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "invitedUsersOnly": "Vain kutsutut käyttäjät", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "inviteForMe": "Kutsu minua varten", + "@inviteForMe": { + "type": "String", + "placeholders": {} + }, + "inviteText": "{username} kutsui sinut FluffyChattiin.\n1. Viereaile sivulla: https://fluffychat.im ja asenna sovellus\n2. Rekisteröidy tai kirjaudu sisään\n3. Avaa kutsulinkki:\n{link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "kicked": "👞 {username} potki käyttäjän {targetName}", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickedAndBanned": "🙅 {username} potki ja antoi porttikiellon käyttäjälle {targetName}", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickFromChat": "Potki keskustelusta", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "Aktiivinen viimeksi: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "leave": "Poistu", + "@leave": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "Poistui keskustelusta", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "license": "Lisenssi", + "@license": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "Vaalea", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "loadingPleaseWait": "Ladataan... Hetkinen.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "Lataa vielä {count} osallistujaa", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "loadMore": "Lataa lisää…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "locationDisabledNotice": "Sijaintipalvelut ovat poissa käytöstä. Otathan ne käyttöön jakaaksesi sijaintisi.", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "locationPermissionDeniedNotice": "SIjaintioikeus on estetty. Myönnäthän sen jakaaksesi sijaintisi.", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "login": "Kirjaudu sisään", + "@login": { + "type": "String", + "placeholders": {} + }, + "logInTo": "Kirjaudu sisään palvelimelle {homeserver}", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "logout": "Kirjaudu ulos", + "@logout": { + "type": "String", + "placeholders": {} + }, + "mention": "Mainitse", + "@mention": { + "type": "String", + "placeholders": {} + }, + "messages": "Viestit", + "@messages": { + "type": "String", + "placeholders": {} + }, + "moderator": "Valvoja", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "muteChat": "Vaienna keskustelu", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "newChat": "Uusi keskustelu", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "💬 Uusi viesti FluffyChätissä", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "Uusi varmennuspyyntö!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "next": "Seuraava", + "@next": { + "type": "String", + "placeholders": {} + }, + "no": "Ei", + "@no": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "Ei yhteyttä palvelimeen", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "Voit ottaa salauksen käyttöön vasta kun huone ei ole julkisesti liityttävissä.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "noMatrixServer": "{server1} ei ole Matrix-palvelin, käytetäänkö {server2} sen sijaan?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "scanQrCode": "Skannaa QR-koodi", + "@scanQrCode": {}, + "none": "Ei yhtään", + "@none": { + "type": "String", + "placeholders": {} + }, + "noPasswordRecoveryDescription": "Et ole vielä lisännyt tapaa salasanasi palauttamiseksi.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "Huoneita ei löytynyt…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "notifications": "Ilmoitukset", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "numUsersTyping": "{count} käyttäjää kirjoittavat…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "obtainingLocation": "Paikannetaan sijantia…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "offensive": "Loukkaava", + "@offensive": { + "type": "String", + "placeholders": {} + }, + "offline": "Poissa verkosta", + "@offline": { + "type": "String", + "placeholders": {} + }, + "ok": "ok", + "@ok": { + "type": "String", + "placeholders": {} + }, + "online": "Linjoilla", + "@online": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "Kopioitu leikepöydälle", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "Kopioi", + "@copy": { + "type": "String", + "placeholders": {} + }, + "changeYourAvatar": "Vaihda profiilikuvasi", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "chat": "Keskustelu", + "@chat": { + "type": "String", + "placeholders": {} + }, + "clearArchive": "Tyhjennä arkisto", + "@clearArchive": {}, + "forward": "Edelleenlähetä", + "@forward": { + "type": "String", + "placeholders": {} + }, + "commandHint_join": "Liity syötettyyn huoneeseen", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_me": "Kuvaile itseäsi", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "compareEmojiMatch": "Vertaa hymiöitä", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "confirm": "Vahvista", + "@confirm": { + "type": "String", + "placeholders": {} + }, + "containsUserName": "Sisältää käyttäjätunnuksen", + "@containsUserName": { + "type": "String", + "placeholders": {} + }, + "countParticipants": "{count} osallistujaa", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "changeTheHomeserver": "Vaihda kotipalvelinta", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "Vaihda ryhmän nimeä", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "Salaus on korruptoitunut", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "commandHint_kick": "Poista syötetty käyttäjä huoneesta", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_unban": "Poista syötetyn käyttäjän porttikielto tästä huoneesta", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "commandMissing": "{command} ei ole komento.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "commandHint_send": "Lähetä tekstiä", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "commandInvalid": "Epäkelvollinen komento", + "@commandInvalid": { + "type": "String" + }, + "compareNumbersMatch": "Vertaa numeroita", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "configureChat": "Määritä keskustelu", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "connect": "Yhdistä", + "@connect": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "Yhteystieto on kutsuttu ryhmään", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "containsDisplayName": "Sisältää näyttönimen", + "@containsDisplayName": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "Sisältö on ilmoitettu palvelimen ylläpitäjille", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "Kopioi leikepöydälle", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "Viestin salausta ei voitu purkaa: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "encrypted": "Salattu", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "encryption": "Salaus", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "inoffensive": "Loukkaamatonta", + "@inoffensive": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "Kutsu yhteystieto ryhmään {groupName}", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "isTyping": "kirjoittaa…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "Ota emote-paketti käyttöön kaikkialla", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "Tumma", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "Ota salaus käyttöön", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "fontSize": "Fonttikoko", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "fluffychat": "FluffyChat", + "@fluffychat": { + "type": "String", + "placeholders": {} + }, + "iHaveClickedOnLink": "Olen klikannut linkkiä", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "Virheellinen salasana tai palautusavain", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "👋 {username} liittyi keskusteluun", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "notificationsEnabledForThisAccount": "Tämän tunnuksen ilmoitukset ovat käytössä", + "@notificationsEnabledForThisAccount": { + "type": "String", + "placeholders": {} + }, + "joinRoom": "Liity huoneeseen", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "memberChanges": "Jäsenmuutoksia", + "@memberChanges": { + "type": "String", + "placeholders": {} + }, + "needPantalaimonWarning": "Tiedäthän tarvitsevasi toistaiseksi Pantalaimonin käyttääksesi päästä-päähän-salausta.", + "@needPantalaimonWarning": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "Emoteja ei löytynyt. 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "Firebase Cloud Messaging -palvelu ei vaikuta olevan saatavilla laitteellasi. Saadaksesi push-ilmoituksia silti, suosittelemme Ntfy-sovelluksen asentamista. Käyttämällä Ntfy-sovellusta tai muuta Unified Push -tarjoajaa, saat push-ilmoitukset tietoturvallisella tavalla. Voit ladata Ntfy-sovelluksen Play Kaupasta tai F-Droidista.", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "noPermission": "Ei lupaa", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "enableMultiAccounts": "(BETA) Ota käyttöön tuki usealle tilille tällä laitteella", + "@enableMultiAccounts": {}, + "onlineKeyBackupEnabled": "Verkkkoavainvarmuuskopio on käytössä", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "oopsPushError": "Hups! Valitettavasti push-ilmoituksia käyttöönotettaessa tapahtui virhe.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "Hups, jotakin meni pieleen…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "Avaa sovellus lukeaksesi viestit", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "openCamera": "Avaa kamera", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "oneClientLoggedOut": "Yksi tunnuksistasi on kirjattu ulos", + "@oneClientLoggedOut": {}, + "addAccount": "Lisää tili", + "@addAccount": {}, + "editBundlesForAccount": "Muokkaa tämän tilin kääröjä", + "@editBundlesForAccount": {}, + "addToBundle": "Lisää kääreeseen", + "@addToBundle": {}, + "removeFromBundle": "Poista tästä kääreestä", + "@removeFromBundle": {}, + "bundleName": "Kääreen nimi", + "@bundleName": {}, + "openInMaps": "Avaa kartoissa", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "or": "Tai", + "@or": { + "type": "String", + "placeholders": {} + }, + "participant": "Osallistuja", + "@participant": { + "type": "String", + "placeholders": {} + }, + "password": "Salasana", + "@password": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "Salasana on vaihdettu", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "passwordRecovery": "Salasanan palautus", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "people": "Ihmiset", + "@people": { + "type": "String", + "placeholders": {} + }, + "pickImage": "Valitse kuva", + "@pickImage": { + "type": "String", + "placeholders": {} + }, + "pin": "Kiinnitä", + "@pin": { + "type": "String", + "placeholders": {} + }, + "play": "Toista {fileName}", + "@play": { + "type": "String", + "placeholders": { + "fileName": { + "type": "String" + } + } + }, + "pleaseChoose": "Valitse", + "@pleaseChoose": { + "type": "String", + "placeholders": {} + }, + "pleaseChooseAPasscode": "Valitse pääsykoodi", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "pleaseClickOnLink": "Klikkaa linkkiä sähköpostissa ja sitten jatka.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "pleaseEnter4Digits": "Syötä 4 numeroa tai jätä tyhjäksi poistaaksesi sovelluksen lukituksen.", + "@pleaseEnter4Digits": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPin": "Syötä PIN-koodisi", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "Syötä käyttäjätunnuksesi", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "Seuraa ohjeita verkkosivulla ja paina seuraava.", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "privacy": "Yksityisyys", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "recording": "Tallenne", + "@recording": { + "type": "String", + "placeholders": {} + }, + "redactedAnEvent": "{username} poisti tapahtuman", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "redactMessage": "Poista viesti", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "register": "Rekisteröidy", + "@register": { + "type": "String", + "placeholders": {} + }, + "reject": "Hylkää", + "@reject": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "{username} hylkäsi kutsun", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "rejoin": "Liity uudelleen", + "@rejoin": { + "type": "String", + "placeholders": {} + }, + "remove": "Poista", + "@remove": { + "type": "String", + "placeholders": {} + }, + "removeAllOtherDevices": "Poista kaikki muut laitteet", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "removedBy": "Poistanut {username}", + "@removedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "removeDevice": "Poista laite", + "@removeDevice": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "Poista porttikielto keskusteluun", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "seenByUser": "Nähnyt {username}", + "@seenByUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sendAMessage": "Lähetä viesti", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "send": "Lähetä", + "@send": { + "type": "String", + "placeholders": {} + }, + "sendAsText": "Lähetä tekstinä", + "@sendAsText": { + "type": "String" + }, + "sendAudio": "Lähetä ääniviesti", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendFile": "Lähetä tiedosto", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendImage": "Lähetä kuva", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendMessages": "Lähetä viestejä", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "sendOriginal": "Lähetä alkuperäinen", + "@sendOriginal": { + "type": "String", + "placeholders": {} + }, + "setAsCanonicalAlias": "Aseta pääalias", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "setCustomEmotes": "Aseta mukautetut emotet", + "@setCustomEmotes": { + "type": "String", + "placeholders": {} + }, + "setInvitationLink": "Aseta kutsulinkki", + "@setInvitationLink": { + "type": "String", + "placeholders": {} + }, + "setPermissionsLevel": "Aseta oikeustasot", + "@setPermissionsLevel": { + "type": "String", + "placeholders": {} + }, + "setStatus": "Aseta tila", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "settings": "Asetukset", + "@settings": { + "type": "String", + "placeholders": {} + }, + "share": "Jaa", + "@share": { + "type": "String", + "placeholders": {} + }, + "sharedTheLocation": "{username} jakoi sijaintinsa", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "singlesignon": "Kertakirjautuminen", + "@singlesignon": { + "type": "String", + "placeholders": {} + }, + "skip": "Ohita", + "@skip": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "Lähdekoodi", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "spaceIsPublic": "Tila on julkinen", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "spaceName": "Tilan nimi", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "status": "Tila", + "@status": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWait": "Synkronoidaan... Hetkinen.", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "systemTheme": "Järjestelmä", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "Ne eivät täsmää", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "Ne täsmäävät", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "title": "FluffyChat", + "@title": { + "description": "Title for the application", + "type": "String", + "placeholders": {} + }, + "toggleMuted": "Mykistetty-kytkin", + "@toggleMuted": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "Liikaa pyyntöjä. Yritä myöhemmin uudelleen!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "toggleUnread": "Merkitse lukemattomaksi/luetuksi", + "@toggleUnread": { + "type": "String", + "placeholders": {} + }, + "transferFromAnotherDevice": "Siirrä toiselta laitteelta", + "@transferFromAnotherDevice": { + "type": "String", + "placeholders": {} + }, + "tryToSendAgain": "Yritä uudelleenlähettämistä", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username} poisti käyttäjän {targetName} porttikiellon", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "unblockDevice": "Poista laitteen esto", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "Tuntematon laite", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "unknownEncryptionAlgorithm": "Tuntematon salausalgoritmi", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unknownEvent": "Tuntematon tapahtuma '{type}'", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "userAndOthersAreTyping": "{username} ja {count} muuta kirjoittavat…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "userAndUserAreTyping": "{username} ja {username2} kirjoittavat…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userIsTyping": "{username} kirjoittaa…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userLeftTheChat": "🚪 {username} poistui keskustelusta", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userSentUnknownEvent": "{username} lähetti {type}-tapahtuman", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "unverified": "Varmistamaton", + "@unverified": {}, + "verified": "Varmistettu", + "@verified": { + "type": "String", + "placeholders": {} + }, + "verifyStart": "Aloita varmennus", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "Varmensit onnistuneesti!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "verifyTitle": "Varmistetaan toista tunnusta", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "Keskusteluhistorian näkyvyys", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "Näkyy kaikille osallistujille", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "Näkyy kaikille", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "Ääniviesti", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "Odotetaan kumppanin varmistavan pyynnön…", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "Odotetaan kumppanin hyväksyvän emojit…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "Odotetaan kumppanin hyväksyvän numerot…", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "wallpaper": "Taustakuva:", + "@wallpaper": { + "type": "String", + "placeholders": {} + }, + "warning": "Varoitus!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "weSentYouAnEmail": "Lähetimme sinulle sähköpostia", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "whoCanPerformWhichAction": "Kuka voi suorittaa minkä toimenpiteen", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "Kenen on sallittua liittyä ryhmään", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "Miksi haluat ilmoittaa tämän?", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "wipeChatBackup": "Pyyhi keskusteluvarmuuskopio luodaksesi uuden palautusavaimen?", + "@wipeChatBackup": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "Näillä osoitteilla voit palauttaa salasanasi.", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "Et enää osallistu tähän keskusteluun", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "Sinulle on annettu porttikielto tähän keskusteluun", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "removeFromSpace": "Poista tilasta", + "@removeFromSpace": {}, + "addToSpaceDescription": "Valitse tila, johon tämä keskustelu lisätään.", + "@addToSpaceDescription": {}, + "start": "Aloita", + "@start": {}, + "serverRequiresEmail": "Tämän palvelimen täytyy tarkistaa sähköposti-osoitteesi rekisteröitymistä varten.", + "@serverRequiresEmail": {}, + "roomVersion": "Huoneen versio", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "sentCallInformations": "{senderName} lähetti puhelutiedot", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "unavailable": "Ei saatavilla", + "@unavailable": { + "type": "String", + "placeholders": {} + }, + "verify": "Varmista", + "@verify": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "salalause tai palautusavain", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPassword": "Syötä salasanasi", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "Huone on päivitetty", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "search": "Hae", + "@search": { + "type": "String", + "placeholders": {} + }, + "sentAFile": "📁 {username} lähetti tiedoston", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAnAudio": "🎤 {username} lähetti ääniviestin", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "link": "Linkki", + "@link": {}, + "passwordForgotten": "Salasana unohtunut", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "removeYourAvatar": "Poista profiilikuvasi", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "renderRichContent": "Renderöi rikas-viestisisältö", + "@renderRichContent": { + "type": "String", + "placeholders": {} + }, + "reply": "Vastaa", + "@reply": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "Ilmoita viesti", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "requestPermission": "Pyydä lupaa", + "@requestPermission": { + "type": "String", + "placeholders": {} + }, + "saveFile": "Tallenna tiedosto", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "security": "Turvallisuus", + "@security": { + "type": "String", + "placeholders": {} + }, + "sendSticker": "Lähetä tarra", + "@sendSticker": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "Julkiset huoneet", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "pushRules": "Push-säännöt", + "@pushRules": { + "type": "String", + "placeholders": {} + }, + "reason": "Syy", + "@reason": { + "type": "String", + "placeholders": {} + }, + "replaceRoomWithNewerVersion": "Korvaa huone uudemmalla versiolla", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "Lähetä video", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "sentAPicture": "🖼️ {username} lähetti kuvan", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentASticker": "😊 {username} lähetti tarran", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "🎥 {username} lähetti videon", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "shareLocation": "Jaa sijainti", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "showPassword": "Näytä salasana", + "@showPassword": { + "type": "String", + "placeholders": {} + }, + "statusExampleMessage": "Millainen on vointisi?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "unreadChats": "{unreadCount, plural, =1{1 lukematon keskustelu} other{{unreadCount} lukematonta keskustelua}}", + "@unreadChats": { + "type": "String", + "placeholders": { + "unreadCount": { + "type": "int" + } + } + }, + "videoCall": "Videopuhelu", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "sender": "Lähettäjä", + "@sender": {}, + "startedACall": "{senderName} aloitti puhelun", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "submit": "Lähetä", + "@submit": { + "type": "String", + "placeholders": {} + }, + "toggleFavorite": "Suosikki-kytkin", + "@toggleFavorite": { + "type": "String", + "placeholders": {} + }, + "unmuteChat": "Poista keskustelun mykistys", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "unpin": "Poista kiinnitys", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "time": "Aika", + "@time": {}, + "messageType": "Viestin tyyppi", + "@messageType": {}, + "username": "Käyttäjätunnus", + "@username": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "Kirjoita viesti…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "yes": "Kyllä", + "@yes": { + "type": "String", + "placeholders": {} + }, + "you": "Sinä", + "@you": { + "type": "String", + "placeholders": {} + }, + "yourPublicKey": "Julkinen avaimesi", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "messageInfo": "Viestin tiedot", + "@messageInfo": {}, + "openGallery": "Avaa galleria", + "@openGallery": {}, + "commandHint_clearcache": "Tyhjennä välimuisti", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_create": "Luo tyhjä ryhmäkeskustelu\nKäytä parametria --no-encryption poistaaksesi salauksen käytöstä", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "commandHint_dm": "Aloita yksityiskeskustelu\nKäytä parametria --no-encryption poistaaksesi salauksen käytöstä", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "commandHint_discardsession": "Hylkää istunto", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "openVideoCamera": "Avaa kamera videokuvausta varten", + "@openVideoCamera": { + "type": "String", + "placeholders": {} + }, + "videoWithSize": "Video ({size})", + "@videoWithSize": { + "type": "String", + "placeholders": { + "size": { + "type": "String" + } + } + }, + "publish": "Julkaise", + "@publish": {}, + "markAsRead": "Merkitse luetuksi", + "@markAsRead": {}, + "dismiss": "Hylkää", + "@dismiss": {}, + "emojis": "Hymiöt", + "@emojis": {}, + "unsupportedAndroidVersionLong": "Tämä ominaisuus vaatii uudemman Android-version. Tarkista päivitykset tai LineageOS-tuki.", + "@unsupportedAndroidVersionLong": {}, + "unsupportedAndroidVersion": "Ei tuettu Android-versio", + "@unsupportedAndroidVersion": {}, + "reportUser": "Ilmianna käyttäjä", + "@reportUser": {}, + "voiceCall": "Äänipuhelu", + "@voiceCall": {}, + "videoCallsBetaWarning": "Huomaathan videopuheluiden ovan beta-asteella. Ne eivät ehkä toimi odotetusti tai toimi ollenkaan kaikilla alustoilla.", + "@videoCallsBetaWarning": {}, + "placeCall": "Soita", + "@placeCall": {}, + "reactedWith": "{sender} reagoi {reaction}", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "openChat": "Avaa Keskustelu", + "@openChat": {}, + "pinMessage": "Kiinnitä huoneeseen", + "@pinMessage": {}, + "confirmEventUnpin": "Haluatko varmasti irrottaa tapahtuman pysyvästi?", + "@confirmEventUnpin": {}, + "widgetVideo": "Video", + "@widgetVideo": {}, + "widgetJitsi": "Jitsi Meet", + "@widgetJitsi": {}, + "widgetCustom": "Mukautettu", + "@widgetCustom": {}, + "widgetName": "Nimi", + "@widgetName": {}, + "widgetUrlError": "Epäkelvollinen URL.", + "@widgetUrlError": {}, + "errorAddingWidget": "Virhe lisättäessä pienoissovellusta.", + "@errorAddingWidget": {}, + "nextAccount": "Seuraava tili", + "@nextAccount": {}, + "switchToAccount": "Siirry tilille {number}", + "@switchToAccount": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "experimentalVideoCalls": "Kokeelliset videopuhelut", + "@experimentalVideoCalls": {}, + "emailOrUsername": "Sähköposti-osoite tai käyttäjätunnus", + "@emailOrUsername": {}, + "previousAccount": "Edellinen tili", + "@previousAccount": {}, + "widgetEtherpad": "Tekstimuotoinen muistiinpano", + "@widgetEtherpad": {}, + "widgetNameError": "Syötä näyttönimi.", + "@widgetNameError": {}, + "addWidget": "Lisää pienoissovellus", + "@addWidget": {}, + "youRejectedTheInvitation": "Kieltäydyit kutsusta", + "@youRejectedTheInvitation": {}, + "youJoinedTheChat": "Liityit keskusteluun", + "@youJoinedTheChat": {}, + "youAcceptedTheInvitation": "👍 Hyväksyit kutsun", + "@youAcceptedTheInvitation": {}, + "youBannedUser": "Annoit porttikiellon käyttäjälle {user}", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youHaveWithdrawnTheInvitationFor": "Olet perunut kutsun käyttäjälle {user}", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedBy": "📩 {user} kutsui sinut", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKicked": "👞 Potkit käyttäjän {user} keskustelusta", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedUser": "📩 Kutsuit käyttäjän {user}", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKickedAndBanned": "🙅 Potkit ja annoit porttikiellon käyttäjälle {user}", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youUnbannedUser": "Poistit käyttäjän {user} porttikiellon", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "separateChatTypes": "Erota yksityiskeskustelut ryhmistä", + "@separateChatTypes": { + "type": "String", + "placeholders": {} + }, + "dehydrateTor": "TOR-käyttäjät: vie istunto", + "@dehydrateTor": {}, + "hydrateTor": "TOR-käyttäjät: tuo viety istunto", + "@hydrateTor": {}, + "hydrateTorLong": "Veitkö edellisen istuntosi käyttäessäsi TORia? Tuo se nopeasti ja jatka jutustelua.", + "@hydrateTorLong": {}, + "pleaseEnterRecoveryKey": "Syötä palautusavaimesi:", + "@pleaseEnterRecoveryKey": {}, + "recoveryKey": "Palautusavain", + "@recoveryKey": {}, + "recoveryKeyLost": "Kadonnut palautusavain?", + "@recoveryKeyLost": {}, + "dehydrateTorLong": "Tor-käyttäjille suositellaan istunnon vientiä ennen ikkunan sulkemista.", + "@dehydrateTorLong": {}, + "hydrate": "Palauta varmuuskopiotiedostosta", + "@hydrate": {}, + "dehydrate": "Vie istunto ja tyhjennä laite", + "@dehydrate": {}, + "dehydrateWarning": "Tätä toimenpidettä ei voi kumota.\nVarmista varmuuskopiotiedoston turvallinen tallennus.", + "@dehydrateWarning": {}, + "users": "Käyttäjät", + "@users": {}, + "storeSecurlyOnThisDevice": "Tallenna turvallisesti tälle laitteelle", + "@storeSecurlyOnThisDevice": {}, + "pleaseEnterRecoveryKeyDescription": "Avataksesi vanhojen viestiesi salauksen, syötä palautusavaimesi, joka luotiin edellisessä istunnossa. Palautusavaimesi EI OLE salasanasi.", + "@pleaseEnterRecoveryKeyDescription": {}, + "unlockOldMessages": "Pura vanhojen viestien salaus", + "@unlockOldMessages": {}, + "indexedDbErrorLong": "Viestivarasto ei ole käytössä yksityisselauksessa oletuksena.\nKäythän osoitteessa\n - about:config\n - Aseta dom.indexedDB.privateBrowsing.enabled arvoon true\nMuuten FluffyChatin käyttäminen ei ole mahdollista.", + "@indexedDbErrorLong": {}, + "saveKeyManuallyDescription": "Tallenna tämä avain manuaalisesti käyttäen järjestelmän jakodialogia tai leikepöytää.", + "@saveKeyManuallyDescription": {}, + "storeInAndroidKeystore": "Tallenna Android KeyStoreen", + "@storeInAndroidKeystore": {}, + "storeInAppleKeyChain": "Tallenna Applen avainnippuun", + "@storeInAppleKeyChain": {}, + "countFiles": "{count} tiedostoa", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "storeInSecureStorageDescription": "Tallenna palautusavain tämän laitteen turvavarastoon.", + "@storeInSecureStorageDescription": {}, + "indexedDbErrorTitle": "Yksityisen selauksen ongelmat", + "@indexedDbErrorTitle": {}, + "user": "Käyttäjä", + "@user": {}, + "custom": "Mukautettu", + "@custom": {}, + "confirmMatrixId": "Kirjoita Matrix IDsi uudelleen poistaaksesi tunnuksesi.", + "@confirmMatrixId": {}, + "supposedMxid": "Tämän pitäisi olla {mxid}", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "commandHint_markasgroup": "Merkitse ryhmäksi", + "@commandHint_markasgroup": {}, + "whyIsThisMessageEncrypted": "Miksei tätä viestiä voida lukea?", + "@whyIsThisMessageEncrypted": {}, + "noKeyForThisMessage": "Tämä voi tapahtua mikäli viesti lähetettiin ennen sisäänkirjautumistasi tälle laitteelle.\n\nOn myös mahdollista, että lähettäjä on estänyt tämän laitteen tai jokin meni pieleen verkkoyhteyden kanssa.\n\nPystytkö lukemaan viestin toisella istunnolla? Siinä tapauksessa voit siirtää viestin siltä! Mene Asetukset > Laitteet ja varmista, että laitteesi ovat varmistaneet toisensa. Seuraavankerran avatessasi huoneen ja molempien istuntojen ollessa etualalla, avaimet siirretään automaattisesti.\n\nHaluatko varmistaa ettet menetä avaimia uloskirjautuessa tai laitteita vaihtaessa? Varmista avainvarmuuskopion käytössäolo asetuksista.", + "@noKeyForThisMessage": {}, + "commandHint_markasdm": "Merkitse yksityiskeskusteluksi syötetyn Matrix IDn kanssa", + "@commandHint_markasdm": {}, + "foregroundServiceRunning": "Tämä ilmoitus näkyy etualapalvelun ollessa käynnissä.", + "@foregroundServiceRunning": {}, + "callingPermissions": "Puheluoikeudet", + "@callingPermissions": {}, + "callingAccount": "Soittamistunnus", + "@callingAccount": {}, + "callingAccountDetails": "Sallii FluffyChatin käyttää Androidin omaa Puhelut-sovellusta.", + "@callingAccountDetails": {}, + "appearOnTop": "Näy päällä", + "@appearOnTop": {}, + "appearOnTopDetails": "Sallii sovelluksen näkyä muiden sovellusten päällä (tätä ei tarvita, mikäli olet jo määrittänyt FluffyChatin puhelin-tunnukseksi)", + "@appearOnTopDetails": {}, + "newSpace": "Uusi tila", + "@newSpace": {}, + "enterSpace": "Siirry tilaan", + "@enterSpace": {}, + "enterRoom": "Siirry huoneeseen", + "@enterRoom": {}, + "allSpaces": "Kaikki tilat", + "@allSpaces": {}, + "screenSharingTitle": "ruudunjako", + "@screenSharingTitle": {}, + "otherCallingPermissions": "Mikrofoni, kamera ja muut FluffyChatin oikeudet", + "@otherCallingPermissions": {}, + "newGroup": "Uusi ryhmä", + "@newGroup": {}, + "screenSharingDetail": "Jaat ruutuasi FluffyChatissä", + "@screenSharingDetail": {}, + "hugContent": "{senderName} halaa sinua", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "cuddleContent": "{senderName} kokovartalohalaa sinua", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "commandHint_hug": "Lähetä halaus", + "@commandHint_hug": {}, + "googlyEyesContent": "{senderName} lähettää askartelusilmiä", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "numChats": "{number} keskustelua", + "@numChats": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "commandHint_googly": "Lähetä askartelusilmiä", + "@commandHint_googly": {}, + "commandHint_cuddle": "Lähetä kokovartaluhalaus", + "@commandHint_cuddle": {}, + "hideUnimportantStateEvents": "Piilota ei-niin-tärkeät tilatapahtumat", + "@hideUnimportantStateEvents": {}, + "doNotShowAgain": "Älä näytä uudelleen", + "@doNotShowAgain": {}, + "fileHasBeenSavedAt": "Tiedosto on tallennettu sijaintiin {path}", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "disableEncryptionWarning": "Turvallisuuden vuoksi et voi poistaa salausta käytöstä huoneista, joissa se on aiemmin otettu käyttöön.", + "@disableEncryptionWarning": {}, + "allRooms": "Kaikki ryhmäkeskustelut", + "@allRooms": { + "type": "String", + "placeholders": {} + }, + "startFirstChat": "Aloita ensimmäinen keskustelusi", + "@startFirstChat": {}, + "newSpaceDescription": "Tilat mahdollistavat keskusteluidesi keräämisen ja yksityisten tai julkisten yhteisöjen rakentamisen.", + "@newSpaceDescription": {}, + "deviceKeys": "Laite-avaimet:", + "@deviceKeys": {}, + "reopenChat": "Avaa keskustelu uudelleen", + "@reopenChat": {}, + "noOtherDevicesFound": "Muita laitteita ei löytynyt", + "@noOtherDevicesFound": {}, + "jumpToLastReadMessage": "Hyppää viimeiseen luettuun viestiin", + "@jumpToLastReadMessage": {}, + "readUpToHere": "Luettu tähän asti", + "@readUpToHere": {}, + "jump": "Hyppää", + "@jump": {}, + "openLinkInBrowser": "Avaa linkki selaimessa", + "@openLinkInBrowser": {}, + "report": "ilmoita", + "@report": {}, + "encryptThisChat": "Salaa tämä keskustelu", + "@encryptThisChat": {}, + "noBackupWarning": "Varoitus! Ilman avainvarmuuskopion käyttöönottoa menetät pääsyn salattuihin viesteihisi. Suosittelemme ehdottomasti avainvarmuuskopion käyttöönottoa ennen uloskirjautumista.", + "@noBackupWarning": {}, + "fileIsTooBigForServer": "Ei voi lähettää! Palvelin tukee liitetiedostoja vain enintään {max}.", + "@fileIsTooBigForServer": {}, + "reportErrorDescription": "😭 Voi ei. Jokin meni pieleen. Halutessasi voit ilmoittaa ongelman kehittäjille.", + "@reportErrorDescription": {}, + "wasDirectChatDisplayName": "Tyhjä keskustelu (oli {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "sorryThatsNotPossible": "Anteeksi... se ei ole mahdollista", + "@sorryThatsNotPossible": {}, + "signInWithPassword": "Kirjaudu sisään salasanalla", + "@signInWithPassword": {}, + "pleaseTryAgainLaterOrChooseDifferentServer": "Yritä myöhemmin uudelleen tai valitse toinen palvelin.", + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "setColorTheme": "Aseta väriteema:", + "@setColorTheme": {}, + "tryAgain": "Yritä uudelleen", + "@tryAgain": {}, + "messagesStyle": "Viestit:", + "@messagesStyle": {}, + "chatDescription": "Keskustelun kuvaus", + "@chatDescription": {}, + "invalidServerName": "Virheellinen palvelimen nimi", + "@invalidServerName": {}, + "chatPermissions": "Keskustelun oikeudet", + "@chatPermissions": {}, + "setChatDescription": "Asetti keskustelun kuvauksen", + "@setChatDescription": {}, + "importFromZipFile": "Tuo .zip -tiedostosta", + "@importFromZipFile": {}, + "redactedBy": "Poistanut {username}", + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "signInWith": "Kirjaudu sisään palvelulla {provider}", + "@signInWith": { + "type": "String", + "placeholders": { + "provider": { + "type": "String" + } + } + }, + "optionalRedactReason": "(Vapaaehtoinen) Syy tämän viestin poistamiselle...", + "@optionalRedactReason": {}, + "archiveRoomDescription": "Keskustelu siirretään arkistoon. Muut käyttäjät näkevät sinun poistuneen keskustelusta.", + "@archiveRoomDescription": {}, + "exportEmotePack": "Vie emotepaketti .zip-tiedostona", + "@exportEmotePack": {}, + "inviteContactToGroupQuestion": "Tahdotko kutsua yhteystiedon {contact} keskusteluun \"{groupName}\"?", + "@inviteContactToGroupQuestion": {}, + "redactedByBecause": "Poistanut {username} syystä: \"{reason}\"", + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "redactMessageDescription": "Viesti poistetaan kaikilta keskustelun osallistujilta. Tätä ei voida kumota.", + "@redactMessageDescription": {}, + "invalidInput": "Virheellinen syöte!", + "@invalidInput": {}, + "addChatDescription": "Lisää keskustelulle kuvaus...", + "@addChatDescription": {}, + "hasKnocked": "🚪 {user} on koputtanut", + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "directChat": "Yksityiskeskustelu", + "@directChat": {}, + "wrongPinEntered": "Väärä pin-koodi! Yritä uudelleen {seconds} sekuntin kuluttua...", + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "sendTypingNotifications": "Lähetä kirjoitusilmoituksia", + "@sendTypingNotifications": {}, + "inviteGroupChat": "Kutsu ryhmäkeskusteluun", + "@inviteGroupChat": {}, + "invitePrivateChat": "Kutsu yksityiskeskusteluun", + "@invitePrivateChat": {}, + "importEmojis": "Tuo emojit", + "@importEmojis": {}, + "noChatDescriptionYet": "Keskustelun kuvausta ei ole vielä luotu.", + "@noChatDescriptionYet": {}, + "notAnImage": "Tämä ei ole kuvatiedosto.", + "@notAnImage": {}, + "chatDescriptionHasBeenChanged": "Keskustelun kuvaus muutettu", + "@chatDescriptionHasBeenChanged": {}, + "roomUpgradeDescription": "Keskustelu luodaan uudelleen uudella huoneversiolla. Kaikille osallistujille ilmoitetaan, että heidän tulee siirtyä uuteen keskusteluun. Voit lukea lisää huoneversioista osoitteesta https://spec.matrix.org/latest/rooms/", + "@roomUpgradeDescription": {}, + "pleaseEnterANumber": "Syötä suurempi luku kuin 0", + "@pleaseEnterANumber": {}, + "profileNotFound": "Käyttäjää ei löydy palvelimelta. Tämä voi olla yhteysongelma tai käyttäjä ei ole olemassa.", + "@profileNotFound": {}, + "shareInviteLink": "Jaa kutsulinkki", + "@shareInviteLink": {}, + "emoteKeyboardNoRecents": "Viimeaikoina käytetyt emotet tulevat näkymään täällä...", + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "setTheme": "Aseta teema:", + "@setTheme": {}, + "replace": "Korvaa", + "@replace": {}, + "createGroup": "Luo ryhmä", + "@createGroup": {}, + "importNow": "Tuo nyt", + "@importNow": {}, + "invite": "Kutsu", + "@invite": {}, + "swipeRightToLeftToReply": "Vastaa pyyhkäisemällä oikealta vasemmalle", + "@swipeRightToLeftToReply": {}, + "accessAndVisibility": "Pääsy ja näkyvyys", + "@accessAndVisibility": {}, + "unread": "Lukemattomat", + "@unread": {}, + "noMoreChatsFound": "Lisää keskusteluja ei löytynyt...", + "@noMoreChatsFound": {} +} diff --git a/assets/l10n/intl_fil.arb b/assets/l10n/intl_fil.arb new file mode 100644 index 0000000..414c52d --- /dev/null +++ b/assets/l10n/intl_fil.arb @@ -0,0 +1,1063 @@ +{ + "remove": "Tanggalin", + "@remove": { + "type": "String", + "placeholders": {} + }, + "importNow": "I-import ngayon", + "@importNow": {}, + "importEmojis": "I-import ang mga Emoji", + "@importEmojis": {}, + "importFromZipFile": "Mag-import mula sa .zip file", + "@importFromZipFile": {}, + "exportEmotePack": "I-export ang Emote pack bilang .zip", + "@exportEmotePack": {}, + "accept": "Tanggapin", + "@accept": { + "type": "String", + "placeholders": {} + }, + "account": "Account", + "@account": { + "type": "String", + "placeholders": {} + }, + "addEmail": "Magdagdag ng email", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "confirmMatrixId": "Paki-kumpirma ang iyong Matrix ID para burahin ang iyong account.", + "@confirmMatrixId": {}, + "addChatDescription": "Magdagdag ng deskripsyon ng chat...", + "@addChatDescription": {}, + "admin": "Admin", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "alyas", + "@alias": { + "type": "String", + "placeholders": {} + }, + "all": "Lahat", + "@all": { + "type": "String", + "placeholders": {} + }, + "allChats": "Lahat ng mga chat", + "@allChats": { + "type": "String", + "placeholders": {} + }, + "commandHint_googly": "Magpadala ng mga googly eye", + "@commandHint_googly": {}, + "commandHint_cuddle": "Magpadala ng yakap", + "@commandHint_cuddle": {}, + "cuddleContent": "Niyakap ka ni {senderName}", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "hugContent": "Niyakap ka ni {senderName}", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "Pwede sumali ang anumang tao", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "appLock": "Lock ng app", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "archive": "Archive", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "Pwede ba sumali ang mga bisita", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "Sigurado ka?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "Tanggapin ang hiling ng verification mula sa {username}?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "autoplayImages": "Awtomatikong i-play ang mga gumagalaw na sticker at emote", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "sendTypingNotifications": "Ipadala ang mga typing notification", + "@sendTypingNotifications": {}, + "blockDevice": "I-block ang Device", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "blocked": "Na-block", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "changeDeviceName": "Palitan ang pangalan ng device", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "Pinalitan ni {username} ang avatar ng chat", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "Pinalitan ni {username} ang mga tuntunin sa pag-access ng bisita", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "Pinalitan ni {username} ang kakayahan ng pagkikita ng history", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "Pinalitan ni {username} ang kakayahan ng pagkikita ng history sa: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "Pinalitan ni {username} ang mga alias ng room", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changePassword": "Palitan ang password", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeYourAvatar": "Palitan ang iyong avatar", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "Nasira ang encryption", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "chat": "Chat", + "@chat": { + "type": "String", + "placeholders": {} + }, + "chatBackup": "Pag-backup ng chat", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Mga detalye ng chat", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chatHasBeenAddedToThisSpace": "Nadagdag ang chat sa space na ito", + "@chatHasBeenAddedToThisSpace": {}, + "chats": "Mga Chat", + "@chats": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "Pumili ng malakas na password", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "clearArchive": "I-clear ang archive", + "@clearArchive": {}, + "close": "Isara", + "@close": { + "type": "String", + "placeholders": {} + }, + "commandHint_markasgroup": "Markahan bilang grupo", + "@commandHint_markasgroup": {}, + "commandHint_ban": "Pagbawalan ang ibinigay na user sa room na ito", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "repeatPassword": "Ulitin ang password", + "@repeatPassword": {}, + "notAnImage": "Hindi isang file na larawan.", + "@notAnImage": {}, + "replace": "Palitan", + "@replace": {}, + "about": "Tungkol sa", + "@about": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 Tinanggap ni {username} ang imbitasyon", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "activatedEndToEndEncryption": "🔐 Na-activate ni {username} ang end to end encryption", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "supposedMxid": "Dapat ito ay {mxid}", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "addToSpace": "Idagdag sa space", + "@addToSpace": {}, + "commandHint_hug": "Magpadala ng yakap", + "@commandHint_hug": {}, + "googlyEyesContent": "Nagpadala si {senderName} ng googly eyes", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "answeredTheCall": "Sinagot ni {senderName} ang tawag", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "areYouSureYouWantToLogout": "Sigurado kang gusto mong mag-log out?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "Para i-sign ang isa pang tao, pakilagay ang iyong secure store passphrase o recovery key.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "badServerLoginTypesException": "Ang homeserver ay sinusuportahan ang sumusunod na uri ng login:\n{serverVersions}\nNgunit sinusuportahan lang ng app ang:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "sendOnEnter": "Ipadala sa pagpindot ng enter", + "@sendOnEnter": {}, + "badServerVersionsException": "Ang homeserver ay sinusuportahan ang mga Spec bersyon:\n{serverVersions}\nNgunit sinusuportahan lang ng app ang {supportedVersions}", + "@badServerVersionsException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "banFromChat": "Pagbawalan sa chat", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "Pinagbawalan", + "@banned": { + "type": "String", + "placeholders": {} + }, + "botMessages": "Mga mensahe ng bot", + "@botMessages": { + "type": "String", + "placeholders": {} + }, + "cancel": "Kanselahin", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "Pinagbawalan ni {username} si {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "cantOpenUri": "Hindi mabuksan ang URI na {uri}", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "changedTheJoinRules": "Pinalitan ni {username} ang mga tuntunin sa pagsali", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "Pinalitan ni {username} ang mga tuntunin sa pagsali sa: {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheChatDescriptionTo": "Pinalitan ni {username} ang deskripsyon ng chat sa: '{description}'", + "@changedTheChatDescriptionTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "description": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "Pinalitan ni {username} ang kanilang avatar", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatNameTo": "Pinalitan ni {username} ang pangalan ng chat sa: '{chatname}'", + "@changedTheChatNameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "chatname": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "Pinalitan ni {username} ang link ng imbitasyon", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changeTheHomeserver": "Palitan ang homeserver", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "Palitan ang iyong istilio", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changedTheChatPermissions": "Pinalitan ni {username} ang mga pahintulot ng chat", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changeTheNameOfTheGroup": "Palitan ng pangalan ng grupo", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "changedTheDisplaynameTo": "Pinalitan ni {username} ang kanilang displayname sa: '{displayname}'", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "yourChatBackupHasBeenSetUp": "Na-set up na ang iyong chat backup.", + "@yourChatBackupHasBeenSetUp": {}, + "chatBackupDescription": "Naka-secure ang iyong mga lumang mensahe gamit ng recovery key. Siguraduhing hindi mo ito mawalan.", + "@chatBackupDescription": { + "type": "String", + "placeholders": {} + }, + "commandHint_markasdm": "Markahan bilang direktang mensahe na room para sa ibinigay na Matrix ID", + "@commandHint_markasdm": {}, + "changedTheGuestAccessRulesTo": "Pinalitan ni {username} ang mga tuntunin sa pag-access ng bisita sa: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "commandHint_clearcache": "I-clear ang cache", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_discardsession": "Iwaksi ang sesyon", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "commandHint_create": "Gumawa ng walang lamang group chat\nGumamit ng --no-encryption para i-disable ang encryption", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "configureChat": "I-configure ang chat", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "confirm": "Kumpirmahin", + "@confirm": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "Paki-kumpara ang mga numero", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "Kinopya sa clipboard", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "Kopyahin", + "@copy": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "Kopyahin sa clipboard", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "countParticipants": "{count} mga kasali", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "createdTheChat": "💬 Ginawa ni {username} ang chat", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "createGroup": "Gumawa ng grupo", + "@createGroup": {}, + "createNewSpace": "Bagong space", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "currentlyActive": "Kasalukuyang aktibo", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "Madilim", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "Pinalitan na ang display name", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "directChats": "Mga Direktang Chat", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "allRooms": "Lahat ng Mga Group Chat", + "@allRooms": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "I-download ang file", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "I-edit ang mga naka-block na server", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "chatPermissions": "Mga pahintulot ng chat", + "@chatPermissions": {}, + "editDisplayname": "I-edit ang display name", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "editRoomAliases": "I-edit ang mga alyas ng room", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "edit": "I-edit", + "@edit": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "I-edit ang avatar ng room", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "Umiiral na ang emote!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "Walang lamang chat", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "I-enable ang encryption", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "encryption": "Pag-encrypt", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "encrypted": "Naka-encrypt", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "Hindi naka-enable ang encryption", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "everythingReady": "Handa na ang lahat!", + "@everythingReady": { + "type": "String", + "placeholders": {} + }, + "appLockDescription": "I-lock ang app kapag hindi ginagamit sa pamamagitan ng pin code", + "@appLockDescription": {}, + "commandHint_dm": "Magsimula ng direktong chat\nGumamit ng --no-encryptiom para i-disable ang encryption", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "commandHint_html": "Magpadala ng HTML-formatted na text", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_invite": "Imbitahan ang ibinigay na user sa room na ito", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "commandHint_join": "Sumali sa ibinigay na room", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_kick": "Tanggalin ang ibinigay na user sa room na ito", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_leave": "Umalis sa room na ito", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_me": "Ilarawan ang iyong sarili", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "commandHint_myroomavatar": "Ilapat ang iyong larawan para sa room na ito (bilang mxc-uri)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_myroomnick": "Ilapat ang iyong display name para sa room na ito", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "commandHint_op": "Ilapat ang level ng lakas sa ibinigay na user (default: 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_react": "Magpadala ng reply bilang reaksyon", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "commandHint_send": "Magpadala ng text", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "commandHint_unban": "I-unban ang ibinigay na user sa room na ito", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "commandInvalid": "Hindi wastong command", + "@commandInvalid": { + "type": "String" + }, + "compareEmojiMatch": "Paki-kumpara ang mga emoji", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "connect": "Kumonekta", + "@connect": { + "type": "String", + "placeholders": {} + }, + "containsDisplayName": "Naglalaman ng display name", + "@containsDisplayName": { + "type": "String", + "placeholders": {} + }, + "create": "Gumawa", + "@create": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "dateWithoutYear": "{month}/{day}", + "@dateWithoutYear": { + "type": "String", + "placeholders": { + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "dateWithYear": "{month}/{day}/{year}", + "@dateWithYear": { + "type": "String", + "placeholders": { + "year": { + "type": "String" + }, + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "deactivateAccountWarning": "Ide-deactivate nito ang iyong user account. Hindi na ito maaaring bawiin! Sigurado ka?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "delete": "Burahin", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "Burahin ang mensahe", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "device": "Device", + "@device": { + "type": "String", + "placeholders": {} + }, + "deviceId": "ID ng Device", + "@deviceId": { + "type": "String", + "placeholders": {} + }, + "devices": "Mga Device", + "@devices": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "Hindi wastong shortcode ng emote!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emoteKeyboardNoRecents": "Ang mga kamakailang ginamit na emote ay lalabas dito...", + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "calls": "Mga Tawag", + "@calls": {}, + "customEmojisAndStickers": "Mga custom emoji at sticker", + "@customEmojisAndStickers": {}, + "customEmojisAndStickersBody": "Magdagdag o magbahagi ng mga custom emoji o sticker na maaring gamitin sa anumang chat.", + "@customEmojisAndStickersBody": {}, + "emoteShortcode": "Shortcode ng emoji", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emoteWarnNeedToPick": "Kailangan mong pumili ng emote shortcode at isang larawan!", + "@emoteWarnNeedToPick": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "I-enable ang emote pack globally", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "Tinapos ni {senderName} ang tawag", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "enterAnEmailAddress": "Maglagay ng email address", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "homeserver": "Homeserver", + "@homeserver": {}, + "enterYourHomeserver": "Ilagay ang iyong homeserver", + "@enterYourHomeserver": { + "type": "String", + "placeholders": {} + }, + "extremeOffensive": "Lubhang nakakasakit", + "@extremeOffensive": { + "type": "String", + "placeholders": {} + }, + "commandHint_plain": "Magpadala ng hindi na-format na text", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandMissing": "Hindi isang command ang {command}.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "contactHasBeenInvitedToTheGroup": "Inimbita ang contact sa group", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "containsUserName": "Naglalaman ng username", + "@containsUserName": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "Inulat ang nilalaman sa mga pangangasiwa ng server", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "Hindi ma-decrypt ang mensahe: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "defaultPermissionLevel": "Default na antas ng pahintulot para sa mga bagong user", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "Burahin ang account", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "emotePacks": "Mga emote pack para sa room", + "@emotePacks": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "Mga Setting ng Emote", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "globalChatId": "Global chat ID", + "@globalChatId": {}, + "accessAndVisibility": "Pag-access at visibility", + "@accessAndVisibility": {}, + "accessAndVisibilityDescription": "Sino ang pinapayagang sumali sa chat at paano matutuklas ang chat.", + "@accessAndVisibilityDescription": {}, + "enableEncryptionWarning": "Hindi mo madi-disable ang encryption. Sigurado ka ba?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "errorObtainingLocation": "Hindi makuha ang lokasyon: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "fileName": "Pangalan ng file", + "@fileName": { + "type": "String", + "placeholders": {} + }, + "fluffychat": "FluffyChat", + "@fluffychat": { + "type": "String", + "placeholders": {} + }, + "fontSize": "Laki ng font", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "noChatsFoundHere": "Walang pang mga chat na nahanap dito. Magsimula ng bagong chat kasama ang isang tao sa pamamagitan ng paggamit ng button sa ibaba. ⤵️", + "@noChatsFoundHere": {}, + "aboutHomeserver": "Tungkol sa {homeserver}", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "space": "Espasyo", + "@space": {}, + "countChatsAndCountParticipants": "{chats} mga chat at {participants} mga kasali", + "@countChatsAndCountParticipants": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + }, + "participants": { + "type": "int" + } + } + }, + "guestsAreForbidden": "Pinagbabawal ang mga bisita", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "Maaring sumali ang mga bisita", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "forward": "I-forward", + "@forward": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "Mula sa pagsali", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "Mula sa imbitasyon", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "goToTheNewRoom": "Pumunta sa bagong room", + "@goToTheNewRoom": { + "type": "String", + "placeholders": {} + }, + "group": "Grupo", + "@group": { + "type": "String", + "placeholders": {} + }, + "swipeRightToLeftToReply": "Mag-swipe pakaliwa o kanan para tumugon", + "@swipeRightToLeftToReply": {}, + "noMoreChatsFound": "Wala nang mga chat na nahanap…", + "@noMoreChatsFound": {}, + "joinedChats": "Mga nasaling chat", + "@joinedChats": {}, + "unread": "Hindi nabasa", + "@unread": {}, + "spaces": "Mga Espasyo", + "@spaces": {}, + "groupIsPublic": "Pampubliko ang grupo", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "groups": "Mga grupo", + "@groups": { + "type": "String", + "placeholders": {} + }, + "alwaysUse24HourFormat": "false", + "@alwaysUse24HourFormat": { + "description": "Set to true to always display time of day in 24 hour format." + }, + "chatDescription": "Paglalarawan ng chat", + "@chatDescription": {}, + "chatDescriptionHasBeenChanged": "Nabago ang paglalarawan ng chat", + "@chatDescriptionHasBeenChanged": {}, + "groupWith": "Grupo kasama kay/sa {displayname}", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + } +} diff --git a/assets/l10n/intl_fr.arb b/assets/l10n/intl_fr.arb new file mode 100644 index 0000000..1a10126 --- /dev/null +++ b/assets/l10n/intl_fr.arb @@ -0,0 +1,3097 @@ +{ + "@@locale": "fr", + "@@last_modified": "2021-08-14 12:41:10.051787", + "about": "À propos", + "@about": { + "type": "String", + "placeholders": {} + }, + "accept": "Accepter", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 {username} a accepté l'invitation", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "Compte", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐 {username} a activé le chiffrement de bout en bout", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "addEmail": "Ajouter un courriel", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "addToSpace": "Ajouter à l'espace", + "@addToSpace": {}, + "admin": "Administrateur", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "adresse", + "@alias": { + "type": "String", + "placeholders": {} + }, + "all": "Tout", + "@all": { + "type": "String", + "placeholders": {} + }, + "allChats": "Toutes les discussions", + "@allChats": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "{senderName} a répondu à l'appel", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "Tout le monde peut rejoindre", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "appLock": "Verrouillage de l’application", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "archive": "Archiver", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "Les invités peuvent-i·e·ls rejoindre", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "Êtes-vous sûr·e ?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "areYouSureYouWantToLogout": "Voulez-vous vraiment vous déconnecter ?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "Pour pouvoir faire signer l'autre personne, veuillez entrer la phrase de passe de votre trousseau sécurisé ou votre clé de récupération.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "Accepter cette demande de vérification de la part de {username} ?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "autoplayImages": "Lire automatiquement les autocollants et les émojis animés", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "badServerLoginTypesException": "Le serveur d'accueil prend en charge les types de connexion :\n{serverVersions}\nMais cette application ne prend en charge que :\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "badServerVersionsException": "Le serveur d'accueil prend en charge les versions des spécifications :\n{serverVersions}\nMais cette application ne prend en charge que {supportedVersions}", + "@badServerVersionsException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "banFromChat": "Bannir de la discussion", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "Banni", + "@banned": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username} a banni {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "Bloquer l'appareil", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "blocked": "Bloqué", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "botMessages": "Messages de bot", + "@botMessages": { + "type": "String", + "placeholders": {} + }, + "cancel": "Annuler", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "cantOpenUri": "Impossible d'ouvrir l'URI {uri}", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "changeDeviceName": "Modifier le nom de l'appareil", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "{username} a changé l'image de la discussion", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatDescriptionTo": "{username} a changé la description de la discussion en : '{description}'", + "@changedTheChatDescriptionTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "description": { + "type": "String" + } + } + }, + "changedTheChatNameTo": "{username} a renommé la discussion en : '{chatname}'", + "@changedTheChatNameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "chatname": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username} a changé les permissions de la discussion", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username} a changé son nom en : '{displayname}'", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} a changé les règles d'accès à la discussion pour les invités", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} a changé les règles d'accès à la discussion pour les invités en : {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username} a changé la visibilité de l'historique de la discussion", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username} a changé la visibilité de l'historique de la discussion en : {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username} a changé les règles d'accès à la discussion", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} a changé les règles d'accès à la discussion en : {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} a changé son avatar", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "{username} a changé les adresses du salon", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username} a changé le lien d'invitation", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changePassword": "Changer de mot de passe", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "Changer le serveur d'accueil", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "Changez votre style", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "Changer le nom du groupe", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "changeYourAvatar": "Changer votre avatar", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "Le chiffrement a été corrompu", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "chat": "Discussion", + "@chat": { + "type": "String", + "placeholders": {} + }, + "chatBackup": "Sauvegarde des discussions", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "chatBackupDescription": "Vos anciens messages sont sécurisés par une clé de récupération. Veillez à ne pas la perdre.", + "@chatBackupDescription": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Détails de la discussion", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chatHasBeenAddedToThisSpace": "La discussion a été ajoutée à cet espace", + "@chatHasBeenAddedToThisSpace": {}, + "chats": "Discussions", + "@chats": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "Choisissez un mot de passe fort", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "clearArchive": "Effacer les archives", + "@clearArchive": {}, + "close": "Fermer", + "@close": { + "type": "String", + "placeholders": {} + }, + "commandHint_ban": "Bannir l'utilisateur/trice donné(e) de ce salon", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_html": "Envoyer du texte au format HTML", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_invite": "Inviter l'utilisateur/trice donné(e) dans ce salon", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "commandHint_join": "Rejoindre le salon donné", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_kick": "Supprime l'utilisateur/trice donné(e) de ce salon", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_leave": "Quitter ce salon", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_me": "Décrivez-vous", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "commandHint_myroomavatar": "Définir votre image pour ce salon (par mxc-uri)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_myroomnick": "Définir votre nom d'affichage pour ce salon", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "commandHint_op": "Définir le niveau de puissance de l'utilisateur/trice donné(e) (par défaut : 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_plain": "Envoyer du texte non formaté", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_react": "Envoyer une réponse en tant que réaction", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "commandHint_send": "Envoyer du texte", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "commandHint_unban": "Débannir l'utilisateur/trice donné(e) de ce salon", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "commandInvalid": "Commande invalide", + "@commandInvalid": { + "type": "String" + }, + "commandMissing": "{command} n'est pas une commande.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "compareEmojiMatch": "Veuillez comparer les émojis", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "Veuillez comparer les chiffres", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "configureChat": "Configurer la discussion", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "confirm": "Confirmer", + "@confirm": { + "type": "String", + "placeholders": {} + }, + "connect": "Se connecter", + "@connect": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "Le contact a été invité au groupe", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "containsDisplayName": "Contient un nom d'affichage", + "@containsDisplayName": { + "type": "String", + "placeholders": {} + }, + "containsUserName": "Contient un nom d'utilisateur·ice", + "@containsUserName": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "Le contenu a été signalé aux administrateurs du serveur", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "Copié dans le presse-papier", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "Copier", + "@copy": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "Copier dans le presse-papiers", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "Impossible de déchiffrer le message : {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "countParticipants": "{count} participant(s)", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "create": "Créer", + "@create": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "💬 {username} a créé la discussion", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "createNewSpace": "Nouvel espace", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "currentlyActive": "Actif en ce moment", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "Sombre", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "dateWithoutYear": "{day}/{month}", + "@dateWithoutYear": { + "type": "String", + "placeholders": { + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "dateWithYear": "{day}/{month}/{year}", + "@dateWithYear": { + "type": "String", + "placeholders": { + "year": { + "type": "String" + }, + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "deactivateAccountWarning": "Cette opération va désactiver votre compte. Une fois cette action effectuée, aucun retour en arrière n'est possible ! Êtes-vous sûr·e ?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "Niveau d'autorisation par défaut pour les arrivants", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "delete": "Supprimer", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "Supprimer le compte", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "Supprimer le message", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "device": "Appareil", + "@device": { + "type": "String", + "placeholders": {} + }, + "deviceId": "Identifiant de l'appareil", + "@deviceId": { + "type": "String", + "placeholders": {} + }, + "devices": "Appareils", + "@devices": { + "type": "String", + "placeholders": {} + }, + "directChats": "Discussions directes", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "Renommage effectué", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "Télécharger le fichier", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "edit": "Modifier", + "@edit": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "Modifier les serveurs bloqués", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "editDisplayname": "Changer de nom d'affichage", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "editRoomAliases": "Modifier les adresses du salon", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "Modifier l'avatar du salon", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "Cette émoticône existe déjà !", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "Raccourci d'émoticône invalide !", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emotePacks": "Packs d'émoticônes pour le salon", + "@emotePacks": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "Paramètre des émoticônes", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "emoteShortcode": "Raccourci de l'émoticône", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emoteWarnNeedToPick": "Vous devez sélectionner un raccourci d'émoticône et une image !", + "@emoteWarnNeedToPick": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "Discussion vide", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "Activer globalement le pack d'émoticônes", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "Activer le chiffrement", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "Vous ne pourrez plus désactiver le chiffrement. Êtes-vous sûr(e) ?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "encrypted": "Chiffré", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "encryption": "Chiffrement", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "Le chiffrement n'est pas activé", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName} a mis fin à l'appel", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "enterAnEmailAddress": "Saisissez une adresse de courriel", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "enterYourHomeserver": "Renseignez votre serveur d'accueil", + "@enterYourHomeserver": { + "type": "String", + "placeholders": {} + }, + "errorObtainingLocation": "Erreur lors de l'obtention de la localisation : {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "everythingReady": "Tout est prêt !", + "@everythingReady": { + "type": "String", + "placeholders": {} + }, + "extremeOffensive": "Extrêmement offensant", + "@extremeOffensive": { + "type": "String", + "placeholders": {} + }, + "fileName": "Nom du ficher", + "@fileName": { + "type": "String", + "placeholders": {} + }, + "fluffychat": "Extera", + "@fluffychat": { + "type": "String", + "placeholders": {} + }, + "fontSize": "Taille de la police", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "forward": "Transférer", + "@forward": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "À partir de l'entrée dans le salon", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "À partir de l'invitation", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "goToTheNewRoom": "Aller dans le nouveau salon", + "@goToTheNewRoom": { + "type": "String", + "placeholders": {} + }, + "group": "Groupe", + "@group": { + "type": "String", + "placeholders": {} + }, + "groupIsPublic": "Le groupe est public", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "groups": "Groupes", + "@groups": { + "type": "String", + "placeholders": {} + }, + "groupWith": "Groupe avec {displayname}", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "guestsAreForbidden": "Les invités ne peuvent pas rejoindre", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "Les invités peuvent rejoindre", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{username} a annulé l'invitation de {targetName}", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "help": "Aide", + "@help": { + "type": "String", + "placeholders": {} + }, + "hideRedactedEvents": "Cacher les évènements supprimés", + "@hideRedactedEvents": { + "type": "String", + "placeholders": {} + }, + "hideUnknownEvents": "Cacher les évènements inconnus", + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "howOffensiveIsThisContent": "À quel point ce contenu est-il offensant ?", + "@howOffensiveIsThisContent": { + "type": "String", + "placeholders": {} + }, + "id": "Identifiant", + "@id": { + "type": "String", + "placeholders": {} + }, + "identity": "Identité", + "@identity": { + "type": "String", + "placeholders": {} + }, + "ignore": "Ignorer", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "ignoredUsers": "Utilisateur·ices ignoré·es", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "iHaveClickedOnLink": "J'ai cliqué sur le lien", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "Phrase de passe ou clé de récupération incorrecte", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "inoffensive": "Non offensant", + "@inoffensive": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "Inviter un contact", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "Inviter un contact dans {groupName}", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "invited": "Invité·e", + "@invited": { + "type": "String", + "placeholders": {} + }, + "invitedUser": "📩 {username} a invité {targetName}", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "invitedUsersOnly": "Uniquement les utilisateur·ices invité·es", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "inviteForMe": "Inviter pour moi", + "@inviteForMe": { + "type": "String", + "placeholders": {} + }, + "inviteText": "{username} vous a invité·e sur Extera.\n1. Visiter fluffychat.im et installer l'application\n2. Inscrivez-vous ou connectez-vous\n3. Ouvrez le lien d'invitation :\n{link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "isTyping": "est en train d'écrire…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "👋 {username} a rejoint la discussion", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "joinRoom": "Rejoindre le salon", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "kicked": "👞 {username} a expulsé {targetName}", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickedAndBanned": "🙅 {username} a expulsé et banni {targetName}", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickFromChat": "Expulser de la discussion", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "Vu·e pour la dernière fois : {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "leave": "Partir", + "@leave": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "A quitté la discussion", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "license": "Licence", + "@license": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "Clair", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "Charger {count} participant·es de plus", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "loadingPleaseWait": "Chargement… Veuillez patienter.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "loadMore": "Charger plus…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "locationDisabledNotice": "Les services de localisation sont désactivés. Il est nécessaire de les activer avant de pouvoir partager votre localisation.", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "locationPermissionDeniedNotice": "L'application n'a pas la permission d'accéder à votre localisation. Merci de l'accorder afin de pouvoir partager votre localisation.", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "login": "Se connecter", + "@login": { + "type": "String", + "placeholders": {} + }, + "logInTo": "Se connecter à {homeserver}", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "logout": "Se déconnecter", + "@logout": { + "type": "String", + "placeholders": {} + }, + "memberChanges": "Changements de membres", + "@memberChanges": { + "type": "String", + "placeholders": {} + }, + "mention": "Mentionner", + "@mention": { + "type": "String", + "placeholders": {} + }, + "messages": "Messages", + "@messages": { + "type": "String", + "placeholders": {} + }, + "moderator": "Modérateur·rice", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "muteChat": "Mettre la discussion en sourdine", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "needPantalaimonWarning": "Pour l'instant, vous avez besoin de Pantalaimon pour utiliser le chiffrement de bout en bout.", + "@needPantalaimonWarning": { + "type": "String", + "placeholders": {} + }, + "newChat": "Nouvelle discussion", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "💬 Nouveau message dans Extera", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "Nouvelle demande de vérification !", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "next": "Suivant", + "@next": { + "type": "String", + "placeholders": {} + }, + "no": "Non", + "@no": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "Aucune connexion au serveur", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "Aucune émoticône trouvée. 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "Vous pouvez activer le chiffrement seulement quand le salon n'est plus accessible au public.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "Firebase Cloud Messaging ne semble pas être disponible sur votre appareil. Pour continuer à recevoir des notifications poussées, nous vous recommandons d'installer ntfy. Avec ntfy ou un autre fournisseur Unified Push, vous pouvez recevoir des notifications poussées de manière sécurisée. Vous pouvez télécharger ntfy sur le PlayStore ou sur F-Droid.", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "noMatrixServer": "{server1} n'est pas un serveur Matrix, souhaitez-vous utiliser {server2} à la place ?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "none": "Aucun", + "@none": { + "type": "String", + "placeholders": {} + }, + "noPasswordRecoveryDescription": "Vous n'avez pas encore ajouté de moyen pour récupérer votre mot de passe.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "noPermission": "Aucune permission", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "Aucun salon trouvé…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "notifications": "Notifications", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "notificationsEnabledForThisAccount": "Notifications activées pour ce compte", + "@notificationsEnabledForThisAccount": { + "type": "String", + "placeholders": {} + }, + "numUsersTyping": "{count} utilisateur·ices écrivent…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "obtainingLocation": "Obtention de la localisation…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "offensive": "Offensant", + "@offensive": { + "type": "String", + "placeholders": {} + }, + "offline": "Hors ligne", + "@offline": { + "type": "String", + "placeholders": {} + }, + "ok": "Valider", + "@ok": { + "type": "String", + "placeholders": {} + }, + "online": "En ligne", + "@online": { + "type": "String", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "La sauvegarde en ligne des clés est activée", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "oopsPushError": "Oups ! Une erreur s'est malheureusement produite lors du réglage des notifications.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "Oups, un problème est survenu…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "Ouvrez l'application pour lire le message", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "openCamera": "Ouvrir l'appareil photo", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "openInMaps": "Ouvrir dans maps", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "or": "Ou", + "@or": { + "type": "String", + "placeholders": {} + }, + "participant": "Participant(e)", + "@participant": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "Phrase de passe ou clé de récupération", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "password": "Mot de passe", + "@password": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "Mot de passe oublié", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "Le mot de passe a été modifié", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "passwordRecovery": "Récupération du mot de passe", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "people": "Personnes", + "@people": { + "type": "String", + "placeholders": {} + }, + "pickImage": "Choisir une image", + "@pickImage": { + "type": "String", + "placeholders": {} + }, + "pin": "Épingler", + "@pin": { + "type": "String", + "placeholders": {} + }, + "play": "Lire {fileName}", + "@play": { + "type": "String", + "placeholders": { + "fileName": { + "type": "String" + } + } + }, + "pleaseChoose": "Veuillez choisir", + "@pleaseChoose": { + "type": "String", + "placeholders": {} + }, + "pleaseChooseAPasscode": "Veuillez choisir un code d’accès", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "pleaseClickOnLink": "Veuillez cliquer sur le lien contenu dans le courriel puis continuez.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "pleaseEnter4Digits": "Veuillez saisir 4 chiffres ou laisser vide pour désactiver le verrouillage de l’application.", + "@pleaseEnter4Digits": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPassword": "Renseignez votre mot de passe", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPin": "Veuillez saisir votre code PIN", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "Renseignez votre nom d'utilisateur·ice", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "Veuillez suivre les instructions sur le site et appuyer sur Suivant.", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "privacy": "Vie privée", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "Salons publics", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "pushRules": "Règles de notifications", + "@pushRules": { + "type": "String", + "placeholders": {} + }, + "reason": "Motif", + "@reason": { + "type": "String", + "placeholders": {} + }, + "recording": "Enregistrement", + "@recording": { + "type": "String", + "placeholders": {} + }, + "redactedAnEvent": "{username} a supprimé un évènement", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "redactMessage": "Supprimer un message", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "register": "S'inscrire", + "@register": { + "type": "String", + "placeholders": {} + }, + "reject": "Refuser", + "@reject": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "{username} a refusé l'invitation", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "rejoin": "Rejoindre de nouveau", + "@rejoin": { + "type": "String", + "placeholders": {} + }, + "remove": "Supprimer", + "@remove": { + "type": "String", + "placeholders": {} + }, + "removeAllOtherDevices": "Supprimer tous les autres appareils", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "removedBy": "Supprimé par {username}", + "@removedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "removeDevice": "Supprimer l'appareil", + "@removeDevice": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "Débannissement de la discussion", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "removeYourAvatar": "Supprimer votre avatar", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "renderRichContent": "Afficher les contenus riches des messages", + "@renderRichContent": { + "type": "String", + "placeholders": {} + }, + "replaceRoomWithNewerVersion": "Remplacer le salon par une nouvelle version", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "reply": "Répondre", + "@reply": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "Signaler un message", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "requestPermission": "Demander la permission", + "@requestPermission": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "Le salon a été mis à niveau", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "Version du salon", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "saveFile": "Enregistrer le fichier", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "search": "Rechercher", + "@search": { + "type": "String", + "placeholders": {} + }, + "security": "Sécurité", + "@security": { + "type": "String", + "placeholders": {} + }, + "seenByUser": "Vu par {username}", + "@seenByUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "send": "Envoyer", + "@send": { + "type": "String", + "placeholders": {} + }, + "sendAMessage": "Envoyer un message", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "sendAsText": "Envoyer un texte", + "@sendAsText": { + "type": "String" + }, + "sendAudio": "Envoyer un fichier audio", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendFile": "Envoyer un fichier", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendImage": "Envoyer une image", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendMessages": "Envoyer des messages", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "sendOriginal": "Envoyer le fichier original", + "@sendOriginal": { + "type": "String", + "placeholders": {} + }, + "sendSticker": "Envoyer un autocollant", + "@sendSticker": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "Envoyer une vidéo", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "sentAFile": "📁 {username} a envoyé un fichier", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAnAudio": "🎤 {username} a envoyé un fichier audio", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAPicture": "🖼️ {username} a envoyé une image", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentASticker": "😊 {username} a envoyé un autocollant", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "🎥 {username} a envoyé une vidéo", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentCallInformations": "{senderName} a envoyé des informations sur l'appel", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "setAsCanonicalAlias": "Définir comme adresse principale", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "setCustomEmotes": "Définir des émoticônes personnalisées", + "@setCustomEmotes": { + "type": "String", + "placeholders": {} + }, + "setInvitationLink": "Créer un lien d'invitation", + "@setInvitationLink": { + "type": "String", + "placeholders": {} + }, + "setPermissionsLevel": "Définir le niveau de permissions", + "@setPermissionsLevel": { + "type": "String", + "placeholders": {} + }, + "setStatus": "Définir le statut", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "settings": "Paramètres", + "@settings": { + "type": "String", + "placeholders": {} + }, + "share": "Partager", + "@share": { + "type": "String", + "placeholders": {} + }, + "sharedTheLocation": "{username} a partagé sa position", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "shareLocation": "Partager la localisation", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "showPassword": "Afficher le mot de passe", + "@showPassword": { + "type": "String", + "placeholders": {} + }, + "singlesignon": "Authentification unique", + "@singlesignon": { + "type": "String", + "placeholders": {} + }, + "skip": "Ignorer", + "@skip": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "Code source", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "spaceIsPublic": "L'espace est public", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "spaceName": "Nom de l'espace", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "startedACall": "{senderName} a démarré un appel", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "status": "Statut", + "@status": { + "type": "String", + "placeholders": {} + }, + "statusExampleMessage": "Comment allez-vous aujourd'hui ?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "submit": "Soumettre", + "@submit": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWait": "Synchronisation... Veuillez patienter.", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "systemTheme": "Système", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "Elles ne correspondent pas", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "Elles correspondent", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "title": "Extera", + "@title": { + "description": "Title for the application", + "type": "String", + "placeholders": {} + }, + "toggleFavorite": "Activer/désactiver en favori", + "@toggleFavorite": { + "type": "String", + "placeholders": {} + }, + "toggleMuted": "Activer/désactiver la sourdine", + "@toggleMuted": { + "type": "String", + "placeholders": {} + }, + "toggleUnread": "Marquer comme lu / non lu", + "@toggleUnread": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "Trop de requêtes. Veuillez réessayer plus tard !", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "transferFromAnotherDevice": "Transfert à partir d'un autre appareil", + "@transferFromAnotherDevice": { + "type": "String", + "placeholders": {} + }, + "tryToSendAgain": "Retenter l'envoi", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "unavailable": "Indisponible", + "@unavailable": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username} a annulé le bannissement de {targetName}", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "unblockDevice": "Retirer le blocage sur l'appareil", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "Appareil inconnu", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "unknownEncryptionAlgorithm": "Algorithme de chiffrement inconnu", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unknownEvent": "Événement de type inconnu : '{type}'", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "unmuteChat": "Retirer la sourdine de la discussion", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "unpin": "Désépingler", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "unreadChats": "{unreadCount, plural, =1{1 discussion non lue} other{{unreadCount} discussions non lues}}", + "@unreadChats": { + "type": "String", + "placeholders": { + "unreadCount": { + "type": "int" + } + } + }, + "userAndOthersAreTyping": "{username} et {count} autres sont en train d'écrire…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "userAndUserAreTyping": "{username} et {username2} sont en train d'écrire…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userIsTyping": "{username} est en train d'écrire…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userLeftTheChat": "🚪 {username} a quitté la discussion", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "username": "Nom d'utilisateur·ice", + "@username": { + "type": "String", + "placeholders": {} + }, + "userSentUnknownEvent": "{username} a envoyé un évènement de type {type}", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "verified": "Vérifié", + "@verified": { + "type": "String", + "placeholders": {} + }, + "verify": "Vérifier", + "@verify": { + "type": "String", + "placeholders": {} + }, + "verifyStart": "Commencer la vérification", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "La vérification a été effectuée avec succès !", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "verifyTitle": "Vérification de l'autre compte", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "videoCall": "Appel vidéo", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "Visibilité de l'historique de la discussion", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "Visible pour tous les participant·es", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "Visible pour tout le monde", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "Message vocal", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "En attente de l'acceptation de la demande par le partenaire…", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "En attente de l'acceptation de l'émoji par le partenaire…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "En attente de l'acceptation des nombres par le partenaire…", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "wallpaper": "Image de fond :", + "@wallpaper": { + "type": "String", + "placeholders": {} + }, + "warning": "Attention !", + "@warning": { + "type": "String", + "placeholders": {} + }, + "weSentYouAnEmail": "Nous vous avons envoyé un courriel", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "whoCanPerformWhichAction": "Qui peut faire quelle action", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "Qui est autorisé·e à rejoindre ce groupe", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "Pourquoi voulez-vous le signaler ?", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "wipeChatBackup": "Effacer la sauvegarde de votre discussion pour créer une nouvelle clé de récupération ?", + "@wipeChatBackup": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "Grâce à ces adresses, vous pouvez récupérer votre mot de passe si vous en avez besoin.", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "Écrivez un message…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "yes": "Oui", + "@yes": { + "type": "String", + "placeholders": {} + }, + "you": "Vous", + "@you": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "Vous ne participez plus à cette discussion", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "Vous avez été banni·e de cette discussion", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "yourPublicKey": "Votre clé publique", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "scanQrCode": "Scanner un code QR", + "@scanQrCode": {}, + "sendOnEnter": "Envoyer avec Entrée", + "@sendOnEnter": {}, + "homeserver": "Serveur d'accueil", + "@homeserver": {}, + "serverRequiresEmail": "Ce serveur doit valider votre adresse électronique pour l'inscription.", + "@serverRequiresEmail": {}, + "enableMultiAccounts": "(BETA) Activer les comptes multiples sur cet appareil", + "@enableMultiAccounts": {}, + "bundleName": "Nom du groupe", + "@bundleName": {}, + "removeFromBundle": "Retirer de ce groupe", + "@removeFromBundle": {}, + "addToBundle": "Ajouter au groupe", + "@addToBundle": {}, + "editBundlesForAccount": "Modifier les groupes pour ce compte", + "@editBundlesForAccount": {}, + "addAccount": "Ajouter un compte", + "@addAccount": {}, + "oneClientLoggedOut": "Un de vos clients a été déconnecté", + "@oneClientLoggedOut": {}, + "link": "Lien", + "@link": {}, + "yourChatBackupHasBeenSetUp": "Votre sauvegarde de la discussion a été mise en place.", + "@yourChatBackupHasBeenSetUp": {}, + "unverified": "Non vérifié", + "@unverified": {}, + "repeatPassword": "Répétez le mot de passe", + "@repeatPassword": {}, + "messageType": "Type de message", + "@messageType": {}, + "openGallery": "Ouvrir dans la Galerie", + "@openGallery": {}, + "time": "Heure", + "@time": {}, + "sender": "Expéditeur/trice", + "@sender": {}, + "messageInfo": "Informations sur le message", + "@messageInfo": {}, + "removeFromSpace": "Supprimer de l’espace", + "@removeFromSpace": {}, + "addToSpaceDescription": "Sélectionnez un espace pour y ajouter cette discussion.", + "@addToSpaceDescription": {}, + "start": "Commencer", + "@start": {}, + "commandHint_create": "Créer un groupe de discussion vide\nUtilisez --no-encryption pour désactiver le chiffrement", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "commandHint_discardsession": "Abandonner la session", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "commandHint_clearcache": "Vider le cache", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_dm": "Commencer une discussion directe\nUtilisez --no-encryption pour désactiver le chiffrement", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "openVideoCamera": "Ouvrir la caméra pour une vidéo", + "@openVideoCamera": { + "type": "String", + "placeholders": {} + }, + "publish": "Publier", + "@publish": {}, + "videoWithSize": "Vidéo ({size})", + "@videoWithSize": { + "type": "String", + "placeholders": { + "size": { + "type": "String" + } + } + }, + "dismiss": "Rejeter", + "@dismiss": {}, + "markAsRead": "Marquer comme lu", + "@markAsRead": {}, + "reportUser": "Signaler l'utilisateur/trice", + "@reportUser": {}, + "openChat": "Ouvrir la discussion", + "@openChat": {}, + "reactedWith": "{sender} a réagi avec {reaction}", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "emojis": "Émojis", + "@emojis": {}, + "placeCall": "Passer un appel", + "@placeCall": {}, + "voiceCall": "Appel vocal", + "@voiceCall": {}, + "unsupportedAndroidVersion": "Version d'Android non prise en charge", + "@unsupportedAndroidVersion": {}, + "unsupportedAndroidVersionLong": "Cette fonctionnalité nécessite une nouvelle version d'Android. Veuillez vérifier les mises à jour ou la prise en charge de Lineage OS.", + "@unsupportedAndroidVersionLong": {}, + "pinMessage": "Épingler au salon", + "@pinMessage": {}, + "confirmEventUnpin": "Voulez-vous vraiment désépingler définitivement l'événement ?", + "@confirmEventUnpin": {}, + "videoCallsBetaWarning": "Veuillez noter que les appels vidéo sont actuellement en version bêta. Ils peuvent ne pas fonctionner comme prévu ou ne oas fonctionner du tout sur toutes les plateformes.", + "@videoCallsBetaWarning": {}, + "experimentalVideoCalls": "Appels vidéo expérimentaux", + "@experimentalVideoCalls": {}, + "emailOrUsername": "Courriel ou identifiant", + "@emailOrUsername": {}, + "switchToAccount": "Passer au compte {number}", + "@switchToAccount": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "nextAccount": "Compte suivant", + "@nextAccount": {}, + "previousAccount": "Compte précédent", + "@previousAccount": {}, + "widgetJitsi": "Jitsi Meet", + "@widgetJitsi": {}, + "widgetCustom": "Personnalisé", + "@widgetCustom": {}, + "widgetUrlError": "Ceci n'est pas un lien valide.", + "@widgetUrlError": {}, + "widgetNameError": "Veuillez fournir un nom d'affichage.", + "@widgetNameError": {}, + "errorAddingWidget": "Erreur lors de l'ajout du widget.", + "@errorAddingWidget": {}, + "widgetEtherpad": "Note textuelle", + "@widgetEtherpad": {}, + "addWidget": "Ajouter un widget", + "@addWidget": {}, + "widgetName": "Nom", + "@widgetName": {}, + "widgetVideo": "Vidéo", + "@widgetVideo": {}, + "youRejectedTheInvitation": "Vous avez rejeté l'invitation", + "@youRejectedTheInvitation": {}, + "youJoinedTheChat": "Vous avez rejoint la discussion", + "@youJoinedTheChat": {}, + "youHaveWithdrawnTheInvitationFor": "Vous avez retiré l'invitation pour {user}", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youAcceptedTheInvitation": "👍 Vous avez accepté l'invitation", + "@youAcceptedTheInvitation": {}, + "youBannedUser": "Vous avez banni {user}", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedBy": "📩 Vous avez été invité par {user}", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedUser": "📩 Vous avez invité {user}", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKicked": "👞 Vous avez dégagé {user}", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKickedAndBanned": "🙅 Vous avez dégagé et banni {user}", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youUnbannedUser": "Vous avez débanni {user}", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "separateChatTypes": "Séparer les discussions directes et les groupes", + "@separateChatTypes": { + "type": "String", + "placeholders": {} + }, + "users": "Utilisateurs/trices", + "@users": {}, + "storeInAndroidKeystore": "Stocker dans Android KeyStore", + "@storeInAndroidKeystore": {}, + "storeInAppleKeyChain": "Stocker dans Apple KeyChain", + "@storeInAppleKeyChain": {}, + "user": "Utilisateur/trice", + "@user": {}, + "custom": "Personnalisé", + "@custom": {}, + "hydrate": "Restaurer à partir du fichier de sauvegarde", + "@hydrate": {}, + "dehydrateWarning": "Cette action ne peut pas être annulée. Assurez-vous d'enregistrer convenablement le fichier de sauvegarde.", + "@dehydrateWarning": {}, + "dehydrateTorLong": "Pour les utilisateurs/trices de TOR, il est recommandé d'exporter la session avant de fermer la fenêtre.", + "@dehydrateTorLong": {}, + "recoveryKey": "Clé de récupération", + "@recoveryKey": {}, + "recoveryKeyLost": "Clé de récupération perdue ?", + "@recoveryKeyLost": {}, + "indexedDbErrorLong": "Le stockage des messages n'est malheureusement pas activé par défaut en mode privé.\nVeuillez consulter :\n - about:config\n - Définir dom.indexedDB.privateBrowsing.enabled à « vrai ».\nSinon, il n'est pas possible d'exécuter Extera.", + "@indexedDbErrorLong": {}, + "saveKeyManuallyDescription": "Enregistrer cette clé manuellement en déclenchant la boîte de dialogue de partage du système ou le presse-papiers.", + "@saveKeyManuallyDescription": {}, + "storeInSecureStorageDescription": "Stocker la clé de récupération dans un espace sécurisé de cet appareil.", + "@storeInSecureStorageDescription": {}, + "indexedDbErrorTitle": "Problèmes relatifs au mode privé", + "@indexedDbErrorTitle": {}, + "dehydrate": "Exporter la session et effacer l'appareil", + "@dehydrate": {}, + "dehydrateTor": "Utilisateurs/trices de TOR : Exporter la session", + "@dehydrateTor": {}, + "hydrateTor": "Utilisateurs/trices de TOR : Importer une session exportée", + "@hydrateTor": {}, + "hydrateTorLong": "Vous avez exporté votre session la dernière fois sur TOR ? Importez-la rapidement et continuez à discuter.", + "@hydrateTorLong": {}, + "pleaseEnterRecoveryKey": "Veuillez saisir votre clé de récupération :", + "@pleaseEnterRecoveryKey": {}, + "pleaseEnterRecoveryKeyDescription": "Pour déverrouiller vos anciens messages, veuillez entrer votre clé de récupération qui a été générée lors d'une session précédente. Votre clé de récupération n'est PAS votre mot de passe.", + "@pleaseEnterRecoveryKeyDescription": {}, + "unlockOldMessages": "Déverrouiller les anciens messages", + "@unlockOldMessages": {}, + "storeSecurlyOnThisDevice": "Stocker de manière sécurisé sur cet appareil", + "@storeSecurlyOnThisDevice": {}, + "countFiles": "{count} fichiers", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "noKeyForThisMessage": "Cela peut se produire si le message a été envoyé avant que vous ne vous soyez connecté à votre compte sur cet appareil.\n\nIl est également possible que l'expéditeur ait bloqué votre appareil ou qu'un problème de connexion Internet se soit produit.\n\nÊtes-vous capable de lire le message sur une autre session ? Vous pouvez alors transférer le message à partir de celle-ci ! Allez dans Paramètres > Appareils et assurez-vous que vos appareils se sont vérifiés mutuellement. Lorsque vous ouvrirez le salon la fois suivante et que les deux sessions seront au premier plan, les clés seront transmises automatiquement.\n\nVous ne voulez pas perdre les clés en vous déconnectant ou en changeant d'appareil ? Assurez-vous que vous avez activé la sauvegarde de la discussion dans les paramètres.", + "@noKeyForThisMessage": {}, + "enterRoom": "Entrer dans le salon", + "@enterRoom": {}, + "allSpaces": "Tous les espaces", + "@allSpaces": {}, + "commandHint_markasdm": "Marquer comme salon de messages directs pour l'identifiant Matrix indiqué", + "@commandHint_markasdm": {}, + "commandHint_markasgroup": "Marquer comme groupe", + "@commandHint_markasgroup": {}, + "confirmMatrixId": "Veuillez confirmer votre identifiant Matrix afin de supprimer votre compte.", + "@confirmMatrixId": {}, + "supposedMxid": "Cela devrait être {mxid}", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "whyIsThisMessageEncrypted": "Pourquoi ce message est-il illisible ?", + "@whyIsThisMessageEncrypted": {}, + "foregroundServiceRunning": "Cette notification s’affiche lorsque le service au premier plan est en cours d’exécution.", + "@foregroundServiceRunning": {}, + "screenSharingTitle": "Partage d'écran", + "@screenSharingTitle": {}, + "screenSharingDetail": "Vous partagez votre écran dans FuffyChat", + "@screenSharingDetail": {}, + "callingPermissions": "Permissions d'appel", + "@callingPermissions": {}, + "callingAccount": "Compte d'appel", + "@callingAccount": {}, + "callingAccountDetails": "Permet à Extera d'utiliser l'application de numérotation native d'Android.", + "@callingAccountDetails": {}, + "appearOnTop": "Apparaître en haut", + "@appearOnTop": {}, + "appearOnTopDetails": "Permet à l'application d'apparaître en haut de l'écran (non nécessaire si vous avez déjà configuré Fluffychat comme compte d'appel)", + "@appearOnTopDetails": {}, + "otherCallingPermissions": "Microphone, caméra et autres autorisations de Extera", + "@otherCallingPermissions": {}, + "newGroup": "Nouveau groupe", + "@newGroup": {}, + "newSpace": "Nouvel espace", + "@newSpace": {}, + "enterSpace": "Entrer dans l’espace", + "@enterSpace": {}, + "numChats": "{number} discussions", + "@numChats": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "hideUnimportantStateEvents": "Masquer les événements d'état sans importance", + "@hideUnimportantStateEvents": {}, + "doNotShowAgain": "Ne plus afficher", + "@doNotShowAgain": {}, + "commandHint_googly": "Envoyer des yeux écarquillés", + "@commandHint_googly": {}, + "commandHint_cuddle": "Envoyer un câlin", + "@commandHint_cuddle": {}, + "commandHint_hug": "Envoyer une accolade", + "@commandHint_hug": {}, + "googlyEyesContent": "{senderName} vous envoie des yeux écarquillés", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "cuddleContent": "{senderName} vous fait un câlin", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "hugContent": "{senderName} vous fait une accolade", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "wasDirectChatDisplayName": "Discussion vide (était {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "encryptThisChat": "Chiffrer cette discussion", + "@encryptThisChat": {}, + "sorryThatsNotPossible": "Désolé, ce n'est pas possible", + "@sorryThatsNotPossible": {}, + "deviceKeys": "Clés de l’appareil :", + "@deviceKeys": {}, + "startFirstChat": "Commencez votre première discussion", + "@startFirstChat": {}, + "newSpaceDescription": "Les espaces vous permettent de consolider vos conversations et de construire des communautés privées ou publiques.", + "@newSpaceDescription": {}, + "disableEncryptionWarning": "Pour des raisons de sécurité, vous ne pouvez pas désactiver le chiffrement dans une discussion s'il a été activé avant.", + "@disableEncryptionWarning": {}, + "reopenChat": "Rouvrir la discussion", + "@reopenChat": {}, + "noOtherDevicesFound": "Aucun autre appareil trouvé", + "@noOtherDevicesFound": {}, + "noBackupWarning": "Attention ! Sans l'activation de la sauvegarde de la discussion, vous perdrez l'accès à vos messages chiffrés. Il est fortement recommandé d'activer la sauvegarde de la discussion avant de se déconnecter.", + "@noBackupWarning": {}, + "fileHasBeenSavedAt": "Le fichier a été enregistré dans {path}", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "fileIsTooBigForServer": "Impossible d'envoyer ! Le serveur accepte uniquement les pièces jointes jusqu'à {max}.", + "@fileIsTooBigForServer": {}, + "jumpToLastReadMessage": "Aller au dernier message lu", + "@jumpToLastReadMessage": {}, + "readUpToHere": "Lisez jusqu’ici", + "@readUpToHere": {}, + "allRooms": "Tous les groupes de discussion", + "@allRooms": { + "type": "String", + "placeholders": {} + }, + "chatPermissions": "Permissions du salon", + "@chatPermissions": {}, + "importFromZipFile": "Importer depuis un fichier .zip", + "@importFromZipFile": {}, + "inviteContactToGroupQuestion": "Voulez-vous inviter {contact} au salon \"{groupName}\" ?", + "@inviteContactToGroupQuestion": {}, + "importEmojis": "Importer des Emojis", + "@importEmojis": {}, + "notAnImage": "Pas un fichier image.", + "@notAnImage": {}, + "chatDescriptionHasBeenChanged": "La description du salon a changé", + "@chatDescriptionHasBeenChanged": {}, + "createGroup": "Créer un groupe", + "@createGroup": {}, + "importNow": "Importer maintenant", + "@importNow": {}, + "tryAgain": "Nouvelle tentative", + "@tryAgain": {}, + "blockedUsers": "Utilisateurs/trices bloqués", + "@blockedUsers": {}, + "redactMessageDescription": "Le message sera modifié pour tous les participants de cette conversation. Il n'est pas possible de revenir en arrière.", + "@redactMessageDescription": {}, + "redactedBy": "Modifié par {username}", + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "directChat": "Discussion directe", + "@directChat": {}, + "optionalRedactReason": "(Facultatif) Raison de la modification de ce message...", + "@optionalRedactReason": {}, + "subspace": "Sous-espace", + "@subspace": {}, + "sendTypingNotifications": "Envoyer des notifications de frappe", + "@sendTypingNotifications": {}, + "replace": "Remplacer", + "@replace": {}, + "emoteKeyboardNoRecents": "Les émoticônes récemment utilisées apparaîtront ici...", + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "nothingFound": "Rien n'a été trouvé...", + "@nothingFound": {}, + "chatDescription": "Description de la discussion", + "@chatDescription": {}, + "invalidServerName": "Nom de serveur invalide", + "@invalidServerName": {}, + "addChatDescription": "Ajouter une description à la discussion...", + "@addChatDescription": {}, + "shareInviteLink": "Partager un lien d'invitation", + "@shareInviteLink": {}, + "openLinkInBrowser": "Ouvrir le lien dans le navigateur", + "@openLinkInBrowser": {}, + "setTheme": "Définir le thème :", + "@setTheme": {}, + "setColorTheme": "Définir la couleur du thème :", + "@setColorTheme": {}, + "databaseMigrationBody": "Veuillez patienter. Cela peut prendre un moment.", + "@databaseMigrationBody": {}, + "searchForUsers": "Rechercher des @utilisateurs/trices...", + "@searchForUsers": {}, + "passwordsDoNotMatch": "Les mots de passe ne correspondent pas", + "@passwordsDoNotMatch": {}, + "passwordIsWrong": "Votre mot de passe saisi est erroné", + "@passwordIsWrong": {}, + "publicLink": "Lien public", + "@publicLink": {}, + "joinSpace": "Rejoindre l'espace", + "@joinSpace": {}, + "publicSpaces": "Espaces publics", + "@publicSpaces": {}, + "addChatOrSubSpace": "Ajouter une discussion ou un sous-espace", + "@addChatOrSubSpace": {}, + "thisDevice": "Cet appareil :", + "@thisDevice": {}, + "sendReadReceipts": "Envoyer des accusés de réception", + "@sendReadReceipts": {}, + "sendTypingNotificationsDescription": "Les autres participants à une discussion peuvent voir que vous êtes en train de taper un nouveau message.", + "@sendTypingNotificationsDescription": {}, + "verifyOtherDevice": "🔐 Vérifier l'autre appareil", + "@verifyOtherDevice": {}, + "databaseBuildErrorBody": "La base de données SQlite ne peut pas être créée. L'application essaie d'utiliser la base de données existante pour le moment. Veuillez signaler cette erreur aux développeurs à {url}. Le message d'erreur est le suivant : {error}", + "@databaseBuildErrorBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "startConversation": "Démarrer la conversation", + "@startConversation": {}, + "formattedMessagesDescription": "Affichez le contenu formaté des messages comme du texte en gras à l'aide de markdown.", + "@formattedMessagesDescription": {}, + "incomingMessages": "Messages entrants", + "@incomingMessages": {}, + "acceptedKeyVerification": "{sender} a accepté la vérification de clé", + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "pleaseTryAgainLaterOrChooseDifferentServer": "Veuillez réessayer plus tard ou choisir un autre serveur.", + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "inviteGroupChat": "📨 Inviter à une discussion de groupe", + "@inviteGroupChat": {}, + "invitePrivateChat": "📨 Inviter à une discussion privée", + "@invitePrivateChat": {}, + "jump": "Sauter", + "@jump": {}, + "signInWithPassword": "Se connecter avec mot de passe", + "@signInWithPassword": {}, + "hideMemberChangesInPublicChats": "Masquer les modifications de membres dans les discussions publiques", + "@hideMemberChangesInPublicChats": {}, + "hideMemberChangesInPublicChatsBody": "Ne pas afficher dans la chronologie de la discussion si quelqu'un rejoint ou quitte une discussion publique afin d'améliorer la lisibilité.", + "@hideMemberChangesInPublicChatsBody": {}, + "overview": "Aperçu", + "@overview": {}, + "notifyMeFor": "Me notifier pour", + "@notifyMeFor": {}, + "passwordRecoverySettings": "Paramètres de récupération de mot de passe", + "@passwordRecoverySettings": {}, + "hasKnocked": "🚪 {user} a frappé", + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "canceledKeyVerification": "{sender} a annulé la vérification de clé", + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "unreadChatsInApp": "{appname} : {unread} discussions non lus", + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "requestedKeyVerification": "{sender} a demandé une vérification de clé", + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "startedKeyVerification": "{sender} a lancé la vérification de clé", + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "discover": "Découvrir", + "@discover": {}, + "usersMustKnock": "Les utilisateurs/trices doivent frapper", + "@usersMustKnock": {}, + "noOneCanJoin": "Personne ne peut rejoindre", + "@noOneCanJoin": {}, + "knock": "Frapper à la porte", + "@knock": {}, + "hidePresences": "Cacher la liste des statuts ?", + "@hidePresences": {}, + "appLockDescription": "Verrouiller l'application avec un code PIN lorsqu'elle n'est pas utilisée", + "@appLockDescription": {}, + "globalChatId": "Identifiant global de la discussion", + "@globalChatId": {}, + "accessAndVisibility": "Accès et visibilité", + "@accessAndVisibility": {}, + "accessAndVisibilityDescription": "Qui est autorisé à rejoindre cette discussion et comment la discussion peut être découverte.", + "@accessAndVisibilityDescription": {}, + "calls": "Appels", + "@calls": {}, + "customEmojisAndStickers": "Émoticônes et autocollants personnalisés", + "@customEmojisAndStickers": {}, + "hideRedactedMessages": "Cacher les messages édités", + "@hideRedactedMessages": {}, + "pleaseEnterYourCurrentPassword": "Veuillez saisir votre mot de passe actuel", + "@pleaseEnterYourCurrentPassword": {}, + "swipeRightToLeftToReply": "Glisser de droite à gauche pour répondre", + "@swipeRightToLeftToReply": {}, + "alwaysUse24HourFormat": "true", + "@alwaysUse24HourFormat": { + "description": "Set to true to always display time of day in 24 hour format." + }, + "hideRedactedMessagesBody": "Si quelqu'un modifie un message, celui-ci ne sera plus visible dans la discussion.", + "@hideRedactedMessagesBody": {}, + "customEmojisAndStickersBody": "Ajoutez ou partagez des émoticônes ou autocollants personnalisés qui peuvent être utilisés dans n'importe quelle discussion.", + "@customEmojisAndStickersBody": {}, + "blockListDescription": "Vous pouvez bloquer des utilisateurs/trices qui vous dérangent. Vous ne pourrez plus recevoir aucun message ou invitation à un salon d'utilisateurs/trices figurant sur votre liste de blocage personnelle.", + "@blockListDescription": {}, + "blockUsername": "Ignorer le nom d'utilisateur/trice", + "@blockUsername": {}, + "hideInvalidOrUnknownMessageFormats": "Masquer les formats de message invalides ou inconnus", + "@hideInvalidOrUnknownMessageFormats": {}, + "messagesStyle": "Messages :", + "@messagesStyle": {}, + "redactedByBecause": "Modifié par {username} car : \"{reason}\"", + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "setChatDescription": "Définir la description de la discussion", + "@setChatDescription": {}, + "presenceStyle": "Statut :", + "@presenceStyle": { + "type": "String", + "placeholders": {} + }, + "presencesToggle": "Afficher les messages de statut des autres utilisateurs/trices", + "@presencesToggle": { + "type": "String", + "placeholders": {} + }, + "youInvitedToBy": "📩 Vous avez été invité par lien à :\n{alias}", + "@youInvitedToBy": { + "placeholders": { + "alias": { + "type": "String" + } + } + }, + "userWouldLikeToChangeTheChat": "{user} souhaite rejoindre la discussion.", + "@userWouldLikeToChangeTheChat": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "noPublicLinkHasBeenCreatedYet": "Aucun lien public n'a encore été crée", + "@noPublicLinkHasBeenCreatedYet": {}, + "gallery": "Galerie", + "@gallery": {}, + "files": "Fichiers", + "@files": {}, + "sessionLostBody": "Votre session est perdue. Veuillez signaler cette erreur aux développeurs à {url}. Le message d'erreur est le suivant : {error}", + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "searchIn": "Rechercher dans la discussion \"{chat}\"...", + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "forwardMessageTo": "Transférer le message à {roomName} ?", + "@forwardMessageTo": { + "type": "String", + "placeholders": { + "roomName": { + "type": "String" + } + } + }, + "sendReadReceiptsDescription": "Les autres participants à une discussion peuvent voir si vous avez lu un message.", + "@sendReadReceiptsDescription": {}, + "formattedMessages": "Messages formatés", + "@formattedMessages": {}, + "verifyOtherUser": "🔐 Vérifier l'autre utilisateur/trice", + "@verifyOtherUser": {}, + "searchMore": "Rechercher davantage...", + "@searchMore": {}, + "verifyOtherUserDescription": "Si vous vérifiez un autre utilisateur/trice, vous pouvez être sûr de savoir à qui vous écrivez réellement. 💪\n\nLorsque vous lancez une vérification, vous et l'autre utilisateur/trice verrez une fenêtre contextuelle dans l'application. Vous y verrez alors une série d'émoticônes ou de chiffres que vous devrez comparer.\n\nLa meilleure façon de procéder est de se rencontrer ou de lancer un appel vidéo. 👭", + "@verifyOtherUserDescription": {}, + "verifyOtherDeviceDescription": "Lorsque vous vérifiez un autre appareil, ces appareils peuvent échanger des clés, ce qui augmente votre sécurité globale. 💪 Lorsque vous lancez une vérification, une fenêtre contextuelle s'affiche dans l'application sur les deux appareils. Vous y verrez alors une série d'émoticônes ou de chiffres que vous devrez comparer. Il est préférable d'avoir les deux appareils à portée de main avant de lancer la vérification. 🤳", + "@verifyOtherDeviceDescription": {}, + "completedKeyVerification": "{sender} a terminé la vérification de clé", + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "isReadyForKeyVerification": "{sender} est prêt pour la vérification de clé", + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "transparent": "Transparent", + "@transparent": {}, + "stickers": "Autocollants", + "@stickers": {}, + "noDatabaseEncryption": "Le chiffrement de la base de données n'est pas supporté sur cette plateforme", + "@noDatabaseEncryption": {}, + "commandHint_ignore": "Ignorer l'identifiant Matrix indiqué", + "@commandHint_ignore": {}, + "commandHint_unignore": "Ne plus ignorer l'identifiant Matrix indiqué", + "@commandHint_unignore": {}, + "thereAreCountUsersBlocked": "Actuellement, il y a {count} utilisateurs/trices bloqués.", + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "restricted": "Limité", + "@restricted": {}, + "knockRestricted": "Frapper à la porte limité", + "@knockRestricted": {}, + "signInWith": "Se connecter avec {provider}", + "@signInWith": { + "type": "String", + "placeholders": { + "provider": { + "type": "String" + } + } + }, + "groupCanBeFoundViaSearch": "Le groupe peut être trouvé via la recherche", + "@groupCanBeFoundViaSearch": {}, + "groupName": "Nom du groupe", + "@groupName": {}, + "invalidInput": "Entrée invalide !", + "@invalidInput": {}, + "block": "Bloquer", + "@block": {}, + "removeDevicesDescription": "Vous serez déconnecté de cet appareil et ne pourrez plus recevoir de messages.", + "@removeDevicesDescription": {}, + "userRole": "Rôle de l'utilisateur/trice", + "@userRole": {}, + "createNewAddress": "Créer une nouvelle adresse", + "@createNewAddress": {}, + "publicChatAddresses": "Addresses de discussion publiques", + "@publicChatAddresses": {}, + "countChatsAndCountParticipants": "{chats} discussions et {participants} participants", + "@countChatsAndCountParticipants": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + }, + "participants": { + "type": "int" + } + } + }, + "space": "Espace", + "@space": {}, + "spaces": "Espaces", + "@spaces": {}, + "noMoreChatsFound": "Aucune autre discussion trouvée...", + "@noMoreChatsFound": {}, + "unread": "Non lu", + "@unread": {}, + "joinedChats": "Discussions rejointes", + "@joinedChats": {}, + "commandHint_sendraw": "Envoyer du JSON brut", + "@commandHint_sendraw": {}, + "databaseMigrationTitle": "La base de données est optimisée", + "@databaseMigrationTitle": {}, + "leaveEmptyToClearStatus": "Laisser vide pour effacer votre statut.", + "@leaveEmptyToClearStatus": {}, + "select": "Sélectionner", + "@select": {}, + "reportErrorDescription": "😭 Oh non. Quelque chose s'est mal passé. Si vous le souhaitez, vous pouvez signaler ce bogue aux développeurs.", + "@reportErrorDescription": {}, + "report": "signaler", + "@report": {}, + "wrongPinEntered": "Mauvais code PIN saisi ! Veuillez réessayer dans {seconds} secondes...", + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "pushNotificationsNotAvailable": "Notifications poussées indisponibles", + "@pushNotificationsNotAvailable": {}, + "yourGlobalUserIdIs": "Votre identifiant utilisateur global est : ", + "@yourGlobalUserIdIs": {}, + "chatCanBeDiscoveredViaSearchOnServer": "La discussion peut être découverte via la recherche sur {server}", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "knocking": "Frapper", + "@knocking": {}, + "banUserDescription": "L'utilisateur/trice sera banni de la discussion et ne pourra plus y accéder jusqu'à ce qu'il/elle soit débanni.", + "@banUserDescription": {}, + "unbanUserDescription": "L'utilisateur/trice pourra entrer à nouveau dans la discussion si il/elle le souhaite.", + "@unbanUserDescription": {}, + "kickUserDescription": "L'utilisateur/trice est expulsé de la discussion mais n'est pas banni. Dans les discussions publiques, l'utilisateur/trice peut revenir à tout moment.", + "@kickUserDescription": {}, + "makeAdminDescription": "Une fois que vous aurez nommé cet utilisateur/trice administrateur, vous ne pourrez peut-être plus annuler cette opération, car il disposera alors des mêmes autorisations que vous.", + "@makeAdminDescription": {}, + "newPassword": "Nouveau mot de passe", + "@newPassword": {}, + "pleaseChooseAStrongPassword": "Veuillez choisir un mot de passe fort", + "@pleaseChooseAStrongPassword": {}, + "decline": "Refuser", + "@decline": {}, + "initAppError": "Une erreur est survenue pendant l'initialisation de l'application", + "@initAppError": {}, + "markAsUnread": "Marquer comme non lu", + "@markAsUnread": {}, + "wrongRecoveryKey": "Désolé... il ne semble pas s'agir de la bonne clé de récupération.", + "@wrongRecoveryKey": {}, + "searchChatsRooms": "Rechercher des #discussions, @utilisateurs/trices...", + "@searchChatsRooms": {}, + "createGroupAndInviteUsers": "Créer un groupe et inviter des utilisateurs/trices", + "@createGroupAndInviteUsers": {}, + "goToSpace": "Aller dans l'espace : {space}", + "@goToSpace": { + "type": "String", + "space": {} + }, + "exportEmotePack": "Exporter le pack d'émoticônes au format .zip", + "@exportEmotePack": {}, + "noChatDescriptionYet": "Aucune description de discussion n'a encore été créée.", + "@noChatDescriptionYet": {}, + "invite": "Inviter", + "@invite": {}, + "pleaseEnterANumber": "Veuillez saisir un nombre supérieur à 0", + "@pleaseEnterANumber": {}, + "roomUpgradeDescription": "La discussion sera alors recréé avec la nouvelle version de salon. Tous les participants seront informés qu'ils doivent passer à la nouvelle discussion. Pour en savoir plus sur les versions des salons, consultez le site https://spec.matrix.org/latest/rooms/", + "@roomUpgradeDescription": {}, + "learnMore": "En savoir plus", + "@learnMore": {}, + "minimumPowerLevel": "{level} est le niveau minimum de droits.", + "@minimumPowerLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "String" + } + } + }, + "restoreSessionBody": "L'application tente maintenant de restaurer votre session depuis la sauvegarde. Veuillez signaler cette erreur aux développeurs à {url}. Le message d'erreur est le suivant : {error}", + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "profileNotFound": "Cet utilisateur/trice n'a pu être trouvé sur le serveur. Peut-être est-ce un problème de connexion ou l'utilisateur/trice n'existe pas.", + "@profileNotFound": {}, + "archiveRoomDescription": "La discussion sera déplacée dans les archives. Les autres utilisateurs/trices pourront voir que vous avez quitté la discussion.", + "@archiveRoomDescription": {}, + "noUsersFoundWithQuery": "Malheureusement, aucun utilisateur/trice n'a pu être trouvé avec \"{query}\". Veuillez vérifier si vous n'avez pas fait de faute de frappe.", + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "noChatsFoundHere": "Aucune discussion trouvée. Utilisez le bouton ci-dessous pour commencer une nouvelle discussion. ⤵️", + "@noChatsFoundHere": {}, + "aboutHomeserver": "À propos de {homeserver}", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "changeTheDescriptionOfTheGroup": "Modifier la description de la discussion", + "@changeTheDescriptionOfTheGroup": {}, + "userLevel": "{level} — Membre", + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "chatPermissionsDescription": "Définir quel niveau de pouvoir est nécessaires pour certaines actions dans cette discussion. Les niveaux de pouvoir 0, 50 et 100 représentent généralement les membres, la modération et l'administration, mais toute gradation est possible.", + "@chatPermissionsDescription": {}, + "changeGeneralChatSettings": "Modifier les paramètres généraux de la discussion", + "@changeGeneralChatSettings": {}, + "invitedBy": "📩 Invitation par {user}", + "@invitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "moderatorLevel": "{level} — Modération", + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "sendCanceled": "Envoi annulé", + "@sendCanceled": {}, + "adminLevel": "{level} — Administration", + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "inviteOtherUsers": "Inviter d'autres membres dans cette discussion", + "@inviteOtherUsers": {}, + "changeTheChatPermissions": "Modifier les autorisations de cette discussion", + "@changeTheChatPermissions": {}, + "changeTheVisibilityOfChatHistory": "Modifier la visibilité de l'historique de la discussion", + "@changeTheVisibilityOfChatHistory": {}, + "changeTheCanonicalRoomAlias": "Modifier l'adresse publique principale de la discussion", + "@changeTheCanonicalRoomAlias": {}, + "changelog": "Journal des modifications", + "@changelog": {}, + "synchronizingPleaseWaitCounter": " Synchronisation… ({percentage} %)", + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "updateInstalled": "🎉 La mise à niveau {version} est installée !", + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "loginWithMatrixId": "Connexion avec l'identifiant Matrix", + "@loginWithMatrixId": {} +} diff --git a/assets/l10n/intl_ga.arb b/assets/l10n/intl_ga.arb new file mode 100644 index 0000000..bc8642a --- /dev/null +++ b/assets/l10n/intl_ga.arb @@ -0,0 +1,3354 @@ +{ + "you": "Tú", + "@you": { + "type": "String", + "placeholders": {} + }, + "yes": "Tá", + "@yes": { + "type": "String", + "placeholders": {} + }, + "warning": "Rabhadh!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "wallpaper": "Cúlbhrat:", + "@wallpaper": { + "type": "String", + "placeholders": {} + }, + "verify": "Deimhnigh", + "@verify": { + "type": "String", + "placeholders": {} + }, + "verified": "Deimhnithe", + "@verified": { + "type": "String", + "placeholders": {} + }, + "username": "Ainm úsáideora", + "@username": { + "type": "String", + "placeholders": {} + }, + "unpin": "Bain biorán", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "unavailable": "Níl ar fáil", + "@unavailable": { + "type": "String", + "placeholders": {} + }, + "title": "FluffyChat", + "@title": { + "description": "Title for the application", + "type": "String", + "placeholders": {} + }, + "systemTheme": "Córas", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "submit": "Cuir isteach", + "@submit": { + "type": "String", + "placeholders": {} + }, + "statusExampleMessage": "Conas atá tú inniu?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "status": "Staid", + "@status": { + "type": "String", + "placeholders": {} + }, + "skip": "Léim", + "@skip": { + "type": "String", + "placeholders": {} + }, + "share": "Roinn", + "@share": { + "type": "String", + "placeholders": {} + }, + "settings": "Socruithe", + "@settings": { + "type": "String", + "placeholders": {} + }, + "send": "Seol", + "@send": { + "type": "String", + "placeholders": {} + }, + "security": "Slándáil", + "@security": { + "type": "String", + "placeholders": {} + }, + "search": "Cuardaigh", + "@search": { + "type": "String", + "placeholders": {} + }, + "reply": "Freagair", + "@reply": { + "type": "String", + "placeholders": {} + }, + "remove": "Bain", + "@remove": { + "type": "String", + "placeholders": {} + }, + "rejoin": "Téigh ar ais isteach", + "@rejoin": { + "type": "String", + "placeholders": {} + }, + "reject": "Diúltaigh", + "@reject": { + "type": "String", + "placeholders": {} + }, + "register": "Cláraigh", + "@register": { + "type": "String", + "placeholders": {} + }, + "recording": "Ag Taifeadadh", + "@recording": { + "type": "String", + "placeholders": {} + }, + "reason": "Fáth", + "@reason": { + "type": "String", + "placeholders": {} + }, + "privacy": "Príobháideacht", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "pin": "Biorán", + "@pin": { + "type": "String", + "placeholders": {} + }, + "people": "Daoine", + "@people": { + "type": "String", + "placeholders": {} + }, + "password": "Pasfhocal", + "@password": { + "type": "String", + "placeholders": {} + }, + "participant": "Rannpháirtí", + "@participant": { + "type": "String", + "placeholders": {} + }, + "directChats": "Comhráite Díreacha", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "deviceId": "ID gléis", + "@deviceId": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "Scrios an teachtaireacht", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "Scrios an cuntas", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "createNewSpace": "Spás nua", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "countParticipants": "{count} rannpháirtithe", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "or": "Nó", + "@or": { + "type": "String", + "placeholders": {} + }, + "online": "Ar líne", + "@online": { + "type": "String", + "placeholders": {} + }, + "ok": "Ceart go leor", + "@ok": { + "type": "String", + "placeholders": {} + }, + "offline": "As líne", + "@offline": { + "type": "String", + "placeholders": {} + }, + "offensive": "Maslach", + "@offensive": { + "type": "String", + "placeholders": {} + }, + "notifications": "Fógraí", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "none": "Aon cheann", + "@none": { + "type": "String", + "placeholders": {} + }, + "no": "Níl", + "@no": { + "type": "String", + "placeholders": {} + }, + "next": "Ar Aghaidh", + "@next": { + "type": "String", + "placeholders": {} + }, + "moderator": "Modhnóir", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "messages": "Teachtaireachtaí", + "@messages": { + "type": "String", + "placeholders": {} + }, + "mention": "Luaigh", + "@mention": { + "type": "String", + "placeholders": {} + }, + "logout": "Logáil amach", + "@logout": { + "type": "String", + "placeholders": {} + }, + "login": "Logáil isteach", + "@login": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "Solas", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "license": "Ceadúnas", + "@license": { + "type": "String", + "placeholders": {} + }, + "leave": "Fág", + "@leave": { + "type": "String", + "placeholders": {} + }, + "invited": "Le cuireadh", + "@invited": { + "type": "String", + "placeholders": {} + }, + "inoffensive": "Neamhurchóideach", + "@inoffensive": { + "type": "String", + "placeholders": {} + }, + "ignore": "Tabhair neamhaird ar", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "identity": "Aitheantas", + "@identity": { + "type": "String", + "placeholders": {} + }, + "id": "ID", + "@id": { + "type": "String", + "placeholders": {} + }, + "help": "Cabhair", + "@help": { + "type": "String", + "placeholders": {} + }, + "groups": "Grúpaí", + "@groups": { + "type": "String", + "placeholders": {} + }, + "group": "Grúpa", + "@group": { + "type": "String", + "placeholders": {} + }, + "forward": "Seol ar aghaidh", + "@forward": { + "type": "String", + "placeholders": {} + }, + "fluffychat": "FluffyChat", + "@fluffychat": { + "type": "String", + "placeholders": {} + }, + "homeserver": "Freastalaí baile", + "@homeserver": {}, + "encryption": "Criptiúchán", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "encrypted": "Criptithe", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "edit": "Cuir in eagar", + "@edit": { + "type": "String", + "placeholders": {} + }, + "devices": "Gléasanna", + "@devices": { + "type": "String", + "placeholders": {} + }, + "device": "Gléas", + "@device": { + "type": "String", + "placeholders": {} + }, + "delete": "Scrios", + "@delete": { + "type": "String", + "placeholders": {} + }, + "dateWithYear": "{day}/{month}/{year}", + "@dateWithYear": { + "type": "String", + "placeholders": { + "year": { + "type": "String" + }, + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "dateWithoutYear": "{day}/{month}", + "@dateWithoutYear": { + "type": "String", + "placeholders": { + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "containsUserName": "Coinníonn sé ainm úsáideora", + "@containsUserName": { + "type": "String", + "placeholders": {} + }, + "configureChat": "Cumraigh comhrá", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "commandInvalid": "Ordú neamhbhailí", + "@commandInvalid": { + "type": "String" + }, + "commandHint_send": "Seol téacs", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "commandHint_me": "Déan cur síos ort féin", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "clearArchive": "Glan an cartlann", + "@clearArchive": {}, + "chatDetails": "Sonraí comhrá", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chatBackup": "Cúltaca comhrá", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "D'athraigh {username} abhatár an chomhrá", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changeDeviceName": "Athraigh ainm an ghléis", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "cantOpenUri": "Ní féidir an URI {uri} a oscailt", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "cancel": "Cealaigh", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "botMessages": "Teachtaireachtaí bota", + "@botMessages": { + "type": "String", + "placeholders": {} + }, + "blocked": "Bactha", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "blockDevice": "Bac Gléas", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "Chuir {username} cosc ar {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "banned": "Coiscthe", + "@banned": { + "type": "String", + "placeholders": {} + }, + "banFromChat": "Toirmisc ón gcomhrá", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "sendOnEnter": "Seol ar iontráil", + "@sendOnEnter": {}, + "archive": "Cartlann", + "@archive": { + "type": "String", + "placeholders": {} + }, + "appLock": "Bac aip", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "anyoneCanJoin": "Is féidir le aon duine dul isteach", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "D'fhreagair {senderName} an glao", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "allChats": "Gach comhrá", + "@allChats": { + "type": "String", + "placeholders": {} + }, + "all": "Gach", + "@all": { + "type": "String", + "placeholders": {} + }, + "alias": "ailias", + "@alias": { + "type": "String", + "placeholders": {} + }, + "admin": "Riarthóir", + "@admin": { + "type": "String", + "placeholders": {} + }, + "addToSpace": "Cuir go spás", + "@addToSpace": {}, + "addEmail": "Cuir ríomhphoist", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐 {username} criptithe deireadh go deireadh gníomhachtaithe", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "Cuntas", + "@account": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 Ghlac {username} leis an gcuireadh", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "accept": "Glac", + "@accept": { + "type": "String", + "placeholders": {} + }, + "about": "Faoi", + "@about": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "Glac leis an iarratas fíoraithe seo ó {username}?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "areYouSureYouWantToLogout": "An bhfuil tú cinnte gur mhaith leat logáil amach?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "An bhfuil tú cinnte?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "An bhfuil cead ag aoi-úsáideoirí a bheith páirteach", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "invitedUser": "📩 thug {username} cuireadh do {targetName}", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "hideRedactedEvents": "Folaigh imeachtaí athdhéanta", + "@hideRedactedEvents": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "Is féidir le haíonna páirt a ghlacadh", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "guestsAreForbidden": "Tá cosc ar aíonna", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "groupWith": "Grúpa le {displayname}", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "groupIsPublic": "Tá an grúpa poiblí", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "Ón gcuireadh", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "enterYourHomeserver": "Cuir isteach do fhreastalaí baile", + "@enterYourHomeserver": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "Gearrchód emote neamhbhailí!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "Tá iomaite ann cheana féin!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "Cuir in eagar abhatár an tseomra", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "editRoomAliases": "Cuir ailiasanna an tseomra in eagar", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "Cuir freastalaí blocáilte in eagar", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "Leibhéal ceada réamhshocraithe d'úsáideoirí nua", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "unblockDevice": "Díbhlocáil Gléas", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "Tugadh cuireadh don theagmháil a thar isteach sa grúpa", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "Cuir na huimhreacha i gcomparáid le do thoil", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "compareEmojiMatch": "Cuir na emojis i gcomparáid le do thoil", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "commandMissing": "Ní ordú é {command}.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "commandHint_react": "Seol freagra mar fhreagairt", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "commandHint_op": "Socraigh leibhéal cumhachta an úsáideora áirithe (réamhshocrú: 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_myroomnick": "Socraigh d'ainm taispeána don seomra seo", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "commandHint_myroomavatar": "Cuir do phictiúr don seomra seo (le mxc-uri)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_kick": "Bain an t-úsáideoir áirithe den seomra seo", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_join": "Téigh isteach sa seomra áirithe", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_ban": "Cuir cosc ar an úsáideoir áirithe ón seomra seo", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_invite": "Cuir cosc ar an úsáideoir áirithe ón seomra seo", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "chooseAStrongPassword": "Roghnaigh pasfhocal láidir", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "chatHasBeenAddedToThisSpace": "Cuireadh comhrá leis an spás seo", + "@chatHasBeenAddedToThisSpace": {}, + "chatBackupDescription": "Tá do sheanteachtaireachtaí slán le eochair athshlánaithe. Le do thoil déan cinnte nach gcaillfidh tú é.", + "@chatBackupDescription": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "Truaillíodh an criptiú", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "Athraigh ainm an ghrúpa", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "changedTheRoomInvitationLink": "D'athraigh {username} nasc an chuiridh", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "D'athraigh {username} ailiasanna an tseomra", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "D'athraigh {username} a n-abhatár", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "D'athraigh {username} na rialacha ceangail go: {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "D'athraigh {username} na rialacha ceangail", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "D'athraigh {username} infheictheacht na staire go: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "D'athraigh {username} infheictheacht na staire", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "D'athraigh {username} a n-ainm taispeána go: '{displayname}'", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "D'athraigh {username} na ceadanna comhrá", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatNameTo": "D'athraigh {username} an t-ainm comhrá go: '{chatname}'", + "@changedTheChatNameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "chatname": { + "type": "String" + } + } + }, + "changedTheChatDescriptionTo": "D'athraigh {username} an cur síos comhrá go: '{description}'", + "@changedTheChatDescriptionTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "description": { + "type": "String" + } + } + }, + "autoplayImages": "Seinn greamáin agus straoiseog beoite go huathoibríoch", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "createdTheChat": "💬 chruthaigh {username} an comhrá", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "copyToClipboard": "Cóipeáil ar an ghearrthaisce", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "Cóipeáilte ar an ghearrthaisce", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "containsDisplayName": "Coinníonn sé ainm taispeána", + "@containsDisplayName": { + "type": "String", + "placeholders": {} + }, + "commandHint_plain": "Seol téacs neamhfhoirmithe", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_leave": "Fág an seomra seo", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_html": "Seol téacs HTML-formáidithe", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "changeYourAvatar": "Athraigh do abhatár", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "Athraigh do stíl", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "Athraigh an freastalaí baile", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "Glórphost", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "videoCall": "Físghlao", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "verifyStart": "Tosaigh Fíorú", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "unmuteChat": "Neamhciúnaigh comhrá", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "hideUnknownEvents": "Folaigh imeachtaí anaithnide", + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "Gléas anaithnid", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "toggleUnread": "Marcáil Léite/Neamhléite", + "@toggleUnread": { + "type": "String", + "placeholders": {} + }, + "toggleMuted": "Scoránaigh mar ciúnaithe", + "@toggleMuted": { + "type": "String", + "placeholders": {} + }, + "toggleFavorite": "Scoránaigh mar ceann is fearr leat", + "@toggleFavorite": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "Tá siad céanna", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "spaceName": "Ainm an spáis", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "Cód foinseach", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "showPassword": "Taispeáin pasfhocal", + "@showPassword": { + "type": "String", + "placeholders": {} + }, + "shareLocation": "Roinn suíomh", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "setStatus": "Cuir stádas", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "Seol físeán", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "sendSticker": "Seol greamán", + "@sendSticker": { + "type": "String", + "placeholders": {} + }, + "sendOriginal": "Seol an bunchóip", + "@sendOriginal": { + "type": "String", + "placeholders": {} + }, + "sendMessages": "Seol teachtaireachtaí", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "sendImage": "Seol íomhá", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendFile": "Seol comhad", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendAudio": "Seol fuaim", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "saveFile": "Sábháil comhad", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "Leagan seomra", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "requestPermission": "Iarr cead", + "@requestPermission": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "Tuairiscigh teachtaireacht", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "removeDevice": "Bain gléas", + "@removeDevice": { + "type": "String", + "placeholders": {} + }, + "redactMessage": "Bain teachtaireacht amach", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "pushRules": "Rialacha na bhfógraí", + "@pushRules": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "Seomraí Poiblí", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "pleaseChoose": "Roghnaigh le do thoil", + "@pleaseChoose": { + "type": "String", + "placeholders": {} + }, + "play": "Seinn {fileName}", + "@play": { + "type": "String", + "placeholders": { + "fileName": { + "type": "String" + } + } + }, + "passwordRecovery": "Aisfháil pasfhocail", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "Pasfhocal dearmadta", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "openCamera": "Oscail ceamara", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "obtainingLocation": "ag Aimsiú an suíomh…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "noPermission": "Gan cead", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "newChat": "Comhrá nua", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "muteChat": "Ciúnaigh comhrá", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "memberChanges": "Athruithe ball", + "@memberChanges": { + "type": "String", + "placeholders": {} + }, + "loadMore": "Lódáil níos mó…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "joinRoom": "Téigh isteach sa seomra", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "isTyping": "ag clóscríobh…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "Tabhair cuireadh do theagmháil", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "ignoredUsers": "Úsáideoirí a dtugann tú neamhaird orthu", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "Ó tar isteach", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fontSize": "Méid cló", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "Tosaigh criptiú", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "editDisplayname": "Cuir ainm taispeána in eagar", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "currentlyActive": "Gníomhach faoi láthair", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "fileName": "Ainm an chomhaid", + "@fileName": { + "type": "String", + "placeholders": {} + }, + "everythingReady": "Gach rud réidh!", + "@everythingReady": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "Comhrá folamh", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "emoteShortcode": "Gearrchód straoiseoige", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "Socruithe straoiseoige", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "Íoslódáil comhad", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "changePassword": "Athraigh an pasfhocal", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "Dorcha", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "create": "Cruthaigh", + "@create": { + "type": "String", + "placeholders": {} + }, + "copy": "Cóipeáil", + "@copy": { + "type": "String", + "placeholders": {} + }, + "connect": "Ceangail", + "@connect": { + "type": "String", + "placeholders": {} + }, + "confirm": "Deimhnigh", + "@confirm": { + "type": "String", + "placeholders": {} + }, + "close": "Dún", + "@close": { + "type": "String", + "placeholders": {} + }, + "chats": "Comhráite", + "@chats": { + "type": "String", + "placeholders": {} + }, + "chat": "Comhrá", + "@chat": { + "type": "String", + "placeholders": {} + }, + "scanQrCode": "Scan cód QR", + "@scanQrCode": {}, + "inviteText": "Thug {username} cuireadh duit chuig FluffyChat.\n1. Tabhair cuairt ar fluffychat.im agus a shuiteáil an app\n2. Cláraigh nó sínigh isteach\n3. Oscail an nasc cuirí:\n {link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "noMatrixServer": "Níl {server1} freastalaí Matrix. Úsáid {server2} ina áit sin?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "noGoogleServicesWarning": "Is cosúil nach bhfuil Firebase Cloud Messaging ar fáil ar do ghléas. Chun fógraí brú a fháil fós, molaimid ntfy a shuiteáil. Le ntfy nó soláthraí Unified Push eile is féidir leat fógraí brú a fháil ar bhealach atá slán ó thaobh sonraí. Is féidir leat ntfy a íoslódáil ón PlayStore nó ó F-Droid.", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "Ní féidir leat criptiú a ghníomhachtú ach a luaithe nach bhfuil an seomra inrochtana go poiblí a thuilleadh.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "Níor aimsíodh aon straoiseoga. 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "Gan aon nasc leis an bhfreastalaí", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "Iarratas fíoraithe nua!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "💬 Teachtaireacht nua in FluffyChat", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "needPantalaimonWarning": "Bí ar an eolas go dteastaíonn Pantalaimon uait chun criptiú ó cheann go ceann a úsáid anois.", + "@needPantalaimonWarning": { + "type": "String", + "placeholders": {} + }, + "logInTo": "Logáil isteach chuig {homeserver}", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "locationPermissionDeniedNotice": "Diúltaíodh cead suímh. Deonaigh dóibh le do thoil go mbeidh tú in ann do shuíomh a roinnt.", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "locationDisabledNotice": "Tá seirbhísí suímh díchumasaithe. Cuir ar a gcumas le do thoil a bheith in ann do shuíomh a roinnt.", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "loadingPleaseWait": "Ag lódáil… Fan, le do thoil.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "Lódáil {count} níos mó rannpháirtithe", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "leftTheChat": "Fágadh an comhrá", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "Gníomhach deireanach: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "kickFromChat": "Caith é amach as an comhrá", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "kicked": "👞 chiceáil {username} {targetName}", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickedAndBanned": "🙅 chiceáil {username} agus chuir sé cosc ar {targetName}", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "joinedTheChat": "Tháinig 👋 {username} isteach sa chomhrá", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "invitedUsersOnly": "Úsáideoirí le cuireadh amháin", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "Tabhair cuireadh do theagmháil chuig {groupName}", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "incorrectPassphraseOrKey": "Pasfhrása nó eochair téarnaimh mícheart", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "iHaveClickedOnLink": "Chliceáil mé ar an nasc", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "howOffensiveIsThisContent": "Cé chomh maslach atá an t-ábhar seo?", + "@howOffensiveIsThisContent": { + "type": "String", + "placeholders": {} + }, + "extremeOffensive": "Fíor-maslach", + "@extremeOffensive": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "Tharraing {username} an cuireadh do {targetName} siar", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "goToTheNewRoom": "Téigh go dtí an seomra nua", + "@goToTheNewRoom": { + "type": "String", + "placeholders": {} + }, + "errorObtainingLocation": "Earráid maidir le suíomh a fháil: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "enterAnEmailAddress": "Cuir isteach seoladh ríomhphoist", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "Chuir {senderName} deireadh leis an nglao", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "encryptionNotEnabled": "Ní chumasaítear criptiú", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "Ní bheidh in ann an criptiú a dhíchumasú níos mó. An bhfuil tú cinnte?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "Cumasaigh pacáiste straoiseoige go huilíoch", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "emoteWarnNeedToPick": "Caithfidh tú gearrchód straoiseoige agus íomhá a roghnú!", + "@emoteWarnNeedToPick": { + "type": "String", + "placeholders": {} + }, + "emotePacks": "Pacáistí straoiseoige don seomra", + "@emotePacks": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "Athraíodh an t-ainm taispeána", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "deactivateAccountWarning": "Díghníomhachtaeoidh sé seo do chuntas úsáideora. Ní féidir é seo a chealú! An bhfuil tú cinnte?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "Níorbh fhéidir teachtaireacht a dhíchriptiú: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "contentHasBeenReported": "Tuairiscíodh an t-ábhar do lucht riaracháin an fhreastalaí", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "commandHint_unban": "Cuir deireadh an cosc den úsáideoir áirithe ón seomra seo", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "changedTheGuestAccessRulesTo": "D'athraigh {username} na rialacha maidir le rochtain aoi chuig: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "D'athraigh {username} na rialacha rochtana aoi", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "badServerVersionsException": "Tá na leaganacha sonraíochta seo ar fáil faoin freastalaí baile:\n{serverVersions}\nAch níl ach na ceann seo ar fáil faoin aip seo {supportedVersions}", + "@badServerVersionsException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "badServerLoginTypesException": "Tá na cineálacha logála isteach seo ar fáil faoin freastalaí baile:\n{serverVersions}\nAch níl ach na ceann seo ar fáil faoin aip seo:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "askSSSSSign": "Chun a bheith in ann an duine eile a shíniú, cuir isteach do phasfhrása stóir sábháilte nó d'eochair téarnaimh.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "yourPublicKey": "D'eochair phoiblí", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "Cuireadh cosc ort ón gcomhrá seo", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "Níl tú ag glacadh páirte sa chomhrá seo a thuilleadh", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "Scríobh teachtaireacht…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "Leis na seoltaí seo is féidir leat do phasfhocal a athshlánú.", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "wipeChatBackup": "An bhfuil fonn ort cúltaca do chomhrá a scriosadh chun eochair athshlánaithe nua a chruthú?", + "@wipeChatBackup": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "Cén fáth ar mhaith leat é seo a thuairisciú?", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "Cé a bhfuil cead aige/aici dul isteach sa ghrúpa seo", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "whoCanPerformWhichAction": "Cé atá in ann an gníomh a dhéanamh", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "D'fhíoraigh tú go rathúil!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "userLeftTheChat": "🚪 D'fhág {username} an comhrá", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userAndUserAreTyping": "Tá {username} agus {username2} ag clóscríobh…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userAndOthersAreTyping": "tá {username} agus {count} daoine eile ag clóscríobh…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "unreadChats": "{unreadCount, plural, =1{1 comhrá neamhléite} other{{unreadCount} comhráite neamhléite}}", + "@unreadChats": { + "type": "String", + "placeholders": { + "unreadCount": { + "type": "int" + } + } + }, + "unknownEncryptionAlgorithm": "Algartam criptithe anaithnid", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "Chuir {username} deireadh an cosc {targetName}", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "tryToSendAgain": "Déan iarracht a sheoladh arís", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "transferFromAnotherDevice": "Aistriú ó ghléas eile", + "@transferFromAnotherDevice": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "An iomarca iarratas. Bain triail eile as níos déanaí!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "Níl siad céanna", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "sharedTheLocation": "Roinn {username} a suíomh", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "setPermissionsLevel": "Socraigh leibhéal ceadanna", + "@setPermissionsLevel": { + "type": "String", + "placeholders": {} + }, + "setInvitationLink": "Socraigh nasc cuiridh", + "@setInvitationLink": { + "type": "String", + "placeholders": {} + }, + "setCustomEmotes": "Socraigh straoiseoga saincheaptha", + "@setCustomEmotes": { + "type": "String", + "placeholders": {} + }, + "setAsCanonicalAlias": "Socraigh mar phríomh-ailias", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "sentCallInformations": "Sheol {senderName} faisnéis maidir le glaonna", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "sentAVideo": "🎥 sheol {username} físeán", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentASticker": "😊 sheol {username} greamán", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAPicture": "🖼️ sheol {username} pictiúr", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "replaceRoomWithNewerVersion": "Cuir leagan seomra níos nuaí in ionad an tseomra", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "renderRichContent": "Taispeáin ábhar teachtaireachta saibhir", + "@renderRichContent": { + "type": "String", + "placeholders": {} + }, + "removeYourAvatar": "Bain d'abhatár", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "Cuir deireadh an cosc ón gcomhrá", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "removedBy": "Bainte de ag {username}", + "@removedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "removeAllOtherDevices": "Bain gach gléas eile", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "Dhiúltaigh {username} don chuireadh", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "redactedAnEvent": "Rinne {username} cinsire imeacht", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "pleaseFollowInstructionsOnWeb": "Lean na treoracha ar an suíomh gréasáin agus tapáil \"ar aghaidh\".", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "Cuir isteach d'ainm úsáideora le do thoil", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPin": "Cuir isteach d'uimhir PIN le do thoil", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPassword": "Iontráil do phasfhocal le do thoil", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseEnter4Digits": "Iontráil 4 dhigit le do thoil nó fág folamh chun glas aipe a dhíchumasú.", + "@pleaseEnter4Digits": { + "type": "String", + "placeholders": {} + }, + "pleaseClickOnLink": "Cliceáil ar an nasc sa ríomhphost agus ansin lean ar aghaidh.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "pleaseChooseAPasscode": "Roghnaigh paschód le do thoil", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "pickImage": "Roghnaigh íomhá", + "@pickImage": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "Athraíodh an pasfhocal", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "pasfhrása nó eochair téarnaimh", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "serverRequiresEmail": "Ní mór don fhreastalaí seo do sheoladh ríomhphoist a bhailíochtú le haghaidh clárúcháin.", + "@serverRequiresEmail": {}, + "openInMaps": "Oscail i léarscáileanna", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "Oscail an aip chun teachtaireachtaí a léamh", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "Úps, chuaigh rud éigin mícheart …", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "oopsPushError": "Hoips! Ar an drochuair, tharla earráid nuair a bhí na fógraí brú á mbunú.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "Tá Cúltaca Eochair Ar Líne cumasaithe", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "numUsersTyping": "Tá {count} úsáideoirí ag clóscríobh…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "notificationsEnabledForThisAccount": "Fógraí cumasaithe don chuntas seo", + "@notificationsEnabledForThisAccount": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "Níor aimsíodh aon seomraí…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "noPasswordRecoveryDescription": "Níor chuir tú bealach leis do phasfhocal a aisghabháil fós.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "inviteForMe": "Tabhair cuireadh dom", + "@inviteForMe": { + "type": "String", + "placeholders": {} + }, + "weSentYouAnEmail": "Sheolamar ríomhphost chugat", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "Ag fanacht le comhpháirtí glacadh leis na huimhreacha …", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "Ag fanacht le comhpháirtí glacadh leis na straoiseoga…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "Ag fanacht le comhpháirtí glacadh leis an iarratas…", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "Infheicthe do gach duine", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "Infheicthe do na rannpháirtithe go léir", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "Infheictheacht stair na comhrá", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "verifyTitle": "Ag fíorú cuntas eile", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "userSentUnknownEvent": "Sheol {username} imeacht {type}", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "userIsTyping": "Tá {username} ag clóscríobh…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "unknownEvent": "Imeacht anaithnid '{type}'", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "synchronizingPleaseWait": "Ag sioncrónú... Fan, le do thoil.", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "startedACall": "Thosaigh {senderName} glao", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "spaceIsPublic": "Tá an spás poiblí", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "singlesignon": "Sínigh Aonair ar", + "@singlesignon": { + "type": "String", + "placeholders": {} + }, + "sentAnAudio": "🎤 sheol {username} fuaim", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAFile": "📁 sheol {username} comhad", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sendAsText": "Seol mar théacs", + "@sendAsText": { + "type": "String" + }, + "sendAMessage": "Seol teachtaireacht", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "seenByUser": "Le feiceáil ag {username}", + "@seenByUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "roomHasBeenUpgraded": "Uasghrádaíodh an seomra", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "addAccount": "Breisigh cuntas", + "@addAccount": {}, + "enableMultiAccounts": "(BÉITE) Cumasaigh cuntais iomadúla ar an gléas seo", + "@enableMultiAccounts": {}, + "commandHint_create": "Cruthaigh comhrá grúpa folamh\nÚsáid --no-encryption chun criptiúchán a dhíchumasú", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "link": "Nasc", + "@link": {}, + "commandHint_clearcache": "Glan an taisce", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "videoCallsBetaWarning": "Tabhair faoi deara go bhfuil físglaonna i béite. B'fhéidir nach bhfeidhmíonn siad ar gach ardán chomh atá súil aige ná ar bith.", + "@videoCallsBetaWarning": {}, + "emailOrUsername": "Ríomhphost nó ainm úsáideora", + "@emailOrUsername": {}, + "repeatPassword": "Scríobh an pasfhocal arís", + "@repeatPassword": {}, + "yourChatBackupHasBeenSetUp": "Bunaíodh do chúltaca comhrá.", + "@yourChatBackupHasBeenSetUp": {}, + "openVideoCamera": "Oscail físcheamara", + "@openVideoCamera": { + "type": "String", + "placeholders": {} + }, + "fileHasBeenSavedAt": "Sábháladh an comhad ag {path}", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "editBundlesForAccount": "Cuir cuachta in eagar don chuntas seo", + "@editBundlesForAccount": {}, + "globalChatId": "Aitheantas comhrá domhanda", + "@globalChatId": {}, + "hideMemberChangesInPublicChatsBody": "Ná taispeáin san amlíne comhrá má théann duine isteach i gcomhrá poiblí nó má fhágann sé nó sí é chun inléiteacht a fheabhsú.", + "@hideMemberChangesInPublicChatsBody": {}, + "pleaseEnterRecoveryKey": "Cuir isteach d'eochair athshlánaithe le do thoil:", + "@pleaseEnterRecoveryKey": {}, + "sender": "Seoltóir", + "@sender": {}, + "noOneCanJoin": "Ní féidir le duine ar bith páirt a ghlacadh", + "@noOneCanJoin": {}, + "noOtherDevicesFound": "Níor aimsíodh aon ghléas eile", + "@noOtherDevicesFound": {}, + "profileNotFound": "Níorbh fhéidir an t-úsáideoir a aimsiú ar an bhfreastalaí. B'fhéidir go bhfuil fadhb nasctha ann nó nach bhfuil an t-úsáideoir ann.", + "@profileNotFound": {}, + "inviteGroupChat": "📨 Tabhair cuireadh comhrá grúpa", + "@inviteGroupChat": {}, + "knocking": "Cnagadh", + "@knocking": {}, + "addChatOrSubSpace": "Cuir comhrá nó fo-spás leis", + "@addChatOrSubSpace": {}, + "thisDevice": "An gléas seo:", + "@thisDevice": {}, + "formattedMessages": "Teachtaireachtaí formáidithe", + "@formattedMessages": {}, + "verifyOtherDevice": "🔐 Fíoraigh gléas eile", + "@verifyOtherDevice": {}, + "commandHint_ignore": "Déan neamhaird d'aitheantas na maitríse sonraithe", + "@commandHint_ignore": {}, + "completedKeyVerification": "{sender} fíorú eochair críochnaithe", + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "changeTheCanonicalRoomAlias": "Athraigh an príomhsheoladh comhrá poiblí", + "@changeTheCanonicalRoomAlias": {}, + "importEmojis": "Iompórtáil Emoji", + "@importEmojis": {}, + "start": "Tosaigh", + "@start": {}, + "commandHint_dm": "Cuir tús le comhrá díreach\nÚsáid --no-cription chun criptiúchán a dhíchumasú", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "invalidServerName": "Ainm freastalaí neamhbhailí", + "@invalidServerName": {}, + "addToBundle": "Cuir le bundle", + "@addToBundle": {}, + "redactedBy": "Arna chur in eagar ag {username}", + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "addToSpaceDescription": "Roghnaigh spás chun an comhrá seo a chur leis.", + "@addToSpaceDescription": {}, + "markAsRead": "Marcáil mar léite", + "@markAsRead": {}, + "enterRoom": "Iontráil seomra", + "@enterRoom": {}, + "deviceKeys": "Eochracha gléis:", + "@deviceKeys": {}, + "allSpaces": "Gach spás", + "@allSpaces": {}, + "searchForUsers": "Cuardaigh @users...", + "@searchForUsers": {}, + "removeFromBundle": "Bain as an mbeart seo", + "@removeFromBundle": {}, + "recoveryKeyLost": "Eochair athshlánaithe caillte?", + "@recoveryKeyLost": {}, + "reactedWith": "D'fhreagair {sender} le {reaction}", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "youInvitedBy": "📩 Thug {user} cuireadh duit", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "doNotShowAgain": "Ná taispeáin arís", + "@doNotShowAgain": {}, + "pleaseEnterANumber": "Iontráil uimhir níos mó ná 0", + "@pleaseEnterANumber": {}, + "unbanUserDescription": "Beidh an t-úsáideoir in ann dul isteach sa chomhrá arís má dhéanann siad iarracht.", + "@unbanUserDescription": {}, + "pleaseEnterYourCurrentPassword": "Iontráil do phasfhocal reatha le do thoil", + "@pleaseEnterYourCurrentPassword": {}, + "newPassword": "Pasfhocal nua", + "@newPassword": {}, + "subspace": "Fospás", + "@subspace": {}, + "decline": "Meath", + "@decline": {}, + "forwardMessageTo": "Seol teachtaireacht ar aghaidh chuig {roomName}?", + "@forwardMessageTo": { + "type": "String", + "placeholders": { + "roomName": { + "type": "String" + } + } + }, + "sendReadReceipts": "Seol admhálacha léite", + "@sendReadReceipts": {}, + "formattedMessagesDescription": "Taispeáin ábhar saibhir teachtaireachta cosúil le téacs trom ag baint úsáide as marcáil síos.", + "@formattedMessagesDescription": {}, + "verifyOtherUser": "🔐 Fíoraigh úsáideoir eile", + "@verifyOtherUser": {}, + "dehydrateTorLong": "Maidir le húsáideoirí TOR, moltar an seisiún a onnmhairiú roimh dhúnadh an fhuinneog.", + "@dehydrateTorLong": {}, + "numChats": "Comhráite {number}", + "@numChats": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "hidePresences": "Folaigh Liosta Stádais?", + "@hidePresences": {}, + "jump": "Léim", + "@jump": {}, + "reportErrorDescription": "😭 Ó, a mhac go deo. Chuaigh rud éigin mícheart. Más mian leat, is féidir leat an fabht seo a thuairisciú do na forbróirí.", + "@reportErrorDescription": {}, + "setTheme": "Socraigh téama:", + "@setTheme": {}, + "invalidInput": "Ionchur neamhbhailí!", + "@invalidInput": {}, + "kickUserDescription": "Ciceáiltear an t-úsáideoir as an gcomhrá ach níl cosc air. I gcomhráite poiblí, is féidir leis an úsáideoir teacht ar ais ag am ar bith.", + "@kickUserDescription": {}, + "startConversation": "Tosaigh comhrá", + "@startConversation": {}, + "commandHint_sendraw": "Seol json amh", + "@commandHint_sendraw": {}, + "leaveEmptyToClearStatus": "Fág folamh chun do stádas a ghlanadh.", + "@leaveEmptyToClearStatus": {}, + "pleaseChooseAStrongPassword": "Roghnaigh pasfhocal láidir", + "@pleaseChooseAStrongPassword": {}, + "publicLink": "Nasc poiblí", + "@publicLink": {}, + "joinSpace": "Glac páirt sa spás", + "@joinSpace": {}, + "initAppError": "Tharla earráid agus an feidhmchlár á thosú", + "@initAppError": {}, + "requestedKeyVerification": "D'iarr {sender} fíorú eochrach", + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "incomingMessages": "Teachtaireachtaí isteach", + "@incomingMessages": {}, + "transparent": "Trédhearcach", + "@transparent": {}, + "voiceCall": "Glao gutha", + "@voiceCall": {}, + "widgetVideo": "Físeán", + "@widgetVideo": {}, + "errorAddingWidget": "Earráid agus an ghiuirléid á cur leis.", + "@errorAddingWidget": {}, + "emojis": "Emojis", + "@emojis": {}, + "reportUser": "Déan tuairisc ar úsáideoir", + "@reportUser": {}, + "custom": "Saincheaptha", + "@custom": {}, + "supposedMxid": "Ba cheart go mbeadh sé seo {mxid}", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "commandHint_markasgroup": "Marcáil mar ghrúpa", + "@commandHint_markasgroup": {}, + "dismiss": "Díbhe", + "@dismiss": {}, + "newGroup": "Grúpa nua", + "@newGroup": {}, + "newSpace": "Spás nua", + "@newSpace": {}, + "compressBeforeSending": "Comhbhrú roimh sheoladh", + "@compressBeforeSending": {}, + "confirmMatrixId": "Deimhnigh d’ID Maitrís chun do chuntas a scriosadh.", + "@confirmMatrixId": {}, + "hideMemberChangesInPublicChats": "Cuir athruithe ball i gcomhráite poiblí i bhfolach", + "@hideMemberChangesInPublicChats": {}, + "confirmEventUnpin": "An bhfuil tú cinnte an t-imeacht a dhíphionnáil go buan?", + "@confirmEventUnpin": {}, + "hugContent": "Tugann {senderName} barróg duit", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "unread": "Neamhléite", + "@unread": {}, + "noChatsFoundHere": "Níor aimsíodh aon chomhrá anseo fós. Cuir tús le comhrá nua le duine éigin tríd an gcnaipe thíos a úsáid. ⤵️", + "@noChatsFoundHere": {}, + "separateChatTypes": "Comhráite Díreacha agus Grúpaí ar Leith", + "@separateChatTypes": { + "type": "String", + "placeholders": {} + }, + "videoWithSize": "Físeán ({size})", + "@videoWithSize": { + "type": "String", + "placeholders": { + "size": { + "type": "String" + } + } + }, + "messageInfo": "Eolas teachtaireachta", + "@messageInfo": {}, + "messageType": "Cineál Teachtaireachta", + "@messageType": {}, + "pleaseEnterRecoveryKeyDescription": "Chun do sheanteachtaireachtaí a dhíghlasáil, cuir isteach d'eochair athshlánaithe a gineadh i seisiún eile. NÍ do phasfhocal í d'eochair athshlánaithe.", + "@pleaseEnterRecoveryKeyDescription": {}, + "openChat": "Oscail Comhrá", + "@openChat": {}, + "unsupportedAndroidVersionLong": "Éilíonn an ghné seo leagan Android níos nuaí. Seiceáil le haghaidh nuashonruithe nó tacaíocht Lineage OS.", + "@unsupportedAndroidVersionLong": {}, + "experimentalVideoCalls": "Glaonna físe turgnamhacha", + "@experimentalVideoCalls": {}, + "switchToAccount": "Athraigh go cuntas {number}", + "@switchToAccount": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "addWidget": "Cuir giuirléid leis", + "@addWidget": {}, + "widgetUrlError": "Ní URL bailí é seo.", + "@widgetUrlError": {}, + "invitedBy": "📩 Cuireadh ó {user}", + "@invitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKicked": "👞 Chiceáil tú {user}", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youUnbannedUser": "Unbanned tú {user}", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "userWouldLikeToChangeTheChat": "Ba mhaith le {user} páirt a ghlacadh sa chomhrá.", + "@userWouldLikeToChangeTheChat": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "knock": "Cnoc Mhuire", + "@knock": {}, + "storeInSecureStorageDescription": "Stóráil an eochair aisghabhála i stóráil slán an ghléis seo.", + "@storeInSecureStorageDescription": {}, + "countFiles": "Comhaid {count}", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "foregroundServiceRunning": "Tá an fógra seo le feiceáil nuair atá an tseirbhís tulra ag rith.", + "@foregroundServiceRunning": {}, + "screenSharingDetail": "Tá do scáileán á roinnt agat i FuffyChat", + "@screenSharingDetail": {}, + "callingPermissions": "Ceadanna a ghlaoch", + "@callingPermissions": {}, + "callingAccount": "Cuntas ag glaoch", + "@callingAccount": {}, + "callingAccountDetails": "Ceadaíonn FluffyChat an aip dhiailiú android dúchais a úsáid.", + "@callingAccountDetails": {}, + "appearOnTopDetails": "Ceadaíonn sé don aip a bheith ar bharr (ní gá má tá socrú Fluffychat agat cheana féin mar chuntas glao)", + "@appearOnTopDetails": {}, + "otherCallingPermissions": "Micreafón, ceamara agus ceadanna FluffyChat eile", + "@otherCallingPermissions": {}, + "hideUnimportantStateEvents": "Folaigh imeachtaí stáit gan tábhacht", + "@hideUnimportantStateEvents": {}, + "disableEncryptionWarning": "Ar chúiseanna slándála ní féidir leat criptiú a dhíchumasú i gcomhrá, áit ar cumasaíodh é roimhe seo.", + "@disableEncryptionWarning": {}, + "sorryThatsNotPossible": "Tá brón orm... nach féidir a dhéanamh", + "@sorryThatsNotPossible": {}, + "reopenChat": "Comhrá a athoscailt", + "@reopenChat": {}, + "noBackupWarning": "Rabhadh! Gan cúltaca comhrá a chumasú, caillfidh tú rochtain ar do theachtaireachtaí criptithe. Moltar go mór an cúltaca comhrá a chumasú ar dtús sula logálann tú amach.", + "@noBackupWarning": {}, + "fileIsTooBigForServer": "Ní féidir seol! Ní thacaíonn an freastalaí ach le ceangaltáin suas le {max}.", + "@fileIsTooBigForServer": { + "type": "String", + "placeholders": { + "max": { + "type": "String" + } + } + }, + "jumpToLastReadMessage": "Léim go dtí an teachtaireacht léite is déanaí", + "@jumpToLastReadMessage": {}, + "readUpToHere": "Léigh suas go dtí seo", + "@readUpToHere": {}, + "openLinkInBrowser": "Oscail nasc sa bhrabhsálaí", + "@openLinkInBrowser": {}, + "signInWithPassword": "Sínigh isteach le pasfhocal", + "@signInWithPassword": {}, + "pleaseTryAgainLaterOrChooseDifferentServer": "Bain triail eile as níos déanaí nó roghnaigh freastalaí eile.", + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "signInWith": "Sínigh isteach le {provider}", + "@signInWith": { + "type": "String", + "placeholders": { + "provider": { + "type": "String" + } + } + }, + "invitePrivateChat": "📨 Tabhair cuireadh comhrá príobháideach", + "@invitePrivateChat": {}, + "wrongPinEntered": "Tháinig biorán mícheart isteach! Bain triail eile as i {seconds} soicind...", + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "archiveRoomDescription": "Bogfar an comhrá go dtí an chartlann. Beidh úsáideoirí eile in ann a fheiceáil gur fhág tú an comhrá.", + "@archiveRoomDescription": {}, + "removeDevicesDescription": "Beidh tú logáilte amach as an ngléas seo agus ní bheidh tú in ann teachtaireachtaí a fháil a thuilleadh.", + "@removeDevicesDescription": {}, + "roomUpgradeDescription": "Déanfar an comhrá a athchruthú ansin leis an leagan seomra nua. Cuirfear in iúl do gach rannpháirtí go gcaithfidh siad aistriú chuig an gcomhrá nua. Is féidir leat tuilleadh eolais a fháil faoi leaganacha seomra ag https://spec.matrix.org/latest/rooms/", + "@roomUpgradeDescription": {}, + "banUserDescription": "Beidh cosc ar an úsáideoir ón gcomhrá agus ní bheidh sé in ann dul isteach sa chomhrá arís go dtí go mbeidh siad gan chosc.", + "@banUserDescription": {}, + "makeAdminDescription": "Nuair a dhéanann tú an riarachán úsáideora seo, b'fhéidir nach mbeidh tú in ann é seo a chealú mar go mbeidh na ceadanna céanna acu agus atá agat.", + "@makeAdminDescription": {}, + "learnMore": "Faigh tuilleadh eolais", + "@learnMore": {}, + "yourGlobalUserIdIs": "Is é d'aitheantas úsáideora domhanda: ", + "@yourGlobalUserIdIs": {}, + "noUsersFoundWithQuery": "Ar an drochuair ní fhéadfaí aon úsáideoir a aimsiú le \"{query}\". Seiceáil le do thoil an ndearna tú typo.", + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "searchChatsRooms": "Cuardaigh #chats, @users...", + "@searchChatsRooms": {}, + "createGroupAndInviteUsers": "Cruthaigh grúpa agus tabhair cuireadh d'úsáideoirí", + "@createGroupAndInviteUsers": {}, + "groupCanBeFoundViaSearch": "Is féidir teacht ar ghrúpa trí chuardach", + "@groupCanBeFoundViaSearch": {}, + "wrongRecoveryKey": "Tá brón orm... Ní cosúil gurb é seo an eochair aisghabhála ceart.", + "@wrongRecoveryKey": {}, + "databaseMigrationBody": "Fan, le do thoil. B'fhéidir go dtógfaidh sé seo nóiméad.", + "@databaseMigrationBody": {}, + "select": "Roghnaigh", + "@select": {}, + "passwordsDoNotMatch": "Ní mheaitseálann pasfhocail", + "@passwordsDoNotMatch": {}, + "searchIn": "Cuardaigh i gcomhrá \"{chat}\"...", + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "passwordIsWrong": "Tá do phasfhocal iontrála mícheart", + "@passwordIsWrong": {}, + "files": "Comhaid", + "@files": {}, + "databaseBuildErrorBody": "Ní féidir bunachar sonraí SQlite a thógáil. Déanann an aip iarracht an bunachar sonraí oidhreachta a úsáid anois. Tuairiscigh an earráid seo do na forbróirí ag {url}. Is í an teachtaireacht earráide: {error}", + "@databaseBuildErrorBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "sessionLostBody": "Cailltear do sheisiún. Tuairiscigh an earráid seo do na forbróirí ag {url}. Is í an teachtaireacht earráide: {error}", + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "restoreSessionBody": "Déanann an aip iarracht anois do sheisiún a chur ar ais ón gcúltaca. Tuairiscigh an earráid seo do na forbróirí ag {url}. Is í an teachtaireacht earráide: {error}", + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "verifyOtherUserDescription": "Má fhíoraíonn tú úsáideoir eile, is féidir leat a bheith cinnte go bhfuil a fhios agat cé leis a bhfuil tú ag scríobh i ndáiríre. 💪\n\nNuair a thosaíonn tú fíorú, feicfidh tú féin agus an t-úsáideoir eile aníos san aip. Ansin feicfidh tú sraith emojis nó uimhreacha a chaithfidh tú a chur i gcomparáid lena chéile.\n\nIs é an bealach is fearr chun é seo a dhéanamh ná bualadh le chéile nó glao físe a thosú. 👭", + "@verifyOtherUserDescription": {}, + "sendTypingNotificationsDescription": "Is féidir le rannpháirtithe eile i gcomhrá a fheiceáil nuair atá teachtaireacht nua á clóscríobh agat.", + "@sendTypingNotificationsDescription": {}, + "verifyOtherDeviceDescription": "Nuair a fhíoraíonn tú gléas eile, is féidir leis na gléasanna sin eochracha a mhalartú, do shlándáil fhoriomlán a mhéadú. 💪 Nuair a thosaíonn tú fíorú, beidh preabfhuinneog le feiceáil san aip ar an dá ghléas. Ansin feicfidh tú sraith emojis nó uimhreacha a chaithfidh tú a chur i gcomparáid lena chéile. Is fearr an dá ghléas a bheith áisiúil sula dtosaíonn tú ar an bhfíorú. 🤳", + "@verifyOtherDeviceDescription": {}, + "acceptedKeyVerification": "{sender} glacadh le fíorú eochair", + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "canceledKeyVerification": "{sender} cealaithe fíorú eochrach", + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "commandHint_unignore": "Unignore an ID maitrís tugtha", + "@commandHint_unignore": {}, + "restricted": "Srianta", + "@restricted": {}, + "goToSpace": "Téigh go dtí an spás: {space}", + "@goToSpace": { + "type": "String", + "space": {} + }, + "markAsUnread": "Marcáil mar gan léamh", + "@markAsUnread": {}, + "moderatorLevel": "{level} - Modhnóir", + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "adminLevel": "{level} - Riarachán", + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "inviteOtherUsers": "Tabhair cuireadh d'úsáideoirí eile chuig an gcomhrá seo", + "@inviteOtherUsers": {}, + "changeTheChatPermissions": "Athraigh na ceadanna comhrá", + "@changeTheChatPermissions": {}, + "changeTheVisibilityOfChatHistory": "Athraigh infheictheacht stair an chomhrá", + "@changeTheVisibilityOfChatHistory": {}, + "chatPermissionsDescription": "Sainmhínigh cén leibhéal cumhachta is gá le haghaidh gníomhartha áirithe sa chomhrá seo. De ghnáth bíonn na leibhéil chumhachta 0, 50 agus 100 ag déanamh ionadaíochta d'úsáideoirí, do mhodhnóirí agus do riarthóirí, ach is féidir aon ghrádú a dhéanamh.", + "@chatPermissionsDescription": {}, + "changelog": "ChangelogName", + "@changelog": {}, + "sendCanceled": "Cealaíodh seoladh", + "@sendCanceled": {}, + "loginWithMatrixId": "Logáil isteach le Matrix-ID", + "@loginWithMatrixId": {}, + "discoverHomeservers": "Faigh amach faoi fhreastalaithe baile", + "@discoverHomeservers": {}, + "whatIsAHomeserver": "Cad is freastalaí baile ann?", + "@whatIsAHomeserver": {}, + "homeserverDescription": "Stóráiltear do chuid sonraí go léir ar an bhfreastalaí baile, díreach cosúil le soláthraí ríomhphoist. Is féidir leat an freastalaí baile is mian leat a úsáid a roghnú, agus is féidir leat cumarsáid a dhéanamh le gach duine fós. Foghlaim níos mó ag https://matrix.org.", + "@homeserverDescription": {}, + "calculatingFileSize": "Méid an chomhaid á ríomh...", + "@calculatingFileSize": {}, + "sendingAttachment": "Iatán á sheoladh...", + "@sendingAttachment": {}, + "generatingVideoThumbnail": "Mionsamhail físe á cruthú...", + "@generatingVideoThumbnail": {}, + "compressVideo": "Físeán á chomhbhrú...", + "@compressVideo": {}, + "sendingAttachmentCountOfCount": "Ceangaltán {index} de {length} á sheoladh...", + "@sendingAttachmentCountOfCount": { + "type": "integer", + "placeholders": { + "index": { + "type": "int" + }, + "length": { + "type": "int" + } + } + }, + "prepareSendingAttachment": "Ullmhaigh an t- iatán á sheoladh...", + "@prepareSendingAttachment": {}, + "serverLimitReached": "Sroicheadh teorainn an fhreastalaí! Ag fanacht {seconds} soicind...", + "@serverLimitReached": { + "type": "integer", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "oneOfYourDevicesIsNotVerified": "Ní fhíoraítear ceann de do ghléasanna", + "@oneOfYourDevicesIsNotVerified": {}, + "noticeChatBackupDeviceVerification": "Nóta: Nuair a nascann tú do ghléasanna go léir leis an gcúltaca comhrá, déantar iad a fhíorú go huathoibríoch.", + "@noticeChatBackupDeviceVerification": {}, + "continueText": "Lean ar aghaidh", + "@continueText": {}, + "welcomeText": "Hey Hey 👋 Is é seo FluffyChat. Is féidir leat síniú isteach in aon fhreastalaí baile, atá comhoiriúnach leis https://matrix.org. Agus ansin comhrá a dhéanamh le duine ar bith. Is líonra teachtaireachtaí díláraithe ollmhór é!", + "@welcomeText": {}, + "blur": "Doiléirigh:", + "@blur": {}, + "opacity": "Teimhneacht:", + "@opacity": {}, + "setWallpaper": "Socraigh cúlbhrat", + "@setWallpaper": {}, + "manageAccount": "Bainistigh cuntas", + "@manageAccount": {}, + "noContactInformationProvided": "Ní sholáthraíonn an freastalaí aon fhaisnéis teagmhála bhailí", + "@noContactInformationProvided": {}, + "contactServerAdmin": "Déan teagmháil le admin an fhreastalaí", + "@contactServerAdmin": {}, + "contactServerSecurity": "Déan teagmháil le slándáil an fhreastalaí", + "@contactServerSecurity": {}, + "supportPage": "Leathanach tacaíochta", + "@supportPage": {}, + "name": "Ainm", + "@name": {}, + "version": "Leagan", + "@version": {}, + "website": "Suíomh Gréasáin", + "@website": {}, + "messagesStyle": "Teachtaireachtaí:", + "@messagesStyle": {}, + "setColorTheme": "Socraigh téama datha:", + "@setColorTheme": {}, + "openGallery": "Oscail gailearaí", + "@openGallery": {}, + "users": "Úsáideoirí", + "@users": {}, + "youBannedUser": "Chuir tú cosc ar {user}", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "user": "Úsáideoir", + "@user": {}, + "databaseMigrationTitle": "Tá an bunachar sonraí optamaithe", + "@databaseMigrationTitle": {}, + "hasKnocked": "🚪 Tá {user} tar éis cnagadh", + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "report": "tuairisc", + "@report": {}, + "invite": "Tabhair cuireadh", + "@invite": {}, + "publicSpaces": "Spásanna poiblí", + "@publicSpaces": {}, + "whyIsThisMessageEncrypted": "Cén fáth nach féidir an teachtaireacht seo a léamh?", + "@whyIsThisMessageEncrypted": {}, + "pinMessage": "PIN go seomra", + "@pinMessage": {}, + "dehydrate": "Easpórtáil seisiún agus gléas wipe", + "@dehydrate": {}, + "dehydrateTor": "Úsáideoirí TOR: Seisiún easpórtála", + "@dehydrateTor": {}, + "commandHint_markasdm": "Marcáil mar sheomra teachtaireachta dírí don ID Maitrís tugtha", + "@commandHint_markasdm": {}, + "googlyEyesContent": "Seolann {senderName} súile googly chugat", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "commandHint_cuddle": "Seol cuddle", + "@commandHint_cuddle": {}, + "commandHint_hug": "Seol barróg", + "@commandHint_hug": {}, + "startFirstChat": "Cuir tús le do chéad chomhrá", + "@startFirstChat": {}, + "encryptThisChat": "Criptigh an comhrá seo", + "@encryptThisChat": {}, + "importNow": "Iompórtáil anois", + "@importNow": {}, + "sendTypingNotifications": "Seol fógraí clóscríofa", + "@sendTypingNotifications": {}, + "addChatDescription": "Cuir cur síos ar an gcomhrá leis...", + "@addChatDescription": {}, + "chatPermissions": "Ceadanna comhrá", + "@chatPermissions": {}, + "emoteKeyboardNoRecents": "Beidh mothúcháin a úsáideadh le déanaí le feiceáil anseo ...", + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "chatDescriptionHasBeenChanged": "Athraíodh cur síos ar an gcomhrá", + "@chatDescriptionHasBeenChanged": {}, + "pushNotificationsNotAvailable": "Níl fógraí brú ar fáil", + "@pushNotificationsNotAvailable": {}, + "publish": "Foilsigh", + "@publish": {}, + "changeGeneralChatSettings": "Athraigh socruithe ginearálta comhrá", + "@changeGeneralChatSettings": {}, + "sendRoomNotifications": "Seol fógraí @room", + "@sendRoomNotifications": {}, + "changeTheDescriptionOfTheGroup": "Athraigh an cur síos ar an gcomhrá", + "@changeTheDescriptionOfTheGroup": {}, + "aboutHomeserver": "Maidir le {homeserver}", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "cuddleContent": "Cuireann {senderName} do chudacht", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "countChatsAndCountParticipants": "{chats} comhrá agus {participants} rannpháirtí", + "@countChatsAndCountParticipants": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + }, + "participants": { + "type": "int" + } + } + }, + "noMoreChatsFound": "Níor aimsíodh a thuilleadh comhráite...", + "@noMoreChatsFound": {}, + "joinedChats": "Glacadh páirt i gcomhráite", + "@joinedChats": {}, + "space": "Spás", + "@space": {}, + "spaces": "Spásanna", + "@spaces": {}, + "directChat": "Comhrá díreach", + "@directChat": {}, + "redactedByBecause": "Athbhreithnithe ag {username} mar: \"{reason}\"", + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "recoveryKey": "Eochair athshlánaithe", + "@recoveryKey": {}, + "setChatDescription": "Socraigh cur síos ar an gcomhrá", + "@setChatDescription": {}, + "presenceStyle": "Láithreacht:", + "@presenceStyle": { + "type": "String", + "placeholders": {} + }, + "presencesToggle": "Taispeáin teachtaireachtaí stádais ó úsáideoirí eile", + "@presencesToggle": { + "type": "String", + "placeholders": {} + }, + "time": "Am", + "@time": {}, + "removeFromSpace": "Bain as spás", + "@removeFromSpace": {}, + "placeCall": "Cuir glaoch", + "@placeCall": {}, + "unsupportedAndroidVersion": "Leagan Android gan tacaíocht", + "@unsupportedAndroidVersion": {}, + "previousAccount": "Cuntas roimhe seo", + "@previousAccount": {}, + "widgetJitsi": "Jitsi le chéile", + "@widgetJitsi": {}, + "widgetCustom": "Saincheaptha", + "@widgetCustom": {}, + "widgetName": "Ainm", + "@widgetName": {}, + "usersMustKnock": "Ní mór d'úsáideoirí cnag a chur ar", + "@usersMustKnock": {}, + "noPublicLinkHasBeenCreatedYet": "Níor cruthaíodh aon nasc poiblí go fóill", + "@noPublicLinkHasBeenCreatedYet": {}, + "storeSecurlyOnThisDevice": "Stóráil go daingean ar an ngléas seo", + "@storeSecurlyOnThisDevice": {}, + "userLevel": "{level} - Úsáideoir", + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "updateInstalled": "🎉 Nuashonraigh {version} suiteáilte!", + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "serverInformation": "Eolas freastalaí:", + "@serverInformation": {}, + "knockRestricted": "Cnoc Mhuire srianta", + "@knockRestricted": {}, + "createGroup": "Cruthaigh grúpa", + "@createGroup": {}, + "noChatDescriptionYet": "Níl aon chur síos ar an gcomhrá cruthaithe fós.", + "@noChatDescriptionYet": {}, + "shareInviteLink": "Roinn an nasc cuireadh", + "@shareInviteLink": {}, + "notifyMeFor": "Cuir in iúl dom le haghaidh", + "@notifyMeFor": {}, + "passwordRecoverySettings": "Socruithe athshlánaithe pasfhocal", + "@passwordRecoverySettings": {}, + "widgetEtherpad": "Nóta téacs", + "@widgetEtherpad": {}, + "youKickedAndBanned": "🙅 Chiceáil tú agus chuir tú cosc ar {user}", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "publicChatAddresses": "Seoltaí comhrá poiblí", + "@publicChatAddresses": {}, + "createNewAddress": "Cruthaigh seoladh nua", + "@createNewAddress": {}, + "groupName": "Ainm an ghrúpa", + "@groupName": {}, + "bundleName": "Ainm an bheartáin", + "@bundleName": {}, + "enterSpace": "Iontráil spás", + "@enterSpace": {}, + "wasDirectChatDisplayName": "Comhrá folamh (bhí {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "oneClientLoggedOut": "Tá duine de do chliaint logáilte amach", + "@oneClientLoggedOut": {}, + "overview": "Forbhreathnú", + "@overview": {}, + "unverified": "Neamhfhíoraithe", + "@unverified": {}, + "widgetNameError": "Tabhair ainm taispeána, le do thoil.", + "@widgetNameError": {}, + "youRejectedTheInvitation": "Dhiúltaigh tú don chuireadh", + "@youRejectedTheInvitation": {}, + "youHaveWithdrawnTheInvitationFor": "Tharraing tú siar an cuireadh do {user}", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedToBy": "📩 Tugadh cuireadh duit trí nasc chuig:\n{alias}", + "@youInvitedToBy": { + "placeholders": { + "alias": { + "type": "String" + } + } + }, + "youInvitedUser": "📩 Thug tú cuireadh do {user}", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "unlockOldMessages": "Díghlasáil seanteachtaireachtaí", + "@unlockOldMessages": {}, + "saveKeyManuallyDescription": "Sábháil an eochair seo de láimh trí dialóg nó gearrthaisce comhroinnte an chórais a spreagadh.", + "@saveKeyManuallyDescription": {}, + "storeInAndroidKeystore": "Stóráil i Android KeyStore", + "@storeInAndroidKeystore": {}, + "storeInAppleKeyChain": "Stóráil i Apple KeyChain", + "@storeInAppleKeyChain": {}, + "appearOnTop": "Le feiceáil ar an mbarr", + "@appearOnTop": {}, + "newSpaceDescription": "Ligeann spásanna duit do chomhráite a chomhdhlúthú agus pobail phríobháideacha nó phoiblí a thógáil.", + "@newSpaceDescription": {}, + "chatCanBeDiscoveredViaSearchOnServer": "Is féidir comhrá a aimsiú tríd an gcuardach ar {server}", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "nothingFound": "Níor aimsíodh aon rud...", + "@nothingFound": {}, + "searchMore": "Cuardaigh tuilleadh...", + "@searchMore": {}, + "gallery": "Gailearaí", + "@gallery": {}, + "alwaysUse24HourFormat": "bréagach", + "@alwaysUse24HourFormat": { + "description": "Set to true to always display time of day in 24 hour format." + }, + "importFromZipFile": "Iompórtáil ó chomhad .zip", + "@importFromZipFile": {}, + "exportEmotePack": "Easpórtáil Emote pacáiste mar .zip", + "@exportEmotePack": {}, + "replace": "Ionadaigh", + "@replace": {}, + "appLockDescription": "Cuir glas ar an aip nuair nach bhfuil sé in úsáid le cód bioráin", + "@appLockDescription": {}, + "swipeRightToLeftToReply": "Svaidhpeáil ar dheis ar chlé chun freagra a thabhairt", + "@swipeRightToLeftToReply": {}, + "commandHint_discardsession": "Scrios an seisiún", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "allRooms": "Gach Comhrá Grúpa", + "@allRooms": { + "type": "String", + "placeholders": {} + }, + "block": "Bloc", + "@block": {}, + "blockListDescription": "Is féidir leat bac a chur ar úsáideoirí atá ag cur isteach ort. Ní bheidh tú in ann teachtaireachtaí nó cuireadh seomra ar bith a fháil ó na húsáideoirí ar do liosta bloc pearsanta.", + "@blockListDescription": {}, + "blockUsername": "Déan neamhaird de ainm úsáideora", + "@blockUsername": {}, + "inviteContactToGroupQuestion": "Ar mhaith leat cuireadh a thabhairt do {contact} chuig an gcomhrá \"{groupName}\"?", + "@inviteContactToGroupQuestion": {}, + "tryAgain": "Bain triail eile as", + "@tryAgain": {}, + "optionalRedactReason": "(Roghnach) An chúis leis an teachtaireacht seo a chur in eagar...", + "@optionalRedactReason": {}, + "dehydrateWarning": "Ní féidir an gníomh seo a chealú. Cinntigh go stórálann tú an comhad cúltaca go sábháilte.", + "@dehydrateWarning": {}, + "hydrateTor": "Úsáideoirí TOR: Iompórtáil easpórtáil seisiún", + "@hydrateTor": {}, + "hydrateTorLong": "An ndearna tú do sheisiún a easpórtáil an uair dheireanach ar TOR? Iompórtáil go tapa é agus leanúint ar aghaidh ag comhrá.", + "@hydrateTorLong": {}, + "hydrate": "Athchóirigh ó chomhad cúltaca", + "@hydrate": {}, + "commandHint_googly": "Seol roinnt súile googly", + "@commandHint_googly": {}, + "notAnImage": "Ní comhad íomhá é.", + "@notAnImage": {}, + "userRole": "Ról an úsáideora", + "@userRole": {}, + "minimumPowerLevel": "Is é {level} an t-íosleibhéal cumhachta.", + "@minimumPowerLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "String" + } + } + }, + "isReadyForKeyVerification": "Tá {sender} réidh le haghaidh fíorú eochair", + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "startedKeyVerification": "Thosaigh {sender} fíorú eochrach", + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "stickers": "Greamáin", + "@stickers": {}, + "discover": "Faigh amach", + "@discover": {}, + "unreadChatsInApp": "{appname}: {unread} comhráite gan léamh", + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "noDatabaseEncryption": "Ní thacaítear le criptiú bunachar sonraí ar an ardán seo", + "@noDatabaseEncryption": {}, + "thereAreCountUsersBlocked": "Faoi láthair tá bac curtha ar úsáideoirí {count}.", + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "sendReadReceiptsDescription": "Is féidir le rannpháirtithe eile i gcomhrá a fheiceáil nuair a bhíonn teachtaireacht léite agat.", + "@sendReadReceiptsDescription": {}, + "doesNotSeemToBeAValidHomeserver": "Ní cosúil gur freastalaí baile comhoiriúnach é. URL mícheart?", + "@doesNotSeemToBeAValidHomeserver": {}, + "indexedDbErrorTitle": "Saincheisteanna mód príobháideach", + "@indexedDbErrorTitle": {}, + "indexedDbErrorLong": "Ar an drochuair níl an stóráil teachtaireachta cumasaithe sa mhód príobháideach de réir réamhshocraithe.\nTabhair cuairt le do thoil\n - faoi: config\n - socraithe dom.indexedDB.privateBrowsing.enabled go fíor\nSeachas sin, ní féidir FluffyChat a rith.", + "@indexedDbErrorLong": {}, + "nextAccount": "An chéad chuntas eile", + "@nextAccount": {}, + "youJoinedTheChat": "Chuaigh tú isteach sa chomhrá", + "@youJoinedTheChat": {}, + "youAcceptedTheInvitation": "👍 Ghlac tú leis an gcuireadh", + "@youAcceptedTheInvitation": {}, + "screenSharingTitle": "comhroinnt scáileáin", + "@screenSharingTitle": {}, + "accessAndVisibility": "Rochtain agus infheictheacht", + "@accessAndVisibility": {}, + "accessAndVisibilityDescription": "Cé a bhfuil cead aige páirt a ghlacadh sa chomhrá seo agus conas is féidir an comhrá a aimsiú.", + "@accessAndVisibilityDescription": {}, + "calls": "Glaonna", + "@calls": {}, + "customEmojisAndStickers": "Emojis agus greamáin saincheaptha", + "@customEmojisAndStickers": {}, + "customEmojisAndStickersBody": "Cuir leis nó roinn emojis nó greamáin saincheaptha is féidir a úsáid in aon chomhrá.", + "@customEmojisAndStickersBody": {}, + "chatDescription": "Cur síos ar an gcomhrá", + "@chatDescription": {}, + "hideRedactedMessages": "Folaigh teachtaireachtaí curtha in eagar", + "@hideRedactedMessages": {}, + "hideRedactedMessagesBody": "Má athghníomhaíonn duine éigin teachtaireacht, ní bheidh an teachtaireacht seo le feiceáil sa chomhrá a thuilleadh.", + "@hideRedactedMessagesBody": {}, + "hideInvalidOrUnknownMessageFormats": "Folaigh formáidí teachtaireachta neamhbhailí nó anaithnid", + "@hideInvalidOrUnknownMessageFormats": {}, + "blockedUsers": "Úsáideoirí bactha", + "@blockedUsers": {}, + "redactMessageDescription": "Athrófar an teachtaireacht do gach rannpháirtí sa chomhrá seo. Ní féidir é seo a chealú.", + "@redactMessageDescription": {}, + "noKeyForThisMessage": "Féadfaidh sé seo tarlú má seoladh an teachtaireacht sular shínigh tú isteach ar do chuntas ag an ngléas seo.\n\nIs féidir freisin gur chuir an seoltóir bac ar do ghléas nó go ndeachaigh rud éigin mícheart leis an nasc idirlín.\n\nAn bhfuil tú in ann an teachtaireacht a léamh ar sheisiún eile? Ansin is féidir leat an teachtaireacht a aistriú uaidh! Téigh go Socruithe > Gléasanna agus cinntigh go bhfuil do ghléasanna fíoraithe a chéile. Nuair a osclaíonn tú an seomra an chéad uair eile agus an dá sheisiún sa tulra, déanfar na heochracha a tharchur go huathoibríoch.\n\nNár mhaith leat na heochracha a chailleadh agus tú ag logáil amach nó ag aistriú gléasanna? Déan cinnte go bhfuil an cúltaca comhrá cumasaithe agat sna socruithe.", + "@noKeyForThisMessage": {}, + "sendUncompressed": "Seol neamh-chomhbhrúite", + "@sendUncompressed": {}, + "boldText": "Téacs trom", + "@boldText": {}, + "italicText": "Téacs iodálach", + "@italicText": {}, + "strikeThrough": "Stailc tríd", + "@strikeThrough": {}, + "addLink": "Cuir nasc leis", + "@addLink": {}, + "pleaseFillOut": "Líon amach le do thoil", + "@pleaseFillOut": {}, + "invalidUrl": "URL neamhbhailí", + "@invalidUrl": {}, + "unableToJoinChat": "Ní féidir páirt a ghlacadh sa chomhrá. B’fhéidir go bhfuil an comhrá dúnta cheana féin ag an bpáirtí eile.", + "@unableToJoinChat": {}, + "compress": "Comhbhrúigh", + "@compress": {}, + "sendImages": "Seol {count} íomhá", + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "appIntroduction": "Ligeann FluffyChat duit comhrá a dhéanamh le do chairde thar theachtairí éagsúla. Foghlaim tuilleadh ag https://matrix.org nó tapáil *Ar aghaidh*.", + "@appIntroduction": {}, + "appWantsToUseForLoginDescription": "Ligeann tú leis seo don aip agus don suíomh Gréasáin faisnéis a roinnt fút.", + "@appWantsToUseForLoginDescription": {}, + "synchronizingPleaseWaitCounter": " Ag sioncronú… ({percentage}%)", + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "appWantsToUseForLogin": "Úsáid '{server}' chun logáil isteach", + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "open": "Oscail", + "@open": {}, + "waitingForServer": "Ag fanacht leis an bhfreastalaí...", + "@waitingForServer": {}, + "previous": "Roimhe Seo", + "@previous": {}, + "otherPartyNotLoggedIn": "Níl an páirtí eile logáilte isteach faoi láthair agus mar sin ní féidir leo teachtaireachtaí a fháil!", + "@otherPartyNotLoggedIn": {}, + "contentNotificationSettings": "Socruithe fógra inneachair", + "@contentNotificationSettings": {}, + "generalNotificationSettings": "Socruithe ginearálta fógra", + "@generalNotificationSettings": {}, + "roomNotificationSettings": "Socruithe fógra seomra", + "@roomNotificationSettings": {}, + "userSpecificNotificationSettings": "Socruithe fógra sainiúla don úsáideoir", + "@userSpecificNotificationSettings": {}, + "otherNotificationSettings": "Socruithe fógra eile", + "@otherNotificationSettings": {}, + "notificationRuleContainsUserName": "Tá Ainm Úsáideora ann", + "@notificationRuleContainsUserName": {}, + "notificationRuleMaster": "Balbhaigh gach fógra", + "@notificationRuleMaster": {}, + "notificationRuleMasterDescription": "Sáraíonn sé gach riail eile agus díchumasaítear gach fógra.", + "@notificationRuleMasterDescription": {}, + "notificationRuleSuppressNotices": "Bain Teachtaireachtaí Uathoibrithe", + "@notificationRuleSuppressNotices": {}, + "notificationRuleSuppressNoticesDescription": "Sochtann sé fógraí ó chliaint uathoibrithe amhail róbónna.", + "@notificationRuleSuppressNoticesDescription": {}, + "notificationRuleInviteForMe": "Tabhair cuireadh Do Mhise", + "@notificationRuleInviteForMe": {}, + "notificationRuleMemberEvent": "Imeacht Ball", + "@notificationRuleMemberEvent": {}, + "notificationRuleMemberEventDescription": "Sochtann fógraí le haghaidh imeachtaí ballraíochta.", + "@notificationRuleMemberEventDescription": {}, + "notificationRuleIsUserMention": "Luaigh Úsáideoir", + "@notificationRuleIsUserMention": {}, + "notificationRuleIsUserMentionDescription": "Cuireann sé sin in iúl don úsáideoir nuair a luaitear go díreach iad i dteachtaireacht.", + "@notificationRuleIsUserMentionDescription": {}, + "notificationRuleContainsDisplayName": "Tá Ainm Taispeána ann", + "@notificationRuleContainsDisplayName": {}, + "notificationRuleIsRoomMention": "Luaigh Seomra", + "@notificationRuleIsRoomMention": {}, + "notificationRuleIsRoomMentionDescription": "Cuireann sé sin in iúl don úsáideoir nuair a luaitear seomra.", + "@notificationRuleIsRoomMentionDescription": {}, + "notificationRuleRoomnotif": "Fógra Seomra", + "@notificationRuleRoomnotif": {}, + "notificationRuleRoomnotifDescription": "Cuireann sé seo in iúl don úsáideoir nuair a bhíonn '@room' i dteachtaireacht.", + "@notificationRuleRoomnotifDescription": {}, + "notificationRuleTombstone": "Leac uaighe", + "@notificationRuleTombstone": {}, + "notificationRuleTombstoneDescription": "Cuireann sé seo in iúl don úsáideoir faoi theachtaireachtaí díghníomhaithe seomra.", + "@notificationRuleTombstoneDescription": {}, + "notificationRuleReactionDescription": "Sochtann fógraí le haghaidh frithghníomhartha.", + "@notificationRuleReactionDescription": {}, + "notificationRuleRoomServerAcl": "Freastalaí Seomra ACL", + "@notificationRuleRoomServerAcl": {}, + "notificationRuleRoomServerAclDescription": "Sochtann sé fógraí do liostaí rialaithe rochtana freastalaí seomra (ACL).", + "@notificationRuleRoomServerAclDescription": {}, + "notificationRuleSuppressEdits": "Cuir na hEagarthóirí ar ceal", + "@notificationRuleSuppressEdits": {}, + "notificationRuleSuppressEditsDescription": "Sochtann fógraí le haghaidh teachtaireachtaí curtha in eagar.", + "@notificationRuleSuppressEditsDescription": {}, + "notificationRuleCall": "Glaoigh", + "@notificationRuleCall": {}, + "notificationRuleCallDescription": "Cuireann sé an t-úsáideoir ar an eolas faoi ghlaonna.", + "@notificationRuleCallDescription": {}, + "notificationRuleEncryptedRoomOneToOne": "Seomra Duine le Duine Criptithe", + "@notificationRuleEncryptedRoomOneToOne": {}, + "notificationRuleRoomOneToOne": "Seomra duine le duine", + "@notificationRuleRoomOneToOne": {}, + "notificationRuleRoomOneToOneDescription": "Cuireann sé seo in iúl don úsáideoir faoi theachtaireachtaí i seomraí duine le duine.", + "@notificationRuleRoomOneToOneDescription": {}, + "notificationRuleMessage": "Teachtaireacht", + "@notificationRuleMessage": {}, + "notificationRuleMessageDescription": "Cuireann sé seo in iúl don úsáideoir faoi theachtaireachtaí ginearálta.", + "@notificationRuleMessageDescription": {}, + "notificationRuleEncrypted": "Criptithe", + "@notificationRuleEncrypted": {}, + "notificationRuleJitsi": "Jitsi", + "@notificationRuleJitsi": {}, + "notificationRuleJitsiDescription": "Cuireann sé seo in iúl don úsáideoir faoi imeachtaí giuirléidí Jitsi.", + "@notificationRuleJitsiDescription": {}, + "notificationRuleServerAcl": "Seachtaigh Freastalaí ACL Imeachtaí", + "@notificationRuleServerAcl": {}, + "more": "Tuilleadh", + "@more": {}, + "newChatRequest": "📩 Iarratas comhrá nua", + "@newChatRequest": {}, + "shareKeysWith": "Roinn na heochracha le...", + "@shareKeysWith": {}, + "allDevices": "Gach gléasanna", + "@allDevices": {}, + "crossVerifiedDevicesIfEnabled": "Gléasanna trasfhíoraithe má tá siad cumasaithe", + "@crossVerifiedDevicesIfEnabled": {}, + "crossVerifiedDevices": "Feistí trasfhíoraithe", + "@crossVerifiedDevices": {}, + "unknownPushRule": "Riail bhrú anaithnid '{rule}'", + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } + } + }, + "notificationRuleReaction": "Imoibriú", + "@notificationRuleReaction": {}, + "notificationRuleEncryptedDescription": "Cuireann sé seo in iúl don úsáideoir faoi theachtaireachtaí i seomraí criptithe.", + "@notificationRuleEncryptedDescription": {}, + "notificationRuleContainsUserNameDescription": "Cuireann sé sin in iúl don úsáideoir nuair a bhíonn a ainm úsáideora i dteachtaireacht.", + "@notificationRuleContainsUserNameDescription": {}, + "notificationRuleInviteForMeDescription": "Cuireann sé seo ar an eolas don úsáideoir nuair a thugtar cuireadh dó/di go seomra.", + "@notificationRuleInviteForMeDescription": {}, + "deletePushRuleCanNotBeUndone": "Má scriosann tú an socrú fógra seo, ní féidir é seo a chealú.", + "@deletePushRuleCanNotBeUndone": {}, + "notificationRuleContainsDisplayNameDescription": "Cuireann sé sin in iúl don úsáideoir nuair a bhíonn a ainm taispeána i dteachtaireacht.", + "@notificationRuleContainsDisplayNameDescription": {}, + "notificationRuleEncryptedRoomOneToOneDescription": "Cuireann sé seo in iúl don úsáideoir faoi theachtaireachtaí i seomraí duine le duine criptithe.", + "@notificationRuleEncryptedRoomOneToOneDescription": {}, + "notificationRuleServerAclDescription": "Sochtann fógraí le haghaidh imeachtaí Freastalaí ACL.", + "@notificationRuleServerAclDescription": {}, + "shareKeysWithDescription": "Cad iad na gléasanna ar cheart muinín a chur iontu ionas gur féidir leo do chuid teachtaireachtaí a léamh i gcomhráite criptithe?", + "@shareKeysWithDescription": {}, + "verifiedDevicesOnly": "Gléasanna fíoraithe amháin", + "@verifiedDevicesOnly": {}, + "takeAPhoto": "Glac grianghraf", + "@takeAPhoto": {}, + "recordAVideo": "Taifead físeán", + "@recordAVideo": {}, + "notSupportedOnThisDevice": "Ní thacaítear leis ar an ngléas seo", + "@notSupportedOnThisDevice": {}, + "optionalMessage": "Teachtaireacht (Roghnach)…", + "@optionalMessage": {}, + "enterNewChat": "Cuir isteach comhrá nua", + "@enterNewChat": {}, + "commandHint_roomupgrade": "Uasghrádaigh an seomra seo go dtí an leagan seomra a thugtar", + "@commandHint_roomupgrade": {} +} diff --git a/assets/l10n/intl_gl.arb b/assets/l10n/intl_gl.arb new file mode 100644 index 0000000..d81422e --- /dev/null +++ b/assets/l10n/intl_gl.arb @@ -0,0 +1,3349 @@ +{ + "@@locale": "gl", + "@@last_modified": "2021-08-14 12:41:10.040321", + "about": "Acerca de", + "@about": { + "type": "String", + "placeholders": {} + }, + "accept": "Aceptar", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 {username} aceptou o convite", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "Conta", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐 {username} activou a cifraxe extremo-a-extremo", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "addEmail": "Engadir email", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "admin": "Admin", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "alias", + "@alias": { + "type": "String", + "placeholders": {} + }, + "all": "Todos", + "@all": { + "type": "String", + "placeholders": {} + }, + "allChats": "Todas as conversas", + "@allChats": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "{senderName} respondeu á chamada", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "Calquera pode unirse", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "appLock": "Bloqueo da app", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "archive": "Arquivo", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "Permitir o acceso de convidadas", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "Tes a certeza?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "areYouSureYouWantToLogout": "Tes a certeza de querer saír?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "Para poder asinar a outra persoa, escribe a túa frase de paso ou chave de recuperación.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "Aceptar a solicitude de verificación de {username}?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "autoplayImages": "Reproducir automáticamente adhesivos e emotes", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "badServerLoginTypesException": "O servidor soporta as seguintes formas de conexión:\n{serverVersions}\nPero esta app só soporta:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "badServerVersionsException": "O servidor soporta as seguintes características:\n{serverVersions}\nPero esta app só soporta {supportedVersions}", + "@badServerVersionsException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "banFromChat": "Vetar na conversa", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "Vetada", + "@banned": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username} vetou a {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "Bloquear dispositivo", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "blocked": "Bloqueado", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "botMessages": "Mensaxes de Bot", + "@botMessages": { + "type": "String", + "placeholders": {} + }, + "cancel": "Cancelar", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "cantOpenUri": "Non se pode abrir o URI {uri}", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "changeDeviceName": "Cambiar nome do dispositivo", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "{username} cambiou o avatar da conversa", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatDescriptionTo": "{username} mudou a descrición da conversa a: '{description}'", + "@changedTheChatDescriptionTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "description": { + "type": "String" + } + } + }, + "changedTheChatNameTo": "{username} mudou o nome da charla a: '{chatname}'", + "@changedTheChatNameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "chatname": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username} mudou os permisos da conversa", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username} cambiou o nome público a: '{displayname}'", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} mudou as regras de acceso para convidadas", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} mudou as regras de acceso para convidadas a: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username} mudou a visibilidade do historial", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username} mudou a visibilidade do historial a: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username} mudou as regras de acceso", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} mudou as regras de acceso a: {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} mudou o avatar", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "{username} mudou os alias da sala", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username} mudou a ligazón de convite", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changePassword": "Mudar contrasinal", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "Mudar de servidor de inicio", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "Cambiar o estilo", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "Mudar o nome do grupo", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "changeYourAvatar": "Cambia o avatar", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "A cifraxe está estragada", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "chat": "Conversa", + "@chat": { + "type": "String", + "placeholders": {} + }, + "chatBackup": "Copia de apoio", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "chatBackupDescription": "As mensaxes antigas están protexidas cunha chave de recuperación. Pon coidado e non a perdas.", + "@chatBackupDescription": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Detalles da conversa", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chats": "Conversas", + "@chats": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "Escolle un contrasinal forte", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "clearArchive": "Baleirar arquivo", + "@clearArchive": {}, + "close": "Pechar", + "@close": { + "type": "String", + "placeholders": {} + }, + "commandHint_ban": "Vetar a usuaria indicada desta sala", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_html": "Enviar texto con formato HTML", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_invite": "Convidar á usuaria a esta sala", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "commandHint_join": "Unirte á sala indicada", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_kick": "Eliminar a usuaria indicada desta sala", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_leave": "Saír desta sala", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_me": "Conta algo sobre ti", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "commandHint_myroomavatar": "Establece a túa imaxe para esta sala (por mxc-uri)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_myroomnick": "Establece o teu nome público para esta sala", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "commandHint_op": "Establecer o nivel de responsabilidade da usuaria (por defecto: 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_plain": "Enviar texto sen formato", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_react": "Enviar resposta como reacción", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "commandHint_send": "Enviar texto", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "commandHint_unban": "Retirar veto á usuaria para esta sala", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "commandInvalid": "Comando non válido", + "@commandInvalid": { + "type": "String" + }, + "commandMissing": "{command} non é un comando.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "compareEmojiMatch": "Compara estes emojis", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "Compara estes números", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "configureChat": "Configurar conversa", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "confirm": "Confirmar", + "@confirm": { + "type": "String", + "placeholders": {} + }, + "connect": "Conectar", + "@connect": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "O contacto foi convidado ao grupo", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "containsDisplayName": "Contén nome público", + "@containsDisplayName": { + "type": "String", + "placeholders": {} + }, + "containsUserName": "Contén nome de usuaria", + "@containsUserName": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "O contido foi denunciado á administración do servidor", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "Copiado ao portapapeis", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "Copiar", + "@copy": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "Copiar ao portapapeis", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "Non se descifrou a mensaxe: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "countParticipants": "{count} participantes", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "create": "Crear", + "@create": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "💬 {username} creou a conversa", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "createNewSpace": "Novo espazo", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "currentlyActive": "Actualmente activo", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "Escuro", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "dateWithoutYear": "{day}-{month}", + "@dateWithoutYear": { + "type": "String", + "placeholders": { + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "dateWithYear": "{day}-{month}-{year}", + "@dateWithYear": { + "type": "String", + "placeholders": { + "year": { + "type": "String" + }, + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "deactivateAccountWarning": "Esto desactivará a conta. Esto non ten volta atrás. Estás segura?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "Nivel de permisos por defecto para novas usuarias", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "delete": "Eliminar", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "Eliminar conta", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "Eliminar mensaxe", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "device": "Dispositivo", + "@device": { + "type": "String", + "placeholders": {} + }, + "deviceId": "ID do dispositivo", + "@deviceId": { + "type": "String", + "placeholders": {} + }, + "devices": "Dispositivos", + "@devices": { + "type": "String", + "placeholders": {} + }, + "directChats": "Conversas Directas", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "O nome público mudou", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "Descargar ficheiro", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "edit": "Editar", + "@edit": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "Editar servidores bloqueados", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "editDisplayname": "Editar nome público", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "editRoomAliases": "Editar alias da sala", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "Editar avatar da sala", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "Xa existe ese emote!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "Atallo do emote non é válido!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emotePacks": "Paquetes de Emotes para a sala", + "@emotePacks": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "Axustes de Emote", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "emoteShortcode": "Atallo de Emote", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emoteWarnNeedToPick": "Escribe un atallo e asocialle unha imaxe!", + "@emoteWarnNeedToPick": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "Conversa baleira", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "Activar paquete emote globalmente", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "Activar cifraxe", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "Non poderás desactivar a cifraxe posteriormente, tes certeza?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "encrypted": "Cifrado", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "encryption": "Cifraxe", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "A cifraxe non está activada", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName} rematou a chamada", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "enterAnEmailAddress": "Escribe un enderezo de email", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "enterYourHomeserver": "Escribe o teu servidor de inicio", + "@enterYourHomeserver": { + "type": "String", + "placeholders": {} + }, + "errorObtainingLocation": "Erro ao obter a localización: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "everythingReady": "Todo preparado!", + "@everythingReady": { + "type": "String", + "placeholders": {} + }, + "extremeOffensive": "Extremadamente ofensivo", + "@extremeOffensive": { + "type": "String", + "placeholders": {} + }, + "fileName": "Nome do ficheiro", + "@fileName": { + "type": "String", + "placeholders": {} + }, + "fluffychat": "FluffyChat", + "@fluffychat": { + "type": "String", + "placeholders": {} + }, + "fontSize": "Tamaño da letra", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "forward": "Reenviar", + "@forward": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "Desde que se una", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "Desde o convite", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "goToTheNewRoom": "Ir á nova sala", + "@goToTheNewRoom": { + "type": "String", + "placeholders": {} + }, + "group": "Grupo", + "@group": { + "type": "String", + "placeholders": {} + }, + "groupIsPublic": "O grupo é público", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "groups": "Grupos", + "@groups": { + "type": "String", + "placeholders": {} + }, + "groupWith": "Grupo con {displayname}", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "guestsAreForbidden": "Non se permiten convidadas", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "Permítense convidadas", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{username} retirou o convite para {targetName}", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "help": "Axuda", + "@help": { + "type": "String", + "placeholders": {} + }, + "hideRedactedEvents": "Agochar eventos editados", + "@hideRedactedEvents": { + "type": "String", + "placeholders": {} + }, + "hideUnknownEvents": "Agochar eventos descoñecidos", + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "howOffensiveIsThisContent": "É moi ofensivo este contido?", + "@howOffensiveIsThisContent": { + "type": "String", + "placeholders": {} + }, + "id": "ID", + "@id": { + "type": "String", + "placeholders": {} + }, + "identity": "Identidade", + "@identity": { + "type": "String", + "placeholders": {} + }, + "ignore": "Ignorar", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "ignoredUsers": "Usuarias ignoradas", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "iHaveClickedOnLink": "Premín na ligazón", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "Frase de paso ou chave de recuperación incorrecta", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "inoffensive": "Inofensivo", + "@inoffensive": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "Convidar contacto", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "Convidar contacto a {groupName}", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "invited": "Convidado", + "@invited": { + "type": "String", + "placeholders": {} + }, + "invitedUser": "📩 {username} convidou a {targetName}", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "invitedUsersOnly": "Só usuarias convidadas", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "inviteForMe": "Convite para min", + "@inviteForMe": { + "type": "String", + "placeholders": {} + }, + "inviteText": "{username} convidoute a FluffyChat.\n1. Visita fluffychat.im e instala a app\n2. Crea unha conta ou Accede\n3. Abre a ligazón do convite: \n {link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "isTyping": "está escribindo…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "👋 {username} uníuse á conversa", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "joinRoom": "Unirse á sala", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "kicked": "👞 {username} expulsou a {targetName}", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickedAndBanned": "🙅 {username} expulsou e vetou a {targetName}", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickFromChat": "Expulsar da conversa", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "Última actividade: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "leave": "Saír", + "@leave": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "Deixar a conversa", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "license": "Licenza", + "@license": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "Claro", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "Cargar {count} participantes máis", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "loadingPleaseWait": "Cargando... Agarda.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "loadMore": "Cargar máis…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "locationDisabledNotice": "Os servizos de localización están desactivados. Actívaos para poder compartir a localización.", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "locationPermissionDeniedNotice": "Permiso de localización denegado. Concede este permiso para poder compartir a localización.", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "login": "Acceder", + "@login": { + "type": "String", + "placeholders": {} + }, + "logInTo": "Entrar en {homeserver}", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "logout": "Pechar sesión", + "@logout": { + "type": "String", + "placeholders": {} + }, + "memberChanges": "Cambios de participantes", + "@memberChanges": { + "type": "String", + "placeholders": {} + }, + "mention": "Mención", + "@mention": { + "type": "String", + "placeholders": {} + }, + "messages": "Mensaxes", + "@messages": { + "type": "String", + "placeholders": {} + }, + "moderator": "Moderadora", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "muteChat": "Acalar conversa", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "needPantalaimonWarning": "Ten en conta que polo de agora precisas Pantalaimon para a cifraxe extremo-a-extremo.", + "@needPantalaimonWarning": { + "type": "String", + "placeholders": {} + }, + "newChat": "Nova conversa", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "💬 Nova mensaxe en FluffyChat", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "Nova solicitude de verificación!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "next": "Seguinte", + "@next": { + "type": "String", + "placeholders": {} + }, + "no": "Non", + "@no": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "Sen conexión co servidor", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "Non hai emotes. 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "Só podes activar a cifraxe tan pronto como a sala non sexa públicamente accesible.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "Semella que non tes Firebase Cloud Messaging dispoñible no teu dispositivo. Para recibir notificacións push recomendamos que instales ntfy. Con ntfy ou outro provedor Unified Push podes recibir notificacións push de xeito seguro. Podes descargar ntfy desde a PlayStore ou F-Droid.", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "noMatrixServer": "{server1} non é un servidor matrix, usar {server2} no seu lugar?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "none": "Ningún", + "@none": { + "type": "String", + "placeholders": {} + }, + "noPasswordRecoveryDescription": "Aínda non engaiches ningún xeito de recuperar o contrasinal.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "noPermission": "Sen permiso", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "Non se atoparon salas…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "notifications": "Notificacións", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "notificationsEnabledForThisAccount": "Notificacións activadas para a conta", + "@notificationsEnabledForThisAccount": { + "type": "String", + "placeholders": {} + }, + "numUsersTyping": "{count} usuarias están escribindo…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "obtainingLocation": "Obtendo a localización…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "offensive": "Ofensivo", + "@offensive": { + "type": "String", + "placeholders": {} + }, + "offline": "Desconectada", + "@offline": { + "type": "String", + "placeholders": {} + }, + "ok": "Ok", + "@ok": { + "type": "String", + "placeholders": {} + }, + "online": "En liña", + "@online": { + "type": "String", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "Copia de Apoio en liña das Chaves activada", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "oopsPushError": "Vaites! Desgraciadamente algo fallou ao configurar as notificacións push.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "Ooooi, algo fallou…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "Abrir a app e ler mensaxes", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "openCamera": "Abrir cámara", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "openInMaps": "Abrir en mapas", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "or": "Ou", + "@or": { + "type": "String", + "placeholders": {} + }, + "participant": "Participante", + "@participant": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "frase de paso ou chave de recuperación", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "password": "Contrasinal", + "@password": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "Contrasinal esquecido", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "Cambiouse o contrasinal", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "passwordRecovery": "Recuperación do contrasinal", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "people": "Persoas", + "@people": { + "type": "String", + "placeholders": {} + }, + "pickImage": "Elixe unha imaxe", + "@pickImage": { + "type": "String", + "placeholders": {} + }, + "pin": "Fixar", + "@pin": { + "type": "String", + "placeholders": {} + }, + "play": "Reproducir {fileName}", + "@play": { + "type": "String", + "placeholders": { + "fileName": { + "type": "String" + } + } + }, + "pleaseChoose": "Por favor elixe", + "@pleaseChoose": { + "type": "String", + "placeholders": {} + }, + "pleaseChooseAPasscode": "Escolle un código de acceso", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "pleaseClickOnLink": "Preme na ligazón do email e segue as instrucións.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "pleaseEnter4Digits": "Escribe 4 díxitos ou deíxao baleiro para non activar o bloqueo.", + "@pleaseEnter4Digits": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPassword": "Escribe o teu contrasinal", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPin": "Escribe o teu pin", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "Escribe o teu nome de usuaria", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "Segue as instruccións do sitio web e toca en seguinte.", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "privacy": "Privacidade", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "Salas públicas", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "pushRules": "Regras de envío", + "@pushRules": { + "type": "String", + "placeholders": {} + }, + "reason": "Razón", + "@reason": { + "type": "String", + "placeholders": {} + }, + "recording": "Gravando", + "@recording": { + "type": "String", + "placeholders": {} + }, + "redactedAnEvent": "{username} editou un evento", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "redactMessage": "Eliminar mensaxe", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "register": "Crear conta", + "@register": { + "type": "String", + "placeholders": {} + }, + "reject": "Rexeitar", + "@reject": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "{username} rexeitou o convite", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "rejoin": "Volta a unirte", + "@rejoin": { + "type": "String", + "placeholders": {} + }, + "remove": "Quitar", + "@remove": { + "type": "String", + "placeholders": {} + }, + "removeAllOtherDevices": "Quitar todos os outros dispositivos", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "removedBy": "Eliminado por {username}", + "@removedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "removeDevice": "Quitar dispositivo", + "@removeDevice": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "Retirar veto na conversa", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "removeYourAvatar": "Elimina o avatar", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "renderRichContent": "Mostrar contido enriquecido da mensaxe", + "@renderRichContent": { + "type": "String", + "placeholders": {} + }, + "replaceRoomWithNewerVersion": "Substituír sala pola nova versión", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "reply": "Responder", + "@reply": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "Denunciar mensaxe", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "requestPermission": "Solicitar permiso", + "@requestPermission": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "A sala foi actualizada", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "Versión da sala", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "saveFile": "Gardar ficheiro", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "search": "Buscar", + "@search": { + "type": "String", + "placeholders": {} + }, + "security": "Seguridade", + "@security": { + "type": "String", + "placeholders": {} + }, + "seenByUser": "Visto por {username}", + "@seenByUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "send": "Enviar", + "@send": { + "type": "String", + "placeholders": {} + }, + "sendAMessage": "Enviar unha mensaxe", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "sendAsText": "Enviar como texto", + "@sendAsText": { + "type": "String" + }, + "sendAudio": "Enviar audio", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendFile": "Enviar ficheiro", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendImage": "Enviar imaxe", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendMessages": "Enviar mensaxes", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "sendOriginal": "Enviar orixinal", + "@sendOriginal": { + "type": "String", + "placeholders": {} + }, + "sendSticker": "Enviar adhesivo", + "@sendSticker": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "Enviar vídeo", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "sentAFile": "📁 {username} enviou un ficheiro", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAnAudio": "🎤 {username} enviou un audio", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAPicture": "🖼️ {username} enviou unha imaxe", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentASticker": "😊 {username} enviou un adhesivo", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "🎥 {username} enviou un vídeo", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentCallInformations": "{senderName} enviou información da chamada", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "setAsCanonicalAlias": "Establecer como alias principal", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "setCustomEmotes": "Establecer emotes personalizados", + "@setCustomEmotes": { + "type": "String", + "placeholders": {} + }, + "setInvitationLink": "Establecer ligazón do convite", + "@setInvitationLink": { + "type": "String", + "placeholders": {} + }, + "setPermissionsLevel": "Establecer nivel de permisos", + "@setPermissionsLevel": { + "type": "String", + "placeholders": {} + }, + "setStatus": "Establecer estado", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "settings": "Axustes", + "@settings": { + "type": "String", + "placeholders": {} + }, + "share": "Compartir", + "@share": { + "type": "String", + "placeholders": {} + }, + "sharedTheLocation": "{username} compartiu a súa localización", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "shareLocation": "Compartir localización", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "showPassword": "Amosar contrasinal", + "@showPassword": { + "type": "String", + "placeholders": {} + }, + "singlesignon": "Conexión Unificada SSO", + "@singlesignon": { + "type": "String", + "placeholders": {} + }, + "skip": "Saltar", + "@skip": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "Código fonte", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "spaceIsPublic": "O Espazo é público", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "spaceName": "Nome do Espazo", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "startedACall": "{senderName} iniciou unha chamada", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "status": "Estado", + "@status": { + "type": "String", + "placeholders": {} + }, + "statusExampleMessage": "¿Que tal estás hoxe?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "submit": "Enviar", + "@submit": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWait": "Sincronizando... Agarda.", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "systemTheme": "Sistema", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "Non concordan", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "Concordan", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "title": "FluffyChat", + "@title": { + "description": "Title for the application", + "type": "String", + "placeholders": {} + }, + "toggleFavorite": "Marcar Favorito", + "@toggleFavorite": { + "type": "String", + "placeholders": {} + }, + "toggleMuted": "Cambia Noificacións", + "@toggleMuted": { + "type": "String", + "placeholders": {} + }, + "toggleUnread": "Marcar como Lido/Non lido", + "@toggleUnread": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "Demasiadas solicitudes. Inténtao máis tarde!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "transferFromAnotherDevice": "Transferir desde outro dispositivo", + "@transferFromAnotherDevice": { + "type": "String", + "placeholders": {} + }, + "tryToSendAgain": "Inténtao outra vez", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "unavailable": "Non dispoñible", + "@unavailable": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username} retirou o veto a {targetName}", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "unblockDevice": "Desbloquear dispositivo", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "Dispositivo descoñecido", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "unknownEncryptionAlgorithm": "Algoritmo de cifraxe descoñecido", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unknownEvent": "Evento descoñecido '{type}'", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "unmuteChat": "Reactivar notificacións", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "unpin": "Desafixar", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "unreadChats": "{unreadCount, plural, =1{1 conversa sen ler} other{{unreadCount} conversas sen ler}}", + "@unreadChats": { + "type": "String", + "placeholders": { + "unreadCount": { + "type": "int" + } + } + }, + "userAndOthersAreTyping": "{username} e {count} máis están escribindo…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "userAndUserAreTyping": "{username} e {username2} están escribindo…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userIsTyping": "{username} está escribindo…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userLeftTheChat": "🚪 {username} deixou a conversa", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "username": "Nome de usuaria", + "@username": { + "type": "String", + "placeholders": {} + }, + "userSentUnknownEvent": "{username} enviou un evento {type}", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "verified": "Verificado", + "@verified": { + "type": "String", + "placeholders": {} + }, + "verify": "Verificar", + "@verify": { + "type": "String", + "placeholders": {} + }, + "verifyStart": "Comezar verificación", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "Verificaches correctamente!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "verifyTitle": "Verificando a outra conta", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "videoCall": "Chamada de vídeo", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "Visibilidade do historial da conversa", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "Visible para todas as participantes", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "Visible para todas", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "Mensaxe de voz", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "Agardando a que a outra parte acepte a solicitude…", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "Agardando a que a outra parte acepte as emoticonas…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "Agardando a que a outra parte acepte os números…", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "wallpaper": "Imaxe de fondo:", + "@wallpaper": { + "type": "String", + "placeholders": {} + }, + "warning": "Aviso!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "weSentYouAnEmail": "Enviamosche un email", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "whoCanPerformWhichAction": "Quen pode realizar determinada acción", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "Quen se pode unir a este grupo", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "Por que queres denunciar esto?", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "wipeChatBackup": "Queres eliminar a copia de apoio da conversa e crear unha nova chave de recuperación?", + "@wipeChatBackup": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "Con estos enderezos podes recuperar o contrasinal.", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "Escribe unha mensaxe…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "yes": "Si", + "@yes": { + "type": "String", + "placeholders": {} + }, + "you": "Ti", + "@you": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "Xa non participas desta conversa", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "Foches vetada nesta conversa", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "yourPublicKey": "A túa chave pública", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "chatHasBeenAddedToThisSpace": "Engadiuse a conversa a este espazo", + "@chatHasBeenAddedToThisSpace": {}, + "addToSpace": "Engadir ao espazo", + "@addToSpace": {}, + "scanQrCode": "Escanear código QR", + "@scanQrCode": {}, + "sendOnEnter": "Enter para enviar", + "@sendOnEnter": {}, + "homeserver": "Servidor de inicio", + "@homeserver": {}, + "serverRequiresEmail": "O servidor precisa validar o teu enderezo de email para rexistrarte.", + "@serverRequiresEmail": {}, + "enableMultiAccounts": "(BETA) Activar varias contas neste dispositivo", + "@enableMultiAccounts": {}, + "addAccount": "Engadir conta", + "@addAccount": {}, + "oneClientLoggedOut": "Un dos teus clientes foi desconectado", + "@oneClientLoggedOut": {}, + "link": "Ligazón", + "@link": {}, + "yourChatBackupHasBeenSetUp": "Configurouse a copia de apoio da charla.", + "@yourChatBackupHasBeenSetUp": {}, + "unverified": "Sen verificar", + "@unverified": {}, + "repeatPassword": "Repite o contrasinal", + "@repeatPassword": {}, + "messageInfo": "Info da mensaxe", + "@messageInfo": {}, + "time": "Hora", + "@time": {}, + "sender": "Remitente", + "@sender": {}, + "openGallery": "Galería pública", + "@openGallery": {}, + "addToSpaceDescription": "Elixe un espazo ao que engadir esta conversa.", + "@addToSpaceDescription": {}, + "messageType": "Tipo de mensaxe", + "@messageType": {}, + "removeFromSpace": "Retirar do espazo", + "@removeFromSpace": {}, + "start": "Comezar", + "@start": {}, + "commandHint_discardsession": "Descartar sesión", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "commandHint_create": "Crear un grupo de conversa baleiro\nUsa --no-encryption para desactivar a cifraxe", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "commandHint_clearcache": "Baleirar caché", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_dm": "Iniciar unha charla directa\nUsa --no-encryption para desactivar a cifraxe", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "openVideoCamera": "Abrir a cámara para un vídeo", + "@openVideoCamera": { + "type": "String", + "placeholders": {} + }, + "videoWithSize": "Vídeo ({size})", + "@videoWithSize": { + "type": "String", + "placeholders": { + "size": { + "type": "String" + } + } + }, + "publish": "Publicar", + "@publish": {}, + "dismiss": "Desbotar", + "@dismiss": {}, + "markAsRead": "Marcar como lido", + "@markAsRead": {}, + "reportUser": "Denunciar usuaria", + "@reportUser": {}, + "openChat": "Abrir Conversa", + "@openChat": {}, + "voiceCall": "Chamada de voz", + "@voiceCall": {}, + "emojis": "Emojis", + "@emojis": {}, + "placeCall": "Chamar", + "@placeCall": {}, + "unsupportedAndroidVersionLong": "Esta característica require unha vesión máis recente de Android. Mira se hai actualizacións ou soporte de LineageOS.", + "@unsupportedAndroidVersionLong": {}, + "videoCallsBetaWarning": "Ten en conta que as chamadas de vídeo están en fase beta. Poderían non funcionar correctamente ou non funcionar nalgunhas plataformas.", + "@videoCallsBetaWarning": {}, + "unsupportedAndroidVersion": "Version de Android non soportada", + "@unsupportedAndroidVersion": {}, + "reactedWith": "{sender} reaccionou con {reaction}", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "pinMessage": "Fixar na sala", + "@pinMessage": {}, + "confirmEventUnpin": "Tes a certeza de querer desafixar o evento?", + "@confirmEventUnpin": {}, + "experimentalVideoCalls": "Chamadas de vídeo en probas", + "@experimentalVideoCalls": {}, + "emailOrUsername": "Email ou nome de usuaria", + "@emailOrUsername": {}, + "switchToAccount": "Cambiar á conta {number}", + "@switchToAccount": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "previousAccount": "Conta anterior", + "@previousAccount": {}, + "nextAccount": "Conta seguinte", + "@nextAccount": {}, + "bundleName": "Nome do feixe", + "@bundleName": {}, + "widgetVideo": "Vídeo", + "@widgetVideo": {}, + "widgetJitsi": "Jitsi Meet", + "@widgetJitsi": {}, + "widgetCustom": "Personalizado", + "@widgetCustom": {}, + "widgetName": "Nome", + "@widgetName": {}, + "widgetUrlError": "Non é un URL válido.", + "@widgetUrlError": {}, + "widgetNameError": "Escribe un nome público.", + "@widgetNameError": {}, + "addWidget": "Engadir widget", + "@addWidget": {}, + "widgetEtherpad": "Nota de texto", + "@widgetEtherpad": {}, + "errorAddingWidget": "Erro ao engadir o widget.", + "@errorAddingWidget": {}, + "editBundlesForAccount": "Editar os feixes desta conta", + "@editBundlesForAccount": {}, + "addToBundle": "Engadir ao feixe", + "@addToBundle": {}, + "removeFromBundle": "Eliminar deste feixe", + "@removeFromBundle": {}, + "separateChatTypes": "Separar Conversas directas e Grupos", + "@separateChatTypes": { + "type": "String", + "placeholders": {} + }, + "youRejectedTheInvitation": "Rexeitaches o convite", + "@youRejectedTheInvitation": {}, + "youBannedUser": "Vetaches a {user}", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedBy": "📩 {user} convidoute", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youJoinedTheChat": "Unícheste á conversa", + "@youJoinedTheChat": {}, + "youAcceptedTheInvitation": "👍 Aceptaches o convite", + "@youAcceptedTheInvitation": {}, + "youHaveWithdrawnTheInvitationFor": "Retiraches o convite para {user}", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedUser": "📩 Convidaches a {user}", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKicked": "👞 Expulsaches a {user}", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKickedAndBanned": "🙅 Expulsaches e vetaches a {user}", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youUnbannedUser": "Retiraches o veto a {user}", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "saveKeyManuallyDescription": "Garda esta chave manualmente usando o sistema para compartir do dispositivo ou portapapeis.", + "@saveKeyManuallyDescription": {}, + "storeInAndroidKeystore": "Gardar en Android KeyStore", + "@storeInAndroidKeystore": {}, + "storeInAppleKeyChain": "Gardar en Apple KeyChain", + "@storeInAppleKeyChain": {}, + "recoveryKeyLost": "Perdeches a chave de recuperación?", + "@recoveryKeyLost": {}, + "pleaseEnterRecoveryKey": "Escribe a túa chave de recuperación:", + "@pleaseEnterRecoveryKey": {}, + "recoveryKey": "Chave de recuperación", + "@recoveryKey": {}, + "storeSecurlyOnThisDevice": "Gardar de xeito seguro no dispositivo", + "@storeSecurlyOnThisDevice": {}, + "pleaseEnterRecoveryKeyDescription": "Para desbloquear as mensaxes antigas, escribe a chave de recuperación creada nunha sesión existente. A chave de recuperación NON é o teu contrasinal.", + "@pleaseEnterRecoveryKeyDescription": {}, + "users": "Usuarias", + "@users": {}, + "storeInSecureStorageDescription": "Gardar a chave de recuperación na almacenaxe segura deste dispositivo.", + "@storeInSecureStorageDescription": {}, + "countFiles": "{count} ficheiros", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "unlockOldMessages": "Desbloquear mensaxes antigas", + "@unlockOldMessages": {}, + "dehydrateTorLong": "Para usuarias de TOR, é recomendable exportar a sesión antes de pechar a xanela.", + "@dehydrateTorLong": {}, + "hydrateTor": "Usuarias TOR: Importar a sesión exportada", + "@hydrateTor": {}, + "hydrateTorLong": "Exportaches a túa sesión a última vez en TOR? Importaa rápidamente e segue conversando.", + "@hydrateTorLong": {}, + "hydrate": "Restablecer desde copia de apoio", + "@hydrate": {}, + "dehydrateWarning": "Esta acción non é reversible. Pon coidado en gardar o ficheiro de apoio.", + "@dehydrateWarning": {}, + "dehydrate": "Exportar sesión e eliminar dispositivo", + "@dehydrate": {}, + "dehydrateTor": "Usuarias TOR: Exportar sesión", + "@dehydrateTor": {}, + "indexedDbErrorTitle": "Problemas no modo privado", + "@indexedDbErrorTitle": {}, + "indexedDbErrorLong": "A almacenaxe de mensaxes non está activada por defecto no modo privado.\nMira en\n- about:config\n- establece dom.indexedDB.privateBrowsing.enabled como true\nSe non, non é posible executar FluffyChat.", + "@indexedDbErrorLong": {}, + "user": "Usuaria", + "@user": {}, + "custom": "Personal", + "@custom": {}, + "confirmMatrixId": "Confirma o teu ID Matrix para poder eliminar a conta.", + "@confirmMatrixId": {}, + "supposedMxid": "Debería ser {mxid}", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "commandHint_markasdm": "Marcar como sala de mensaxe directa para o ID Matrix indicado", + "@commandHint_markasdm": {}, + "commandHint_markasgroup": "Marcar como grupo", + "@commandHint_markasgroup": {}, + "whyIsThisMessageEncrypted": "Por que non podo ler esta mensaxe?", + "@whyIsThisMessageEncrypted": {}, + "noKeyForThisMessage": "Pode ser que a mensaxe fose enviada antes de que ti accedeses á túa conta neste dispositivo.\n\nTamén é posible que a remitente non validase o teu dispositivo ou tamén que algo fallase na conexión a internet.\n\nPodes ler a mensaxe noutro dispositivo? Entón podes transferila desde el! Vai a Axustes > Dispositivos e comproba que tes tódolos dispositivos verificados. Entón cando abras a sala a próxima vez a sincronización realizarase e as chaves transmitiranse automáticamente.\n\nNon desexas perder as chaves cando pechas sesión ou cambias de dispositivo? Comproba nos axustes que activaches a copia de apoio das conversas.", + "@noKeyForThisMessage": {}, + "appearOnTop": "Aparecer arriba", + "@appearOnTop": {}, + "otherCallingPermissions": "Micrófono, cámara e outros permisos para FluffyChat", + "@otherCallingPermissions": {}, + "newGroup": "Novo grupo", + "@newGroup": {}, + "newSpace": "Novo espazo", + "@newSpace": {}, + "foregroundServiceRunning": "Esta notificación aparece cando se está a executar o servizo en segundo plano.", + "@foregroundServiceRunning": {}, + "screenSharingTitle": "compartición da pantalla", + "@screenSharingTitle": {}, + "callingPermissions": "Permisos de chamada", + "@callingPermissions": {}, + "callingAccount": "Conta que chama", + "@callingAccount": {}, + "callingAccountDetails": "Permítelle a FluffyChat usar a app de telefonía nativa de android.", + "@callingAccountDetails": {}, + "appearOnTopDetails": "Permítelle á app aparecer por enriba (non é preciso se xa configuraches FluffyChat como unha conta para chamadas)", + "@appearOnTopDetails": {}, + "enterSpace": "Entrar no espazo", + "@enterSpace": {}, + "enterRoom": "Entrar na sala", + "@enterRoom": {}, + "allSpaces": "Todos os espazos", + "@allSpaces": {}, + "screenSharingDetail": "Estás a compartir a túa pantalla en FluffyChat", + "@screenSharingDetail": {}, + "numChats": "{number} conversas", + "@numChats": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "hideUnimportantStateEvents": "Agochar os eventos de menor relevancia", + "@hideUnimportantStateEvents": {}, + "doNotShowAgain": "Non mostrar outra vez", + "@doNotShowAgain": {}, + "commandHint_googly": "Envía uns ollos desos grandes", + "@commandHint_googly": {}, + "googlyEyesContent": "{senderName} enviouche uns ollos grandes", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "cuddleContent": "{senderName} mándache un achuche", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "commandHint_cuddle": "Envía un agarimo", + "@commandHint_cuddle": {}, + "commandHint_hug": "Envía un abrazo", + "@commandHint_hug": {}, + "hugContent": "{senderName} abrázate", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "encryptThisChat": "Cifrar esta conversa", + "@encryptThisChat": {}, + "disableEncryptionWarning": "Por razóns de seguridade non podes desactivar a cifraxe dunha conversa onde foi activada previamente.", + "@disableEncryptionWarning": {}, + "sorryThatsNotPossible": "Lamentámolo... iso non é posible", + "@sorryThatsNotPossible": {}, + "deviceKeys": "Chaves do dispositivo:", + "@deviceKeys": {}, + "newSpaceDescription": "Os Espazos permítenche consolidar as túas conversas e construir comunidades públicas ou privadas.", + "@newSpaceDescription": {}, + "startFirstChat": "Abre a túa primeira conversa", + "@startFirstChat": {}, + "wasDirectChatDisplayName": "Conversa baleira (era {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "reopenChat": "Reabrir conversa", + "@reopenChat": {}, + "noOtherDevicesFound": "Non se atopan outros dispositivos", + "@noOtherDevicesFound": {}, + "noBackupWarning": "Aviso! Se non activas a copia de apoio da conversa, perderás o acceso ás túas mensaxes cifradas. É moi recomendable activar a copia de apoio da conversa antes de pechar a sesión.", + "@noBackupWarning": {}, + "fileIsTooBigForServer": "Non se puido enviar! O servidor só permite anexos que non superen {max}.", + "@fileIsTooBigForServer": {}, + "fileHasBeenSavedAt": "Gardouse o ficheiro en {path}", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "jumpToLastReadMessage": "Ir á última mensaxe lida", + "@jumpToLastReadMessage": {}, + "readUpToHere": "Lin ate aquí", + "@readUpToHere": {}, + "openLinkInBrowser": "Abrir ligazón no navegador", + "@openLinkInBrowser": {}, + "jump": "Ir alá", + "@jump": {}, + "report": "informar", + "@report": {}, + "allRooms": "Todas as Conversas en grupo", + "@allRooms": { + "type": "String", + "placeholders": {} + }, + "reportErrorDescription": "😭 Vaia! Algo fallou. Se queres, podes informar do problema ás persoas desenvolvedoras.", + "@reportErrorDescription": {}, + "signInWithPassword": "Accede con contrasinal", + "@signInWithPassword": {}, + "pleaseTryAgainLaterOrChooseDifferentServer": "Inténtao máis tarde ou elixe un servidor diferente.", + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "signInWith": "Accede con {provider}", + "@signInWith": { + "type": "String", + "placeholders": { + "provider": { + "type": "String" + } + } + }, + "notAnImage": "Non é un ficheiro de imaxe.", + "@notAnImage": {}, + "importNow": "Importar agora", + "@importNow": {}, + "importEmojis": "Importar Emojis", + "@importEmojis": {}, + "importFromZipFile": "Importar desde ficheiro .zip", + "@importFromZipFile": {}, + "exportEmotePack": "Exportar paquete Emote como .zip", + "@exportEmotePack": {}, + "replace": "Substituír", + "@replace": {}, + "sendTypingNotifications": "Permitir ver que estás escribindo", + "@sendTypingNotifications": {}, + "createGroup": "Crear grupo", + "@createGroup": {}, + "messagesStyle": "Mensaxes:", + "@messagesStyle": {}, + "profileNotFound": "Non se atopa a usuaria no servidor. Pode que haxa un problema coa conexión ou que a usuaria non exista.", + "@profileNotFound": {}, + "shareInviteLink": "Comparte ligazón de convite", + "@shareInviteLink": {}, + "setColorTheme": "Cor do decorado:", + "@setColorTheme": {}, + "setTheme": "Establecer decorado:", + "@setTheme": {}, + "inviteContactToGroupQuestion": "Queres convidar a {contact} para que se una á conversa \"{groupName}\"?", + "@inviteContactToGroupQuestion": {}, + "tryAgain": "Intentar outra vez", + "@tryAgain": {}, + "optionalRedactReason": "(Optativo) Razón para editar a mensaxe...", + "@optionalRedactReason": {}, + "redactedBy": "Editada por {username}", + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "redactedByBecause": "Editada por {username} debido a: \"{reason}\"", + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "redactMessageDescription": "A mensaxe vai ser editada para todas as participantes na conversa. Non ten volta atrás.", + "@redactMessageDescription": {}, + "invite": "Convidar", + "@invite": {}, + "addChatDescription": "Engadir descrición da conversa...", + "@addChatDescription": {}, + "chatPermissions": "Permisos da conversa", + "@chatPermissions": {}, + "chatDescription": "Descrición da conversa", + "@chatDescription": {}, + "chatDescriptionHasBeenChanged": "Cambiou a descrición da conversa", + "@chatDescriptionHasBeenChanged": {}, + "noChatDescriptionYet": "Aínda non se escribeu a descrición da conversa.", + "@noChatDescriptionYet": {}, + "invalidServerName": "Nome de servidor non válido", + "@invalidServerName": {}, + "directChat": "Conversa Directa", + "@directChat": {}, + "setChatDescription": "Escribir descrición da conversa", + "@setChatDescription": {}, + "inviteGroupChat": "📨 Convidar a conversa en grupo", + "@inviteGroupChat": {}, + "invitePrivateChat": "📨 Convidar a conversa privada", + "@invitePrivateChat": {}, + "emoteKeyboardNoRecents": "Os emotes usados recentemente aparecerán aquí...", + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "banUserDescription": "Vaise vetar a usuaria na conversa e non poderá entrar outra vez ata que se retire o veto.", + "@banUserDescription": {}, + "removeDevicesDescription": "Vas pechar a sesión neste dispositivo e xa non poderás recibir mensaxes nel.", + "@removeDevicesDescription": {}, + "unbanUserDescription": "A usuaria vai poder entrar outra vez na conversa se quere.", + "@unbanUserDescription": {}, + "pushNotificationsNotAvailable": "Non están dispoñibles as notificacións push", + "@pushNotificationsNotAvailable": {}, + "makeAdminDescription": "Cando convirtas a esta usuaria en admin non poderás desfacer a acción xa que terá os mesmos permisos ca ti.", + "@makeAdminDescription": {}, + "archiveRoomDescription": "Vaise mover a charla ao arquivo. Outras usuarias poderán ver que saíches da conversa.", + "@archiveRoomDescription": {}, + "invalidInput": "Contido non válido!", + "@invalidInput": {}, + "hasKnocked": "🚪 {user} petou na porta", + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "wrongPinEntered": "PIN incorrecto! Inténtao outra vez en {seconds} segundos...", + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "learnMore": "Saber máis", + "@learnMore": {}, + "roomUpgradeDescription": "Vaise recrear a charla coa nova versión da sala. Todas as participantes recibirán unha notificación para que cambien á nova charla. Podes ler máis información acerca das versións das salas en https://spec.matrix.org/latest/rooms/", + "@roomUpgradeDescription": {}, + "pleaseEnterANumber": "Escribe un número maior de cero", + "@pleaseEnterANumber": {}, + "kickUserDescription": "A usuaria foi expulsada pero non vetada. En conversas públicas a usuaria pode volver cando queira.", + "@kickUserDescription": {}, + "createGroupAndInviteUsers": "Crear un grupo e convidar usuarias", + "@createGroupAndInviteUsers": {}, + "groupCanBeFoundViaSearch": "O grupo pódese atopar ao buscar", + "@groupCanBeFoundViaSearch": {}, + "noUsersFoundWithQuery": "Lamentamos non atopar ningunha usuaria con \"{query}\". Comproba se está ben escrito.", + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "yourGlobalUserIdIs": "O teu ID-usuaria global é: ", + "@yourGlobalUserIdIs": {}, + "groupName": "Nome do grupo", + "@groupName": {}, + "searchChatsRooms": "Buscar #conversas, @usuarias...", + "@searchChatsRooms": {}, + "startConversation": "Iniciar conversa", + "@startConversation": {}, + "commandHint_sendraw": "Enviar json sen editar", + "@commandHint_sendraw": {}, + "wrongRecoveryKey": "Desculpa... non semella ser o xeito correcto de recuperar a chave.", + "@wrongRecoveryKey": {}, + "blockListDescription": "Podes bloquear usuarias que che molesten. Non recibirás mensaxes nin convites para salas procedentes das usuarias da túa lista persoal de bloqueo.", + "@blockListDescription": {}, + "blockedUsers": "Usuarias bloqueadas", + "@blockedUsers": {}, + "block": "Bloquear", + "@block": {}, + "blockUsername": "Ignorar identificador", + "@blockUsername": {}, + "thisDevice": "Este dispositivo:", + "@thisDevice": {}, + "publicSpaces": "Espazos públicos", + "@publicSpaces": {}, + "passwordIsWrong": "O contrasinal escrito non é correcto", + "@passwordIsWrong": {}, + "pleaseEnterYourCurrentPassword": "Escribe o contrasinal actual", + "@pleaseEnterYourCurrentPassword": {}, + "publicLink": "Ligazón pública", + "@publicLink": {}, + "nothingFound": "Non atopamos nada...", + "@nothingFound": {}, + "decline": "Desbotar", + "@decline": {}, + "newPassword": "Novo contrasinal", + "@newPassword": {}, + "passwordsDoNotMatch": "Os contrasinais non concordan", + "@passwordsDoNotMatch": {}, + "subspace": "Subespazo", + "@subspace": {}, + "select": "Escolle", + "@select": {}, + "pleaseChooseAStrongPassword": "Elixe un contrasinal forte", + "@pleaseChooseAStrongPassword": {}, + "addChatOrSubSpace": "Engadir charla ou sub espazo", + "@addChatOrSubSpace": {}, + "leaveEmptyToClearStatus": "Deixa baleiro para limpar o teu estado.", + "@leaveEmptyToClearStatus": {}, + "joinSpace": "Únete ao espazo", + "@joinSpace": {}, + "searchForUsers": "Buscar @persoas...", + "@searchForUsers": {}, + "databaseMigrationTitle": "Base de datos optimizada", + "@databaseMigrationTitle": {}, + "databaseMigrationBody": "Agarda, podería levarnos un pouco.", + "@databaseMigrationBody": {}, + "databaseBuildErrorBody": "Non se puido crear a base de datos SQlite. A app intentará usar a base de datos clásica. Por favor informa deste fallo ás desenvolvedoras en {url}. A mensaxe do erro é: {error}", + "@databaseBuildErrorBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "initAppError": "Houbo un fallo ao iniciar a app", + "@initAppError": {}, + "sessionLostBody": "Estragouse a túa sesión. Por favor informa deste fallo ás desenvolvedoras en {url}. A mensaxe do erro é: {error}", + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "restoreSessionBody": "A app vai intentar restablecer a sesión desde a copia de apoio. Por favor informa deste erro ás desenvolvedoras en {url}. A mensaxe do erro é: {error}", + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "youInvitedToBy": "📩 Convidáronte cunha ligazón a:\n{alias}", + "@youInvitedToBy": { + "placeholders": { + "alias": { + "type": "String" + } + } + }, + "transparent": "Transparente", + "@transparent": {}, + "sendReadReceipts": "Enviar confirmación de lectura", + "@sendReadReceipts": {}, + "sendReadReceiptsDescription": "Outras participantes na conversa poden ver cando liches unha mensaxe.", + "@sendReadReceiptsDescription": {}, + "formattedMessages": "Mensaxes con formato", + "@formattedMessages": {}, + "verifyOtherDevice": "🔐 Verificar outro dispositivo", + "@verifyOtherDevice": {}, + "verifyOtherUser": "🔐 Verificar outra usuaria", + "@verifyOtherUser": {}, + "verifyOtherDeviceDescription": "Ao verificar outro dispositivo estás compartindo as chaves, aumentando a túa seguridade 💪. Ao iniciar a verificación aparecerá unha xanela emerxente nos dous dispositivos. Nesa xanela verás varios emojis ou números que tes que comparar entre eles. O mellor xeito de facelo é ter os dous dispositivos contigo cando inicias o proceso de verificación. 🤳", + "@verifyOtherDeviceDescription": {}, + "canceledKeyVerification": "{sender} desbotou a verificación da chave", + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "isReadyForKeyVerification": "{sender} xa pode verificar a chave", + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "forwardMessageTo": "Reenviar a mensaxe a {roomName}?", + "@forwardMessageTo": { + "type": "String", + "placeholders": { + "roomName": { + "type": "String" + } + } + }, + "sendTypingNotificationsDescription": "As outras participantes da conversa poden ver cando estás a escribir unha mensaxe.", + "@sendTypingNotificationsDescription": {}, + "formattedMessagesDescription": "Mostrar texto enriquecido nas mensaxes como letra grosa usando markdown.", + "@formattedMessagesDescription": {}, + "verifyOtherUserDescription": "Se verificas a outra usuaria, podes ter a certeza de que sabes con quen estás a conversar. 💪\n\nAo iniciar a verificación, ti mais a outra usuaria veredes unha xanela emerxente na app onde aparecerán varios emojis ou números que teredes que comparar entre vós.\n\nO mellor xeito de facelo é en persoa o cunha chamada de vídeo. 👭", + "@verifyOtherUserDescription": {}, + "requestedKeyVerification": "{sender} solicitou verificar a chave", + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "acceptedKeyVerification": "{sender} aceptou a verificación da chave", + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "completedKeyVerification": "{sender} completou a verificación da chave", + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "startedKeyVerification": "{sender} comezou coa verificación da chave", + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "presenceStyle": "Presenza:", + "@presenceStyle": { + "type": "String", + "placeholders": {} + }, + "hidePresences": "Agochar Lista de estados?", + "@hidePresences": {}, + "presencesToggle": "Mostra mensaxes de estado de outras usuarias", + "@presencesToggle": { + "type": "String", + "placeholders": {} + }, + "incomingMessages": "Mensaxes recibidas", + "@incomingMessages": {}, + "stickers": "Adhesivos", + "@stickers": {}, + "discover": "Descubrir", + "@discover": {}, + "commandHint_ignore": "Ignorar o ID matrix indicado", + "@commandHint_ignore": {}, + "commandHint_unignore": "Non ignorar o ID matrix indicado", + "@commandHint_unignore": {}, + "unreadChatsInApp": "{appname}: {unread} charlas sen ler", + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "noDatabaseEncryption": "Nesta plataforma non temos soporte para cifrar a base de datos", + "@noDatabaseEncryption": {}, + "accessAndVisibility": "Acceso e Visibilidade", + "@accessAndVisibility": {}, + "accessAndVisibilityDescription": "Quen pode unirse a esta charla e de que xeito e como poden atopala.", + "@accessAndVisibilityDescription": {}, + "customEmojisAndStickers": "Emojis personais e adhesivos", + "@customEmojisAndStickers": {}, + "calls": "Chamadas", + "@calls": {}, + "hideRedactedMessages": "Agochar mensaxes editadas", + "@hideRedactedMessages": {}, + "hideRedactedMessagesBody": "Se alguén corrixe unha mensaxe entón esta xa non será visible na charla.", + "@hideRedactedMessagesBody": {}, + "hideInvalidOrUnknownMessageFormats": "Agochar formatos de mensaxe non válidos ou descoñecidos", + "@hideInvalidOrUnknownMessageFormats": {}, + "hideMemberChangesInPublicChats": "Agochar cambios dos membros nas charlas públicas", + "@hideMemberChangesInPublicChats": {}, + "notifyMeFor": "Notificarme sobre", + "@notifyMeFor": {}, + "hideMemberChangesInPublicChatsBody": "Non mostrar na cronoloxía se alguén se une ou deixa unha conversa pública, para mellorar a lexibilidade.", + "@hideMemberChangesInPublicChatsBody": {}, + "usersMustKnock": "As usuarias teñen que pedir entrar", + "@usersMustKnock": {}, + "userWouldLikeToChangeTheChat": "{user} quere unirse á charla.", + "@userWouldLikeToChangeTheChat": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "knocking": "A solicitar", + "@knocking": {}, + "chatCanBeDiscoveredViaSearchOnServer": "A charla pode ser atopada ao buscar en {server}", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "createNewAddress": "Crear novos enderezos", + "@createNewAddress": {}, + "appLockDescription": "Bloquear a app cun código PIN cando non a uses", + "@appLockDescription": {}, + "globalChatId": "ID Global da charla", + "@globalChatId": {}, + "customEmojisAndStickersBody": "Engade ou comparte emojis personais e adhesivos que poden usarse nas charlas.", + "@customEmojisAndStickersBody": {}, + "overview": "Vista xeral", + "@overview": {}, + "passwordRecoverySettings": "Axustes de recuperación do contrasinal", + "@passwordRecoverySettings": {}, + "noPublicLinkHasBeenCreatedYet": "Aínda non se creou unha ligazón pública", + "@noPublicLinkHasBeenCreatedYet": {}, + "knock": "Solicitar acceso", + "@knock": {}, + "noOneCanJoin": "Ninguén pode unirse", + "@noOneCanJoin": {}, + "thereAreCountUsersBlocked": "Agora mesmo hai {count} usuarias bloqueadas.", + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "publicChatAddresses": "Enderezos públicos da charla", + "@publicChatAddresses": {}, + "userRole": "Rol da usuaria", + "@userRole": {}, + "minimumPowerLevel": "{level} é o nivel mínimo de responsabilidade.", + "@minimumPowerLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "String" + } + } + }, + "searchIn": "Buscar na conversa \"{chat}\"...", + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "searchMore": "Buscar máis...", + "@searchMore": {}, + "gallery": "Galería", + "@gallery": {}, + "files": "Ficheiros", + "@files": {}, + "knockRestricted": "Peta á porta", + "@knockRestricted": {}, + "restricted": "Non accesible", + "@restricted": {}, + "swipeRightToLeftToReply": "Despraza hacia a esquerda para responder", + "@swipeRightToLeftToReply": {}, + "alwaysUse24HourFormat": "falso", + "@alwaysUse24HourFormat": { + "description": "Set to true to always display time of day in 24 hour format." + }, + "noMoreChatsFound": "Non se atopan máis charlas…", + "@noMoreChatsFound": {}, + "joinedChats": "Charlas nas que participas", + "@joinedChats": {}, + "countChatsAndCountParticipants": "{chats} charlas e {participants} participantes", + "@countChatsAndCountParticipants": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + }, + "participants": { + "type": "int" + } + } + }, + "unread": "Sen ler", + "@unread": {}, + "space": "Espazo", + "@space": {}, + "spaces": "Espazos", + "@spaces": {}, + "goToSpace": "Ir ao espazo: {space}", + "@goToSpace": { + "type": "String", + "space": {} + }, + "markAsUnread": "Marcar como non lido", + "@markAsUnread": {}, + "userLevel": "{level} - Usuaria", + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "moderatorLevel": "{level} - Moderadora", + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "adminLevel": "{level} - Administradora", + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "changeGeneralChatSettings": "Cambiar os axustes xerais da charla", + "@changeGeneralChatSettings": {}, + "inviteOtherUsers": "Convidar a outras usuarias a esta charla", + "@inviteOtherUsers": {}, + "changeTheChatPermissions": "Cambiar os permisos na charla", + "@changeTheChatPermissions": {}, + "changeTheVisibilityOfChatHistory": "Cambiar a visibilidade do historial da charla", + "@changeTheVisibilityOfChatHistory": {}, + "changeTheCanonicalRoomAlias": "Cambiar o enderezo público principal da charla", + "@changeTheCanonicalRoomAlias": {}, + "sendRoomNotifications": "Enviar notificacións a @room", + "@sendRoomNotifications": {}, + "changeTheDescriptionOfTheGroup": "Cambiar a descrición da charla", + "@changeTheDescriptionOfTheGroup": {}, + "invitedBy": "📩 Convidada por {user}", + "@invitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "changelog": "Novidades na versión", + "@changelog": {}, + "chatPermissionsDescription": "Define que nivel de permisos son necesarios para realizar certas accións nesta charla. Os niveis de permiso 0, 50 e 100 normalmente representan, usuarias, moderadoras e administradoras, pero son posibles outras escalas.", + "@chatPermissionsDescription": {}, + "updateInstalled": "🎉 Instalouse a actualización a {version}!", + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "sendCanceled": "Cancelouse o envío", + "@sendCanceled": {}, + "noChatsFoundHere": "Sen charlas por aquí. Comeza unha nova conversa con alguén premendo no botón de abaixo. ⤵️", + "@noChatsFoundHere": {}, + "discoverHomeservers": "Atopar servidores", + "@discoverHomeservers": {}, + "whatIsAHomeserver": "Que é un servidor de inicio?", + "@whatIsAHomeserver": {}, + "loginWithMatrixId": "Acceder co ID-Matrix", + "@loginWithMatrixId": {}, + "homeserverDescription": "Todos os teus datos quedan gardados no servidor de inicio, igual que co teu provedor de correo electrónico. Podes elexir o servidor que queres usar e poderás comunicarte con todos os demais. Aprende máis en https://matrix.org.", + "@homeserverDescription": {}, + "doesNotSeemToBeAValidHomeserver": "Non semella ser un servidor de inicio compatible. É o URL correcto?", + "@doesNotSeemToBeAValidHomeserver": {}, + "calculatingFileSize": "Calculando o tamaño do ficheiro…", + "@calculatingFileSize": {}, + "prepareSendingAttachment": "Preparando o envío…", + "@prepareSendingAttachment": {}, + "sendingAttachment": "Enviando o anexo…", + "@sendingAttachment": {}, + "generatingVideoThumbnail": "Creando miniatura do vídeo…", + "@generatingVideoThumbnail": {}, + "compressVideo": "Comprimindo o vídeo…", + "@compressVideo": {}, + "serverLimitReached": "Acadouse o límite do servidor! Agarda {seconds} segundos…", + "@serverLimitReached": { + "type": "integer", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "sendingAttachmentCountOfCount": "Enviando o anexo {index} de {length}…", + "@sendingAttachmentCountOfCount": { + "type": "integer", + "placeholders": { + "index": { + "type": "int" + }, + "length": { + "type": "int" + } + } + }, + "oneOfYourDevicesIsNotVerified": "Un dos teus dispositivos non está verificado", + "@oneOfYourDevicesIsNotVerified": {}, + "noticeChatBackupDeviceVerification": "Nota: Cando conectas todos os teus dispositivos á copia de apoio da conversa quedan verificados automaticamente.", + "@noticeChatBackupDeviceVerification": {}, + "blur": "Néboa:", + "@blur": {}, + "opacity": "Opacidade:", + "@opacity": {}, + "contactServerSecurity": "Contacto con Seguridade do servidor", + "@contactServerSecurity": {}, + "aboutHomeserver": "Sobre {homeserver}", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "welcomeText": "Ola! 👋 Isto é FluffyChat. Podes iniciar sesión en calquera servidor compatible con https://matrix.org. Poderás conversar con calquera. Unha enorme rede de mensaxería descentralizada!", + "@welcomeText": {}, + "setWallpaper": "Establecer fondo", + "@setWallpaper": {}, + "manageAccount": "Xestionar conta", + "@manageAccount": {}, + "noContactInformationProvided": "O servidor non proporciona información de contacto válida", + "@noContactInformationProvided": {}, + "contactServerAdmin": "Contacto con Admin do servidor", + "@contactServerAdmin": {}, + "supportPage": "Páxina de axuda", + "@supportPage": {}, + "serverInformation": "Información do servidor:", + "@serverInformation": {}, + "name": "Nome", + "@name": {}, + "version": "Versión", + "@version": {}, + "website": "Páxina web", + "@website": {}, + "continueText": "Continuar", + "@continueText": {}, + "compressBeforeSending": "Comprimir antes de enviar", + "@compressBeforeSending": {}, + "sendUncompressed": "Enviar sen comprimir", + "@sendUncompressed": {}, + "italicText": "Cursiva", + "@italicText": {}, + "strikeThrough": "Riscar", + "@strikeThrough": {}, + "pleaseFillOut": "Por favor completa", + "@pleaseFillOut": {}, + "invalidUrl": "URL non válido", + "@invalidUrl": {}, + "boldText": "Resaltar texto", + "@boldText": {}, + "addLink": "Engadir ligazón", + "@addLink": {}, + "unableToJoinChat": "Non se puido acceder. Pode que a outra parte xa pechase a conversa.", + "@unableToJoinChat": {}, + "sendImages": "Enviar {count} imaxe", + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "compress": "Comprimir", + "@compress": {}, + "previous": "Anterior", + "@previous": {}, + "otherPartyNotLoggedIn": "A outra parte non está conectada neste momento e pode que non reciba as mensaxes!", + "@otherPartyNotLoggedIn": {}, + "open": "Abrir", + "@open": {}, + "appWantsToUseForLogin": "Usar '{server}' para acceder", + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "contentNotificationSettings": "Axustes de notificación de contido", + "@contentNotificationSettings": {}, + "generalNotificationSettings": "Axustes xerais das notificacións", + "@generalNotificationSettings": {}, + "roomNotificationSettings": "Axustes de notificacións da sala", + "@roomNotificationSettings": {}, + "userSpecificNotificationSettings": "Axustes de notificación específicos da usuaria", + "@userSpecificNotificationSettings": {}, + "otherNotificationSettings": "Outros axustes das notificacións", + "@otherNotificationSettings": {}, + "notificationRuleContainsUserName": "Contén nome de usuaria", + "@notificationRuleContainsUserName": {}, + "notificationRuleContainsUserNameDescription": "Informa á usuaria cando unha mensaxe contén o seu identificador.", + "@notificationRuleContainsUserNameDescription": {}, + "notificationRuleMaster": "Acalar todas as notificacións", + "@notificationRuleMaster": {}, + "notificationRuleSuppressNotices": "Suprimir mensaxes automatizadas", + "@notificationRuleSuppressNotices": {}, + "notificationRuleSuppressNoticesDescription": "Suprime as notificacións desde clientes automatizados como os robots.", + "@notificationRuleSuppressNoticesDescription": {}, + "notificationRuleInviteForMe": "Teño un convite", + "@notificationRuleInviteForMe": {}, + "notificationRuleInviteForMeDescription": "Informa á usuaria de que recibeu o convite para unha sala.", + "@notificationRuleInviteForMeDescription": {}, + "notificationRuleMemberEvent": "Eventos dos participantes", + "@notificationRuleMemberEvent": {}, + "notificationRuleIsUserMention": "Mención da usuaria", + "@notificationRuleIsUserMention": {}, + "notificationRuleIsUserMentionDescription": "Informa cando se menciona explícitamente a usuaria nunha mensaxe.", + "@notificationRuleIsUserMentionDescription": {}, + "notificationRuleContainsDisplayName": "Contén o nome público", + "@notificationRuleContainsDisplayName": {}, + "notificationRuleContainsDisplayNameDescription": "Informa á usuaria cando unha mensaxe contén o seu nome público.", + "@notificationRuleContainsDisplayNameDescription": {}, + "notificationRuleIsRoomMention": "Mención da sala", + "@notificationRuleIsRoomMention": {}, + "notificationRuleIsRoomMentionDescription": "Informa á usuaria cando hai unha mención da sala.", + "@notificationRuleIsRoomMentionDescription": {}, + "notificationRuleRoomnotif": "Notificación da sala", + "@notificationRuleRoomnotif": {}, + "notificationRuleRoomnotifDescription": "Informa á usuaria cando unha mensaxe contén '@room'.", + "@notificationRuleRoomnotifDescription": {}, + "notificationRuleTombstone": "Lápida", + "@notificationRuleTombstone": {}, + "notificationRuleTombstoneDescription": "Informa á usuaria sobre a desactivación de mensaxes na sala.", + "@notificationRuleTombstoneDescription": {}, + "notificationRuleReaction": "Reacción", + "@notificationRuleReaction": {}, + "notificationRuleReactionDescription": "Omite as notificacións sobre reaccións.", + "@notificationRuleReactionDescription": {}, + "notificationRuleRoomServerAcl": "ACL da servidor da sala", + "@notificationRuleRoomServerAcl": {}, + "notificationRuleRoomServerAclDescription": "Omite notificacións para as listas de control de acceso (ACL) do servidor da sala.", + "@notificationRuleRoomServerAclDescription": {}, + "notificationRuleSuppressEdits": "Omite edicións", + "@notificationRuleSuppressEdits": {}, + "notificationRuleSuppressEditsDescription": "Omite as notificacións sobre mensaxes editadas.", + "@notificationRuleSuppressEditsDescription": {}, + "notificationRuleCall": "Chamada", + "@notificationRuleCall": {}, + "notificationRuleCallDescription": "Informa á usuaria sobre as chamadas.", + "@notificationRuleCallDescription": {}, + "notificationRuleEncryptedRoomOneToOne": "Sala cifrada conversa persoal", + "@notificationRuleEncryptedRoomOneToOne": {}, + "notificationRuleEncryptedRoomOneToOneDescription": "Informa á usuaria sobre mensaxes cifradas en salas de conversa persoal.", + "@notificationRuleEncryptedRoomOneToOneDescription": {}, + "notificationRuleRoomOneToOne": "Sala de conversa persoal", + "@notificationRuleRoomOneToOne": {}, + "notificationRuleRoomOneToOneDescription": "Informa á usuaria sobre mensaxes en salas de conversa persoal.", + "@notificationRuleRoomOneToOneDescription": {}, + "notificationRuleMessage": "Mensaxe", + "@notificationRuleMessage": {}, + "notificationRuleMessageDescription": "Informa á usuaria sobre mensaxes xenéricas.", + "@notificationRuleMessageDescription": {}, + "notificationRuleEncrypted": "Salas cifradas", + "@notificationRuleEncrypted": {}, + "notificationRuleEncryptedDescription": "Informa á usuaria sobre mensaxes en salas cifradas.", + "@notificationRuleEncryptedDescription": {}, + "notificationRuleJitsiDescription": "Informa á usuaria sobre eventos do widget Jitsi.", + "@notificationRuleJitsiDescription": {}, + "notificationRuleServerAcl": "Omite eventos do sevidor ACL", + "@notificationRuleServerAcl": {}, + "notificationRuleJitsi": "Jitsi", + "@notificationRuleJitsi": {}, + "notificationRuleServerAclDescription": "Omite notificación sobre eventos do servidor ACL.", + "@notificationRuleServerAclDescription": {}, + "unknownPushRule": "Regra push descoñecida '{rule}'", + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } + } + }, + "deletePushRuleCanNotBeUndone": "Se omites este axuste de notificacións non poderás desfacer a acción.", + "@deletePushRuleCanNotBeUndone": {}, + "more": "Máis", + "@more": {}, + "newChatRequest": "📩 Nova solicitude de conversa", + "@newChatRequest": {}, + "shareKeysWith": "Compartir chaves con…", + "@shareKeysWith": {}, + "shareKeysWithDescription": "En que dispositivos se pode confiar e poden ler as túas conversas cifradas?", + "@shareKeysWithDescription": {}, + "allDevices": "Todos os dispositivos", + "@allDevices": {}, + "crossVerifiedDevicesIfEnabled": "Dispositivos verificados se está activado", + "@crossVerifiedDevicesIfEnabled": {}, + "crossVerifiedDevices": "Dispositivos verificados", + "@crossVerifiedDevices": {}, + "verifiedDevicesOnly": "Só dispositivos verificados", + "@verifiedDevicesOnly": {}, + "waitingForServer": "Agardando polo servidor…", + "@waitingForServer": {}, + "appIntroduction": "FluffyChat permíteche laretar coas túas amizades entre diferentes mensaxerías. Coñece máis en https://matrix.org ou toca en *Continuar*.", + "@appIntroduction": {}, + "notificationRuleMasterDescription": "Sobrescribe todas as outras regras e desactiva todas as notificacións.", + "@notificationRuleMasterDescription": {}, + "appWantsToUseForLoginDescription": "Por tanto permites que a app e o sitio web compartan información sobre ti.", + "@appWantsToUseForLoginDescription": {}, + "notificationRuleMemberEventDescription": "Suprime as notificacións dos eventos de participación.", + "@notificationRuleMemberEventDescription": {}, + "synchronizingPleaseWaitCounter": " Sincronizando…({percentage}%)", + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "optionalMessage": "(Optativo) mensaxe…", + "@optionalMessage": {}, + "notSupportedOnThisDevice": "Non compatible co dispositivo", + "@notSupportedOnThisDevice": {}, + "takeAPhoto": "Facer foto", + "@takeAPhoto": {}, + "recordAVideo": "Gravar vídeo", + "@recordAVideo": {}, + "enterNewChat": "Entrar na nova conversa", + "@enterNewChat": {}, + "commandHint_roomupgrade": "Actualizar esta sala á versión de sala indicada", + "@commandHint_roomupgrade": {} +} diff --git a/assets/l10n/intl_he.arb b/assets/l10n/intl_he.arb new file mode 100644 index 0000000..9c474fe --- /dev/null +++ b/assets/l10n/intl_he.arb @@ -0,0 +1,1429 @@ +{ + "@@last_modified": "2021-08-14 12:41:10.036931", + "about": "אודות", + "@about": { + "type": "String", + "placeholders": {} + }, + "accept": "קבל", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "{username} קיבל את ההזמנה", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "חשבון", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "{username} הפעיל הצפנה מקצה לקצה", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "admin": "מנהל", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "כינוי", + "@alias": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "{senderName} ענה לשיחה", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "כל אחד יכול להצטרף", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "archive": "ארכיון", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "האם משתמשים אורחים מורשים להצטרף", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "האם אתה בטוח?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "כדי שתוכל לחתום על משתמש אחר , הזן את הסיסמה שלך או את מפתח השחזור.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "לקבל בקשת אימות זו מ- {username}?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changePassword": "שנה סיסמא", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "appLock": "נעילת אפליקציה", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "cancel": "ביטול", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "addEmail": "הוסף מייל", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "all": "הכל", + "@all": { + "type": "String", + "placeholders": {} + }, + "allChats": "כל הצ'אטים", + "@allChats": { + "type": "String", + "placeholders": {} + }, + "banned": "חסום", + "@banned": { + "type": "String", + "placeholders": {} + }, + "sendOnEnter": "שלח בכניסה", + "@sendOnEnter": {}, + "badServerLoginTypesException": "שרת הבית תומך בסוגי הכניסה:\n{serverVersions}\nאבל אפליקציה זו תומכת רק ב:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} שינה את כללי הגישה לאורחים ל: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username} שינה את כללי ההצטרפות", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatNameTo": "{username} שינה את שם הצ'אט ל: '{chatname}'", + "@changedTheChatNameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "chatname": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username} שינה את קישור ההזמנה", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "repeatPassword": "כתוב שוב את הסיסמה", + "@repeatPassword": {}, + "areYouSureYouWantToLogout": "האם אתה בטוח שברצונך לצאת?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "chat": "צ׳אט", + "@chat": { + "type": "String", + "placeholders": {} + }, + "autoplayImages": "הפעל אוטומטית מדבקות ואנימציות מונפשים", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "badServerVersionsException": "שרת הבית תומך בגרסאות:\n{serverVersions}\nאבל האפליקציה הזו תומכת רק ב-{supportedVersions}", + "@badServerVersionsException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "banFromChat": "צאט חסום", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username} חסם את {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "חסום מכשיר", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "blocked": "חסום", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "botMessages": "הודעות בוט", + "@botMessages": { + "type": "String", + "placeholders": {} + }, + "cantOpenUri": "לא ניתן לפתוח את ה-URI {uri}", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "changeDeviceName": "שנה את שם המכשיר", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "{username} שינה את האווטאר של הצ'אט", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatDescriptionTo": "{username} שינה את תיאור הצ'אט ל: '{description}'", + "@changedTheChatDescriptionTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "description": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username} שינה את הרשאות הצ'אט", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username} שינה את שם התצוגה שלו ל: '{displayname}'", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} שינה את כללי הגישה לאורחים", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username} שינה את נראות ההיסטוריה", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username} שינה את נראות ההיסטוריה ל: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} שינה את כללי ההצטרפות ל: {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} שינה את האווטאר שלו", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "{username} שינה את כינוי החדר", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changeTheHomeserver": "שנה את שרת הבית", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "שנה את הסגנון שלך", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "שנה את שם הקבוצה", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "changeYourAvatar": "שינוי האווטאר שלך", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "ההצפנה נפגמה", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "yourChatBackupHasBeenSetUp": "גיבוי הצ'אט שלך הוגדר.", + "@yourChatBackupHasBeenSetUp": {}, + "chatBackup": "גיבוי צ'אט", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "commandHint_ban": "חסום את המשתמש הנתון מהחדר הזה", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_clearcache": "נקה מטמון", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_create": "צור צ'אט קבוצתי ריק\nהשתמש ב--no-encryption כדי להשבית את ההצפנה", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "commandHint_discardsession": "התעלם מהסשן", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "commandHint_dm": "התחל צ'אט ישיר\nהשתמש ב--no-encryption כדי להשבית את ההצפנה", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "commandHint_html": "שלח טקסט בתבנית HTML", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_invite": "הזמן את המשתמש הנתון לחדר זה", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "commandHint_join": "הצטרף לחדר הנתון", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_kick": "הסר את המשתמש הנתון מהחדר הזה", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_leave": "עזוב את החדר הזה", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_me": "תאר את עצמך", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "chatDetails": "פרטי צ'אט", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chatBackupDescription": "גיבוי הצ'אט שלך מאובטח באמצעות מפתח אבטחה. אנא וודא שאתה לא מאבד אותו.", + "@chatBackupDescription": { + "type": "String", + "placeholders": {} + }, + "chatHasBeenAddedToThisSpace": "צ'אט נוסף למרחב הזה", + "@chatHasBeenAddedToThisSpace": {}, + "chats": "צ'אטים", + "@chats": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "בחר סיסמה חזקה", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "clearArchive": "נקה ארכיון", + "@clearArchive": {}, + "close": "סגור", + "@close": { + "type": "String", + "placeholders": {} + }, + "commandHint_myroomavatar": "הגדר את התמונה שלך לחדר זה (על ידי mxc-uri)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_myroomnick": "הגדר את שם התצוגה שלך עבור חדר זה", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "addToSpace": "הוסף לחלל", + "@addToSpace": {}, + "commandHint_unban": "בטל את החסימה של המשתמש הנתון מהחדר הזה", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "countParticipants": "{count} משתתפים", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "create": "צור", + "@create": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "{username} יצר את הצ'אט", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "currentlyActive": "פעיל כעת", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "כהה", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "dateWithoutYear": "{month}-{day}", + "@dateWithoutYear": { + "type": "String", + "placeholders": { + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "defaultPermissionLevel": "רמת הרשאת ברירת מחדל", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "מחק חשבון", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "מחק הודעה", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "deviceId": "מזהה מכשיר", + "@deviceId": { + "type": "String", + "placeholders": {} + }, + "devices": "התקנים", + "@devices": { + "type": "String", + "placeholders": {} + }, + "directChats": "צ'אטים ישירים", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "הורד קובץ", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "edit": "ערוך", + "@edit": { + "type": "String", + "placeholders": {} + }, + "editDisplayname": "ערוך את שם התצוגה", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "editRoomAliases": "ערוך כינויים לחדר", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "אימוט כבר קיים!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "צ'אט ריק", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "encrypted": "מוצפן", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "enterAnEmailAddress": "הזן כתובת דואר אלקטרוני", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "enterYourHomeserver": "הזן את שרת הבית שלך", + "@enterYourHomeserver": { + "type": "String", + "placeholders": {} + }, + "everythingReady": "הכל מוכן!", + "@everythingReady": { + "type": "String", + "placeholders": {} + }, + "fileName": "שם קובץ", + "@fileName": { + "type": "String", + "placeholders": {} + }, + "fluffychat": "FluffyChat", + "@fluffychat": { + "type": "String", + "placeholders": {} + }, + "fontSize": "גודל גופן", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "forward": "העבר", + "@forward": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "מהצטרפות", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "מההזמנה", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "goToTheNewRoom": "עבור לחדר החדש", + "@goToTheNewRoom": { + "type": "String", + "placeholders": {} + }, + "groupIsPublic": "הקבוצה ציבורית", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "groupWith": "קבוצה עם {displayname}", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "guestsAreForbidden": "אורחים אסורים", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "אורחים יכולים להצטרף", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "id": "מזהה", + "@id": { + "type": "String", + "placeholders": {} + }, + "identity": "זהות", + "@identity": { + "type": "String", + "placeholders": {} + }, + "ignoredUsers": "משתמשים שהתעלמו מהם", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "ביטוי סיסמה או מפתח שחזור שגויים", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "הזמן איש קשר", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "invited": "הזמין", + "@invited": { + "type": "String", + "placeholders": {} + }, + "invitedUser": "{username} הזמין את {targetName}", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "invitedUsersOnly": "משתמשים מוזמנים בלבד", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "inviteForMe": "הזמנה בשבילי", + "@inviteForMe": { + "type": "String", + "placeholders": {} + }, + "inviteText": "{username} הזמין אותך ל-FluffyChat.\n1. התקן את FluffyChat: https://fluffychat.im\n2. הירשם או היכנס\n3. פתח את קישור ההזמנה: {link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "isTyping": "מקליד/ה…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "{username} הצטרף לצ'אט", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "joinRoom": "הצטרף לחדר", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "kicked": "{username} בעט ב {targetName}", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickedAndBanned": "{username} בעט וחסם {targetName}", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickFromChat": "בעיטה מהצ'אט", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "פעילות אחרונה: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "leftTheChat": "עזב את הצ'אט", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "loadingPleaseWait": "טוען אנא המתן.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "loadMore": "טען עוד…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "locationDisabledNotice": "שירותי המיקום מושבתים. אנא הפעל אותם כדי לשתף את המיקום שלך.", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "copy": "העתק", + "@copy": { + "type": "String", + "placeholders": {} + }, + "commandHint_send": "שלח טקסט", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "commandHint_op": "הגדרת רמת צריכת החשמל של המשתמש הנתון (ברירת מחדל: 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_plain": "שלח טקסט לא מעוצב", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_react": "שלח תשובה כתגובה", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "containsUserName": "מכיל שם משתמש", + "@containsUserName": { + "type": "String", + "placeholders": {} + }, + "createNewSpace": "חלל חדש", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "אפשר הצפנה", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "הזמן איש קשר אל {groupName}", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "dateWithYear": "{year}-{month}-{day}", + "@dateWithYear": { + "type": "String", + "placeholders": { + "year": { + "type": "String" + }, + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "deactivateAccountWarning": "פעולה זו תשבית את חשבון המשתמש שלך. אי אפשר לבטל את זה! האם אתה בטוח?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "device": "מכשיר", + "@device": { + "type": "String", + "placeholders": {} + }, + "group": "קבוצה", + "@group": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "שם התצוגה השתנה", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "ערוך שרתים חסומים", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "עריכת אווטאר של חדר", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName} סיים את השיחה", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "groups": "קבוצות", + "@groups": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "לא תוכל לבטל את ההצפנה יותר. האם אתה בטוח?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "encryption": "הצפנה", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "errorObtainingLocation": "שגיאה בהשגת מיקום: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "hasWithdrawnTheInvitationFor": "{username} ביטל את ההזמנה עבור {targetName}", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "hideRedactedEvents": "הסתר אירועים מצונזרים", + "@hideRedactedEvents": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "ההצפנה אינה מופעלת", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "extremeOffensive": "פוגעני ביותר", + "@extremeOffensive": { + "type": "String", + "placeholders": {} + }, + "hideUnknownEvents": "הסתר אירועים לא ידועים", + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "טען {count} משתתפים נוספים", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "homeserver": "שרת בית", + "@homeserver": {}, + "ignore": "התעלם", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "iHaveClickedOnLink": "לחצתי על הקישור", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "leave": "לעזוב", + "@leave": { + "type": "String", + "placeholders": {} + }, + "license": "רשיון", + "@license": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "בהיר", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "delete": "מחיקה", + "@delete": { + "type": "String", + "placeholders": {} + }, + "inoffensive": "לֹא פּוֹגֵעַ", + "@inoffensive": { + "type": "String", + "placeholders": {} + }, + "configureChat": "קביעת תצורה של צ'אט", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "confirm": "לאשר", + "@confirm": { + "type": "String", + "placeholders": {} + }, + "connect": "התחבר", + "@connect": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "איש הקשר הוזמן לקבוצה", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "containsDisplayName": "מכיל שם תצוגה", + "@containsDisplayName": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "התוכן דווח למנהלי השרת", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "הועתק ללוח הגזירים", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "commandInvalid": "הפקודה אינה חוקית", + "@commandInvalid": { + "type": "String" + }, + "commandMissing": "{command} אינו פקודה.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "compareEmojiMatch": "השווה וודא שהאימוג'י הבאים תואמים לאלו של המכשיר השני:", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "השווה וודא שהמספרים הבאים תואמים לאלה של המכשיר השני:", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "העתק ללוח", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "לא ניתן לפענח הודעה: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "help": "עזרה", + "@help": { + "type": "String", + "placeholders": {} + }, + "howOffensiveIsThisContent": "עד כמה התוכן הזה פוגעני?", + "@howOffensiveIsThisContent": { + "type": "String", + "placeholders": {} + }, + "locationPermissionDeniedNotice": "הרשאת המיקום נדחתה. אנא אפשר את היכולת לשתף את מיקומך.", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "login": "כניסה", + "@login": { + "type": "String", + "placeholders": {} + }, + "moderator": "מנחה", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "needPantalaimonWarning": "שים לב שאתה צריך Pantalaimon כדי להשתמש בהצפנה מקצה לקצה לעת עתה.", + "@needPantalaimonWarning": { + "type": "String", + "placeholders": {} + }, + "newChat": "צ'אט חדש", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "בקשת אימות חדשה!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "next": "הבא", + "@next": { + "type": "String", + "placeholders": {} + }, + "no": "לא", + "@no": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "אין חיבור לשרת", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "אתה יכול להפעיל הצפנה רק כשהחדר כבר לא נגיש לציבור.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "לא נמצאו חדרים…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "notifications": "התראות", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "numUsersTyping": "{count} משתמשים מקלידים…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "obtainingLocation": "משיג מיקום…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "גיבוי מפתח מקוון מופעל", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "oopsPushError": "אופס! למרבה הצער, אירעה שגיאה בעת הגדרת התראות.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "אופס, משהו השתבש…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "פתח את האפליקציה לקריאת הודעות", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "oneClientLoggedOut": "אחד מהמכשירים שלך התנתק", + "@oneClientLoggedOut": {}, + "addAccount": "הוסף חשבון", + "@addAccount": {}, + "editBundlesForAccount": "ערוך חבילות עבור חשבון זה", + "@editBundlesForAccount": {}, + "participant": "משתתף", + "@participant": { + "type": "String", + "placeholders": {} + }, + "password": "סיסמה", + "@password": { + "type": "String", + "placeholders": {} + }, + "pleaseClickOnLink": "אנא לחץ על הקישור במייל ולאחר מכן המשך.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "pleaseEnter4Digits": "אנא הזן 4 ספרות או השאר ריק כדי להשבית את נעילת האפליקציה.", + "@pleaseEnter4Digits": { + "type": "String", + "placeholders": {} + }, + "online": "מחובר/ת", + "@online": { + "type": "String", + "placeholders": {} + }, + "addToBundle": "הוסף לחבילה", + "@addToBundle": {}, + "passphraseOrKey": "ביטוי סיסמה או מפתח שחזור", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "שכחתי סיסמה", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "הסיסמה שונתה", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "passwordRecovery": "שחזור סיסמה", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "people": "אנשים", + "@people": { + "type": "String", + "placeholders": {} + }, + "pickImage": "בחר תמונה", + "@pickImage": { + "type": "String", + "placeholders": {} + }, + "play": "הפעל {fileName}", + "@play": { + "type": "String", + "placeholders": { + "fileName": { + "type": "String" + } + } + }, + "pleaseChoose": "אנא בחר", + "@pleaseChoose": { + "type": "String", + "placeholders": {} + }, + "pleaseChooseAPasscode": "אנא בחר קוד גישה", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPassword": "נא הזן את הסיסמה שלך", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPin": "אנא הזן את קוד הpin שלך", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "pin": "קוד pin", + "@pin": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "אנא הזן שם משתמש", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "הודעה חדשה ב-FluffyChat", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "נראה שאין לך שירותי גוגל בטלפון שלך. זו החלטה טובה לפרטיות שלך! כדי לקבל התרעות ב- FluffyChat אנו ממליצים להשתמש https://microg.org/ או https://unifiedpush.org/.", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "noMatrixServer": "{server1} אינו שרת מטריקס, השתמש ב-{server2} במקום זאת?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "none": "ללא", + "@none": { + "type": "String", + "placeholders": {} + }, + "noPasswordRecoveryDescription": "עדיין לא הוספת דרך לשחזר את הסיסמה שלך.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "offensive": "פוגעני", + "@offensive": { + "type": "String", + "placeholders": {} + }, + "notificationsEnabledForThisAccount": "התראות הופעלו עבור חשבון זה", + "@notificationsEnabledForThisAccount": { + "type": "String", + "placeholders": {} + }, + "bundleName": "שם החבילה", + "@bundleName": {}, + "offline": "לא מקוון", + "@offline": { + "type": "String", + "placeholders": {} + }, + "openVideoCamera": "פתח את המצלמה לסרטון", + "@openVideoCamera": { + "type": "String", + "placeholders": {} + }, + "removeFromBundle": "הסר מחבילה זו", + "@removeFromBundle": {}, + "enableMultiAccounts": "(בטא) אפשר ריבוי חשבונות במכשיר זה", + "@enableMultiAccounts": {}, + "openInMaps": "פתיחה במפות", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "link": "קישור", + "@link": {}, + "serverRequiresEmail": "שרת זה צריך לאמת את כתובת הדואר האלקטרוני שלך לרישום.", + "@serverRequiresEmail": {}, + "logout": "יציאה", + "@logout": { + "type": "String", + "placeholders": {} + }, + "muteChat": "השתקת הצ'אט", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "scanQrCode": "סרוק קוד QR", + "@scanQrCode": {}, + "noPermission": "אין הרשאה", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "or": "או", + "@or": { + "type": "String", + "placeholders": {} + }, + "logInTo": "היכנס אל {homeserver}", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "memberChanges": "שינויים בחבר", + "@memberChanges": { + "type": "String", + "placeholders": {} + }, + "mention": "הזכיר", + "@mention": { + "type": "String", + "placeholders": {} + }, + "messages": "הודעות", + "@messages": { + "type": "String", + "placeholders": {} + }, + "openCamera": "פתח מצלמה", + "@openCamera": { + "type": "String", + "placeholders": {} + } +} diff --git a/assets/l10n/intl_hi.arb b/assets/l10n/intl_hi.arb new file mode 100644 index 0000000..45be380 --- /dev/null +++ b/assets/l10n/intl_hi.arb @@ -0,0 +1,2113 @@ +{ + "@showPassword": { + "type": "String", + "placeholders": {} + }, + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "@connect": { + "type": "String", + "placeholders": {} + }, + "@jumpToLastReadMessage": {}, + "@allRooms": { + "type": "String", + "placeholders": {} + }, + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "@commandHint_cuddle": {}, + "@chats": { + "type": "String", + "placeholders": {} + }, + "@widgetVideo": {}, + "@dismiss": {}, + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "@admin": { + "type": "String", + "placeholders": {} + }, + "@reportErrorDescription": {}, + "@directChats": { + "type": "String", + "placeholders": {} + }, + "@setPermissionsLevel": { + "type": "String", + "placeholders": {} + }, + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "@addAccount": {}, + "@close": { + "type": "String", + "placeholders": {} + }, + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "@chatHasBeenAddedToThisSpace": {}, + "@reply": { + "type": "String", + "placeholders": {} + }, + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "@unsupportedAndroidVersion": {}, + "@device": { + "type": "String", + "placeholders": {} + }, + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "@widgetJitsi": {}, + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "@encryption": { + "type": "String", + "placeholders": {} + }, + "@messageType": {}, + "@indexedDbErrorLong": {}, + "@oneClientLoggedOut": {}, + "@toggleMuted": { + "type": "String", + "placeholders": {} + }, + "@unsupportedAndroidVersionLong": {}, + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@title": { + "description": "Title for the application", + "type": "String", + "placeholders": {} + }, + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "@startFirstChat": {}, + "@callingAccount": {}, + "@requestPermission": { + "type": "String", + "placeholders": {} + }, + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@invited": { + "type": "String", + "placeholders": {} + }, + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "@setColorTheme": {}, + "@nextAccount": {}, + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "@singlesignon": { + "type": "String", + "placeholders": {} + }, + "@warning": { + "type": "String", + "placeholders": {} + }, + "@password": { + "type": "String", + "placeholders": {} + }, + "@allSpaces": {}, + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "@user": {}, + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "@youAcceptedTheInvitation": {}, + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@banUserDescription": {}, + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "@widgetEtherpad": {}, + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "remove": "निकालना", + "@remove": { + "type": "String", + "placeholders": {} + }, + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "@id": { + "type": "String", + "placeholders": {} + }, + "@removeDevicesDescription": {}, + "@changedTheChatDescriptionTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "description": { + "type": "String" + } + } + }, + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@separateChatTypes": { + "type": "String", + "placeholders": {} + }, + "@tryAgain": {}, + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "@blocked": { + "type": "String", + "placeholders": {} + }, + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@dateWithoutYear": { + "type": "String", + "placeholders": { + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "@removeDevice": { + "type": "String", + "placeholders": {} + }, + "@unbanUserDescription": {}, + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "@sendOnEnter": {}, + "@pickImage": { + "type": "String", + "placeholders": {} + }, + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@youRejectedTheInvitation": {}, + "@otherCallingPermissions": {}, + "@messagesStyle": {}, + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "@link": {}, + "@widgetUrlError": {}, + "@emailOrUsername": {}, + "@newSpaceDescription": {}, + "@chatDescription": {}, + "@callingAccountDetails": {}, + "@next": { + "type": "String", + "placeholders": {} + }, + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@dateWithYear": { + "type": "String", + "placeholders": { + "year": { + "type": "String" + }, + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "@enterSpace": {}, + "@encryptThisChat": {}, + "@fileName": { + "type": "String", + "placeholders": {} + }, + "@unavailable": { + "type": "String", + "placeholders": {} + }, + "@previousAccount": {}, + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "@emoteWarnNeedToPick": { + "type": "String", + "placeholders": {} + }, + "@reopenChat": {}, + "@pleaseEnterRecoveryKey": {}, + "@create": { + "type": "String", + "placeholders": {} + }, + "@toggleFavorite": { + "type": "String", + "placeholders": {} + }, + "@no": { + "type": "String", + "placeholders": {} + }, + "@alias": { + "type": "String", + "placeholders": {} + }, + "@widgetNameError": {}, + "@inoffensive": { + "type": "String", + "placeholders": {} + }, + "@unpin": { + "type": "String", + "placeholders": {} + }, + "@addToBundle": {}, + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "@addWidget": {}, + "@all": { + "type": "String", + "placeholders": {} + }, + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@noKeyForThisMessage": {}, + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "@reason": { + "type": "String", + "placeholders": {} + }, + "@commandHint_markasgroup": {}, + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "@hydrateTor": {}, + "@pushNotificationsNotAvailable": {}, + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "@storeInAppleKeyChain": {}, + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "@hydrate": {}, + "@invalidServerName": {}, + "@chatPermissions": {}, + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "@wipeChatBackup": { + "type": "String", + "placeholders": {} + }, + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "@sender": {}, + "@storeInAndroidKeystore": {}, + "@hideRedactedEvents": { + "type": "String", + "placeholders": {} + }, + "@online": { + "type": "String", + "placeholders": {} + }, + "@signInWithPassword": {}, + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "@offensive": { + "type": "String", + "placeholders": {} + }, + "@needPantalaimonWarning": { + "type": "String", + "placeholders": {} + }, + "@makeAdminDescription": {}, + "@edit": { + "type": "String", + "placeholders": {} + }, + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "@transferFromAnotherDevice": { + "type": "String", + "placeholders": {} + }, + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "@pushRules": { + "type": "String", + "placeholders": {} + }, + "@goToTheNewRoom": { + "type": "String", + "placeholders": {} + }, + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "@copy": { + "type": "String", + "placeholders": {} + }, + "@saveKeyManuallyDescription": {}, + "@none": { + "type": "String", + "placeholders": {} + }, + "@editBundlesForAccount": {}, + "@renderRichContent": { + "type": "String", + "placeholders": {} + }, + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "@whyIsThisMessageEncrypted": {}, + "@unreadChats": { + "type": "String", + "placeholders": { + "unreadCount": { + "type": "int" + } + } + }, + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@setChatDescription": {}, + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "importFromZipFile": ".zip फ़ाइल से आयात करें", + "@importFromZipFile": {}, + "@toggleUnread": { + "type": "String", + "placeholders": {} + }, + "@or": { + "type": "String", + "placeholders": {} + }, + "@dehydrateWarning": {}, + "@sendOriginal": { + "type": "String", + "placeholders": {} + }, + "@noOtherDevicesFound": {}, + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "@seenByUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@storeSecurlyOnThisDevice": {}, + "@yourChatBackupHasBeenSetUp": {}, + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@submit": { + "type": "String", + "placeholders": {} + }, + "@videoCallsBetaWarning": {}, + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "@participant": { + "type": "String", + "placeholders": {} + }, + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "@yes": { + "type": "String", + "placeholders": {} + }, + "@containsDisplayName": { + "type": "String", + "placeholders": {} + }, + "@signInWith": { + "type": "String", + "placeholders": { + "provider": { + "type": "String" + } + } + }, + "@username": { + "type": "String", + "placeholders": {} + }, + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@fileIsTooBigForServer": {}, + "@homeserver": {}, + "@help": { + "type": "String", + "placeholders": {} + }, + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "@people": { + "type": "String", + "placeholders": {} + }, + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "@verified": { + "type": "String", + "placeholders": {} + }, + "repeatPassword": "पासवर्ड दोहराएं", + "@repeatPassword": {}, + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "@callingPermissions": {}, + "@delete": { + "type": "String", + "placeholders": {} + }, + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "@readUpToHere": {}, + "@start": {}, + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "@deviceId": { + "type": "String", + "placeholders": {} + }, + "@register": { + "type": "String", + "placeholders": {} + }, + "@unlockOldMessages": {}, + "@identity": { + "type": "String", + "placeholders": {} + }, + "@numChats": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "@ignore": { + "type": "String", + "placeholders": {} + }, + "@recording": { + "type": "String", + "placeholders": {} + }, + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@moderator": { + "type": "String", + "placeholders": {} + }, + "@optionalRedactReason": {}, + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "@ok": { + "type": "String", + "placeholders": {} + }, + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "@dehydrate": {}, + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "@send": { + "type": "String", + "placeholders": {} + }, + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "@banned": { + "type": "String", + "placeholders": {} + }, + "@sendAsText": { + "type": "String" + }, + "@inviteForMe": { + "type": "String", + "placeholders": {} + }, + "@archiveRoomDescription": {}, + "exportEmotePack": "इमोट पैक को .zip के रूप में निर्यात करें", + "@exportEmotePack": {}, + "@changedTheChatNameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "chatname": { + "type": "String" + } + } + }, + "@sendSticker": { + "type": "String", + "placeholders": {} + }, + "@account": { + "type": "String", + "placeholders": {} + }, + "@switchToAccount": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "@commandInvalid": { + "type": "String" + }, + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "@placeCall": {}, + "@removedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@newChat": { + "type": "String", + "placeholders": {} + }, + "@notifications": { + "type": "String", + "placeholders": {} + }, + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "@experimentalVideoCalls": {}, + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "@pleaseEnterRecoveryKeyDescription": {}, + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "@mention": { + "type": "String", + "placeholders": {} + }, + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "@inviteContactToGroupQuestion": {}, + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@chat": { + "type": "String", + "placeholders": {} + }, + "@group": { + "type": "String", + "placeholders": {} + }, + "@leave": { + "type": "String", + "placeholders": {} + }, + "@skip": { + "type": "String", + "placeholders": {} + }, + "@appearOnTopDetails": {}, + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "@enterRoom": {}, + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@allChats": { + "type": "String", + "placeholders": {} + }, + "@reportUser": {}, + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@confirmEventUnpin": {}, + "@badServerVersionsException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "@license": { + "type": "String", + "placeholders": {} + }, + "@addToSpace": {}, + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "@redactMessageDescription": {}, + "@rejoin": { + "type": "String", + "placeholders": {} + }, + "@recoveryKey": {}, + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "@forward": { + "type": "String", + "placeholders": {} + }, + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "@invalidInput": {}, + "@about": { + "type": "String", + "placeholders": {} + }, + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "@dehydrateTorLong": {}, + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "@offline": { + "type": "String", + "placeholders": {} + }, + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "@doNotShowAgain": {}, + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@report": {}, + "@status": { + "type": "String", + "placeholders": {} + }, + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "@memberChanges": { + "type": "String", + "placeholders": {} + }, + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "@unverified": {}, + "@fluffychat": { + "type": "String", + "placeholders": {} + }, + "@howOffensiveIsThisContent": { + "type": "String", + "placeholders": {} + }, + "@serverRequiresEmail": {}, + "@hideUnimportantStateEvents": {}, + "@screenSharingTitle": {}, + "@widgetCustom": {}, + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@addToSpaceDescription": {}, + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "@addChatDescription": {}, + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "@cancel": { + "type": "String", + "placeholders": {} + }, + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@publish": {}, + "@openLinkInBrowser": {}, + "@clearArchive": {}, + "@appLock": { + "type": "String", + "placeholders": {} + }, + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "@messageInfo": {}, + "@disableEncryptionWarning": {}, + "@directChat": {}, + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "@sendTypingNotifications": {}, + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "@inviteGroupChat": {}, + "@appearOnTop": {}, + "@invitePrivateChat": {}, + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "@foregroundServiceRunning": {}, + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "@voiceCall": {}, + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "importEmojis": "इमोजी आयात करें", + "@importEmojis": {}, + "@confirm": { + "type": "String", + "placeholders": {} + }, + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "@noChatDescriptionYet": {}, + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "@removeFromBundle": {}, + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "@confirmMatrixId": {}, + "@learnMore": {}, + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "@you": { + "type": "String", + "placeholders": {} + }, + "notAnImage": "कोई छवि फ़ाइल नहीं।", + "@notAnImage": {}, + "@users": {}, + "@openGallery": {}, + "@chatDescriptionHasBeenChanged": {}, + "@search": { + "type": "String", + "placeholders": {} + }, + "@newGroup": {}, + "@bundleName": {}, + "@dehydrateTor": {}, + "@removeFromSpace": {}, + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "@roomUpgradeDescription": {}, + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "@scanQrCode": {}, + "@logout": { + "type": "String", + "placeholders": {} + }, + "@pleaseEnterANumber": {}, + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@profileNotFound": {}, + "@jump": {}, + "@groups": { + "type": "String", + "placeholders": {} + }, + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@sorryThatsNotPossible": {}, + "@videoWithSize": { + "type": "String", + "placeholders": { + "size": { + "type": "String" + } + } + }, + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@shareInviteLink": {}, + "@commandHint_markasdm": {}, + "@recoveryKeyLost": {}, + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@containsUserName": { + "type": "String", + "placeholders": {} + }, + "@messages": { + "type": "String", + "placeholders": {} + }, + "@login": { + "type": "String", + "placeholders": {} + }, + "@deviceKeys": {}, + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "@everythingReady": { + "type": "String", + "placeholders": {} + }, + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "@setCustomEmotes": { + "type": "String", + "placeholders": {} + }, + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "@notificationsEnabledForThisAccount": { + "type": "String", + "placeholders": {} + }, + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "@settings": { + "type": "String", + "placeholders": {} + }, + "@setTheme": {}, + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "@youJoinedTheChat": {}, + "@wallpaper": { + "type": "String", + "placeholders": {} + }, + "@openVideoCamera": { + "type": "String", + "placeholders": {} + }, + "@play": { + "type": "String", + "placeholders": { + "fileName": { + "type": "String" + } + } + }, + "@chatBackupDescription": { + "type": "String", + "placeholders": {} + }, + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "@security": { + "type": "String", + "placeholders": {} + }, + "@markAsRead": {}, + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "@widgetName": {}, + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@errorAddingWidget": {}, + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "@commandHint_hug": {}, + "@replace": {}, + "@reject": { + "type": "String", + "placeholders": {} + }, + "@extremeOffensive": { + "type": "String", + "placeholders": {} + }, + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "@archive": { + "type": "String", + "placeholders": {} + }, + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "@pleaseEnter4Digits": { + "type": "String", + "placeholders": {} + }, + "@newSpace": {}, + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "@devices": { + "type": "String", + "placeholders": {} + }, + "@accept": { + "type": "String", + "placeholders": {} + }, + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "@emojis": {}, + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "@pleaseChoose": { + "type": "String", + "placeholders": {} + }, + "@share": { + "type": "String", + "placeholders": {} + }, + "@commandHint_googly": {}, + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "@createGroup": {}, + "@privacy": { + "type": "String", + "placeholders": {} + }, + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "@hydrateTorLong": {}, + "@time": {}, + "@enterYourHomeserver": { + "type": "String", + "placeholders": {} + }, + "@botMessages": { + "type": "String", + "placeholders": {} + }, + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "@custom": {}, + "@noBackupWarning": {}, + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "@verify": { + "type": "String", + "placeholders": {} + }, + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "@storeInSecureStorageDescription": {}, + "@openChat": {}, + "@kickUserDescription": {}, + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "@pin": { + "type": "String", + "placeholders": {} + }, + "importNow": "अभी आयात करें", + "@importNow": {}, + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "@setInvitationLink": { + "type": "String", + "placeholders": {} + }, + "@pinMessage": {}, + "@screenSharingDetail": {}, + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "@invite": {}, + "@enableMultiAccounts": {}, + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "@emotePacks": { + "type": "String", + "placeholders": {} + }, + "@indexedDbErrorTitle": {}, + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + } +} diff --git a/assets/l10n/intl_hr.arb b/assets/l10n/intl_hr.arb new file mode 100644 index 0000000..22c200f --- /dev/null +++ b/assets/l10n/intl_hr.arb @@ -0,0 +1,3000 @@ +{ + "@@locale": "hr", + "@@last_modified": "2021-08-14 12:41:10.025984", + "about": "Informacije", + "@about": { + "type": "String", + "placeholders": {} + }, + "accept": "Prihvati", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 {username} je prihvatio/la poziv", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "Račun", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐 {username} je aktivirao/la obostrano šifriranje", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "addEmail": "Dodaj e-mail", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "admin": "Administrator", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "pseudonim", + "@alias": { + "type": "String", + "placeholders": {} + }, + "all": "Svi", + "@all": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "{senderName} je odgovorio/la na poziv", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "Svatko se može pridružiti", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "appLock": "Zaključavanje programa", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "archive": "Arhiv", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "Smiju li se gosti pridružiti", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "Stvarno to želiš?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "areYouSureYouWantToLogout": "Stvarno se želiš odjaviti?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "Za potpisivanje druge osobe, upiši svoju sigurnosnu lozinku ili ključ za oporavak.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "Prihvatiti ovaj zahtjev za potvrđivanje od {username}?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "badServerLoginTypesException": "Domaći poslužitelj podržava vrste prijave:\n{serverVersions}\nMeđutim ovaj program podržava samo:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "badServerVersionsException": "Domaći poslužitelj podržava verzije specifikacije:\n{serverVersions}\nMeđutim ovaj program podržava samo {supportedVersions}", + "@badServerVersionsException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "banFromChat": "Isključi iz razgovora", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "Isključen", + "@banned": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username} je isključio/la {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "Blokiraj uređaj", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "blocked": "Blokirano", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "botMessages": "Poruke bota", + "@botMessages": { + "type": "String", + "placeholders": {} + }, + "cancel": "Odustani", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "cantOpenUri": "URI adresa {uri} se ne može otvoriti", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "changeDeviceName": "Promijeni ime uređaja", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "{username} je promijenio/la avatar razgovora", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatDescriptionTo": "{username} je promijenio/la opis razgovora u: „{description}”", + "@changedTheChatDescriptionTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "description": { + "type": "String" + } + } + }, + "changedTheChatNameTo": "{username} je promijenio/la ime razgovora u: „{chatname}”", + "@changedTheChatNameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "chatname": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username} je promijenio/la dozvole razgovora", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username} je promijenio/la ime u: „{displayname}”", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} je promijenio/la pravila pristupa za goste", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} je promijenio/la pravila pristupa za goste u: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username} je promijenio/la vidljivost kronologije", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username} je promijenio/la vidljivost kronologije u: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username} je promijenio/la pravila pridruživanja", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} je promijenio/la pravila pridruživanja u: {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} je promijenio/la svoj avatar", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "{username} je promijenio/la pseudonime soba", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username} je promijenio/la poveznicu poziva", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changePassword": "Promijeni lozinku", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "Promijeni domaćeg poslužitelja", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "Promijeni tvoj stil", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "Promijeni ime grupe", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "changeYourAvatar": "Promijeni svoj avatar", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "Šifriranje je oštećeno", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "chat": "Razgovor", + "@chat": { + "type": "String", + "placeholders": {} + }, + "chatBackup": "Sigurnosna kopija razgovora", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "chatBackupDescription": "Tvoji su stari razgovori osigurani s ključem za obnavljanje. Pazi da ga ne izgubiš.", + "@chatBackupDescription": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Detalji razgovora", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chats": "Razgovori", + "@chats": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "Odaberi snažnu lozinku", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "clearArchive": "Isprazni arhiv", + "@clearArchive": {}, + "close": "Zatvori", + "@close": { + "type": "String", + "placeholders": {} + }, + "commandHint_ban": "Isključi navedenog korisnika iz ove sobe", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_html": "Pošalji HTML formatirani tekst", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_invite": "Pozovi navedenog korisnika u ovu sobu", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "commandHint_join": "Pridruži se navedenoj sobi", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_kick": "Ukloni navedenog korisnika iz ove sobe", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_leave": "Napusti ovu sobu", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_me": "Opiši se", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "commandHint_myroomavatar": "Postavi svoju sliku za ovu sobu (mxc-uri)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_myroomnick": "Postavi svoje ime za ovu sobu", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "commandHint_op": "Postavi razinu prava navedenog korisnika (standardno: 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_plain": "Pošalji neformatirani tekst", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_react": "Pošalji odgovor kao reakciju", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "commandHint_send": "Pošalji tekst", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "commandHint_unban": "Ponovo uključi navedenog korisnika u ovu sobu", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "commandInvalid": "Naredba nevaljana", + "@commandInvalid": { + "type": "String" + }, + "commandMissing": "{command} nije naredba.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "compareEmojiMatch": "Usporedi emoji sličice", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "Usporedi brojeve", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "configureChat": "Konfiguriraj razgovor", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "confirm": "Potvrdi", + "@confirm": { + "type": "String", + "placeholders": {} + }, + "connect": "Spoji", + "@connect": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "Kontakt je pozvan u grupu", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "containsDisplayName": "Sadržava prikazano ime", + "@containsDisplayName": { + "type": "String", + "placeholders": {} + }, + "containsUserName": "Sadrži korisničko ime", + "@containsUserName": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "Sadržaj je prijavljen administratorima poslužitelja", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "Kopirano u međuspremnik", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "Kopiraj", + "@copy": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "Kopiraj u međuspremnik", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "Neuspjelo dešifriranje poruke: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "countParticipants": "{count} sudionika", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "create": "Stvori", + "@create": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "💬 {username} je započeo/la razgovor", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "createNewSpace": "Novi prostor", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "currentlyActive": "Trenutačno aktivni", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "Tamna", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "dateWithoutYear": "{day}. {month}.", + "@dateWithoutYear": { + "type": "String", + "placeholders": { + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "dateWithYear": "{day}. {month}. {year}.", + "@dateWithYear": { + "type": "String", + "placeholders": { + "year": { + "type": "String" + }, + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "deactivateAccountWarning": "Ovo će nepovratno deaktivirati tvoj korisnički račun. Stvarno to želiš?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "Standardna razina dozvole", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "delete": "Izbriši", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "Izbriši račun", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "Izbriši poruku", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "device": "Uređaj", + "@device": { + "type": "String", + "placeholders": {} + }, + "deviceId": "ID oznaka uređaja", + "@deviceId": { + "type": "String", + "placeholders": {} + }, + "devices": "Uređaji", + "@devices": { + "type": "String", + "placeholders": {} + }, + "directChats": "Izravni razgovori", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "Prikazno ime je promijenjeno", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "Preuzmi datoteku", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "edit": "Uredi", + "@edit": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "Uredi blokirane poslužitelje", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "editDisplayname": "Uredi prikazano ime", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "editRoomAliases": "Uredi pseudonime sobe", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "Uredi avatar sobe", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "Emotikon već postoji!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "Neispravna kratica emotikona!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emotePacks": "Paketi emotikona za sobu", + "@emotePacks": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "Postavke emotikona", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "emoteShortcode": "Kratica emotikona", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emoteWarnNeedToPick": "Moraš odabrati jednu kraticu emotikona i sliku!", + "@emoteWarnNeedToPick": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "Prazan razgovor", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "Aktiviraj paket emotikona globalno", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "Aktiviraj šifriranje", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "Više nećeš moći deaktivirati šifriranje. Stvarno to želiš?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "encrypted": "Šifrirano", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "encryption": "Šifriranje", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "Šifriranje nije aktivirano", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName} je završio/la poziv", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "enterAnEmailAddress": "Upiši e-adressu", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "enterYourHomeserver": "Upiši svoj domaći poslužitelj", + "@enterYourHomeserver": { + "type": "String", + "placeholders": {} + }, + "everythingReady": "Sve je spremno!", + "@everythingReady": { + "type": "String", + "placeholders": {} + }, + "extremeOffensive": "Izrazito uvredljiv", + "@extremeOffensive": { + "type": "String", + "placeholders": {} + }, + "fileName": "Ime datoteke", + "@fileName": { + "type": "String", + "placeholders": {} + }, + "fluffychat": "FluffyChat", + "@fluffychat": { + "type": "String", + "placeholders": {} + }, + "fontSize": "Veličina fonta", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "forward": "Proslijedi", + "@forward": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "Od pridruživanja", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "Od poziva", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "goToTheNewRoom": "Idi u novu sobu", + "@goToTheNewRoom": { + "type": "String", + "placeholders": {} + }, + "group": "Grupiraj", + "@group": { + "type": "String", + "placeholders": {} + }, + "groupIsPublic": "Grupa je javna", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "groups": "Grupe", + "@groups": { + "type": "String", + "placeholders": {} + }, + "groupWith": "Grupa s {displayname}", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "guestsAreForbidden": "Gosti su zabranjeni", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "Gosti se mogu pridružiti", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{username} je povukao/la poziv za {targetName}", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "help": "Pomoć", + "@help": { + "type": "String", + "placeholders": {} + }, + "hideRedactedEvents": "Sakrij promijenjene događaje", + "@hideRedactedEvents": { + "type": "String", + "placeholders": {} + }, + "hideUnknownEvents": "Sakrij nepoznate događaje", + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "howOffensiveIsThisContent": "Koliko je ovaj sadržaj uvredljiv?", + "@howOffensiveIsThisContent": { + "type": "String", + "placeholders": {} + }, + "id": "ID", + "@id": { + "type": "String", + "placeholders": {} + }, + "identity": "Identitet", + "@identity": { + "type": "String", + "placeholders": {} + }, + "ignore": "Zanemari", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "ignoredUsers": "Zanemareni korisnici", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "iHaveClickedOnLink": "Pritisnuo/la sam poveznicu", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "Neispravna lozinka ili ključ za obnavljanje", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "inoffensive": "Neuvredljiv", + "@inoffensive": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "Pozovi kontakt", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "Pozovi kontakt u {groupName}", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "invited": "Pozvan/a", + "@invited": { + "type": "String", + "placeholders": {} + }, + "invitedUser": "📩 {username} je pozvao/la {targetName}", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "invitedUsersOnly": "Samo pozvani korisnici", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "inviteForMe": "Poziv za mene", + "@inviteForMe": { + "type": "String", + "placeholders": {} + }, + "inviteText": "{username} te je pozvao/la u FluffyChat. \n1. Posjeti strnicu fluffychat.im i instaliraj aplikaciju \n2. Registriraj ili prijavi se \n3. Otvori poveznicu poziva: \n {link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "isTyping": "piše …", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "👋 {username} se pridružio/la razgovoru", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "joinRoom": "Pridruži se sobi", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "kicked": "👞 {username} je izbacio/la {targetName}", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickedAndBanned": "🙅 {username} je izbacio/la i blokirao/la {targetName}", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickFromChat": "Izbaci iz razgovora", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "Zadnja aktivnost: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "leave": "Napusti", + "@leave": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "Napustio/la je razgovor", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "license": "Licenca", + "@license": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "Svijetla", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "Učitaj još {count} sudionika", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "loadingPleaseWait": "Učitava se … Pričekaj.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "loadMore": "Učitaj još …", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "login": "Prijava", + "@login": { + "type": "String", + "placeholders": {} + }, + "logInTo": "Prijavi se na {homeserver}", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "logout": "Odjava", + "@logout": { + "type": "String", + "placeholders": {} + }, + "memberChanges": "Promjene člana", + "@memberChanges": { + "type": "String", + "placeholders": {} + }, + "mention": "Spominjanje", + "@mention": { + "type": "String", + "placeholders": {} + }, + "messages": "Poruke", + "@messages": { + "type": "String", + "placeholders": {} + }, + "moderator": "Voditelj", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "muteChat": "Isključi zvuk razgovora", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "needPantalaimonWarning": "Za trenutačno korištenje obostranog šifriranja trebaš Pantalaimon.", + "@needPantalaimonWarning": { + "type": "String", + "placeholders": {} + }, + "newChat": "Novi razgovor", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "💬 Nova poruka u FluffyChatu", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "Novi zahtjev za potvrđivanje!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "next": "Dalje", + "@next": { + "type": "String", + "placeholders": {} + }, + "no": "Ne", + "@no": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "Ne postoji veza s poslužiteljem", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "Nema emotikona. 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "Šifriranje možeš aktivirati samo nakon što soba više nije javno dostupna.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "none": "Ništa", + "@none": { + "type": "String", + "placeholders": {} + }, + "noPasswordRecoveryDescription": "Još nisi dodao/la način za obnavljanje lozinke.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "noPermission": "Bez dozvole", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "Nema soba …", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "notifications": "Obavijesti", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "notificationsEnabledForThisAccount": "Obavijesti su aktivirane za ovaj račun", + "@notificationsEnabledForThisAccount": { + "type": "String", + "placeholders": {} + }, + "numUsersTyping": "{count} korisnika pišu …", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "offensive": "Uvredljiv", + "@offensive": { + "type": "String", + "placeholders": {} + }, + "offline": "Nepovezano s internetom", + "@offline": { + "type": "String", + "placeholders": {} + }, + "ok": "U redu", + "@ok": { + "type": "String", + "placeholders": {} + }, + "online": "Povezano s internetom", + "@online": { + "type": "String", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "Internetski ključ sigurnosnih kopija je aktiviran", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "oopsPushError": "Ups! Nažalost se dogodila greška prilikom postavljanja automatskog primanja obavijesti.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "Ups, dogodila se greška …", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "Za čitanje poruka, otvori program", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "openCamera": "Otvori kameru", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "or": "Ili", + "@or": { + "type": "String", + "placeholders": {} + }, + "participant": "Sudionik", + "@participant": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "tajni izraz ili ključ za obnavljanje", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "password": "Lozinka", + "@password": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "Zaboravljena lozinka", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "Lozinka je promijenjena", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "passwordRecovery": "Obnavljanje lozinke", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "people": "Ljudi", + "@people": { + "type": "String", + "placeholders": {} + }, + "pickImage": "Odaberi sliku", + "@pickImage": { + "type": "String", + "placeholders": {} + }, + "pin": "Prikvači", + "@pin": { + "type": "String", + "placeholders": {} + }, + "play": "Sviraj {fileName}", + "@play": { + "type": "String", + "placeholders": { + "fileName": { + "type": "String" + } + } + }, + "pleaseChoose": "Odaberi", + "@pleaseChoose": { + "type": "String", + "placeholders": {} + }, + "pleaseChooseAPasscode": "Odaberi lozinku", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "pleaseClickOnLink": "Pritisni poveznicu u e-poruci, zatim nastavi.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "pleaseEnter4Digits": "Upiši 4 znamenke ili ostavi prazno, za deaktiviranje zaključavanja programa.", + "@pleaseEnter4Digits": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPassword": "Upiši svoju lozinku", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPin": "Upiši svoj pin", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "Upiši svoje korisničko ime", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "Slijedi upute na web-stranici i dodirni „Dalje”.", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "privacy": "Privatnost", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "Javne sobe", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "pushRules": "Pravila slanja", + "@pushRules": { + "type": "String", + "placeholders": {} + }, + "reason": "Razlog", + "@reason": { + "type": "String", + "placeholders": {} + }, + "recording": "Snimanje", + "@recording": { + "type": "String", + "placeholders": {} + }, + "redactedAnEvent": "{username} je preuredio/la događaj", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "redactMessage": "Ispravi poruku", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "register": "Registracija", + "@register": { + "type": "String", + "placeholders": {} + }, + "reject": "Odbij", + "@reject": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "{username} je odbio/la poziv", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "rejoin": "Ponovo se pridruži", + "@rejoin": { + "type": "String", + "placeholders": {} + }, + "remove": "Ukloni", + "@remove": { + "type": "String", + "placeholders": {} + }, + "removeAllOtherDevices": "Ukloni sve druge uređaje", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "removedBy": "Uklonjeno od {username}", + "@removedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "removeDevice": "Ukloni uređaj", + "@removeDevice": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "Ponovo uključi u razgovor", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "removeYourAvatar": "Ukloni svoj avatar", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "renderRichContent": "Prikaži formatirani sadržaj poruke", + "@renderRichContent": { + "type": "String", + "placeholders": {} + }, + "replaceRoomWithNewerVersion": "Zamijeni sobu s novom verzijom", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "reply": "Odgovori", + "@reply": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "Prijavi poruku", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "requestPermission": "Zatraži dozvolu", + "@requestPermission": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "Soba je nadograđena", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "Verzija sobe", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "saveFile": "Spremi datoteku", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "search": "Traži", + "@search": { + "type": "String", + "placeholders": {} + }, + "security": "Sigurnost", + "@security": { + "type": "String", + "placeholders": {} + }, + "seenByUser": "Viđeno od {username}", + "@seenByUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "send": "Pošalji", + "@send": { + "type": "String", + "placeholders": {} + }, + "sendAMessage": "Pošalji poruku", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "sendAsText": "Pošalji kao tekst", + "@sendAsText": { + "type": "String" + }, + "sendAudio": "Pošalji audio datoteku", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendFile": "Pošalji datoteku", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendImage": "Pošalji sliku", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendMessages": "Šalji poruke", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "sendOriginal": "Pošalji original", + "@sendOriginal": { + "type": "String", + "placeholders": {} + }, + "sendSticker": "Pošalji naljepnicu", + "@sendSticker": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "Pošalji video datoteku", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "sentAFile": "📁 {username} ja poslao/la datoteku", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAnAudio": "🎤 {username} ja poslao/la audio snimku", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAPicture": "🖼️ {username} ja poslao/la sliku", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentASticker": "😊 {username} je poslao/la naljepnicu", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "🎥 {username} je poslao/la video", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentCallInformations": "{senderName} je poslao/la podatke poziva", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "setAsCanonicalAlias": "Postavi kao glavni pseudonim", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "setCustomEmotes": "Postavi prilagođene emotikone", + "@setCustomEmotes": { + "type": "String", + "placeholders": {} + }, + "setInvitationLink": "Pošalji poveznicu poziva", + "@setInvitationLink": { + "type": "String", + "placeholders": {} + }, + "setPermissionsLevel": "Postavi razinu dozvola", + "@setPermissionsLevel": { + "type": "String", + "placeholders": {} + }, + "setStatus": "Postavi stanje", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "settings": "Postavke", + "@settings": { + "type": "String", + "placeholders": {} + }, + "share": "Dijeli", + "@share": { + "type": "String", + "placeholders": {} + }, + "sharedTheLocation": "{username} je dijelio/la svoje mjesto", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "showPassword": "Pokaži lozinku", + "@showPassword": { + "type": "String", + "placeholders": {} + }, + "singlesignon": "Jednokratna prijava", + "@singlesignon": { + "type": "String", + "placeholders": {} + }, + "skip": "Preskoči", + "@skip": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "Izvorni kȏd", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "spaceIsPublic": "Prostor je javan", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "spaceName": "Ime prostora", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "startedACall": "{senderName} ja započeo/la poziv", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "status": "Stanje", + "@status": { + "type": "String", + "placeholders": {} + }, + "statusExampleMessage": "Kako si danas?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "submit": "Pošalji", + "@submit": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWait": "Sinkronizira se … Pričekaj.", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "systemTheme": "Sustav", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "Ne poklapaju se", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "Poklapaju se", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "title": "FluffyChat", + "@title": { + "description": "Title for the application", + "type": "String", + "placeholders": {} + }, + "toggleFavorite": "Uklj/Isklj favorite", + "@toggleFavorite": { + "type": "String", + "placeholders": {} + }, + "toggleMuted": "Uklj/Isklj isključene", + "@toggleMuted": { + "type": "String", + "placeholders": {} + }, + "toggleUnread": "Označi kao pročitano/nepročitano", + "@toggleUnread": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "Previše zahtjeva. Pokušaj ponovo kasnije!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "transferFromAnotherDevice": "Prenesi s jednog drugog uređaja", + "@transferFromAnotherDevice": { + "type": "String", + "placeholders": {} + }, + "tryToSendAgain": "Pokušaj ponovo poslati", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "unavailable": "Nedostupno", + "@unavailable": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username} je ponovo uključio/la {targetName}", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "unblockDevice": "Deblokiraj uređaj", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "Nepoznat uređaj", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "unknownEncryptionAlgorithm": "Nepoznat algoritam šifriranja", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unknownEvent": "Nepoznat događaj „{type}”", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "unmuteChat": "Uključi zvuk razgovora", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "unpin": "Otkvači", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "unreadChats": "{unreadCount, plural, =1{1 nepročitan razgovor} few{{unreadCount} nepročitana razgovora} other{{unreadCount} nepročitanih razgovora}}", + "@unreadChats": { + "type": "String", + "placeholders": { + "unreadCount": { + "type": "int" + } + } + }, + "userAndOthersAreTyping": "{username} i još {count} korisnika pišu …", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "userAndUserAreTyping": "{username} i {username2} pišu …", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userIsTyping": "{username} piše …", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userLeftTheChat": "🚪 {username} je napustio/la razgovor", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "username": "Korisničko ime", + "@username": { + "type": "String", + "placeholders": {} + }, + "userSentUnknownEvent": "{username} ja poslao/la {type} događaj", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "verified": "Potvrđeno", + "@verified": { + "type": "String", + "placeholders": {} + }, + "verify": "Potvrdi", + "@verify": { + "type": "String", + "placeholders": {} + }, + "verifyStart": "Pokreni potvrđivanje", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "Uspješno si potvrdio/la!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "verifyTitle": "Potvrđivanje drugog računa", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "videoCall": "Video poziv", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "Vidljivost povijesti razgovora", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "Vidljivo za sve sudionike", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "Vidljivo za sve", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "Glasovna poruka", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "Čeka se na sugovornika da prihvati zahtjev …", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "Čeka se na sugovornika da prihvati emoji …", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "Čeka se na sugovornika da prihvati brojeve …", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "wallpaper": "Pozadina:", + "@wallpaper": { + "type": "String", + "placeholders": {} + }, + "warning": "Upozorenje!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "weSentYouAnEmail": "Poslali smo ti e-poruku", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "whoCanPerformWhichAction": "Tko može izvršiti koju radnju", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "Tko se smije pridružiti grupi", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "Zašto želiš ovo prijaviti?", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "wipeChatBackup": "Izbrisati sigurnosnu kopiju razgovora za stvaranje novog sigurnosnog ključa za obnavljanje?", + "@wipeChatBackup": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "Lozinku možeš obnoviti pomoću ovih adresa.", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "Napiši poruku …", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "yes": "Da", + "@yes": { + "type": "String", + "placeholders": {} + }, + "you": "Ti", + "@you": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "Više ne sudjeluješ u ovom razgovoru", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "Isključen/a si iz ovog razgovora", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "yourPublicKey": "Tvoj javni ključ", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "shareLocation": "Dijeli lokaciju", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "locationPermissionDeniedNotice": "Lokacijske dozvole su odbijene. Za dijeljenje tvoje lokacije dozvoli ih.", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "locationDisabledNotice": "Lokacijske usluge su deaktivirane. Za dijeljenje tvoje lokacije aktiviraj ih.", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "obtainingLocation": "Dohvaćanje lokacije …", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "errorObtainingLocation": "Greška u dohvaćanju lokacije: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "openInMaps": "Otvori u kartama", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "noMatrixServer": "{server1} nije matrix poslužitelj. Da li umjesto njega koristiti {server2}?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "autoplayImages": "Automatski pokreni animirane naljepnice i emotikone", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "allChats": "Svi razgovori", + "@allChats": { + "type": "String", + "placeholders": {} + }, + "chatHasBeenAddedToThisSpace": "Razgovor je dodan u ovaj prostor", + "@chatHasBeenAddedToThisSpace": {}, + "addToSpace": "Dodaj u prostor", + "@addToSpace": {}, + "serverRequiresEmail": "Za registraciju ovaj poslužitelj mora potvrditi tvoju e-mail adresu.", + "@serverRequiresEmail": {}, + "scanQrCode": "Snimi QR kod", + "@scanQrCode": {}, + "homeserver": "Domaći poslužitelj", + "@homeserver": {}, + "sendOnEnter": "Pošalji pritiskom tipke enter", + "@sendOnEnter": {}, + "link": "Poveznica", + "@link": {}, + "enableMultiAccounts": "(BETA) Omogući korištenje više računa na ovom uređaju", + "@enableMultiAccounts": {}, + "bundleName": "Ime paketa", + "@bundleName": {}, + "removeFromBundle": "Ukloni iz ovog paketa", + "@removeFromBundle": {}, + "addToBundle": "Dodaj u paket", + "@addToBundle": {}, + "editBundlesForAccount": "Uredi pakete za ovaj račun", + "@editBundlesForAccount": {}, + "addAccount": "Dodaj račun", + "@addAccount": {}, + "oneClientLoggedOut": "Jedan od tvojih klijenata je odjavljen", + "@oneClientLoggedOut": {}, + "unverified": "Nepotvrđeno", + "@unverified": {}, + "yourChatBackupHasBeenSetUp": "Sigurnosna kopija tvog razgovora je postavljena.", + "@yourChatBackupHasBeenSetUp": {}, + "repeatPassword": "Ponovi lozinku", + "@repeatPassword": {}, + "messageInfo": "Informacija poruke", + "@messageInfo": {}, + "messageType": "Vrsta poruke", + "@messageType": {}, + "sender": "Pošiljatelj", + "@sender": {}, + "openGallery": "Otvori galeriju", + "@openGallery": {}, + "time": "Vrijeme", + "@time": {}, + "removeFromSpace": "Ukloni iz prostora", + "@removeFromSpace": {}, + "addToSpaceDescription": "Odaberi prostor kojem će se ovaj razgovor dodati.", + "@addToSpaceDescription": {}, + "start": "Početak", + "@start": {}, + "commandHint_clearcache": "Isprazni predmemoriju", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_create": "Stvori prazan grupni razgovor\nKoristi --no-encryption za deaktiviranje šifriranja", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "commandHint_discardsession": "Odbaci sesiju", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "commandHint_dm": "Započni izravni razgovor\nKoristi --no-encryption za deaktiviranje šifriranja", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "openVideoCamera": "Otvori kameru za video", + "@openVideoCamera": { + "type": "String", + "placeholders": {} + }, + "videoWithSize": "Video ({size})", + "@videoWithSize": { + "type": "String", + "placeholders": { + "size": { + "type": "String" + } + } + }, + "publish": "Objavi", + "@publish": {}, + "markAsRead": "Označi kao pročitano", + "@markAsRead": {}, + "reportUser": "Prijavi korisnika", + "@reportUser": {}, + "openChat": "Otvori razgovor", + "@openChat": {}, + "dismiss": "Odbaci", + "@dismiss": {}, + "unsupportedAndroidVersion": "Nepodržana Android verzija", + "@unsupportedAndroidVersion": {}, + "widgetVideo": "Video", + "@widgetVideo": {}, + "widgetEtherpad": "Tekstna bilješka", + "@widgetEtherpad": {}, + "widgetCustom": "Prilagođeno", + "@widgetCustom": {}, + "widgetName": "Ime", + "@widgetName": {}, + "widgetUrlError": "Ovo nije valjan URL.", + "@widgetUrlError": {}, + "switchToAccount": "Prijeđi na račun {number}", + "@switchToAccount": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "nextAccount": "Sljedeći račun", + "@nextAccount": {}, + "emailOrUsername": "E-mail ili korisničko ime", + "@emailOrUsername": {}, + "unsupportedAndroidVersionLong": "Ova funkcija zahtijeva noviju verziju Androida. Provjeri, postoje li nove verzije ili podrška za Lineage OS.", + "@unsupportedAndroidVersionLong": {}, + "previousAccount": "Prethodni račun", + "@previousAccount": {}, + "recoveryKey": "Ključ za obnavljanje", + "@recoveryKey": {}, + "recoveryKeyLost": "Izgubio/la si ključ za obnavljanje?", + "@recoveryKeyLost": {}, + "youKickedAndBanned": "🙅 Izbacio/la si i blokirao/la korisnika {user}", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "dehydrateWarning": "Ovo je nepovratna radnja. Spremi datoteku sigurnosne kopije na sigurno mjeto.", + "@dehydrateWarning": {}, + "hydrateTor": "Korisnici TOR-a: Uzvezite izvoz sesije", + "@hydrateTor": {}, + "dehydrateTor": "Korisnici TOR-a: izvezite sesiju", + "@dehydrateTor": {}, + "emojis": "Emojiji", + "@emojis": {}, + "indexedDbErrorLong": "Spremište poruka nažalost nije standarno uključena u privatnom modusu.\nOtvori stranicu\n - about:config\n - postavi dom.indexedDB.privateBrowsing.enabled na true\nFluffyChat se inače neće moći pokrenuti.", + "@indexedDbErrorLong": {}, + "storeSecurlyOnThisDevice": "Spremi sigurno na ovom uređaju", + "@storeSecurlyOnThisDevice": {}, + "countFiles": "Broj datoteka: {count}", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "reactedWith": "{sender} je reagirao/la sa {reaction}", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "pinMessage": "Prikvači na sobu", + "@pinMessage": {}, + "confirmEventUnpin": "Stvarno želiš trajno otkvačiti događaj?", + "@confirmEventUnpin": {}, + "voiceCall": "Glasovni poziv", + "@voiceCall": {}, + "placeCall": "Nazovi", + "@placeCall": {}, + "videoCallsBetaWarning": "Napominjemo da se funkcija videopoziva trenutačno nalazi u beta stanju. Možda neće raditi ispravno ili uopće neće raditi na svim platformama.", + "@videoCallsBetaWarning": {}, + "experimentalVideoCalls": "Eksperimentalni videopozivi", + "@experimentalVideoCalls": {}, + "widgetJitsi": "Jitsi Meet", + "@widgetJitsi": {}, + "addWidget": "Dodaj widget", + "@addWidget": {}, + "widgetNameError": "Zadaj prikazno ime.", + "@widgetNameError": {}, + "youRejectedTheInvitation": "Odbio/la si poziv", + "@youRejectedTheInvitation": {}, + "errorAddingWidget": "Greška prilikom dodavanja widgeta.", + "@errorAddingWidget": {}, + "youJoinedTheChat": "Pridružio/la si se razgovoru", + "@youJoinedTheChat": {}, + "youAcceptedTheInvitation": "👍 Prihvatio/la si poziv", + "@youAcceptedTheInvitation": {}, + "youHaveWithdrawnTheInvitationFor": "Povukao/la si poziv za korisnika {user}", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedBy": "📩 {user} te je pozvao/la", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedUser": "📩 Pozvao/la si korisnika {user}", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKicked": "👞 Izbacio/la si korisnika {user}", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youUnbannedUser": "Ponovo si uključio/la korisnika {user}", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "dehydrate": "Izvezi sesiju i izbriši uređaj", + "@dehydrate": {}, + "unlockOldMessages": "Otključaj stare poruke", + "@unlockOldMessages": {}, + "storeInSecureStorageDescription": "Ključ za obnavljanje spremi u sigurno spremište na ovom uređaju.", + "@storeInSecureStorageDescription": {}, + "saveKeyManuallyDescription": "Spremi ovaj ključ ručno pokretanjem dijaloga za dijeljenje sustava ili međuspremnika.", + "@saveKeyManuallyDescription": {}, + "storeInAndroidKeystore": "Spremi u Android KeyStore", + "@storeInAndroidKeystore": {}, + "separateChatTypes": "Odvojeni izravni razgovori, grupe i prostori", + "@separateChatTypes": { + "type": "String", + "placeholders": {} + }, + "dehydrateTorLong": "Korisnicima TOR-a preporučuje se izvoz sesije prije zatvaranja prozora.", + "@dehydrateTorLong": {}, + "hydrateTorLong": "Je li zadnji izvoz sesije bio na TOR-u? Brzo ga uvezi i nastavi razgovarati.", + "@hydrateTorLong": {}, + "hydrate": "Obnovi pomoću sigurnosne kopije", + "@hydrate": {}, + "pleaseEnterRecoveryKey": "Upiši svoj ključ za obnavljanje:", + "@pleaseEnterRecoveryKey": {}, + "users": "Korisnici", + "@users": {}, + "pleaseEnterRecoveryKeyDescription": "Za otključavanje starih poruka upiši ključ za obnavljanje koji je generiran u prethodnoj sesiji. Tvoj ključ za obnavljanje NIJE tvoja lozinka.", + "@pleaseEnterRecoveryKeyDescription": {}, + "indexedDbErrorTitle": "Problemi u privatnom modusu", + "@indexedDbErrorTitle": {}, + "youBannedUser": "Isključio/la si korisnika {user}", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "storeInAppleKeyChain": "Spremi u Apple KeyChain", + "@storeInAppleKeyChain": {}, + "user": "Korisnik", + "@user": {}, + "custom": "Prilagođeno", + "@custom": {}, + "fileHasBeenSavedAt": "Datoteka je spremljena u {path}", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "numChats": "{number} razgovora", + "@numChats": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "fileIsTooBigForServer": "Neuspjelo slanje! Poslužitelj podržava samo priloge do {max}.", + "@fileIsTooBigForServer": {}, + "jumpToLastReadMessage": "Skoči na zadnju pročitanu poruku", + "@jumpToLastReadMessage": {}, + "commandHint_markasdm": "Označi kao sobu za izravnu razmjenu poruka za zadani Matrix ID", + "@commandHint_markasdm": {}, + "commandHint_markasgroup": "Označi kao grupu", + "@commandHint_markasgroup": {}, + "hideUnimportantStateEvents": "Sakrij nevažna stanja događaja", + "@hideUnimportantStateEvents": {}, + "doNotShowAgain": "Nemoj više prikazivati", + "@doNotShowAgain": {}, + "readUpToHere": "Pročitaj do ovdje", + "@readUpToHere": {}, + "wasDirectChatDisplayName": "Prazan razgovor (zvao se {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "noBackupWarning": "Upozorenje! Bez aktiviranja spremanja sigurnosne kopije razgovora, izgubit ćeš pristup tvojim šifriranim porukama. Preporučujemo spremanje sigurnosne kopije razgovora prije odjave.", + "@noBackupWarning": {}, + "noOtherDevicesFound": "Nijedan drugi uređaj nije pronađen", + "@noOtherDevicesFound": {}, + "whyIsThisMessageEncrypted": "Zašto nije moguće čitati ovu poruku?", + "@whyIsThisMessageEncrypted": {}, + "jump": "Skoči", + "@jump": {}, + "startFirstChat": "Započni svoj prvi razgovor", + "@startFirstChat": {}, + "newSpaceDescription": "Prostori omogućuju konsolidiranje tvojih razgovora i izgradnju privatne ili javne zajednice.", + "@newSpaceDescription": {}, + "encryptThisChat": "Šifiraj ovaj razgovor", + "@encryptThisChat": {}, + "deviceKeys": "Ključevi uređaja:", + "@deviceKeys": {}, + "foregroundServiceRunning": "Ova se obavijest pojavljuje kada se pokreće usluga u prvom planu.", + "@foregroundServiceRunning": {}, + "callingPermissions": "Dozvole za pozivanje", + "@callingPermissions": {}, + "callingAccountDetails": "Omogućuje FluffyChatu korištenje izvorne Android aplikacije za pozivanje.", + "@callingAccountDetails": {}, + "callingAccount": "Račun za pozivanje", + "@callingAccount": {}, + "commandHint_hug": "Pošalji grljenje", + "@commandHint_hug": {}, + "commandHint_googly": "Pošalji kotrljajuće oči", + "@commandHint_googly": {}, + "commandHint_cuddle": "Pošalji maženje", + "@commandHint_cuddle": {}, + "confirmMatrixId": "Za brisanje tvog računa potvrdi svoj Matrix ID.", + "@confirmMatrixId": {}, + "supposedMxid": "Trebao bi biti {mxid}", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "enterRoom": "Uđi u sobu", + "@enterRoom": {}, + "screenSharingDetail": "Dijeliš svoj ekran u FuffyChatu", + "@screenSharingDetail": {}, + "appearOnTopDetails": "Omogućuje prikaz aplikacije ispred drugih (nije potrebno ako je FluffyChat već postavljen kao račun za pozivanje)", + "@appearOnTopDetails": {}, + "appearOnTop": "Prikaz ispred drugih", + "@appearOnTop": {}, + "newGroup": "Nova grupa", + "@newGroup": {}, + "allSpaces": "Svi prostori", + "@allSpaces": {}, + "screenSharingTitle": "dijeljenje ekrana", + "@screenSharingTitle": {}, + "otherCallingPermissions": "Mikrofon, kamera i druge FluffyChat dozvole", + "@otherCallingPermissions": {}, + "enterSpace": "Uđi u prostor", + "@enterSpace": {}, + "newSpace": "Novi prostor", + "@newSpace": {}, + "sorryThatsNotPossible": "Žao nam je … to nije moguće", + "@sorryThatsNotPossible": {}, + "disableEncryptionWarning": "Iz sigurnosnih razloga ne možeš deaktivirati šifriranje u razgovoru u kojem je prije bilo aktivirano.", + "@disableEncryptionWarning": {}, + "googlyEyesContent": "{senderName} ti šalje kotrljajuće oči", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "cuddleContent": "{senderName} te mazi", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "hugContent": "{senderName} te grli", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "noKeyForThisMessage": "To se može dogoditi ako je poruka poslana prije prijave na tvoj račun na ovom uređaju.\n\nTakođer je moguće da je pošiljatelj blokirao tvoj uređaj ili je došlo do greške s internetskom vezom.\n\nMožeš li pročitati poruku na jednoj drugoj sesiji? U tom slučaju možeš prenijeti poruku iz nje! Idi na Postavke > Uređaji i uvjeri se da su se tvoji uređaji međusobno provjerili. Kada sljedeći put otvoriš sobu i obje sesije su u prednjem planu, ključevi će se automatski prenijeti.\n\nNe želiš izgubiti ključeve kada se odjaviš ili zamijeniš uređaje? Aktiviraj spremanje sigurnosne kopije razgovora u postavkama.", + "@noKeyForThisMessage": {}, + "reopenChat": "Ponovo otvori razgovor", + "@reopenChat": {}, + "openLinkInBrowser": "Otvori poveznicu u pregledniku", + "@openLinkInBrowser": {}, + "report": "prijavi", + "@report": {}, + "allRooms": "Svi grupni razgovori", + "@allRooms": { + "type": "String", + "placeholders": {} + }, + "reportErrorDescription": "😭 Joj! Dogodila se greška. Pokušaj ponovo kasnije. Ako želiš, grešku možeš prijaviti programerima.", + "@reportErrorDescription": {}, + "signInWithPassword": "Prijavi se s lozinkom", + "@signInWithPassword": {}, + "pleaseTryAgainLaterOrChooseDifferentServer": "Pokušaj ponovo kasnije ili odaberi jedan drugi poslužitelj.", + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "signInWith": "Prijavi se pomoću {provider}", + "@signInWith": { + "type": "String", + "placeholders": { + "provider": { + "type": "String" + } + } + }, + "notAnImage": "Nije slikovna datoteka.", + "@notAnImage": {}, + "importNow": "Uvezi sada", + "@importNow": {}, + "importEmojis": "Uvezi emoji slike", + "@importEmojis": {}, + "importFromZipFile": "Uvezi iz .zip datoteke", + "@importFromZipFile": {}, + "replace": "Zamijeni", + "@replace": {}, + "exportEmotePack": "Izvezi paket emotikona kao .zip", + "@exportEmotePack": {}, + "sendTypingNotifications": "Pošalji pismene obavijesti", + "@sendTypingNotifications": {}, + "setColorTheme": "Postavi boju teme:", + "@setColorTheme": {}, + "tryAgain": "Pokušaj ponovo", + "@tryAgain": {}, + "messagesStyle": "Poruke:", + "@messagesStyle": {}, + "chatDescription": "Opis razgovora", + "@chatDescription": {}, + "invalidServerName": "Neispravno ime servera", + "@invalidServerName": {}, + "chatPermissions": "Dozvole za razgovor", + "@chatPermissions": {}, + "setChatDescription": "Postavi opis rzgovora", + "@setChatDescription": {}, + "redactedBy": "Preuređeno od {username}", + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "optionalRedactReason": "(Opcionalno) Razlog za redigiranje ove poruke …", + "@optionalRedactReason": {}, + "inviteContactToGroupQuestion": "Želiš li pozvati {contact} u razgovor grupe „{groupName}”?", + "@inviteContactToGroupQuestion": {}, + "redactedByBecause": "Preuređeno od {username} zbog: „{reason}”", + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "redactMessageDescription": "Poruka će se redigirati za sve sudionike u ovom razgovoru. To se ne može poništiti.", + "@redactMessageDescription": {}, + "addChatDescription": "Dodaj opis razgovora …", + "@addChatDescription": {}, + "directChat": "Izravni razgovor", + "@directChat": {}, + "inviteGroupChat": "📨 Pozovi u grupni razgovor", + "@inviteGroupChat": {}, + "invitePrivateChat": "📨 Pozovi u privatni razgovor", + "@invitePrivateChat": {}, + "noChatDescriptionYet": "Opis razgovora još nije stvoren.", + "@noChatDescriptionYet": {}, + "chatDescriptionHasBeenChanged": "Opis razgovora je promijenjen", + "@chatDescriptionHasBeenChanged": {}, + "profileNotFound": "Korisnik nije pronađen na poslužitelju. Možda postoji problem s vezom ili korisnik ne postoji.", + "@profileNotFound": {}, + "shareInviteLink": "Dijeli poveznicu za poziv", + "@shareInviteLink": {}, + "emoteKeyboardNoRecents": "Ovdje će se pojaviti nedavno korišteni emotikoni …", + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "setTheme": "Postavi temu:", + "@setTheme": {}, + "createGroup": "Stvori grupu", + "@createGroup": {}, + "invite": "Pozovi", + "@invite": {}, + "invalidInput": "Neispravan unos!", + "@invalidInput": {}, + "wrongPinEntered": "Unesen je pogrešan PIN! Pokušaj ponovo za {seconds} sekunde …", + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "hasKnocked": "🚪 {user} je pokucao/la", + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "pleaseEnterANumber": "Upiši broj veći od 0", + "@pleaseEnterANumber": {}, + "pushNotificationsNotAvailable": "Automatsko slanje obavijesti nije dostupno", + "@pushNotificationsNotAvailable": {}, + "learnMore": "Saznaj više", + "@learnMore": {}, + "createGroupAndInviteUsers": "Stvori grupu i pozovi korisnike", + "@createGroupAndInviteUsers": {}, + "startConversation": "Pokreni konverzaciju", + "@startConversation": {}, + "blockedUsers": "Blokirani korisnici", + "@blockedUsers": {}, + "groupCanBeFoundViaSearch": "Grupa se može pronaći putem pretrage", + "@groupCanBeFoundViaSearch": {}, + "block": "Blokiraj", + "@block": {}, + "yourGlobalUserIdIs": "Tvoj globalni korisnički ID je: ", + "@yourGlobalUserIdIs": {}, + "commandHint_sendraw": "Pošalji neobrađeni json", + "@commandHint_sendraw": {}, + "wrongRecoveryKey": "Oprosti … čini se da ovo nije ispravan ključ za obnavljanje.", + "@wrongRecoveryKey": {}, + "blockUsername": "Zanemari korisničko ime", + "@blockUsername": {}, + "groupName": "Ime grupe", + "@groupName": {}, + "databaseMigrationTitle": "Baza podataka je optimirana", + "@databaseMigrationTitle": {}, + "searchChatsRooms": "Traži #chats, @users …", + "@searchChatsRooms": {}, + "databaseMigrationBody": "Pričekaj. Ovo može potrajati.", + "@databaseMigrationBody": {}, + "transparent": "Prozirno", + "@transparent": {}, + "formattedMessages": "Formatirane poruke", + "@formattedMessages": {}, + "incomingMessages": "Dolazne poruke", + "@incomingMessages": {}, + "passwordsDoNotMatch": "Lozinke se ne poklapaju", + "@passwordsDoNotMatch": {}, + "accessAndVisibility": "Pristup i vidljivost", + "@accessAndVisibility": {}, + "calls": "Pozivi", + "@calls": {}, + "customEmojisAndStickers": "Prilagođeni emojiji i naljepnice", + "@customEmojisAndStickers": {}, + "customEmojisAndStickersBody": "Dodaj ili dijeli prilagođene emojije ili naljepnice koje se mogu koristiti u bilo kojem razgovoru.", + "@customEmojisAndStickersBody": {}, + "accessAndVisibilityDescription": "Tko se smije pridružiti ovom razgovoru i kako se razgovor može otkriti.", + "@accessAndVisibilityDescription": {}, + "stickers": "Naljepnice", + "@stickers": {}, + "discover": "Otkrij", + "@discover": {}, + "formattedMessagesDescription": "Prikaži formatirani sadržaj poruke poput podebljanog teksta koristeći markdown.", + "@formattedMessagesDescription": {}, + "nothingFound": "Ništa nije pronađeno...", + "@nothingFound": {}, + "select": "Odaberi", + "@select": {}, + "newPassword": "Nova lozinka", + "@newPassword": {}, + "unbanUserDescription": "Korisnik će se ponovo moći pridružiti razgovoru ako pokuša.", + "@unbanUserDescription": {}, + "publicSpaces": "Javni prostori", + "@publicSpaces": {}, + "subspace": "Podprostori", + "@subspace": {}, + "decline": "Odbij", + "@decline": {}, + "thisDevice": "Ovaj uređaj:", + "@thisDevice": {}, + "presenceStyle": "Prisutnost:", + "@presenceStyle": { + "type": "String", + "placeholders": {} + }, + "presencesToggle": "Prikaži poruke stanja od drugih korisnika", + "@presencesToggle": { + "type": "String", + "placeholders": {} + }, + "noPublicLinkHasBeenCreatedYet": "Još nije stvorena nijedna javna poveznica", + "@noPublicLinkHasBeenCreatedYet": {}, + "hidePresences": "Sakriti popis stanja?", + "@hidePresences": {}, + "pleaseEnterYourCurrentPassword": "Upiši svoju trenutačnu lozinku", + "@pleaseEnterYourCurrentPassword": {}, + "publicLink": "Javna poveznica", + "@publicLink": {}, + "passwordIsWrong": "Tvoja upisana lozinka je kriva", + "@passwordIsWrong": {}, + "initAppError": "Dogodila se greška prilikom inicijaliziranja aplikacije", + "@initAppError": {}, + "hideRedactedMessagesBody": "Ako netko redigira poruku, ta poruka više neće biti vidljiva u razgovoru.", + "@hideRedactedMessagesBody": {}, + "kickUserDescription": "Korisnik je izbačen iz razgovora, ali nije blokiran. U javnim razgovorima se korisnik može ponovo pridružiti u bilo kojem trenutku.", + "@kickUserDescription": {}, + "addChatOrSubSpace": "Dodaj razgovor ili podpodručje", + "@addChatOrSubSpace": {}, + "appLockDescription": "Zaključaj aplikaciju kada je ne koristiš s PIN kodom", + "@appLockDescription": {}, + "globalChatId": "Globalni ID razgovora", + "@globalChatId": {}, + "hideRedactedMessages": "Sakrij redigirane poruke", + "@hideRedactedMessages": {}, + "hideInvalidOrUnknownMessageFormats": "Sakrij nevažeće ili nepoznate formate poruka", + "@hideInvalidOrUnknownMessageFormats": {}, + "overview": "Pregled", + "@overview": {}, + "notifyMeFor": "Obavijesit me za", + "@notifyMeFor": {}, + "passwordRecoverySettings": "Postavke za obnavljanje lozinke", + "@passwordRecoverySettings": {}, + "hideMemberChangesInPublicChats": "Sakrij promjene članova u javnim razgovorima", + "@hideMemberChangesInPublicChats": {}, + "youInvitedToBy": "📩 Pozvan/a si putem poveznice na:\n{alias}", + "@youInvitedToBy": { + "placeholders": { + "alias": { + "type": "String" + } + } + }, + "usersMustKnock": "Korisnici moraju pokucati", + "@usersMustKnock": {}, + "noOneCanJoin": "Nitko se ne može pridružiti", + "@noOneCanJoin": {}, + "userWouldLikeToChangeTheChat": "{user} se želi pridružiti razgovoru.", + "@userWouldLikeToChangeTheChat": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "knock": "Pokucaj", + "@knock": {}, + "knocking": "Kucanje", + "@knocking": {}, + "chatCanBeDiscoveredViaSearchOnServer": "Razgovor se može otkriti pretraživanjem servera {server}", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "searchForUsers": "Traži @users...", + "@searchForUsers": {}, + "pleaseChooseAStrongPassword": "Odaberi snažnu lozinku", + "@pleaseChooseAStrongPassword": {}, + "joinSpace": "Pridruži se prostoru", + "@joinSpace": {}, + "publicChatAddresses": "Adrese javnih razgovora", + "@publicChatAddresses": {}, + "createNewAddress": "Stvori novu adresu", + "@createNewAddress": {}, + "userRole": "Korisnička uloga", + "@userRole": {}, + "verifyOtherUser": "🔐 Potvrdi drugog korisnika", + "@verifyOtherUser": {}, + "sendTypingNotificationsDescription": "Drugi sudionici u razgovoru mogu vidjeti kada pišeš novu poruku.", + "@sendTypingNotificationsDescription": {}, + "sendReadReceiptsDescription": "Drugi sudionici u raygovoru mogu vidjeti kada pročitaš poruku.", + "@sendReadReceiptsDescription": {}, + "searchIn": "Traži u razgovoru „{chat}”...", + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "searchMore": "Traži više...", + "@searchMore": {}, + "gallery": "Galerija", + "@gallery": {}, + "files": "Datoteke", + "@files": {}, + "verifyOtherDevice": "🔐 Potvrdi drugi uređaj", + "@verifyOtherDevice": {}, + "unreadChatsInApp": "{appname}: Nroj nepročitanih razgovora: {unread}", + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "commandHint_ignore": "Zanemari navedeni matrix ID", + "@commandHint_ignore": {}, + "blockListDescription": "Možeš blokirati korisnike koji te ometaju. Nećeš moći primati poruke ili pozivnice za sobe od korisnika koji se nalaze u tvom osobnom popisu blokiranih.", + "@blockListDescription": {}, + "isReadyForKeyVerification": "{sender} je spreman/na za potvrđivanje ključa", + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "banUserDescription": "Korisnik će biti isključen iz razgovora i moći će ponovo prisustvovati razgovoru kad ga se deblokira.", + "@banUserDescription": {}, + "sessionLostBody": "Tvoja je sesija izgubljena. Prijavi ovu grešku programerima na {url}. Poruka o grešci glasi: {error}", + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "completedKeyVerification": "{sender} je dovršio/la potvrđivanje ključa", + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "archiveRoomDescription": "Razgovor će se premjestiti u arhivu. Drugi korisnici će moći vidjeti da si napustio/la razgovor.", + "@archiveRoomDescription": {}, + "removeDevicesDescription": "Bit ćeš odjavljen/a s ovog uređaja i više nećeš moći primati poruke.", + "@removeDevicesDescription": {}, + "noUsersFoundWithQuery": "Nažalost nije pronađen nijedan korisnik s „{query}”. Provjeri točnost upisa.", + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "restoreSessionBody": "Aplikacija sada pokušava obnoviti tvoju sesiju iz sigurnosne kopije. Prijavi ovu grešku programerima na {url}. Poruka o grešci glasi: {error}", + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "requestedKeyVerification": "{sender} je zatražio/la potvrđivanje ključa", + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "restricted": "Ograničeni", + "@restricted": {}, + "roomUpgradeDescription": "Razgovor će se tada ponovo stvoriti s novom verzijom sobe. Svi sudionici će biti obaviješteni da se moraju prebaciti na novi razgovor. Više o verzijama soba možeš saznati na https://spec.matrix.org/latest/rooms/", + "@roomUpgradeDescription": {}, + "noGoogleServicesWarning": "Čini se da Firebase Cloud Messaging nije dostupan na tvom uređaju. Za daljnje primanje push obavijesti, preporučujemo da instaliraš ntfy. S ntfy ili drugim pružateljem usluge Unified Push možeš primati push obavijesti na podatkovno siguran način. Ntfy možeš preuzeti s PlayStorea ili s F-Droida.", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "verifyOtherDeviceDescription": "Kada potvrdiš jedan drugi uređaj, ti uređaji mogu razmjenjivati ključeve, povećavajući tvoju ukupnu sigurnost. 💪 Kada pokreneš provjeru, pojavit će se skočni prozor u aplikaciji na oba uređaja. Tamo ćeš tada vidjeti niz emojija ili brojeve koje moraš međusobno usporediti. Najbolje je imati oba uređaja pri ruci prije nego što započneš provjeru. 🤳", + "@verifyOtherDeviceDescription": {}, + "verifyOtherUserDescription": "Ako potvrdiš jednog drugog korisnika, možeš biti siguran/na da znaš kome zapravo pišeš. 💪\n\nKada pokreneš provjeru, vi i drugi korisnik vidjet ćete skočni prozor u aplikaciji. Tamo ćeš tada vidjeti niz emojija ili brojeve koje morate međusobno usporediti.\n\nNajbolji način za to je da se nađete zajedno ili započnete videopoziv. 👭", + "@verifyOtherUserDescription": {}, + "knockRestricted": "Pokucaj na ograničene sobe", + "@knockRestricted": {}, + "hideMemberChangesInPublicChatsBody": "Za bolju čitljivosti, na vremenskoj traci razgovora nemoj prikazivati kad se netko pridruži ili napusti javni razgovor.", + "@hideMemberChangesInPublicChatsBody": {}, + "makeAdminDescription": "Nakon postavljanja ovog korisnika kao administratora, to možda nećeš moći poništiti jer će on tada imati iste dozvole kao i ti.", + "@makeAdminDescription": {}, + "leaveEmptyToClearStatus": "Ostavi prazno za brisanje tvog stanja.", + "@leaveEmptyToClearStatus": {}, + "forwardMessageTo": "Proslijediti poruku u sobu {roomName}?", + "@forwardMessageTo": { + "type": "String", + "placeholders": { + "roomName": { + "type": "String" + } + } + }, + "minimumPowerLevel": "{level} je najmanja razina prava.", + "@minimumPowerLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "String" + } + } + }, + "databaseBuildErrorBody": "Nije moguće izgraditi SQlite bazu podataka. Aplikacija za sada pokušava koristiti staru bazu podataka. Prijavi ovu grešku programerima na {url}. Poruka o grešci glasi: {error}", + "@databaseBuildErrorBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "sendReadReceipts": "Šalji potvrde o čitanju", + "@sendReadReceipts": {}, + "acceptedKeyVerification": "{sender} je prihvatio/la potvrđivanje ključa", + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "canceledKeyVerification": "{sender} je prekinuo/la potvrđivanje ključa", + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "startedKeyVerification": "{sender} je pokrenuo/la potvrđivanje ključa", + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "commandHint_unignore": "Poništi zanemarivanje navedenog matrix ID-a", + "@commandHint_unignore": {}, + "noDatabaseEncryption": "Šifriranje baze podataka nije podržano na ovoj platformi", + "@noDatabaseEncryption": {}, + "thereAreCountUsersBlocked": "Broj trenutačno blokiranih korisnika: {count}.", + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "swipeRightToLeftToReply": "Za odgovaranje povuci prstom zdesna ulijevo", + "@swipeRightToLeftToReply": {}, + "alwaysUse24HourFormat": "true", + "@alwaysUse24HourFormat": { + "description": "Set to true to always display time of day in 24 hour format." + }, + "prepareSendingAttachment": "Pripremi slanje priloga …", + "@prepareSendingAttachment": {}, + "sendingAttachment": "Slanje priloga …", + "@sendingAttachment": {}, + "sendingAttachmentCountOfCount": "Slanje priloga {index} od {length} …", + "@sendingAttachmentCountOfCount": { + "type": "integer", + "placeholders": { + "index": { + "type": "int" + }, + "length": { + "type": "int" + } + } + } +} diff --git a/assets/l10n/intl_hu.arb b/assets/l10n/intl_hu.arb new file mode 100644 index 0000000..81246e2 --- /dev/null +++ b/assets/l10n/intl_hu.arb @@ -0,0 +1,3089 @@ +{ + "@@locale": "hu", + "@@last_modified": "2021-08-14 12:41:10.016566", + "about": "Névjegy", + "@about": { + "type": "String", + "placeholders": {} + }, + "accept": "Elfogadás", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 {username} elfogadta a meghívást", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "Fiók", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐 {username} aktiválta a végpontok közötti titkosítást", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "admin": "Admin", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "álnév", + "@alias": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "{senderName} felvette a hívást", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "Bárki csatlakozhat", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "archive": "Archívum", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "Csatlakozhatnak-e vendégek", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "Biztos benne?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "A másik fél igazolásához meg kell adni a biztonságos tároló jelmondatát vagy a visszaállítási kulcsot.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "Elfogadja {username} hitelesítési kérelmét?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "banFromChat": "Kitiltás csevegésből", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "Kitiltva", + "@banned": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username} kitiltotta: {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "Eszköz blokkolása", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "cancel": "Mégse", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "changeDeviceName": "Eszköznév módosítása", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "{username} módosította a csevegési profilképét", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatDescriptionTo": "{username} módosította a csevegés leírását erre: '{description}'", + "@changedTheChatDescriptionTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "description": { + "type": "String" + } + } + }, + "changedTheChatNameTo": "{username} módosította a csevegés nevét erre: '{chatname}'", + "@changedTheChatNameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "chatname": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username} módosította a csevegési engedélyeket", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username} módosította a megjelenített nevét erre: '{displayname}'", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} módosította a vendégek hozzáférési szabályokat", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} módosította a vendégek hozzáférési szabályait erre: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username} módosította az előzmények láthatóságát", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username} módosította az előzmények láthatóságát erre: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username} módosított a csatlakozási szabályokat", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} módosította a csatlakozási szabályokat erre: {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} módosította a profilképét", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "{username} módosította a szoba álneveit", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username} módosította a meghívó hivatkozást", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changePassword": "Jelszó módosítása", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "Matrix-kiszolgáló váltás", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "Stílus módosítása", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "Csoport nevének módosítása", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "A titkosítás megsérült", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "chat": "Csevegés", + "@chat": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Csevegés részletei", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "Válasszon egy erős jelszót", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "close": "Bezárás", + "@close": { + "type": "String", + "placeholders": {} + }, + "compareEmojiMatch": "Hasonlítsa össze az emojikat", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "Kérem hasonlítsa össze a számokat", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "confirm": "Megerősítés", + "@confirm": { + "type": "String", + "placeholders": {} + }, + "connect": "Csatlakozás", + "@connect": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "Meghívta ismerősét a csoportba", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "Vágólapra másolva", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "Másolás", + "@copy": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "Nem sikerült visszafejteni az üzenetet: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "countParticipants": "{count} résztvevő", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "create": "Létrehozás", + "@create": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "💬 {username} csevegést hozott létre", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "currentlyActive": "Jelenleg aktív", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "Sötét", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "dateWithoutYear": "{month}. {day}.", + "@dateWithoutYear": { + "type": "String", + "placeholders": { + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "dateWithYear": "{year}. {month}. {day}.", + "@dateWithYear": { + "type": "String", + "placeholders": { + "year": { + "type": "String" + }, + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "deactivateAccountWarning": "Ez deaktiválja a felhasználói fiókját. Ez nem vonható vissza! Biztos benne?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "delete": "Törlés", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "Fiók törlése", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "Üzenet törlése", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "device": "Eszköz", + "@device": { + "type": "String", + "placeholders": {} + }, + "devices": "Eszközök", + "@devices": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "Megjelenítési név megváltozott", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "Fájl letöltése", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "editDisplayname": "Megjelenítési név szerkesztése", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "A hangulatjel már létezik!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "Érvénytelen emoji rövidkód!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emotePacks": "Emoji csomagok a szobához", + "@emotePacks": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "Emoji Beállítások", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "emoteShortcode": "Emoji rövidkód", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emoteWarnNeedToPick": "Az emojihoz egy képet és egy rövidkódot kell választani!", + "@emoteWarnNeedToPick": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "Üres csevegés", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "Emoji csomag engedélyezése globálisan", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "Többé nem fogja tudni kikapcsolni a titkosítást. Biztos benne?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "encryption": "Titkosítás", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "Titkosítás nincs engedélyezve", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName} befejezte a hívást", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "enterYourHomeserver": "Adja meg a Matrix-kiszolgálót", + "@enterYourHomeserver": { + "type": "String", + "placeholders": {} + }, + "fileName": "Fájlnév", + "@fileName": { + "type": "String", + "placeholders": {} + }, + "fluffychat": "FluffyChat", + "@fluffychat": { + "type": "String", + "placeholders": {} + }, + "forward": "Továbbítás", + "@forward": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "Csatlakozás óta", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "Meghívás óta", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "group": "Csoport", + "@group": { + "type": "String", + "placeholders": {} + }, + "groupIsPublic": "A csoport nyilvános", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "groupWith": "Csoport {displayname}-al", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "guestsAreForbidden": "Nem lehetnek vendégek", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "Csatlakozhatnak vendégek", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{username} visszavonta {targetName} meghívását", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "help": "Súgó", + "@help": { + "type": "String", + "placeholders": {} + }, + "hideRedactedEvents": "Visszavont események elrejtése", + "@hideRedactedEvents": { + "type": "String", + "placeholders": {} + }, + "hideUnknownEvents": "Ismeretlen események elrejtése", + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "id": "ID", + "@id": { + "type": "String", + "placeholders": {} + }, + "identity": "Azonosító", + "@identity": { + "type": "String", + "placeholders": {} + }, + "ignoredUsers": "Figyelmen kívül hagyott felhasználók", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "Hibás jelmondat vagy visszaállítási kulcs", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "Ismerős meghívása", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "Ismerős meghívása a(z) {groupName} csoportba", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "invited": "Meghívott", + "@invited": { + "type": "String", + "placeholders": {} + }, + "invitedUser": "📩 {username} meghívta {targetName}-t", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "invitedUsersOnly": "Csak meghívott felhasználók", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "inviteText": "{username} meghívott a FluffyChat-be.\n1. Keresse fel a fluffychat.im oldalt, és telepítse az alkalmazást \n2. Regisztráljon vagy jelentkezzen be \n3. Nyissa meg a meghívó linket: \n {link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "isTyping": "gépel…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "👋 {username} csatlakozott a csevegéshez", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "joinRoom": "Csatlakozás a szobához", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "kicked": "👞 {username} kirúgta {targetName}-t", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickedAndBanned": "🙅 {username} kirúgta és kitiltotta {targetName}-t", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickFromChat": "Kirúgás a csevegésből", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "Utoljára aktív: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "leave": "Elhagyás", + "@leave": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "Elhagyta a csevegést", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "license": "Licensz", + "@license": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "Világos", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "További {count} résztvevő betöltése", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "loadingPleaseWait": "Betöltés… Kérem, várjon.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "loadMore": "Továbbiak betöltése…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "login": "Bejelentkezés", + "@login": { + "type": "String", + "placeholders": {} + }, + "logInTo": "Bejelentkezés a(z) {homeserver} Matrix-kiszolgálóra", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "logout": "Kijelentkezés", + "@logout": { + "type": "String", + "placeholders": {} + }, + "mention": "Megemlítés", + "@mention": { + "type": "String", + "placeholders": {} + }, + "moderator": "Moderátor", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "muteChat": "Csevegés némítása", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "needPantalaimonWarning": "Jelenleg a Pantalaimon szükséges a végpontok közötti titkosítás használatához.", + "@needPantalaimonWarning": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "💬 Új FluffyChat üzenet", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "Új hitelesítési kérelem!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "no": "Nem", + "@no": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "Emojik nem elérhetőek. 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "Úgy tűnik a Firebase Cloud Messaging nem elérhető a készülékén. Ha mégis push értesítéseket kíván kapni, javasoljuk a ntfy telepítését. A ntfy vagy más egyéb Egyesített Push szolgáltató esetében úgy kaphat értesítést, hogy adatai biztonságban maradnak. Letöltheti a ntfy-t a PLayStore-ból, vagy F-Droid-ról is.", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "none": "Nincs", + "@none": { + "type": "String", + "placeholders": {} + }, + "noPermission": "Nincs engedély", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "Nem találhatóak szobák…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "offline": "Offline", + "@offline": { + "type": "String", + "placeholders": {} + }, + "ok": "Rendben", + "@ok": { + "type": "String", + "placeholders": {} + }, + "online": "Online", + "@online": { + "type": "String", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "Online kulcsmentés engedélyezve", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "Hoppá, valami hiba lépett fel…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "Alkalmazás megnyitása az üzenetek elolvasásához", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "openCamera": "Kamera megnyitása", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "jelmondat vagy visszaállítási kulcs", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "password": "Jelszó", + "@password": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "A jelszó módosításra került", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "pickImage": "Kép választása", + "@pickImage": { + "type": "String", + "placeholders": {} + }, + "pin": "Rögzítés", + "@pin": { + "type": "String", + "placeholders": {} + }, + "play": "{fileName} lejátszása", + "@play": { + "type": "String", + "placeholders": { + "fileName": { + "type": "String" + } + } + }, + "pleaseEnterYourPassword": "Kérem adja meg jelszavát", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "Adja meg a felhasználónevét", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "privacy": "Adatvédelem", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "Nyilvános szobák", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "recording": "Felvétel", + "@recording": { + "type": "String", + "placeholders": {} + }, + "redactedAnEvent": "{username} visszavont egy eseményt", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "reject": "Elutasít", + "@reject": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "{username} elutasította a meghívást", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "rejoin": "Újra csatlakozás", + "@rejoin": { + "type": "String", + "placeholders": {} + }, + "remove": "Eltávolítás", + "@remove": { + "type": "String", + "placeholders": {} + }, + "removeAllOtherDevices": "Minden más eszköz eltávolítása", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "removedBy": "{username} által törölve", + "@removedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "removeDevice": "Eszköz eltávolítása", + "@removeDevice": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "Csevegés kitiltás feloldása", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "renderRichContent": "Formázott üzenetek megjelenítése", + "@renderRichContent": { + "type": "String", + "placeholders": {} + }, + "reply": "Válasz", + "@reply": { + "type": "String", + "placeholders": {} + }, + "requestPermission": "Jogosultság igénylése", + "@requestPermission": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "A szoba frissítve lett", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "seenByUser": "{username} látta", + "@seenByUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "send": "Küldés", + "@send": { + "type": "String", + "placeholders": {} + }, + "sendAMessage": "Üzenet küldése", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "sendAudio": "Hangüzenet küldése", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendFile": "Fájl küldése", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendImage": "Kép küldése", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendOriginal": "Eredeti küldése", + "@sendOriginal": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "Videó küldése", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "sentAFile": "📁 {username} küldött egy fájlt", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAnAudio": "🎤 {username} hangüzenetet küldött", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAPicture": "🖼️ {username} képüzenetet küldött", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentASticker": "😊 {username} matricát küldött", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "🎥 {username} videót küldött", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentCallInformations": "{senderName} hívásinformációt küldött", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "setInvitationLink": "Meghívó hivatkozás beállítása", + "@setInvitationLink": { + "type": "String", + "placeholders": {} + }, + "setStatus": "Állapot beállítása", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "settings": "Beállítások", + "@settings": { + "type": "String", + "placeholders": {} + }, + "share": "Megosztás", + "@share": { + "type": "String", + "placeholders": {} + }, + "sharedTheLocation": "{username} megosztotta a pozícióját", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "skip": "Kihagyás", + "@skip": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "Forráskód", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "startedACall": "{senderName} hívást indított", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "statusExampleMessage": "Hogy érzi ma magát?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "submit": "Beküldés", + "@submit": { + "type": "String", + "placeholders": {} + }, + "systemTheme": "Rendszer", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "Nem egyeznek", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "Egyeznek", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "title": "FluffyChat", + "@title": { + "description": "Title for the application", + "type": "String", + "placeholders": {} + }, + "tryToSendAgain": "Újraküldés megpróbálása", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "unavailable": "Nem elérhető", + "@unavailable": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username} feloldotta {targetName} kitiltását", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "unblockDevice": "Eszköz blokkolásának megszüntetése", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "Ismeretlen eszköz", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "unknownEncryptionAlgorithm": "Ismeretlen titkosítási algoritmus", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unknownEvent": "Ismeretlen esemény: '{type}'", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "unmuteChat": "Csevegés némítás feloldása", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "unpin": "Rögzítés megszüntetése", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "unreadChats": "{unreadCount, plural, =1{1 olvasatlan csevegés} other{{unreadCount} olvasatlan csevegés}}", + "@unreadChats": { + "type": "String", + "placeholders": { + "unreadCount": { + "type": "int" + } + } + }, + "userAndOthersAreTyping": "{username} és {count} másik résztvevő gépel…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "userAndUserAreTyping": "{username} és {username2} gépel…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userIsTyping": "{username} gépel…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userLeftTheChat": "🚪 {username} elhagyta a csevegést", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "username": "Felhasználónév", + "@username": { + "type": "String", + "placeholders": {} + }, + "userSentUnknownEvent": "{username} {type} eseményt küldött", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "verify": "Hitelesít", + "@verify": { + "type": "String", + "placeholders": {} + }, + "verifyStart": "Hitelesítés megkezdése", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "Sikeres hitelesítés!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "verifyTitle": "Másik fiók hitelesítése", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "videoCall": "Videóhívás", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "Csevegési előzmény láthatósága", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "Minden résztvevő számára látható", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "Bárki számára látható", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "Hangüzenet", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "Várakozás a partnerre, hogy elfogadja a kérést…", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "Várakozás a partnerre, hogy elfogadja az emojit…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "Várakozás a partnerre, hogy elfogadja a számokat…", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "wallpaper": "Háttér:", + "@wallpaper": { + "type": "String", + "placeholders": {} + }, + "warning": "Figyelmeztetés!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "Ki csatlakozhat a csoporthoz", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "Írjon egy üzenetet…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "yes": "Igen", + "@yes": { + "type": "String", + "placeholders": {} + }, + "you": "Ön", + "@you": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "Immáron nem vesz részt ebben a csevegésben", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "Kitiltották ebből a csevegésből", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "Ezekkel a címekkel vissza tudja állítani a jelszavát.", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "weSentYouAnEmail": "Küldtünk Önnek egy emailt", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "passwordRecovery": "Jelszó visszaállítás", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "noPasswordRecoveryDescription": "Még nem adott meg semmilyen módot a jelszava visszaállítására.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "inviteForMe": "Meghívás nekem", + "@inviteForMe": { + "type": "String", + "placeholders": {} + }, + "iHaveClickedOnLink": "Rákattintottam a linkre", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "enterAnEmailAddress": "Adjon meg egy email címet", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "encrypted": "Titkosított", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "edit": "Szerkeszt", + "@edit": { + "type": "String", + "placeholders": {} + }, + "directChats": "Közvetlen csevegések", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "deviceId": "Eszköz ID", + "@deviceId": { + "type": "String", + "placeholders": {} + }, + "botMessages": "Bot üzenetek", + "@botMessages": { + "type": "String", + "placeholders": {} + }, + "repeatPassword": "Jelszó megismétlése", + "@repeatPassword": {}, + "addEmail": "E-mail-cím hozzáadása", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "all": "Összes", + "@all": { + "type": "String", + "placeholders": {} + }, + "allChats": "Összes csevegés", + "@allChats": { + "type": "String", + "placeholders": {} + }, + "autoplayImages": "Animált matricák és hangulatjelek automatikus lejátszása", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "sendOnEnter": "Küldés Enterrel", + "@sendOnEnter": {}, + "cantOpenUri": "Nem sikerült az URI megnyitása: {uri}", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "changeYourAvatar": "Profilkép módosítása", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "addToSpace": "Hozzáadás térhez", + "@addToSpace": {}, + "areYouSureYouWantToLogout": "Biztosan kijelentkezik?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "badServerLoginTypesException": "A kiszolgáló a következő bejelentkezéseket támogatja:\n{serverVersions}\nDe ez az alkalmazást csak ezeket támogatja:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "blocked": "Blokkolva", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "appLock": "Alkalmazás zár", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "commandHint_myroomnick": "Az ebben a szobában megjelenített neved megváltoztatása", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "commandHint_plain": "Formázatlan szöveg küldése", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_send": "Szöveg küldése", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "contentHasBeenReported": "A tartalom jelentve lett a szerver üzemeltetőinek", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "commandHint_myroomavatar": "Az ebben a szobában megjelenített profilképed megváltoztatása (mxc URI használatával)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "copyToClipboard": "Vágólapra másolás", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "editRoomAliases": "Szoba álnevek szerkesztése", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "Szoba profilképének szerkesztése", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "Titkosítás engedélyezése", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "extremeOffensive": "Rendkívül sértő", + "@extremeOffensive": { + "type": "String", + "placeholders": {} + }, + "fontSize": "Betűméret", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "everythingReady": "Minden kész!", + "@everythingReady": { + "type": "String", + "placeholders": {} + }, + "groups": "Csoportok", + "@groups": { + "type": "String", + "placeholders": {} + }, + "howOffensiveIsThisContent": "Mennyire sértő ez a tartalom?", + "@howOffensiveIsThisContent": { + "type": "String", + "placeholders": {} + }, + "inoffensive": "Nem sértő", + "@inoffensive": { + "type": "String", + "placeholders": {} + }, + "locationPermissionDeniedNotice": "A helymeghatározás nem engedélyezett az alkalmazás számára. Kérem engedélyezze, hogy meg tudja osztani helyzetét.", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "newChat": "Új csevegés", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "scanQrCode": "QR kód beolvasása", + "@scanQrCode": {}, + "notificationsEnabledForThisAccount": "Értesítések bekapcsolása ebben a fiókban", + "@notificationsEnabledForThisAccount": { + "type": "String", + "placeholders": {} + }, + "offensive": "Sértő", + "@offensive": { + "type": "String", + "placeholders": {} + }, + "oopsPushError": "Hoppá! Sajnos hiba lépett fel a push értesítések beállításakor.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "commandHint_create": "Egy üres csevegő csoport létrehozása\nA --no-encryption kapcsolóval titkosítatlan szoba hozható létre", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "commandHint_invite": "Adott felhasználó meghívása ebbe a szobába", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "locationDisabledNotice": "A helymeghatározás ki van kapcsolva. Kérem, kapcsolja be, hogy meg tudja osztani helyzetét.", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "homeserver": "Matrix szerver", + "@homeserver": {}, + "chatBackup": "Beszélgetések mentése", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "ignore": "Figyelmen kívül hagyás", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "next": "Következő", + "@next": { + "type": "String", + "placeholders": {} + }, + "yourChatBackupHasBeenSetUp": "A beszélgetések mentése be lett állítva.", + "@yourChatBackupHasBeenSetUp": {}, + "chatBackupDescription": "A régebbi beszélgetései egy biztonsági kulccsal vannak védve. Bizonyosodjon meg róla, hogy nem veszíti el.", + "@chatBackupDescription": { + "type": "String", + "placeholders": {} + }, + "containsDisplayName": "Tartalmazza a megjelenített nevet", + "@containsDisplayName": { + "type": "String", + "placeholders": {} + }, + "containsUserName": "Tartalmazza a felhasználónevet", + "@containsUserName": { + "type": "String", + "placeholders": {} + }, + "goToTheNewRoom": "Új szoba megnyitása", + "@goToTheNewRoom": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "Nem elérhető a szerver", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "Csak akkor kapcsolható be a titkosítás, ha a szoba nem nyilvánosan hozzáférhető.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "chatHasBeenAddedToThisSpace": "A beszélgetés hozzá lett adva ehhez a térhez", + "@chatHasBeenAddedToThisSpace": {}, + "chats": "Csevegések", + "@chats": { + "type": "String", + "placeholders": {} + }, + "clearArchive": "Archívum törlése", + "@clearArchive": {}, + "commandHint_ban": "Felhasználó kitiltása ebből a szobából", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_clearcache": "Gyorsítótár törlése", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_discardsession": "Munkamenet elvetése", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "commandHint_dm": "Közvetlen csevegés indítása\nA --no-encryption kapcsolóval titkosítatlan beszélgetést hozhat létre", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "commandHint_html": "HTML formázott üzenet küldése", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_join": "Csatlakozás a megadott szobához", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_kick": "A megadott felhasználó kirúgása a szobából", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_leave": "Szoba elhagyása", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandInvalid": "Érvénytelen parancs", + "@commandInvalid": { + "type": "String" + }, + "commandMissing": "{command} nem egy parancs.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "configureChat": "Csevegés konfigurálása", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "createNewSpace": "Új tér", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "Alapértelmezett hozzáférési szint új felhasználóknak", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "errorObtainingLocation": "Hiba a tartózkodási hely meghatározása közben: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "memberChanges": "Tagsági változások", + "@memberChanges": { + "type": "String", + "placeholders": {} + }, + "messages": "Üzenetek", + "@messages": { + "type": "String", + "placeholders": {} + }, + "noMatrixServer": "{server1} nem egy Matrix szerver, használja a {server2} szervert inkább?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "notifications": "Értesítések", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "numUsersTyping": "{count} felhasználó gépel…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "obtainingLocation": "Tartózkodási hely lekérése…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "openVideoCamera": "Kamera megnyitása videóhoz", + "@openVideoCamera": { + "type": "String", + "placeholders": {} + }, + "badServerVersionsException": "A Matrix szerver ezeket a specifikáció verziókat támogatja:\n{serverVersions}\nAzonban ez az app csak ezeket: {supportedVersions}", + "@badServerVersionsException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "commandHint_me": "Jellemezd magad", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "commandHint_op": "Az adott felhasználó hozzáférési szintjének megadása (alapértelmezett: 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_react": "Válasz küldése reakcióként", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "commandHint_unban": "Adott felhasználó kitiltásának feloldása a szobához", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "editBlockedServers": "Blokkolt szerverek szerkesztése", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "dehydrate": "Munkamenet exportálása és az eszköz törlése", + "@dehydrate": {}, + "dehydrateWarning": "Ez nem visszavonható. Bizonyosodjon meg róla, hogy biztonságos helyen tárolja a mentett fájlt.", + "@dehydrateWarning": {}, + "dehydrateTor": "TOR felhasználók: munkamenet exportálása", + "@dehydrateTor": {}, + "dehydrateTorLong": "TOR felhasználóknak ajánlott a munkamenet exportálása az ablak bezárása előtt.", + "@dehydrateTorLong": {}, + "hydrateTor": "TOR felhasználóknak: munkamenet export importálása", + "@hydrateTor": {}, + "hydrate": "Visszaállítás mentett fájlból", + "@hydrate": {}, + "link": "Hivatkozás", + "@link": {}, + "redactMessage": "Üzenet visszavonása", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "people": "Emberek", + "@people": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPin": "Írja be PIN kódját", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "cuddleContent": "{senderName} hozzád bújik", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "commandHint_markasgroup": "Csoportnak jelölés", + "@commandHint_markasgroup": {}, + "addAccount": "Fiók hozzáadása", + "@addAccount": {}, + "search": "Keresés", + "@search": { + "type": "String", + "placeholders": {} + }, + "commandHint_googly": "Gülüszemek küldése", + "@commandHint_googly": {}, + "commandHint_cuddle": "Összebújás küldése", + "@commandHint_cuddle": {}, + "sendMessages": "Üzenetek küldése", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "sendSticker": "Matrica küldése", + "@sendSticker": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "Üzenet jelentése", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "participant": "Résztvevő", + "@participant": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "Elfelejtett jelszó", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "Szoba verzió", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "confirmMatrixId": "A fiók törléséhez adja meg a Matrix ID-t.", + "@confirmMatrixId": {}, + "or": "Vagy", + "@or": { + "type": "String", + "placeholders": {} + }, + "pleaseChoose": "Kérjük válasszon", + "@pleaseChoose": { + "type": "String", + "placeholders": {} + }, + "commandHint_hug": "Ölelés küldése", + "@commandHint_hug": {}, + "reason": "Indok", + "@reason": { + "type": "String", + "placeholders": {} + }, + "register": "Regisztráció", + "@register": { + "type": "String", + "placeholders": {} + }, + "saveFile": "Fájl mentése", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "googlyEyesContent": "{senderName} gülüszemeket küld", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "openInMaps": "Megnyitás térképen", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "pleaseEnter4Digits": "Írjon be 4 számjegyet, vagy hagyja üresen a zár kikapcsolásához.", + "@pleaseEnter4Digits": { + "type": "String", + "placeholders": {} + }, + "security": "Biztonság", + "@security": { + "type": "String", + "placeholders": {} + }, + "notAnImage": "Nem kép fájl.", + "@notAnImage": {}, + "showPassword": "Jelszó mutatása", + "@showPassword": { + "type": "String", + "placeholders": {} + }, + "hugContent": "{senderName} megölelt", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "jumpToLastReadMessage": "Az utoljára olvasott üzenethez ugrás", + "@jumpToLastReadMessage": {}, + "allRooms": "Minden csoport csevegés", + "@allRooms": { + "type": "String", + "placeholders": {} + }, + "widgetVideo": "Videó", + "@widgetVideo": {}, + "dismiss": "Elvetés", + "@dismiss": {}, + "reportErrorDescription": "😭 Sajnos valami félresiklott. Ha kívánja jelezheti a bugot a fejlesztőknek.", + "@reportErrorDescription": {}, + "setPermissionsLevel": "Jogok beállítása", + "@setPermissionsLevel": { + "type": "String", + "placeholders": {} + }, + "removeYourAvatar": "Profilkép törlése", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "unsupportedAndroidVersion": "Nem támogatott Android verzió", + "@unsupportedAndroidVersion": {}, + "widgetJitsi": "Jitsi Találkozó", + "@widgetJitsi": {}, + "messageType": "Üzenet típus", + "@messageType": {}, + "indexedDbErrorLong": "Sajnos az üzenet mentés alapból nincs bekapcsolva privát módban.\nKeresse meg a\n - about:config\n - állítsa a dom.indexedDB.privateBrowsing.enabled \"true\"-ra\nMáskülönben nem lehetséges a FluffyChat futtatása.", + "@indexedDbErrorLong": {}, + "oneClientLoggedOut": "Az egyik kliense kijelentkezett", + "@oneClientLoggedOut": {}, + "toggleMuted": "Némítottak mutatása", + "@toggleMuted": { + "type": "String", + "placeholders": {} + }, + "startFirstChat": "Kezdje meg első csevegését", + "@startFirstChat": {}, + "callingAccount": "Hívási fiók", + "@callingAccount": {}, + "setColorTheme": "Szín téma beállítása:", + "@setColorTheme": {}, + "nextAccount": "Következő fiók", + "@nextAccount": {}, + "singlesignon": "Egyszeri bejelentkezés", + "@singlesignon": { + "type": "String", + "placeholders": {} + }, + "allSpaces": "Minden tér", + "@allSpaces": {}, + "supposedMxid": "{mxid}-nek kell lennie", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "user": "Felhasználó", + "@user": {}, + "youAcceptedTheInvitation": "👍 Elfogadta a meghívást", + "@youAcceptedTheInvitation": {}, + "youInvitedBy": "📩 Meghívást kapott {user}-tól", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "banUserDescription": "A felhasználó kitiltásra kerül a csevegésből, és nem fog tudni visszajönni egészen a kitiltás feloldásáig.", + "@banUserDescription": {}, + "widgetEtherpad": "Szöveges megjegyzés", + "@widgetEtherpad": {}, + "removeDevicesDescription": "Ki fog jelentkezni a készülékről, és többi nem fog tudni fogadni üzeneteket.", + "@removeDevicesDescription": {}, + "separateChatTypes": "Csoportok és közvetlen üzenetek elkülönítése", + "@separateChatTypes": { + "type": "String", + "placeholders": {} + }, + "tryAgain": "Próbálja újra", + "@tryAgain": {}, + "youKickedAndBanned": "🙅 Kirúgta és kitiltotta {user}-t", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "unbanUserDescription": "A felhasználó vissza tud jönni a csevegésbe ha akar.", + "@unbanUserDescription": {}, + "pleaseClickOnLink": "Kérem kattintson a linkre az emailben, és folytassa a műveletet.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "youRejectedTheInvitation": "Visszautasította a meghívást", + "@youRejectedTheInvitation": {}, + "otherCallingPermissions": "Mikrofon, kamera, és más egyéb FluffyChat engedélyek", + "@otherCallingPermissions": {}, + "messagesStyle": "Üzenetek:", + "@messagesStyle": {}, + "widgetUrlError": "Ez nem egy valós cím.", + "@widgetUrlError": {}, + "emailOrUsername": "Email vagy felhasználónév", + "@emailOrUsername": {}, + "newSpaceDescription": "A terek lehetővé teszik a csevegések konszolidációját, ezáltal létrehozva publikus vagy privát közösségeket.", + "@newSpaceDescription": {}, + "chatDescription": "Csevegés leírás", + "@chatDescription": {}, + "callingAccountDetails": "Engedélyezés a FluffyChat számára hogy használja a natív android hívás applikációt.", + "@callingAccountDetails": {}, + "pleaseFollowInstructionsOnWeb": "Kérem kövesse az instrukciókat az oldalon, és nyomjon a tovább gombra.", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "enterSpace": "Belépés a térre", + "@enterSpace": {}, + "encryptThisChat": "A csevegés titkosítása", + "@encryptThisChat": {}, + "previousAccount": "Előző fiók", + "@previousAccount": {}, + "reopenChat": "Csevegés újranyitása", + "@reopenChat": {}, + "pleaseEnterRecoveryKey": "Kérem adja meg a visszaállító kódját:", + "@pleaseEnterRecoveryKey": {}, + "toggleFavorite": "Kedvencek mutatása", + "@toggleFavorite": { + "type": "String", + "placeholders": {} + }, + "widgetNameError": "Kérem adjon meg egy megjeleníthető nevet.", + "@widgetNameError": {}, + "addToBundle": "Hozzáadás fiókcsoporthoz", + "@addToBundle": {}, + "spaceIsPublic": "A tér publikus", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "addWidget": "Widget hozzáadása", + "@addWidget": {}, + "countFiles": "{count} fájl", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "noKeyForThisMessage": "Akkor fordulhat elő, ha az üzenet az eszközre való bejelentkezés előtt került küldésre.\n\nAz is elképzelhető, hogy a küldő blokkolta az eszközét, vagy valami probléma lépett fel az internet kapcsolatban.\n\nMás helyen látja az üzenetet? Akkor át tudja másolni ide is! Menjen a Beállítások > Eszközök részbe, és győződjön meg róla, hogy az eszközei megerősítették egymást. Legközelebb amikor ezt a szobát megnyitja, és mind a két kliens az előtérben van, akkor szikronizálódni fognak.\n\nNem akarja elveszíteni a kulcsokat amikor kijelentkezik, vagy eszközt cserél? Győződjön meg róla, hogy bekapcsolta a chat mentést a beállításokban.", + "@noKeyForThisMessage": {}, + "shareLocation": "Pozíció megosztása", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "pushNotificationsNotAvailable": "Push értesítések nem elérhetőek", + "@pushNotificationsNotAvailable": {}, + "storeInAppleKeyChain": "Tárolás az Apple KeyChain-be", + "@storeInAppleKeyChain": {}, + "replaceRoomWithNewerVersion": "Szoba cserélése egy újabb verzióra", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "invalidServerName": "Hibás szerver név", + "@invalidServerName": {}, + "chatPermissions": "Csevegés engedélyek", + "@chatPermissions": {}, + "wipeChatBackup": "Le kívánja törölni a chat mentését, hogy létrehozhasson egy új visszaállítási kulcsot?", + "@wipeChatBackup": { + "type": "String", + "placeholders": {} + }, + "sender": "Küldő", + "@sender": {}, + "storeInAndroidKeystore": "Tárolás az Android KeyStore-ba", + "@storeInAndroidKeystore": {}, + "signInWithPassword": "Bejelentkezés jelszóval", + "@signInWithPassword": {}, + "makeAdminDescription": "Miután a felhasználóból admin lesz, nem fogja tudni visszavonni döntését, mivel azonos jogosultsági szinttel fognak rendelkezni.", + "@makeAdminDescription": {}, + "synchronizingPleaseWait": "Szinkronizálás...kérem várjon.", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "transferFromAnotherDevice": "Másik eszközről való átköltözés", + "@transferFromAnotherDevice": { + "type": "String", + "placeholders": {} + }, + "pushRules": "Push szabályok", + "@pushRules": { + "type": "String", + "placeholders": {} + }, + "saveKeyManuallyDescription": "A kulcs manuális mentése rendszer megosztás vagy vágólap másolás segítségével.", + "@saveKeyManuallyDescription": {}, + "editBundlesForAccount": "Fiókcsoportok szerkesztése ehhez a fiókhoz", + "@editBundlesForAccount": {}, + "whyIsThisMessageEncrypted": "Miért nem olvasható ez az üzenet?", + "@whyIsThisMessageEncrypted": {}, + "setChatDescription": "Csevegés leírás beállítása", + "@setChatDescription": {}, + "spaceName": "Tér neve", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "importFromZipFile": "Importálás zip fájlból", + "@importFromZipFile": {}, + "toggleUnread": "Jelölés olvasottként/olvasatlanként", + "@toggleUnread": { + "type": "String", + "placeholders": {} + }, + "noOtherDevicesFound": "Nem található más eszköz", + "@noOtherDevicesFound": {}, + "redactedBy": "{username} által szerkesztve", + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "videoCallsBetaWarning": "Kérem vegye figyelembe, hogy a videó hívások jelenleg béta fázisban vannak. Nem biztos, hogy megfelelően fognak működni, vagy egyáltalán elindulnak egyes platformokon.", + "@videoCallsBetaWarning": {}, + "signInWith": "Bejelentkezés a következővel: {provider}", + "@signInWith": { + "type": "String", + "placeholders": { + "provider": { + "type": "String" + } + } + }, + "fileIsTooBigForServer": "A szerver számára túl nagy a fájl a küldéshez.", + "@fileIsTooBigForServer": {}, + "verified": "Visszaigazolt", + "@verified": { + "type": "String", + "placeholders": {} + }, + "callingPermissions": "Hívási engedélyek", + "@callingPermissions": {}, + "readUpToHere": "Ezidáig elolvasva", + "@readUpToHere": {}, + "start": "Kezdés", + "@start": {}, + "unlockOldMessages": "Régi üzenetek feloldása", + "@unlockOldMessages": {}, + "numChats": "{number} csevegés", + "@numChats": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "optionalRedactReason": "(Tetszőleges) A szerkesztés oka...", + "@optionalRedactReason": {}, + "sendAsText": "Szövegként küldés", + "@sendAsText": { + "type": "String" + }, + "archiveRoomDescription": "A csevegés bekerül az archívumba. Más felhasználók látni fogják, hogy elhagyta a csevegést.", + "@archiveRoomDescription": {}, + "exportEmotePack": "Emojik exportálása zip-be", + "@exportEmotePack": {}, + "switchToAccount": "A {number} számú fiókra váltás", + "@switchToAccount": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "setAsCanonicalAlias": "Beállítás mint alapértelmezett álnév", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "Miért kívánja ezt bejelenteni?", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "experimentalVideoCalls": "Kísérleti videó hívások", + "@experimentalVideoCalls": {}, + "pleaseEnterRecoveryKeyDescription": "A régi üzenetei feloldásához adja meg a korábban generált visszaállítási jelszavát. A visszaállítási jelszó NEM UGYANAZ mint a jelszó.", + "@pleaseEnterRecoveryKeyDescription": {}, + "inviteContactToGroupQuestion": "Meg kívánja hívni {contact}-ot a \"{groupName}\" csevegő csoportba?", + "@inviteContactToGroupQuestion": {}, + "redactedByBecause": "{username} által szerkesztve, mivel: \"{reason}\"", + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "youHaveWithdrawnTheInvitationFor": "Visszavonta a meghívást {user}-tól", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "appearOnTopDetails": "Engedélyezi az app számára, hogy mindig legfelül jelenjen meg (nem szükséges, ha a FluffyChat hívó fiókként lett beállítva)", + "@appearOnTopDetails": {}, + "enterRoom": "Belépés a szobába", + "@enterRoom": {}, + "pleaseChooseAPasscode": "Kérem válasszon egy kódot", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "reportUser": "Felhasználó jelentése", + "@reportUser": {}, + "confirmEventUnpin": "Biztosan végleg le akarja venni a kitűzött eseményt?", + "@confirmEventUnpin": {}, + "youInvitedUser": "📩 Meghívta {user}-t", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "fileHasBeenSavedAt": "A fájl mentésre került a következő elérési úton {path}", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "redactMessageDescription": "A társalgásban összes résztvevője számára módosításra kerül az üzenet. Ez nem visszavonható.", + "@redactMessageDescription": {}, + "recoveryKey": "Visszaállító kulcs", + "@recoveryKey": {}, + "invalidInput": "Hibás bevitel!", + "@invalidInput": {}, + "yourPublicKey": "A publikus kulcsa", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "Túl sok egyidejű kérelem. Kérem próbálja meg később!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "doNotShowAgain": "Ne mutassa újra", + "@doNotShowAgain": {}, + "report": "bejelentés", + "@report": {}, + "status": "Státusz", + "@status": { + "type": "String", + "placeholders": {} + }, + "unverified": "Nem visszaigazolt", + "@unverified": {}, + "serverRequiresEmail": "Ehhez a szerverhez szükséges az email címének visszaigazolása.", + "@serverRequiresEmail": {}, + "hideUnimportantStateEvents": "Jelentéktelen esemény státuszok elrejtése", + "@hideUnimportantStateEvents": {}, + "screenSharingTitle": "képernyő megosztás", + "@screenSharingTitle": {}, + "widgetCustom": "Egyéni", + "@widgetCustom": {}, + "addToSpaceDescription": "Válassza ki melyik térhez kívánja hozzáadni a csevegést.", + "@addToSpaceDescription": {}, + "youBannedUser": "Letitotta {user}-t", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "addChatDescription": "Chat leírás hozzáadása...", + "@addChatDescription": {}, + "hasKnocked": "🚪 {user} bekopogott", + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "publish": "Közzététel", + "@publish": {}, + "openLinkInBrowser": "Hivatkozás megnyitása böngészőben", + "@openLinkInBrowser": {}, + "messageInfo": "Üzenet információ", + "@messageInfo": {}, + "disableEncryptionWarning": "Biztonsági okokból nem kapcsolható ki egy korábban bekapcsolt csevegés titkosítás.", + "@disableEncryptionWarning": {}, + "directChat": "Közvetlen csevegés", + "@directChat": {}, + "wrongPinEntered": "Hibás pinkód került beírásra. Próbálja újra {seconds} mp múlva...", + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "sendTypingNotifications": "Gépelési infó megjelenítése", + "@sendTypingNotifications": {}, + "inviteGroupChat": "📨 Meghívó a csoportba", + "@inviteGroupChat": {}, + "appearOnTop": "Mindig legfelül jelenik meg", + "@appearOnTop": {}, + "invitePrivateChat": "📨 Meghívó csevegéshez", + "@invitePrivateChat": {}, + "foregroundServiceRunning": "Ez az értesítés akkor jelenik meg ha az előtéri szolgáltatás fut.", + "@foregroundServiceRunning": {}, + "voiceCall": "Hang hívás", + "@voiceCall": {}, + "importEmojis": "Emojik importálása", + "@importEmojis": {}, + "wasDirectChatDisplayName": "Üres csevegés (korábban {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "noChatDescriptionYet": "Még nincs csevegő szoba leírás.", + "@noChatDescriptionYet": {}, + "removeFromBundle": "Eltávolítás a fiókcsoportból", + "@removeFromBundle": {}, + "whoCanPerformWhichAction": "Ki milyen műveletet végezhet", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "learnMore": "Tudjon meg többet", + "@learnMore": {}, + "users": "Felhasználók", + "@users": {}, + "openGallery": "Galéria megnyitása", + "@openGallery": {}, + "chatDescriptionHasBeenChanged": "Csevegés leírás megváltozott", + "@chatDescriptionHasBeenChanged": {}, + "newGroup": "Új csoport", + "@newGroup": {}, + "bundleName": "Fiókcsoport neve", + "@bundleName": {}, + "removeFromSpace": "Eltávolítás a térről", + "@removeFromSpace": {}, + "roomUpgradeDescription": "A csevegés újra elkészül az új verzióval. Minden résztvevő értesítést kap, hogy át kell állniuk az új csevegésre. További információkért a szoba verziókról látogasson el a https://spec.matrix.org/latest/rooms/ címre", + "@roomUpgradeDescription": {}, + "pleaseEnterANumber": "Adjon meg egy 0-nál nagyobb számot", + "@pleaseEnterANumber": {}, + "youKicked": "👞 Kirúgta {user}-t", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "profileNotFound": "A felhasználó nem található a szerveren. Lehetséges, hogy csatlakozási problémák adódtak, vagy nem létezik a felhasználó.", + "@profileNotFound": {}, + "jump": "Ugrás", + "@jump": {}, + "reactedWith": "{sender} a következőt reagálta: {reaction}", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "sorryThatsNotPossible": "Ez sajnos nem lehetséges", + "@sorryThatsNotPossible": {}, + "videoWithSize": "Videó ({size})", + "@videoWithSize": { + "type": "String", + "placeholders": { + "size": { + "type": "String" + } + } + }, + "shareInviteLink": "Meghívó link megosztása", + "@shareInviteLink": {}, + "commandHint_markasdm": "Szoba megjelölése mint közvetlen csevegő szoba az adott Matrix ID-nél", + "@commandHint_markasdm": {}, + "recoveryKeyLost": "Elveszett visszaállító kulcs?", + "@recoveryKeyLost": {}, + "deviceKeys": "Eszköz kulcsok:", + "@deviceKeys": {}, + "emoteKeyboardNoRecents": "Nemrég használt emojik fognak itt megjelenni...", + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "setCustomEmotes": "Egyéni emojik beállítása", + "@setCustomEmotes": { + "type": "String", + "placeholders": {} + }, + "setTheme": "Téma beállítása:", + "@setTheme": {}, + "youJoinedTheChat": "Becsatlakozott a csevegésbe", + "@youJoinedTheChat": {}, + "markAsRead": "Olvasottként megjelölés", + "@markAsRead": {}, + "widgetName": "Név", + "@widgetName": {}, + "errorAddingWidget": "Hiba lépett fel a widget hozzáadásánál.", + "@errorAddingWidget": {}, + "replace": "Kicserél", + "@replace": {}, + "youUnbannedUser": "Levette a letiltást {user}-ről", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "newSpace": "Új tér", + "@newSpace": {}, + "emojis": "Emojik", + "@emojis": {}, + "pleaseTryAgainLaterOrChooseDifferentServer": "Próbálja meg máskor, vagy válasszon másik szervert.", + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "createGroup": "Csoport létrehozása", + "@createGroup": {}, + "hydrateTorLong": "Legutóbb TOR segítségével exportálta korábbi munkamenetét? Gyorsan importálja őket vissza, és folytassa a csevegést.", + "@hydrateTorLong": {}, + "time": "Idő", + "@time": {}, + "custom": "Egyéni", + "@custom": {}, + "noBackupWarning": "Figyelem! Ha nem kapcsolja be a csevegés mentést, elveszíti a hozzáférést a tikosított üzeneteihez. Erősen ajánlott a csevegés mentés bekapcsolása kijelentkezés előtt.", + "@noBackupWarning": {}, + "storeInSecureStorageDescription": "Tárolja a visszaállítási kulcsot az eszköz biztonsági tárjában.", + "@storeInSecureStorageDescription": {}, + "openChat": "Csevegés megnyitása", + "@openChat": {}, + "kickUserDescription": "A felhasználó kirúgásra került a csevegésből, de nincs kitiltva. Publikus csevegés esetén a felhasználó bármikor visszatérhet.", + "@kickUserDescription": {}, + "importNow": "Importálás most", + "@importNow": {}, + "pinMessage": "Kitűzés a szobában", + "@pinMessage": {}, + "invite": "Meghívás", + "@invite": {}, + "enableMultiAccounts": "(BÉTA) Több fiók bekapcsolása az eszközön", + "@enableMultiAccounts": {}, + "indexedDbErrorTitle": "Privát mód problémák", + "@indexedDbErrorTitle": {}, + "unsupportedAndroidVersionLong": "Ehhez a funkcióhoz egy újabb Android verzió kell. Kérem ellenőrizze be van e frissítve teljesen készüléke, esetlegesen van e LineageOS támogatás hozzá.", + "@unsupportedAndroidVersionLong": {}, + "storeSecurlyOnThisDevice": "Biztonságos tárolás az eszközön", + "@storeSecurlyOnThisDevice": {}, + "screenSharingDetail": "Megosztja a képernyőjét a FluffyChat-ben", + "@screenSharingDetail": {}, + "placeCall": "Tér hívás", + "@placeCall": {}, + "block": "Blokkolás", + "@block": {}, + "blockedUsers": "Blokkolt felhasználók", + "@blockedUsers": {}, + "blockListDescription": "Az Önt zavaró felhasználókat blokkolhatja. A blokkolt listán található felhasználóktól nem tud fogadni üzenetet vagy szoba meghívást.", + "@blockListDescription": {}, + "blockUsername": "Felhasználónév mellőzése", + "@blockUsername": {}, + "presenceStyle": "Jelenlét:", + "@presenceStyle": { + "type": "String", + "placeholders": {} + }, + "presencesToggle": "Mások státusz üzenetének megjelenítése", + "@presencesToggle": { + "type": "String", + "placeholders": {} + }, + "youInvitedToBy": "📩 Meghívást kapott linken keresztül a következőhöz:\n{alias}", + "@youInvitedToBy": { + "placeholders": { + "alias": { + "type": "String" + } + } + }, + "decline": "Elutasítás", + "@decline": {}, + "yourGlobalUserIdIs": "A globális felhasználó-ID-je: ", + "@yourGlobalUserIdIs": {}, + "noUsersFoundWithQuery": "\"{query}\" néven nem található felhasználó. Ellenőrizze nincs e elírás.", + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "acceptedKeyVerification": "{sender} elfogadta a kulcs megerősítést", + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "searchForUsers": "Keressen @felhasználókat...", + "@searchForUsers": {}, + "joinSpace": "Csatlakozás a térre", + "@joinSpace": {}, + "publicSpaces": "Nyilvános terek", + "@publicSpaces": {}, + "databaseMigrationTitle": "Adatbázis optimalizálása", + "@databaseMigrationTitle": {}, + "leaveEmptyToClearStatus": "Hagyja üresen a státusz kitörléséhez.", + "@leaveEmptyToClearStatus": {}, + "pleaseEnterYourCurrentPassword": "Kérem adja meg jelenlegi jelszavát", + "@pleaseEnterYourCurrentPassword": {}, + "newPassword": "Új jelszó", + "@newPassword": {}, + "addChatOrSubSpace": "Csevegés vagy al-tér hozzáadása", + "@addChatOrSubSpace": {}, + "pleaseChooseAStrongPassword": "Kérem válasszon egy erős jelszót", + "@pleaseChooseAStrongPassword": {}, + "passwordsDoNotMatch": "A jelszavak nem egyeznek", + "@passwordsDoNotMatch": {}, + "passwordIsWrong": "A beírt jelszava hibás", + "@passwordIsWrong": {}, + "subspace": "Al-tér", + "@subspace": {}, + "thisDevice": "Ez az eszköz:", + "@thisDevice": {}, + "forwardMessageTo": "Üzenet továbbítása a {roomName} szobába?", + "@forwardMessageTo": { + "type": "String", + "placeholders": { + "roomName": { + "type": "String" + } + } + }, + "sendTypingNotificationsDescription": "A csevegés többi tagja látja amikor gépel.", + "@sendTypingNotificationsDescription": {}, + "sendReadReceiptsDescription": "A csevegés többi tagja látja melyik üzenetet látta.", + "@sendReadReceiptsDescription": {}, + "sendReadReceipts": "Olvasási igazolás küldése", + "@sendReadReceipts": {}, + "formattedMessages": "Formázott üzenetek", + "@formattedMessages": {}, + "formattedMessagesDescription": "Formázott szöveg - mint például félkövér - megjelenítése \"markdown\"-al.", + "@formattedMessagesDescription": {}, + "verifyOtherUser": "🔐 Más felhasználók igazolása", + "@verifyOtherUser": {}, + "verifyOtherDevice": "🔐 Más eszköz megerősítése", + "@verifyOtherDevice": {}, + "sessionLostBody": "A munkamenete elvesződött. Kérem jelentse ezt a fejlesztőknek a {url} címen. A hiba szövege a következő: {error}", + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "databaseBuildErrorBody": "Nem lehetséges az SQlite adatbázis létrehozása. Az app megpróbálja a régi típusú adatbázist használni. Kérem jelentse a hibát a fejlesztőknek a {url} linken. A hiba szövege a következő: {error}", + "@databaseBuildErrorBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "restoreSessionBody": "Megpróbálkozunk visszaállítani a munkamenetét egy korábbi mentésből. Kérem jelezze a hibát a fejlesztőknek a {url} címen. A hiba szövege a következő: {error}", + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "hidePresences": "El kívánja menteni a státusz listát?", + "@hidePresences": {}, + "searchChatsRooms": "Keressen #csevegéseket, @felhasználókat...", + "@searchChatsRooms": {}, + "wrongRecoveryKey": "Sajnos, úgy tűnik hibásan adta meg a visszaállítási kulcsot.", + "@wrongRecoveryKey": {}, + "startConversation": "Beszélgetés indítása", + "@startConversation": {}, + "commandHint_sendraw": "Tiszta json küldése", + "@commandHint_sendraw": {}, + "databaseMigrationBody": "Kérem várjon. Ez igénybe vehet valamennyi időt.", + "@databaseMigrationBody": {}, + "initAppError": "Hiba lépett fel az app indítása során", + "@initAppError": {}, + "canceledKeyVerification": "{sender} nem fogadta el a kulcs megerősítést", + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "completedKeyVerification": "{sender} befejezte a kulcs megerősítést", + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "isReadyForKeyVerification": "{sender} készen áll a kulcs megerősítésre", + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "requestedKeyVerification": "{sender} kulcs megerősítést kér", + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "startedKeyVerification": "{sender} elkezdte a kulcs megerősítést", + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "transparent": "Átlátszó", + "@transparent": {}, + "incomingMessages": "Bejövő üzenetek", + "@incomingMessages": {}, + "nothingFound": "Nincs találat...", + "@nothingFound": {}, + "publicLink": "Nyilvános hivatkozás", + "@publicLink": {}, + "select": "Kiválaszt", + "@select": {}, + "stickers": "Matrica", + "@stickers": {}, + "discover": "Felfedezés", + "@discover": {}, + "groupName": "Csoport név", + "@groupName": {}, + "createGroupAndInviteUsers": "Hozzon létre egy csoportot és hívjon meg felhasználókat", + "@createGroupAndInviteUsers": {}, + "groupCanBeFoundViaSearch": "Kereséssel megtalálhatja a kívánt csoportot", + "@groupCanBeFoundViaSearch": {}, + "verifyOtherUserDescription": "Ha megerősít egy másik felhasználót, akkor teljesen biztos lehet abban kivel cseveg. 💪\n\nA megerősítési folyamat kezdetekor megjelenik egy felugró ablak mindkettejüknél. Ekkor egy emoji vagy szám sor összehasonlítási folyamat veszi kezdetét.\n\nA legpraktikusabb módja ennek, hogy találkozzanak, vagy videó hívás során beszéljék meg. 👭", + "@verifyOtherUserDescription": {}, + "verifyOtherDeviceDescription": "Amikor egy másik eszközt erősít meg, az eszközök kulcsokat cserélnek egymás között, ezáltal növelve az összbiztonságot. 💪 Amikor megkezdődik a folyamat, mind a két eszközön megjelenik egy felugró üzenet. Emojik és számok sorozata fog megjelenni, amit össze tud hasonlítani a két eszközön. Érdemes tehát mind a két eszközt a közelben tartani. 🤳", + "@verifyOtherDeviceDescription": {}, + "accessAndVisibility": "Hozzáférés és láthatóság", + "@accessAndVisibility": {}, + "accessAndVisibilityDescription": "Kinek engedélyezett a csevegéshez való csatlakozás és a csevegést hogyan lehet megtalálni.", + "@accessAndVisibilityDescription": {}, + "calls": "Hívások", + "@calls": {}, + "hideInvalidOrUnknownMessageFormats": "Érvénytelen vagy ismeretlen üzenetformátum elrejtése", + "@hideInvalidOrUnknownMessageFormats": {}, + "hideMemberChangesInPublicChatsBody": "Ne mutassa ha valaki be- vagy kilép a csevegésből az olvashatóság javítása végett.", + "@hideMemberChangesInPublicChatsBody": {}, + "notifyMeFor": "Értesítsen engem", + "@notifyMeFor": {}, + "passwordRecoverySettings": "Jelszó-helyreállítási beállítások", + "@passwordRecoverySettings": {}, + "noOneCanJoin": "Senki sem csatlakozhat", + "@noOneCanJoin": {}, + "userWouldLikeToChangeTheChat": "{user} szeretne csatlakozni a csevegéshez.", + "@userWouldLikeToChangeTheChat": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "noPublicLinkHasBeenCreatedYet": "Még nem lett létrehozva nyilvános link", + "@noPublicLinkHasBeenCreatedYet": {}, + "chatCanBeDiscoveredViaSearchOnServer": "Csevegés felfedezhető a {server} szerveren történő kereséssel", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "appLockDescription": "Alkalmazás zárolása PIN-kód használat hiányában", + "@appLockDescription": {}, + "customEmojisAndStickers": "Egyedi emotikonok és matricák", + "@customEmojisAndStickers": {}, + "customEmojisAndStickersBody": "Egyedi emotikonok és matricák létrehozása, amelyek bármely csevegésben használhatóak.", + "@customEmojisAndStickersBody": {}, + "overview": "Áttekintés", + "@overview": {}, + "publicChatAddresses": "Nyilvános csevegés címek", + "@publicChatAddresses": {}, + "userRole": "Felhasználói szerep", + "@userRole": {}, + "createNewAddress": "Új cím létrehozása", + "@createNewAddress": {}, + "noDatabaseEncryption": "Adatbázis titkosítása nem támogatott ezen a platformon", + "@noDatabaseEncryption": {}, + "thereAreCountUsersBlocked": "Jelenleg {count} felhasználó van letiltva.", + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "unreadChatsInApp": "{appname}: {unread} olvasatlan csevegések", + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "searchIn": "Keresés a csevegésben \"{chat}\"...", + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "files": "Fájlok", + "@files": {}, + "commandHint_unignore": "Adott matrix ID figyelembe vétele", + "@commandHint_unignore": {}, + "restricted": "Korlátozott", + "@restricted": {}, + "knockRestricted": "Kopogás korlátozva", + "@knockRestricted": {}, + "globalChatId": "Globális csevegő azonosító", + "@globalChatId": {}, + "hideRedactedMessages": "Szerkesztett üzenetek elrejtése", + "@hideRedactedMessages": {}, + "hideRedactedMessagesBody": "Ha valaki szerkeszti az üzenetét, ez az üzenet nem jelenik meg a csevegés során.", + "@hideRedactedMessagesBody": {}, + "hideMemberChangesInPublicChats": "Tag változások elrejtése a publikus csevegésben", + "@hideMemberChangesInPublicChats": {}, + "knocking": "Bekopogás", + "@knocking": {}, + "usersMustKnock": "A felhasználóknak be kell kopogniuk", + "@usersMustKnock": {}, + "knock": "Kopogás", + "@knock": {}, + "minimumPowerLevel": "{level} a minimum szint.", + "@minimumPowerLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "String" + } + } + }, + "searchMore": "További keresés...", + "@searchMore": {}, + "gallery": "Galéria", + "@gallery": {}, + "commandHint_ignore": "Adott matrix ID figyelmen kívül hagyása", + "@commandHint_ignore": {}, + "unread": "Olvasatlan", + "@unread": {}, + "space": "Tér", + "@space": {}, + "spaces": "Terek", + "@spaces": {}, + "invitedBy": "📩 Meghívva {user} által", + "@invitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "markAsUnread": "Olvasatlannak jelölés", + "@markAsUnread": {}, + "moderatorLevel": "{level} - Moderátor", + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "changeGeneralChatSettings": "Általános csevegés beállítások módosítása", + "@changeGeneralChatSettings": {}, + "updateInstalled": "🎉 {version} verziójú fejlesztés telepítve!", + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "changelog": "Változások", + "@changelog": {}, + "sendCanceled": "Visszavonás küldése", + "@sendCanceled": {}, + "noChatsFoundHere": "Itt még nincs csevegés. Kezdjen újat valakivel a lentebbi gombbal. ⤵️", + "@noChatsFoundHere": {}, + "goToSpace": "Menj a térre: {space}", + "@goToSpace": { + "type": "String", + "space": {} + }, + "changeTheCanonicalRoomAlias": "Csevegés fő, nyilvános címének változtatása", + "@changeTheCanonicalRoomAlias": {}, + "chatPermissionsDescription": "Adja meg milyen erősségi szint kell egyes csevegési akciókhoz. A 0, 50 és 100-as szintek általában felhasználókat, moderátorokat és rendszergazdákat jelölnek de bármilyen szintezés lehetséges.", + "@chatPermissionsDescription": {}, + "whatIsAHomeserver": "Mi az a Matrix-kiszolgáló?", + "@whatIsAHomeserver": {}, + "homeserverDescription": "Az összes adata a Mátrix-kiszolgálón tárolódik, pont mint egy e-mail kiszolgálón. Kiválaszthatja melyik Matrix-kiszolgálót akarja használni, miközben tud kommunikálni mindenkivel. Tudjon meg többet itt: https://matrix.org.", + "@homeserverDescription": {}, + "userLevel": "{level} - Felhasználó", + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "adminLevel": "{level} - Rendszergazda", + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "inviteOtherUsers": "Más felhasználók meghívása a csevegésbe", + "@inviteOtherUsers": {}, + "changeTheVisibilityOfChatHistory": "Csevegési előzmények láthatóságának változtatása", + "@changeTheVisibilityOfChatHistory": {}, + "changeTheChatPermissions": "Csevegés engedélyek változtatása", + "@changeTheChatPermissions": {}, + "sendRoomNotifications": "@room értesítés küldése", + "@sendRoomNotifications": {}, + "changeTheDescriptionOfTheGroup": "Csevegés leírásának változtatása", + "@changeTheDescriptionOfTheGroup": {}, + "swipeRightToLeftToReply": "Húzza balra a válaszoláshoz", + "@swipeRightToLeftToReply": {}, + "alwaysUse24HourFormat": "true", + "@alwaysUse24HourFormat": { + "description": "Set to true to always display time of day in 24 hour format." + }, + "loginWithMatrixId": "Jelentkezzen be Matrix-ID-vel", + "@loginWithMatrixId": {}, + "discoverHomeservers": "Matrix-kiszolgálók felfedezése", + "@discoverHomeservers": {}, + "doesNotSeemToBeAValidHomeserver": "Nem tűnik kompatibilisnak a Mátrix-kiszolgálóval. Helytelen URL?", + "@doesNotSeemToBeAValidHomeserver": {}, + "countChatsAndCountParticipants": "{chats} csevegések és {participants} résztvevők", + "@countChatsAndCountParticipants": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + }, + "participants": { + "type": "int" + } + } + }, + "noMoreChatsFound": "Nincs több csevegés...", + "@noMoreChatsFound": {}, + "joinedChats": "Csatlakozott csevegések", + "@joinedChats": {} +} diff --git a/assets/l10n/intl_ia.arb b/assets/l10n/intl_ia.arb new file mode 100644 index 0000000..ec6a01f --- /dev/null +++ b/assets/l10n/intl_ia.arb @@ -0,0 +1,60 @@ +{ + "repeatPassword": "Repeter le contrasigno", + "@repeatPassword": {}, + "notAnImage": "Non es un file de imagine.", + "@notAnImage": {}, + "remove": "Remover", + "@remove": { + "type": "String", + "placeholders": {} + }, + "importEmojis": "Importar emojis", + "@importEmojis": {}, + "importFromZipFile": "Importar ab un file .zip", + "@importFromZipFile": {}, + "importNow": "Importar ora", + "@importNow": {}, + "exportEmotePack": "Exportar pacchetto de emotes como un .zip", + "@exportEmotePack": {}, + "replace": "Reimplaciar", + "@replace": {}, + "about": "A proposito de", + "@about": { + "type": "String", + "placeholders": {} + }, + "accept": "Acceptar", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 {username} acceptava tu invitation", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "Conto", + "@account": { + "type": "String", + "placeholders": {} + }, + "addEmail": "Adder email", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "supposedMxid": "Isto deberea esser {mxid}", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "@custom": {} +} diff --git a/assets/l10n/intl_id.arb b/assets/l10n/intl_id.arb new file mode 100644 index 0000000..6e072cd --- /dev/null +++ b/assets/l10n/intl_id.arb @@ -0,0 +1,3348 @@ +{ + "@@last_modified": "2021-08-14 12:41:10.002360", + "setAsCanonicalAlias": "Atur sebagai alias utama", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "Versi ruangan", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "people": "Orang-orang", + "@people": { + "type": "String", + "placeholders": {} + }, + "goToTheNewRoom": "Pergi ke ruangan yang baru", + "@goToTheNewRoom": { + "type": "String", + "placeholders": {} + }, + "chats": "Obrolan", + "@chats": { + "type": "String", + "placeholders": {} + }, + "blockDevice": "Blokir Perangkat", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "areYouSureYouWantToLogout": "Apakah kamu yakin ingin keluar?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "Apakah kamu yakin?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "archive": "Arsip", + "@archive": { + "type": "String", + "placeholders": {} + }, + "anyoneCanJoin": "Siapa saja dapat bergabung", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "{senderName} menjawab panggilan", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "alias": "alias", + "@alias": { + "type": "String", + "placeholders": {} + }, + "admin": "Admin", + "@admin": { + "type": "String", + "placeholders": {} + }, + "account": "Akun", + "@account": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 {username} menerima undangannya", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "accept": "Terima", + "@accept": { + "type": "String", + "placeholders": {} + }, + "about": "Tentang", + "@about": { + "type": "String", + "placeholders": {} + }, + "isTyping": "sedang mengetik…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "inviteText": "{username} mengundang kamu ke FluffyChat. \n1. Kunjungi fluffychat.im dan instal aplikasi\n2. Daftar atau masuk \n3. Buka tautan undangan: \n {link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "inviteForMe": "Undangan untuk saya", + "@inviteForMe": { + "type": "String", + "placeholders": {} + }, + "invitedUsersOnly": "Pengguna yang diundang saja", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "invitedUser": "📩 {username} mengundang {targetName}", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "invited": "Diundang", + "@invited": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "Undang kontak ke {groupName}", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "inviteContact": "Undang kontak", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "Frasa sandi atau kunci pemulihan yang salah", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "iHaveClickedOnLink": "Saya sudah klik tautannya", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "ignoredUsers": "Pengguna yang diabaikan", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "identity": "Identitas", + "@identity": { + "type": "String", + "placeholders": {} + }, + "id": "ID", + "@id": { + "type": "String", + "placeholders": {} + }, + "hideUnknownEvents": "Sembunyikan peristiwa tidak dikenal", + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "hideRedactedEvents": "Sembunyikan peristiwa yang dihapus", + "@hideRedactedEvents": { + "type": "String", + "placeholders": {} + }, + "help": "Bantuan", + "@help": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{username} telah mencabut undangan untuk {targetName}", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "guestsCanJoin": "Tamu bisa bergabung", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "guestsAreForbidden": "Tamu dilarang", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "groupWith": "Grup dengan {displayname}", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "groupIsPublic": "Grup bersifat publik", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "group": "Grup", + "@group": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "Dari undangan", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "Dari bergabung", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "forward": "Teruskan", + "@forward": { + "type": "String", + "placeholders": {} + }, + "fluffychat": "FluffyChat", + "@fluffychat": { + "type": "String", + "placeholders": {} + }, + "fileName": "Nama file", + "@fileName": { + "type": "String", + "placeholders": {} + }, + "everythingReady": "Semua siap!", + "@everythingReady": { + "type": "String", + "placeholders": {} + }, + "enterYourHomeserver": "Masukkan homeserver-mu", + "@enterYourHomeserver": { + "type": "String", + "placeholders": {} + }, + "enterAnEmailAddress": "Masukkan alamat email", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName} mengakhiri panggilan", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "encryption": "Enkripsi", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "encrypted": "Terenkripsi", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "Kamu tidak akan bisa menonaktifkan enkripsi. Apakah kamu yakin?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "Aktifkan paket emote secara global", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "Chat kosong", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "emoteWarnNeedToPick": "Kamu harus memilih shortcode emote dan gambar!", + "@emoteWarnNeedToPick": { + "type": "String", + "placeholders": {} + }, + "emoteShortcode": "Shortcode emote", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "Pengaturan Emote", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "emotePacks": "Paket emote untuk ruangan", + "@emotePacks": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "Shortcode emote tidak valid!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "Emote sudah ada!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "editRoomAliases": "Edit alias ruangan", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "editDisplayname": "Edit nama tampilan", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "edit": "Sunting", + "@edit": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "Unduh berkas", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "Nama tampilan telah diubah", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "directChats": "Chat Langsung", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "devices": "Perangkat", + "@devices": { + "type": "String", + "placeholders": {} + }, + "deviceId": "ID Perangkat", + "@deviceId": { + "type": "String", + "placeholders": {} + }, + "device": "Perangkat", + "@device": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "Hapus pesan", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "Hapus akun", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "delete": "Hapus", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deactivateAccountWarning": "Ini akan menonaktifkan akun penggunamu. Ini tidak bisa dibatalkan! Apakah kamu yakin?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "dateWithYear": "{day}-{month}-{year}", + "@dateWithYear": { + "type": "String", + "placeholders": { + "year": { + "type": "String" + }, + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "dateWithoutYear": "{day}-{month}", + "@dateWithoutYear": { + "type": "String", + "placeholders": { + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "dateAndTimeOfDay": "{timeOfDay}, {date}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "currentlyActive": "Aktif", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "💬 {username} membuat obrolan ini", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "create": "Buat", + "@create": { + "type": "String", + "placeholders": {} + }, + "countParticipants": "{count} anggota", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "couldNotDecryptMessage": "Tidak dapat mendekripsikan pesan: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "copyToClipboard": "Salin ke papan klip", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "Salin", + "@copy": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "Disalin ke papan klip", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "chatBackup": "Cadangan obrolan", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "chat": "Obrolan", + "@chat": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "Enkripsi telah rusak", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "changeYourAvatar": "Ubah avatarmu", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "Ubah nama grup", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "Ubah homeserver", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changePassword": "Ubah kata sandi", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changedTheRoomInvitationLink": "{username} mengubah tautan undangan", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "{username} mengubah alias ruangan", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} mengubah avatarnya", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} mengubah aturan bergabung ke: {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username} mengubah aturan bergabung", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username} mengubah visibilitas sejarah ke: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username} mengubah visibilitas sejarah", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} mengubah aturan akses tamu ke: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} mengubah aturan akses tamu", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username} mengubah nama tampilan ke: '{displayname}'", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username} mengubah izin obrolan", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatNameTo": "{username} mengubah nama obrolan ke: '{chatname}'", + "@changedTheChatNameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "chatname": { + "type": "String" + } + } + }, + "changedTheChatDescriptionTo": "{username} mengubah deskripsi obrolan ke: '{description}'", + "@changedTheChatDescriptionTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "description": { + "type": "String" + } + } + }, + "changedTheChatAvatar": "{username} mengubah avatar obrolan", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changeDeviceName": "Ganti nama perangkat", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "cantOpenUri": "Tidak bisa membuka URI ini {uri}", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "cancel": "Batal", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "botMessages": "Pesan bot", + "@botMessages": { + "type": "String", + "placeholders": {} + }, + "blocked": "Diblokir", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username} mencekal {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "banned": "Dicekal", + "@banned": { + "type": "String", + "placeholders": {} + }, + "banFromChat": "Cekal dari obrolan", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "badServerVersionsException": "Homeserver ini mendukung versi Spec ini:\n{serverVersions}\nTetapi aplikasi ini hanya mendukung {supportedVersions}", + "@badServerVersionsException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "sendOnEnter": "Kirim dengan enter", + "@sendOnEnter": {}, + "badServerLoginTypesException": "Homeserver ini mendukung tipe masuk ini:\n{serverVersions}\nTetapi aplikasi ini mendukung:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "autoplayImages": "Mainkan stiker beranimasi dan emote secara otomatis", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "askVerificationRequest": "Terima permintaan verifikasi dari {username}?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "askSSSSSign": "Untuk dapat menandatangani orang lain, silakan masukkan frasa sandi atau kunci pemulihan penyimpanan aman kamu.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "Apakah pengguna tamu diizinkan untuk bergabung", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "appLock": "Kunci aplikasi", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "allChats": "Semua obrolan", + "@allChats": { + "type": "String", + "placeholders": {} + }, + "all": "Semua", + "@all": { + "type": "String", + "placeholders": {} + }, + "addToSpace": "Tambah ke space", + "@addToSpace": {}, + "addEmail": "Tambah email", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "Enkripsi tidak diaktifkan", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "containsUserName": "Berisi nama pengguna", + "@containsUserName": { + "type": "String", + "placeholders": {} + }, + "containsDisplayName": "Berisi nama tampilan", + "@containsDisplayName": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "Kontak telah diundang ke grup", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "connect": "Hubungkan", + "@connect": { + "type": "String", + "placeholders": {} + }, + "confirm": "Konfirmasi", + "@confirm": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "Bandingkan angka", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "compareEmojiMatch": "Bandingkan emoji", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "close": "Tutup", + "@close": { + "type": "String", + "placeholders": {} + }, + "clearArchive": "Bersihkan arsip", + "@clearArchive": {}, + "chooseAStrongPassword": "Pilih kata sandi yang kuat", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Detail obrolan", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chatBackupDescription": "Pesan lamamu diamankan dengan sebuah kunci pemulihan. Pastikan kamu tidak menghilangkannya.", + "@chatBackupDescription": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐 {username} mengaktifkan enkripsi ujung ke ujung", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "loadingPleaseWait": "Memuat… Mohon tunggu.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "Muat {count} anggota", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "license": "Lisensi", + "@license": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "Keluar dari obrolan", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "leave": "Tinggalkan", + "@leave": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "Terakhir aktif: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "kickFromChat": "Keluarkan dari obrolan", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "kickedAndBanned": "🙅 {username} mengeluarkan dan mencekal {targetName}", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kicked": "👞 {username} mengeluarkan {targetName}", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "joinRoom": "Bergabung dengan ruangan", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "👋 {username} telah bergabung dengan obrolan", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "loadMore": "Muat lebih banyak…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "noPermission": "Tidak ada izin", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noPasswordRecoveryDescription": "Kamu belum menambahkan cara untuk memulihkan kata sandimu.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "none": "Tidak Ada", + "@none": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "Perpesanan Awan Firebase sepertinya tidak tersedia di perangkatmu. Untuk dapat menerima notifikasi dorongan, kami menyarankan memasang ntfy. Dengan ntfy atau penyedia UnifiedPush lainnya, kamu bisa menerima notifikasi dorongan dengan cara yang aman. Kamu bisa mengunduh ntfy dari Play Store atau F-Droid.", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "Kamu hanya bisa mengaktifkan enkripsi setelah ruangan tidak lagi dapat diakses secara publik.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "Tidak ada emote yang ditemukan. 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "next": "Lanjut", + "@next": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "Permintaan verifikasi baru!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "💬 Pesan baru di FluffyChat", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "newChat": "Chat baru", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "needPantalaimonWarning": "Perlu diketahui bahwa kamu memerlukan Pantalaimon untuk menggunakan enkripsi ujung-ke-ujung untuk saat ini.", + "@needPantalaimonWarning": { + "type": "String", + "placeholders": {} + }, + "muteChat": "Bisukan obrolan", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "moderator": "Moderator", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "mention": "Sebutkan", + "@mention": { + "type": "String", + "placeholders": {} + }, + "memberChanges": "Perubahan anggota", + "@memberChanges": { + "type": "String", + "placeholders": {} + }, + "logout": "Keluar", + "@logout": { + "type": "String", + "placeholders": {} + }, + "logInTo": "Masuk ke {homeserver}", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "login": "Masuk", + "@login": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "Tidak ada ruangan yang ditemukan…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "verified": "Terverifikasi", + "@verified": { + "type": "String", + "placeholders": {} + }, + "userLeftTheChat": "🚪 {username} keluar dari obrolan", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "unavailable": "Tidak tersedia", + "@unavailable": { + "type": "String", + "placeholders": {} + }, + "transferFromAnotherDevice": "Transfer dari perangkat lain", + "@transferFromAnotherDevice": { + "type": "String", + "placeholders": {} + }, + "showPassword": "Tampilkan kata sandi", + "@showPassword": { + "type": "String", + "placeholders": {} + }, + "removeYourAvatar": "Hapus avatarmu", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "register": "Daftar", + "@register": { + "type": "String", + "placeholders": {} + }, + "pushRules": "Aturan push", + "@pushRules": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "Mohon ikuti petunjuk di situs web dan tekan lanjut.", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "pleaseChoose": "Mohon pilih", + "@pleaseChoose": { + "type": "String", + "placeholders": {} + }, + "oopsPushError": "Ups! Sayangnya, terjadi kesalahan saat mengatur pemberitahuan push.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "Cadangan Kunci Online dinyalakan", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "online": "Online", + "@online": { + "type": "String", + "placeholders": {} + }, + "ok": "Ok", + "@ok": { + "type": "String", + "placeholders": {} + }, + "offline": "Offline", + "@offline": { + "type": "String", + "placeholders": {} + }, + "notificationsEnabledForThisAccount": "Notifikasi diaktifkan untuk akun ini", + "@notificationsEnabledForThisAccount": { + "type": "String", + "placeholders": {} + }, + "notifications": "Notifikasi", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "yourPublicKey": "Kunci publikmu", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "Kamu telah dicekal dari obrolan ini", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "Kamu tidak berpartisipasi lagi di obrolan ini", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "you": "Kamu", + "@you": { + "type": "String", + "placeholders": {} + }, + "yes": "Ya", + "@yes": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "Tulis pesan…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "Dengan alamat ini kamu bisa memulihkan kata sandimu.", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "wipeChatBackup": "Hapus cadangan obrolan untuk membuat kunci pemulihan baru?", + "@wipeChatBackup": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "Kenapa kamu ingin melaporkannya?", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "Siapa yang dapat bergabung ke grup ini", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "whoCanPerformWhichAction": "Siapa yang dapat melakukan tindakan apa", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "weSentYouAnEmail": "Kami mengirim kamu sebuah email", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "warning": "Peringatan!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "wallpaper": "Latar belakang:", + "@wallpaper": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "Menunggu pengguna untuk menerima angka…", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "Menunggu pengguna untuk menerima emoji…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "Menunggu pengguna untuk menerima permintaan…", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "Pesan suara", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "Terlihat untuk semua orang", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "Terlihat untuk semua anggota", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "Visibilitas sejarah obrolan", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "videoCall": "Panggilan video", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "verifyTitle": "Memverifikasi akun lain", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "Kamu berhasil memverifikasi!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "verifyStart": "Mulai Verifikasi", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "verify": "Verifikasi", + "@verify": { + "type": "String", + "placeholders": {} + }, + "userSentUnknownEvent": "{username} mengirim peristiwa {type}", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "username": "Nama Pengguna", + "@username": { + "type": "String", + "placeholders": {} + }, + "userIsTyping": "{username} sedang mengetik…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userAndUserAreTyping": "{username} dan {username2} sedang mengetik…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userAndOthersAreTyping": "{username} dan {count} lainnya sedang mengetik…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "unreadChats": "{unreadCount, plural, =1{1 obrolan belum dibaca} other{{unreadCount} obrolan belum dibaca}}", + "@unreadChats": { + "type": "String", + "placeholders": { + "unreadCount": { + "type": "int" + } + } + }, + "unpin": "Lepaskan pin", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "unmuteChat": "Bunyikan obrolan", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "unknownEvent": "Peristiwa tidak dikenal '{type}'", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "unknownEncryptionAlgorithm": "Algoritma enkripsi tidak dikenal", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "Perangkat tidak dikenal", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "unblockDevice": "Hilangkan Pemblokiran Perangkat", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username} menghilangkan cekalan {targetName}", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "tryToSendAgain": "Coba kirim lagi", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "Terlalu banyak permintaan. Coba lagi nanti!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "toggleUnread": "Tandai Baca/Belum Dibaca", + "@toggleUnread": { + "type": "String", + "placeholders": {} + }, + "toggleMuted": "Beralih Bisuan", + "@toggleMuted": { + "type": "String", + "placeholders": {} + }, + "toggleFavorite": "Beralih Favorit", + "@toggleFavorite": { + "type": "String", + "placeholders": {} + }, + "title": "FluffyChat", + "@title": { + "description": "Title for the application", + "type": "String", + "placeholders": {} + }, + "theyMatch": "Cocok", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "Tidak Cocok", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "systemTheme": "Sistem", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWait": "Menyinkronkan... Mohon tunggu.", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "submit": "Kirim", + "@submit": { + "type": "String", + "placeholders": {} + }, + "statusExampleMessage": "Apa kabar hari ini?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "status": "Status", + "@status": { + "type": "String", + "placeholders": {} + }, + "startedACall": "{senderName} memulai panggilan", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "spaceName": "Nama space", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "spaceIsPublic": "Space publik", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "Kode sumber", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "skip": "Lewat", + "@skip": { + "type": "String", + "placeholders": {} + }, + "singlesignon": "Login Masuk Tunggal", + "@singlesignon": { + "type": "String", + "placeholders": {} + }, + "shareLocation": "Bagikan lokasi", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "sharedTheLocation": "{username} membagikan lokasinya", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "share": "Bagikan", + "@share": { + "type": "String", + "placeholders": {} + }, + "settings": "Pengaturan", + "@settings": { + "type": "String", + "placeholders": {} + }, + "setStatus": "Tetapkan status", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "setPermissionsLevel": "Tetapkan level izin", + "@setPermissionsLevel": { + "type": "String", + "placeholders": {} + }, + "setInvitationLink": "Tetapkan tautan undangan", + "@setInvitationLink": { + "type": "String", + "placeholders": {} + }, + "setCustomEmotes": "Tetapkan emote kustom", + "@setCustomEmotes": { + "type": "String", + "placeholders": {} + }, + "sentCallInformations": "{senderName} mengirim informasi panggilan", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "sentAVideo": "🎥 {username} mengirim video", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentASticker": "😊 {username} mengirim stiker", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAPicture": "🖼️ {username} mengirim gambar", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAnAudio": "🎤 {username} mengirim suara", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAFile": "📁 {username} mengirim file", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "seenByUser": "Dilihat oleh {username}", + "@seenByUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "security": "Keamanan", + "@security": { + "type": "String", + "placeholders": {} + }, + "search": "Cari", + "@search": { + "type": "String", + "placeholders": {} + }, + "requestPermission": "Minta izin", + "@requestPermission": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "Laporkan pesan", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "reply": "Balas", + "@reply": { + "type": "String", + "placeholders": {} + }, + "replaceRoomWithNewerVersion": "Menggantikan ruangan dengan versi baru", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "renderRichContent": "Render konten pesan kaya", + "@renderRichContent": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "Hilangkan cekalan dari obrolan", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "remove": "Hapus", + "@remove": { + "type": "String", + "placeholders": {} + }, + "rejoin": "Gabung kembali", + "@rejoin": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "{username} menolak undangannya", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "reject": "Tolak", + "@reject": { + "type": "String", + "placeholders": {} + }, + "redactMessage": "Hapus pesan", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "redactedAnEvent": "{username} menghapus sebuah peristiwa", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "pleaseEnterYourPassword": "Mohon masukkan kata sandimu", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseClickOnLink": "Mohon klik tautan di email dan lanjut.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "pleaseChooseAPasscode": "Mohon pilih kode sandi", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "play": "Mainkan {fileName}", + "@play": { + "type": "String", + "placeholders": { + "fileName": { + "type": "String" + } + } + }, + "pin": "Pin", + "@pin": { + "type": "String", + "placeholders": {} + }, + "passwordRecovery": "Pemulihan kata sandi", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "Kata sandi telah diubah", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "Lupa kata sandi", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "password": "Kata sandi", + "@password": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "frasa sandi atau kunci pemulihan", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "participant": "Peserta", + "@participant": { + "type": "String", + "placeholders": {} + }, + "or": "Atau", + "@or": { + "type": "String", + "placeholders": {} + }, + "serverRequiresEmail": "Server ini harus memvalidasi alamat email kamu untuk registrasi.", + "@serverRequiresEmail": {}, + "openInMaps": "Buka di peta", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "enableMultiAccounts": "(BETA) Aktifkan multi-akun di perangkat ini", + "@enableMultiAccounts": {}, + "bundleName": "Nama bundel", + "@bundleName": {}, + "removeFromBundle": "Hilangkan dari bundel ini", + "@removeFromBundle": {}, + "addToBundle": "Tambah ke bundel", + "@addToBundle": {}, + "editBundlesForAccount": "Edit bundel untuk akun ini", + "@editBundlesForAccount": {}, + "addAccount": "Tambah akun", + "@addAccount": {}, + "oneClientLoggedOut": "Salah satu klienmu telah keluar", + "@oneClientLoggedOut": {}, + "openCamera": "Buka kamera", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "Buka aplikasi untuk membaca pesan", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "Ups, ada yang salah…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "offensive": "Menyinggung", + "@offensive": { + "type": "String", + "placeholders": {} + }, + "obtainingLocation": "Mendapatkan lokasi…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "numUsersTyping": "{count} pengguna sedang mengetik…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "scanQrCode": "Pindai kode QR", + "@scanQrCode": {}, + "noMatrixServer": "{server1} itu bukan server Matrix, gunakan {server2} saja?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "no": "Tidak", + "@no": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "Tidak ada koneksi ke server", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "messages": "Pesan", + "@messages": { + "type": "String", + "placeholders": {} + }, + "locationDisabledNotice": "Layanan lokasi dinonaktifkan. Mohon diaktifkan untuk bisa membagikan lokasimu.", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "locationPermissionDeniedNotice": "Izin lokasi ditolak. Mohon memberikan izin untuk bisa membagikan lokasimu.", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "Terang", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "inoffensive": "Tidak menyinggung", + "@inoffensive": { + "type": "String", + "placeholders": {} + }, + "ignore": "Abaikan", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "howOffensiveIsThisContent": "Seberapa menyinggungnya konten ini?", + "@howOffensiveIsThisContent": { + "type": "String", + "placeholders": {} + }, + "groups": "Grup", + "@groups": { + "type": "String", + "placeholders": {} + }, + "fontSize": "Ukuran font", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "errorObtainingLocation": "Gagal mendapat lokasi: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "homeserver": "Homeserver", + "@homeserver": {}, + "enableEncryption": "Aktifkan enkripsi", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "Edit avatar ruangan", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "Edit server yang diblokir", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "Level izin bawaan untuk pengguna baru", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "Gelap", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "createNewSpace": "Space baru", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "Konten telah dilaporkan ke admin server", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "configureChat": "Konfigurasi obrolan", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "commandMissing": "{command} bukan sebuah perintah.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "commandInvalid": "Perintah tidak valid", + "@commandInvalid": { + "type": "String" + }, + "commandHint_unban": "Hilangkan cekalan untuk pengguna yang dicantumkan dari ruangan ini", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "commandHint_send": "Kirim teks", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "commandHint_react": "Kirim balasan sebagai reaksi", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "commandHint_plain": "Kirim teks yang tidak diformat", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_op": "Tetapkan tingkat kekuatan pengguna yang dicantum (default: 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_myroomnick": "Tetapkan nama tampilanmu untuk ruangan ini", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "commandHint_myroomavatar": "Tetapkan gambarmu untuk ruangan ini (oleh uri-mxc)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_me": "Jelaskan dirimu", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "commandHint_leave": "Tinggalkan ruangan ini", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_kick": "Keluarkan pengguna yang dicantum dari ruangan ini", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_join": "Gabung ke ruangan yang dicantum", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_invite": "Undang pengguna yang dicantum ke ruangan ini", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "commandHint_html": "Kirim teks yang diformat dengan HTML", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_ban": "Cekal pengguna yang dicantumkan dari ruangan ini", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "chatHasBeenAddedToThisSpace": "Obrolan telah ditambahkan ke space ini", + "@chatHasBeenAddedToThisSpace": {}, + "changeTheme": "Ubah tema", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "extremeOffensive": "Sangat menyinggung", + "@extremeOffensive": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "Kirim video", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "sendSticker": "Kirim stiker", + "@sendSticker": { + "type": "String", + "placeholders": {} + }, + "sendOriginal": "Kirim yang asli", + "@sendOriginal": { + "type": "String", + "placeholders": {} + }, + "sendMessages": "Kirim pesan", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "sendImage": "Kirim gambar", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendFile": "Kirim file", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendAudio": "Kirim suara", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendAsText": "Kirim sebagai teks", + "@sendAsText": { + "type": "String" + }, + "sendAMessage": "Kirim pesan", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "send": "Kirim", + "@send": { + "type": "String", + "placeholders": {} + }, + "saveFile": "Simpan file", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "Ruangan telah ditingkatkan", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "removeDevice": "Hapus perangkat", + "@removeDevice": { + "type": "String", + "placeholders": {} + }, + "removedBy": "Dihapus oleh {username}", + "@removedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "removeAllOtherDevices": "Hapus semua perangkat lain", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "recording": "Merekam", + "@recording": { + "type": "String", + "placeholders": {} + }, + "reason": "Alasan", + "@reason": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "Ruangan Publik", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "privacy": "Privasi", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "Mohon masukkan nama penggunamu", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "pleaseEnter4Digits": "Mohon masukkan 4 digit atau tinggalkan kosong untuk menonaktifkan kunci aplikasi.", + "@pleaseEnter4Digits": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPin": "Masukkan pin", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "pickImage": "Pilih gambar", + "@pickImage": { + "type": "String", + "placeholders": {} + }, + "link": "Tautan", + "@link": {}, + "yourChatBackupHasBeenSetUp": "Cadangan obrolanmu telah disiapkan.", + "@yourChatBackupHasBeenSetUp": {}, + "unverified": "Tidak terverifikasi", + "@unverified": {}, + "repeatPassword": "Ulangi kata sandi", + "@repeatPassword": {}, + "messageInfo": "Informasi pesan", + "@messageInfo": {}, + "time": "Waktu", + "@time": {}, + "messageType": "Tipe Pesan", + "@messageType": {}, + "sender": "Pengirim", + "@sender": {}, + "openGallery": "Buka galeri", + "@openGallery": {}, + "addToSpaceDescription": "Pilih sebuah space untuk menambahkan obrolan ke spacenya.", + "@addToSpaceDescription": {}, + "start": "Mulai", + "@start": {}, + "removeFromSpace": "Hilangkan dari space", + "@removeFromSpace": {}, + "commandHint_clearcache": "Bersihkan tembolok", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_discardsession": "Buang sesi", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "commandHint_dm": "Mulai sebuah obrolan langsung\nGunakan --no-encryption untuk menonaktifkan enkripsi", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "commandHint_create": "Buat sebuah grup obrolan kosong\nGunakan --no-encryption untuk menonaktifkan enkripsi", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "openVideoCamera": "Buka kamera untuk merekam video", + "@openVideoCamera": { + "type": "String", + "placeholders": {} + }, + "publish": "Publikasi", + "@publish": {}, + "videoWithSize": "Video ({size})", + "@videoWithSize": { + "type": "String", + "placeholders": { + "size": { + "type": "String" + } + } + }, + "dismiss": "Abaikan", + "@dismiss": {}, + "markAsRead": "Tandai sebagai dibaca", + "@markAsRead": {}, + "reportUser": "Laporkan pengguna", + "@reportUser": {}, + "openChat": "Buka Chat", + "@openChat": {}, + "reactedWith": "{sender} bereaksi dengan {reaction}", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "emojis": "Emoji", + "@emojis": {}, + "pinMessage": "Sematkan ke ruangan", + "@pinMessage": {}, + "confirmEventUnpin": "Apakah kamu yakin untuk melepaskan pin peristiwa ini secara permanen?", + "@confirmEventUnpin": {}, + "unsupportedAndroidVersionLong": "Fitur ini memerlukan versi Android yang baru. Mohon periksa untuk pembaruan atau dukungan LineageOS.", + "@unsupportedAndroidVersionLong": {}, + "unsupportedAndroidVersion": "Versi Android tidak didukung", + "@unsupportedAndroidVersion": {}, + "placeCall": "Lakukan panggilan", + "@placeCall": {}, + "voiceCall": "Panggilan suara", + "@voiceCall": {}, + "videoCallsBetaWarning": "Dicatat bahwa panggilan video sedang dalam beta. Fitur ini mungkin tidak berkerja dengan benar atau tidak berkerja sama sekali pada semua platform.", + "@videoCallsBetaWarning": {}, + "emailOrUsername": "Email atau nama pengguna", + "@emailOrUsername": {}, + "experimentalVideoCalls": "Panggilan video eksperimental", + "@experimentalVideoCalls": {}, + "previousAccount": "Akun sebelumnya", + "@previousAccount": {}, + "switchToAccount": "Ganti ke akun {number}", + "@switchToAccount": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "nextAccount": "Akun berikutnya", + "@nextAccount": {}, + "widgetEtherpad": "Catatan teks", + "@widgetEtherpad": {}, + "widgetJitsi": "Jitsi Meet", + "@widgetJitsi": {}, + "widgetCustom": "Kustom", + "@widgetCustom": {}, + "errorAddingWidget": "Terjadi kesalahan menambahkan widget.", + "@errorAddingWidget": {}, + "widgetName": "Nama", + "@widgetName": {}, + "addWidget": "Tambahkan widget", + "@addWidget": {}, + "widgetVideo": "Video", + "@widgetVideo": {}, + "widgetUrlError": "Ini bukan URL yang valid.", + "@widgetUrlError": {}, + "widgetNameError": "Mohon sediakan sebuah nama tampilan.", + "@widgetNameError": {}, + "separateChatTypes": "Pisahkan Pesan Langsung dan Grup", + "@separateChatTypes": { + "type": "String", + "placeholders": {} + }, + "youInvitedBy": "📩 Kamu telah diundang oleh {user}", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedUser": "📩 Kamu mengundang {user}", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKicked": "👞 Kamu mengeluarkan {user}", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKickedAndBanned": "🙅 Kamu mengeluarkan dan mencekal {user}", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youRejectedTheInvitation": "Kamu menolak undangannya", + "@youRejectedTheInvitation": {}, + "youJoinedTheChat": "Kamu bergabung ke obrolan", + "@youJoinedTheChat": {}, + "youAcceptedTheInvitation": "👍 Kamu menerima undangannya", + "@youAcceptedTheInvitation": {}, + "youBannedUser": "Kamu mencekal {user}", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youHaveWithdrawnTheInvitationFor": "Kamu telah membatalkan undangan untuk {user}", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youUnbannedUser": "Kamu membatalkan cekalan {user}", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "pleaseEnterRecoveryKeyDescription": "Untuk mengakses pesan lamamu, mohon masukkan kunci pemulihanmu yang telah dibuat di sesi sebelumnya. Kunci pemulihanmu BUKAN kata sandimu.", + "@pleaseEnterRecoveryKeyDescription": {}, + "users": "Pengguna", + "@users": {}, + "storeInSecureStorageDescription": "Simpan kunci pemulihan di penyimpanan aman perangkat ini.", + "@storeInSecureStorageDescription": {}, + "saveKeyManuallyDescription": "Simpan kunci ini secara manual dengan memicu dialog pembagian atau papan klip sistem.", + "@saveKeyManuallyDescription": {}, + "recoveryKey": "Kunci pemulihan", + "@recoveryKey": {}, + "storeInAppleKeyChain": "Simpan di Apple KeyChain", + "@storeInAppleKeyChain": {}, + "pleaseEnterRecoveryKey": "Mohon masukkan kunci pemulihanmu:", + "@pleaseEnterRecoveryKey": {}, + "unlockOldMessages": "Akses pesan lama", + "@unlockOldMessages": {}, + "recoveryKeyLost": "Kunci pemulihan hilang?", + "@recoveryKeyLost": {}, + "storeInAndroidKeystore": "Simpan di Android KeyStore", + "@storeInAndroidKeystore": {}, + "storeSecurlyOnThisDevice": "Simpan secara aman di perangkat ini", + "@storeSecurlyOnThisDevice": {}, + "countFiles": "{count} file", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "hydrate": "Pulihkan dari file cadangan", + "@hydrate": {}, + "indexedDbErrorTitle": "Masalah dengan mode privat", + "@indexedDbErrorTitle": {}, + "indexedDbErrorLong": "Penyimpanan pesan sayangnya tidak diaktifkan dalam mode privat secara default.\nMohon kunjungi\n- about:config\n- tetapkan dom.indexedDB.privateBrowsing.enabled ke true\nJika tidak ditetapkan, FluffyChat tidak akan dapat dijalankan.", + "@indexedDbErrorLong": {}, + "dehydrate": "Ekspor sesi dan bersihkan perangkat", + "@dehydrate": {}, + "dehydrateWarning": "Tindakan ini tidak dapat diurungkan. Pastikan kamu telah menyimpan file cadangan dengan aman.", + "@dehydrateWarning": {}, + "dehydrateTor": "Pengguna Tor: Ekspor sesi", + "@dehydrateTor": {}, + "hydrateTorLong": "Apakah kamu mengekspor sesimu terakhir kali di Tor? Impor dengan cepat dan lanjut mengobrol.", + "@hydrateTorLong": {}, + "dehydrateTorLong": "Pengguna Tor disarankan untuk mengekspor sesi sebelum menutup jendela.", + "@dehydrateTorLong": {}, + "hydrateTor": "Pengguna Tor: Impor eksporan sesi", + "@hydrateTor": {}, + "custom": "Kustom", + "@custom": {}, + "user": "Pengguna", + "@user": {}, + "confirmMatrixId": "Mohon konfirmasi ID Matrix Anda untuk menghapus akun Anda.", + "@confirmMatrixId": {}, + "supposedMxid": "Ini seharusnya {mxid}", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "commandHint_markasdm": "Tandai sebagai ruangan pesan langsung untuk ID Matrix yang ditentukan", + "@commandHint_markasdm": {}, + "commandHint_markasgroup": "Tandai sebagai grup", + "@commandHint_markasgroup": {}, + "screenSharingTitle": "membagikan layar", + "@screenSharingTitle": {}, + "appearOnTopDetails": "Memperbolehkan aplikasi untuk ditampilkan di atas (tidak dibutuhkan jika kamu memiliki FluffyChat ditetapkan sebagai akun pemanggilan)", + "@appearOnTopDetails": {}, + "callingAccountDetails": "Memperbolehkan FluffyChat untuk menggunakan aplikasi penelepon Android bawaan.", + "@callingAccountDetails": {}, + "noKeyForThisMessage": "Hal ini bisa terjadi jika pesan dikirim sebelum kamu masuk ke akunmu di perangkat ini.\n\nMungkin juga pengirim telah memblokir perangkatmu atau ada yang tidak beres dengan koneksi internet.\n\nApakah kamu bisa membaca pesan pada sesi lain? Maka kamu bisa mentransfer pesan dari sesi tersebut! Buka Pengaturan > Perangkat dan pastikan bahwa perangkat Anda telah ditandatangani secara silang. Ketika kamu membuka ruangan di lain waktu dan kedua sesi berada di latar depan, kunci akan ditransmisikan secara otomatis.\n\nApakah kamu tidak mau kehilangan kunci saat keluar atau berpindah perangkat? Pastikan bahwa kamu telah mengaktifkan cadangan obrolan dalam pengaturan.", + "@noKeyForThisMessage": {}, + "foregroundServiceRunning": "Notifikasi ini ditampilkan ketika layanan latar depan berjalan.", + "@foregroundServiceRunning": {}, + "callingPermissions": "Perizinan panggilan", + "@callingPermissions": {}, + "appearOnTop": "Tampilkan di atas", + "@appearOnTop": {}, + "callingAccount": "Akun pemanggilan", + "@callingAccount": {}, + "otherCallingPermissions": "Mikrofon, kamera dan perizinan FluffyChat lainnya", + "@otherCallingPermissions": {}, + "whyIsThisMessageEncrypted": "Mengapa pesan ini tidak bisa dibaca?", + "@whyIsThisMessageEncrypted": {}, + "newGroup": "Grup baru", + "@newGroup": {}, + "newSpace": "Space baru", + "@newSpace": {}, + "enterSpace": "Masuk space", + "@enterSpace": {}, + "enterRoom": "Masuk ruangan", + "@enterRoom": {}, + "allSpaces": "Semua space", + "@allSpaces": {}, + "screenSharingDetail": "Kamu membagikan layarmu di FluffyChat", + "@screenSharingDetail": {}, + "numChats": "{number} obrolan", + "@numChats": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "hideUnimportantStateEvents": "Sembunyikan peristiwa keadaan yang tidak penting", + "@hideUnimportantStateEvents": {}, + "doNotShowAgain": "Jangan tampilkan lagi", + "@doNotShowAgain": {}, + "hugContent": "{senderName} memeluk kamu", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "googlyEyesContent": "{senderName} mengirim mata googly", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "cuddleContent": "{senderName} berpelukan dengan kamu", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "commandHint_googly": "Kirim mata googly", + "@commandHint_googly": {}, + "commandHint_hug": "Kirim pelukan", + "@commandHint_hug": {}, + "commandHint_cuddle": "Kirim berpelukan", + "@commandHint_cuddle": {}, + "wasDirectChatDisplayName": "Obrolan kosong (sebelumnya {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "startFirstChat": "Mulai obrolan pertamamu", + "@startFirstChat": {}, + "newSpaceDescription": "Fitur space bisa membantu untuk memisahkan obrolanmu dan membuat komunitas pribadi atau publik.", + "@newSpaceDescription": {}, + "sorryThatsNotPossible": "Maaf... itu tidak mungkin", + "@sorryThatsNotPossible": {}, + "deviceKeys": "Kunci perangkat:", + "@deviceKeys": {}, + "encryptThisChat": "Enkripsi obrolan ini", + "@encryptThisChat": {}, + "disableEncryptionWarning": "Demi keamanan kamu tidak bisa menonaktifkan enkripsi dalam sebuah obrolan di mana sebelumbya sudah diaktifkan.", + "@disableEncryptionWarning": {}, + "reopenChat": "Buka obrolan lagi", + "@reopenChat": {}, + "noBackupWarning": "Peringatan! Tanpa mengaktifkan cadangan percakapan, kamu akan kehilangan akses ke pesan terenkripsimu. Disarankan untuk mengaktifkan cadangan percakapan terlebih dahulu sebelum keluar dari akun.", + "@noBackupWarning": {}, + "noOtherDevicesFound": "Tidak ada perangkat lain yang ditemukan", + "@noOtherDevicesFound": {}, + "fileIsTooBigForServer": "Tidak dapat mengirim! Server hanya mendukung lampiran sampai dengan {max}.", + "@fileIsTooBigForServer": {}, + "fileHasBeenSavedAt": "Berkas telah disimpan di {path}", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "jumpToLastReadMessage": "Pergi ke pesan terakhir dibaca", + "@jumpToLastReadMessage": {}, + "readUpToHere": "Baca sampai sini", + "@readUpToHere": {}, + "jump": "Lompat", + "@jump": {}, + "openLinkInBrowser": "Buka tautan dalam peramban", + "@openLinkInBrowser": {}, + "allRooms": "Semua Percakapan Grup", + "@allRooms": { + "type": "String", + "placeholders": {} + }, + "report": "laporkan", + "@report": {}, + "reportErrorDescription": "😭 Aduh. Ada yang salah. Jika kamu mau, kamu bisa melaporkan kutu ini kepada para pengembang.", + "@reportErrorDescription": {}, + "signInWithPassword": "Masuk dengan kata sandi", + "@signInWithPassword": {}, + "pleaseTryAgainLaterOrChooseDifferentServer": "Silakan coba lagi nanti atau pilih server yang lain.", + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "signInWith": "Masuk dengan {provider}", + "@signInWith": { + "type": "String", + "placeholders": { + "provider": { + "type": "String" + } + } + }, + "notAnImage": "Bukan berkas gambar.", + "@notAnImage": {}, + "importNow": "Impor sekarang", + "@importNow": {}, + "importFromZipFile": "Impor dari berkas .zip", + "@importFromZipFile": {}, + "exportEmotePack": "Ekspor paket Emote sebagai .zip", + "@exportEmotePack": {}, + "replace": "Ganti", + "@replace": {}, + "importEmojis": "Impor Emoji", + "@importEmojis": {}, + "sendTypingNotifications": "Kirim notifikasi pengetikan", + "@sendTypingNotifications": {}, + "createGroup": "Buat grup", + "@createGroup": {}, + "inviteContactToGroupQuestion": "Apakah kamu ingin mengundang {contact} ke obrolan \"{groupName}\"?", + "@inviteContactToGroupQuestion": {}, + "tryAgain": "Coba ulang", + "@tryAgain": {}, + "messagesStyle": "Pesan:", + "@messagesStyle": {}, + "shareInviteLink": "Bagikan tautan undangan", + "@shareInviteLink": {}, + "setTheme": "Atur tema:", + "@setTheme": {}, + "invalidServerName": "Nama server tidak valid", + "@invalidServerName": {}, + "addChatDescription": "Tambahkan deskripsi obrolan...", + "@addChatDescription": {}, + "chatPermissions": "Perizinan obrolan", + "@chatPermissions": {}, + "chatDescription": "Deskripsi obrolan", + "@chatDescription": {}, + "chatDescriptionHasBeenChanged": "Deskripsi obrolan diubah", + "@chatDescriptionHasBeenChanged": {}, + "noChatDescriptionYet": "Deskripsi obrolan belum dibuat.", + "@noChatDescriptionYet": {}, + "redactMessageDescription": "Pesan akan dihilangkan untuk semua anggota dalam percakapan ini. Ini tidak dapat diurungkan.", + "@redactMessageDescription": {}, + "optionalRedactReason": "(Opsional) Alasan menghilangkan pesan ini...", + "@optionalRedactReason": {}, + "redactedBy": "Dihilangkan oleh {username}", + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "directChat": "Chat langsung", + "@directChat": {}, + "redactedByBecause": "Dihilangkan oleh {username} karena: \"{reason}\"", + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "setChatDescription": "Lihat deskripsi obrolan", + "@setChatDescription": {}, + "profileNotFound": "Pengguna ini tidak dapat ditemukan di server. Mungkin ada masalah koneksi atau penggunanya tidak ada.", + "@profileNotFound": {}, + "setColorTheme": "Atur tema warna:", + "@setColorTheme": {}, + "invite": "Undang", + "@invite": {}, + "inviteGroupChat": "📨 Undang percakapan grup", + "@inviteGroupChat": {}, + "invitePrivateChat": "📨 Undang percakapan privat", + "@invitePrivateChat": {}, + "emoteKeyboardNoRecents": "Emote yang telah digunakan akan muncul di sini...", + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "invalidInput": "Masukan tidak valid!", + "@invalidInput": {}, + "wrongPinEntered": "PIN yang dimasukkan salah! Coba lagi dalam {seconds} detik...", + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "banUserDescription": "Pengguna akan dicekal dari percakapan dan tidak akan dapat memasuki percakapan lagi sampai dibatalkan cekalannya.", + "@banUserDescription": {}, + "removeDevicesDescription": "Kamu akan dikeluarkan dari perangkat ini dan tidak akan dapat menerima pesan lagi.", + "@removeDevicesDescription": {}, + "unbanUserDescription": "Pengguna akan dapat memasuki percakapannya lagi jika dicoba.", + "@unbanUserDescription": {}, + "pushNotificationsNotAvailable": "Notifikasi dorongan tidak tersedia", + "@pushNotificationsNotAvailable": {}, + "makeAdminDescription": "Setelah kamu membuat pengguna ini admin, kamu tidak akan dapat mengurungkan ini karena penggunanya akan memiliki perizinan yang sama seperti kamu.", + "@makeAdminDescription": {}, + "archiveRoomDescription": "Percakapan akan dipindahkan ke arsip. Pengguna lain akan melihat bahwa kamu telah meninggalkan percakapan.", + "@archiveRoomDescription": {}, + "hasKnocked": "🚪 {user} telah dikeluarkan", + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "learnMore": "Pelajari lebih lanjut", + "@learnMore": {}, + "roomUpgradeDescription": "Percakapannya akan dibuat ulang dengan versi ruangan yang baru. Semua anggota akan diberi tahu bahwa mereka harus ganti ke percakapan yang baru. Kamu bisa mempelajari lebih lanjut tentang versi ruangan di https://spec.matrix.org/latest/rooms/", + "@roomUpgradeDescription": {}, + "pleaseEnterANumber": "Silakan masukkan angka lebih dari 0", + "@pleaseEnterANumber": {}, + "kickUserDescription": "Pengguna ini dikeluarkan dari percakapan tetapi tidak dicekal. Dalam percakapan publik, penggunanya dapat bergabung ulang kapan pun.", + "@kickUserDescription": {}, + "groupCanBeFoundViaSearch": "Grup dapat dicari melalui pencarian", + "@groupCanBeFoundViaSearch": {}, + "groupName": "Nama grup", + "@groupName": {}, + "wrongRecoveryKey": "Maaf... ini sepertinya bukan kunci pemulihan yang benar.", + "@wrongRecoveryKey": {}, + "addChatOrSubSpace": "Tambahkan percakapan atau subspace", + "@addChatOrSubSpace": {}, + "pleaseChooseAStrongPassword": "Silakan pilih kata sandi yang kuat", + "@pleaseChooseAStrongPassword": {}, + "joinSpace": "Bergabung ke space", + "@joinSpace": {}, + "acceptedKeyVerification": "{sender} menerima verifikasi kunci", + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "canceledKeyVerification": "{sender} membatalkan verifikasi kunci", + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "isReadyForKeyVerification": "{sender} siap untuk verifikasi kunci", + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "verifyOtherDevice": "🔐 Verifikasi perangkat lain", + "@verifyOtherDevice": {}, + "requestedKeyVerification": "{sender} meminta verifikasi kunci", + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "startedKeyVerification": "{sender} memulai verifikasi kunci", + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "formattedMessagesDescription": "Tampilkan konten pesan kaya seperti teks tebal menggunakan Markdown.", + "@formattedMessagesDescription": {}, + "noUsersFoundWithQuery": "Sayangnya tidak ada pengguna yang dapat ditemukan dengan \"{query}\". Silakan periksa jika ada tipo.", + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "databaseBuildErrorBody": "Tidak dapat membangun basis data SQLite. Aplikasi mencoba menggunakan basis data lawas untuk sekarang. Silakan laporkan kesalahan ini kepada pengembang di {url}. Pesan kesalahannya adalah: {error}", + "@databaseBuildErrorBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "passwordIsWrong": "Kata sandi yang kamu masukkan salah", + "@passwordIsWrong": {}, + "searchChatsRooms": "Cari #percakapan, @pengguna...", + "@searchChatsRooms": {}, + "createGroupAndInviteUsers": "Buat sebuah grup dan undang pengguna", + "@createGroupAndInviteUsers": {}, + "pleaseEnterYourCurrentPassword": "Silakan masukkan kata sandimu saat ini", + "@pleaseEnterYourCurrentPassword": {}, + "passwordsDoNotMatch": "Kata sandi tidak cocok", + "@passwordsDoNotMatch": {}, + "publicLink": "Tautan publik", + "@publicLink": {}, + "sendTypingNotificationsDescription": "Anggota lain dalam percakapan dapat melihat ketika kamu sedang mengetik sebuah pesan baru.", + "@sendTypingNotificationsDescription": {}, + "forwardMessageTo": "Teruskan pesan ke {roomName}?", + "@forwardMessageTo": { + "type": "String", + "placeholders": { + "roomName": { + "type": "String" + } + } + }, + "sendReadReceipts": "Kirim laporan dibaca", + "@sendReadReceipts": {}, + "formattedMessages": "Pesan yang diformat", + "@formattedMessages": {}, + "verifyOtherUser": "🔐 Verifikasi pengguna lain", + "@verifyOtherUser": {}, + "sessionLostBody": "Sesimu hilang. Silakan laporkan kesalahan ini kepada pengembang di {url}. Pesan kesalahannya adalah: {error}", + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "restoreSessionBody": "Aplikasi sekarang mencoba memulihkan sesimu dari cadangan. Silakan laporkan kesalahan ini kepada pengembang di {url}. Pesan kesalahannya adalah: {error}", + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "presenceStyle": "Presensi:", + "@presenceStyle": { + "type": "String", + "placeholders": {} + }, + "presencesToggle": "Tampilkan pesan status dari pengguna lain", + "@presencesToggle": { + "type": "String", + "placeholders": {} + }, + "youInvitedToBy": "📩 Kamu telah diundang melalui surel ke:\n{alias}", + "@youInvitedToBy": { + "placeholders": { + "alias": { + "type": "String" + } + } + }, + "publicSpaces": "Space publik", + "@publicSpaces": {}, + "commandHint_sendraw": "Kirim JSON mentah", + "@commandHint_sendraw": {}, + "sendReadReceiptsDescription": "Anggota lain dalam percakapan dapat melihat ketika kamu membaca sebuah pesan.", + "@sendReadReceiptsDescription": {}, + "block": "Blokir", + "@block": {}, + "blockedUsers": "Pengguna yang terblokir", + "@blockedUsers": {}, + "blockListDescription": "Kamu bisa memblokir pengguna yang sedang menganggumu. Kamu tidak akan mendapatkan pesan atau undangan ruangan dari pengguna dalam daftar blokiran pribadimu.", + "@blockListDescription": {}, + "blockUsername": "Abaikan nama pengguna", + "@blockUsername": {}, + "hidePresences": "Sembunyikan Daftar Status?", + "@hidePresences": {}, + "transparent": "Transparan", + "@transparent": {}, + "stickers": "Stiker", + "@stickers": {}, + "discover": "Jelajahi", + "@discover": {}, + "startConversation": "Mulai percakapan", + "@startConversation": {}, + "yourGlobalUserIdIs": "ID pengguna globalmu adalah: ", + "@yourGlobalUserIdIs": {}, + "select": "Pilih", + "@select": {}, + "subspace": "Subspace", + "@subspace": {}, + "decline": "Tolak", + "@decline": {}, + "nothingFound": "Tidak ada yang ditemukan...", + "@nothingFound": {}, + "thisDevice": "Perangkat ini:", + "@thisDevice": {}, + "newPassword": "Kata sandi baru", + "@newPassword": {}, + "incomingMessages": "Pesan masuk", + "@incomingMessages": {}, + "databaseMigrationTitle": "Basis data sudah dioptimalkan", + "@databaseMigrationTitle": {}, + "searchForUsers": "Cari @pengguna...", + "@searchForUsers": {}, + "completedKeyVerification": "{sender} menyelesaikan verifikasi kunci", + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "databaseMigrationBody": "Silakan tunggu. Ini dapat membutuhkan beberapa waktu.", + "@databaseMigrationBody": {}, + "leaveEmptyToClearStatus": "Tinggalkan kosong untuk menghapus statusmu.", + "@leaveEmptyToClearStatus": {}, + "initAppError": "Terjadi kesalahan saat init aplikasi", + "@initAppError": {}, + "verifyOtherDeviceDescription": "Saat kamu memverifikasi perangkat lain, perangkat tersebut dapat bertukar kunci, sehingga meningkatkan keamananmu secara keseluruhan. 💪 Saat Anda memulai verifikasi, sebuah pemberitahuan akan muncul di aplikasi pada kedua perangkat. Di situ kemudian akan melihat serangkaian emoji atau angka yang harus dibandingkan satu sama lain. Sebaiknya siapkan kedua perangkat sebelum kamu memulai verifikasi. 🤳", + "@verifyOtherDeviceDescription": {}, + "verifyOtherUserDescription": "Jika kamu memverifikasi pengguna lain, kamu bisa yakin bahwa kamu tahu kepada siapa sebenarnya kamu menulis pesan kepadanya. 💪\n\nSaat kamu memulai verifikasi, kamu dan pengguna lain akan melihat pemberitahuan di aplikasi. Di sana kemudian akan melihat serangkaian emoji atau angka yang harus dibandingkan satu sama lain.\n\nCara terbaik untuk melakukannya adalah dengan bertemu secara langsung atau memulai panggilan video. 👭", + "@verifyOtherUserDescription": {}, + "commandHint_ignore": "Abaikan ID Matrix yang diberikan", + "@commandHint_ignore": {}, + "commandHint_unignore": "Batalkan pengabaian ID Matrix yang diberikan", + "@commandHint_unignore": {}, + "unreadChatsInApp": "{appname}: {unread} obrolan belum dibaca", + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "noDatabaseEncryption": "Enkripsi basis data tidak didukung di platform ini", + "@noDatabaseEncryption": {}, + "customEmojisAndStickersBody": "Tambakan atau bagikan emoji atau stiker kustom yang dapat digunakan dalam obrolan apa pun.", + "@customEmojisAndStickersBody": {}, + "hideRedactedMessages": "Sembunyikan pesan yang dihapus", + "@hideRedactedMessages": {}, + "appLockDescription": "Kunci aplikasi ketika tidak digunakan dengan kode PIN", + "@appLockDescription": {}, + "accessAndVisibility": "Akses dan keterlihatan", + "@accessAndVisibility": {}, + "globalChatId": "ID obrolan global", + "@globalChatId": {}, + "accessAndVisibilityDescription": "Siapa yang diperbolehkan bergabung ke obrolan ini dan bagaimana obrolannya dapat ditemukan.", + "@accessAndVisibilityDescription": {}, + "calls": "Panggilan", + "@calls": {}, + "customEmojisAndStickers": "Emoji dan stiker kustom", + "@customEmojisAndStickers": {}, + "hideRedactedMessagesBody": "Jika seseorang menghapus pesan, pesannya tidak akan terlihat lagi dalam obrolan.", + "@hideRedactedMessagesBody": {}, + "hideMemberChangesInPublicChatsBody": "Jangan tampilkan dalam lini masa obrolan jika seseorang bergabung atau keluar dari obrolan untuk meningkatkan keterlihatan.", + "@hideMemberChangesInPublicChatsBody": {}, + "notifyMeFor": "Beri tahu aku untuk", + "@notifyMeFor": {}, + "hideInvalidOrUnknownMessageFormats": "Sembunyikan format pesan yang tidak valid atau tidak diketahui", + "@hideInvalidOrUnknownMessageFormats": {}, + "hideMemberChangesInPublicChats": "Sembunyikan perubahan anggota dalam obrolan publik", + "@hideMemberChangesInPublicChats": {}, + "overview": "Ikhtisar", + "@overview": {}, + "passwordRecoverySettings": "Pengaturan pemulihan kata sandi", + "@passwordRecoverySettings": {}, + "usersMustKnock": "Pengguna harus mengetuk", + "@usersMustKnock": {}, + "noOneCanJoin": "Tidak ada siapa pun yang dapat bergabung", + "@noOneCanJoin": {}, + "userWouldLikeToChangeTheChat": "{user} ingin bergabung dengan obrolan.", + "@userWouldLikeToChangeTheChat": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "noPublicLinkHasBeenCreatedYet": "Belum ada tautan publik yang dibuat", + "@noPublicLinkHasBeenCreatedYet": {}, + "knock": "Ketuk", + "@knock": {}, + "knocking": "Mengetuk", + "@knocking": {}, + "chatCanBeDiscoveredViaSearchOnServer": "Obrolan dapat ditemukan melalui pencarian di {server}", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "thereAreCountUsersBlocked": "Saat ini ada {count} pengguna yang diblokir.", + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "publicChatAddresses": "Alamat obrolan umum", + "@publicChatAddresses": {}, + "createNewAddress": "Buat alamat baru", + "@createNewAddress": {}, + "userRole": "Peran pengguna", + "@userRole": {}, + "minimumPowerLevel": "{level} adalah tingkat daya minimum.", + "@minimumPowerLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "String" + } + } + }, + "swipeRightToLeftToReply": "Usap dari kanan ke kiri untuk membalas", + "@swipeRightToLeftToReply": {}, + "searchMore": "Cari lebih banyak...", + "@searchMore": {}, + "gallery": "Galeri", + "@gallery": {}, + "searchIn": "Cari dalam obrolan \"{chat}\"...", + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "files": "Berkas", + "@files": {}, + "restricted": "Dibatasi", + "@restricted": {}, + "knockRestricted": "Ketukan dibatasi", + "@knockRestricted": {}, + "alwaysUse24HourFormat": "tidak", + "@alwaysUse24HourFormat": { + "description": "Set to true to always display time of day in 24 hour format." + }, + "sendCanceled": "Pengiriman dibatalkan", + "@sendCanceled": {}, + "noChatsFoundHere": "Belum ada chat di sini. Mulai chat baru dengan seseorang menggunakan tombol di bawah. ⤵️", + "@noChatsFoundHere": {}, + "invitedBy": "📩 Diundang oleh {user}", + "@invitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "markAsUnread": "Tandai sebagai belum dibaca", + "@markAsUnread": {}, + "goToSpace": "Pergi ke space: {space}", + "@goToSpace": { + "type": "String", + "space": {} + }, + "changeTheChatPermissions": "Ubah perizinan chat", + "@changeTheChatPermissions": {}, + "changeTheCanonicalRoomAlias": "Ubah alamat chat publik utama", + "@changeTheCanonicalRoomAlias": {}, + "changeTheVisibilityOfChatHistory": "Ubah keterlihatan riwayat chat", + "@changeTheVisibilityOfChatHistory": {}, + "changeTheDescriptionOfTheGroup": "Ubah deskripsi chat", + "@changeTheDescriptionOfTheGroup": {}, + "sendingAttachment": "Mengirim lampiran...", + "@sendingAttachment": {}, + "compressVideo": "Mengompres video...", + "@compressVideo": {}, + "calculatingFileSize": "Menghitung ukuran berkas...", + "@calculatingFileSize": {}, + "prepareSendingAttachment": "Menyiapkan pengiriman lampiran...", + "@prepareSendingAttachment": {}, + "sendingAttachmentCountOfCount": "Mengirim lampiran {index} dari {length}...", + "@sendingAttachmentCountOfCount": { + "type": "integer", + "placeholders": { + "index": { + "type": "int" + }, + "length": { + "type": "int" + } + } + }, + "userLevel": "{level} - Pengguna", + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "adminLevel": "{level} - Admin", + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "moderatorLevel": "{level} - Moderator", + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "changeGeneralChatSettings": "Ubah pengaturan chat umum", + "@changeGeneralChatSettings": {}, + "discoverHomeservers": "Jelajahi homeserver", + "@discoverHomeservers": {}, + "loginWithMatrixId": "Masuk dengan ID Matrix", + "@loginWithMatrixId": {}, + "doesNotSeemToBeAValidHomeserver": "Sepertinya bukan homeserver yang kompatibel. URL salah?", + "@doesNotSeemToBeAValidHomeserver": {}, + "countChatsAndCountParticipants": "{chats} chat dan {participants} anggota", + "@countChatsAndCountParticipants": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + }, + "participants": { + "type": "int" + } + } + }, + "unread": "Tidak dibaca", + "@unread": {}, + "space": "Space", + "@space": {}, + "spaces": "Space", + "@spaces": {}, + "joinedChats": "Bergabung chat", + "@joinedChats": {}, + "noMoreChatsFound": "Tidak ada chat lagi yang ditemukan...", + "@noMoreChatsFound": {}, + "generatingVideoThumbnail": "Membuat gambar kecil video...", + "@generatingVideoThumbnail": {}, + "changelog": "Catatan perubahan", + "@changelog": {}, + "whatIsAHomeserver": "Apa itu homeserver?", + "@whatIsAHomeserver": {}, + "sendRoomNotifications": "Kirim notifikasi @room", + "@sendRoomNotifications": {}, + "updateInstalled": "🎉 Pembaruan {version} terpasang!", + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "inviteOtherUsers": "Undang pengguna lain ke chat ini", + "@inviteOtherUsers": {}, + "serverLimitReached": "Batasan server tercapai! Menunggu {seconds} detik...", + "@serverLimitReached": { + "type": "integer", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "chatPermissionsDescription": "Tentukan tingkat kekuasaan yang diperlukan untuk tindakan tertentu dalam chat ini. Tingkat kekuasaan 0, 50 dan 100 biasanya mewakili pengguna, moderator dan admin, tetapi gradasi apa pun dimungkinkan.", + "@chatPermissionsDescription": {}, + "homeserverDescription": "Semua data Anda disimpan di dalam server, seperti halnya penyedia email. Anda dapat memilih homeserver mana yang ingin Anda gunakan, sementara Anda masih dapat berkomunikasi dengan semua orang. Pelajari lebih lanjut di https://matrix.org.", + "@homeserverDescription": {}, + "oneOfYourDevicesIsNotVerified": "Salah satu perangkat Anda tidak terverifikasi", + "@oneOfYourDevicesIsNotVerified": {}, + "noticeChatBackupDeviceVerification": "Catatan: Ketika Anda menghubungkan semua perangkat Anda ke cadangan chat, mereka akan diverifikasi secara otomatis.", + "@noticeChatBackupDeviceVerification": {}, + "welcomeText": "Halo 👋 Ini FluffyChat. Kamu bisa masuk ke homeserver mana pun, yang kompatibel dengan https://matrix.org. Lalu, chat dengan siapa pun. Ini merupakan jaringan perpesanan besar yang terdesentralisasi!", + "@welcomeText": {}, + "continueText": "Lanjutkan", + "@continueText": {}, + "aboutHomeserver": "Tentang {homeserver}", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "blur": "Buram:", + "@blur": {}, + "contactServerAdmin": "Hubungi admin server", + "@contactServerAdmin": {}, + "opacity": "Opasitas:", + "@opacity": {}, + "setWallpaper": "Atur later belakang", + "@setWallpaper": {}, + "serverInformation": "Informasi server:", + "@serverInformation": {}, + "noContactInformationProvided": "Server tidak menyediakan informasi kontak valid apa pun", + "@noContactInformationProvided": {}, + "supportPage": "Laman dukungan", + "@supportPage": {}, + "version": "Versi", + "@version": {}, + "website": "Situs Web", + "@website": {}, + "manageAccount": "Kelola akun", + "@manageAccount": {}, + "contactServerSecurity": "Hubungi keamanan server", + "@contactServerSecurity": {}, + "name": "Nama", + "@name": {}, + "compressBeforeSending": "Kompres sebelum mengirim", + "@compressBeforeSending": {}, + "strikeThrough": "Coret", + "@strikeThrough": {}, + "pleaseFillOut": "Silakan isi", + "@pleaseFillOut": {}, + "addLink": "Tambahkan tautan", + "@addLink": {}, + "invalidUrl": "URL tidak valid", + "@invalidUrl": {}, + "sendUncompressed": "Kirim tanpa kompresi", + "@sendUncompressed": {}, + "boldText": "Teks tebal", + "@boldText": {}, + "italicText": "Teks miring", + "@italicText": {}, + "unableToJoinChat": "Tidak dapat bergabung dalam chat. Mungkin pihak lain telah menutup percakapan.", + "@unableToJoinChat": {}, + "sendImages": "Kirim {count} gambar", + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "compress": "Kompres", + "@compress": {}, + "contentNotificationSettings": "Pengaturan notifikasi konten", + "@contentNotificationSettings": {}, + "generalNotificationSettings": "Pengaturan notifikasi umum", + "@generalNotificationSettings": {}, + "roomNotificationSettings": "Pengaturan notifikasi ruangan", + "@roomNotificationSettings": {}, + "userSpecificNotificationSettings": "Pengaturan notifikasi spesifik pengguna", + "@userSpecificNotificationSettings": {}, + "otherNotificationSettings": "Pengaturan notifikasi lainnya", + "@otherNotificationSettings": {}, + "notificationRuleContainsUserName": "Berisi Nama Pengguna", + "@notificationRuleContainsUserName": {}, + "notificationRuleContainsUserNameDescription": "Memberi tahu pengguna ketika pesan memiliki nama penggunanya.", + "@notificationRuleContainsUserNameDescription": {}, + "notificationRuleMaster": "Bisukan semua notifikasi", + "@notificationRuleMaster": {}, + "notificationRuleMasterDescription": "Menimpa peraturan lainnya dan menonaktifkan semua notifikasi.", + "@notificationRuleMasterDescription": {}, + "notificationRuleSuppressNotices": "Dimakan Pesan Terautomasi", + "@notificationRuleSuppressNotices": {}, + "notificationRuleSuppressNoticesDescription": "Mendiamkan notifikasi dari klien terautomasi seperti bot.", + "@notificationRuleSuppressNoticesDescription": {}, + "notificationRuleInviteForMe": "Undang untuk Aku", + "@notificationRuleInviteForMe": {}, + "notificationRuleInviteForMeDescription": "Memberi tahu pengguna ketika diundang ke ruangan.", + "@notificationRuleInviteForMeDescription": {}, + "notificationRuleMemberEvent": "Peristiwa Anggota", + "@notificationRuleMemberEvent": {}, + "notificationRuleMemberEventDescription": "Mendiamkan notifikasi peristiwa keanggotaan.", + "@notificationRuleMemberEventDescription": {}, + "notificationRuleIsUserMention": "Sebutan Pengguna", + "@notificationRuleIsUserMention": {}, + "notificationRuleIsUserMentionDescription": "Memberi tahu pengguna ketika disebut secara langsung dalam pesan.", + "@notificationRuleIsUserMentionDescription": {}, + "notificationRuleContainsDisplayName": "Berisi Nama Tampilan", + "@notificationRuleContainsDisplayName": {}, + "notificationRuleIsRoomMention": "Sebutan Ruangan", + "@notificationRuleIsRoomMention": {}, + "notificationRuleIsRoomMentionDescription": "Memberi tahu pengguna ketika ada sebutan ruangan.", + "@notificationRuleIsRoomMentionDescription": {}, + "notificationRuleRoomnotif": "Notifikasi Ruangan", + "@notificationRuleRoomnotif": {}, + "notificationRuleRoomnotifDescription": "Memberi tahu pengguna ketika pesan berisi '@room'.", + "@notificationRuleRoomnotifDescription": {}, + "notificationRuleTombstone": "Nisan", + "@notificationRuleTombstone": {}, + "notificationRuleTombstoneDescription": "Memberi tahu pengguna tentang pesan deaktivasi ruangan.", + "@notificationRuleTombstoneDescription": {}, + "notificationRuleReaction": "Reaksi", + "@notificationRuleReaction": {}, + "notificationRuleReactionDescription": "Mendiamkan notifikasi reaksi.", + "@notificationRuleReactionDescription": {}, + "notificationRuleRoomServerAcl": "ACL Server Ruangan", + "@notificationRuleRoomServerAcl": {}, + "notificationRuleRoomServerAclDescription": "Mendiamkan notifikasi daftar kontrol akses server ruangan (ACL).", + "@notificationRuleRoomServerAclDescription": {}, + "notificationRuleSuppressEdits": "Diamkan Penyuntingan", + "@notificationRuleSuppressEdits": {}, + "notificationRuleSuppressEditsDescription": "Mendiamkan notifikasi pesan tersunting.", + "@notificationRuleSuppressEditsDescription": {}, + "notificationRuleCall": "Panggilan", + "@notificationRuleCall": {}, + "notificationRuleCallDescription": "Memberi tahu pengguna tentang panggilan.", + "@notificationRuleCallDescription": {}, + "notificationRuleEncryptedRoomOneToOne": "Ruangan Terenkripsi Satu ke Satu", + "@notificationRuleEncryptedRoomOneToOne": {}, + "notificationRuleEncryptedRoomOneToOneDescription": "Memberi tahu pengguna tentang pesan dalam ruangan satu ke satu.", + "@notificationRuleEncryptedRoomOneToOneDescription": {}, + "notificationRuleRoomOneToOne": "Ruangan Satu ke Satu", + "@notificationRuleRoomOneToOne": {}, + "notificationRuleRoomOneToOneDescription": "Memberi tahu pengguna tentang pesan dalam ruangan satu ke satu.", + "@notificationRuleRoomOneToOneDescription": {}, + "notificationRuleMessage": "Pesan", + "@notificationRuleMessage": {}, + "notificationRuleMessageDescription": "Memberi tahu pengguna tentang pesan umum.", + "@notificationRuleMessageDescription": {}, + "notificationRuleEncrypted": "Terenkripsi", + "@notificationRuleEncrypted": {}, + "notificationRuleEncryptedDescription": "Memberi tahu pengguna tentang pesan dalam ruangan terenkripsi.", + "@notificationRuleEncryptedDescription": {}, + "notificationRuleJitsi": "Jitsi", + "@notificationRuleJitsi": {}, + "notificationRuleJitsiDescription": "Memberi tahu pengguna tentang peristiwa widget Jitsi.", + "@notificationRuleJitsiDescription": {}, + "notificationRuleServerAcl": "Diamkan Peristiwa ACL Server", + "@notificationRuleServerAcl": {}, + "notificationRuleServerAclDescription": "Mendiamkan notifikasi peristiwa ACL server.", + "@notificationRuleServerAclDescription": {}, + "unknownPushRule": "Aturan dorongan '{rule}' tidak diketahui", + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } + } + }, + "deletePushRuleCanNotBeUndone": "Jika kamu menghapus pengaturan notifikasi ini, maka tidak dapat diurungkan.", + "@deletePushRuleCanNotBeUndone": {}, + "more": "Tambahan", + "@more": {}, + "newChatRequest": "📩 Permintaan pesan baru", + "@newChatRequest": {}, + "allDevices": "Semua perangkat", + "@allDevices": {}, + "crossVerifiedDevices": "Perangkat terverifikasi silang", + "@crossVerifiedDevices": {}, + "waitingForServer": "Menunggu server...", + "@waitingForServer": {}, + "appIntroduction": "FluffyChat memungkinkanmu untuk mengobrol dengan teman-temanmu di berbagai perpesanan. Pelajari lebih lanjut di https://matrix.org atau ketuk *Lanjutkan* saja.", + "@appIntroduction": {}, + "notificationRuleContainsDisplayNameDescription": "Memberi tahu pengguna ketika pesan berisi nama tampilannya.", + "@notificationRuleContainsDisplayNameDescription": {}, + "shareKeysWith": "Bagikan kunci dengan...", + "@shareKeysWith": {}, + "synchronizingPleaseWaitCounter": " Sinkronisasi… ({percentage}%)", + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "shareKeysWithDescription": "Perangkat apa saja yang dipercayai supaya mereka bisa membaca bersama dengan pesanmu dalam obrolan terenkripsi?", + "@shareKeysWithDescription": {}, + "verifiedDevicesOnly": "Perangkat terverifikasi saja", + "@verifiedDevicesOnly": {}, + "crossVerifiedDevicesIfEnabled": "Verifikasi silang perangkat jika diaktifkan", + "@crossVerifiedDevicesIfEnabled": {}, + "previous": "Sebelumnya", + "@previous": {}, + "otherPartyNotLoggedIn": "Pihak lain belum masuk dan tidak dapat menerima pesan!", + "@otherPartyNotLoggedIn": {}, + "appWantsToUseForLogin": "Gunakan '{server}' untuk masuk", + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "appWantsToUseForLoginDescription": "Anda memperbolehkan aplikasi dan situs web membagikan informasi tentang Anda.", + "@appWantsToUseForLoginDescription": {}, + "open": "Buka", + "@open": {}, + "takeAPhoto": "Ambil foto", + "@takeAPhoto": {}, + "recordAVideo": "Rekam video", + "@recordAVideo": {}, + "optionalMessage": "Pesan (opsional)...", + "@optionalMessage": {}, + "notSupportedOnThisDevice": "Tidak didukung pada perangkat ini", + "@notSupportedOnThisDevice": {}, + "enterNewChat": "Masuk ke obrolan baru", + "@enterNewChat": {}, + "commandHint_roomupgrade": "Tingkatkan ruangan ini ke versi ruangan yang ditentukan", + "@commandHint_roomupgrade": {} +} diff --git a/assets/l10n/intl_ie.arb b/assets/l10n/intl_ie.arb new file mode 100644 index 0000000..307e48e --- /dev/null +++ b/assets/l10n/intl_ie.arb @@ -0,0 +1,2350 @@ +{ + "group": "Gruppe", + "@group": { + "type": "String", + "placeholders": {} + }, + "identity": "Identitá", + "@identity": { + "type": "String", + "placeholders": {} + }, + "close": "Cluder", + "@close": { + "type": "String", + "placeholders": {} + }, + "confirm": "Confirmar", + "@confirm": { + "type": "String", + "placeholders": {} + }, + "admin": "Administrator", + "@admin": { + "type": "String", + "placeholders": {} + }, + "chats": "Conversationes", + "@chats": { + "type": "String", + "placeholders": {} + }, + "containsUserName": "Contene li nómine", + "@containsUserName": { + "type": "String", + "placeholders": {} + }, + "containsDisplayName": "Contene li visibil nómine", + "@containsDisplayName": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "Copiat al Paperiere", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "Copiar al Paperiere", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "countParticipants": "{count} participantes", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "createNewSpace": "Crear un spacie", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "currentlyActive": "Activ actualmen", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "deleteAccount": "Destructer li conto", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "Remover li missage", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "Modificar blocat servitores", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "everythingReady": "Omni es pret!", + "@everythingReady": { + "type": "String", + "placeholders": {} + }, + "extremeOffensive": "Extremmen offensiv", + "@extremeOffensive": { + "type": "String", + "placeholders": {} + }, + "fileName": "Nómine de file", + "@fileName": { + "type": "String", + "placeholders": {} + }, + "fontSize": "Dimension de fonde", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "Pro adhesion", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "enterYourHomeserver": "Provide vor hem-servitor", + "@enterYourHomeserver": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "Pro invitation", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "groupIsPublic": "Gruppe es public", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "help": "Auxilie", + "@help": { + "type": "String", + "placeholders": {} + }, + "hideUnknownEvents": "Celar ínconosset evenimentes", + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "id": "ID", + "@id": { + "type": "String", + "placeholders": {} + }, + "ignoredUsers": "Ignorat usatores", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "invitedUsersOnly": "Solmen invitat usatores", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "login": "Aperter li session", + "@login": { + "type": "String", + "placeholders": {} + }, + "isTyping": "tippa…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "joinRoom": "Adherer al chambre", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "loadMore": "Cargar plu…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "inviteForMe": "Invitationes por me", + "@inviteForMe": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "Ultim activité: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "mention": "Mentionar", + "@mention": { + "type": "String", + "placeholders": {} + }, + "next": "Sequent", + "@next": { + "type": "String", + "placeholders": {} + }, + "no": "No", + "@no": { + "type": "String", + "placeholders": {} + }, + "offensive": "Offensiv", + "@offensive": { + "type": "String", + "placeholders": {} + }, + "offline": "For del rete", + "@offline": { + "type": "String", + "placeholders": {} + }, + "ok": "OK", + "@ok": { + "type": "String", + "placeholders": {} + }, + "online": "In li rete", + "@online": { + "type": "String", + "placeholders": {} + }, + "memberChanges": "Cambios inter membres", + "@memberChanges": { + "type": "String", + "placeholders": {} + }, + "muteChat": "Assurdar li conversation", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "newChat": "Crear un conversation", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "Nov demanda de verification!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "scanQrCode": "Scannar un code QR", + "@scanQrCode": {}, + "noRoomsFound": "Null chambres trovat…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "openInMaps": "Aperter in mappas", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "password": "Contrasigne", + "@password": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "Li contrasigne esset obliviat", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "passwordRecovery": "Reganiar li contrasigne", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "pleaseChoose": "Ples selecter", + "@pleaseChoose": { + "type": "String", + "placeholders": {} + }, + "pushRules": "Regules de push-notificationes", + "@pushRules": { + "type": "String", + "placeholders": {} + }, + "redactMessage": "Redacter li missage", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "removeDevice": "Remover li aparate", + "@removeDevice": { + "type": "String", + "placeholders": {} + }, + "saveFile": "Gardar li file", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "recoveryKey": "Clave de regania", + "@recoveryKey": {}, + "sendMessages": "Inviar missages", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "Inviar video", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "shareLocation": "Partir un localisation", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "spaceName": "Nómine de spacie", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "unavailable": "Índisponibil", + "@unavailable": { + "type": "String", + "placeholders": {} + }, + "toggleUnread": "Marcar quam (ín)leet", + "@toggleUnread": { + "type": "String", + "placeholders": {} + }, + "unblockDevice": "Deblocar li aparate", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "Ínconosset aparate", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "Voce-missage", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "wallpaper": "Tapete", + "@wallpaper": { + "type": "String", + "placeholders": {} + }, + "messageType": "Tip de missage", + "@messageType": {}, + "start": "Iniciar", + "@start": {}, + "messageInfo": "Information pri li missage", + "@messageInfo": {}, + "openGallery": "Aperter li galerie", + "@openGallery": {}, + "videoWithSize": "Video ({size})", + "@videoWithSize": { + "type": "String", + "placeholders": { + "size": { + "type": "String" + } + } + }, + "reportUser": "Raportar li usator", + "@reportUser": {}, + "voiceCall": "Telefonada", + "@voiceCall": {}, + "nextAccount": "Sequent conto", + "@nextAccount": {}, + "previousAccount": "Precedent conto", + "@previousAccount": {}, + "countFiles": "{count} files", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "all": "Omni", + "@all": { + "type": "String", + "placeholders": {} + }, + "create": "Crear", + "@create": { + "type": "String", + "placeholders": {} + }, + "connect": "Conexer", + "@connect": { + "type": "String", + "placeholders": {} + }, + "copy": "Copiar", + "@copy": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "Obscur", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "messages": "Missages", + "@messages": { + "type": "String", + "placeholders": {} + }, + "none": "Null", + "@none": { + "type": "String", + "placeholders": {} + }, + "rejoin": "Re-adherer", + "@rejoin": { + "type": "String", + "placeholders": {} + }, + "remove": "Remover", + "@remove": { + "type": "String", + "placeholders": {} + }, + "notifications": "Notificationes", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "reply": "Responder", + "@reply": { + "type": "String", + "placeholders": {} + }, + "dateWithYear": "{day}.{month}.{year}", + "@dateWithYear": { + "type": "String", + "placeholders": { + "year": { + "type": "String" + }, + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "delete": "Remover", + "@delete": { + "type": "String", + "placeholders": {} + }, + "search": "Sercha", + "@search": { + "type": "String", + "placeholders": {} + }, + "devices": "Aparates", + "@devices": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "Lucid", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "edit": "Redacter", + "@edit": { + "type": "String", + "placeholders": {} + }, + "security": "Securitá", + "@security": { + "type": "String", + "placeholders": {} + }, + "settings": "Parametres", + "@settings": { + "type": "String", + "placeholders": {} + }, + "share": "Partir", + "@share": { + "type": "String", + "placeholders": {} + }, + "systemTheme": "Del sistema", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "username": "Nómine de usator", + "@username": { + "type": "String", + "placeholders": {} + }, + "verify": "Verificar", + "@verify": { + "type": "String", + "placeholders": {} + }, + "submit": "Inviar", + "@submit": { + "type": "String", + "placeholders": {} + }, + "unpin": "Defixar", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "verified": "Verificat", + "@verified": { + "type": "String", + "placeholders": {} + }, + "warning": "Avise!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "yes": "Yes", + "@yes": { + "type": "String", + "placeholders": {} + }, + "time": "Hora", + "@time": {}, + "publish": "Publicar", + "@publish": {}, + "sender": "Autor", + "@sender": {}, + "dismiss": "Demisser", + "@dismiss": {}, + "custom": "Personalisat", + "@custom": {}, + "emojis": "Emoji", + "@emojis": {}, + "widgetCustom": "Personalisat", + "@widgetCustom": {}, + "users": "Usatores", + "@users": {}, + "user": "Usator", + "@user": {}, + "forward": "Avan", + "@forward": { + "type": "String", + "placeholders": {} + }, + "groups": "Gruppes", + "@groups": { + "type": "String", + "placeholders": {} + }, + "ignore": "Ignorar", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "inoffensive": "Ínoffensiv", + "@inoffensive": { + "type": "String", + "placeholders": {} + }, + "invited": "Invitat", + "@invited": { + "type": "String", + "placeholders": {} + }, + "leave": "Forlassar", + "@leave": { + "type": "String", + "placeholders": {} + }, + "license": "Licentie", + "@license": { + "type": "String", + "placeholders": {} + }, + "or": "O", + "@or": { + "type": "String", + "placeholders": {} + }, + "link": "Ligament", + "@link": {}, + "participant": "Participante", + "@participant": { + "type": "String", + "placeholders": {} + }, + "reason": "Cause", + "@reason": { + "type": "String", + "placeholders": {} + }, + "people": "Homes", + "@people": { + "type": "String", + "placeholders": {} + }, + "pin": "Fixar", + "@pin": { + "type": "String", + "placeholders": {} + }, + "privacy": "Privatie", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "recording": "Registrante", + "@recording": { + "type": "String", + "placeholders": {} + }, + "register": "Inregistrar se", + "@register": { + "type": "String", + "placeholders": {} + }, + "reject": "Refuser", + "@reject": { + "type": "String", + "placeholders": {} + }, + "repeatPassword": "Repetir li contrasigne", + "@repeatPassword": {}, + "addEmail": "Adjunter e-post", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "changePassword": "Cambiar li contrasigne", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "clearArchive": "Vacuar li archive", + "@clearArchive": {}, + "commandHint_clearcache": "Vacuar li cache", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_send": "Inviar li textu", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "configureChat": "Configurar li conversation", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "directChats": "Direct conversationes", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "Activar li ciffration", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "Descargar li file", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "Parametres de emotiones", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "emoteShortcode": "Curt-code de emotion", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "Vacui conversation", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "videoCall": "Videotelefonada", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "openChat": "Aperter li conversation", + "@openChat": {}, + "reportMessage": "Raportar li missage", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "noPermission": "Sin permission", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "openCamera": "Aperter li cámera", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "showPassword": "Monstrar li contrasigne", + "@showPassword": { + "type": "String", + "placeholders": {} + }, + "sendFile": "Inviar un file", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendImage": "Inviar un image", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendOriginal": "Inviar li originale", + "@sendOriginal": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "Corresponde", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "anyoneCanJoin": "Alquí posse adherer se", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "obtainingLocation": "Obtenente li localisation…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "addWidget": "Adjunter un widget", + "@addWidget": {}, + "addAccount": "Adjunter un conto", + "@addAccount": {}, + "publicRooms": "Public chambres", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "verifyStart": "Iniciar li verification", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "Version del chambre", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "sendAudio": "Inviar audio", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendSticker": "Inviar un nota adhesiv", + "@sendSticker": { + "type": "String", + "placeholders": {} + }, + "setStatus": "Assignar li statu", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "Code de fonte", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "play": "Reproducter {fileName}", + "@play": { + "type": "String", + "placeholders": { + "fileName": { + "type": "String" + } + } + }, + "about": "Pri", + "@about": { + "type": "String", + "placeholders": {} + }, + "accept": "Acceptar", + "@accept": { + "type": "String", + "placeholders": {} + }, + "confirmMatrixId": "Ples confirmar vor Matrix ID por destructer vor conto.", + "@confirmMatrixId": {}, + "allChats": "Omni conversationes", + "@allChats": { + "type": "String", + "placeholders": {} + }, + "addToSpace": "Adjunter al spacie", + "@addToSpace": {}, + "askVerificationRequest": "Esque acceptar ti demanda de verification de {username}?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "autoplayImages": "Automaticmen reproducter animat images", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "sendOnEnter": "Inviar per Enter", + "@sendOnEnter": {}, + "blocked": "Blocat", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "blockDevice": "Blocar li aparate", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "botMessages": "Missages de robots", + "@botMessages": { + "type": "String", + "placeholders": {} + }, + "changeDeviceName": "Cambiar li nómine de aparate", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "Cambiar li hem-servitor", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "chat": "Conversation", + "@chat": { + "type": "String", + "placeholders": {} + }, + "changeYourAvatar": "Cambiar vor avatar", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "chatBackup": "Archive de conversation", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Detallies del conversation", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "commandHint_me": "Ples descrir vos", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "commandHint_leave": "Forlassar ti chambre", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandInvalid": "Comande es ínvalid", + "@commandInvalid": { + "type": "String" + }, + "widgetEtherpad": "Textual nota", + "@widgetEtherpad": {}, + "banFromChat": "Bannir del conversation", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "Cambiar li stil", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "commandHint_markasgroup": "Marcar quam gruppe", + "@commandHint_markasgroup": {}, + "widgetJitsi": "Jitsi Meet", + "@widgetJitsi": {}, + "screenSharingTitle": "partir li ecran", + "@screenSharingTitle": {}, + "callingPermissions": "Permissiones de telefonada", + "@callingPermissions": {}, + "callingAccount": "Conto telefonante", + "@callingAccount": {}, + "bannedUser": "{username} ha bannit {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "commandHint_html": "Inviar contenete HTML", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_plain": "Inviar textu sin formate", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "editRoomAliases": "Modificar pseudonimos del chambre", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "Emotion ja existe!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "Modificar li avatar del chambre", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "groupWith": "Gruppe con {displayname}", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "invitedUser": "{username} invitat {targetName}", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "leftTheChat": "Surtit ex li conversation", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "loadingPleaseWait": "Cargante... ples atender.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "{username} ha acceptat li invitation", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "supposedMxid": "To deve esser {mxid}", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "areYouSureYouWantToLogout": "Esque vu vole cluder li session?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "badServerLoginTypesException": "Li hem-servitor supporta ti tipes de autentication:\n{serverVersions}\nMa ti-ci application supporta solmen:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "cantOpenUri": "Ne successat aperter li adresse {uri}", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "badServerVersionsException": "Li hem-servitor supporta ti versiones de specification:\n{serverVersions}\nMa ti-ci application supporta solmen {supportedVersions}", + "@badServerVersionsException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "dateWithoutYear": "{day}.{month}", + "@dateWithoutYear": { + "type": "String", + "placeholders": { + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "device": "Aparate", + "@device": { + "type": "String", + "placeholders": {} + }, + "widgetVideo": "Video", + "@widgetVideo": {}, + "widgetName": "Nómine", + "@widgetName": {}, + "account": "Conto", + "@account": { + "type": "String", + "placeholders": {} + }, + "alias": "pseudonim", + "@alias": { + "type": "String", + "placeholders": {} + }, + "archive": "Archive", + "@archive": { + "type": "String", + "placeholders": {} + }, + "banned": "Bannit", + "@banned": { + "type": "String", + "placeholders": {} + }, + "cancel": "Anullar", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "encrypted": "Ciffrat", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "encryption": "Ciffration", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "homeserver": "Hem-servitor", + "@homeserver": {}, + "fluffychat": "FluffyChat", + "@fluffychat": { + "type": "String", + "placeholders": {} + }, + "moderator": "Moderator", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "newGroup": "Crear un gruppe", + "@newGroup": {}, + "newSpace": "Crear un spacie", + "@newSpace": {}, + "enterSpace": "Intrar li spacie", + "@enterSpace": {}, + "enterRoom": "Intrar li chambre", + "@enterRoom": {}, + "allSpaces": "Omni spacies", + "@allSpaces": {}, + "numChats": "{number} conversationes", + "@numChats": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "logout": "Cluder li session", + "@logout": { + "type": "String", + "placeholders": {} + }, + "send": "Inviar", + "@send": { + "type": "String", + "placeholders": {} + }, + "you": "Vu", + "@you": { + "type": "String", + "placeholders": {} + }, + "title": "FluffyChat", + "@title": { + "description": "Title for the application", + "type": "String", + "placeholders": {} + }, + "skip": "Omisser", + "@skip": { + "type": "String", + "placeholders": {} + }, + "status": "Statu", + "@status": { + "type": "String", + "placeholders": {} + }, + "unverified": "Ínverificat", + "@unverified": {}, + "deviceId": "ID de aparate", + "@deviceId": { + "type": "String", + "placeholders": {} + }, + "editDisplayname": "Redacter li visibil nómine", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "Invitar un contacte", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "requestPermission": "Demandar li permission", + "@requestPermission": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "Esque vu es cert?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "@jumpToLastReadMessage": {}, + "@allRooms": { + "type": "String", + "placeholders": {} + }, + "@commandHint_cuddle": {}, + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "@reportErrorDescription": {}, + "@setPermissionsLevel": { + "type": "String", + "placeholders": {} + }, + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "@chatHasBeenAddedToThisSpace": {}, + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "@unsupportedAndroidVersion": {}, + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "@indexedDbErrorLong": {}, + "@oneClientLoggedOut": {}, + "@toggleMuted": { + "type": "String", + "placeholders": {} + }, + "@unsupportedAndroidVersionLong": {}, + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "@startFirstChat": {}, + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "@setColorTheme": {}, + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "@singlesignon": { + "type": "String", + "placeholders": {} + }, + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@youAcceptedTheInvitation": {}, + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@banUserDescription": {}, + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "@removeDevicesDescription": {}, + "@changedTheChatDescriptionTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "description": { + "type": "String" + } + } + }, + "@separateChatTypes": { + "type": "String", + "placeholders": {} + }, + "@tryAgain": {}, + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@unbanUserDescription": {}, + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "@pickImage": { + "type": "String", + "placeholders": {} + }, + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@youRejectedTheInvitation": {}, + "@otherCallingPermissions": {}, + "@messagesStyle": {}, + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "@widgetUrlError": {}, + "@emailOrUsername": {}, + "@newSpaceDescription": {}, + "@chatDescription": {}, + "@callingAccountDetails": {}, + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@encryptThisChat": {}, + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "@emoteWarnNeedToPick": { + "type": "String", + "placeholders": {} + }, + "@reopenChat": {}, + "@pleaseEnterRecoveryKey": {}, + "@toggleFavorite": { + "type": "String", + "placeholders": {} + }, + "@widgetNameError": {}, + "@addToBundle": {}, + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "@noKeyForThisMessage": {}, + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "@hydrateTor": {}, + "@pushNotificationsNotAvailable": {}, + "@storeInAppleKeyChain": {}, + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "@hydrate": {}, + "@invalidServerName": {}, + "@chatPermissions": {}, + "@wipeChatBackup": { + "type": "String", + "placeholders": {} + }, + "@storeInAndroidKeystore": {}, + "@hideRedactedEvents": { + "type": "String", + "placeholders": {} + }, + "@signInWithPassword": {}, + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "@needPantalaimonWarning": { + "type": "String", + "placeholders": {} + }, + "@makeAdminDescription": {}, + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "@transferFromAnotherDevice": { + "type": "String", + "placeholders": {} + }, + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "@goToTheNewRoom": { + "type": "String", + "placeholders": {} + }, + "@saveKeyManuallyDescription": {}, + "@editBundlesForAccount": {}, + "@renderRichContent": { + "type": "String", + "placeholders": {} + }, + "@whyIsThisMessageEncrypted": {}, + "@unreadChats": { + "type": "String", + "placeholders": { + "unreadCount": { + "type": "int" + } + } + }, + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@setChatDescription": {}, + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@importFromZipFile": {}, + "@dehydrateWarning": {}, + "@noOtherDevicesFound": {}, + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "@seenByUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@storeSecurlyOnThisDevice": {}, + "@yourChatBackupHasBeenSetUp": {}, + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@videoCallsBetaWarning": {}, + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "@signInWith": { + "type": "String", + "placeholders": { + "provider": { + "type": "String" + } + } + }, + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@fileIsTooBigForServer": {}, + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "@readUpToHere": {}, + "@unlockOldMessages": {}, + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@optionalRedactReason": {}, + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "@dehydrate": {}, + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "@sendAsText": { + "type": "String" + }, + "@archiveRoomDescription": {}, + "@exportEmotePack": {}, + "@changedTheChatNameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "chatname": { + "type": "String" + } + } + }, + "@switchToAccount": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "@placeCall": {}, + "@removedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@experimentalVideoCalls": {}, + "@pleaseEnterRecoveryKeyDescription": {}, + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "@inviteContactToGroupQuestion": {}, + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@appearOnTopDetails": {}, + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@confirmEventUnpin": {}, + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "@redactMessageDescription": {}, + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "@invalidInput": {}, + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "@dehydrateTorLong": {}, + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "@doNotShowAgain": {}, + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@report": {}, + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "@howOffensiveIsThisContent": { + "type": "String", + "placeholders": {} + }, + "@serverRequiresEmail": {}, + "@hideUnimportantStateEvents": {}, + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@addToSpaceDescription": {}, + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "@addChatDescription": {}, + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@openLinkInBrowser": {}, + "@appLock": { + "type": "String", + "placeholders": {} + }, + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "@disableEncryptionWarning": {}, + "@directChat": {}, + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "@sendTypingNotifications": {}, + "@inviteGroupChat": {}, + "@appearOnTop": {}, + "@invitePrivateChat": {}, + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "@foregroundServiceRunning": {}, + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "@importEmojis": {}, + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "@noChatDescriptionYet": {}, + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "@removeFromBundle": {}, + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "@learnMore": {}, + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "@notAnImage": {}, + "@chatDescriptionHasBeenChanged": {}, + "@bundleName": {}, + "@dehydrateTor": {}, + "@removeFromSpace": {}, + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "@roomUpgradeDescription": {}, + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "@pleaseEnterANumber": {}, + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@profileNotFound": {}, + "@jump": {}, + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "@sorryThatsNotPossible": {}, + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@shareInviteLink": {}, + "@commandHint_markasdm": {}, + "@recoveryKeyLost": {}, + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@deviceKeys": {}, + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "@setCustomEmotes": { + "type": "String", + "placeholders": {} + }, + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "@notificationsEnabledForThisAccount": { + "type": "String", + "placeholders": {} + }, + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "@setTheme": {}, + "@youJoinedTheChat": {}, + "@openVideoCamera": { + "type": "String", + "placeholders": {} + }, + "@chatBackupDescription": { + "type": "String", + "placeholders": {} + }, + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "@markAsRead": {}, + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@errorAddingWidget": {}, + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "@commandHint_hug": {}, + "@replace": {}, + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "@pleaseEnter4Digits": { + "type": "String", + "placeholders": {} + }, + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "@commandHint_googly": {}, + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "@createGroup": {}, + "@hydrateTorLong": {}, + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "@noBackupWarning": {}, + "@storeInSecureStorageDescription": {}, + "@kickUserDescription": {}, + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "@importNow": {}, + "@setInvitationLink": { + "type": "String", + "placeholders": {} + }, + "@pinMessage": {}, + "@screenSharingDetail": {}, + "@invite": {}, + "@enableMultiAccounts": {}, + "@emotePacks": { + "type": "String", + "placeholders": {} + }, + "@indexedDbErrorTitle": {}, + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + } +} diff --git a/assets/l10n/intl_it.arb b/assets/l10n/intl_it.arb new file mode 100644 index 0000000..7bffff8 --- /dev/null +++ b/assets/l10n/intl_it.arb @@ -0,0 +1,3336 @@ +{ + "@@last_modified": "2021-08-14 12:41:09.992206", + "about": "Informazioni", + "@about": { + "type": "String", + "placeholders": {} + }, + "accept": "Accetta", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 {username} ha accettato l'invito", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "Account", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐 {username} ha abilitato la crittografia end to end", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "addEmail": "Aggiungi e-mail", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "admin": "Amministratore", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "alias", + "@alias": { + "type": "String", + "placeholders": {} + }, + "all": "Tutto", + "@all": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "{senderName} ha risposto alla chiamata", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "Tutti possono partecipare", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "appLock": "Blocco dell'app", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "archive": "Archivia", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "Gli utenti ospiti possono partecipare", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "Sei sicuro/a?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "areYouSureYouWantToLogout": "Sei sicuro/a di voler uscire?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "Per far accedere l'altra persona, per favore inserisci la tua frase segreta o chiave di recupero.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "Accettare questa richiesta di verifica da {username}?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "badServerLoginTypesException": "L'homeserver supporta i tipi di accesso:\n{serverVersions}\nMa questa applicazione supporta solo:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "badServerVersionsException": "L'homeserver supporta le versioni Spec:\n{serverVersions}\nMa questa applicazione supporta solo {supportedVersions}", + "@badServerVersionsException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "banFromChat": "Bandisci dalla chat", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "Bandito", + "@banned": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username} ha bandito {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "Blocca dispositivo", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "blocked": "Bloccato", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "botMessages": "Messaggi bot", + "@botMessages": { + "type": "String", + "placeholders": {} + }, + "cancel": "Annulla", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "changeDeviceName": "Cambia nome dispositivo", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "{username} ha cambiato l'avatar della discussione", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatDescriptionTo": "{username} ha cambiato la descrizione della chat in: '{description}'", + "@changedTheChatDescriptionTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "description": { + "type": "String" + } + } + }, + "changedTheChatNameTo": "{username} ha cambiato il nome della discussione in: '{chatname}'", + "@changedTheChatNameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "chatname": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username} ha cambiato i permessi della chat", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username} ha cambiato nome in: '{displayname}'", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} ha cambiato le regole di accesso per ospiti", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} ha cambiato le regole di accesso per ospiti con: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username} ha cambiato la visibilità della cronologia", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username} ha cambiato la visibilità della cronologia in: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username} ha cambiato le regole per unirsi", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} ha cambiato le regole per unirsi in: {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} ha cambiato il suo avatar", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "{username} ha modificato gli alias della stanza", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username} ha cambiato il link di invito", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changePassword": "Cambia la password", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "Cambia il server principale", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "Cambia il tuo stile", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "Cambia il nome del gruppo", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "La crittografia è corrotta", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "chat": "Chat", + "@chat": { + "type": "String", + "placeholders": {} + }, + "chatBackup": "Backup delle discussioni", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "chatBackupDescription": "I tuoi vecchi messaggi sono protetti da una chiave di sicurezza. Assicurati di non perderla.", + "@chatBackupDescription": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Dettagli chat", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chats": "Discussioni", + "@chats": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "Scegli una password complessa", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "close": "Chiudi", + "@close": { + "type": "String", + "placeholders": {} + }, + "compareEmojiMatch": "Per favore confronta gli emoji", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "Per favore confronta i numeri", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "configureChat": "Configura la discussione", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "confirm": "Conferma", + "@confirm": { + "type": "String", + "placeholders": {} + }, + "connect": "Connetti", + "@connect": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "Il contatto è stato invitato nel gruppo", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "containsDisplayName": "Contiene nome visibile", + "@containsDisplayName": { + "type": "String", + "placeholders": {} + }, + "containsUserName": "Contiene nome utente", + "@containsUserName": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "Il contenuto è stato segnalato agli amministratori del server", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "Copiato negli Appunti", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "Copia", + "@copy": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "Copia negli appunti", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "Impossibile decriptare messaggio: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "countParticipants": "{count} partecipanti", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "create": "Crea", + "@create": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "💬 {username} ha creato la chat", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "currentlyActive": "Attualmente attivo", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "Scuro", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "dateWithoutYear": "{day}/{month}", + "@dateWithoutYear": { + "type": "String", + "placeholders": { + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "dateWithYear": "{day}/{month}/{year}", + "@dateWithYear": { + "type": "String", + "placeholders": { + "year": { + "type": "String" + }, + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "deactivateAccountWarning": "Disabiliterà il tuo account. Non puoi tornare indietro! Sei sicuro/a?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "Livello di autorizzazione predefinito per i nuovi utenti", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "delete": "Cancella", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "Elimina l'account", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "Elimina il messaggio", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "device": "Dispositivo", + "@device": { + "type": "String", + "placeholders": {} + }, + "deviceId": "ID del dispositivo", + "@deviceId": { + "type": "String", + "placeholders": {} + }, + "devices": "Dispositivi", + "@devices": { + "type": "String", + "placeholders": {} + }, + "directChats": "Chat dirette", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "Il nominativo è stato cambiato", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "Scarica il file", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "edit": "Modifica", + "@edit": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "Modifica i server bloccati", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "editDisplayname": "Modifica il nominativo", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "Modifica l'avatar della stanza", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "L'emote già esiste!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "Shortcode emote invalido!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emotePacks": "Pacchetti emotes della stanza", + "@emotePacks": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "Impostazioni emote", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "emoteShortcode": "Scorciatoia emote", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emoteWarnNeedToPick": "Devi scegliere una scorciatoia emote e aggiungere un immagine!", + "@emoteWarnNeedToPick": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "Discussione vuota", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "Abilita i pacchetti emotes globalmente", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "Abilita la crittografia", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "Non potrai disabilitare la crittografia in futuro. Sei sicuro?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "encrypted": "Crittografato", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "encryption": "Crittografia", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "Crittografia non abilitata", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName} è entrato in chiamata", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "enterAnEmailAddress": "Inserisci un indirizzo e-mail", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "enterYourHomeserver": "Inserisci il tuo server principale", + "@enterYourHomeserver": { + "type": "String", + "placeholders": {} + }, + "everythingReady": "Tutto pronto!", + "@everythingReady": { + "type": "String", + "placeholders": {} + }, + "extremeOffensive": "Estremamente offensivo", + "@extremeOffensive": { + "type": "String", + "placeholders": {} + }, + "fileName": "Nome del file", + "@fileName": { + "type": "String", + "placeholders": {} + }, + "fluffychat": "FluffyChat", + "@fluffychat": { + "type": "String", + "placeholders": {} + }, + "fontSize": "Dimensione carattere", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "forward": "Inoltra", + "@forward": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "Dall'adesione", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "Dall'invito", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "goToTheNewRoom": "Vai nella nuova stanza", + "@goToTheNewRoom": { + "type": "String", + "placeholders": {} + }, + "group": "Gruppo", + "@group": { + "type": "String", + "placeholders": {} + }, + "groupIsPublic": "Il gruppo è pubblico", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "groups": "Gruppi", + "@groups": { + "type": "String", + "placeholders": {} + }, + "groupWith": "Gruppo con {displayname}", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "guestsAreForbidden": "Gli ospiti sono vietati", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "Gli ospiti possono partecipare", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{username} ha ritirato l'invito per {targetName}", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "help": "Aiuto", + "@help": { + "type": "String", + "placeholders": {} + }, + "hideRedactedEvents": "Nascondi gli eventi eliminati", + "@hideRedactedEvents": { + "type": "String", + "placeholders": {} + }, + "hideUnknownEvents": "Nascondi gli eventi sconosciuti", + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "howOffensiveIsThisContent": "Quanto è offensivo questo contenuto?", + "@howOffensiveIsThisContent": { + "type": "String", + "placeholders": {} + }, + "id": "ID", + "@id": { + "type": "String", + "placeholders": {} + }, + "identity": "Identità", + "@identity": { + "type": "String", + "placeholders": {} + }, + "ignore": "Ignora", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "ignoredUsers": "Utenti ignorati", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "iHaveClickedOnLink": "Ho cliccato sul collegamento", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "Frase segrata o chiave di ripristino errate", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "inoffensive": "Inoffensivo", + "@inoffensive": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "Invita contatto", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "Invita un contatto a {groupName}", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "invited": "Invitato/a", + "@invited": { + "type": "String", + "placeholders": {} + }, + "invitedUser": "📩 {username} ha invitato {targetName}", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "invitedUsersOnly": "Solo utenti invitati", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "inviteForMe": "Invita per me", + "@inviteForMe": { + "type": "String", + "placeholders": {} + }, + "inviteText": "{username} ti ha invitato/a a FluffyChat.\n1. Visita fluffychat.im e installa l'applicazione\n2. Iscriviti o accedi\n3. Apri il collegamento di invito: \n {link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "isTyping": "sta scrivendo…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "👋 {username} si è unito/a alla chat", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "joinRoom": "Unisciti alla stanza", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "kicked": "👞 {username} ha espulso {targetName}", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickedAndBanned": "🙅 {username} ha espulso e bandito {targetName}", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickFromChat": "Espelli dalla chat", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "Ultima attività: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "leave": "Abbandona", + "@leave": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "Ha abbandonato la chat", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "license": "Licenza", + "@license": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "Chiaro", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "Carica altri {count} partecipanti", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "loadingPleaseWait": "Caricamento… Attendere prego.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "loadMore": "Carica di più…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "login": "Accedi", + "@login": { + "type": "String", + "placeholders": {} + }, + "logInTo": "Accedi a {homeserver}", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "logout": "Esci", + "@logout": { + "type": "String", + "placeholders": {} + }, + "memberChanges": "Cambiamenti di membri", + "@memberChanges": { + "type": "String", + "placeholders": {} + }, + "mention": "Menzione", + "@mention": { + "type": "String", + "placeholders": {} + }, + "messages": "Messaggi", + "@messages": { + "type": "String", + "placeholders": {} + }, + "moderator": "Moderatore", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "muteChat": "Silenzia discussione", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "needPantalaimonWarning": "Tieni presente che per ora hai bisogno di Pantalaimon per utilizzare la crittografia dall'inizio alla fine.", + "@needPantalaimonWarning": { + "type": "String", + "placeholders": {} + }, + "newChat": "Nuova discussione", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "💬 Nuovo messaggio in FluffyChat", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "Nuova richiesta di verifica!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "next": "Avanti", + "@next": { + "type": "String", + "placeholders": {} + }, + "no": "No", + "@no": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "Nessuna connessione al server", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "Nessun emote trovato. 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "Puoi attivare la crittografia solo quando la stanza non è più accessibile pubblicamente.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "Firebase Cloud Messaging non sembra essere disponibile sul tuo dispositivo. Per continuare a ricevere notifiche push, ti consigliamo di installare ntfy. Con ntfy o un altro provider Unified Push puoi ricevere notifiche push in modo sicuro per i dati. Puoi scaricare ntfy dal PlayStore o da F-Droid.", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "none": "Nessuno", + "@none": { + "type": "String", + "placeholders": {} + }, + "noPasswordRecoveryDescription": "Non hai ancora aggiunto un modo per recuperare la tua password.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "noPermission": "Nessuna autorizzazione", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "Nessuna stanza trovata…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "notifications": "Notifiche", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "notificationsEnabledForThisAccount": "Notifiche abilitate per questo account", + "@notificationsEnabledForThisAccount": { + "type": "String", + "placeholders": {} + }, + "numUsersTyping": "{count} utenti stanno scrivendo…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "offensive": "Offensivo", + "@offensive": { + "type": "String", + "placeholders": {} + }, + "offline": "Fuori linea", + "@offline": { + "type": "String", + "placeholders": {} + }, + "ok": "Ok", + "@ok": { + "type": "String", + "placeholders": {} + }, + "online": "In linea", + "@online": { + "type": "String", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "Il backup delle chiavi in linea è abilitato", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "Ops, qualcosa è andato storto…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "Apri l'app per leggere i messaggi", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "openCamera": "Apri fotocamera", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "participant": "Partecipante", + "@participant": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "frase segreta o chiave di recupero", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "password": "Password", + "@password": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "Password dimenticata", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "La password è stata cambiata", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "passwordRecovery": "Recupero della password", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "people": "Persone", + "@people": { + "type": "String", + "placeholders": {} + }, + "pickImage": "Scegli un'immagine", + "@pickImage": { + "type": "String", + "placeholders": {} + }, + "pin": "Fissa", + "@pin": { + "type": "String", + "placeholders": {} + }, + "play": "Riproduci {fileName}", + "@play": { + "type": "String", + "placeholders": { + "fileName": { + "type": "String" + } + } + }, + "pleaseChooseAPasscode": "Si prega di scegliere un codice di accesso", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "pleaseClickOnLink": "Clicca sul collegamenti nell'e-mail e poi procedi.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "pleaseEnter4Digits": "Inserisci 4 cifre o lascia vuoto per disabilitare il blocco dell'app.", + "@pleaseEnter4Digits": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPassword": "Inserisci la tua password", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "Inserisci il tuo nome utente", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "Segui le istruzioni sul sito web e tocca Avanti.", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "privacy": "Privacy", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "Stanze pubbliche", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "pushRules": "Regole notifiche", + "@pushRules": { + "type": "String", + "placeholders": {} + }, + "reason": "Motivo", + "@reason": { + "type": "String", + "placeholders": {} + }, + "recording": "Registrazione", + "@recording": { + "type": "String", + "placeholders": {} + }, + "redactedAnEvent": "{username} ha eliminato un evento", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "redactMessage": "Elimina un messaggio", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "reject": "Rifiuta", + "@reject": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "{username} ha rifiutato l'invito", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "rejoin": "Riunisciti", + "@rejoin": { + "type": "String", + "placeholders": {} + }, + "remove": "Rimuovi", + "@remove": { + "type": "String", + "placeholders": {} + }, + "removeAllOtherDevices": "Rimuovi tutti gli altri dispositivi", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "removedBy": "Rimosso da {username}", + "@removedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "removeDevice": "Rimuovi il dispositivo", + "@removeDevice": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "Rimuovi il ban dalla chat", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "renderRichContent": "Mostra i contenuti ricchi dei messaggi", + "@renderRichContent": { + "type": "String", + "placeholders": {} + }, + "replaceRoomWithNewerVersion": "Sostituisci la stanza con la versione più recente", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "reply": "Rispondi", + "@reply": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "Segnala il messaggio", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "requestPermission": "Richiedi l'autorizzazione", + "@requestPermission": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "La stanza è stata aggiornata", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "Versione della stanza", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "search": "Cerca", + "@search": { + "type": "String", + "placeholders": {} + }, + "security": "Sicurezza", + "@security": { + "type": "String", + "placeholders": {} + }, + "seenByUser": "Visto da {username}", + "@seenByUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "send": "Invia", + "@send": { + "type": "String", + "placeholders": {} + }, + "sendAMessage": "Invia un messaggio", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "sendAudio": "Invia un file audio", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendFile": "Invia un file", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendImage": "Invia un'immagine", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendMessages": "Invia messaggi", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "sendOriginal": "Invia l'originale", + "@sendOriginal": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "Invia un video", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "sentAFile": "📁 {username} ha inviato un file", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAnAudio": "🎤 {username} ha inviato un file audio", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAPicture": "🖼️ {username} ha inviato un'immagine", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentASticker": "😊 {username} ha inviato un adesivo", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "🎥 {username} ha inviato un video", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentCallInformations": "{senderName} ha inviato informazioni sulla chiamata", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "setCustomEmotes": "Imposta emoticon personalizzate", + "@setCustomEmotes": { + "type": "String", + "placeholders": {} + }, + "setInvitationLink": "Imposta il collegamento di invito", + "@setInvitationLink": { + "type": "String", + "placeholders": {} + }, + "setPermissionsLevel": "Imposta il livello di autorizzazione", + "@setPermissionsLevel": { + "type": "String", + "placeholders": {} + }, + "setStatus": "Imposta lo stato", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "settings": "Impostazioni", + "@settings": { + "type": "String", + "placeholders": {} + }, + "share": "Condividi", + "@share": { + "type": "String", + "placeholders": {} + }, + "sharedTheLocation": "{username} ha condiviso la sua posizione", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "showPassword": "Mostra la password", + "@showPassword": { + "type": "String", + "placeholders": {} + }, + "skip": "Ignora", + "@skip": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "Codice sorgente", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "startedACall": "{senderName} ha iniziato una chiamata", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "status": "Stato", + "@status": { + "type": "String", + "placeholders": {} + }, + "statusExampleMessage": "Come stai oggi?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "submit": "Invia", + "@submit": { + "type": "String", + "placeholders": {} + }, + "systemTheme": "Sistema", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "Non corrispondono", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "Corrispondono", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "title": "FluffyChat", + "@title": { + "description": "Title for the application", + "type": "String", + "placeholders": {} + }, + "toggleFavorite": "Attiva/disattiva preferito", + "@toggleFavorite": { + "type": "String", + "placeholders": {} + }, + "toggleMuted": "Attiva/disattiva il silenziatore", + "@toggleMuted": { + "type": "String", + "placeholders": {} + }, + "toggleUnread": "Segna come letto / non letto", + "@toggleUnread": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "Troppe richieste. Per favore riprova più tardi!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "transferFromAnotherDevice": "Trasferimento da un altro dispositivo", + "@transferFromAnotherDevice": { + "type": "String", + "placeholders": {} + }, + "tryToSendAgain": "Prova a inviare di nuovo", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "unavailable": "Non disponibile", + "@unavailable": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username} ha rimosso il bando di {targetName}", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "unblockDevice": "Sblocca il dispositivo", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "Dispositivo sconosciuto", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "unknownEncryptionAlgorithm": "Algoritmo di crittografia sconosciuto", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unknownEvent": "Evento sconosciuto '{type}'", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "unmuteChat": "Riattiva l'audio della discussione", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "unpin": "Rimuovi", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "unreadChats": "{unreadCount, plural, =1{1 discussione non letta} other{{unreadCount} discussioni non lette}}", + "@unreadChats": { + "type": "String", + "placeholders": { + "unreadCount": { + "type": "int" + } + } + }, + "userAndOthersAreTyping": "{username} e {count} altri stanno scrivendo…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "userAndUserAreTyping": "{username} e {username2} stanno scrivendo…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userIsTyping": "{username} sta scrivendo…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userLeftTheChat": "🚪 {username} ha abbandonato la chat", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "username": "Nome utente", + "@username": { + "type": "String", + "placeholders": {} + }, + "userSentUnknownEvent": "{username} ha inviato un evento {type}", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "verified": "Verificato", + "@verified": { + "type": "String", + "placeholders": {} + }, + "verify": "Verifica", + "@verify": { + "type": "String", + "placeholders": {} + }, + "verifyStart": "Avvia la verifica", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "Hai verificato con successo!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "verifyTitle": "Verifica dell'altro account", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "videoCall": "Videochiamata", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "Visibilità della cronologia della discussione", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "Visibile a tutti i partecipanti", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "Visibile a tutti", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "Messaggio vocale", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "In attesa che il partner accetti la richiesta…", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "In attesa che il partner accetti l'emoji…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "In attesa che il partner accetti i numeri…", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "wallpaper": "Immagine di sfondo:", + "@wallpaper": { + "type": "String", + "placeholders": {} + }, + "warning": "Attenzione!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "weSentYouAnEmail": "Ti abbiamo inviato un'e-mail", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "whoCanPerformWhichAction": "Chi può eseguire quale azione", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "Chi è autorizzato a unirsi a questo gruppo", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "Perché vuoi segnalarlo?", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "wipeChatBackup": "Cancellare il backup della discussione per creare una nuova chiave di ripristino?", + "@wipeChatBackup": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "Con questi indirizzi puoi recuperare la tua password se necessario.", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "Scrivi un messaggio…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "yes": "Sì", + "@yes": { + "type": "String", + "placeholders": {} + }, + "you": "Tu", + "@you": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "Non stai più partecipando a questa chat", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "Sei stato/a bandito/a da questa chat", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "yourPublicKey": "La tua chiave pubblica", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "singlesignon": "Accesso singolo", + "@singlesignon": { + "type": "String", + "placeholders": {} + }, + "setAsCanonicalAlias": "Imposta come alias principale", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "removeYourAvatar": "Rimuovi il tuo avatar", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "register": "Registrati", + "@register": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPin": "Per favore inserisci il tuo PIN", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "pleaseChoose": "Si prega di scegliere", + "@pleaseChoose": { + "type": "String", + "placeholders": {} + }, + "or": "O", + "@or": { + "type": "String", + "placeholders": {} + }, + "oopsPushError": "Ops! Purtroppo si è verificato un errore durante l'impostazione delle notifiche push.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "editRoomAliases": "Modifica gli alias della stanza", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "clearArchive": "Cancella archivio", + "@clearArchive": {}, + "changeYourAvatar": "Cambia il tuo avatar", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "allChats": "Tutte le chat", + "@allChats": { + "type": "String", + "placeholders": {} + }, + "addToSpace": "Aggiungi a uno spazio", + "@addToSpace": {}, + "commandHint_leave": "Abbandona questa stanza", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_ban": "Banna l'utente specificato da questa stanza", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "sendSticker": "Invia adesivo", + "@sendSticker": { + "type": "String", + "placeholders": {} + }, + "commandHint_html": "Invia testo formattato in HTML", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_plain": "Invia testo non formattato", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_send": "Invia testo", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "locationDisabledNotice": "I servizi di localizzazione sono disabilitati. Per favore abilitali per poter condividere la tua posizione.", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "saveFile": "Salva file", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "serverRequiresEmail": "Questo server ha bisogno di validare la tua email per la registrazione.", + "@serverRequiresEmail": {}, + "openInMaps": "Apri in maps", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "scanQrCode": "Scansiona codice QR", + "@scanQrCode": {}, + "addAccount": "Aggiungi account", + "@addAccount": {}, + "unverified": "Non verificato", + "@unverified": {}, + "sendAsText": "Invia come testo", + "@sendAsText": { + "type": "String" + }, + "repeatPassword": "Ripeti password", + "@repeatPassword": {}, + "autoplayImages": "Riproduci automaticamente adesivi ed emote animati", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "cantOpenUri": "Impossibile aprire l'URI {uri}", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "commandInvalid": "Comando non valido", + "@commandInvalid": { + "type": "String" + }, + "link": "Link", + "@link": {}, + "shareLocation": "Condividi posizione", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "yourChatBackupHasBeenSetUp": "Il tuo backup delle chat è stato configurato.", + "@yourChatBackupHasBeenSetUp": {}, + "hugContent": "{senderName} ti abbraccia", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "jumpToLastReadMessage": "Salta all'ultimo messaggio letto", + "@jumpToLastReadMessage": {}, + "allRooms": "Tutte le chat di gruppo", + "@allRooms": { + "type": "String", + "placeholders": {} + }, + "obtainingLocation": "Ottengo la posizione…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "commandHint_cuddle": "Invia una coccola", + "@commandHint_cuddle": {}, + "widgetVideo": "Video", + "@widgetVideo": {}, + "dismiss": "Chiudi", + "@dismiss": {}, + "reportErrorDescription": "😭 Oh no. Qualcosa è andato storto. Se vuoi, puoi segnalare questo bug agli sviluppatori.", + "@reportErrorDescription": {}, + "chatHasBeenAddedToThisSpace": "La chat è stata aggiunta a questo spazio", + "@chatHasBeenAddedToThisSpace": {}, + "unsupportedAndroidVersion": "Versione di Android non supportata", + "@unsupportedAndroidVersion": {}, + "widgetJitsi": "Jitsi Meet", + "@widgetJitsi": {}, + "messageType": "Tipo del Messaggio", + "@messageType": {}, + "indexedDbErrorLong": "Sfortunatamente l'archiviazione dei messaggi non è abilitata in modalità privata per impostazione predefinita.\nPer favore visita\n - about:config\n - imposta dom.indexedDB.privateBrowsing.enabled su true\nAltrimenti, non è possibile eseguire FluffyChat.", + "@indexedDbErrorLong": {}, + "oneClientLoggedOut": "Uno dei tuoi client è stato disconnesso", + "@oneClientLoggedOut": {}, + "startFirstChat": "Inizia la tua prima chat", + "@startFirstChat": {}, + "callingAccount": "Account di chiamata", + "@callingAccount": {}, + "setColorTheme": "Imposta tema colore:", + "@setColorTheme": {}, + "nextAccount": "Account successivo", + "@nextAccount": {}, + "commandHint_create": "Crea una chat di gruppo vuota\nUtilizza --no-encryption per disattivare la criptazione", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "allSpaces": "Tutti gli spazi", + "@allSpaces": {}, + "supposedMxid": "Dovrebbe essere {mxid}", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "user": "Utente", + "@user": {}, + "youAcceptedTheInvitation": "👍 Hai accettato l'invito", + "@youAcceptedTheInvitation": {}, + "noMatrixServer": "{server1} non è un server matrix, vuoi invece usare {server2}?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "youInvitedBy": "📩 Sei stato invitato/a da {user}", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "banUserDescription": "L'utente sarà bannato dalla chat e non sarà in grado di rientrare finché non verrà sbannato.", + "@banUserDescription": {}, + "widgetEtherpad": "Nota di testo", + "@widgetEtherpad": {}, + "removeDevicesDescription": "Sarai disconnesso da questo dispositivo e non potrai più ricevere messaggi.", + "@removeDevicesDescription": {}, + "separateChatTypes": "Separare le chat dirette e i gruppi", + "@separateChatTypes": { + "type": "String", + "placeholders": {} + }, + "tryAgain": "Riprova", + "@tryAgain": {}, + "youKickedAndBanned": "🙅 Hai rimosso e bannato {user}", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "unbanUserDescription": "L'utente potrà rientrare nella chat.", + "@unbanUserDescription": {}, + "sendOnEnter": "Invia quando premi Invio", + "@sendOnEnter": {}, + "youRejectedTheInvitation": "Hai rifiutato l'invito", + "@youRejectedTheInvitation": {}, + "otherCallingPermissions": "Microfono, fotocamera e altri permessi di FluffyChat", + "@otherCallingPermissions": {}, + "messagesStyle": "Messaggi:", + "@messagesStyle": {}, + "widgetUrlError": "Questo non è un URL valido.", + "@widgetUrlError": {}, + "emailOrUsername": "Email o nome utente", + "@emailOrUsername": {}, + "newSpaceDescription": "Gli spazi ti permettono di consolidare le tue chat e di creare comunità private o pubbliche.", + "@newSpaceDescription": {}, + "chatDescription": "Descrizione della chat", + "@chatDescription": {}, + "callingAccountDetails": "Dai l'autorizzazione a FluffyChat di usare l'app di composizione Android nativa.", + "@callingAccountDetails": {}, + "enterSpace": "Unirsi allo spazio", + "@enterSpace": {}, + "encryptThisChat": "Cifra questa chat", + "@encryptThisChat": {}, + "previousAccount": "Account precedente", + "@previousAccount": {}, + "reopenChat": "Riapri la chat", + "@reopenChat": {}, + "pleaseEnterRecoveryKey": "Per favore inserisci la tua chiave di recupero:", + "@pleaseEnterRecoveryKey": {}, + "widgetNameError": "Per favore fornire un nome da visualizzare.", + "@widgetNameError": {}, + "addToBundle": "Aggiungi al bundle", + "@addToBundle": {}, + "spaceIsPublic": "Lo spazio è pubblico", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "addWidget": "Aggiungi widget", + "@addWidget": {}, + "countFiles": "{count} file", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "noKeyForThisMessage": "Questo può accadere se il messaggio è stato inviato prima che hai fatto l'accesso in questo dispositivo.\n\nÈ anche possibile che il mittente abbia bloccato il tuo dispositivo o che qualcosa sia andato storto con la tua connessione ad internet.\n\nSei in grado di leggere il messaggio su altre sessioni? Allora puoi trasferire il messaggio da lì! Vai su Impostazioni > Dispositivi e verifica che i tuoi dispositivi siano verificati l'un l'altro. Quando aprirai la stanza la prossima volta ed entrambe le sessioni sono in primo piano, le chiavi saranno trasmesse automaticamente.\n\nNon vuoi perdere le chiavi quando ti disconnetti o cambi dispositivo? Assicurati di aver attivato il backup delle chat nelle impostazioni.", + "@noKeyForThisMessage": {}, + "commandHint_markasgroup": "Segna come gruppo", + "@commandHint_markasgroup": {}, + "errorObtainingLocation": "Errore cercando di ottenere la posizione: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "hydrateTor": "Utenti TOR: Importa l'esportazione della sessione", + "@hydrateTor": {}, + "pushNotificationsNotAvailable": "Notifiche push non disponibili", + "@pushNotificationsNotAvailable": {}, + "storeInAppleKeyChain": "Salva nel portachiavi di Apple", + "@storeInAppleKeyChain": {}, + "hydrate": "Ripristina dal file di backup", + "@hydrate": {}, + "invalidServerName": "Nome server non valido", + "@invalidServerName": {}, + "chatPermissions": "Permessi della chat", + "@chatPermissions": {}, + "sender": "Mittente", + "@sender": {}, + "storeInAndroidKeystore": "Salva nel KeyStore di Android", + "@storeInAndroidKeystore": {}, + "signInWithPassword": "Accedi con la password", + "@signInWithPassword": {}, + "makeAdminDescription": "Una volta che fai questo utente amministratore, potresti non essere in grado di rimuoverlo, in quanto avrà i tuoi stessi privilegi.", + "@makeAdminDescription": {}, + "synchronizingPleaseWait": "Sincronizzazione... Attendere prego.", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "commandHint_clearcache": "Pulisci cache", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "saveKeyManuallyDescription": "Salva questa chiave manualmente attivando la finestra di condivisione o gli appunti.", + "@saveKeyManuallyDescription": {}, + "editBundlesForAccount": "Modifica i bundle per questo account", + "@editBundlesForAccount": {}, + "whyIsThisMessageEncrypted": "Perché questo messaggio è illeggibile?", + "@whyIsThisMessageEncrypted": {}, + "setChatDescription": "Imposta la descrizione della chat", + "@setChatDescription": {}, + "spaceName": "Nome dello spazio", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "importFromZipFile": "Importa da file .zip", + "@importFromZipFile": {}, + "dehydrateWarning": "Questa azione non può essere annullata. Assicurarsi di aver salvato il file di backup.", + "@dehydrateWarning": {}, + "noOtherDevicesFound": "Nessun altro dispositivo trovato", + "@noOtherDevicesFound": {}, + "redactedBy": "Rimosso da {username}", + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "videoCallsBetaWarning": "Nota che le video chiamate sono attualmente in beta. Potrebbero non funzionare come previsto o non funzionare del tutto su alcune piattaforme.", + "@videoCallsBetaWarning": {}, + "signInWith": "Accedi con {provider}", + "@signInWith": { + "type": "String", + "placeholders": { + "provider": { + "type": "String" + } + } + }, + "fileIsTooBigForServer": "Impossibile inviare! Il server supporta solo allegati fino a {max}.", + "@fileIsTooBigForServer": {}, + "homeserver": "Homeserver", + "@homeserver": {}, + "callingPermissions": "Permessi di chiamata", + "@callingPermissions": {}, + "readUpToHere": "Letto fino a qui", + "@readUpToHere": {}, + "start": "Inizio", + "@start": {}, + "unlockOldMessages": "Sblocca i vecchi messaggi", + "@unlockOldMessages": {}, + "numChats": "{number} chat", + "@numChats": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "optionalRedactReason": "(Opzionale) Ragione per rimuovere questo messaggio...", + "@optionalRedactReason": {}, + "dehydrate": "Esporta la sessione e cancella il dispositivo", + "@dehydrate": {}, + "locationPermissionDeniedNotice": "Permesso per accedere alla posizione negato. Per favore concedilo per essere in grado di condividere la tua posizione.", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "archiveRoomDescription": "Questa chat sarà archiviata. Gli altri utenti saranno in grado di vedere che hai abbandonato la chat.", + "@archiveRoomDescription": {}, + "exportEmotePack": "Esporta pack di Emote come .zip", + "@exportEmotePack": {}, + "switchToAccount": "Passa all'account {number}", + "@switchToAccount": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "experimentalVideoCalls": "Video chiamate sperimentali", + "@experimentalVideoCalls": {}, + "pleaseEnterRecoveryKeyDescription": "Per sbloccare i tuoi vecchi messaggi, per favore inserisci la tua chiave di recupero che è stata generata nella tua sessione precedente. La tua chiave di recupero NON è la tua password.", + "@pleaseEnterRecoveryKeyDescription": {}, + "inviteContactToGroupQuestion": "Vuoi invitare {contact} nella chat \"{groupName}\"?", + "@inviteContactToGroupQuestion": {}, + "redactedByBecause": "Rimosso da {username} per: \"{reason}\"", + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "youHaveWithdrawnTheInvitationFor": "Hai revocato l'invito per {user}", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "appearOnTopDetails": "Permetti all'app di apparire in alto (non necessario se hai già impostato Fluffychat come account di chiamata)", + "@appearOnTopDetails": {}, + "enterRoom": "Unirsi alla stanza", + "@enterRoom": {}, + "reportUser": "Segnala utente", + "@reportUser": {}, + "confirmEventUnpin": "Sei sicuro di voler permanentemente sfissare l'evento?", + "@confirmEventUnpin": {}, + "youInvitedUser": "📩 Hai invitato {user}", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "fileHasBeenSavedAt": "Il file è stato salvato in {path}", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "commandMissing": "{command} non è un comando.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "redactMessageDescription": "Questo messaggio sarà rimosso per tutti i partecipanti di questa conversazione. Questa operazione non può essere annullata.", + "@redactMessageDescription": {}, + "recoveryKey": "Chiave di recupero", + "@recoveryKey": {}, + "commandHint_discardsession": "Scarta sessione", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "invalidInput": "Contenuto non valido!", + "@invalidInput": {}, + "dehydrateTorLong": "Per gli utenti TOR, è raccomandato esportare la sessione prima di chiudere la finestra.", + "@dehydrateTorLong": {}, + "commandHint_myroomnick": "Imposta il nome visualizzato per questa stanza", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "doNotShowAgain": "Non mostrare più", + "@doNotShowAgain": {}, + "report": "segnala", + "@report": {}, + "hideUnimportantStateEvents": "Nascondi gli eventi di stato non importanti", + "@hideUnimportantStateEvents": {}, + "screenSharingTitle": "condivisione schermo", + "@screenSharingTitle": {}, + "widgetCustom": "Personalizzati", + "@widgetCustom": {}, + "addToSpaceDescription": "Seleziona una spazio a cui aggiungere questa chat.", + "@addToSpaceDescription": {}, + "googlyEyesContent": "{senderName} ti ha inviato degli occhi finti", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "youBannedUser": "Hai bannato {user}", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "addChatDescription": "Aggiungi una descrizione chat...", + "@addChatDescription": {}, + "commandHint_myroomavatar": "Importa la foto profilo per questa stanza ( mxc-uri)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "hasKnocked": "🚪 {user} ha bussato", + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "publish": "Pubblicare", + "@publish": {}, + "openLinkInBrowser": "Apri il collegamento nel browser", + "@openLinkInBrowser": {}, + "commandHint_react": "Rispondi con una reazione", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "commandHint_me": "Descriviti", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "messageInfo": "Informazioni del messaggio", + "@messageInfo": {}, + "disableEncryptionWarning": "Per motivi di sicurezza non puoi disabilitare la crittografia in una chat, se era stata abilitata in precedenza.", + "@disableEncryptionWarning": {}, + "directChat": "Chat diretta", + "@directChat": {}, + "wrongPinEntered": "È stato inserito il pin sbagliato! Riprova tra {seconds} secondi...", + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "sendTypingNotifications": "Invia notifiche di scrittura", + "@sendTypingNotifications": {}, + "inviteGroupChat": "📨 Invita a una chat di gruppo", + "@inviteGroupChat": {}, + "appearOnTop": "Appare in alto", + "@appearOnTop": {}, + "invitePrivateChat": "📨 Invita a una chat privata", + "@invitePrivateChat": {}, + "foregroundServiceRunning": "Questa notifica viene mostrata quando il servizio in primo piano è in esecuzione.", + "@foregroundServiceRunning": {}, + "voiceCall": "Chiamata vocale", + "@voiceCall": {}, + "commandHint_kick": "Rimuovi l'utente fornito da questa stanza", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "createNewSpace": "Nuovo spazio", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "commandHint_unban": "Sbanna l'utente fornito da questa stanza", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "importEmojis": "Importa Emoji", + "@importEmojis": {}, + "wasDirectChatDisplayName": "Chat vuota (era {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "noChatDescriptionYet": "La descrizione della chat non è ancora stata creata.", + "@noChatDescriptionYet": {}, + "removeFromBundle": "Rimuovi da questo bundle", + "@removeFromBundle": {}, + "confirmMatrixId": "Per eliminare il tuo account, conferma il tuo Matrix ID.", + "@confirmMatrixId": {}, + "learnMore": "Scopri di più", + "@learnMore": {}, + "notAnImage": "Non è un file immagine.", + "@notAnImage": {}, + "users": "Utenti", + "@users": {}, + "openGallery": "Apri la galleria", + "@openGallery": {}, + "chatDescriptionHasBeenChanged": "Descrizione della chat cambiata", + "@chatDescriptionHasBeenChanged": {}, + "newGroup": "Nuovo gruppo", + "@newGroup": {}, + "bundleName": "Nome del bundle", + "@bundleName": {}, + "dehydrateTor": "Utenti TOR: Esporta la sessione", + "@dehydrateTor": {}, + "removeFromSpace": "Rimuovi dallo spazio", + "@removeFromSpace": {}, + "commandHint_op": "Imposta il livello di privilegi dell'utente specificato (predefinito: 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_join": "Unisciti alla stanza fornita", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "roomUpgradeDescription": "Questa chat sarà ricreata con la nuova versione della stanza. Tutti i partecipanti saranno avvertiti che devono passare alla nuova chat. Puoi leggere di più riguardo le versioni delle stanze su https://spec.matrix.org/latest/rooms/", + "@roomUpgradeDescription": {}, + "commandHint_invite": "Invia l utente fornito in questa stanza", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "pleaseEnterANumber": "Per favore inserisci un numero maggiore di 0", + "@pleaseEnterANumber": {}, + "youKicked": "👞 Hai rimosso {user}", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "profileNotFound": "Impossibile trovare l'utente sul server. Forse c'è un problema di connessione oppure l'utente non esiste.", + "@profileNotFound": {}, + "jump": "Salta", + "@jump": {}, + "reactedWith": "{sender} ha reagito con {reaction}", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "sorryThatsNotPossible": "Scusa... questo non è possibile", + "@sorryThatsNotPossible": {}, + "videoWithSize": "Video ({size})", + "@videoWithSize": { + "type": "String", + "placeholders": { + "size": { + "type": "String" + } + } + }, + "shareInviteLink": "Condividi link d'invito", + "@shareInviteLink": {}, + "commandHint_markasdm": "Contrassegna questo Matrix ID come stanza di messaggi diretti", + "@commandHint_markasdm": {}, + "recoveryKeyLost": "Chiave di recupero smarrita?", + "@recoveryKeyLost": {}, + "cuddleContent": "{senderName} ti coccola", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "deviceKeys": "Chiavi del dispositivo:", + "@deviceKeys": {}, + "emoteKeyboardNoRecents": "Le emoticon recentemente usate appariranno qui...", + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "setTheme": "Imposta tema:", + "@setTheme": {}, + "youJoinedTheChat": "Sei entrato/a nella chat", + "@youJoinedTheChat": {}, + "openVideoCamera": "Apri la fotocamera per un video", + "@openVideoCamera": { + "type": "String", + "placeholders": {} + }, + "markAsRead": "Segna come letto", + "@markAsRead": {}, + "widgetName": "Nome", + "@widgetName": {}, + "errorAddingWidget": "Errore aggiungendo il widget.", + "@errorAddingWidget": {}, + "commandHint_dm": "Avvia una chat diretta\nUsa --no-encryption per disabilitare la crittografia", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "commandHint_hug": "Invia un abbraccio", + "@commandHint_hug": {}, + "replace": "Sostituisci", + "@replace": {}, + "youUnbannedUser": "Hai sbannato {user}", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "newSpace": "Nuovo spazio", + "@newSpace": {}, + "emojis": "Emoji", + "@emojis": {}, + "commandHint_googly": "Invia degli occhi finti", + "@commandHint_googly": {}, + "pleaseTryAgainLaterOrChooseDifferentServer": "Per favore riprova più tardi o scegli un server diverso.", + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "createGroup": "Crea gruppo", + "@createGroup": {}, + "hydrateTorLong": "Hai esportato la tua sessione l'ultima volta con TOR? Importala velocemente e continua a chattare.", + "@hydrateTorLong": {}, + "time": "Tempo", + "@time": {}, + "custom": "Personalizzato", + "@custom": {}, + "noBackupWarning": "Attenzione! Senza abilitare il backup della chat, perderai l'accesso ai tuoi messaggi crittografati. Si consiglia vivamente di abilitare il backup della chat prima di disconnettersi.", + "@noBackupWarning": {}, + "storeInSecureStorageDescription": "Salva la chiave di recupero nell'archivio sicuro di questo dispositivo.", + "@storeInSecureStorageDescription": {}, + "openChat": "Apri la Chat", + "@openChat": {}, + "kickUserDescription": "L'utente è stato rimosso, ma non bannato. Nelle chat pubbliche, l'utente potrà rientrare quando vuole.", + "@kickUserDescription": {}, + "importNow": "Importa ora", + "@importNow": {}, + "pinMessage": "Fissa alla stanza", + "@pinMessage": {}, + "invite": "Invitare", + "@invite": {}, + "enableMultiAccounts": "(BETA) Abilita account multipli su questo dispositivo", + "@enableMultiAccounts": {}, + "indexedDbErrorTitle": "Problemi con la modalità privata", + "@indexedDbErrorTitle": {}, + "unsupportedAndroidVersionLong": "Questa funzionalità richiede una versione di Android più recente. Si prega di verificare la presenza di aggiornamenti o supporto per Lineage OS.", + "@unsupportedAndroidVersionLong": {}, + "storeSecurlyOnThisDevice": "Salva in modo sicuro su questo dispositivo", + "@storeSecurlyOnThisDevice": {}, + "screenSharingDetail": "Stai condividendo il tuo schermo in FuffyChat", + "@screenSharingDetail": {}, + "placeCall": "Fai una chiamata", + "@placeCall": {}, + "blockListDescription": "Puoi bloccare gli utenti che ti disturbano. Non sarai più in grado di ricevere messaggi o inviti alle stanze dalle persone che hai bloccato.", + "@blockListDescription": {}, + "blockedUsers": "Utenti bloccati", + "@blockedUsers": {}, + "blockUsername": "Nome utente da ignorare", + "@blockUsername": {}, + "createGroupAndInviteUsers": "Crea un gruppo e invita gli utenti", + "@createGroupAndInviteUsers": {}, + "startConversation": "Inizia una conversazione", + "@startConversation": {}, + "groupCanBeFoundViaSearch": "Il gruppo può essere cercato", + "@groupCanBeFoundViaSearch": {}, + "noUsersFoundWithQuery": "Sfortunatamente non è stato trovato nessun utente con \"{query}\". Per favore controlla se hai fatto un errore di battitura.", + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "block": "Blocca", + "@block": {}, + "yourGlobalUserIdIs": "Il tuo ID dell'utente globale è: ", + "@yourGlobalUserIdIs": {}, + "commandHint_sendraw": "Manda un json grezzo", + "@commandHint_sendraw": {}, + "wrongRecoveryKey": "Mi dispiace... questa non sembra essere la chiave di recupero corretta.", + "@wrongRecoveryKey": {}, + "groupName": "Nome gruppo", + "@groupName": {}, + "databaseMigrationTitle": "Il database è ottimizzato", + "@databaseMigrationTitle": {}, + "searchChatsRooms": "Cerca per #chat, @utenti...", + "@searchChatsRooms": {}, + "databaseMigrationBody": "Attendere prego. L'operazione potrebbe richiedere un momento.", + "@databaseMigrationBody": {}, + "youInvitedToBy": "📩 Sei stato invitato tramite link in:\n{alias}", + "@youInvitedToBy": { + "placeholders": { + "alias": { + "type": "String" + } + } + }, + "addChatOrSubSpace": "Aggiungi chat o sottospazio", + "@addChatOrSubSpace": {}, + "subspace": "Sottospazio", + "@subspace": {}, + "publicSpaces": "Spazio pubblico", + "@publicSpaces": {}, + "hidePresences": "Nascondere l'elenco degli stati?", + "@hidePresences": {}, + "pleaseEnterYourCurrentPassword": "Per favore inserisci la tua password attuale", + "@pleaseEnterYourCurrentPassword": {}, + "passwordIsWrong": "La password inserita è sbagliata", + "@passwordIsWrong": {}, + "databaseBuildErrorBody": "Impossibile costruire il database SQlite. L'applicazione proverà ad usare il database legacy per ora. Per favore segnala questo errore agli sviluppatori su {url}. Il messaggio di errore è: {error}", + "@databaseBuildErrorBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "select": "Seleziona", + "@select": {}, + "newPassword": "Nuova password", + "@newPassword": {}, + "pleaseChooseAStrongPassword": "Per favore scegli una password forte", + "@pleaseChooseAStrongPassword": {}, + "thisDevice": "Questo dispositivo:", + "@thisDevice": {}, + "forwardMessageTo": "Inoltra messaggio in {roomName}?", + "@forwardMessageTo": { + "type": "String", + "placeholders": { + "roomName": { + "type": "String" + } + } + }, + "verifyOtherUser": "🔐 Verifica altro utente", + "@verifyOtherUser": {}, + "verifyOtherUserDescription": "Se verifichi un altro utente, puoi essere certo di sapere a chi stai realmente scrivendo. 💪\n\nQuando inizi una verifica, tu e l'altro utente vedrete un popup nell'app. Lì vedrai una serie di emoji o numeri che dovrai confrontare tra loro.\n\nIl modo migliore per farlo è incontrarsi o avviare una videochiamata. 👭", + "@verifyOtherUserDescription": {}, + "verifyOtherDevice": "🔐 Verifica altro dispositivo", + "@verifyOtherDevice": {}, + "verifyOtherDeviceDescription": "Quando verifichi un altro dispositivo, questi dispositivi possono scambiarsi le chiavi, aumentando la tua sicurezza complessiva. 💪 Quando inizi una verifica, apparirà un popup nell'app su entrambi i dispositivi. Lì vedrai una serie di emoji o numeri che dovrai confrontare tra loro. È meglio avere entrambi i dispositivi a portata di mano prima di iniziare la verifica. 🤳", + "@verifyOtherDeviceDescription": {}, + "discover": "Scopri", + "@discover": {}, + "presencesToggle": "Mostra i messaggi di stato di altri utenti", + "@presencesToggle": { + "type": "String", + "placeholders": {} + }, + "publicLink": "Link pubblico", + "@publicLink": {}, + "leaveEmptyToClearStatus": "Lascia vuoto per cancellare il tuo stato.", + "@leaveEmptyToClearStatus": {}, + "decline": "Declina", + "@decline": {}, + "transparent": "Trasparente", + "@transparent": {}, + "incomingMessages": "Messaggi in arrivo", + "@incomingMessages": {}, + "noChatsFoundHere": "Nessuna chat trovata. Inizia una nuova chat con qualcuno usando il pulsante qui sotto. ⤵️", + "@noChatsFoundHere": {}, + "joinedChats": "Chat a cui partecipi", + "@joinedChats": {}, + "unread": "Non letti", + "@unread": {}, + "space": "Spazio", + "@space": {}, + "spaces": "Spazi", + "@spaces": {}, + "notifyMeFor": "Avvisami per", + "@notifyMeFor": {}, + "invitedBy": "📩 Invitato da {user}", + "@invitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "knock": "Bussa", + "@knock": {}, + "hideInvalidOrUnknownMessageFormats": "Nascondi formati di messaggi non validi o sconosciuti", + "@hideInvalidOrUnknownMessageFormats": {}, + "overview": "Panoramica", + "@overview": {}, + "presenceStyle": "Presenza:", + "@presenceStyle": { + "type": "String", + "placeholders": {} + }, + "swipeRightToLeftToReply": "Scorri da destra a sinistra per rispondere", + "@swipeRightToLeftToReply": {}, + "globalChatId": "ID chat globale", + "@globalChatId": {}, + "hideMemberChangesInPublicChats": "Nascondi le modifiche dei membri nelle chat pubbliche", + "@hideMemberChangesInPublicChats": {}, + "hideMemberChangesInPublicChatsBody": "Per migliorare la leggibilità, non mostrare nella cronologia della chat se qualcuno si unisce o abbandona una chat pubblica.", + "@hideMemberChangesInPublicChatsBody": {}, + "userWouldLikeToChangeTheChat": "{user} vorrebbe unirsi alla chat.", + "@userWouldLikeToChangeTheChat": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "noPublicLinkHasBeenCreatedYet": "Non è stato ancora creato alcun link pubblico", + "@noPublicLinkHasBeenCreatedYet": {}, + "appLockDescription": "Blocca l'app con un codice PIN quando non è in uso", + "@appLockDescription": {}, + "noOneCanJoin": "Nessuno può unirsi", + "@noOneCanJoin": {}, + "usersMustKnock": "Gli utenti devono bussare", + "@usersMustKnock": {}, + "alwaysUse24HourFormat": "disattivato", + "@alwaysUse24HourFormat": { + "description": "Set to true to always display time of day in 24 hour format." + }, + "accessAndVisibility": "Accesso e visibilità", + "@accessAndVisibility": {}, + "accessAndVisibilityDescription": "Chi è autorizzato a partecipare a questa chat e come è possibile scoprirla.", + "@accessAndVisibilityDescription": {}, + "calls": "Chiamate", + "@calls": {}, + "customEmojisAndStickers": "Emoji e adesivi personalizzati", + "@customEmojisAndStickers": {}, + "customEmojisAndStickersBody": "Aggiungi o condividi emoji o adesivi personalizzati che possono essere utilizzati in qualsiasi chat.", + "@customEmojisAndStickersBody": {}, + "hideRedactedMessages": "Mostra i messaggi rimossi", + "@hideRedactedMessages": {}, + "hideRedactedMessagesBody": "Se qualcuno rimuove un messaggio, il messaggio non sarà più visibile nella chat.", + "@hideRedactedMessagesBody": {}, + "passwordRecoverySettings": "Impostazioni di recupero password", + "@passwordRecoverySettings": {}, + "noMoreChatsFound": "Non sono state trovate altre chat...", + "@noMoreChatsFound": {}, + "countChatsAndCountParticipants": "{chats} chat e {participants} partecipanti", + "@countChatsAndCountParticipants": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + }, + "participants": { + "type": "int" + } + } + }, + "stickers": "Adesivi", + "@stickers": {}, + "searchMore": "Cerca di più...", + "@searchMore": {}, + "sessionLostBody": "La tua sessione è andata persa. Segnala questo errore agli sviluppatori all'indirizzo {url}. Il messaggio di errore è: {error}", + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "formattedMessagesDescription": "Visualizza contenuti di messaggi complessi, come testo in grassetto, utilizzando il markdown.", + "@formattedMessagesDescription": {}, + "canceledKeyVerification": "{sender} ha annullato la verifica della chiave", + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "chatPermissionsDescription": "Definisci quale livello di privilegi è necessario per determinate azioni in questa chat. I livelli di privilegi 0, 50 e 100 rappresentano solitamente utenti, moderatori e amministratori, ma qualsiasi valore intermedio è possibile.", + "@chatPermissionsDescription": {}, + "passwordsDoNotMatch": "Le password non corrispondono", + "@passwordsDoNotMatch": {}, + "initAppError": "Si è verificato un errore durante l'inizializzazione dell'app", + "@initAppError": {}, + "startedKeyVerification": "{sender} ha avviato la verifica della chiave", + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "chatCanBeDiscoveredViaSearchOnServer": "La chat può essere trovata tramite la ricerca su {server}", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "unreadChatsInApp": "{appname}: {unread} chat non lette", + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "thereAreCountUsersBlocked": "Al momento ci sono {count} utenti bloccati.", + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "nothingFound": "Non è stato trovato nulla...", + "@nothingFound": {}, + "joinSpace": "Unisciti allo spazio", + "@joinSpace": {}, + "commandHint_ignore": "Ignora il Matrix ID fornito", + "@commandHint_ignore": {}, + "commandHint_unignore": "Ignora il Matrix ID specificato", + "@commandHint_unignore": {}, + "noDatabaseEncryption": "La crittografia del database non è supportata su questa piattaforma", + "@noDatabaseEncryption": {}, + "knocking": "Bussare", + "@knocking": {}, + "sendReadReceipts": "Invia ricevute di lettura", + "@sendReadReceipts": {}, + "knockRestricted": "Limitato al bussare", + "@knockRestricted": {}, + "restricted": "Limitato", + "@restricted": {}, + "publicChatAddresses": "Indirizzi di chat pubblici", + "@publicChatAddresses": {}, + "createNewAddress": "Crea un nuovo indirizzo", + "@createNewAddress": {}, + "userRole": "Ruolo utente", + "@userRole": {}, + "minimumPowerLevel": "{level} è il livello minimo di privilegi.", + "@minimumPowerLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "String" + } + } + }, + "searchIn": "Cerca nella chat \"{chat}\"...", + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "gallery": "Galleria", + "@gallery": {}, + "formattedMessages": "Messaggi formattati", + "@formattedMessages": {}, + "files": "File", + "@files": {}, + "restoreSessionBody": "L'app ora tenta di ripristinare la sessione dal backup. Segnala questo errore agli sviluppatori all'indirizzo {url}. Il messaggio di errore è: {error}", + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "acceptedKeyVerification": "{sender} ha accettato la verifica della chiave", + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "completedKeyVerification": "{sender} ha completato la verifica della chiave", + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "isReadyForKeyVerification": "{sender} è pronto per la verifica della chiave", + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "searchForUsers": "Cerca @utenti...", + "@searchForUsers": {}, + "sendTypingNotificationsDescription": "Gli altri partecipanti alla chat possono vedere quando stai scrivendo un nuovo messaggio.", + "@sendTypingNotificationsDescription": {}, + "sendReadReceiptsDescription": "Gli altri partecipanti alla chat possono vedere quando hai letto un messaggio.", + "@sendReadReceiptsDescription": {}, + "requestedKeyVerification": "{sender} ha richiesto la verifica della chiave", + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "changeTheChatPermissions": "Cambia i permessi della chat", + "@changeTheChatPermissions": {}, + "changeTheVisibilityOfChatHistory": "Cambia la visibilità della cronologia chat", + "@changeTheVisibilityOfChatHistory": {}, + "changeTheCanonicalRoomAlias": "Cambia l'indirizzo principale della chat pubblica", + "@changeTheCanonicalRoomAlias": {}, + "sendRoomNotifications": "Invia notifiche alla @stanza", + "@sendRoomNotifications": {}, + "sendCanceled": "Invio annullato", + "@sendCanceled": {}, + "calculatingFileSize": "Calcolo della dimensione del file...", + "@calculatingFileSize": {}, + "prepareSendingAttachment": "Preparazione per l'invio dell'allegato...", + "@prepareSendingAttachment": {}, + "sendingAttachment": "Invio allegato...", + "@sendingAttachment": {}, + "compressVideo": "Compressione video...", + "@compressVideo": {}, + "generatingVideoThumbnail": "Generazione miniatura video...", + "@generatingVideoThumbnail": {}, + "sendingAttachmentCountOfCount": "Invio dell'allegato {index} di {length}...", + "@sendingAttachmentCountOfCount": { + "type": "integer", + "placeholders": { + "index": { + "type": "int" + }, + "length": { + "type": "int" + } + } + }, + "serverLimitReached": "Limite server raggiunto! Attendere {seconds} secondi...", + "@serverLimitReached": { + "type": "integer", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "oneOfYourDevicesIsNotVerified": "Uno dei tuoi dispositivi non è verificato", + "@oneOfYourDevicesIsNotVerified": {}, + "noticeChatBackupDeviceVerification": "Nota: quando colleghi tutti i tuoi dispositivi al backup della chat, vengono verificati automaticamente.", + "@noticeChatBackupDeviceVerification": {}, + "moderatorLevel": "{level} - Moderatore", + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "changeTheDescriptionOfTheGroup": "Cambia la descrizione della chat", + "@changeTheDescriptionOfTheGroup": {}, + "updateInstalled": "🎉 Aggiornamento {version} installato!", + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "inviteOtherUsers": "Invita altri utenti a questa chat", + "@inviteOtherUsers": {}, + "userLevel": "{level} - Utente", + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "adminLevel": "{level} - Amministratore", + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "changeGeneralChatSettings": "Modifica le impostazioni generali della chat", + "@changeGeneralChatSettings": {}, + "loginWithMatrixId": "Accedi con il Matrix ID", + "@loginWithMatrixId": {}, + "homeserverDescription": "Tutti i tuoi dati sono archiviati sull'homeserver, proprio come un provider di posta elettronica. Puoi scegliere quale homeserver vuoi usare, mentre puoi comunque comunicare con tutti. Scopri di più su https://matrix.org.", + "@homeserverDescription": {}, + "discoverHomeservers": "Scopri gli homeserver", + "@discoverHomeservers": {}, + "whatIsAHomeserver": "Cos'è un homeserver?", + "@whatIsAHomeserver": {}, + "changelog": "Registro delle modifiche", + "@changelog": {}, + "doesNotSeemToBeAValidHomeserver": "Non sembra essere un homeserver compatibile. URL sbagliato?", + "@doesNotSeemToBeAValidHomeserver": {}, + "goToSpace": "Vai allo spazio: {space}", + "@goToSpace": { + "type": "String", + "space": {} + }, + "markAsUnread": "Contrassegna come non letto", + "@markAsUnread": {}, + "compressBeforeSending": "Comprimi prima di inviare", + "@compressBeforeSending": {}, + "aboutHomeserver": "Informazioni su {homeserver}", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "continueText": "Continua", + "@continueText": {}, + "welcomeText": "Hey Hey 👋 Questa è FluffyChat. Puoi accedere a qualsiasi homeserver compatibile con https://matrix.org. E poi chattare con chiunque. È un'enorme rete di messaggistica decentralizzata!", + "@welcomeText": {}, + "blur": "Sfocatura:", + "@blur": {}, + "opacity": "Opacità:", + "@opacity": {}, + "setWallpaper": "Imposta sfondo", + "@setWallpaper": {}, + "manageAccount": "Gestisci account", + "@manageAccount": {}, + "noContactInformationProvided": "Il server non fornisce alcuna informazione di contatto valida", + "@noContactInformationProvided": {}, + "contactServerAdmin": "Contatta l'amministratore del server", + "@contactServerAdmin": {}, + "contactServerSecurity": "Contatta la sicurezza del server", + "@contactServerSecurity": {}, + "supportPage": "Pagina di supporto", + "@supportPage": {}, + "serverInformation": "Informazioni sul server:", + "@serverInformation": {}, + "name": "Nome", + "@name": {}, + "version": "Versione", + "@version": {}, + "website": "Sito web", + "@website": {}, + "sendUncompressed": "Invia non compresso", + "@sendUncompressed": {}, + "boldText": "Testo in grassetto", + "@boldText": {}, + "italicText": "Testo in corsivo", + "@italicText": {}, + "strikeThrough": "Barrato", + "@strikeThrough": {}, + "pleaseFillOut": "Si prega di compilare", + "@pleaseFillOut": {}, + "invalidUrl": "URL non valido", + "@invalidUrl": {}, + "addLink": "Aggiungi collegamento", + "@addLink": {}, + "unableToJoinChat": "Impossibile partecipare alla chat. Forse l'altra parte ha già chiuso la conversazione.", + "@unableToJoinChat": {}, + "sendImages": "Invia {count} immagine", + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "compress": "Comprimere", + "@compress": {}, + "contentNotificationSettings": "Impostazioni del contenuto di notifica", + "@contentNotificationSettings": {}, + "generalNotificationSettings": "Impostazioni di notifica generale", + "@generalNotificationSettings": {}, + "roomNotificationSettings": "Impostazioni di notifica della stanza", + "@roomNotificationSettings": {}, + "userSpecificNotificationSettings": "Impostazioni di notifica specifiche dell'utente", + "@userSpecificNotificationSettings": {}, + "otherNotificationSettings": "Altre impostazioni di notifica", + "@otherNotificationSettings": {}, + "notificationRuleContainsUserName": "Contiene il nome utente", + "@notificationRuleContainsUserName": {}, + "notificationRuleContainsUserNameDescription": "Notifica l'utente quando un messaggio contiene il proprio nome utente.", + "@notificationRuleContainsUserNameDescription": {}, + "notificationRuleMaster": "Silenzia tutte le notifiche", + "@notificationRuleMaster": {}, + "notificationRuleMasterDescription": "Sovrascive tutte le altre regole e disabilita tutte le notifiche.", + "@notificationRuleMasterDescription": {}, + "notificationRuleSuppressNotices": "Silenziare i messaggi automatizzati", + "@notificationRuleSuppressNotices": {}, + "notificationRuleSuppressNoticesDescription": "Silenzia le notifiche da client automatizzati come i bot.", + "@notificationRuleSuppressNoticesDescription": {}, + "notificationRuleInviteForMeDescription": "Notifica l'utente quando è invitato in una stanza.", + "@notificationRuleInviteForMeDescription": {}, + "notificationRuleMemberEvent": "Eventi per i membri", + "@notificationRuleMemberEvent": {}, + "notificationRuleInviteForMe": "Inviti per me", + "@notificationRuleInviteForMe": {}, + "notificationRuleIsUserMentionDescription": "Notifica l'utente quando viene menzionato direttamente in un messaggio.", + "@notificationRuleIsUserMentionDescription": {}, + "notificationRuleContainsDisplayNameDescription": "Notifica l'utente quando un messaggio contiene il proprio nome visualizzato.", + "@notificationRuleContainsDisplayNameDescription": {}, + "notificationRuleIsRoomMention": "Menzioni della stanza", + "@notificationRuleIsRoomMention": {}, + "notificationRuleIsUserMention": "Menzioni dell'utente", + "@notificationRuleIsUserMention": {}, + "notificationRuleRoomnotif": "Notifiche della stanza", + "@notificationRuleRoomnotif": {}, + "notificationRuleRoomnotifDescription": "Notifica l'utente quando un messaggio contiene '@room'.", + "@notificationRuleRoomnotifDescription": {}, + "notificationRuleTombstone": "Tombstone", + "@notificationRuleTombstone": {}, + "notificationRuleTombstoneDescription": "Notifica all'utente i messaggi di disattivazione della stanza.", + "@notificationRuleTombstoneDescription": {}, + "notificationRuleReaction": "Reazioni", + "@notificationRuleReaction": {}, + "notificationRuleReactionDescription": "Silenzia le notifiche per le reazioni.", + "@notificationRuleReactionDescription": {}, + "notificationRuleRoomServerAcl": "ACL del server della stanza", + "@notificationRuleRoomServerAcl": {}, + "notificationRuleRoomServerAclDescription": "Silenzia le notifiche per gli elenchi di controllo degli accessi del server della stanza (ACL).", + "@notificationRuleRoomServerAclDescription": {}, + "notificationRuleSuppressEdits": "Silenzia le modifiche", + "@notificationRuleSuppressEdits": {}, + "notificationRuleSuppressEditsDescription": "Silenzia le notifiche per i messaggi modificati.", + "@notificationRuleSuppressEditsDescription": {}, + "notificationRuleCallDescription": "Notifica all'utente le chiamate.", + "@notificationRuleCallDescription": {}, + "notificationRuleEncryptedRoomOneToOne": "Stanze crittografate One-to-One", + "@notificationRuleEncryptedRoomOneToOne": {}, + "notificationRuleRoomOneToOne": "Stanze One-to-One", + "@notificationRuleRoomOneToOne": {}, + "notificationRuleRoomOneToOneDescription": "Notifica all'utente i messaggi nelle stanze one-to-one.", + "@notificationRuleRoomOneToOneDescription": {}, + "notificationRuleMessage": "Messaggi", + "@notificationRuleMessage": {}, + "notificationRuleMessageDescription": "Notifica all'utente i messaggi generali.", + "@notificationRuleMessageDescription": {}, + "notificationRuleEncryptedDescription": "Notifica all'utente i messaggi nelle stanze crittografate.", + "@notificationRuleEncryptedDescription": {}, + "notificationRuleEncrypted": "Crittografate", + "@notificationRuleEncrypted": {}, + "notificationRuleJitsi": "Jitsi", + "@notificationRuleJitsi": {}, + "notificationRuleJitsiDescription": "Notifica all'utente gli eventi del widget Jitsi.", + "@notificationRuleJitsiDescription": {}, + "notificationRuleServerAcl": "Silenziare gli eventi ACL del server", + "@notificationRuleServerAcl": {}, + "notificationRuleServerAclDescription": "Silenzia le notifiche per gli eventi ACL del server.", + "@notificationRuleServerAclDescription": {}, + "unknownPushRule": "Regola push '{rule}' sconosciuta", + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } + } + }, + "deletePushRuleCanNotBeUndone": "Se si elimina questa impostazione di notifica, questo non può essere annullato.", + "@deletePushRuleCanNotBeUndone": {}, + "more": "Di più", + "@more": {}, + "newChatRequest": "📩 Nuova richiesta di chat", + "@newChatRequest": {}, + "shareKeysWith": "Condividi le chiavi con...", + "@shareKeysWith": {}, + "shareKeysWithDescription": "Quali dispositivi dovrebbero essere fidati in modo che possano leggere i tuoi messaggi in chat crittografate?", + "@shareKeysWithDescription": {}, + "allDevices": "Tutti i dispositivi", + "@allDevices": {}, + "crossVerifiedDevicesIfEnabled": "Verifica incrociata dei dispositivi, se abilitata", + "@crossVerifiedDevicesIfEnabled": {}, + "crossVerifiedDevices": "Dispositivi con verifica incrociata", + "@crossVerifiedDevices": {}, + "verifiedDevicesOnly": "Solo dispositivi verificati", + "@verifiedDevicesOnly": {}, + "appWantsToUseForLogin": "Usa '{server}' per accedere", + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "open": "Apri", + "@open": {}, + "appWantsToUseForLoginDescription": "Con la presente consenti all'app e al sito web di condividere informazioni su di te.", + "@appWantsToUseForLoginDescription": {}, + "appIntroduction": "FluffyChat ti consente di chattare con i tuoi amici attraverso diverse app di messaggistica. Ulteriori informazioni su https://matrix.org o semplicemente tocca *Continua*.", + "@appIntroduction": {}, + "waitingForServer": "In attesa del server...", + "@waitingForServer": {}, + "synchronizingPleaseWaitCounter": " Sincronizzazione… ({percentage}%)", + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "notificationRuleMemberEventDescription": "Silenzia le notifiche per gli eventi dei membri.", + "@notificationRuleMemberEventDescription": {}, + "notificationRuleContainsDisplayName": "Contiene nome visualizzato", + "@notificationRuleContainsDisplayName": {}, + "notificationRuleIsRoomMentionDescription": "Notifica l'utente quando c'è una menzione della stanza.", + "@notificationRuleIsRoomMentionDescription": {}, + "notificationRuleCall": "Chiamate", + "@notificationRuleCall": {}, + "notificationRuleEncryptedRoomOneToOneDescription": "Notifica all'utente i messaggi in stanze crittografate one-to-one.", + "@notificationRuleEncryptedRoomOneToOneDescription": {}, + "previous": "Precedente", + "@previous": {}, + "otherPartyNotLoggedIn": "L'altra parte non è attualmente connessa e quindi non può ricevere messaggi!", + "@otherPartyNotLoggedIn": {} +} diff --git a/assets/l10n/intl_ja.arb b/assets/l10n/intl_ja.arb new file mode 100644 index 0000000..ad1da7b --- /dev/null +++ b/assets/l10n/intl_ja.arb @@ -0,0 +1,2413 @@ +{ + "@@locale": "ja", + "@@last_modified": "2021-08-14 12:41:09.978060", + "about": "このアプリについて", + "@about": { + "type": "String", + "placeholders": {} + }, + "accept": "承諾する", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍{username}が招待を承諾しました", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "アカウント", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐{username}がエンドツーエンド暗号化を有効にしました", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "addEmail": "Eメールを追加", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "admin": "管理者", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "エイリアス", + "@alias": { + "type": "String", + "placeholders": {} + }, + "all": "すべて", + "@all": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "{senderName}は通話に出ました", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "誰でも参加できる", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "appLock": "アプリのロック", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "archive": "アーカイブ", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "ゲストユーザーの参加を許可する", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "これでよろしいですか?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "areYouSureYouWantToLogout": "ログアウトしてよろしいですか?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "他の人を署名するためにはパスフレーズやリカバリーキーを入力してください。", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "{username}の検証リクエストを承認しますか?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "badServerLoginTypesException": "ホームサーバーでサポートされているログインタイプ:\n{serverVersions}\nアプリがサポートしているログインタイプ:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "badServerVersionsException": "ホームサーバーでサポートされているバージョン:\n{serverVersions}\nアプリでは{supportedVersions}しかサポートされていません", + "@badServerVersionsException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "banFromChat": "チャットからBANする", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "BANされています", + "@banned": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username}が{targetName}をBANしました", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "デバイスをブロックする", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "blocked": "ブロックしました", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "botMessages": "ボットメッセージ", + "@botMessages": { + "type": "String", + "placeholders": {} + }, + "cancel": "キャンセル", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "changeDeviceName": "デバイス名を変更", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "{username}がチャットアバターを変更しました", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatDescriptionTo": "{username}がチャットの説明を「{description}」に変更しました", + "@changedTheChatDescriptionTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "description": { + "type": "String" + } + } + }, + "changedTheChatNameTo": "{username}がチャットの名前を「{chatname}」に変更しました", + "@changedTheChatNameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "chatname": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username}がチャットの権限を変更しました", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username}が表示名を「{displayname}」に変更しました", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username}がゲストのアクセスルールを変更しました", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username}がゲストのアクセスルールを{rules}に変更しました", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username}が履歴の表示設定を変更しました", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username}が履歴の表示設定を{rules}に変更しました", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username}が参加ルールを変更しました", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username}が参加ルールを{joinRules}に変更しました", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username}がアバターを変更しました", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "{username}が部屋のエイリアスを変更しました", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username}が招待リンクを変更しました", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changePassword": "パスワードを変更", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "ホームサーバーの変更", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "スタイルを変更する", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "グループの名前を変更する", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "暗号が破損しています", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "chat": "チャット", + "@chat": { + "type": "String", + "placeholders": {} + }, + "chatBackup": "チャットのバックアップ", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "chatBackupDescription": "古いメッセージはリカバリーキーで保護されます。紛失しないようにご注意ください。", + "@chatBackupDescription": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "チャットの詳細", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chats": "チャット", + "@chats": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "強いパスワードを選択してください", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "clearArchive": "アーカイブを消去", + "@clearArchive": {}, + "close": "閉じる", + "@close": { + "type": "String", + "placeholders": {} + }, + "compareEmojiMatch": "表示されている絵文字が他のデバイスで表示されているものと一致するか確認してください:", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "表示されている数字が他のデバイスで表示されているものと一致するか確認してください:", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "configureChat": "チャットの設定", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "confirm": "確認", + "@confirm": { + "type": "String", + "placeholders": {} + }, + "connect": "接続", + "@connect": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "連絡先に登録された人が招待されました", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "containsDisplayName": "表示名を含んでいます", + "@containsDisplayName": { + "type": "String", + "placeholders": {} + }, + "containsUserName": "ユーザー名を含んでいます", + "@containsUserName": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "サーバー管理者に通報されました", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "クリップボードにコピーされました", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "コピー", + "@copy": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "クリップボードにコピー", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "メッセージを解読できませんでした: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "countParticipants": "{count}名の参加者", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "create": "作成", + "@create": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "💬 {username}がチャットを作成しました", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "currentlyActive": "現在アクティブです", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "ダーク", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "dateWithoutYear": "{month}-{day}", + "@dateWithoutYear": { + "type": "String", + "placeholders": { + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "dateWithYear": "{year}/{month}/{day}", + "@dateWithYear": { + "type": "String", + "placeholders": { + "year": { + "type": "String" + }, + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "deactivateAccountWarning": "あなたのアカウントを無効化します。この操作は元に戻せません!よろしいですか?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "デフォルトの権限レベル", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "delete": "削除", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "アカウントの削除", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "メッセージの削除", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "device": "デバイス", + "@device": { + "type": "String", + "placeholders": {} + }, + "deviceId": "デバイスID", + "@deviceId": { + "type": "String", + "placeholders": {} + }, + "devices": "デバイス", + "@devices": { + "type": "String", + "placeholders": {} + }, + "directChats": "ダイレクトチャット", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "表示名が変更されました", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "ファイルのダウンロード", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "edit": "編集", + "@edit": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "ブロックしたサーバーを編集", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "editDisplayname": "表示名を編集", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "editRoomAliases": "ルームエイリアスを編集", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "部屋のアバターを編集する", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "Emoteはすでに存在します!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "不正なEmoteショートコード!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emotePacks": "部屋のEmoteパック", + "@emotePacks": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "Emote設定", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "emoteShortcode": "Emoteショートコード", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emoteWarnNeedToPick": "Emoteショートコードと画像を選択してください!", + "@emoteWarnNeedToPick": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "空のチャット", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "emoteをグローバルに有効にする", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "暗号化を有効にする", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "一度暗号化を有効にするともとに戻せません。よろしいですか?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "encrypted": "暗号化", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "encryption": "暗号化", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "暗号化されていません", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName}は通話を切断しました", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "enterAnEmailAddress": "メールアドレスを入力してください", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "enterYourHomeserver": "ホームサーバーを入力してください", + "@enterYourHomeserver": { + "type": "String", + "placeholders": {} + }, + "everythingReady": "すべての準備は完了しました!", + "@everythingReady": { + "type": "String", + "placeholders": {} + }, + "extremeOffensive": "とても攻撃的", + "@extremeOffensive": { + "type": "String", + "placeholders": {} + }, + "fileName": "ファイル名", + "@fileName": { + "type": "String", + "placeholders": {} + }, + "fluffychat": "FluffyChat", + "@fluffychat": { + "type": "String", + "placeholders": {} + }, + "fontSize": "フォントサイズ", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "forward": "進む", + "@forward": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "参加時点から閲覧可能", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "招待時点から閲覧可能", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "goToTheNewRoom": "新規ルームへ", + "@goToTheNewRoom": { + "type": "String", + "placeholders": {} + }, + "group": "グループ", + "@group": { + "type": "String", + "placeholders": {} + }, + "groupIsPublic": "グループは公開されています", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "groups": "グループ", + "@groups": { + "type": "String", + "placeholders": {} + }, + "groupWith": "{displayname}とグループを作成する", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "guestsAreForbidden": "ゲストは許可されていません", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "ゲストが許可されています", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{targetName}の招待を{username}が取り下げました", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "help": "ヘルプ", + "@help": { + "type": "String", + "placeholders": {} + }, + "hideRedactedEvents": "編集済みイベントを非表示にする", + "@hideRedactedEvents": { + "type": "String", + "placeholders": {} + }, + "hideUnknownEvents": "不明なイベントを非表示にする", + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "howOffensiveIsThisContent": "どのくらい攻撃的でしたか?", + "@howOffensiveIsThisContent": { + "type": "String", + "placeholders": {} + }, + "id": "ID", + "@id": { + "type": "String", + "placeholders": {} + }, + "identity": "アイデンティティ", + "@identity": { + "type": "String", + "placeholders": {} + }, + "ignore": "無視する", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "ignoredUsers": "無視されたユーザー", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "iHaveClickedOnLink": "リンクをクリックしました", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "パスフレーズかリカバリーキーが間違っています", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "inoffensive": "非攻撃的", + "@inoffensive": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "連絡先から招待する", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "連絡先から{groupName}に招待する", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "invited": "招待されました", + "@invited": { + "type": "String", + "placeholders": {} + }, + "invitedUser": "📩 {username} が {targetName} を招待しました", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "invitedUsersOnly": "招待されたユーザーのみ", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "inviteForMe": "自分への招待", + "@inviteForMe": { + "type": "String", + "placeholders": {} + }, + "inviteText": "{username}がFluffyChatにあなたを招待しました. \n1. FluffyChatをインストールしてください: https://fluffychat.im \n2. 新しくアカウントを作成するかサインインしてください\n3. 招待リンクを開いてください: {link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "isTyping": "が入力しています…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "👋 {username} がチャットに参加しました", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "joinRoom": "部屋に参加", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "kicked": "👞 {username} は {targetName} をキックしました", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickedAndBanned": "🙅 {username} が {targetName} をキックしブロックしました", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickFromChat": "チャットからキックする", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "最終アクティブ: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "leave": "退室する", + "@leave": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "退室しました", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "license": "ライセンス", + "@license": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "ライト", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "あと{count}名参加者を読み込む", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "loadingPleaseWait": "読み込み中…お待ちください。", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "loadMore": "更に読み込む…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "login": "ログイン", + "@login": { + "type": "String", + "placeholders": {} + }, + "logInTo": "{homeserver}にログインする", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "logout": "ログアウト", + "@logout": { + "type": "String", + "placeholders": {} + }, + "memberChanges": "メンバーの変更", + "@memberChanges": { + "type": "String", + "placeholders": {} + }, + "mention": "メンション", + "@mention": { + "type": "String", + "placeholders": {} + }, + "messages": "メッセージ", + "@messages": { + "type": "String", + "placeholders": {} + }, + "moderator": "モデレータ", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "muteChat": "チャットのミュート", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "needPantalaimonWarning": "現時点では、エンドツーエンドの暗号化を使用するにはPantalaimonが必要であることに注意してください。", + "@needPantalaimonWarning": { + "type": "String", + "placeholders": {} + }, + "newChat": "新規チャット", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "💬 FluffyChatに新しいメッセージがあります", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "認証リクエスト!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "next": "次へ", + "@next": { + "type": "String", + "placeholders": {} + }, + "no": "いいえ", + "@no": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "サーバーに接続できません", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "Emoteは見つかりませんでした😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "ルームを非公開にした後暗号化を有効にできます。", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "あなたのスマホにはGoogleサービスがないようですね。プライバシーを保護するための良い選択です!プッシュ通知を受け取るには https://microg.org/ または https://unifiedpush.org/ を使うことをお勧めします。", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "none": "なし", + "@none": { + "type": "String", + "placeholders": {} + }, + "noPasswordRecoveryDescription": "パスワードを回復する方法をまだ追加していません。", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "noPermission": "権限がありません", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "部屋は見つかりませんでした…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "notifications": "通知", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "notificationsEnabledForThisAccount": "このアカウントでは通知が有効です", + "@notificationsEnabledForThisAccount": { + "type": "String", + "placeholders": {} + }, + "numUsersTyping": "{count}人が入力中…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "offensive": "攻撃的", + "@offensive": { + "type": "String", + "placeholders": {} + }, + "offline": "オフライン", + "@offline": { + "type": "String", + "placeholders": {} + }, + "ok": "OK", + "@ok": { + "type": "String", + "placeholders": {} + }, + "online": "オンライン", + "@online": { + "type": "String", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "オンライン鍵バックアップは使用されています", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "おっと、何かがうまくいきませんでした…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "アプリを開いてメッセージを確認してください", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "openCamera": "カメラを開く", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "participant": "参加者", + "@participant": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "パスフレーズかリカバリーキー", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "password": "パスワード", + "@password": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "パスワードを忘れた", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "パスワードが変更されました", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "passwordRecovery": "パスワードリカバリー", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "people": "人々", + "@people": { + "type": "String", + "placeholders": {} + }, + "pickImage": "画像を選択してください", + "@pickImage": { + "type": "String", + "placeholders": {} + }, + "pin": "ピン", + "@pin": { + "type": "String", + "placeholders": {} + }, + "play": "{fileName}を再生する", + "@play": { + "type": "String", + "placeholders": { + "fileName": { + "type": "String" + } + } + }, + "pleaseChooseAPasscode": "パスコードを選んでください", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "pleaseClickOnLink": "メールのリンクから進めてください。", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "pleaseEnter4Digits": "アプリのロック用に4桁の数字を入力してください。空欄の場合は無効になります。", + "@pleaseEnter4Digits": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPassword": "パスワードを入力してください", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPin": "PINを入力してください", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "ユーザー名を入力してください", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "ウェブサイトにあるやり方を見てから次をタップしてください。", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "privacy": "プライバシー", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "公開された部屋", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "pushRules": "ルールを追加する", + "@pushRules": { + "type": "String", + "placeholders": {} + }, + "reason": "理由", + "@reason": { + "type": "String", + "placeholders": {} + }, + "recording": "録音中", + "@recording": { + "type": "String", + "placeholders": {} + }, + "redactedAnEvent": "{username}がイベントを編集しました", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "redactMessage": "メッセージを書く", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "reject": "拒否", + "@reject": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "{username}は招待を拒否しました", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "rejoin": "再参加", + "@rejoin": { + "type": "String", + "placeholders": {} + }, + "remove": "消去", + "@remove": { + "type": "String", + "placeholders": {} + }, + "removeAllOtherDevices": "他のデバイスをすべて削除", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "removedBy": "{username}によって削除されました", + "@removedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "removeDevice": "デバイスの削除", + "@removeDevice": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "チャットからのブロックを解除する", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "renderRichContent": "リッチメッセージをレンダリングする", + "@renderRichContent": { + "type": "String", + "placeholders": {} + }, + "replaceRoomWithNewerVersion": "部屋を新しいバージョンに変更する", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "reply": "返信", + "@reply": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "メッセージを通報", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "requestPermission": "権限を要求する", + "@requestPermission": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "部屋はアップグレードされました", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "ルームバージョン", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "search": "検索", + "@search": { + "type": "String", + "placeholders": {} + }, + "security": "セキュリティ", + "@security": { + "type": "String", + "placeholders": {} + }, + "seenByUser": "{username}が既読", + "@seenByUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "send": "送信", + "@send": { + "type": "String", + "placeholders": {} + }, + "sendAMessage": "メッセージを送信", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "sendAudio": "音声の送信", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendFile": "ファイルを送信", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendImage": "画像の送信", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendMessages": "メッセージを送る", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "sendOriginal": "オリジナルの送信", + "@sendOriginal": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "動画を送信", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "sentAFile": "📁 {username}はファイルを送信しました", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAnAudio": "🎤 {username}は音声を送信しました", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAPicture": "🖼️ {username}は画像を送信しました", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentASticker": "😊 {username}はステッカーを送信しました", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "🎥 {username}は動画を送信しました", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentCallInformations": "{senderName}は通話情報を送信しました", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "setAsCanonicalAlias": "メインエイリアスに設定", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "setCustomEmotes": "カスタムエモートの設定", + "@setCustomEmotes": { + "type": "String", + "placeholders": {} + }, + "setInvitationLink": "招待リンクを設定する", + "@setInvitationLink": { + "type": "String", + "placeholders": {} + }, + "setPermissionsLevel": "権限レベルをセット", + "@setPermissionsLevel": { + "type": "String", + "placeholders": {} + }, + "setStatus": "ステータスの設定", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "settings": "設定", + "@settings": { + "type": "String", + "placeholders": {} + }, + "share": "共有", + "@share": { + "type": "String", + "placeholders": {} + }, + "sharedTheLocation": "{username}は現在地を共有しました", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "showPassword": "パスワードを表示", + "@showPassword": { + "type": "String", + "placeholders": {} + }, + "skip": "スキップ", + "@skip": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "ソースコード", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "startedACall": "{senderName}は通話を開始しました", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "status": "ステータス", + "@status": { + "type": "String", + "placeholders": {} + }, + "statusExampleMessage": "お元気ですか?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "submit": "送信", + "@submit": { + "type": "String", + "placeholders": {} + }, + "systemTheme": "システム", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "違います", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "一致しています", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "title": "FluffyChat", + "@title": { + "description": "Title for the application", + "type": "String", + "placeholders": {} + }, + "toggleFavorite": "お気に入り切り替え", + "@toggleFavorite": { + "type": "String", + "placeholders": {} + }, + "toggleMuted": "ミュート切り替え", + "@toggleMuted": { + "type": "String", + "placeholders": {} + }, + "toggleUnread": "既読/未読にマーク", + "@toggleUnread": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "リクエストが多すぎます。また後で試してみてください!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "transferFromAnotherDevice": "違うデバイスから移行する", + "@transferFromAnotherDevice": { + "type": "String", + "placeholders": {} + }, + "tryToSendAgain": "送信し直してみる", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "unavailable": "不在", + "@unavailable": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username}が{targetName}のBANを解除しました", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "unblockDevice": "デバイスをブロック解除する", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "未知デバイス", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "unknownEncryptionAlgorithm": "未知の暗号化アルゴリズム", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unknownEvent": "未知のイベント'{type}'", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "unmuteChat": "チャットをミュート解除する", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "unpin": "ピンを外す", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "unreadChats": "{unreadCount, plural, =1{1件の未読メッセージ} other{{unreadCount}件の未読メッセージ}}", + "@unreadChats": { + "type": "String", + "placeholders": { + "unreadCount": { + "type": "int" + } + } + }, + "userAndOthersAreTyping": "{username}と他{count}名が入力しています…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "userAndUserAreTyping": "{username}と{username2}が入力しています…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userIsTyping": "{username}が入力しています…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userLeftTheChat": "🚪 {username}はチャットから退室しました", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "username": "ユーザー名", + "@username": { + "type": "String", + "placeholders": {} + }, + "userSentUnknownEvent": "{username}は{type}イベントを送信しました", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "verified": "検証済み", + "@verified": { + "type": "String", + "placeholders": {} + }, + "verify": "確認", + "@verify": { + "type": "String", + "placeholders": {} + }, + "verifyStart": "確認を始める", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "確認が完了しました!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "verifyTitle": "他のアカウントを確認中", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "videoCall": "音声通話", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "チャット履歴の表示", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "すべての参加者が閲覧可能", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "すべての人が閲覧可能", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "ボイスメッセージ", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "パートナーのリクエスト承諾待ちです...", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "パートナーの絵文字承諾待ちです...", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "パートナーの数字承諾待ちです…", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "wallpaper": "壁紙", + "@wallpaper": { + "type": "String", + "placeholders": {} + }, + "warning": "警告!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "weSentYouAnEmail": "あなたにメールを送信しました", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "whoCanPerformWhichAction": "誰がどの操作を実行できるか", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "誰がこのチャットに入れますか", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "これを通報する理由", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "wipeChatBackup": "チャットのバックアップを消去して、新しいリカバリーキーを作りますか?", + "@wipeChatBackup": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "これらのアドレスを使用すると、パスワードを回復することができます。", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "メッセージを入力してください…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "yes": "はい", + "@yes": { + "type": "String", + "placeholders": {} + }, + "you": "あなた", + "@you": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "あなたはもうこのチャットの参加者ではありません", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "チャットからBANされてしまいました", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "yourPublicKey": "あなたの公開鍵", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "allChats": "すべて会話", + "@allChats": { + "type": "String", + "placeholders": {} + }, + "addToSpace": "スペースに追加", + "@addToSpace": {}, + "cantOpenUri": "URIが開けません {uri}", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "repeatPassword": "パスワードを繰り返そ", + "@repeatPassword": {}, + "autoplayImages": "GIFを自動的に再生する", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "yourChatBackupHasBeenSetUp": "チャットバックアップを設定ました。", + "@yourChatBackupHasBeenSetUp": {}, + "sendOnEnter": "Enterで送信", + "@sendOnEnter": {}, + "changeYourAvatar": "アバタるを変化しする", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "chatHasBeenAddedToThisSpace": "このスペースにチャットが追加されました", + "@chatHasBeenAddedToThisSpace": {}, + "commandHint_ban": "このユーザーを禁止する", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_clearcache": "キャッシュをクリアする", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "commandInvalid": "コマンドが無効", + "@commandInvalid": { + "type": "String" + }, + "commandHint_create": "空のグループチャットを作成\n暗号化を無効にするには、--no-encryption を使用", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "commandHint_discardsession": "セッションを破棄", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "confirmMatrixId": "アカウントを削除するには、Matrix IDを確認してください。", + "@confirmMatrixId": {}, + "commandHint_markasgroup": "グループとしてマーク", + "@commandHint_markasgroup": {}, + "commandHint_join": "指定した部屋に参加", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_send": "テキストを送信", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "hydrate": "バックアップファイルから復元", + "@hydrate": {}, + "commandHint_html": "HTML形式のテキストを送信", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_invite": "指定したユーザーをこの部屋に招待", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "commandMissing": "{command} はコマンドではありません。", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "oneClientLoggedOut": "クライアントの 1つがログアウトしました", + "@oneClientLoggedOut": {}, + "addAccount": "アカウントを追加", + "@addAccount": {}, + "editBundlesForAccount": "このアカウントのバンドルを編集", + "@editBundlesForAccount": {}, + "unverified": "未検証", + "@unverified": {}, + "sender": "送信者", + "@sender": {}, + "placeCall": "電話をかける", + "@placeCall": {}, + "voiceCall": "音声通話", + "@voiceCall": {}, + "unsupportedAndroidVersionLong": "この機能を利用するには、より新しいAndroidのバージョンが必要です。アップデートまたはLineage OSのサポートをご確認ください。", + "@unsupportedAndroidVersionLong": {}, + "widgetVideo": "動画", + "@widgetVideo": {}, + "widgetName": "名称", + "@widgetName": {}, + "widgetCustom": "カスタム", + "@widgetCustom": {}, + "widgetJitsi": "Jitsi Meet", + "@widgetJitsi": {}, + "dehydrateWarning": "この操作は元に戻せません。バックアップファイルを安全に保存してください。", + "@dehydrateWarning": {}, + "dehydrate": "セッションのエクスポートとデバイスの消去", + "@dehydrate": {}, + "messageType": "メッセージの種類", + "@messageType": {}, + "start": "開始", + "@start": {}, + "publish": "公開", + "@publish": {}, + "indexedDbErrorTitle": "プライベートモードに関する問題", + "@indexedDbErrorTitle": {}, + "addWidget": "ウィジェットを追加", + "@addWidget": {}, + "youBannedUser": "{user} を禁止しました", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youJoinedTheChat": "チャットに参加しました", + "@youJoinedTheChat": {}, + "youHaveWithdrawnTheInvitationFor": "{user} への招待を取り下げました", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "users": "ユーザー", + "@users": {}, + "youRejectedTheInvitation": "招待を拒否しました", + "@youRejectedTheInvitation": {}, + "screenSharingDetail": "FuffyChatで画面を共有しています", + "@screenSharingDetail": {}, + "homeserver": "ホームサーバー", + "@homeserver": {}, + "scanQrCode": "QRコードをスキャン", + "@scanQrCode": {}, + "obtainingLocation": "位置情報を取得しています…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "addToBundle": "バンドルに追加", + "@addToBundle": {}, + "removeFromBundle": "このバンドルから削除", + "@removeFromBundle": {}, + "bundleName": "バンドル名", + "@bundleName": {}, + "noMatrixServer": "{server1} はMatrixのサーバーではありません。代わりに {server2} を使用しますか?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "openVideoCamera": "ビデオ用にカメラを開く", + "@openVideoCamera": { + "type": "String", + "placeholders": {} + }, + "link": "リンク", + "@link": {}, + "or": "または", + "@or": { + "type": "String", + "placeholders": {} + }, + "register": "登録", + "@register": { + "type": "String", + "placeholders": {} + }, + "removeYourAvatar": "アバターを削除する", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "saveFile": "ファイルを保存", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "recoveryKey": "リカバリーキー", + "@recoveryKey": {}, + "singlesignon": "シングルサインオン", + "@singlesignon": { + "type": "String", + "placeholders": {} + }, + "spaceIsPublic": "スペースは公開されています", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "spaceName": "スペース名", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "startFirstChat": "最初のチャットを開始する", + "@startFirstChat": {}, + "addToSpaceDescription": "このチャットを追加するスペースを選択してください。", + "@addToSpaceDescription": {}, + "messageInfo": "メッセージの情報", + "@messageInfo": {}, + "openGallery": "ギャラリーを開く", + "@openGallery": {}, + "removeFromSpace": "スペースから削除", + "@removeFromSpace": {}, + "pleaseEnterRecoveryKeyDescription": "古いメッセージを解除するには、以前のセッションで生成されたリカバリーキーを入力してください。リカバリーキーはパスワードではありません。", + "@pleaseEnterRecoveryKeyDescription": {}, + "videoWithSize": "ビデオ ({size})", + "@videoWithSize": { + "type": "String", + "placeholders": { + "size": { + "type": "String" + } + } + }, + "openChat": "チャットを開く", + "@openChat": {}, + "experimentalVideoCalls": "実験的なビデオ通話", + "@experimentalVideoCalls": {}, + "emailOrUsername": "メールアドレスまたはユーザー名", + "@emailOrUsername": {}, + "switchToAccount": "アカウント {number} に切り替える", + "@switchToAccount": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "nextAccount": "次のアカウント", + "@nextAccount": {}, + "youAcceptedTheInvitation": "👍 招待を承諾しました", + "@youAcceptedTheInvitation": {}, + "errorAddingWidget": "ウィジェットの追加中にエラーが発生しました。", + "@errorAddingWidget": {}, + "widgetNameError": "表示名を入力してください。", + "@widgetNameError": {}, + "youUnbannedUser": "{user} の禁止を解除しました", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedBy": "📩 {user} から招待されました", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKicked": "👞 {user} をキックしました", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKickedAndBanned": "🙅 {user} をキックしてブロックしました", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "storeInAppleKeyChain": "Apple KeyChainに保存", + "@storeInAppleKeyChain": {}, + "storeInAndroidKeystore": "Android KeyStoreに保存する", + "@storeInAndroidKeystore": {}, + "storeInSecureStorageDescription": "このデバイスの安全なストレージにリカバリーキーを保存。", + "@storeInSecureStorageDescription": {}, + "unlockOldMessages": "古いメッセージのロックを解除する", + "@unlockOldMessages": {}, + "callingAccount": "通話アカウント", + "@callingAccount": {}, + "callingPermissions": "通話の権限", + "@callingPermissions": {}, + "screenSharingTitle": "画面共有", + "@screenSharingTitle": {}, + "foregroundServiceRunning": "この通知は、フォアグラウンド サービスの実行中に表示されます。", + "@foregroundServiceRunning": {}, + "custom": "カスタム", + "@custom": {}, + "countFiles": "{count}個のファイル", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "storeSecurlyOnThisDevice": "このデバイスに安全に保管する", + "@storeSecurlyOnThisDevice": {}, + "whyIsThisMessageEncrypted": "このメッセージが読めない理由", + "@whyIsThisMessageEncrypted": {}, + "otherCallingPermissions": "マイク、カメラ、その他FluffyChatの権限", + "@otherCallingPermissions": {}, + "appearOnTopDetails": "アプリをトップに表示できるようにする(すでに通話アカウントとしてFluffychatを設定している場合は必要ありません)", + "@appearOnTopDetails": {}, + "dehydrateTorLong": "TOR ユーザーの場合、ウィンドウを閉じる前にセッションをエクスポートすることをお勧めします。", + "@dehydrateTorLong": {}, + "hydrateTorLong": "前回、TOR でセッションをエクスポートしましたか?すぐにインポートしてチャットを続けましょう。", + "@hydrateTorLong": {}, + "enableMultiAccounts": "(ベータ版) このデバイスで複数のアカウントを有効にする", + "@enableMultiAccounts": {}, + "pleaseEnterRecoveryKey": "リカバリーキーを入力してください。", + "@pleaseEnterRecoveryKey": {}, + "serverRequiresEmail": "このサーバーは、登録のためにメールアドレスを検証する必要があります。", + "@serverRequiresEmail": {}, + "sendSticker": "ステッカーを送る", + "@sendSticker": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWait": "同期中...お待ちください。", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "emojis": "絵文字", + "@emojis": {}, + "markAsRead": "既読にする", + "@markAsRead": {}, + "videoCallsBetaWarning": "ビデオ通話は、現在ベータ版であることにご注意ください。すべてのプラットフォームで期待通りに動作しない、あるいはまったく動作しない可能性があります。", + "@videoCallsBetaWarning": {}, + "confirmEventUnpin": "イベントの固定を完全に解除してもよろしいですか?", + "@confirmEventUnpin": {}, + "unsupportedAndroidVersion": "サポートされていないAndroidのバージョン", + "@unsupportedAndroidVersion": {}, + "user": "ユーザー", + "@user": {}, + "newGroup": "新しいグループ", + "@newGroup": {}, + "noBackupWarning": "警告!チャットのバックアップを有効にしないと、暗号化されたメッセージにアクセスできなくなります。ログアウトする前に、まずチャットのバックアップを有効にすることを強くお勧めします。", + "@noBackupWarning": {}, + "disableEncryptionWarning": "セキュリティ上の理由から、以前は暗号化が有効だったチャットで暗号化を無効にすることはできません。", + "@disableEncryptionWarning": {}, + "youInvitedUser": "📩 {user} を招待しました", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "reactedWith": "{sender} が {reaction} で反応しました", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "createNewSpace": "新しいスペース", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "widgetUrlError": "有効なURLではありません。", + "@widgetUrlError": {}, + "reportUser": "ユーザーを報告", + "@reportUser": {}, + "errorObtainingLocation": "位置情報の取得中にエラーが発生しました: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "pinMessage": "部屋にピン留めする", + "@pinMessage": {}, + "previousAccount": "前のアカウント", + "@previousAccount": {}, + "pleaseChoose": "選択してください", + "@pleaseChoose": { + "type": "String", + "placeholders": {} + }, + "oopsPushError": "おっと!残念ながら、プッシュ通知の設定中にエラーが発生しました。", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "noOtherDevicesFound": "他のデバイスが見つかりません", + "@noOtherDevicesFound": {}, + "recoveryKeyLost": "リカバリーキーを紛失した場合", + "@recoveryKeyLost": {}, + "shareLocation": "位置情報の共有", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "time": "時間", + "@time": {}, + "sendAsText": "テキストとして送信", + "@sendAsText": { + "type": "String" + }, + "commandHint_googly": "ぎょろ目を送る", + "@commandHint_googly": {}, + "commandHint_hug": "ハグを送る", + "@commandHint_hug": {}, + "encryptThisChat": "このチャットを暗号化する", + "@encryptThisChat": {}, + "commandHint_markasdm": "ダイレクトメッセージの部屋としてマークする", + "@commandHint_markasdm": {}, + "commandHint_dm": "ダイレクトチャットを開始する\n暗号化を無効にするには、--no-encryptionを使用してください", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "commandHint_leave": "この部屋を退出", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_myroomavatar": "この部屋の写真を設定する (mxc-uriで)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_myroomnick": "この部屋の表示名を設定する", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "commandHint_plain": "書式設定されていないテキストを送信する", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_react": "リアクションとして返信を送信する", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "dehydrateTor": "TOR ユーザー: セッションをエクスポート", + "@dehydrateTor": {}, + "hydrateTor": "TOR ユーザー: セッションのエクスポートをインポート", + "@hydrateTor": {}, + "locationDisabledNotice": "位置情報サービスが無効になっています。位置情報を共有できるようにするには、位置情報サービスを有効にしてください。", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "locationPermissionDeniedNotice": "位置情報の権限が拒否されました。位置情報を共有できるように許可してください。", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "deviceKeys": "デバイスキー:", + "@deviceKeys": {}, + "sorryThatsNotPossible": "申し訳ありません...それは不可能です", + "@sorryThatsNotPossible": {}, + "wasDirectChatDisplayName": "空のチャット (以前は {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "doNotShowAgain": "今後表示しない", + "@doNotShowAgain": {}, + "hideUnimportantStateEvents": "重要でない状態イベントを非表示にする", + "@hideUnimportantStateEvents": {}, + "numChats": "{number} チャット", + "@numChats": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "allSpaces": "すべてのスペース", + "@allSpaces": {}, + "enterRoom": "部屋に入る", + "@enterRoom": {}, + "enterSpace": "スペースに入る", + "@enterSpace": {}, + "newSpace": "新しいスペース", + "@newSpace": {}, + "reopenChat": "チャットを再開する", + "@reopenChat": {}, + "signInWith": "{provider}でログイン", + "@signInWith": { + "type": "String", + "placeholders": { + "provider": { + "type": "String" + } + } + }, + "signInWithPassword": "パスワードでログイン", + "@signInWithPassword": {} +} diff --git a/assets/l10n/intl_ka.arb b/assets/l10n/intl_ka.arb new file mode 100644 index 0000000..6ef2516 --- /dev/null +++ b/assets/l10n/intl_ka.arb @@ -0,0 +1,832 @@ +{ + "alias": "მეტსახელი", + "@alias": { + "type": "String", + "placeholders": {} + }, + "appLockDescription": "პინკოდის გამოყენების გარეშე აპლიკაციის ბლოკირება", + "@appLockDescription": {}, + "commandHint_hug": "მეგობრული ჩახუტვის გაგზავნა", + "@commandHint_hug": {}, + "areYouSure": "დარწმუნებული ხართ?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "areYouSureYouWantToLogout": "დარწმუნებული ხართ, რომ გამოსვლა გსურთ?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "hugContent": "{senderName} მეგობრულად გეხუტება", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "askSSSSSign": "სხვა მომხმარებლის დადასტურებლად, გთხოვთ, ჩაწეროთ თქვენი ან საიდუმლო ფრაზა, ან აღდგენის გასაღები.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "autoplayImages": "ანიმირებული სტიკერებისა და ემოჯების ავტომატური ჩართვა", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "banFromChat": "ჩატიდან გაგდება და ბლოკირება", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "დაბლოკილია", + "@banned": { + "type": "String", + "placeholders": {} + }, + "badServerLoginTypesException": "ამ სერვერს აქვს შესვლის მეთოდების მხარდაჭერა:\n{serverVersions}\nმაგრამ ამ აპლიკაციას აქვს მხარდაჭერა მხოლოდ:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "sendOnEnter": "გაგზავნა enter-ის დაჭერისას", + "@sendOnEnter": {}, + "bannedUser": "{username} დაბლოკა {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "მოწყობილების ბლოკირება", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "blocked": "დაბლოკილია", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "botMessages": "ბოტის შეტყობინებები", + "@botMessages": { + "type": "String", + "placeholders": {} + }, + "cancel": "გაუქმება", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "changedTheHistoryVisibilityTo": "{username} შეცვალა ისტორიის ხილვადობა: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username} გაწევრიანების წესები შეცვალა", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} შეცვალა პროფილის ფოტო", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "chat": "ჩატი", + "@chat": { + "type": "String", + "placeholders": {} + }, + "changeYourAvatar": "პროფილის ფოტოს შეცვლა", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "yourChatBackupHasBeenSetUp": "თქვენი ჩატის სარეზერვო საშუალება კონფიგურირებული იქნა.", + "@yourChatBackupHasBeenSetUp": {}, + "channelCorruptedDecryptError": "დაშიფვრა დაზიანდა", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "chatBackupDescription": "თქვენი ძველი შეტყობინებები დაცულია აღდგების გასაღებით. არ დაკარგოთ ის.", + "@chatBackupDescription": { + "type": "String", + "placeholders": {} + }, + "commandHint_discardsession": "სესიის გაუქმება", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "commandHint_invite": "მოცემული მომხმარებლის მოწვევა ამ ოთახში", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "commandHint_plain": "არაფორმატირებული ტექსტის გაგზავნა", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_send": "ტექსტის გაგზავნა", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "commandMissing": "{command} არაა ბრძანება.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "confirm": "დადასტურება", + "@confirm": { + "type": "String", + "placeholders": {} + }, + "connect": "დაკავშირება", + "@connect": { + "type": "String", + "placeholders": {} + }, + "countParticipants": "{count} მონაწილე", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "createGroup": "ჯგუფის შექმნა", + "@createGroup": {}, + "deactivateAccountWarning": "ეს გააუქმებს თქვენს ანგარიშს. ამის გაუქმება შეუძლებელია. დარწმუნებული ხართ?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "devices": "მოწყობილებები", + "@devices": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "ბნელი", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "chatPermissions": "ჩატის უფლებები", + "@chatPermissions": {}, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "editRoomAliases": "ოთახის მეტსახელების შეცვლა", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "ეს ემოცია უკვე არსებობს!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "ემოციის არასწორი მოკლე კოდი!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "importNow": "იმპორტი", + "@importNow": {}, + "importEmojis": "ემოჯის იმპორტი", + "@importEmojis": {}, + "importFromZipFile": "იმპორტი .zip ფაილიდან", + "@importFromZipFile": {}, + "exportEmotePack": "ემოციების .zip ფაილში ექსპორტი", + "@exportEmotePack": {}, + "replace": "ჩანაცვლება", + "@replace": {}, + "accept": "თანხმობა", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 {username} მიიღო მოწვევა", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "ანგარიში", + "@account": { + "type": "String", + "placeholders": {} + }, + "addEmail": "ელ.ფოსტის დამატება", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "confirmMatrixId": "გთხოვთ, დაადასტუროთ თქვენი Matrix ID ანგარიშის წაშლისათვის.", + "@confirmMatrixId": {}, + "addChatDescription": "ჩატის აღწერილობის დამატება...", + "@addChatDescription": {}, + "addToSpace": "სივრცეში დამატება", + "@addToSpace": {}, + "admin": "ადმინი", + "@admin": { + "type": "String", + "placeholders": {} + }, + "all": "ყველა", + "@all": { + "type": "String", + "placeholders": {} + }, + "allChats": "ყველა ჩატი", + "@allChats": { + "type": "String", + "placeholders": {} + }, + "commandHint_cuddle": "ჩახუტების გაგზავნა", + "@commandHint_cuddle": {}, + "answeredTheCall": "{senderName} უპასუხა ზარს", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "ყველას შეუძლია გაწევრიანება", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "appLock": "აპლიკაციის ბლოკირება", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "archive": "არქივი", + "@archive": { + "type": "String", + "placeholders": {} + }, + "commandHint_googly": "გამოშტერილი თვალების გაგზავნა", + "@commandHint_googly": {}, + "googlyEyesContent": "{senderName} გამოშტერილ თვალებს გიგზავნის", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "cuddleContent": "{senderName} გეხუტება", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "areGuestsAllowedToJoin": "შეუძლიათ თუ არა სტუმარ მომხმარებლებს გაწევრიანება", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "მიიღებთ {username} დადასტურების მოთხოვნას?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sendTypingNotifications": "წერის შეტყობინების გაგზავნა", + "@sendTypingNotifications": {}, + "cantOpenUri": "ვერ იხსნება ბმული {uri}", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "changeDeviceName": "მოწყობილების გადარქმევა", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "{username} ჩატის ფოტო შეცვალა", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatDescriptionTo": "{username} ჩატის ახალი აღწერილობა დააყენა: '{description}'", + "@changedTheChatDescriptionTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "description": { + "type": "String" + } + } + }, + "changedTheChatNameTo": "{username} ჩატი გადაარქვა: '{chatname}'", + "@changedTheChatNameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "chatname": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username} ჩატის უფლებები შეცვალა", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} შეცვალა სტუმრების წვდომის წესები", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} შეცვალა სტუმრების წვდომის წესები: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username} შეცვალა ისტორიის ხილვადობა", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} გაწევრიანების წესები შეცვალა: {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "{username} ოთახის მეტსახელები შეცვალა", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username} მოწვევის ბმული შეცვალა", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changePassword": "პაროლის შეცვლა", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "სახლის სერვერის შეცვლა", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "სტილის შეცვლა", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "ჯგუფის გადარქმევა", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "chatBackup": "ჩატის სარეზერვო საშუალება", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "ჩატის დეტალები", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chatHasBeenAddedToThisSpace": "ჩატი დაემატა ამ სივრცეს", + "@chatHasBeenAddedToThisSpace": {}, + "chats": "ჩატები", + "@chats": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "ძლიერი პაროლი აარჩიეთ", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "clearArchive": "არქივის გაწმენდა", + "@clearArchive": {}, + "close": "დახურვა", + "@close": { + "type": "String", + "placeholders": {} + }, + "commandHint_markasgroup": "აღნიშვნა, როგორც ჯგუფის", + "@commandHint_markasgroup": {}, + "commandHint_ban": "მოცემული მომხმარებლის ბლოკირება ამ ოთახში", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_clearcache": "­ქეშის გაწმენდა", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_join": "მოცემულ ოთახში გაწევრიანება", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_kick": "მოცემული მომხმარებლის წაშლა ამ ოთახიდან", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_leave": "ამ ოთახიდან გასვლა", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_me": "აღწერეთ თქვენი თავი", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "commandHint_unban": "ამ ოთახში მომხმარებლისგან ბლოკის მოხსნა", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "commandInvalid": "არასწორი ბრძანება", + "@commandInvalid": { + "type": "String" + }, + "compareEmojiMatch": "გთხოვთ, შეადაროთ ეს ემოჯი", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "გთხოვთ, შეადაროთ ეს რიცხვები", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "configureChat": "ჩატის კონფიგურაცია", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "კონტაქტი მოწვეული იქნა ჯგუფში", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "containsUserName": "შეიცავს სახელს", + "@containsUserName": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "კოპირებულია ბუფერში", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "კოპირება", + "@copy": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "კოპირება ბუფერში", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "შეტყობინების გაშიფვრის შეცდომა: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "create": "შექმნა", + "@create": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "💬 {username} შექმნა ჩატი", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "createNewSpace": "ახალი სივრცე", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "currentlyActive": "ახლა აქტიურია", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "dateWithoutYear": "{day}-{month}", + "@dateWithoutYear": { + "type": "String", + "placeholders": { + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "dateWithYear": "{day}-{month}-{year}", + "@dateWithYear": { + "type": "String", + "placeholders": { + "year": { + "type": "String" + }, + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "delete": "წაშლა", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "ანგარიშის წაშლა", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "შეტყობინების წაშლა", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "device": "მოწყობილება", + "@device": { + "type": "String", + "placeholders": {} + }, + "deviceId": "მოწყობილების ID", + "@deviceId": { + "type": "String", + "placeholders": {} + }, + "directChats": "პირდაპირი ჩატები", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "allRooms": "ყველა ჯგუფური ჩატები", + "@allRooms": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "ფაილის ჩატვირთვა", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "edit": "რედაქტირება", + "@edit": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "ბლოკირებული სერვერების რედაქტირება", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "ოთახის ფოტოს შეცვლა", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "ემოციების პარამეტრები", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "globalChatId": "გლობალური ჩატის ID", + "@globalChatId": {}, + "repeatPassword": "გაიმეორეთ პაროლი", + "@repeatPassword": {}, + "notAnImage": "ფაილი არაა სურათი.", + "@notAnImage": {}, + "remove": "წაშლა", + "@remove": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐 {username} გააქტიურა end to end დაშიფვრა", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "supposedMxid": "ეს უნდა იყოს {mxid}", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "about": "შესახებ", + "@about": { + "type": "String", + "placeholders": {} + }, + "changedTheDisplaynameTo": "{username} შეცვალა ნაჩვენები სახელი: '{displayname}'", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "commandHint_create": "ცარიელი ჯგუფური ჩატის შექმნა\nგამოიყენეთ --no-encryption გაშიფვრის გასათიშად", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "commandHint_dm": "პირდაპირი ჩატის დაწყება\nგამოიყენეთ --no-encryption გაშიფვრის გასათიშად", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "commandHint_html": "HTML ფორმატირებული ტექსტის გაგზავნა", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_myroomavatar": "თქვენი ფოტოს დაყენება ამ ოთახისათვის(mxc-uri-ს დახმარებით)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_myroomnick": "ამ ოთახისათვის ნაჩვენები სახელის დაყენება", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "commandHint_op": "მოცემული მომხმარებლისათვის უფლებების დონის დაყენება (ჩვეულებრივ: 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_react": "რეაქციის სახით პასუხის გაგზავნა", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "containsDisplayName": "ნაჩვენებ სახელს შეიცავს", + "@containsDisplayName": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "ეს კონტენტი გაგზავნილ იქნა სერვერის ადმინისტრატორებთან", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "ნაგულისხმევი უფლების დონე", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "ნაჩვენები სახელი შეიცვალა", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "editDisplayname": "ნაჩვენები სახელის შეცვლა", + "@editDisplayname": { + "type": "String", + "placeholders": {} + } +} diff --git a/assets/l10n/intl_ko.arb b/assets/l10n/intl_ko.arb new file mode 100644 index 0000000..d6f97fa --- /dev/null +++ b/assets/l10n/intl_ko.arb @@ -0,0 +1,3279 @@ +{ + "@@last_modified": "2021-08-14 12:41:09.975135", + "about": "소개", + "@about": { + "type": "String", + "placeholders": {} + }, + "accept": "수락", + "@accept": { + "type": "String", + "placeholders": {} + }, + "allChats": "모든 채팅", + "@allChats": { + "type": "String", + "placeholders": {} + }, + "cantOpenUri": "URI {uri}를 열 수 없습니다", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "chats": "채팅", + "@chats": { + "type": "String", + "placeholders": {} + }, + "commandHint_ban": "이 방에서 주어진 유저 영구 추방하기", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_html": "HTML 형식의 문자 보내기", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_invite": "주어진 유저 이 룸에 초대하기", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "commandHint_leave": "이 룸 나가기", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_me": "자신을 소개하세요", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "commandHint_plain": "형식이 지정되지 않은 문자 보내기", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_send": "문자 보내기", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "commandHint_unban": "주어진 유저를 이 방에서 영구추방 해제하기", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "loadMore": "더 불러오기…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "{count}명의 참가자 더 표시", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "lightTheme": "라이트", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "license": "라이선스", + "@license": { + "type": "String", + "placeholders": {} + }, + "help": "도움", + "@help": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "게스트가 참가할 수 있음", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "groups": "그룹 채팅", + "@groups": { + "type": "String", + "placeholders": {} + }, + "groupIsPublic": "그룹 채팅 공개", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "group": "그룹 채팅", + "@group": { + "type": "String", + "placeholders": {} + }, + "goToTheNewRoom": "새로운 방 가기", + "@goToTheNewRoom": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "초대받은 후부터", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "참가시점 이후로", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "forward": "전달", + "@forward": { + "type": "String", + "placeholders": {} + }, + "fontSize": "폰트 크기", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "fluffychat": "FluffyChat", + "@fluffychat": { + "type": "String", + "placeholders": {} + }, + "fileName": "파일 이름", + "@fileName": { + "type": "String", + "placeholders": {} + }, + "extremeOffensive": "매우 공격적임", + "@extremeOffensive": { + "type": "String", + "placeholders": {} + }, + "everythingReady": "모든 것이 준비됐어요!", + "@everythingReady": { + "type": "String", + "placeholders": {} + }, + "enterYourHomeserver": "당신의 홈서버를 입력하세요", + "@enterYourHomeserver": { + "type": "String", + "placeholders": {} + }, + "homeserver": "홈서버", + "@homeserver": {}, + "enterAnEmailAddress": "이메일 주소 입력", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName} 이 통화를 종료했습니다", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "encryptionNotEnabled": "암호화가 비활성화됨", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "encryption": "암호화", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "encrypted": "암호화됨", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "당신은 다시 암호화를 비활성화할 수 없습니다. 확실한가요?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "암호화 사용", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "이모트 팩 항상 사용하기", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "빈 채팅", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "emoteWarnNeedToPick": "이모트 단축키와 이미지를 골라야 합니다!", + "@emoteWarnNeedToPick": { + "type": "String", + "placeholders": {} + }, + "emoteShortcode": "이모트 단축키", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "이모트 설정", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "emotePacks": "방을 위한 이모트 팩", + "@emotePacks": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "올바르지 않은 이모트 단축키!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "이모트가 이미 존재합니다!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "방 아바타 수정", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "editRoomAliases": "방 별명 수정", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "editDisplayname": "표시 이름 수정", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "edit": "수정", + "@edit": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "파일 다운로드", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "표시 이름이 변경되었습니다", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "devices": "기기", + "@devices": { + "type": "String", + "placeholders": {} + }, + "deviceId": "기기 ID", + "@deviceId": { + "type": "String", + "placeholders": {} + }, + "device": "기기", + "@device": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "메시지 삭제", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "계정 삭제", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "delete": "삭제", + "@delete": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "새로 참가하는 유저들의 기본 권한 레벨", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "deactivateAccountWarning": "이것은 당신의 계정을 비활성화할 것입니다. 이것은 되돌릴 수 없습니다! 확실한가요?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "currentlyActive": "현재 활동 중", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "createNewSpace": "새로운 스페이스", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "💬 {username}님이 채팅을 생성함", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "create": "생성", + "@create": { + "type": "String", + "placeholders": {} + }, + "countParticipants": "{count} 참여자", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "couldNotDecryptMessage": "메시지 복호화할 수 없음: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "copyToClipboard": "클립보드에 복사", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "복사", + "@copy": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "클립보드에 복사됨", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "콘텐츠가 서버 운영자에게 신고되었습니다", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "containsUserName": "내 아이디 포함", + "@containsUserName": { + "type": "String", + "placeholders": {} + }, + "containsDisplayName": "내 닉네임 포함", + "@containsDisplayName": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "연락처가 채팅에 초대되었습니다", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "connect": "연결", + "@connect": { + "type": "String", + "placeholders": {} + }, + "confirm": "확인", + "@confirm": { + "type": "String", + "placeholders": {} + }, + "configureChat": "채팅 설정", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "아래의 숫자가 일치하는지 비교하세요", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "compareEmojiMatch": "아래의 이모지가 일치하는지 비교하세요", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "commandMissing": "{command} 는 명령어가 아닙니다.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "commandInvalid": "잘못된 명령어", + "@commandInvalid": { + "type": "String" + }, + "commandHint_react": "답장 반응으로 보내기", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "commandHint_op": "주어진 유저의 권한 레벨 설정 (기본:50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_myroomnick": "이 방의 표시 이름 설정하기", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "commandHint_myroomavatar": "이 방의 사진 설정하기 (by mxc-uri)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_kick": "주어진 유저 방에서 삭제하기", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_join": "주어진 방 참가하기", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "close": "닫기", + "@close": { + "type": "String", + "placeholders": {} + }, + "clearArchive": "저장 지우기", + "@clearArchive": {}, + "chooseAStrongPassword": "안전한 비밀번호를 설정하세요", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "chatHasBeenAddedToThisSpace": "이 스페이스에 채팅이 추가되었습니다", + "@chatHasBeenAddedToThisSpace": {}, + "chatDetails": "채팅 정보", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chatBackupDescription": "당신의 오래된 메시지는 보안 키로 보호됩니다. 이 키를 잃어버리지 마세요.", + "@chatBackupDescription": { + "type": "String", + "placeholders": {} + }, + "chatBackup": "채팅 백업", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "chat": "채팅", + "@chat": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "암호화가 손상되었습니다", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "changeYourAvatar": "아바타 바꾸기", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "채팅의 이름 바꾸기", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "스타일 바꾸기", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "홈서버 바꾸기", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changePassword": "비밀번호 바꾸기", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changedTheRoomInvitationLink": "{username}님이 초대 링크를 바꿈", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "{username}님이 방 별명을 바꿈", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username}님이 자신의 아바타를 바꿈", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username}님이 참가 규칙을 {joinRules} 로 바꿈", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username}님이 참가 규칙을 바꿈", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username}님이 대화 기록 설정을 {rules} 로 바꿈", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username}님이 대화 기록 설정을 변경함", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username}님이 게스트 접근 규칙을 {rules} 로 변경함", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username}님이 게스트 접근 규칙을 변경함", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username}님이 닉네임을 '{displayname}' 로 바꿈", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username}님이 채팅 권한을 바꿈", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatNameTo": "{username}님이 채팅 이름을 '{chatname}' 으로 바꿈", + "@changedTheChatNameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "chatname": { + "type": "String" + } + } + }, + "changedTheChatDescriptionTo": "{username}님이 채팅 설명을 '{description}' 으로 변경함", + "@changedTheChatDescriptionTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "description": { + "type": "String" + } + } + }, + "changedTheChatAvatar": "{username}님이 채팅 아바타를 바꿈", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changeDeviceName": "기기 이름 바꾸기", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "cancel": "취소", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "botMessages": "봇 메시지", + "@botMessages": { + "type": "String", + "placeholders": {} + }, + "blocked": "차단됨", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "blockDevice": "기기 차단", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username}님이 {targetName}님을 영구 추방함", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "banned": "영구 추방됨", + "@banned": { + "type": "String", + "placeholders": {} + }, + "banFromChat": "채팅에서 영구 추방", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "badServerVersionsException": "이 홈서버가 지원하는 Spec 버전:\n{serverVersions}\n하지만 이 앱은 {supportedVersions}만 지원합니다", + "@badServerVersionsException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "sendOnEnter": "엔터로 보내기", + "@sendOnEnter": {}, + "badServerLoginTypesException": "홈서버가 지원하는 로그인 유형:\n{serverVersions}\n하지만 이 앱에서 지원하는 것은:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "autoplayImages": "자동으로 움직이는 스티커와 이모트 재생", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "askVerificationRequest": "{username}님의 인증 요청을 수락할까요?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "askSSSSSign": "다른 사람을 서명하기 위해서, 저장 비밀번호나 복구 키를 입력해주세요.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "areYouSureYouWantToLogout": "로그아웃하고 싶은 것이 확실한가요?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "확실한가요?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "게스트 유저의 참가 여부", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "archive": "저장", + "@archive": { + "type": "String", + "placeholders": {} + }, + "appLock": "앱 잠금", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "anyoneCanJoin": "누구나 참가할 수 있음", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "{senderName}님이 전화에 응답했습니다", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "alias": "별명", + "@alias": { + "type": "String", + "placeholders": {} + }, + "admin": "운영자", + "@admin": { + "type": "String", + "placeholders": {} + }, + "addToSpace": "스페이스에 추가", + "@addToSpace": {}, + "addEmail": "이메일 추가", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐 {username}님이 종단간 암호화를 활성화함", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "계정", + "@account": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 {username}님이 초대를 수락함", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "ignore": "무시", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "identity": "신원", + "@identity": { + "type": "String", + "placeholders": {} + }, + "id": "ID", + "@id": { + "type": "String", + "placeholders": {} + }, + "howOffensiveIsThisContent": "이 콘텐츠가 얼마나 모욕적인가요?", + "@howOffensiveIsThisContent": { + "type": "String", + "placeholders": {} + }, + "hideUnknownEvents": "알 수 없는 이벤트 숨기기", + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "hideRedactedEvents": "지워진 이벤트 숨기기", + "@hideRedactedEvents": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{username}님이 {targetName}님에 대한 초대를 철회함", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "guestsAreForbidden": "게스트가 들어올 수 없음", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "groupWith": "{displayname}님과의 그룹", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "errorObtainingLocation": "위치 얻는 중 오류: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "editBlockedServers": "차단된 서버 수정", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "directChats": "다이렉트 채팅", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "dateWithYear": "{year}-{month}-{day}", + "@dateWithYear": { + "type": "String", + "placeholders": { + "year": { + "type": "String" + }, + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "dateWithoutYear": "{month}-{day}", + "@dateWithoutYear": { + "type": "String", + "placeholders": { + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "darkTheme": "다크", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "yes": "확인", + "@yes": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "메시지 작성…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "이 주소로 당신의 비밀번호를 복구할 수 있습니다.", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "wipeChatBackup": "새로운 복구키를 생성하기 위해 채팅 백업을 초기화할까요?", + "@wipeChatBackup": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "왜 이것을 신고하려고 하나요?", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "참가 제한 설정", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "whoCanPerformWhichAction": "누가 어떤 행동을 할 수 있는지", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "weSentYouAnEmail": "우리가 당신에게 이메일을 보냈습니다", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "warning": "경고!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "wallpaper": "배경:", + "@wallpaper": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "상대가 숫자를 수락하길 기다리는 중…", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "상대가 이모지를 수락하길 기다리는 중…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "상대가 요청을 수락하길 기다리는 중…", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "음성 메시지", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "모두에게 보임", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "모든 참가자에게 보임", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "videoCall": "영상 통화", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "verifyTitle": "다른 계정 확인 중", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "성공적으로 확인했어요!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "verifyStart": "확인 시작", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "verify": "확인", + "@verify": { + "type": "String", + "placeholders": {} + }, + "verified": "확인됨", + "@verified": { + "type": "String", + "placeholders": {} + }, + "username": "유저 이름", + "@username": { + "type": "String", + "placeholders": {} + }, + "userLeftTheChat": "🚪 {username}님이 채팅을 나감", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userIsTyping": "{username}님이 입력 중…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userAndUserAreTyping": "{username}님과 {username2}님이 입력 중…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userAndOthersAreTyping": "{username}님 + {count}명이 입력 중…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "unpin": "고정 해제", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "unknownEncryptionAlgorithm": "알 수 없는 암호화 알고리즘", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unblockDevice": "기기 차단 해제", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "pin": "고정", + "@pin": { + "type": "String", + "placeholders": {} + }, + "pickImage": "이미지 고르기", + "@pickImage": { + "type": "String", + "placeholders": {} + }, + "passwordRecovery": "비밀번호 복구", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "비밀번호 까먹음", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "password": "비밀번호", + "@password": { + "type": "String", + "placeholders": {} + }, + "participant": "참여자", + "@participant": { + "type": "String", + "placeholders": {} + }, + "openInMaps": "지도에서 열기", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "addAccount": "계정 추가", + "@addAccount": {}, + "openCamera": "카메라 열기", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "앱을 열어서 메시지를 읽으세요", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "앗, 무언가가 잘못되었습니다…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "oopsPushError": "앗! 안타깝게도, 푸시 알림을 설정하는 중 오류가 발생했습니다.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "online": "온라인", + "@online": { + "type": "String", + "placeholders": {} + }, + "ok": "확인", + "@ok": { + "type": "String", + "placeholders": {} + }, + "offline": "오프라인", + "@offline": { + "type": "String", + "placeholders": {} + }, + "offensive": "모욕적임", + "@offensive": { + "type": "String", + "placeholders": {} + }, + "obtainingLocation": "위치 얻는 중…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "numUsersTyping": "{count}명이 입력 중…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "notificationsEnabledForThisAccount": "이 계정에서 알림이 활성화되었습니다", + "@notificationsEnabledForThisAccount": { + "type": "String", + "placeholders": {} + }, + "notifications": "알림", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "noPermission": "권한 없음", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "scanQrCode": "QR 코드 스캔", + "@scanQrCode": {}, + "noMatrixServer": "{server1}은 matrix 서버가 아닙니다, {server2}를 대신 사용할까요?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "next": "다음", + "@next": { + "type": "String", + "placeholders": {} + }, + "logInTo": "{homeserver} 에 로그인", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "login": "로그인", + "@login": { + "type": "String", + "placeholders": {} + }, + "locationPermissionDeniedNotice": "위치 권한이 거부되었습니다. 위치를 공유하기 위해서 허용해주세요.", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "locationDisabledNotice": "위치 서비스가 비활성화되었습니다. 위치를 공유하려면 활성화시켜주세요.", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "no": "아니요", + "@no": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "새로운 확인 요청!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "💬 FluffyChat에서 새로운 메시지", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "newChat": "새 채팅", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "muteChat": "채팅 음소거", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "messages": "메시지", + "@messages": { + "type": "String", + "placeholders": {} + }, + "mention": "멘션", + "@mention": { + "type": "String", + "placeholders": {} + }, + "logout": "로그아웃", + "@logout": { + "type": "String", + "placeholders": {} + }, + "unreadChats": "{unreadCount, plural, =1{읽지 않은 채팅 1} other{{unreadCount} 개}}", + "@unreadChats": { + "type": "String", + "placeholders": { + "unreadCount": { + "type": "int" + } + } + }, + "renderRichContent": "풍부한 메시지 콘텐츠 렌더링", + "@renderRichContent": { + "type": "String", + "placeholders": {} + }, + "unavailable": "사용할 수 없음", + "@unavailable": { + "type": "String", + "placeholders": {} + }, + "all": "모두", + "@all": { + "type": "String", + "placeholders": {} + }, + "yourPublicKey": "당신의 공개 키", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "당신은 이 채팅에서 영구 추방되었습니다", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "당신은 더 이상 이 채팅에 참여하지 않습니다", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "you": "당신", + "@you": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "대화 기록 설정", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "userSentUnknownEvent": "{username}님이 {type} 이벤트 보냄", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "unmuteChat": "음소거 해제", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "unknownEvent": "알 수 없는 이벤트 '{type}'", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "unknownDevice": "알 수 없는 기기", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username}님이 {targetName}님에대한 영구추방을 해제함", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "tryToSendAgain": "다시 보내도록 시도", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "transferFromAnotherDevice": "다른 기기에서 가져오기", + "@transferFromAnotherDevice": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "너무 많은 요청. 잠시 후에 다시 시도해주세요!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "toggleUnread": "메시지 안/읽음 으로 표시", + "@toggleUnread": { + "type": "String", + "placeholders": {} + }, + "toggleMuted": "음소거 토글", + "@toggleMuted": { + "type": "String", + "placeholders": {} + }, + "toggleFavorite": "즐겨찾기 토글", + "@toggleFavorite": { + "type": "String", + "placeholders": {} + }, + "title": "FluffyChat", + "@title": { + "description": "Title for the application", + "type": "String", + "placeholders": {} + }, + "theyMatch": "일치합니다", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "일치하지 않습니다", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "systemTheme": "시스템", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWait": "동기화 중... 기다려주세요.", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "submit": "제출", + "@submit": { + "type": "String", + "placeholders": {} + }, + "statusExampleMessage": "오늘은 어떤 기분인가요?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "status": "상태", + "@status": { + "type": "String", + "placeholders": {} + }, + "startedACall": "{senderName} 가 통화 시작함", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "spaceName": "스페이스 이름", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "spaceIsPublic": "스페이스 공개", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "singlesignon": "단일 계정 로그인(SSO)", + "@singlesignon": { + "type": "String", + "placeholders": {} + }, + "pushRules": "푸시 규칙", + "@pushRules": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "마지막 활동: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "ignoredUsers": "무시된 사용자", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "pleaseEnter4Digits": "4자리 숫자를 입력하거나 앱 잠금을 사용하지 않도록 하려면 비워두세요.", + "@pleaseEnter4Digits": { + "type": "String", + "placeholders": {} + }, + "pleaseChooseAPasscode": "비밀번호를 골라주세요", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "pleaseChoose": "선택해주세요", + "@pleaseChoose": { + "type": "String", + "placeholders": {} + }, + "play": "{fileName} 재생", + "@play": { + "type": "String", + "placeholders": { + "fileName": { + "type": "String" + } + } + }, + "people": "사람들", + "@people": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "비밀번호가 변경됨", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "비밀번호나 복구 키", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "or": "이나", + "@or": { + "type": "String", + "placeholders": {} + }, + "serverRequiresEmail": "이 서버는 가입을 위해 당신의 이메일을 확인해야 합니다.", + "@serverRequiresEmail": {}, + "enableMultiAccounts": "(베타) 이 기기에서 다중 계정 활성화", + "@enableMultiAccounts": {}, + "bundleName": "번들 이름", + "@bundleName": {}, + "removeFromBundle": "이 번들에서 삭제", + "@removeFromBundle": {}, + "addToBundle": "번들에 추가", + "@addToBundle": {}, + "editBundlesForAccount": "이 계정의 번들 수정", + "@editBundlesForAccount": {}, + "oneClientLoggedOut": "당신의 클라이언트 중 하나가 로그아웃 됨", + "@oneClientLoggedOut": {}, + "onlineKeyBackupEnabled": "온라인 키 백업이 활성화됨", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "아무 방도 발견되지 않았어요…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "noPasswordRecoveryDescription": "당신은 비밀번호를 복구할 방법을 추가하지 않았습니다.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "none": "없음", + "@none": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "이 휴대폰에 Firebase Cloud Messaging 서비스가 없는 것 같습니다. FluffyChat에서 푸시 알림을 받으려면 ntfy 사용을 추천합니다. ntfy 혹은 다른 푸시 알림 제공자를 사용하면 알림을 보안적인 방법으로 받을 수 있습니다. ntfy는 PlayStore와 F-Droid에서 설치 가능합니다.", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "당신은 방이 공개적으로 접근 가능하지 않을 때만 암호화를 켤 수 있습니다.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "이모트 발견되지 않음. 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "서버에 연결 없음", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "needPantalaimonWarning": "지금 종단간 암호화를 사용하기 위해서는 Pantalaimon이 필요하다는 것을 알아주세요.", + "@needPantalaimonWarning": { + "type": "String", + "placeholders": {} + }, + "moderator": "관리자", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "memberChanges": "참가자 변경", + "@memberChanges": { + "type": "String", + "placeholders": {} + }, + "loadingPleaseWait": "로딩 중... 기다려 주세요.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "채팅을 나갔습니다", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "leave": "나가기", + "@leave": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "소스 코드", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "skip": "스킵", + "@skip": { + "type": "String", + "placeholders": {} + }, + "showPassword": "비밀번호 보이기", + "@showPassword": { + "type": "String", + "placeholders": {} + }, + "shareLocation": "위치 보내기", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "sharedTheLocation": "{username}님이 위치를 공유함", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "share": "공유", + "@share": { + "type": "String", + "placeholders": {} + }, + "settings": "설정", + "@settings": { + "type": "String", + "placeholders": {} + }, + "setStatus": "상태 설정", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "setPermissionsLevel": "권한 레벨 설정", + "@setPermissionsLevel": { + "type": "String", + "placeholders": {} + }, + "setInvitationLink": "초대 링크 설정", + "@setInvitationLink": { + "type": "String", + "placeholders": {} + }, + "setCustomEmotes": "맞춤 이모트 설정", + "@setCustomEmotes": { + "type": "String", + "placeholders": {} + }, + "setAsCanonicalAlias": "주 별명으로 설정", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "sentCallInformations": "{senderName} 이 통화 정보 보냄", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "sentAVideo": "🎥 {username}님이 영상을 보냄", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sendOriginal": "원본 보내기", + "@sendOriginal": { + "type": "String", + "placeholders": {} + }, + "sendMessages": "메시지 보내기", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "sendImage": "이미지 보내기", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendFile": "파일 보내기", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendAudio": "오디오 보내기", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendAsText": "텍스트로 보내기", + "@sendAsText": { + "type": "String" + }, + "sendAMessage": "메시지 보내기", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "send": "보내기", + "@send": { + "type": "String", + "placeholders": {} + }, + "seenByUser": "{username}님이 읽음", + "@seenByUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "security": "보안", + "@security": { + "type": "String", + "placeholders": {} + }, + "search": "검색", + "@search": { + "type": "String", + "placeholders": {} + }, + "saveFile": "파일 저장", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "방 버전", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "방이 업그레이드되었습니다", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "requestPermission": "권한 요청", + "@requestPermission": { + "type": "String", + "placeholders": {} + }, + "reason": "이유", + "@reason": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "공개 방", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "privacy": "프라이버시", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "웹사이트의 가이드를 따르고 다음 버튼을 눌러주세요.", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "유저 이름을 입력해주세요", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPin": "PIN을 입력해주세요", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPassword": "비밀번호를 입력해주세요", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "joinRoom": "방 참가하기", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "👋 {username}님이 채팅에 참가함", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "isTyping": "입력 중…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "inviteText": "{username}님이 당신을 FluffyChat에 초대했습니다.\n1. FluffyChat 설치: https://fluffychat.im \n2. 가입하거나 로그인 \n3. 초대 링크 열기: \n {link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "inviteForMe": "초대됨", + "@inviteForMe": { + "type": "String", + "placeholders": {} + }, + "invitedUsersOnly": "초대된 유저만", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "invitedUser": "📩 {username}님이 {targetName}님을 초대함", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "invited": "초대됨", + "@invited": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "연락처를 {groupName}에 초대", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "inviteContact": "연락처 초대", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "inoffensive": "모욕적이지 않음", + "@inoffensive": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "올바르지 않은 복구 키나 비밀번호", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "iHaveClickedOnLink": "링크를 클릭했어요", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "sentASticker": "😊 {username}님이 스티커를 보냄", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAPicture": "🖼️ {username}님이 사진을 보냄", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAnAudio": "🎤 {username}님이 오디오를 보냄", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAFile": "📁 {username}님이 파일을 보냄", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sendVideo": "영상 보내기", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "sendSticker": "스티커 보내기", + "@sendSticker": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "메시지 신고", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "reply": "답장", + "@reply": { + "type": "String", + "placeholders": {} + }, + "replaceRoomWithNewerVersion": "방 새로운 버전으로 대체하기", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "removeYourAvatar": "아바타 지우기", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "채팅에서 영구추방 해제됨", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "removeDevice": "기기 삭제", + "@removeDevice": { + "type": "String", + "placeholders": {} + }, + "removedBy": "{username}에 의해 지워짐", + "@removedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "removeAllOtherDevices": "모든 다른 기기에서 지우기", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "remove": "지우기", + "@remove": { + "type": "String", + "placeholders": {} + }, + "rejoin": "다시 참가", + "@rejoin": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "{username}님이 초대를 거절함", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "reject": "거절", + "@reject": { + "type": "String", + "placeholders": {} + }, + "register": "가입", + "@register": { + "type": "String", + "placeholders": {} + }, + "redactMessage": "메시지 지우기", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "redactedAnEvent": "{username}님이 이벤트를 지움", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "recording": "녹음", + "@recording": { + "type": "String", + "placeholders": {} + }, + "pleaseClickOnLink": "이메일의 링크를 클릭하고 진행해주세요.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "kickFromChat": "채팅에서 추방", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "kickedAndBanned": "🙅 {username}님이 {targetName}님을 추방하고 차단함", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kicked": "👞 {username}님이 {targetName}님을 추방함", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "link": "링크", + "@link": {}, + "unverified": "확인되지 않음", + "@unverified": {}, + "yourChatBackupHasBeenSetUp": "당신의 채팅 백업이 설정되었습니다.", + "@yourChatBackupHasBeenSetUp": {}, + "time": "시간", + "@time": {}, + "messageType": "메시지 유형", + "@messageType": {}, + "openGallery": "갤러리 열기", + "@openGallery": {}, + "sender": "발신자", + "@sender": {}, + "messageInfo": "메시지 정보", + "@messageInfo": {}, + "repeatPassword": "비밀번호 다시 입력", + "@repeatPassword": {}, + "start": "시작", + "@start": {}, + "removeFromSpace": "스페이스에서 삭제", + "@removeFromSpace": {}, + "addToSpaceDescription": "이 채팅을 추가할 스페이스를 선택하세요.", + "@addToSpaceDescription": {}, + "commandHint_discardsession": "세션 삭제", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "commandHint_dm": "다이렉트 채팅 시작\t\n--no-encryption을 사용해 암호화 비활성화", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "commandHint_clearcache": "캐시 지우기", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_create": "빈 그룹 채팅을 생성\n--no-encryption을 사용해 암호화를 비활성화", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "openVideoCamera": "영상용 카메라 열기", + "@openVideoCamera": { + "type": "String", + "placeholders": {} + }, + "publish": "공개", + "@publish": {}, + "videoWithSize": "영상 ({size})", + "@videoWithSize": { + "type": "String", + "placeholders": { + "size": { + "type": "String" + } + } + }, + "dismiss": "닫기", + "@dismiss": {}, + "markAsRead": "읽음으로 표시하기", + "@markAsRead": {}, + "reportUser": "유저 신고", + "@reportUser": {}, + "openChat": "채팅 열기", + "@openChat": {}, + "reactedWith": "{sender}가 {reaction}로 반응함", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "confirmEventUnpin": "이벤트를 영구적으로 고정 해제할 것이 확실한가요?", + "@confirmEventUnpin": {}, + "pinMessage": "방에 고정", + "@pinMessage": {}, + "emojis": "이모지", + "@emojis": {}, + "voiceCall": "음성 통화", + "@voiceCall": {}, + "placeCall": "전화 걸기", + "@placeCall": {}, + "experimentalVideoCalls": "실험적인 영상 통화", + "@experimentalVideoCalls": {}, + "unsupportedAndroidVersion": "지원되지 않는 안드로이드 버전", + "@unsupportedAndroidVersion": {}, + "unsupportedAndroidVersionLong": "이 기능은 새로운 안드로이드 버전을 요구합니다. Lineage OS 지원이나 업데이트를 확인해주세요.", + "@unsupportedAndroidVersionLong": {}, + "videoCallsBetaWarning": "영상 통화는 베타임을 확인해주세요. 의도한 대로 작동하지 않거나 모든 플랫폼에서 작동하지 않을 수 있습니다.", + "@videoCallsBetaWarning": {}, + "emailOrUsername": "이메일이나 유저 이름", + "@emailOrUsername": {}, + "confirmMatrixId": "계정을 삭제하려면 Matrix ID를 입력해 주세요.", + "@confirmMatrixId": {}, + "commandHint_googly": "왕눈이 눈알 보내기", + "@commandHint_googly": {}, + "googlyEyesContent": "{senderName} 님이 왕눈이 눈알을 보냈습니다", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "commandHint_markasgroup": "그룹 채팅으로 만들기", + "@commandHint_markasgroup": {}, + "dehydrate": "세션을 내보내고 기기 초기화 하기", + "@dehydrate": {}, + "dehydrateWarning": "이 동작은 되돌릴 수 없습니다. 백업 파일을 꼭 안전하게 보관하세요.", + "@dehydrateWarning": {}, + "hugContent": "{senderName}님이 당신을 허그합니다", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "jumpToLastReadMessage": "마지막으로 읽은 메시지로 이동", + "@jumpToLastReadMessage": {}, + "allRooms": "모든 그룹 채팅", + "@allRooms": { + "type": "String", + "placeholders": {} + }, + "commandHint_cuddle": "미소 보내기", + "@commandHint_cuddle": {}, + "widgetVideo": "영상", + "@widgetVideo": {}, + "reportErrorDescription": "😭 이런. 무언가 잘못되었습니다. 원한다면, 개발자에게 버그를 신고할 수 있습니다.", + "@reportErrorDescription": {}, + "widgetJitsi": "Jitsi Meet", + "@widgetJitsi": {}, + "indexedDbErrorLong": "메시지 저장은 기본적으로 사생활 보호 모드에서 사용할 수 없습니다.\n- about:config 로 이동\n- dom.indexedDB.privateBrowsing.enabled 를 true로 설정\n그렇지 않으면 FluffyChat을 실행할 수 없습니다.", + "@indexedDbErrorLong": {}, + "startFirstChat": "첫 번째 채팅을 시작하기", + "@startFirstChat": {}, + "callingAccount": "통화 계정", + "@callingAccount": {}, + "setColorTheme": "색상 테마 설정:", + "@setColorTheme": {}, + "nextAccount": "다음 계정", + "@nextAccount": {}, + "allSpaces": "모든 스페이스", + "@allSpaces": {}, + "supposedMxid": "{mxid} 이어야 함", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "user": "유저", + "@user": {}, + "youAcceptedTheInvitation": "👍 초대를 수락했습니다", + "@youAcceptedTheInvitation": {}, + "youInvitedBy": "📩 {user}님에 의해 초대되었습니다", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "banUserDescription": "유저는 채팅에서 영구 추방되며 추방 해제 전까지 채팅을 다시 입력할 수 없습니다.", + "@banUserDescription": {}, + "widgetEtherpad": "텍스트 메모", + "@widgetEtherpad": {}, + "removeDevicesDescription": "이 기기에서 로그아웃되며 더 이상 메시지를 받을 수 없습니다.", + "@removeDevicesDescription": {}, + "separateChatTypes": "다이렉트 채팅과 그룹 채팅 분리", + "@separateChatTypes": { + "type": "String", + "placeholders": {} + }, + "tryAgain": "다시 시도하기", + "@tryAgain": {}, + "youKickedAndBanned": "🙅 {user}님을 영구 추방했습니다", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "unbanUserDescription": "유저가 다시 채팅을 입력할 수 있습니다.", + "@unbanUserDescription": {}, + "youRejectedTheInvitation": "초대를 거부했습니다", + "@youRejectedTheInvitation": {}, + "otherCallingPermissions": "마이크, 카메라 그리고 다름 FluffyChat 권한", + "@otherCallingPermissions": {}, + "messagesStyle": "메세지:", + "@messagesStyle": {}, + "widgetUrlError": "유효한 URL이 아닙니다.", + "@widgetUrlError": {}, + "newSpaceDescription": "스페이스를 사용하면 채팅을 통합하고 비공개 또는 공개 커뮤니티를 구축할 수 있습니다.", + "@newSpaceDescription": {}, + "chatDescription": "채팅 설명", + "@chatDescription": {}, + "callingAccountDetails": "FluffyChat이 android 전화앱을 사용 할 수 있도록 허가.", + "@callingAccountDetails": {}, + "enterSpace": "스페이스에 입장", + "@enterSpace": {}, + "encryptThisChat": "이 채팅을 암호화", + "@encryptThisChat": {}, + "previousAccount": "이전 계정", + "@previousAccount": {}, + "reopenChat": "채팅 다시 열기", + "@reopenChat": {}, + "pleaseEnterRecoveryKey": "당신의 복구키를 입력하세요:", + "@pleaseEnterRecoveryKey": {}, + "widgetNameError": "표시 이름을 입력하세요.", + "@widgetNameError": {}, + "addWidget": "위젯 추가", + "@addWidget": {}, + "countFiles": "{count}개의 파일", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "noKeyForThisMessage": "이것은 이 메시지가 당신이 이 기기를 서명하기 전에 발송되었기 때문에 일어났을 수 있습니다.\n\n이것은 또한 발송자가 당신의 기기를 차단하였거나 혹은 인터넷 연결이 잘못되었을 수 있습니다.\n\n다른 세션에서 이 메시지를 읽을 수 있나요? 그렇다면 그 메시지를 옮길 수 있습니다! 설정 > 기기로 가서 기기를 서로 증명하세요. 다음번에 방을 열었을 때 두 세션이 모두 작동중이라면, 키가 자동으로 옮겨질것입니다.\n\n로그아웃하거나 기기를 바꿀 때 키를 잃고싶지 않으신가요? 설정에서 채팅 백업을 사용중인지 확인하세요.", + "@noKeyForThisMessage": {}, + "hydrateTor": "TOR 사용자: 내보낸 세션 불러오기", + "@hydrateTor": {}, + "pushNotificationsNotAvailable": "푸시 알림 사용 불가", + "@pushNotificationsNotAvailable": {}, + "storeInAppleKeyChain": "Apple KeyChain에 저장하기", + "@storeInAppleKeyChain": {}, + "hydrate": "백업 파일로부터 가져오기", + "@hydrate": {}, + "invalidServerName": "잘못된 서버 이름", + "@invalidServerName": {}, + "chatPermissions": "채팅 권한", + "@chatPermissions": {}, + "storeInAndroidKeystore": "Android KeyStore에 저장하기", + "@storeInAndroidKeystore": {}, + "signInWithPassword": "비밀번호로 로그인", + "@signInWithPassword": {}, + "makeAdminDescription": "유저를 한 번 관리자로 만들면, 당신과 같은 권한을 가지기때문에 권한 회수가 불가능합니다.", + "@makeAdminDescription": {}, + "saveKeyManuallyDescription": "공유나 클립보드를 이용해 수동으로 키를 저장합니다.", + "@saveKeyManuallyDescription": {}, + "whyIsThisMessageEncrypted": "왜 이 메시지를 읽을 수 없나요?", + "@whyIsThisMessageEncrypted": {}, + "setChatDescription": "채팅 설명 설정", + "@setChatDescription": {}, + "importFromZipFile": ".zip 파일에서 불러오기", + "@importFromZipFile": {}, + "noOtherDevicesFound": "다른 기기 발견되지 않음", + "@noOtherDevicesFound": {}, + "redactedBy": "{username}님이 삭제함", + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "signInWith": "{provider}로 로그인", + "@signInWith": { + "type": "String", + "placeholders": { + "provider": { + "type": "String" + } + } + }, + "fileIsTooBigForServer": "전송에 실패했습니다. 서버는 {max}가 넘는 파일을 지원하지 않습니다.", + "@fileIsTooBigForServer": {}, + "callingPermissions": "통화 권한", + "@callingPermissions": {}, + "readUpToHere": "여기까지 읽음", + "@readUpToHere": {}, + "unlockOldMessages": "오래된 메시지 잠금 해제하기", + "@unlockOldMessages": {}, + "numChats": "{number}개의 채팅", + "@numChats": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "optionalRedactReason": "(선택) 이 메시지를 편집하는 이유...", + "@optionalRedactReason": {}, + "archiveRoomDescription": "채팅이 보관함으로 이동합니다. 다른 유저들은 당신이 떠난다는것을 볼 수 있습니다.", + "@archiveRoomDescription": {}, + "exportEmotePack": ".zip 파일로 이모트 내보내기", + "@exportEmotePack": {}, + "switchToAccount": "계정 {number}로 전환", + "@switchToAccount": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "pleaseEnterRecoveryKeyDescription": "오래된 메시지를 잠금 해제하려면, 이전 세션에서 생성된 복호화 키를 입력하세요. 복호화 키는 비밀번호가 아닙니다.", + "@pleaseEnterRecoveryKeyDescription": {}, + "inviteContactToGroupQuestion": "{contact} 를 \"{groupName}\"에 초대할까요?", + "@inviteContactToGroupQuestion": {}, + "redactedByBecause": "{username}님이 삭제함. 사유: \"{reason}\"", + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "youHaveWithdrawnTheInvitationFor": "{user}님에 대한 초대를 철회함", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "appearOnTopDetails": "앱이 상단에 표시되도록 허용 (이미 FluffyChat을 통화 계정으로 설정한 경우에는 필요하지 않음)", + "@appearOnTopDetails": {}, + "enterRoom": "방에 입장", + "@enterRoom": {}, + "youInvitedUser": "📩 {user}님을 초대했습니다", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "fileHasBeenSavedAt": "{path}에 파일 저장됨", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "redactMessageDescription": "메시지는 이 대화의 모든 참여자에게 삭제될 것 입니다. 되돌릴 수 없습니다.", + "@redactMessageDescription": {}, + "recoveryKey": "복구키", + "@recoveryKey": {}, + "invalidInput": "잘못된 입력!", + "@invalidInput": {}, + "dehydrateTorLong": "TOR 사용자들은 창을 닫기 전에 세션을 내보내는것이 권장됩니다.", + "@dehydrateTorLong": {}, + "doNotShowAgain": "다시 보지 않기", + "@doNotShowAgain": {}, + "report": "신고", + "@report": {}, + "hideUnimportantStateEvents": "중요하지 않은 상태 이벤트 숨기기", + "@hideUnimportantStateEvents": {}, + "screenSharingTitle": "화면 공유", + "@screenSharingTitle": {}, + "widgetCustom": "사용자 정의", + "@widgetCustom": {}, + "youBannedUser": "{user}님을 영구 추방함", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "addChatDescription": "채팅 설명 추가하기...", + "@addChatDescription": {}, + "hasKnocked": "🚪 {user}님이 참가를 요청했습니다", + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "openLinkInBrowser": "브라우저에서 링크 열기", + "@openLinkInBrowser": {}, + "disableEncryptionWarning": "보안상의 이유로 암호화가 활성화된 채팅에서 암호화를 비활성화 할 수 없습니다.", + "@disableEncryptionWarning": {}, + "directChat": "다이렉트 채팅", + "@directChat": {}, + "wrongPinEntered": "잘못된 pin입니다! {seconds}초 후에 다시 시도하세요...", + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "sendTypingNotifications": "입력 알림 보내기", + "@sendTypingNotifications": {}, + "inviteGroupChat": "📨 그룹 채팅에 초대", + "@inviteGroupChat": {}, + "appearOnTop": "상단에 표시", + "@appearOnTop": {}, + "invitePrivateChat": "📨 비공개 채팅에 초대", + "@invitePrivateChat": {}, + "foregroundServiceRunning": "이 알림은 백그라운드 서비스가 실행중일때 표시됩니다.", + "@foregroundServiceRunning": {}, + "importEmojis": "이모지 불러오기", + "@importEmojis": {}, + "wasDirectChatDisplayName": "빈 채팅 (전 {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "noChatDescriptionYet": "채팅 설명이 아직 추가되지 않음.", + "@noChatDescriptionYet": {}, + "learnMore": "더 알아보기", + "@learnMore": {}, + "notAnImage": "이미지 파일이 아닙니다.", + "@notAnImage": {}, + "users": "유저", + "@users": {}, + "chatDescriptionHasBeenChanged": "채팅 설명 변경됨", + "@chatDescriptionHasBeenChanged": {}, + "newGroup": "새 그룹 채팅", + "@newGroup": {}, + "dehydrateTor": "TOR 사용자: 세션 내보내기", + "@dehydrateTor": {}, + "roomUpgradeDescription": "채팅이 새로운 방 버전으로 다시 생성됩니다. 모든 참가자는 새로운 채팅으로 전환해야합니다. https://spec.matrix.org/latest/rooms/ 에서 방 버전에 대해 자세히 알아볼 수 있습니다.", + "@roomUpgradeDescription": {}, + "pleaseEnterANumber": "0보다 큰 숫자를 입력하세요", + "@pleaseEnterANumber": {}, + "youKicked": "👞 {user}님을 추방했습니다", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "profileNotFound": "유저를 서버에서 찾을 수 있습니다. 연결 문제가 있거나 유저가 존재하지 않을 수 있습니다.", + "@profileNotFound": {}, + "jump": "점프", + "@jump": {}, + "sorryThatsNotPossible": "죄송합니다...그것은 불가능합니다", + "@sorryThatsNotPossible": {}, + "shareInviteLink": "초대 링크 공유", + "@shareInviteLink": {}, + "commandHint_markasdm": "Matrix ID를 위한 다이렉트 메시지 방으로 표시", + "@commandHint_markasdm": {}, + "recoveryKeyLost": "복구키를 분실하셨나요?", + "@recoveryKeyLost": {}, + "cuddleContent": "{senderName} 님이 당신에게 미소짓습니다", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "deviceKeys": "기기 키:", + "@deviceKeys": {}, + "emoteKeyboardNoRecents": "최근 사용한 이모트가 여기 나타납니다...", + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "setTheme": "테마 설정:", + "@setTheme": {}, + "youJoinedTheChat": "채팅에 참가하였습니다", + "@youJoinedTheChat": {}, + "widgetName": "이름", + "@widgetName": {}, + "errorAddingWidget": "위젯 추가중 오류 발생.", + "@errorAddingWidget": {}, + "commandHint_hug": "허그 보내기", + "@commandHint_hug": {}, + "replace": "대체", + "@replace": {}, + "youUnbannedUser": "{user}님의 영구 추방을 해제했습니다", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "newSpace": "새 스페이스", + "@newSpace": {}, + "pleaseTryAgainLaterOrChooseDifferentServer": "나중에 다시 시도하거나 다른 서버를 선택하십시오.", + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "createGroup": "새 그룹 채팅", + "@createGroup": {}, + "hydrateTorLong": "지난 TOR 이용에서 세션을 내보내셨나요? 빠르게 불러오고 채팅을 계속하세요.", + "@hydrateTorLong": {}, + "custom": "커스텀", + "@custom": {}, + "noBackupWarning": "경고! 채팅 백업을 켜지 않을경우, 당신은 암호화된 메시지에 대한 접근권한을 잃을것 입니다. 로그아웃 하기 전에 채팅을 백업하는것이 강력히 권장됩니다.", + "@noBackupWarning": {}, + "storeInSecureStorageDescription": "이 기기의 보안 스토리지에 복구키를 저장합니다.", + "@storeInSecureStorageDescription": {}, + "kickUserDescription": "유저는 채팅에서 추방되지만 영구 추방되지 않습니다. 공개 채팅의 경우, 언제든 유저가 다시 참가할 수 있습니다.", + "@kickUserDescription": {}, + "importNow": "지금 불러오기", + "@importNow": {}, + "invite": "초대", + "@invite": {}, + "indexedDbErrorTitle": "사생활 보호 모드의 문제", + "@indexedDbErrorTitle": {}, + "storeSecurlyOnThisDevice": "이 기기에 안전하게 저장", + "@storeSecurlyOnThisDevice": {}, + "screenSharingDetail": "FluffyChat에 당신의 화면을 공유하는중", + "@screenSharingDetail": {}, + "blockUsername": "유저 이름 무시", + "@blockUsername": {}, + "block": "차단", + "@block": {}, + "blockedUsers": "차단된 유저", + "@blockedUsers": {}, + "groupName": "그룹 채팅 이름", + "@groupName": {}, + "commandHint_sendraw": "raw json 전송", + "@commandHint_sendraw": {}, + "pleaseChooseAStrongPassword": "강력한 비밀번호를 사용하세요", + "@pleaseChooseAStrongPassword": {}, + "addChatOrSubSpace": "채팅 또는 하위 스페이스 추가", + "@addChatOrSubSpace": {}, + "subspace": "하위 스페이스", + "@subspace": {}, + "youInvitedToBy": "📩 링크를 통해 초대되셨습니다:\n{alias}", + "@youInvitedToBy": { + "placeholders": { + "alias": { + "type": "String" + } + } + }, + "databaseMigrationBody": "잠시만 기다리세요. 시간이 걸릴 수 있습니다.", + "@databaseMigrationBody": {}, + "select": "선택", + "@select": {}, + "joinSpace": "스페이스 참가", + "@joinSpace": {}, + "decline": "거절", + "@decline": {}, + "formattedMessagesDescription": "마크다운을 이용한 볼드등의 서식이 있는 메시지를 봅니다.", + "@formattedMessagesDescription": {}, + "completedKeyVerification": "{sender}가 키 검증을 완료함", + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "canceledKeyVerification": "{sender}가 키 검증을 취소함", + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "createGroupAndInviteUsers": "그룹 채팅을 생성하고 유저를 초대", + "@createGroupAndInviteUsers": {}, + "passwordsDoNotMatch": "비밀번호가 일치하지 않습니다", + "@passwordsDoNotMatch": {}, + "passwordIsWrong": "비밀번호가 틀립니다", + "@passwordIsWrong": {}, + "publicLink": "공개 링크", + "@publicLink": {}, + "thisDevice": "이 기기:", + "@thisDevice": {}, + "sendReadReceipts": "읽음 확인 보내기", + "@sendReadReceipts": {}, + "sendReadReceiptsDescription": "채팅의 다른 참가자들이 당신이 메시지를 읽었는지 볼 수 있습니다.", + "@sendReadReceiptsDescription": {}, + "verifyOtherUser": "🔐 다른 유저 확인", + "@verifyOtherUser": {}, + "hidePresences": "상태 목록을 숨길까요?", + "@hidePresences": {}, + "searchChatsRooms": "#chats, @users 검색...", + "@searchChatsRooms": {}, + "groupCanBeFoundViaSearch": "검색으로 그룹 채팅을 찾을 수 있음", + "@groupCanBeFoundViaSearch": {}, + "restoreSessionBody": "앱이 백업에서 세션을 복원하려 시도중입니다. {url} 에서 개발자에게 오류를 신고하세요. 오류 메시지는 다음과 같습니다: {error}", + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "acceptedKeyVerification": "{sender}가 키 검증을 수락함", + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "presencesToggle": "다른 유저의 상태 메시지 표시", + "@presencesToggle": { + "type": "String", + "placeholders": {} + }, + "wrongRecoveryKey": "죄송합니다... 올바른 복구키가 아닌것 같습니다.", + "@wrongRecoveryKey": {}, + "newPassword": "새 비밀번호", + "@newPassword": {}, + "searchForUsers": "@users 검색...", + "@searchForUsers": {}, + "leaveEmptyToClearStatus": "비워서 상태를 지우세요.", + "@leaveEmptyToClearStatus": {}, + "commandHint_ignore": "주어진 matrix ID를 무시", + "@commandHint_ignore": {}, + "commandHint_unignore": "주어진 matrix ID 무시 해제", + "@commandHint_unignore": {}, + "blockListDescription": "당신은 당신을 방해하는 유저들을 차단할 수 있습니다. 당신은 당신의 개인 차단 목록에 있는 어떠한 유저의 메시지와 방 초대도 받지 않을것 입니다.", + "@blockListDescription": {}, + "presenceStyle": "상태:", + "@presenceStyle": { + "type": "String", + "placeholders": {} + }, + "sessionLostBody": "세션을 잃었습니다. {url} 에서 개발자에게 오류를 신고하세요. 오류 메시지는 다음과 같습니다: {error}", + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "yourGlobalUserIdIs": "글로벌 유저 ID: ", + "@yourGlobalUserIdIs": {}, + "noUsersFoundWithQuery": "안타깝게도 \"{query}\"로 유저를 찾을 수 없습니다. 오타가 없는지 확인하십시오.", + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "nothingFound": "아무것도 찾지 못했습니다...", + "@nothingFound": {}, + "startConversation": "대화 시작", + "@startConversation": {}, + "databaseMigrationTitle": "데이터베이스가 최적화됨", + "@databaseMigrationTitle": {}, + "pleaseEnterYourCurrentPassword": "현재 비밀번호 입력", + "@pleaseEnterYourCurrentPassword": {}, + "publicSpaces": "공개 스페이스들", + "@publicSpaces": {}, + "initAppError": "앱 초기화중 오류 발생", + "@initAppError": {}, + "databaseBuildErrorBody": "SQlite 데이터베이스를 구축할 수 없습니다. 현재 레거시 데이터베이스 사용을 시도중입니다. {url} 에서 개발자에게 오류를 신고하세요. 오류 메시지는 다음과 같습니다: {error}", + "@databaseBuildErrorBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "sendTypingNotificationsDescription": "채팅의 다른 참가자들이 당신이 새 메시지를 입력중인것을 볼 수 있습니다.", + "@sendTypingNotificationsDescription": {}, + "formattedMessages": "형식이 지정된 메시지", + "@formattedMessages": {}, + "forwardMessageTo": "{roomName}에 메시지를 전달할까요?", + "@forwardMessageTo": { + "type": "String", + "placeholders": { + "roomName": { + "type": "String" + } + } + }, + "verifyOtherDevice": "🔐 다른 기기를 확인", + "@verifyOtherDevice": {}, + "verifyOtherUserDescription": "다른 유저를 확인하면, 당신은 당신이 누구에게 말하고있는지 알 수 있습니다. 💪\n\n확인을 시작할 때, 다른 유저는 앱에서 팝업을 볼 수 있습니다. 당신은 그런 다음 서로 비교해야 이모지 또는 숫자의 목록을 볼 수 있습니다.\n\n이 작업을 수행하는 가장 좋은 방법은 직접 만나거나 영상통화를 하는것입니다. 👭", + "@verifyOtherUserDescription": {}, + "verifyOtherDeviceDescription": "다른 장치를 확인하면, 장치와 키를 교환하고, 전반적인 보안을 증가시킵니다. 💪 확인을 시작하면 팝업은 두 장치에 나타납니다. 그런 다음 서로 비교해야 이모지 또는 숫자의 목록를 볼 수 있습니다. 확인을 시작하기 전에 모든 장치를 준비하세요. 🤳", + "@verifyOtherDeviceDescription": {}, + "isReadyForKeyVerification": "{sender}가 키 검증 준비를 완료함", + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "requestedKeyVerification": "{sender}가 키 검증을 요청함", + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "startedKeyVerification": "{sender}가 키 검증을 시작함", + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "transparent": "투명", + "@transparent": {}, + "incomingMessages": "메시지 수신함", + "@incomingMessages": {}, + "stickers": "스티커", + "@stickers": {}, + "discover": "탐색", + "@discover": {}, + "unreadChatsInApp": "{appname}: {unread}개의 읽지 않은 채팅", + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "appLockDescription": "앱을 사용하지 않을 때 pin으로 잠금", + "@appLockDescription": {}, + "calls": "전화", + "@calls": {}, + "globalChatId": "글로벌 채팅 ID", + "@globalChatId": {}, + "customEmojisAndStickers": "커스텀 이모지와 스티커", + "@customEmojisAndStickers": {}, + "accessAndVisibilityDescription": "채팅에 참가 할 수 있는 사람과 채팅을 볼 수 있는 범위", + "@accessAndVisibilityDescription": {}, + "accessAndVisibility": "채팅 가입과 대화 기록", + "@accessAndVisibility": {}, + "customEmojisAndStickersBody": "모든 채팅에서 사용할 수있는 커스텀 이모지와 스티커를 추가하거나 공유합니다.", + "@customEmojisAndStickersBody": {}, + "hideRedactedMessages": "삭제된 메시지 숨기기", + "@hideRedactedMessages": {}, + "hideRedactedMessagesBody": "누군가가 메시지를 삭제하면 메시지를 더 이상 볼 수 없습니다.", + "@hideRedactedMessagesBody": {}, + "hideInvalidOrUnknownMessageFormats": "잘못되거나 알 수 없는 메시지 형식 숨김", + "@hideInvalidOrUnknownMessageFormats": {}, + "overview": "개요", + "@overview": {}, + "notifyMeFor": "나에게 알림", + "@notifyMeFor": {}, + "passwordRecoverySettings": "비밀번호 복구 설정", + "@passwordRecoverySettings": {}, + "hideMemberChangesInPublicChats": "공개 채팅에서의 참가자 변화 숨김", + "@hideMemberChangesInPublicChats": {}, + "userWouldLikeToChangeTheChat": "{user}님이 참가를 희망합니다.", + "@userWouldLikeToChangeTheChat": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "noPublicLinkHasBeenCreatedYet": "공개 링크가 아직 생성되지 않았음", + "@noPublicLinkHasBeenCreatedYet": {}, + "knock": "참가 요청", + "@knock": {}, + "usersMustKnock": "유저들이 참가를 허가받아야함", + "@usersMustKnock": {}, + "knocking": "참가 요청중", + "@knocking": {}, + "chatCanBeDiscoveredViaSearchOnServer": "채팅은 {server} 에서 검색하여 찾을 수 있습니다.", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "noOneCanJoin": "아무도 참가할 수 없음", + "@noOneCanJoin": {}, + "thereAreCountUsersBlocked": "{count}명의 차단된 유저가 있습니다.", + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "minimumPowerLevel": "{level}은 최소 권한 레벨입니다.", + "@minimumPowerLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "String" + } + } + }, + "noDatabaseEncryption": "데이터베이스 암호화는 이 플랫폼에서 지원되지 않음", + "@noDatabaseEncryption": {}, + "publicChatAddresses": "공개 채팅 주소", + "@publicChatAddresses": {}, + "userRole": "유저 역할", + "@userRole": {}, + "createNewAddress": "새 주소 만들기", + "@createNewAddress": {}, + "hideMemberChangesInPublicChatsBody": "공개 채팅에 누군가가 참가하거나 떠날때 타임라인에 표시하지 않습니다.", + "@hideMemberChangesInPublicChatsBody": {}, + "searchMore": "더 검색...", + "@searchMore": {}, + "files": "파일", + "@files": {}, + "searchIn": "{chat}에서 검색...", + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "gallery": "갤러리", + "@gallery": {}, + "restricted": "스페이스 멤버로 제한", + "@restricted": {}, + "knockRestricted": "스페이스 멤버만 참가 요청 가능", + "@knockRestricted": {}, + "swipeRightToLeftToReply": "오른쪽에서 왼쪽으로 스와이프해서 답장", + "@swipeRightToLeftToReply": {}, + "alwaysUse24HourFormat": "false", + "@alwaysUse24HourFormat": { + "description": "Set to true to always display time of day in 24 hour format." + }, + "unread": "읽지 않은", + "@unread": {}, + "space": "스페이스", + "@space": {}, + "spaces": "스페이스", + "@spaces": {}, + "goToSpace": "스페이스로: {space}", + "@goToSpace": { + "type": "String", + "space": {} + }, + "markAsUnread": "읽지 않음으로 표시", + "@markAsUnread": {}, + "countChatsAndCountParticipants": "{chats} 채팅과 {participants} 참여자", + "@countChatsAndCountParticipants": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + }, + "participants": { + "type": "int" + } + } + }, + "joinedChats": "참가한 채팅", + "@joinedChats": {}, + "noMoreChatsFound": "채팅을 찾을 수 없습니다...", + "@noMoreChatsFound": {}, + "moderatorLevel": "{level} - 관리자", + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "adminLevel": "{level} - 운영자", + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "invitedBy": "📩 {user}님이 나를 초대함", + "@invitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "userLevel": "{level} - 유저", + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "noChatsFoundHere": "대화가 발견되지 않았습니다. 아래 버튼을 사용하여 새 대화를 시작해 보세요. ⤵️", + "@noChatsFoundHere": {}, + "changeTheVisibilityOfChatHistory": "채팅 기록 표시 여부 바꾸기", + "@changeTheVisibilityOfChatHistory": {}, + "changeTheCanonicalRoomAlias": "메인 공개 채팅 주소 바꾸기", + "@changeTheCanonicalRoomAlias": {}, + "sendCanceled": "전송 최소됨", + "@sendCanceled": {}, + "homeserverDescription": "당신의 모든 데이터는 이메일과 흡사하게 당신의 홈서버에 저장됩니다. 당신이 소통하고 싶은 사람들과 다른 서버를 사용해도 무관하니 당신이 원하는 홈서버를 선택해도 됩니다. https://matrix.org에서 자세히 알아보세요.", + "@homeserverDescription": {}, + "sendingAttachmentCountOfCount": "첨부파일 {length}개중 {index}번째 전송 중...", + "@sendingAttachmentCountOfCount": { + "type": "integer", + "placeholders": { + "index": { + "type": "int" + }, + "length": { + "type": "int" + } + } + }, + "serverLimitReached": "서버 한도에 도달했습니다! {seconds}초 기다리는 중...", + "@serverLimitReached": { + "type": "integer", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "noContactInformationProvided": "서버가 유효한 연락처 정보를 제공하지 않음", + "@noContactInformationProvided": {}, + "welcomeText": "안녕하세요 👋 FluffyChat이에요. 당신은 htpps://matrix.org와 호환되는 모든 홈서버를 사용할 수 있어요. 그리고 모두와 대화해보세요. 거대한 분산 대화망이니까요!", + "@welcomeText": {}, + "changeGeneralChatSettings": "일반 채팅 설정 번경하기", + "@changeGeneralChatSettings": {}, + "inviteOtherUsers": "다른 사용자를 이 채팅에 초대하기", + "@inviteOtherUsers": {}, + "changeTheChatPermissions": "채팅 권한 바꾸기", + "@changeTheChatPermissions": {}, + "calculatingFileSize": "파일 크기 계산 중...", + "@calculatingFileSize": {}, + "prepareSendingAttachment": "첨부된 파일 전송 준비 중...", + "@prepareSendingAttachment": {}, + "oneOfYourDevicesIsNotVerified": "당신의 기기 중 하나가 인증되지 않았음", + "@oneOfYourDevicesIsNotVerified": {}, + "noticeChatBackupDeviceVerification": "참고: 모든 기기에 채팅 백업을 설정하면 자동으로 서로 인증됩니다.", + "@noticeChatBackupDeviceVerification": {}, + "opacity": "불투명:", + "@opacity": {}, + "setWallpaper": "배경화면 설정하기", + "@setWallpaper": {}, + "manageAccount": "계정 관리하기", + "@manageAccount": {}, + "aboutHomeserver": "{homeserver}의 대해서", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "contactServerAdmin": "서버 관리자에게 연락하기", + "@contactServerAdmin": {}, + "contactServerSecurity": "서버 보안 관리자에게 연락하기", + "@contactServerSecurity": {}, + "supportPage": "지원 페이지", + "@supportPage": {}, + "name": "이름", + "@name": {}, + "serverInformation": "서버 정보:", + "@serverInformation": {}, + "version": "버전", + "@version": {}, + "website": "웹사이트", + "@website": {}, + "changeTheDescriptionOfTheGroup": "채팅 설명 바꾸기", + "@changeTheDescriptionOfTheGroup": {}, + "sendRoomNotifications": "@room 알림 보내기", + "@sendRoomNotifications": {}, + "chatPermissionsDescription": "이 채팅에서 특정 작업에 요구할 권한 레벨을 정의합니다. 권한 레벨 0, 50, 100은 일반적으로 유저, 관리자, 운영자를 나타내지만, 모든 숫자가 가능합니다.", + "@chatPermissionsDescription": {}, + "loginWithMatrixId": "Matrix-ID로 로그인", + "@loginWithMatrixId": {}, + "discoverHomeservers": "홈서버 찾아보기", + "@discoverHomeservers": {}, + "whatIsAHomeserver": "홈서버가 무엇인가요?", + "@whatIsAHomeserver": {}, + "doesNotSeemToBeAValidHomeserver": "호환되는 홈서버가 아닌 것 같습니다. URL을 올바르게 입력됐나요?", + "@doesNotSeemToBeAValidHomeserver": {}, + "continueText": "계속하기", + "@continueText": {}, + "updateInstalled": "🎉 {version} 업데이트가 설치되었습니다!", + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "changelog": "변경 기록", + "@changelog": {}, + "sendingAttachment": "첨부된 파일 전송 중...", + "@sendingAttachment": {}, + "generatingVideoThumbnail": "영상 썸네일 만드는 중...", + "@generatingVideoThumbnail": {}, + "compressVideo": "영상 압축 중...", + "@compressVideo": {}, + "blur": "블러:", + "@blur": {}, + "sendImages": "이미지 {count}개 보내기", + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "italicText": "기울어진 글꼴", + "@italicText": {}, + "boldText": "두꺼운 글꼴", + "@boldText": {}, + "appWantsToUseForLoginDescription": "웹사이트와 당신에 대한 정보를 공유하게됩니다.", + "@appWantsToUseForLoginDescription": {}, + "appWantsToUseForLogin": "'{server}'로 로그인", + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "otherPartyNotLoggedIn": "다른 구성원이 현재 로그인하지 않아 메시지를 수신하지 못합니다!", + "@otherPartyNotLoggedIn": {}, + "open": "열기", + "@open": {}, + "unableToJoinChat": "채팅에 참가할 수 없습니다. 다른 구성원이 이미 대화를 종료했을 수 있습니다.", + "@unableToJoinChat": {}, + "compress": "압축", + "@compress": {}, + "invalidUrl": "유효하지 않은 url", + "@invalidUrl": {}, + "addLink": "링크 추가", + "@addLink": {}, + "strikeThrough": "취소선", + "@strikeThrough": {}, + "pleaseFillOut": "작성해주세요", + "@pleaseFillOut": {}, + "previous": "이전", + "@previous": {}, + "newChatRequest": "📩 새 채팅 요청", + "@newChatRequest": {}, + "appIntroduction": "FluffyChat는 다른 메신저들을 사용하는 친구들과도 채팅할 수 있습니다. https://matrix.org에 방문하거나 *계속*을 눌러 자세한 정보를 확인하세요.", + "@appIntroduction": {}, + "synchronizingPleaseWaitCounter": " 동기화중… ({percentage}%)", + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "waitingForServer": "서버를 기다리는중...", + "@waitingForServer": {}, + "contentNotificationSettings": "콘텐츠 알림 설정", + "@contentNotificationSettings": {}, + "generalNotificationSettings": "일반 알림 설정", + "@generalNotificationSettings": {}, + "roomNotificationSettings": "채팅방 알림 설정", + "@roomNotificationSettings": {}, + "otherNotificationSettings": "기타 알림 설정", + "@otherNotificationSettings": {}, + "notificationRuleContainsUserName": "유저 이름을 포함함", + "@notificationRuleContainsUserName": {}, + "notificationRuleMaster": "모든 알림 음소거", + "@notificationRuleMaster": {}, + "notificationRuleContainsUserNameDescription": "메시지가 유저의 이름을 포함할때 알림합니다.", + "@notificationRuleContainsUserNameDescription": {}, + "notificationRuleMasterDescription": "모든 규칙을 무시하고 모든 알림을 비활성화합니다.", + "@notificationRuleMasterDescription": {}, + "notificationRuleSuppressNotices": "자동화된 메시지 무시", + "@notificationRuleSuppressNotices": {}, + "notificationRuleSuppressNoticesDescription": "봇을 비롯한 자동화된 메시지로부터 발생하는 알림을 무시합니다.", + "@notificationRuleSuppressNoticesDescription": {}, + "notificationRuleInviteForMe": "초대를 받음", + "@notificationRuleInviteForMe": {}, + "notificationRuleInviteForMeDescription": "채팅방에 초대받았을 때 알림합니다.", + "@notificationRuleInviteForMeDescription": {}, + "notificationRuleMemberEvent": "멤버 이벤트", + "@notificationRuleMemberEvent": {}, + "notificationRuleMemberEventDescription": "멤버 이벤트로 발생하는 알림을 무시합니다.", + "@notificationRuleMemberEventDescription": {}, + "notificationRuleIsUserMentionDescription": "유저가 메시지에 멘션됐을 때 알림합니다.", + "@notificationRuleIsUserMentionDescription": {}, + "notificationRuleContainsDisplayName": "표시 이름을 포함함", + "@notificationRuleContainsDisplayName": {}, + "notificationRuleIsUserMention": "유저가 멘션됨", + "@notificationRuleIsUserMention": {}, + "notificationRuleContainsDisplayNameDescription": "메시지에 표시 이름이 포함되면 알림합니다.", + "@notificationRuleContainsDisplayNameDescription": {}, + "notificationRuleIsRoomMention": "방 멘션", + "@notificationRuleIsRoomMention": {}, + "notificationRuleIsRoomMentionDescription": "방 멘션이 있을경우 알림합니다.", + "@notificationRuleIsRoomMentionDescription": {}, + "notificationRuleRoomnotif": "방 알림", + "@notificationRuleRoomnotif": {}, + "notificationRuleRoomnotifDescription": "메시지가 '@room'을 포함하면 알림합니다.", + "@notificationRuleRoomnotifDescription": {}, + "notificationRuleTombstone": "비활성화", + "@notificationRuleTombstone": {}, + "notificationRuleTombstoneDescription": "채팅방 비활성화 메시지를 알림합니다.", + "@notificationRuleTombstoneDescription": {}, + "notificationRuleReaction": "반응", + "@notificationRuleReaction": {}, + "notificationRuleReactionDescription": "반응으로 발생하는 알림을 무시합니다.", + "@notificationRuleReactionDescription": {}, + "notificationRuleRoomServerAcl": "채팅방 서버 ACL", + "@notificationRuleRoomServerAcl": {}, + "notificationRuleRoomServerAclDescription": "채팅방 서버의 접근 권한(ACL)으로부터 오는 알림을 무시합니다.", + "@notificationRuleRoomServerAclDescription": {}, + "notificationRuleSuppressEdits": "수정 음소거", + "@notificationRuleSuppressEdits": {}, + "notificationRuleSuppressEditsDescription": "수정된 메시지로부터 오는 알림을 무시합니다.", + "@notificationRuleSuppressEditsDescription": {}, + "notificationRuleCall": "전화", + "@notificationRuleCall": {} +} diff --git a/assets/l10n/intl_lt.arb b/assets/l10n/intl_lt.arb new file mode 100644 index 0000000..5a86cc2 --- /dev/null +++ b/assets/l10n/intl_lt.arb @@ -0,0 +1,2422 @@ +{ + "commandHint_leave": "Palikti pokalbių kambarį", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "confirm": "Patvirtinti", + "@confirm": { + "type": "String", + "placeholders": {} + }, + "cancel": "Atšaukti", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "edit": "Redaguoti", + "@edit": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "Atsisiųsti failą", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "about": "Apie", + "@about": { + "type": "String", + "placeholders": {} + }, + "all": "Visi", + "@all": { + "type": "String", + "placeholders": {} + }, + "fluffychat": "FluffyChat", + "@fluffychat": { + "type": "String", + "placeholders": {} + }, + "fileName": "Failo vardas", + "@fileName": { + "type": "String", + "placeholders": {} + }, + "changePassword": "Keisti slaptažodį", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "close": "Uždaryti", + "@close": { + "type": "String", + "placeholders": {} + }, + "archive": "Archyvas", + "@archive": { + "type": "String", + "placeholders": {} + }, + "skip": "Praleisti", + "@skip": { + "type": "String", + "placeholders": {} + }, + "share": "Bendrinti", + "@share": { + "type": "String", + "placeholders": {} + }, + "showPassword": "Rodyti slaptažodį", + "@showPassword": { + "type": "String", + "placeholders": {} + }, + "time": "Laikas", + "@time": {}, + "settings": "Nustatytmai", + "@settings": { + "type": "String", + "placeholders": {} + }, + "sender": "Siuntėjas", + "@sender": {}, + "yes": "Taip", + "@yes": { + "type": "String", + "placeholders": {} + }, + "you": "Jūs", + "@you": { + "type": "String", + "placeholders": {} + }, + "logout": "Atsijungti", + "@logout": { + "type": "String", + "placeholders": {} + }, + "messages": "Žinutės", + "@messages": { + "type": "String", + "placeholders": {} + }, + "scanQrCode": "Nuskanuokite QR kodą", + "@scanQrCode": {}, + "ok": "OK", + "@ok": { + "type": "String", + "placeholders": {} + }, + "addAccount": "Pridėti paskyrą", + "@addAccount": {}, + "or": "Arba", + "@or": { + "type": "String", + "placeholders": {} + }, + "password": "Slaptažodis", + "@password": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "Slaptažodis pakeistas", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPassword": "Įveskite savo slaptažodį", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "Įveskite savo vartotojo vardą", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "reply": "Atsakyti", + "@reply": { + "type": "String", + "placeholders": {} + }, + "blockDevice": "Blokuoti įrenginį", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "blocked": "Užblokuotas", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "Pasirinkite saugų slaptažodį", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "Ištrinti žinutę", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "device": "Įrenginys", + "@device": { + "type": "String", + "placeholders": {} + }, + "deviceId": "Įrenginio ID", + "@deviceId": { + "type": "String", + "placeholders": {} + }, + "devices": "Įrenginiai", + "@devices": { + "type": "String", + "placeholders": {} + }, + "homeserver": "Namų serveris", + "@homeserver": {}, + "enterYourHomeserver": "Įveskite namų serverį", + "@enterYourHomeserver": { + "type": "String", + "placeholders": {} + }, + "everythingReady": "Viskas paruošta!", + "@everythingReady": { + "type": "String", + "placeholders": {} + }, + "fontSize": "Šrifto dydis", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "clearArchive": "Išvalyti archyvą", + "@clearArchive": {}, + "create": "Sukurti", + "@create": { + "type": "String", + "placeholders": {} + }, + "connect": "Prisijungti", + "@connect": { + "type": "String", + "placeholders": {} + }, + "people": "Žmonės", + "@people": { + "type": "String", + "placeholders": {} + }, + "moderator": "Moderatorius", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "muteChat": "Nutildyti pokalbį", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "newChat": "Naujas pokalbis", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "none": "Nė vienas", + "@none": { + "type": "String", + "placeholders": {} + }, + "noPermission": "Nėra leidimo", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "Nerasta kambarių…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "notifications": "Pranešimai", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "notificationsEnabledForThisAccount": "Pranešimai aktyvuoti šitai paskyrai", + "@notificationsEnabledForThisAccount": { + "type": "String", + "placeholders": {} + }, + "obtainingLocation": "Gaunama vieta…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "offensive": "Agresyvus", + "@offensive": { + "type": "String", + "placeholders": {} + }, + "offline": "Neprisijungta", + "@offline": { + "type": "String", + "placeholders": {} + }, + "online": "Prisijungta", + "@online": { + "type": "String", + "placeholders": {} + }, + "oopsPushError": "Oi! Deja, nustatant tiesioginius pranešimus įvyko klaida.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "Oi, kažkas nutiko ne taip…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "Atidarykite programėlę, kad perskaityti žinutes", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "link": "Nuoroda", + "@link": {}, + "participant": "Dalyvis", + "@participant": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "Slapta frazė arba atkūrimo raktas", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "Slaptažodis užmirštas", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "passwordRecovery": "Slaptažodžio atkūrimas", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "pickImage": "Pasirinkite paveiksliuką", + "@pickImage": { + "type": "String", + "placeholders": {} + }, + "pin": "Prisegti", + "@pin": { + "type": "String", + "placeholders": {} + }, + "pleaseChoose": "Prašome pasirinkti", + "@pleaseChoose": { + "type": "String", + "placeholders": {} + }, + "pleaseChooseAPasscode": "Pasirinkite slaptą kodą", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "pleaseClickOnLink": "Paspauskite nuorodą el. pašte ir tęskite toliau.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "pleaseEnter4Digits": "Įveskite 4 skaitmenis arba palikite tuščią, jei norite išjungti programėlės užraktą.", + "@pleaseEnter4Digits": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPin": "Įveskite savo PIN kodą", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "Vadovaukitės svetainėje pateiktais nurodymais ir bakstelėkite Toliau.", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "privacy": "Privatumas", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "Vieši kambariai", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "reason": "Priežastis", + "@reason": { + "type": "String", + "placeholders": {} + }, + "recording": "Įrašymas", + "@recording": { + "type": "String", + "placeholders": {} + }, + "redactMessage": "Pašalinti žinutę", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "register": "Registruotis", + "@register": { + "type": "String", + "placeholders": {} + }, + "reject": "Atmesti", + "@reject": { + "type": "String", + "placeholders": {} + }, + "rejoin": "Vėl prisijungti", + "@rejoin": { + "type": "String", + "placeholders": {} + }, + "remove": "Pašalinti", + "@remove": { + "type": "String", + "placeholders": {} + }, + "removeAllOtherDevices": "Pašalinti visus kitus įrenginius", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "removeDevice": "Pašalinti įrenginį", + "@removeDevice": { + "type": "String", + "placeholders": {} + }, + "removeYourAvatar": "Pašalinti savo avatarą", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "replaceRoomWithNewerVersion": "Pakeisti kambarį naujesne versija", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "requestPermission": "Prašyti leidimo", + "@requestPermission": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "Kambarys buvo atnaujintas", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "Kambario versija", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "search": "Ieškoti", + "@search": { + "type": "String", + "placeholders": {} + }, + "accept": "Sutinku", + "@accept": { + "type": "String", + "placeholders": {} + }, + "repeatPassword": "Pakartokite slaptažodį", + "@repeatPassword": {}, + "addEmail": "Pridėti el. paštą", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "admin": "Administratorius", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "slapyvardis", + "@alias": { + "type": "String", + "placeholders": {} + }, + "allChats": "Visi pokalbiai", + "@allChats": { + "type": "String", + "placeholders": {} + }, + "anyoneCanJoin": "Bet kas gali prisijungti", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "Ar esate tikri?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "areYouSureYouWantToLogout": "Ar tikrai norite atsijungti?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "Pakeisti namų serverį", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "Keisti savo stilių", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "Keisti grupės pavadinimą", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "changeYourAvatar": "Keisti savo avatarą", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "chat": "Pokalbis", + "@chat": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Pokalbio detalės", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chats": "Pokalbiai", + "@chats": { + "type": "String", + "placeholders": {} + }, + "commandHint_ban": "Užblokuoti vartotoją šiame kambaryje", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_clearcache": "Išvalyti laikiną talpyklą", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_discardsession": "Atmesti sesiją", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "commandHint_html": "Siųsti tekstą HTML formatu", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_invite": "Pakviesti vartotoją į šitą kambarį", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "commandHint_join": "Prisijungti prie nurodyto kambario", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_kick": "Pašalinti vartotoja iš šito kambario", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_myroomnick": "Nustatyti savo rodomą vardą šiame kambaryje", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "commandHint_plain": "Siųsti neformatuotą tekstą", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_send": "Siųsti tekstą", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "commandHint_unban": "Atblokuoti vartotoją šiame kambaryje", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "commandInvalid": "Neteisinga komanda", + "@commandInvalid": { + "type": "String" + }, + "configureChat": "Konfigūruoti pokalbį", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "Nukopijuota į iškarpinę", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "Kopijuoti", + "@copy": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "Koipjuoti į iškarpinę", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "currentlyActive": "Šiuo metu aktyvus", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "Tamsi", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "delete": "Ištrinti", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "Panaikinti paskyra", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "directChats": "Tiesioginiai pokalbiai", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "encrypted": "Užšifruotas", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "Šifravimas aktyvuotas", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "enterAnEmailAddress": "Įveskite el. pašto adresą", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "extremeOffensive": "Itin įžeidžiantis", + "@extremeOffensive": { + "type": "String", + "placeholders": {} + }, + "forward": "Toliau", + "@forward": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "Nuo prisijungimo", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "Nuo pakvietimo", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "goToTheNewRoom": "Eiti į naują kambarį", + "@goToTheNewRoom": { + "type": "String", + "placeholders": {} + }, + "group": "Grupė", + "@group": { + "type": "String", + "placeholders": {} + }, + "groupIsPublic": "Grupė yra vieša", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "groups": "Grupės", + "@groups": { + "type": "String", + "placeholders": {} + }, + "guestsAreForbidden": "Svečiams draudžiama", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "Svečiai gali prisijungti", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "help": "Pagalba", + "@help": { + "type": "String", + "placeholders": {} + }, + "hideRedactedEvents": "Slėpti pašalintus įvykius", + "@hideRedactedEvents": { + "type": "String", + "placeholders": {} + }, + "hideUnknownEvents": "Slėpti nežinomus įvykius", + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "identity": "Tapatybė", + "@identity": { + "type": "String", + "placeholders": {} + }, + "ignore": "Ignoruoti", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "ignoredUsers": "Ignoruoti vartotojai", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "leave": "Palikti", + "@leave": { + "type": "String", + "placeholders": {} + }, + "memberChanges": "Narių pokyčiai", + "@memberChanges": { + "type": "String", + "placeholders": {} + }, + "mention": "Paminėti", + "@mention": { + "type": "String", + "placeholders": {} + }, + "encryption": "Šifravimas", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "Aktyvuoti šifravimą", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "Redaguoti blokuotus serverius", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "login": "Prisijungti", + "@login": { + "type": "String", + "placeholders": {} + }, + "sendOnEnter": "Išsiųsti paspaudus Enter", + "@sendOnEnter": {}, + "banFromChat": "Užblokuoti iš pokalbio", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "Užblokuotas", + "@banned": { + "type": "String", + "placeholders": {} + }, + "changeDeviceName": "Pakeisti įrenginio vardą", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "yourChatBackupHasBeenSetUp": "Jūsų pokalbio atsarginė kopija buvo nustatyta.", + "@yourChatBackupHasBeenSetUp": {}, + "chatBackup": "Pokalbio atsargine kopija", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "commandHint_me": "Apibūdinkite save", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "displaynameHasBeenChanged": "Rodomas vardas buvo pakeistas", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "editDisplayname": "Redaguoti rodomą vardą", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "editRoomAliases": "Redaguoti kambario pseudonimus", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "Redaguoti kambario avatarą", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "howOffensiveIsThisContent": "Kiek įžeižiantis šis turinys?", + "@howOffensiveIsThisContent": { + "type": "String", + "placeholders": {} + }, + "id": "ID", + "@id": { + "type": "String", + "placeholders": {} + }, + "iHaveClickedOnLink": "Aš paspaudžiau nuorodą", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "Neteisinga slaptafrazė arba atkūrimo raktas", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "inoffensive": "Neįžeidžiantis", + "@inoffensive": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "Pakviesti kontaktą", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "invited": "Pakviestas", + "@invited": { + "type": "String", + "placeholders": {} + }, + "invitedUsersOnly": "Tik pakviesti vartotojai", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "isTyping": "rašo…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "joinRoom": "Prisijungti prie kambario", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "kickFromChat": "Išmesti iš pokalbio", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "Paliko pokalbį", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "license": "Licencija", + "@license": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "Šviesi", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "loadingPleaseWait": "Kraunama… Prašome palaukti.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "loadMore": "Rodyti daugiau…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "💬 Nauja žinutė FluffyChat'e", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "Nauja patvirtinimo užklausa!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "next": "Toliau", + "@next": { + "type": "String", + "placeholders": {} + }, + "no": "Ne", + "@no": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "Nėra ryšio su serveriu", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "setInvitationLink": "Nustatyti pakvietimo nuorodą", + "@setInvitationLink": { + "type": "String", + "placeholders": {} + }, + "singlesignon": "Vienkartinis prisijungimas", + "@singlesignon": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "Programinis kodas", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "spaceIsPublic": "Erdvė yra vieša", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "spaceName": "Erdvės pavadinimas", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "status": "Būsena", + "@status": { + "type": "String", + "placeholders": {} + }, + "statusExampleMessage": "Kaip sekasi šiandien?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "submit": "Pateikti", + "@submit": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWait": "Sinchronizuojama… Prašome palaukti.", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "transferFromAnotherDevice": "Perkėlimas iš kito įrenginio", + "@transferFromAnotherDevice": { + "type": "String", + "placeholders": {} + }, + "verify": "Patvirtinti", + "@verify": { + "type": "String", + "placeholders": {} + }, + "verifyStart": "Pradėti patvirtinimą", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "Jūs sėkmingai patvirtinote!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "verifyTitle": "Patvirtinama kita paskyra", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "Pokalbių istorijos matomumas", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "Matoma visiems dalyviams", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "Laukiama, kol dalyvis priims užklausą…", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "Rašyti žinutę…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "Jūs nebedalyvaujate šiame pokalbyje", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "Jums buvo uždrausta dalyvauti šiame pokalbyje", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "messageInfo": "Žinutės informacija", + "@messageInfo": {}, + "removeFromSpace": "Pašalinti iš erdvės", + "@removeFromSpace": {}, + "security": "Apsauga", + "@security": { + "type": "String", + "placeholders": {} + }, + "sendAsText": "Siųsti kaip tekstą", + "@sendAsText": { + "type": "String" + }, + "sendAudio": "Siųsti garso įrašą", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendImage": "Siųsti paveiksliuką", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendFile": "Sųsti bylą", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendMessages": "Siųsti žinutes", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "sendOriginal": "Siųsti originalą", + "@sendOriginal": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "Siųsti video", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "separateChatTypes": "Atskirti tiesioginius pokalbius ir grupes", + "@separateChatTypes": { + "type": "String", + "placeholders": {} + }, + "setAsCanonicalAlias": "Nustatyti kaip pagrindinį slapyvardį", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "setPermissionsLevel": "Nustatyti leidimų lygį", + "@setPermissionsLevel": { + "type": "String", + "placeholders": {} + }, + "setStatus": "Nustatyti būseną", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "shareLocation": "Bendrinti vietą", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "systemTheme": "Sistema", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "unavailable": "Nepasiekiamas", + "@unavailable": { + "type": "String", + "placeholders": {} + }, + "unblockDevice": "Atblokuoti įrenginį", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "unknownEncryptionAlgorithm": "Nežinomas šifravimo algoritmas", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unmuteChat": "Įjungti pokalbio garsą", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "unpin": "Atsegti", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "username": "Vartotojo vardas", + "@username": { + "type": "String", + "placeholders": {} + }, + "unverified": "Nepatvirtinta", + "@unverified": {}, + "verified": "Patvirtinta", + "@verified": { + "type": "String", + "placeholders": {} + }, + "videoCall": "Vaizdo skambutis", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "yourPublicKey": "Jūsų viešasis raktas", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "addToSpaceDescription": "Pasirinkite erdvę, kad prie jos pridėtumėte šį pokalbį.", + "@addToSpaceDescription": {}, + "start": "Pradžia", + "@start": {}, + "account": "Paskyra", + "@account": { + "type": "String", + "placeholders": {} + }, + "addToSpace": "Pridėti į erdvę", + "@addToSpace": {}, + "appLock": "Programos užraktas", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "Ar svečiams leidžiama prisijungti", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "botMessages": "Botų žinutės", + "@botMessages": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "Šifravimas buvo sugadintas", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "chatHasBeenAddedToThisSpace": "Pokalbis buvo pridėtas prie šios erdvės", + "@chatHasBeenAddedToThisSpace": {}, + "compareEmojiMatch": "Palyginkite jaustukus", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "Palyginkite skaičius", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "Kontaktas buvo pakviestas į grupę", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "Apie turinį pranešta serverio administratoriams", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "createNewSpace": "Nauja erdvė", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "deactivateAccountWarning": "Tai deaktyvuos jūsų vartotojo paskyrą. Tai negali būti atšaukta! Ar jūs tuo tikri?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "Numatytasis teisių lygis", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "Šifravimo nebegalėsite išjungti. Ar jūs tuo tikri?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "send": "Siųsti", + "@send": { + "type": "String", + "placeholders": {} + }, + "sendAMessage": "Siųsti žinutę", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "toggleUnread": "Pažymėti kaip skaitytą/neskaitytą", + "@toggleUnread": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "Per daug užklausų. Pabandykite dar kartą vėliau!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "Laukiama, kol dalyvis priims jaustukus…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "Laukiama, kol dalyvis priims skaičius…", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "wallpaper": "Užsklanda", + "@wallpaper": { + "type": "String", + "placeholders": {} + }, + "warning": "Įspėjimas!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "weSentYouAnEmail": "Išsiuntėme jums el. laišką", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "whoCanPerformWhichAction": "Kas gali atlikti kokį veiksmą", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "Kam leidžiama prisijungti prie šios grupės", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "Kodėl norite apie tai pranešti?", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "wipeChatBackup": "Ištrinti atsarginę pokalbių kopiją, kad sukurti naują atkūrimo raktą?", + "@wipeChatBackup": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "Naudodami šiuos adresus galite atkurti savo slaptažodį.", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "messageType": "Žinutės tipas", + "@messageType": {}, + "openGallery": "Atverti galeriją", + "@openGallery": {}, + "unknownDevice": "Nežinomas įrenginys", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "Balso žinutė", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "title": "FluffyChat", + "@title": { + "description": "Title for the application", + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "Matoma visiems", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "tryToSendAgain": "Pabandykite išsiųsti dar kartą", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "locationPermissionDeniedNotice": "Vietos leidimas atmestas. Suteikite leidimą kad galėtumėte bendrinti savo vietą.", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "needPantalaimonWarning": "Atminkite, kad norint naudoti end-to-end šifravimą, reikalingas Pantalaimon.", + "@needPantalaimonWarning": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "Šifravimą galite suaktyvinti tik tada, kai kambarys nebebus viešai pasiekiamas.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "Nerasta jaustukų. 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "Atrodo, kad jūsų telefone nėra Google Services. Tai geras sprendimas jūsų privatumui! Norėdami gauti tiesioginius pranešimus FluffyChat, rekomenduojame naudoti https://microg.org/ arba https://unifiedpush.org/.", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "noPasswordRecoveryDescription": "Dar nepridėjote slaptažodžio atkūrimo būdo.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "oneClientLoggedOut": "Vienas iš jūsų klientų atsijungė", + "@oneClientLoggedOut": {}, + "onlineKeyBackupEnabled": "Internetinė atsarginė raktų kopija įjungta", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "openCamera": "Atidarykite kamerą", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "openVideoCamera": "Atidarykite kamerą vaizdo įrašui", + "@openVideoCamera": { + "type": "String", + "placeholders": {} + }, + "editBundlesForAccount": "Redaguoti šios paskyros paketus", + "@editBundlesForAccount": {}, + "serverRequiresEmail": "Šis serveris turi patvirtinti jūsų el. pašto adresą registracijai.", + "@serverRequiresEmail": {}, + "addToBundle": "Pridėti prie paketų", + "@addToBundle": {}, + "removeFromBundle": "Pašalinkite iš šio paketo", + "@removeFromBundle": {}, + "bundleName": "Paketo vardas", + "@bundleName": {}, + "play": "Groti {fileName}", + "@play": { + "type": "String", + "placeholders": { + "fileName": { + "type": "String" + } + } + }, + "redactedAnEvent": "{username} pašalino įvykį", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "rejectedTheInvitation": "{username} atmetė kvietimą", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "removedBy": "Pašalino vartotojas {username}", + "@removedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "unbanFromChat": "Atblokuoti pokalbyje", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "renderRichContent": "Atvaizduoti turtingą žinutės turinį", + "@renderRichContent": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "Pranešti apie žinutę", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "saveFile": "Išsaugoti failą", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "seenByUser": "Matė {username}", + "@seenByUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sendSticker": "Siųsti lipduką", + "@sendSticker": { + "type": "String", + "placeholders": {} + }, + "sentAFile": "📁 {username} atsiuntė failą", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAnAudio": "🎤 {username} atsiuntė garso įrašą", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentASticker": "😊 {username} atsiuntė lipduką", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sharedTheLocation": "{username} bendrino savo vietą", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "startedACall": "{senderName} pradėjo skambutį", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "theyDontMatch": "Jie nesutampa", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "Jie sutampa", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username} atblokavo {targetName}", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "unknownEvent": "Nežinomas įvykis '{type}'", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "userAndOthersAreTyping": "{username} ir dar {count} kiti rašo…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "userAndUserAreTyping": "{username} ir {username2} rašo…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userIsTyping": "{username} rašo…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userSentUnknownEvent": "{username} išsiuntė {type} įvykį", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "publish": "Paskelbti", + "@publish": {}, + "openChat": "Atverti pokalbį", + "@openChat": {}, + "reportUser": "Pranešti apie vartotoją", + "@reportUser": {}, + "dismiss": "Atsisakyti", + "@dismiss": {}, + "reactedWith": "{sender} sureagavo su {reaction}", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "unsupportedAndroidVersion": "Nepalaikoma Android versija", + "@unsupportedAndroidVersion": {}, + "emailOrUsername": "El. paštas arba vartotojo vardas", + "@emailOrUsername": {}, + "widgetVideo": "Video", + "@widgetVideo": {}, + "widgetNameError": "Pateikite rodomą vardą.", + "@widgetNameError": {}, + "acceptedTheInvitation": "👍 {username} priėmė kvietimą", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "activatedEndToEndEncryption": "🔐 {username} aktyvavo visapusį šifravimą", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "answeredTheCall": "{senderName} atsiliepė į skambutį", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "askVerificationRequest": "Priimti šią patvirtinimo užklausą iš {username}?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "badServerLoginTypesException": "Namų serveris palaiko šiuos prisijungimo tipus:\n{serverVersions}\nTačiau ši programa palaiko tik:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "badServerVersionsException": "Namų serveris palaiko spec. versijas:\n{serverVersions}\nTačiau ši programa palaiko tik {supportedVersions}", + "@badServerVersionsException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "bannedUser": "{username} užblokavo {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username} pakeitė istorijos matomumą", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username} pakeitė istorijos matomumą į: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "chatBackupDescription": "Jūsų senos žinutės yra apsaugotos atkūrimo raktu. Pasirūpinkite, kad jo neprarastumėte.", + "@chatBackupDescription": { + "type": "String", + "placeholders": {} + }, + "commandHint_create": "Sukurti tuščią grupinį pokalbį\nNaudokite --no-encryption kad išjungti šifravimą", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "commandHint_dm": "Pradėti tiesioginį pokalbį\nNaudokite --no-encryption kad išjungti šifravimą", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "commandHint_myroomavatar": "Nustatyti savo nuotrauką šiame kambaryje (su mxc-uri)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_op": "Nustatyti naudotojo galios lygį (numatytasis: 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_react": "Siųsti atsakymą kaip reakciją", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "commandMissing": "{command} nėra komanda.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "containsDisplayName": "Turi rodomą vardą", + "@containsDisplayName": { + "type": "String", + "placeholders": {} + }, + "containsUserName": "Turi vartotojo vardą", + "@containsUserName": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "Nepavyko iššifruoti pranešimo: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "countParticipants": "{count} dalyviai", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "createdTheChat": "💬 {username} sukūrė pokalbį", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "emptyChat": "Tuščias pokalbis", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "Jaustukas jau egzistuoja!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "Neteisingas jaustuko trumpasis kodas!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emotePacks": "Jaustukų paketai kambariui", + "@emotePacks": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "Jaustukų nustatymai", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "emoteShortcode": "Jaustuko trumpasis kodas", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emoteWarnNeedToPick": "Turite pasirinkti jaustuko trumpąjį kodą ir paveiksliuką!", + "@emoteWarnNeedToPick": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "Įgalinti jaustukų paketą visur", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName} baigė skambutį", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "errorObtainingLocation": "Klaida nustatant vietą: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "groupWith": "Grupė su {displayname}", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "hasWithdrawnTheInvitationFor": "{username} atšaukė {targetName} kvietimą", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "inviteForMe": "Pakvietimas man", + "@inviteForMe": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "Pakviesti kontaktą į {groupName}", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "invitedUser": "📩 {username} pakvietė {targetName}", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "inviteText": "{username} pakvietė jus prisijungti prie FluffyChat. \n1. Įdiekite FluffyChat: https://fluffychat.im \n2. Prisiregistruokite arba prisijunkite \n3. Atidarykite pakvietimo nuorodą: {link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "joinedTheChat": "👋 {username} prisijungė prie pokalbio", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "kicked": "👞 {username} išmetė {targetName}", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickedAndBanned": "🙅 {username} išmetė ir užblokavo {targetName}", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "lastActiveAgo": "Paskutinis aktyvumas: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "loadCountMoreParticipants": "Įkelti dar {count} dalyvius", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "logInTo": "Prisijungti prie {homeserver}", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "toggleFavorite": "Perjungti parankinius", + "@toggleFavorite": { + "type": "String", + "placeholders": {} + }, + "toggleMuted": "Perjungti nutildytą", + "@toggleMuted": { + "type": "String", + "placeholders": {} + }, + "cantOpenUri": "Nepavyksta atidaryti URI {uri}", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "changedTheChatAvatar": "{username} pakeitė pokalbio avatarą", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatDescriptionTo": "{username} pakeitė pokalbio aprašymą į: '{description}'", + "@changedTheChatDescriptionTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "description": { + "type": "String" + } + } + }, + "changedTheChatNameTo": "{username} pakeitė pokalbio pavadinimą į: '{chatname}'", + "@changedTheChatNameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "chatname": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username} pakeitė pokalbių leidimus", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username} pakeitė rodomą vardą į: '{displayname}'", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} pakeitė svečio prieigos taisykles", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} pakeitė svečio prieigos taisykles į: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username} pakeitė prisijungimo taisykles", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} pakeitė prisijungimo taisykles į: {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} pakeitė savo avatarą", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "{username} pakeitė kambario pseudonimus", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username} pakeitė pakvietimo nuorodą", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "videoWithSize": "Vaizdo įrašas ({size})", + "@videoWithSize": { + "type": "String", + "placeholders": { + "size": { + "type": "String" + } + } + }, + "pinMessage": "Prisegti prie kambario", + "@pinMessage": {}, + "confirmEventUnpin": "Ar tikrai norite visam laikui atsegti įvykį?", + "@confirmEventUnpin": {}, + "emojis": "Jaustukai", + "@emojis": {}, + "placeCall": "Skambinti", + "@placeCall": {}, + "voiceCall": "Balso skambutis", + "@voiceCall": {}, + "unsupportedAndroidVersionLong": "Šiai funkcijai reikalinga naujesnė Android versija. Patikrinkite, ar nėra naujinimų arba Lineage OS palaikymo.", + "@unsupportedAndroidVersionLong": {}, + "videoCallsBetaWarning": "Atminkite, kad vaizdo skambučiai šiuo metu yra beta versijos. Jie gali neveikti taip kaip tikėtasi, arba iš viso neveikti visose platformose.", + "@videoCallsBetaWarning": {}, + "experimentalVideoCalls": "Eksperimentiniai vaizdo skambučiai", + "@experimentalVideoCalls": {}, + "switchToAccount": "Perjungti paskyrą į {number}", + "@switchToAccount": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "nextAccount": "Kita paskyra", + "@nextAccount": {}, + "previousAccount": "Ankstesnė paskyra", + "@previousAccount": {}, + "widgetEtherpad": "Teksto pastaba", + "@widgetEtherpad": {}, + "widgetJitsi": "Jitsi Meet", + "@widgetJitsi": {}, + "widgetName": "Vardas", + "@widgetName": {}, + "widgetUrlError": "Netinkamas URL.", + "@widgetUrlError": {}, + "youRejectedTheInvitation": "Jūs atmetėte kvietimą", + "@youRejectedTheInvitation": {}, + "youJoinedTheChat": "Jūs prisijungėte prie pokalbio", + "@youJoinedTheChat": {}, + "youAcceptedTheInvitation": "👍 Jūs priėmėte kvietimą", + "@youAcceptedTheInvitation": {}, + "youBannedUser": "Jūs užblokavote {user}", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youHaveWithdrawnTheInvitationFor": "Jūs atšaukėte kvietimą {user}", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedBy": "📩 Jus pakvietė {user}", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKicked": "👞 Jūs išmetėte {user}", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedUser": "📩 Pakvietėte {user}", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKickedAndBanned": "🙅 Jūs išmetėte ir užblokavote {user}", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youUnbannedUser": "Jūs atblokavote {user}", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "dateWithoutYear": "{month}-{day}", + "@dateWithoutYear": { + "type": "String", + "placeholders": { + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "dateWithYear": "{year}-{month}-{day}", + "@dateWithYear": { + "type": "String", + "placeholders": { + "year": { + "type": "String" + }, + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "locationDisabledNotice": "Vietos nustatymo paslaugos yra išjungtos. Kad galėtumėte bendrinti savo buvimo vietą, įjunkite jas.", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "noMatrixServer": "{server1} nėra Matrix serveris, ar vietoj jo naudoti {server2}?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "numUsersTyping": "{count} vartotojai rašo…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "enableMultiAccounts": "(BETA) Įgalinkite kelias paskyras šiame įrenginyje", + "@enableMultiAccounts": {}, + "openInMaps": "Atidaryti žemėlapiuose", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "sentAPicture": "🖼️ {username} atsiuntė nuotrauką", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "🎥 {username} atsiuntė vaizdo įrašą", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentCallInformations": "{senderName} išsiuntė skambučio informaciją", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "setCustomEmotes": "Nustatyti pasirinktinius jaustukus", + "@setCustomEmotes": { + "type": "String", + "placeholders": {} + }, + "userLeftTheChat": "🚪 {username} paliko pokalbį", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "markAsRead": "Žymėti kaip skaitytą", + "@markAsRead": {}, + "pushRules": "Tiesioginių pranešimų taisyklės", + "@pushRules": { + "type": "String", + "placeholders": {} + }, + "unreadChats": "{unreadCount, plural, =1{1 unread chat} other{{unreadCount} neperskaityti pokalbiai}}", + "@unreadChats": { + "type": "String", + "placeholders": { + "unreadCount": { + "type": "int" + } + } + }, + "addWidget": "Pridėti programėlę", + "@addWidget": {}, + "widgetCustom": "Pasirinktinis", + "@widgetCustom": {}, + "errorAddingWidget": "Pridedant valdiklį įvyko klaida.", + "@errorAddingWidget": {}, + "askSSSSSign": "Kad galėtumėte prijungti kitą asmenį, įveskite savo saugyklos slaptafrazę arba atkūrimo raktą.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "autoplayImages": "Automatiškai leisti animuotus lipdukus ir jaustukus", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "commandHint_markasdm": "Pažymėti kaip tiesioginio pokalbio kambarį", + "@commandHint_markasdm": {}, + "dehydrateTorLong": "TOR naudotojams rekomenduojama eksportuoti sesiją prieš uždarant langą.", + "@dehydrateTorLong": {}, + "dehydrateWarning": "Šio veiksmo negalima atšaukti. Įsitikinkite, kad saugiai saugote atsarginę kopiją.", + "@dehydrateWarning": {}, + "hydrateTorLong": "Ar paskutinį kartą eksportavote savo sesiją naudodami TOR? Greitai ją importuokite ir tęskite pokalbį.", + "@hydrateTorLong": {}, + "commandHint_markasgroup": "Pažymėti kaip grupę", + "@commandHint_markasgroup": {}, + "pleaseEnterRecoveryKeyDescription": "Norėdami atrakinti senas žinutes, įveskite atkūrimo raktą, kuris buvo sukurtas ankstesnės sesijos metu. Atkūrimo raktas NĖRA jūsų slaptažodis.", + "@pleaseEnterRecoveryKeyDescription": {}, + "callingPermissions": "Skambinimo leidimai", + "@callingPermissions": {}, + "storeInAppleKeyChain": "Saugoti Apple raktų grandinėje", + "@storeInAppleKeyChain": {}, + "callingAccount": "Skambinimo paskyra", + "@callingAccount": {}, + "newSpace": "Nauja erdvė", + "@newSpace": {}, + "callingAccountDetails": "Leidžia FluffyChat naudoti vietinę Android rinkiklio programą.", + "@callingAccountDetails": {}, + "appearOnTop": "Rodyti viršuje", + "@appearOnTop": {}, + "enterSpace": "Įeiti į erdvę", + "@enterSpace": {}, + "enterRoom": "Įeiti į kambarį", + "@enterRoom": {}, + "allSpaces": "Visos erdvės", + "@allSpaces": {}, + "user": "Vartotojas", + "@user": {}, + "custom": "Pasirinktinis", + "@custom": {}, + "confirmMatrixId": "Norėdami ištrinti savo paskyrą, patvirtinkite savo Matrix ID.", + "@confirmMatrixId": {}, + "supposedMxid": "Tai turėtų būti {mxid}", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "dehydrate": "Eksportuoti sesiją ir išvalyti įrenginį", + "@dehydrate": {}, + "dehydrateTor": "TOR Naudotojai: Eksportuoti sesiją", + "@dehydrateTor": {}, + "hydrateTor": "TOR Naudotojai: Importuoti sesijos eksportą", + "@hydrateTor": {}, + "hydrate": "Atkurti iš atsarginės kopijos failo", + "@hydrate": {}, + "pleaseEnterRecoveryKey": "Įveskite savo atkūrimo raktą:", + "@pleaseEnterRecoveryKey": {}, + "recoveryKey": "Atkūrimo raktas", + "@recoveryKey": {}, + "recoveryKeyLost": "Pamestas atkūrimo raktas?", + "@recoveryKeyLost": {}, + "indexedDbErrorLong": "Deja, pagal numatytuosius nustatymus žinučių saugojimas privačiame režime nėra įjungtas.\nPrašome apsilankyti\n - about:config\n - nustatykite dom.indexedDB.privateBrowsing.enabled į true\nPriešingu atveju FluffyChat paleisti neįmanoma.", + "@indexedDbErrorLong": {}, + "countFiles": "{count} failai", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "storeInSecureStorageDescription": "Atkūrimo raktą laikyti saugioje šio prietaiso saugykloje.", + "@storeInSecureStorageDescription": {}, + "saveKeyManuallyDescription": "Įrašykite šį raktą rankiniu būdu, įjungę sistemos bendrinimo dialogo langą arba iškarpinę.", + "@saveKeyManuallyDescription": {}, + "users": "Vartotojai", + "@users": {}, + "storeSecurlyOnThisDevice": "Saugiai laikyti šiame prietaise", + "@storeSecurlyOnThisDevice": {}, + "unlockOldMessages": "Atrakinti senas žinutes", + "@unlockOldMessages": {}, + "storeInAndroidKeystore": "Saugoti Android raktų saugykloje", + "@storeInAndroidKeystore": {}, + "indexedDbErrorTitle": "Privataus režimo problemos", + "@indexedDbErrorTitle": {}, + "noKeyForThisMessage": "Taip gali atsitikti, jei žinutė buvo išsiųsta prieš prisijungiant prie paskyros šiame prietaise.\n\nTaip pat gali būti, kad siuntėjas užblokavo jūsų prietaisą arba kažkas sutriko su interneto ryšiu.\n\nAr galite perskaityti žinutę kitoje sesijoje? Tada galite perkelti žinutę iš jos! Eikite į Nustatymai > Prietaisai ir įsitikinkite, kad jūsų prietaisai patvirtino vienas kitą. Kai kitą kartą atidarysite kambarį ir abi sesijos bus pirmame plane, raktai bus perduoti automatiškai.\n\nNenorite prarasti raktų atsijungdami arba keisdami įrenginius? Įsitikinkite, kad nustatymuose įjungėte pokalbių atsarginę kopiją.", + "@noKeyForThisMessage": {}, + "foregroundServiceRunning": "Šis pranešimas rodomas, kai veikia pirmojo plano paslauga.", + "@foregroundServiceRunning": {}, + "screenSharingTitle": "ekrano bendrinimas", + "@screenSharingTitle": {}, + "appearOnTopDetails": "Leidžia programėlę rodyti viršuje (nebūtina, jei jau esate nustatę Fluffychat kaip skambinimo paskyrą)", + "@appearOnTopDetails": {}, + "otherCallingPermissions": "Mikrofonas, kamera ir kiti FluffyChat leidimai", + "@otherCallingPermissions": {}, + "whyIsThisMessageEncrypted": "Kodėl ši žinutė neperskaitoma?", + "@whyIsThisMessageEncrypted": {}, + "newGroup": "Nauja grupė", + "@newGroup": {}, + "screenSharingDetail": "Bendrinate savo ekraną per FuffyChat", + "@screenSharingDetail": {}, + "numChats": "{number} pokalbiai", + "@numChats": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "hideUnimportantStateEvents": "Slėpti nesvarbius būsenos įvykius", + "@hideUnimportantStateEvents": {} +} diff --git a/assets/l10n/intl_lv.arb b/assets/l10n/intl_lv.arb new file mode 100644 index 0000000..9ec6439 --- /dev/null +++ b/assets/l10n/intl_lv.arb @@ -0,0 +1,3327 @@ +{ + "showPassword": "Rādīt paroli", + "@showPassword": { + "type": "String", + "placeholders": {} + }, + "hugContent": "{senderName} apskauj Tevi", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "darkTheme": "Tumšs", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "paroles vārdkopa vai atkopes atslēga", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPassword": "Lūgums ievadīt savu paroli", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "Tās sakrīt", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "connect": "Savienot", + "@connect": { + "type": "String", + "placeholders": {} + }, + "jumpToLastReadMessage": "Pārlēkt uz pēdējo izlasīto ziņu", + "@jumpToLastReadMessage": {}, + "allRooms": "Visas kopu tērzēšanas", + "@allRooms": { + "type": "String", + "placeholders": {} + }, + "obtainingLocation": "Iegūst atrašanās vietu…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "commandHint_cuddle": "Nosūtīt samīļojienu", + "@commandHint_cuddle": {}, + "chats": "Tērzēšanas", + "@chats": { + "type": "String", + "placeholders": {} + }, + "widgetVideo": "Video", + "@widgetVideo": {}, + "dismiss": "Atmest", + "@dismiss": {}, + "unknownDevice": "Nezināma ierīce", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "emoteShortcode": "Emocijas īskods", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "Šifrēšanu var iespējot tikai tad, kad istaba vairs nav publiski pieejama.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "admin": "Pārvaldītājs", + "@admin": { + "type": "String", + "placeholders": {} + }, + "reportErrorDescription": "😭 Ak nē! Kaut kas nogāja greizi. Ja ir vēlēšanas, par šo nepilnību var ziņot izstrādātājiem.", + "@reportErrorDescription": {}, + "directChats": "Tiešās tērzēšanas", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "setPermissionsLevel": "Iestatīt atļauju līmeni", + "@setPermissionsLevel": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "Uzaicināt kontaktpersonu {groupName}", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "addAccount": "Pievienot kontu", + "@addAccount": {}, + "close": "Aizvērt", + "@close": { + "type": "String", + "placeholders": {} + }, + "configureChat": "Konfigurēt tērzēšanu", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "chatHasBeenAddedToThisSpace": "Šai vietai tika pievienota tērzēšana", + "@chatHasBeenAddedToThisSpace": {}, + "reply": "Atbildēt", + "@reply": { + "type": "String", + "placeholders": {} + }, + "currentlyActive": "Pašreiz darbīgi", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "removeYourAvatar": "Noņemt savu attēlu", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "unsupportedAndroidVersion": "Neatbalstīta Android versija", + "@unsupportedAndroidVersion": {}, + "device": "Ierīce", + "@device": { + "type": "String", + "placeholders": {} + }, + "blockDevice": "Liegt ierīci", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "commandHint_html": "Nosūtīt ar HTML formatētu tekstu", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "widgetJitsi": "Jitsi Meet", + "@widgetJitsi": {}, + "youAreNoLongerParticipatingInThisChat": "Tu vairs nepiedalies šajā tērzēšanā", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "encryption": "Šifrēšana", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "messageType": "Ziņas veids", + "@messageType": {}, + "indexedDbErrorLong": "Diemžēl ziņu krātuve pēc noklusējuma nav iespējota privātajā režīmā.\nLūgums apmeklēt\n - about:config\n - iestatīt dom.indexedDB.privateBrowsing.enabled kā true\nPretējā gadījumā nav iespējams palaist FluffyChat.", + "@indexedDbErrorLong": {}, + "oneClientLoggedOut": "Viens no klientiem ir atteicies", + "@oneClientLoggedOut": {}, + "toggleMuted": "Pārslēgt apklusināšanu", + "@toggleMuted": { + "type": "String", + "placeholders": {} + }, + "unsupportedAndroidVersionLong": "Šai iespējai ir nepieciešama jaunāka Android versija. Lūgums pārbaudīt atjauninājumus vai Lineage OS atbalstu.", + "@unsupportedAndroidVersionLong": {}, + "kicked": "👞 {username} izmeta {targetName}", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "title": "FluffyChat", + "@title": { + "description": "Title for the application", + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "Mainīt kopas nosaukumu", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "{username} nomainīja tērzēšanas attēlu", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "verifySuccess": "Apliecināšana bija sekmīga.", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "sendFile": "Nosūtīt datni", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "Jauns apliecināšanas pieprasījums.", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "startFirstChat": "Uzsāc savu pirmo tērzēšanu", + "@startFirstChat": {}, + "callingAccount": "Zvanīšanas konts", + "@callingAccount": {}, + "requestPermission": "Pieprasīt atļauju", + "@requestPermission": { + "type": "String", + "placeholders": {} + }, + "sentAPicture": "🖼️ {username} nosūtīja attēlu", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "invited": "Uzaicināts", + "@invited": { + "type": "String", + "placeholders": {} + }, + "changedTheDisplaynameTo": "{username} nomainīja savu attēlojamo vārdu uz '{displayname}'", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "setColorTheme": "Iestatīt krāsu izskatu:", + "@setColorTheme": {}, + "nextAccount": "Nākamais konts", + "@nextAccount": {}, + "commandHint_create": "Izveidot tukšu kopas tērzēšanu\nLai atspējotu šifrēšanu, jāizmanto --no-encryption", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "singlesignon": "Vienotā pieteikšanās", + "@singlesignon": { + "type": "String", + "placeholders": {} + }, + "warning": "Uzmanību!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "password": "Parole", + "@password": { + "type": "String", + "placeholders": {} + }, + "allSpaces": "Visas vietas", + "@allSpaces": {}, + "supposedMxid": "Tam būtu jābūt {mxid}", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "editDisplayname": "Labot attēlojamo vārdu", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "user": "Lietotājs", + "@user": {}, + "roomVersion": "Istabas versija", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "sentAFile": "📁 {username} nosūtīja datni", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "videoCall": "Videozvans", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "youAcceptedTheInvitation": "👍 Tu pieņēmi uzaicinājumu", + "@youAcceptedTheInvitation": {}, + "banFromChat": "Izslēgt no tērzēšanas", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "noMatrixServer": "{server1} nav Matrix serveris, tā vietā izmantot {server2}?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "userAndOthersAreTyping": "{username} un {count} citi raksta…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "youInvitedBy": "📩 {user} Tevi uzaicināja", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "userIsTyping": "{username} raksta…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "openAppToReadMessages": "Atvērt lietotni, lai lasītu ziņas", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "sentAVideo": "🎥 {username} nosūtīja video", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "banUserDescription": "Lietotājam tiks liegta piekļuve tērzēšanai, un vairs nevarēs vēlreiz pievienoties tērzēšanai, līdz liegums tiks atcelts.", + "@banUserDescription": {}, + "inviteContact": "Uzaicināt kontaktpersonu", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "Lai varētu parakstīt otru cilvēku, lūgums ievadīt savu drošo krātuves paroles vārdkopu vai atkopes atslēgu.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "widgetEtherpad": "Teksta piezīme", + "@widgetEtherpad": {}, + "waitingPartnerAcceptRequest": "Gaida, līdz biedrs apstiprinās pieprasījumu…", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "remove": "Noņemt", + "@remove": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "Rakstīt ziņu…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "Mainīt izskatu", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "id": "Id", + "@id": { + "type": "String", + "placeholders": {} + }, + "removeDevicesDescription": "Tu tiksi izrakstīts no šīs ierīces un vairs nevarēsi saņemt ziņas.", + "@removeDevicesDescription": {}, + "changedTheChatDescriptionTo": "{username} nomainīja tērzēšanas aprakstu uz '{description}'", + "@changedTheChatDescriptionTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "description": { + "type": "String" + } + } + }, + "countParticipants": "{count} dalībnieki", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "separateChatTypes": "Atdalīt tiešās tērzēšanas un kopas", + "@separateChatTypes": { + "type": "String", + "placeholders": {} + }, + "tryAgain": "Jāmēģina vēlreiz", + "@tryAgain": {}, + "areGuestsAllowedToJoin": "Vai vieslietotājiem ir ļauts pievienoties", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "blocked": "Liegta", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "youKickedAndBanned": "🙅 Izraidīji {user} un liedzi piekļuvi", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "dateWithoutYear": "{day}.{month}.", + "@dateWithoutYear": { + "type": "String", + "placeholders": { + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "removeDevice": "Noņemt ierīci", + "@removeDevice": { + "type": "String", + "placeholders": {} + }, + "unbanUserDescription": "Lietotājs varēs atkal pievienoties tērzēšanai, ja mēģinās.", + "@unbanUserDescription": {}, + "userAndUserAreTyping": "{username} un {username2} raksta…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "pleaseClickOnLink": "Lūgums klikšķināt uz saites e-pastā un tad turpināt.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "saveFile": "Saglabāt datni", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "sendOnEnter": "Nosūtīt ar Enter", + "@sendOnEnter": {}, + "pickImage": "Izvēlēties attēlu", + "@pickImage": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "{senderName} atbildēja uz zvanu", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "youRejectedTheInvitation": "Tu noraidīji uzaicinājumu", + "@youRejectedTheInvitation": {}, + "otherCallingPermissions": "Mikrofons, kamera un citas FluffyChat atļaujas", + "@otherCallingPermissions": {}, + "messagesStyle": "Ziņas:", + "@messagesStyle": {}, + "couldNotDecryptMessage": "Nevarēja atšifrēt ziņu: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "invitedUsersOnly": "Tikai uzaicināti lietotāji", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "link": "Saite", + "@link": {}, + "widgetUrlError": "Tas nav derīgs URL.", + "@widgetUrlError": {}, + "emailOrUsername": "E-pasta adrese vai lietotājvārds", + "@emailOrUsername": {}, + "newSpaceDescription": "Vietas ļauj apvienot tērzēšanas un būvēt privātas vai publiskas kopienas.", + "@newSpaceDescription": {}, + "chatDescription": "Tērzēšanas apraksts", + "@chatDescription": {}, + "callingAccountDetails": "Ļauj FluffyChat izmantot iebūvēto Android zvanīšanas lietotni.", + "@callingAccountDetails": {}, + "next": "Nākamais", + "@next": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "Lūgums sekot norādēm tīmekļvietnē un piesist \"Nākamais\".", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "changedTheGuestAccessRules": "{username} nomainīja viesu piekļuves nosacījumus", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "dateWithYear": "{day}.{month}.{year}.", + "@dateWithYear": { + "type": "String", + "placeholders": { + "year": { + "type": "String" + }, + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "editRoomAliases": "Labot istabu aizstājvārdus", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "enterSpace": "Ieiet vietā", + "@enterSpace": {}, + "encryptThisChat": "Šifrēt šo tērzēšanu", + "@encryptThisChat": {}, + "fileName": "Datnes nosaukums", + "@fileName": { + "type": "String", + "placeholders": {} + }, + "unavailable": "Nav pieejams", + "@unavailable": { + "type": "String", + "placeholders": {} + }, + "previousAccount": "Iepriekšējais konts", + "@previousAccount": {}, + "publicRooms": "Publiskas istabas", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "No uzaicinājuma", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "sendMessages": "Nosūtīt ziņas", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "Nepareiza paroles vārdkopa vai atkopes atslēga", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "emoteWarnNeedToPick": "Nepieciešams izvēlēties emocijas īskodu un attēlu.", + "@emoteWarnNeedToPick": { + "type": "String", + "placeholders": {} + }, + "reopenChat": "Atkārtoti atvērt tērzēšanu", + "@reopenChat": {}, + "pleaseEnterRecoveryKey": "Lūgums ievadīt savu atkopes atslēgu:", + "@pleaseEnterRecoveryKey": {}, + "create": "Izveidot", + "@create": { + "type": "String", + "placeholders": {} + }, + "toggleFavorite": "Pārslēgt iecienīto", + "@toggleFavorite": { + "type": "String", + "placeholders": {} + }, + "no": "Nē", + "@no": { + "type": "String", + "placeholders": {} + }, + "alias": "aizstājvārds", + "@alias": { + "type": "String", + "placeholders": {} + }, + "widgetNameError": "Lūgums norādīt attēlojamo nosaukumu.", + "@widgetNameError": {}, + "inoffensive": "Nav aizskarošs", + "@inoffensive": { + "type": "String", + "placeholders": {} + }, + "unpin": "Atspraust", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "addToBundle": "Pievienot komplektam", + "@addToBundle": {}, + "reportMessage": "Ziņot par ziņu", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "spaceIsPublic": "Vieta ir publiska", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "addWidget": "Pievienot logrīku", + "@addWidget": {}, + "all": "Viss", + "@all": { + "type": "String", + "placeholders": {} + }, + "removeAllOtherDevices": "Noņemt visas pārējās ierīces", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "unblockDevice": "Atslēgt ierīci", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "countFiles": "{count} datnes", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "noKeyForThisMessage": "Tā var notikt, ja ziņa tika nosūtīta, pirms pieteicies savā kontā šajā ierīcē.\n\nIr arī iespējams, ka sūtītājs noliedza Tavu ierīci vai kaut kas nogāja greizi ar interneta savienojumu.\n\nVai ziņas ir lasāmas citā sesijā? Tad Tu vari pārsūtīt ziņu no tās. Jādodas uz Iestatījumi > Ierīces un jāpārliecinās, ka ierīces viena otru ir apliecinājušas. Kad nākamreiz atvērsi istabu un abas sesijas būs priekšplānā, atslēgas tiks automātiski pārsūtītas.\n\nVai nevēlies zaudēt atslēgas, kad atsakies vai maini ierīces? Jāpārliecinās, ka iestatījumos ir iespējota tērzēšanu rezerves kopija.", + "@noKeyForThisMessage": {}, + "enableEncryptionWarning": "Vairs nebūs iespējams atspējot šifrēšanu. Vai tiešām to darīt?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "inviteText": "{username} uzaicināja pievienoties FluffyChat.\n1. Jāapmeklē fluffychat.im un jāuzstāda lietotne \n2. Jāizveido konts vai jāpiesakās \n3. Jāatver uzaicinājuma saite: \n {link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "shareLocation": "Kopīgot atrašanās vietu", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "reason": "Iemesls", + "@reason": { + "type": "String", + "placeholders": {} + }, + "commandHint_markasgroup": "Atzīmēt kā kopu", + "@commandHint_markasgroup": {}, + "errorObtainingLocation": "Kļūda atrašanās vietas iegūšanā: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "hydrateTor": "TOR lietotāji: ievietot sesijas izguvi", + "@hydrateTor": {}, + "pushNotificationsNotAvailable": "Pašpiegādes paziņojumi nav pieejami", + "@pushNotificationsNotAvailable": {}, + "passwordRecovery": "Paroles atkope", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "storeInAppleKeyChain": "Glabāt Apple KeyChain", + "@storeInAppleKeyChain": {}, + "replaceRoomWithNewerVersion": "Aizvietot istabu ar jaunāku versiju", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "hydrate": "Atjaunot no rezerves kopijas datnes", + "@hydrate": {}, + "invalidServerName": "Nederīgs servera nosaukums", + "@invalidServerName": {}, + "chatPermissions": "Tērzēšanas atļaujas", + "@chatPermissions": {}, + "voiceMessage": "Balss ziņa", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "badServerLoginTypesException": "Mājasserveris nodrošina pieteikšanās veidus:\n{serverVersions}\nSavukārt, šī lietotne atbalsta tikai:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "wipeChatBackup": "Notīrīt tērzēšanu rezerves kopiju, lai izveidotu jaunu atkopes atslēgu?", + "@wipeChatBackup": { + "type": "String", + "placeholders": {} + }, + "cantOpenUri": "Nevar atvērt adresi {uri}", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "sender": "Sūtītājs", + "@sender": {}, + "storeInAndroidKeystore": "Glabāt Android KeyStore", + "@storeInAndroidKeystore": {}, + "hideRedactedEvents": "Paslēpt labošanas notikumus", + "@hideRedactedEvents": { + "type": "String", + "placeholders": {} + }, + "online": "Tiešsaistē", + "@online": { + "type": "String", + "placeholders": {} + }, + "signInWithPassword": "Pieteikties ar paroli", + "@signInWithPassword": {}, + "lastActiveAgo": "Pēdējoreiz tiešsaistē: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} nomainīja viesu piekļuves nosacījumus uz {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "weSentYouAnEmail": "Mēs nosūtīja e-pasta ziņu", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "offensive": "Aizskarošs", + "@offensive": { + "type": "String", + "placeholders": {} + }, + "needPantalaimonWarning": "Lūgums ņemt vērā, ka pagaidām ir nepieciešams Pantalaimon, lai izmantotu pilnīgu šifrēšanu.", + "@needPantalaimonWarning": { + "type": "String", + "placeholders": {} + }, + "makeAdminDescription": "Tiklīdz šis lietotājs tiks padarīts par pārvaldītāju, to vairs nevarēs atdarīt, jo tad tam būs tādas pašas atļaujas kā Tev.", + "@makeAdminDescription": {}, + "edit": "Labot", + "@edit": { + "type": "String", + "placeholders": {} + }, + "loadMore": "Ielādēt vēl…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "Netika atrasta neviena emocija. 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWait": "Sinhronizē... Lūgums uzgaidīt.", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "transferFromAnotherDevice": "Pārnest no citas ierīces", + "@transferFromAnotherDevice": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "Parole tikai nomainīta", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "pushRules": "Pašpiegādes nosacījumi", + "@pushRules": { + "type": "String", + "placeholders": {} + }, + "goToTheNewRoom": "Doties uz jauno istabu", + "@goToTheNewRoom": { + "type": "String", + "placeholders": {} + }, + "commandHint_clearcache": "Iztīrīt kešatmiņu", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "loadingPleaseWait": "Ielādē... Lūgums uzgaidīt.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "copy": "Ievietot starpliktuvē", + "@copy": { + "type": "String", + "placeholders": {} + }, + "saveKeyManuallyDescription": "Šo atslēgu var pašrocīgi saglabāt ar sistēmas kopīgošanas dialogloga vai starpliktuves izsaukšanu.", + "@saveKeyManuallyDescription": {}, + "none": "Neviens", + "@none": { + "type": "String", + "placeholders": {} + }, + "editBundlesForAccount": "Labot šī konta komplektus", + "@editBundlesForAccount": {}, + "enableEncryption": "Iespējot šifrēšanu", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "whyIsThisMessageEncrypted": "Kādēļ šī ziņa ir nelasāma?", + "@whyIsThisMessageEncrypted": {}, + "unreadChats": "{unreadCount, plural, zero{{unreadCount} nelasītu tērzēšanu} =1{{unreadCount} nelasīta tērzēšana} other{{unreadCount} nelasītas tērzēšanas}}", + "@unreadChats": { + "type": "String", + "placeholders": { + "unreadCount": { + "type": "int" + } + } + }, + "rejectedTheInvitation": "{username} noraidīja uzaicinājumu", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "setChatDescription": "Iestatīt tērzēšanas aprakstu", + "@setChatDescription": {}, + "userLeftTheChat": "🚪 {username} pameta tērzēšanu", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "spaceName": "Vietas nosaukums", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "importFromZipFile": "Ievietot no .zip datnes", + "@importFromZipFile": {}, + "toggleUnread": "Atzīmēt kā lasītu/nelasītu", + "@toggleUnread": { + "type": "String", + "placeholders": {} + }, + "or": "Vai", + "@or": { + "type": "String", + "placeholders": {} + }, + "dehydrateWarning": "Šī darbība nav atdarāma. Jānodrošina, ka rezerves kopijas datne tiek droši uzglabāta.", + "@dehydrateWarning": {}, + "sendOriginal": "Nosūtīt sākotnējo", + "@sendOriginal": { + "type": "String", + "placeholders": {} + }, + "noOtherDevicesFound": "Netika atrastas citas ierīces", + "@noOtherDevicesFound": {}, + "whoIsAllowedToJoinThisGroup": "Kuram ir ļauts pievienoties šai kopai", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "Tukša tērzēšana", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "seenByUser": "{username} redzēja", + "@seenByUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "storeSecurlyOnThisDevice": "Droši uzglabāt šajā ierīcē", + "@storeSecurlyOnThisDevice": {}, + "yourChatBackupHasBeenSetUp": "Tērzēšanu rezerves kopēšana tika iestatīta.", + "@yourChatBackupHasBeenSetUp": {}, + "chatBackup": "Tērzēšanu rezerves kopēšana", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "redactedBy": "Laboja {username}", + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "submit": "Iesniegt", + "@submit": { + "type": "String", + "placeholders": {} + }, + "videoCallsBetaWarning": "Lūgums ņemt vērā, ka video zvani pašreiz ir beta stāvoklī. Tie visās platformās var nedarboties kā paredzēs vai pat nedarboties vispār.", + "@videoCallsBetaWarning": {}, + "unmuteChat": "Atcelt tērzēšanas apklusināšanu", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "💬 {username} izveidoja tērzēšanu", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "redactedAnEvent": "{username} laboja notikumu", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "autoplayImages": "Automātiski atskaņot animētas uzlīmes un emocijas", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "compareEmojiMatch": "Lūgums salīdzināt emocijzīmes", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "participant": "Dalībnieks", + "@participant": { + "type": "String", + "placeholders": {} + }, + "logInTo": "PIeteikties {homeserver}", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "yes": "Jā", + "@yes": { + "type": "String", + "placeholders": {} + }, + "containsDisplayName": "Satur attēlojamo vārdu", + "@containsDisplayName": { + "type": "String", + "placeholders": {} + }, + "signInWith": "Pieteikties ar {provider}", + "@signInWith": { + "type": "String", + "placeholders": { + "provider": { + "type": "String" + } + } + }, + "username": "Lietotājvārds", + "@username": { + "type": "String", + "placeholders": {} + }, + "changedTheRoomAliases": "{username} nomainīja istabas aizstājvārdus", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "fileIsTooBigForServer": "Nevar nosūtīt. Serveris nodrošina pielikums līdz {max}.", + "@fileIsTooBigForServer": {}, + "homeserver": "Mājasserveris", + "@homeserver": {}, + "help": "Palīdzība", + "@help": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Tērzēšanas izvērsums", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "people": "Cilvēki", + "@people": { + "type": "String", + "placeholders": {} + }, + "changedTheHistoryVisibilityTo": "{username} nomainīja vēstures redzamību uz {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "leftTheChat": "Pameta tērzēšanu", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "verified": "Apliecināta", + "@verified": { + "type": "String", + "placeholders": {} + }, + "repeatPassword": "Atkārtot paroli", + "@repeatPassword": {}, + "setStatus": "Iestatīt stāvokli", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "groupWith": "Kopa ar {displayname}", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "callingPermissions": "Zvanīšanas atļaujas", + "@callingPermissions": {}, + "delete": "Izdzēst", + "@delete": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "💬 Jauna ziņa FluffyChat", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "readUpToHere": "Izlasīts līdz šejienei", + "@readUpToHere": {}, + "start": "Uzsākt", + "@start": {}, + "downloadFile": "Lejupielādēt datni", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "deviceId": "Ierīces Id", + "@deviceId": { + "type": "String", + "placeholders": {} + }, + "register": "Reģistrēties", + "@register": { + "type": "String", + "placeholders": {} + }, + "unlockOldMessages": "Atslēgt vecās ziņas", + "@unlockOldMessages": {}, + "identity": "Identitāte", + "@identity": { + "type": "String", + "placeholders": {} + }, + "numChats": "{number} tērzēšanas", + "@numChats": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} nomainīja pievienošanās nosacījumus uz {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "recording": "Ieraksta", + "@recording": { + "type": "String", + "placeholders": {} + }, + "changedTheChatPermissions": "{username} nomainīja tērzēšanas atļaujas", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "moderator": "Moderators", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "optionalRedactReason": "(Pēc izvēles) Ziņas labošanas iemesls...", + "@optionalRedactReason": {}, + "acceptedTheInvitation": "👍 {username} pieņēma uzaicinājumu", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "waitingPartnerEmoji": "Gaida, līdz biedrs apstiprinās emocijzīmi…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "Šifrēšana tika bojāta", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "tryToSendAgain": "Mēģināt nosūtīt vēlreiz", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "Viesi var pievienoties", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "ok": "Labi", + "@ok": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "Ievietot starpliktuvē", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "dehydrate": "Izgūt sesiju un iztīrīt ierīci", + "@dehydrate": {}, + "locationPermissionDeniedNotice": "Atrašanās vietas atļauja noliegta. Lūgums nodrošināt to, lai būtu iespējams kopīgot savu atrašanās vietu.", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "send": "Nosūtīt", + "@send": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{username} atsauca uzaicinājumu {targetName}", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "visibleForAllParticipants": "Redzama visiem dalībniekiem", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "Istabas netika atrastas…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "banned": "Izslēgts", + "@banned": { + "type": "String", + "placeholders": {} + }, + "sendAsText": "Nosūtīt kā tekstu", + "@sendAsText": { + "type": "String" + }, + "inviteForMe": "Uzaicinājums man", + "@inviteForMe": { + "type": "String", + "placeholders": {} + }, + "archiveRoomDescription": "Tērzēšana tiks pārvietota uz arhīvu. Citi lietotāji redzēs, ka pameti tērzēšanu.", + "@archiveRoomDescription": {}, + "exportEmotePack": "Izgūt emociju paku kā .zip", + "@exportEmotePack": {}, + "changedTheChatNameTo": "{username} nomainīja tērzēšanas nosaukumu uz '{chatname}'", + "@changedTheChatNameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "chatname": { + "type": "String" + } + } + }, + "sendSticker": "Nosūtīt uzlīmi", + "@sendSticker": { + "type": "String", + "placeholders": {} + }, + "account": "Konts", + "@account": { + "type": "String", + "placeholders": {} + }, + "switchToAccount": "Pārslēgties uz kontu {number}", + "@switchToAccount": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "commandInvalid": "Nederīga komanda", + "@commandInvalid": { + "type": "String" + }, + "setAsCanonicalAlias": "Iestatīt kā galveno aizstājvārdu", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "Kādēļ vēlies ziņot par šo?", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "locationDisabledNotice": "Atrašanās vietas pakalpojumi ir atspējoti. Lūgums tos iespējot, lai būtu iespējams kopīgot savu atrašanās vietu.", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "placeCall": "Veikt zvanu", + "@placeCall": {}, + "removedBy": "Noņēma {username}", + "@removedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username} nomainīja uzaicinājuma saiti", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "newChat": "Jauna tērzēšana", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "notifications": "Paziņojumi", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "commandHint_plain": "Nosūtīt neformatētu tekstu", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "emoteSettings": "Emociju iestatījumi", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "experimentalVideoCalls": "Izmēģinājuma video zvani", + "@experimentalVideoCalls": {}, + "openCamera": "Atvērt kameru", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterRecoveryKeyDescription": "Lai atslēgtu savas vecās ziņas, lūgums ievadīt savu atkopes atslēgu, kas tika izveidota iepriekšējā sesijā. Atkopes atslēga NAV parole.", + "@pleaseEnterRecoveryKeyDescription": {}, + "guestsAreForbidden": "Viesi nav ļauti", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "mention": "Pieminēt", + "@mention": { + "type": "String", + "placeholders": {} + }, + "openInMaps": "Atvērt kartēs", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "Ar šīm adresēm var atjaunot savu paroli.", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroupQuestion": "Vai vēlies uzaicināt {contact} uz tērzēšanu \"{groupName}\"?", + "@inviteContactToGroupQuestion": {}, + "emoteExists": "Emocija jau pastāv.", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "redactedByBecause": "Laboja {username}, jo: \"{reason}\"", + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "isTyping": "raksta…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "youHaveWithdrawnTheInvitationFor": "Tu atsauci {user} uzaicinājumu", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "chat": "Tērzēšana", + "@chat": { + "type": "String", + "placeholders": {} + }, + "group": "Kopa", + "@group": { + "type": "String", + "placeholders": {} + }, + "leave": "Pamest", + "@leave": { + "type": "String", + "placeholders": {} + }, + "skip": "Izlaist", + "@skip": { + "type": "String", + "placeholders": {} + }, + "appearOnTopDetails": "Ļauj lietotnei parādīties virspusē (nav nepieciešams, ja FluffyChat jau ir iestatīts kā zvanīšanas konts)", + "@appearOnTopDetails": {}, + "roomHasBeenUpgraded": "Istaba tika atjaunināta", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "enterRoom": "Ieiet istabā", + "@enterRoom": {}, + "enableEmotesGlobally": "Iespējot kā vispārēju emociju paku", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "Vai tiešām?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "pleaseChooseAPasscode": "Lūgums izvēlēties piekļuves kodu", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "noPasswordRecoveryDescription": "Vēl nav pievienots paroles atjaunošanas veids.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "changedTheProfileAvatar": "{username} nomainīja savu attēlu", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "allChats": "Visas tērzēšanas", + "@allChats": { + "type": "String", + "placeholders": {} + }, + "reportUser": "Ziņot par lietotāju", + "@reportUser": {}, + "sharedTheLocation": "{username} kopīgoja savu atrašanās vietu", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "commandHint_send": "Nosūtīt tekstu", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "onlineKeyBackupEnabled": "Tiešsaistes atslēgas rezerves kopēšana ir iespējota", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username} atcēla {targetName} piekļuves liegumu", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "confirmEventUnpin": "Vai tiešām neatgriezeniski atspraust šo notikumu?", + "@confirmEventUnpin": {}, + "badServerVersionsException": "Mājasserveris nodrošina specifikācijas versijas:\n{serverVersions}\nSavukārt, lietotne atbalsta tikai {supportedVersions}", + "@badServerVersionsException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "youInvitedUser": "📩 Tu uzaicināji {user}", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "kickedAndBanned": "🙅 {username} izmeta {targetName} un liedza piekļuvi", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "noConnectionToTheServer": "Nav savienojuma ar serveri", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "fileHasBeenSavedAt": "Datne tika saglabāta {path}", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "license": "Licence", + "@license": { + "type": "String", + "placeholders": {} + }, + "addToSpace": "Pievienot vietai", + "@addToSpace": {}, + "unbanFromChat": "Atcelt liegumu tērzēšanā", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "commandMissing": "{command} nav komanda.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "redactMessageDescription": "Ziņa tiks labota visiem šīs sarunas dalībniekiem. To nevar atdarīt.", + "@redactMessageDescription": {}, + "rejoin": "Pievienoties atkārtoti", + "@rejoin": { + "type": "String", + "placeholders": {} + }, + "recoveryKey": "Atkopes atslēga", + "@recoveryKey": {}, + "redactMessage": "Labot ziņu", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "forward": "Pārsūtīt", + "@forward": { + "type": "String", + "placeholders": {} + }, + "commandHint_discardsession": "Atmest sesiju", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "invalidInput": "Nederīga ievade.", + "@invalidInput": {}, + "about": "Par", + "@about": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "Jāizvēlas droša parole", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "dehydrateTorLong": "TOR lietotājiem ir ieteicams izgūt sesiju pirms loga aizvēršanas.", + "@dehydrateTorLong": {}, + "yourPublicKey": "Tava publiskā atslēga", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "Pārāk daudz pieprasījumu. Lūgums vēlāk mēģināt vēlreiz.", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "invitedUser": "📩 {username} uzaicināja {targetName}", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickFromChat": "Izmest no tērzēšanas", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "commandHint_myroomnick": "Iestatīt savu attēlojamo vārdu šajā istabā", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "offline": "Bezsaistē", + "@offline": { + "type": "String", + "placeholders": {} + }, + "noPermission": "Nav atļaujas", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "doNotShowAgain": "Vairs nerādīt", + "@doNotShowAgain": {}, + "activatedEndToEndEncryption": "🔐 {username} iespējoja pilnīgu šifrēšanu", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "report": "ziņot", + "@report": {}, + "status": "Stāvoklis", + "@status": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "Lūgums salīdzināt skaitļus", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "groupIsPublic": "Kopa ir publiska", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "verifyStart": "Uzsākt apliecināšanu", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "memberChanges": "Dalībnieku izmaiņas", + "@memberChanges": { + "type": "String", + "placeholders": {} + }, + "joinRoom": "Pievienoties istabai", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "unverified": "Neapliecināta", + "@unverified": {}, + "fluffychat": "FluffyChat", + "@fluffychat": { + "type": "String", + "placeholders": {} + }, + "howOffensiveIsThisContent": "Cik aizskarošs ir šis saturs?", + "@howOffensiveIsThisContent": { + "type": "String", + "placeholders": {} + }, + "serverRequiresEmail": "Šim serverim ir nepieciešams pārbaudīt Tavu e-pasta adresi reģistrācijai.", + "@serverRequiresEmail": {}, + "hideUnimportantStateEvents": "Paslēpt nebūtiskus stāvokļa notikumus", + "@hideUnimportantStateEvents": {}, + "screenSharingTitle": "ekrāna kopīgošana", + "@screenSharingTitle": {}, + "widgetCustom": "Pielāgots", + "@widgetCustom": {}, + "sentCallInformations": "{senderName} nosūtīja informāciju par zvanu", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "addToSpaceDescription": "Atlasīt vietu, kurai pievienot šo tērzēšanu.", + "@addToSpaceDescription": {}, + "googlyEyesContent": "{senderName} sūta izbolītas acis", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "youBannedUser": "Tu {user} liedzi piekļuvi", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "theyDontMatch": "Tās nesakrīt", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "Tev tika liegta piekļuve šai tērzēšanai", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "Attēlojamais vārds tika nomainīts", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "addChatDescription": "Pievienot tērzēšanas aprakstu...", + "@addChatDescription": {}, + "sentAnAudio": "🎤 {username} nosūtīja skaņu", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "editRoomAvatar": "Labot istabas attēlu", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "encrypted": "Šifrēta", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "commandHint_leave": "Pamest šo istabu", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_myroomavatar": "Iestatīt savu attēlu šajā istabā (ar mxc-uri)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "cancel": "Atcelt", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "hasKnocked": "🚪 {user} pieklauvēja", + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "publish": "Publicēt", + "@publish": {}, + "openLinkInBrowser": "Atvērt saiti pārlūkā", + "@openLinkInBrowser": {}, + "clearArchive": "Iztīrīt arhīvu", + "@clearArchive": {}, + "appLock": "Lietotnes aizslēgšana", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "commandHint_react": "Nosūtīt atbildi kā reakciju", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "changedTheHistoryVisibility": "{username} mainīja vēstures redzamību", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "commandHint_me": "Apraksti sevi", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "pleaseEnterYourUsername": "Lūgums ievadīt savu lietotājvārdu", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "messageInfo": "Informācija par ziņu", + "@messageInfo": {}, + "disableEncryptionWarning": "Drošības iemeslu dēļ tērzēšanā nevar atspējot šifrēšanu, ja tā ir pirms tam ir bijusi iespējota.", + "@disableEncryptionWarning": {}, + "directChat": "Tiešā tērzēšana", + "@directChat": {}, + "encryptionNotEnabled": "Šifrēšana nav iespējota", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "wrongPinEntered": "Ievadīts nepareizs PIN. Lūgums mēģināt vēlreiz pēc {seconds} sekundēm...", + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "sendTypingNotifications": "Nosūtīt rakstīšanas paziņojumus", + "@sendTypingNotifications": {}, + "lightTheme": "Gaišs", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "inviteGroupChat": "📨 Uzaicināt kopas tērzēšanu", + "@inviteGroupChat": {}, + "appearOnTop": "Parādīt virspusē", + "@appearOnTop": {}, + "invitePrivateChat": "📨 Uzaicināt privātu tērzēšanu", + "@invitePrivateChat": {}, + "verifyTitle": "Apliecina citu kontu", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "foregroundServiceRunning": "Šis paziņojums parādās, kad darbojas priekšplāna pakalpojums.", + "@foregroundServiceRunning": {}, + "enterAnEmailAddress": "Jāievada e-pasta adrese", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "voiceCall": "Balss zvans", + "@voiceCall": {}, + "commandHint_kick": "Noņemt norādīto lietotāju no šīs istabas", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "copiedToClipboard": "Ievietots starpliktuvē", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "createNewSpace": "Jauna vieta", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "commandHint_unban": "Atcelt norādītā lietotāja izslēgšanu no šīs istabas", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "unknownEncryptionAlgorithm": "Nezināms šifrēšanas algoritms", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "commandHint_ban": "Izslēgt norādīto lietotāju no šīs istabas", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "importEmojis": "Ievietot emocijzīmes", + "@importEmojis": {}, + "confirm": "Apstiprināt", + "@confirm": { + "type": "String", + "placeholders": {} + }, + "wasDirectChatDisplayName": "Tukša tērzēšana (bija {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "noChatDescriptionYet": "Tērzēšanas apraksts vēl nav izveidots.", + "@noChatDescriptionYet": {}, + "defaultPermissionLevel": "Noklusējuma atļauju līmenis jauniem lietotājiem", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "removeFromBundle": "Noņemt no šī komplekta", + "@removeFromBundle": {}, + "numUsersTyping": "{count} lietotāji raksta…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "fontSize": "Fonta izmērs", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "whoCanPerformWhichAction": "Kurš var veikt kādas darbības", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "confirmMatrixId": "Lūgums apliecināt savu Matrix Id, lai varētu izdzēst savu kontu.", + "@confirmMatrixId": {}, + "learnMore": "Uzzināt vairāk", + "@learnMore": {}, + "iHaveClickedOnLink": "Es uzklikšķināju uz saites", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "you": "Tu", + "@you": { + "type": "String", + "placeholders": {} + }, + "notAnImage": "Nav attēla datne.", + "@notAnImage": {}, + "users": "Lietotāji", + "@users": {}, + "openGallery": "Atvērt galeriju", + "@openGallery": {}, + "chatDescriptionHasBeenChanged": "Tērzēšanas apraksts ir mainījies", + "@chatDescriptionHasBeenChanged": {}, + "search": "Meklēt", + "@search": { + "type": "String", + "placeholders": {} + }, + "newGroup": "Jauna kopa", + "@newGroup": {}, + "bundleName": "Komplekta nosaukums", + "@bundleName": {}, + "dehydrateTor": "TOR lietotāji: izgūt sesiju", + "@dehydrateTor": {}, + "removeFromSpace": "Noņemt no vietas", + "@removeFromSpace": {}, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "commandHint_op": "Iestatīt norādītā lietotāja pilnvaru līmeni (noklusējums: 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_join": "Pievienoties norādītajai istabai", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "sourceCode": "Pirmkods", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "roomUpgradeDescription": "Tērzēšana tad tiks atkārtoti izveidota ar jauno istabas versiju. Visiem dalībniekiem tiks paziņots, ka viņiem ir jāpārslēdzas uz jauno tērzēšanu. Vairāk par istabu versijām var atrast https://spec.matrix.org/latest/rooms/", + "@roomUpgradeDescription": {}, + "commandHint_invite": "Uzaicināt norādīto lietotāju šajā istabā", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "userSentUnknownEvent": "{username} nosūtīja notikumu {type}", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "scanQrCode": "Nolasīt kvadrātkodu", + "@scanQrCode": {}, + "logout": "Atteikties", + "@logout": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterANumber": "Lūgums ievadīt skaitli lielāku par 0", + "@pleaseEnterANumber": {}, + "contactHasBeenInvitedToTheGroup": "Kontaktpersona tika uzaicināta kopā", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "youKicked": "👞 Tu izraidīji {user}", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "areYouSureYouWantToLogout": "Vai tiešām atteikties?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "changedTheJoinRules": "{username} nomainīja pievienošanās nosacījumus", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "profileNotFound": "Lietotāju serverī nevarēja atrast. Varbūt ir nebūšanas ar savienojumu vai lietotājs nepastāv.", + "@profileNotFound": {}, + "jump": "Pārlēkt", + "@jump": {}, + "groups": "Kopas", + "@groups": { + "type": "String", + "placeholders": {} + }, + "reactedWith": "{sender} atsaucās ar {reaction}", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "bannedUser": "{username} izslēdza {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "sorryThatsNotPossible": "Atvaino! Tas nav iespējams", + "@sorryThatsNotPossible": {}, + "videoWithSize": "Video ({size})", + "@videoWithSize": { + "type": "String", + "placeholders": { + "size": { + "type": "String" + } + } + }, + "oopsSomethingWentWrong": "Ups! Kaut kas nogāja greizi…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "Ielādēt vēl {count} dalībniekus", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "shareInviteLink": "Kopīgot uzaicinājuma saiti", + "@shareInviteLink": {}, + "commandHint_markasdm": "Atzīmēt kā tiešo ziņu istabu norādītajam Matrix Id", + "@commandHint_markasdm": {}, + "recoveryKeyLost": "Pazaudēta atkopes atslēga?", + "@recoveryKeyLost": {}, + "cuddleContent": "{senderName} samīļo Tevi", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "askVerificationRequest": "Pieņemt apliecināšanas pieprasījumu no {username}?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "containsUserName": "Satur lietotājvārdu", + "@containsUserName": { + "type": "String", + "placeholders": {} + }, + "messages": "Ziņas", + "@messages": { + "type": "String", + "placeholders": {} + }, + "login": "Pieteikties", + "@login": { + "type": "String", + "placeholders": {} + }, + "deviceKeys": "Ierīces atslēgas:", + "@deviceKeys": {}, + "waitingPartnerNumbers": "Gaida, līdz biedrs apstiprinās skaitļus…", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "Izskatās, ka Firebase mākoņziņojumapmaiņa nav pieejama šajā ierīcē. Lai joprojām saņemtu pašpiegādes paziņojumus, mēs iesakām uzstādīt ntfy. Ar ntfy vai citu Vienotās pašpiegādes nodrošinātāju ir iespējams saņemt pašpiegādes paziņojumus drošā veidā. ntfy var lejupielādēt no PlayStore vai F-Droid.", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "everythingReady": "Viss ir gatavs!", + "@everythingReady": { + "type": "String", + "placeholders": {} + }, + "addEmail": "Pievienot e-pasta adresi", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "emoteKeyboardNoRecents": "Nesen izmantotās emocijas parādīsies šeit...", + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "setCustomEmotes": "Iestatīt pielāgotas emocijas", + "@setCustomEmotes": { + "type": "String", + "placeholders": {} + }, + "startedACall": "{senderName} uzsāka zvanu", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "emoteInvalid": "Nederīgs emocijas īskods.", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "systemTheme": "Sistēmas", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "notificationsEnabledForThisAccount": "Paziņojumi iespējoti šim kontam", + "@notificationsEnabledForThisAccount": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "Izdzēst ziņu", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "Tērzēšanas vēstures redzamība", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "settings": "Iestatījumi", + "@settings": { + "type": "String", + "placeholders": {} + }, + "setTheme": "Iestatīt izskatu:", + "@setTheme": {}, + "changeTheHomeserver": "Mainīt mājasserveri", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "youJoinedTheChat": "Tu pievienojies tērzēšanai", + "@youJoinedTheChat": {}, + "wallpaper": "Ekrāntapete:", + "@wallpaper": { + "type": "String", + "placeholders": {} + }, + "openVideoCamera": "Atvērt kameru video uzņemšanai", + "@openVideoCamera": { + "type": "String", + "placeholders": {} + }, + "play": "Atskaņot {fileName}", + "@play": { + "type": "String", + "placeholders": { + "fileName": { + "type": "String" + } + } + }, + "chatBackupDescription": "Iepriekšējās ziņas ir aizsargātas ar atkopes atslēgu. Lūgums nodrošināt, ka tā netiek pazaudēta.", + "@chatBackupDescription": { + "type": "String", + "placeholders": {} + }, + "changeDeviceName": "Mainīt ierīces nosaukumu", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "Aizmirsta parole", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "statusExampleMessage": "Kā Tev šodien klājas?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "security": "Drošība", + "@security": { + "type": "String", + "placeholders": {} + }, + "markAsRead": "Atzīmēt kā lasītu", + "@markAsRead": {}, + "sendAudio": "Nosūtīt skaņu", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "widgetName": "Nosaukums", + "@widgetName": {}, + "sentASticker": "😊 {username} nosūtīja uzlīmi", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "errorAddingWidget": "Kļūda logrīka pievienošanā.", + "@errorAddingWidget": {}, + "commandHint_dm": "Uzsākt tiešu tērzēšanu\nLai atspējotu šifrēšanu, jāizmanto --no-encryption", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "commandHint_hug": "Nosūtīt apskāvienu", + "@commandHint_hug": {}, + "replace": "Aizstāt", + "@replace": {}, + "reject": "Noraidīt", + "@reject": { + "type": "String", + "placeholders": {} + }, + "extremeOffensive": "Īpaši aizskarošs", + "@extremeOffensive": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "Labot liegtos serverus", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "oopsPushError": "Ups! Diemžēl atgadījās kļūda pašpiegādes paziņojumu iestatīšanas laikā.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "youUnbannedUser": "Tu atcēli {user} piekļuves liegumu", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "deactivateAccountWarning": "Tas atspējos Tavu lietotāja kontu. To nevar atdarīt. Vai tiešām?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "archive": "Arhīvs", + "@archive": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "👋 {username} pievienojās tērzēšanai", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "visibleForEveryone": "Redzama visiem", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "pleaseEnter4Digits": "Lūgums ievadīt 4 ciparus vai atstāt tukšu, lai atspējotu lietotnes slēgu.", + "@pleaseEnter4Digits": { + "type": "String", + "placeholders": {} + }, + "newSpace": "Jauna vieta", + "@newSpace": {}, + "changePassword": "Nomainīt paroli", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "devices": "Ierīces", + "@devices": { + "type": "String", + "placeholders": {} + }, + "accept": "Pieņemt", + "@accept": { + "type": "String", + "placeholders": {} + }, + "unknownEvent": "Nezināms notikums '{type}'", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "emojis": "Emocijzīmes", + "@emojis": {}, + "pleaseEnterYourPin": "Lūgums ievadīt savu PIN", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "pleaseChoose": "Lūgums izvēlēties", + "@pleaseChoose": { + "type": "String", + "placeholders": {} + }, + "share": "Kopīgot", + "@share": { + "type": "String", + "placeholders": {} + }, + "commandHint_googly": "Nosūtīt izbolītu acu pāri", + "@commandHint_googly": {}, + "pleaseTryAgainLaterOrChooseDifferentServer": "Lūgums vēlāk mēģināt vēlreiz vai izvēlēties citu serveri.", + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "createGroup": "Izveidot kopu", + "@createGroup": {}, + "privacy": "Privātums", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "changeYourAvatar": "Mainīt savu attēlu", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "sendImage": "Nosūtīt attēlu", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "hydrateTorLong": "Vai sesija pēdējoreiz tika izgūta TOR? Ātri ievieto to un turpini tērzēšanu!", + "@hydrateTorLong": {}, + "time": "Laiks", + "@time": {}, + "enterYourHomeserver": "Jāievada mājasserveris", + "@enterYourHomeserver": { + "type": "String", + "placeholders": {} + }, + "botMessages": "Robotprogrammatūras ziņas", + "@botMessages": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "Par saturu tika ziņos servera pārvaldītājiem", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "custom": "Pielāgots", + "@custom": {}, + "noBackupWarning": "Uzmanību! Bez tērzēšanu rezerves kopiju veidošanas iespējošanas tiks zaudēta piekļuve savām šifrētajām ziņām. Ir ļoti ieteicams iespējot tērzēšanu rezerves kopiju veidošanu pirms atteikšanās.", + "@noBackupWarning": {}, + "fromJoining": "No pievienošanās", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "verify": "Apliecināt", + "@verify": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "Nosūtīt video", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "storeInSecureStorageDescription": "Glabāt atkopes atslēgu šīs ierīces drošajā krātuvē.", + "@storeInSecureStorageDescription": {}, + "openChat": "Atvērt tērzēšanu", + "@openChat": {}, + "kickUserDescription": "Lietotājs ir izmests no tērzēšanas, bet piekļuve nav liegta. Publiskās tērzēšanās lietotājs var atkārtoti pievienoties jebkurā laikā.", + "@kickUserDescription": {}, + "sendAMessage": "Nosūtīt ziņu", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "pin": "PIN", + "@pin": { + "type": "String", + "placeholders": {} + }, + "importNow": "Ievietot tagad", + "@importNow": {}, + "deleteAccount": "Izdzēst kontu", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "setInvitationLink": "Iestatīt uzaicinājumu saiti", + "@setInvitationLink": { + "type": "String", + "placeholders": {} + }, + "pinMessage": "Piespraust istabai", + "@pinMessage": {}, + "screenSharingDetail": "Tu kopīgo savu ekrānu FluffyChat", + "@screenSharingDetail": {}, + "muteChat": "Apklusināt tērzēšanu", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "invite": "Uzaicināt", + "@invite": {}, + "enableMultiAccounts": "(BETA) Iespējot vairākus kontus šajā ierīcē", + "@enableMultiAccounts": {}, + "anyoneCanJoin": "Ikviens var pievienoties", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "emotePacks": "Emociju pakas istabai", + "@emotePacks": { + "type": "String", + "placeholders": {} + }, + "indexedDbErrorTitle": "Privātā režīma nebūšanas", + "@indexedDbErrorTitle": {}, + "endedTheCall": "{senderName} beidza zvanu", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "appLockDescription": "Aizslēgt lietotni, kad tā netiek izmantota, ar PIN kodu", + "@appLockDescription": {}, + "globalChatId": "Vispārējais tērzēšanas Id", + "@globalChatId": {}, + "accessAndVisibilityDescription": "Kam ir ļauts pievienoties šai tērzēšanai un kā tērzēšana var tikt atklāta.", + "@accessAndVisibilityDescription": {}, + "customEmojisAndStickers": "Pielāgotas emocijzīmes un uzlīmes", + "@customEmojisAndStickers": {}, + "customEmojisAndStickersBody": "Pievienot vai kopīgot pielāgotas emocijzīmes vai uzlīmes, kas var tikt izmantotas jebkurā tērzēšanā.", + "@customEmojisAndStickersBody": {}, + "hideInvalidOrUnknownMessageFormats": "Paslēpt nederīgus vai nezināmus ziņu formātus", + "@hideInvalidOrUnknownMessageFormats": {}, + "blockUsername": "Neņemt vērā lietotājvārdu", + "@blockUsername": {}, + "accessAndVisibility": "Piekļuve un redzamība", + "@accessAndVisibility": {}, + "calls": "Zvani", + "@calls": {}, + "hideRedactedMessages": "Paslēpt labošanas ziņas", + "@hideRedactedMessages": {}, + "hideRedactedMessagesBody": "Ja kāds labo ziņu, tā vairs nebūs redzama tērzēšanā.", + "@hideRedactedMessagesBody": {}, + "blockListDescription": "Ir iespējams atslēgt traucējošus lietotājus. Nebūs iespējams saņem jebkādas ziņas vai uzaicinājumus uz istabām no lietotājiem, kas ir personīgajā izslēgšanas sarakstā.", + "@blockListDescription": {}, + "hideMemberChangesInPublicChatsBody": "Nerādīt tērzēšanas plūsmā, ja kāds pievienojas publiskai tērzēšanai vai pamet to, lai uzlabotu lasāmību.", + "@hideMemberChangesInPublicChatsBody": {}, + "overview": "Pārskats", + "@overview": {}, + "notifyMeFor": "Paziņot man par", + "@notifyMeFor": {}, + "wrongRecoveryKey": "Atvaino... Nešķiet, ka šī būtu pareiza atkopes atslēga.", + "@wrongRecoveryKey": {}, + "block": "Izslēgt", + "@block": {}, + "hideMemberChangesInPublicChats": "Paslēpt dalībnieku izmaiņas publiskajās tērzēšanās", + "@hideMemberChangesInPublicChats": {}, + "passwordRecoverySettings": "Paroles atkopes iestatījumi", + "@passwordRecoverySettings": {}, + "blockedUsers": "Atslēgtie lietotāji", + "@blockedUsers": {}, + "transparent": "Caurspīdīgs", + "@transparent": {}, + "searchForUsers": "Meklēt @lietotājus...", + "@searchForUsers": {}, + "pleaseEnterYourCurrentPassword": "Lūgums ievadīt savu pašreizējo paroli", + "@pleaseEnterYourCurrentPassword": {}, + "publicSpaces": "Publiskas vietas", + "@publicSpaces": {}, + "decline": "Atteikt", + "@decline": {}, + "joinSpace": "Pievienoties vietai", + "@joinSpace": {}, + "createGroupAndInviteUsers": "Izveidot kopu un uzaicināt lietotājus", + "@createGroupAndInviteUsers": {}, + "groupCanBeFoundViaSearch": "Kopu var atrast meklēšanā", + "@groupCanBeFoundViaSearch": {}, + "commandHint_sendraw": "Nosūtīt neapstrādātu JSON", + "@commandHint_sendraw": {}, + "newPassword": "Jauna parole", + "@newPassword": {}, + "forwardMessageTo": "Pārsūtīt ziņu uz {roomName}?", + "@forwardMessageTo": { + "type": "String", + "placeholders": { + "roomName": { + "type": "String" + } + } + }, + "sendReadReceipts": "Nosūtīt lasīšanas atskaites", + "@sendReadReceipts": {}, + "verifyOtherUser": "🔐 Apliecināt otru lietotāju", + "@verifyOtherUser": {}, + "verifyOtherDevice": "🔐 Apliecināt otru ierīci", + "@verifyOtherDevice": {}, + "yourGlobalUserIdIs": "Vispārējais lietotāja Id ir: ", + "@yourGlobalUserIdIs": {}, + "select": "Atlasīt", + "@select": {}, + "initAppError": "Atgadījās kļūda lietotnes sāknēšanas laikā", + "@initAppError": {}, + "formattedMessages": "Formatētas ziņas", + "@formattedMessages": {}, + "canceledKeyVerification": "{sender} atcēla atslēgas apliecināšanu", + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "completedKeyVerification": "{sender} pabeidza atslēgas apliecināšanu", + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "requestedKeyVerification": "{sender} pieprasīja atslēgas apliecināšanu", + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "startedKeyVerification": "{sender} uzsāka atslēgas apliecināšanu", + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "incomingMessages": "Ienākošās ziņas", + "@incomingMessages": {}, + "isReadyForKeyVerification": "{sender} ir gatavs atslēgas apliecināšanai", + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "commandHint_unignore": "Atcelt norādītā Matrix Id neņemšanu vērā", + "@commandHint_unignore": {}, + "commandHint_ignore": "Neņemt vērā norādīto Matrix Id", + "@commandHint_ignore": {}, + "searchChatsRooms": "Meklēt #tērzēšanas, @lietotājus...", + "@searchChatsRooms": {}, + "groupName": "Kopas nosaukums", + "@groupName": {}, + "presenceStyle": "Klātesamība:", + "@presenceStyle": { + "type": "String", + "placeholders": {} + }, + "youInvitedToBy": "📩 Tu tiki uzaicināts ar saiti:\n{alias}", + "@youInvitedToBy": { + "placeholders": { + "alias": { + "type": "String" + } + } + }, + "userWouldLikeToChangeTheChat": "{user} vēlas pievienoties tērzēšanai.", + "@userWouldLikeToChangeTheChat": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "noPublicLinkHasBeenCreatedYet": "Vēl nav izveidota neviena publiska saite", + "@noPublicLinkHasBeenCreatedYet": {}, + "knock": "Pieklauvēt", + "@knock": {}, + "stickers": "Uzlīmes", + "@stickers": {}, + "usersMustKnock": "Lietotājiem jāpieklauvē", + "@usersMustKnock": {}, + "noOneCanJoin": "Neviens nevar pievienoties", + "@noOneCanJoin": {}, + "hidePresences": "Paslēpt stāvokļu sarakstu?", + "@hidePresences": {}, + "knocking": "Klauvē", + "@knocking": {}, + "chatCanBeDiscoveredViaSearchOnServer": "Tērzēšana var tikt atklāta ar meklēšanu {server}", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "nothingFound": "Nekas netika atrasts...", + "@nothingFound": {}, + "startConversation": "Uzsākt sarunu", + "@startConversation": {}, + "databaseMigrationTitle": "Datubāze ir optimizēta", + "@databaseMigrationTitle": {}, + "leaveEmptyToClearStatus": "Atstāt tukšu, lai notīrītu savu stāvokli.", + "@leaveEmptyToClearStatus": {}, + "pleaseChooseAStrongPassword": "Lūgums izvēlēties spēcīgu paroli", + "@pleaseChooseAStrongPassword": {}, + "passwordIsWrong": "Ievadītā parole ir nepareiza", + "@passwordIsWrong": {}, + "publicLink": "Publiska saite", + "@publicLink": {}, + "thisDevice": "Šī ierīce:", + "@thisDevice": {}, + "acceptedKeyVerification": "{sender} apstiprināja atslēgas apliecināšanu", + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "userRole": "Lietotāja loma", + "@userRole": {}, + "noDatabaseEncryption": "Šajā platformā datubāzes šifrēšana netiek nodrošināta", + "@noDatabaseEncryption": {}, + "presencesToggle": "Rādīt citu lietotāju stāvokļa ziņas", + "@presencesToggle": { + "type": "String", + "placeholders": {} + }, + "databaseMigrationBody": "Lūgums uzgaidīt. Tas var aizņemt kādu brīdi.", + "@databaseMigrationBody": {}, + "passwordsDoNotMatch": "Paroles nesakrīt", + "@passwordsDoNotMatch": {}, + "publicChatAddresses": "Publiskas tērzēšanas adreses", + "@publicChatAddresses": {}, + "createNewAddress": "Izveidot jaunu adresi", + "@createNewAddress": {}, + "minimumPowerLevel": "{level} ir zemākais spēka līmenis.", + "@minimumPowerLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "String" + } + } + }, + "discover": "Atklāt", + "@discover": {}, + "unreadChatsInApp": "{appname}: {unread} nelasītas tērzēšanas", + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "subspace": "Apakšvieta", + "@subspace": {}, + "addChatOrSubSpace": "Pievienot tērzēšanu vai apakšvietu", + "@addChatOrSubSpace": {}, + "formattedMessagesDescription": "Attēlot bagātinātu ziņu saturu, piemēram, ar Markdown iezīmētu treknrakstu.", + "@formattedMessagesDescription": {}, + "databaseBuildErrorBody": "Nebija iespējams izveidot SQlite datubāzi. Lietotne pagaidām mēģina izmantot iepriekšējo datubāzi. Lūgums ziņot par šo kļūdu izstrādātājiem {url}. Kļūdas ziņojums ir: {error}", + "@databaseBuildErrorBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "sessionLostBody": "Sesija ir zaudēta. Lūgums ziņot par šo kļūdu izstrādātājiem {url}. Kļūdas ziņojums ir: {error}", + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "verifyOtherUserDescription": "Ar cita lietotāja apliecināšanu vari pārliecināties, ka zini, kam Tu tiešām raksti. 💪\n\nKad uzsāc apliecināšanu, Tu un otrs lietotājs lietotnē redzēs uznirstošo logu. Tajā jūs redzēsiet dažādas emocijzīmes vai skaitļus, kas ir jāsalīdzina savā starpā.\n\nLabākais veids, kā to izdarīt, ir satikties vai uzsākt videozvanu. 👭", + "@verifyOtherUserDescription": {}, + "sendTypingNotificationsDescription": "Citi tērzēšanas dalībnieki var redzēt, kad raksti jaunu ziņu.", + "@sendTypingNotificationsDescription": {}, + "noUsersFoundWithQuery": "Diemžēl ar \"{query}\" netika atrasts neviens lietotājs. Lūgums pārbaudīt, vai ir pieļauta drukas kļūda.", + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "restoreSessionBody": "Lietotne tagad mēģina atjaunot sesiju no rezerves kopijas. Lūgums ziņot par šo kļūdu izstrādātājiem {url}. Kļūdas ziņojums ir: {error}", + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "sendReadReceiptsDescription": "Citi tērzēšanas dalībnieki var redzēt, kad izlasīji ziņu.", + "@sendReadReceiptsDescription": {}, + "thereAreCountUsersBlocked": "Šobrīd ir izslēgti {count} lietotāji.", + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "verifyOtherDeviceDescription": "Kad apliecini citu ierīci, šīs ierīces var apmainīt atslēgas, palielinot vispārējo drošību. 💪 Pēc apliecināšanas uzsākšanas abās ierīcēs lietotnē parādīsies uznirstošais logs. Tajā būs redzamas dažādas emocijzīmes vai skaitļi, kas jāsalīdzina abās ierīcēs. Vislabāk, ja abas ierīces ir pieejamas, pirms tiek uzsākta apliecināšana. 🤳", + "@verifyOtherDeviceDescription": {}, + "swipeRightToLeftToReply": "Pavilkt no labās puses uz kreiso, lai atbildētu", + "@swipeRightToLeftToReply": {}, + "searchIn": "Meklēt tērzēšanā \"{chat}\"...", + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "searchMore": "Meklēt vairāk...", + "@searchMore": {}, + "gallery": "Galerija", + "@gallery": {}, + "files": "Datnes", + "@files": {}, + "restricted": "Ierobežots", + "@restricted": {}, + "knockRestricted": "Pieklauvēt ierobežotajiem", + "@knockRestricted": {}, + "sendCanceled": "Sūtīšana atcelta", + "@sendCanceled": {}, + "noChatsFoundHere": "Šeit vēl nav tērzēšanu. Jauna saruna ar kādu ir uzsākama ar zemāk esošo pogu. ⤵️", + "@noChatsFoundHere": {}, + "invitedBy": "📩 {user} uzaicināja", + "@invitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "moderatorLevel": "{level} - Moderators", + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "adminLevel": "{level} - Pārvaldītājs", + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "changeTheVisibilityOfChatHistory": "Mainīt tērzēšanas vēstures redzamību", + "@changeTheVisibilityOfChatHistory": {}, + "changeTheCanonicalRoomAlias": "Mainīt tērzēšanas galveno publisko adresi", + "@changeTheCanonicalRoomAlias": {}, + "sendRoomNotifications": "Sūtīt @istaba paziņojumus", + "@sendRoomNotifications": {}, + "changeTheDescriptionOfTheGroup": "Mainīt tērzēšanas aprakstu", + "@changeTheDescriptionOfTheGroup": {}, + "alwaysUse24HourFormat": "nē", + "@alwaysUse24HourFormat": { + "description": "Set to true to always display time of day in 24 hour format." + }, + "userLevel": "{level} - Lietotājs", + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "goToSpace": "Doties uz vietu: {space}", + "@goToSpace": { + "type": "String", + "space": {} + }, + "changeGeneralChatSettings": "Mainīt vispārējos tērzēšanas iestatījumus", + "@changeGeneralChatSettings": {}, + "inviteOtherUsers": "Uzaicināt šajā tērzēšanā citus lietotājus", + "@inviteOtherUsers": {}, + "changeTheChatPermissions": "Mainīt tērzēšanas atļaujas", + "@changeTheChatPermissions": {}, + "chatPermissionsDescription": "Noteikt, kurš spēka līmenis ir nepieciešams noteiktām darbībām šajā tērzēšanā. Spēka līmeņi 0, 50 un 100 parasti atbilst lietotājiem, moderatoriem un pārvaldītājiem, bet ir iespējams jebkāds iedalījums.", + "@chatPermissionsDescription": {}, + "doesNotSeemToBeAValidHomeserver": "Neizskatās pēc saderīga mājasservera. Nepareizs URL?", + "@doesNotSeemToBeAValidHomeserver": {}, + "loginWithMatrixId": "Pieteikties ar Matrix-Id", + "@loginWithMatrixId": {}, + "discoverHomeservers": "Atklāt mājasserverus", + "@discoverHomeservers": {}, + "whatIsAHomeserver": "Kas ir mājasserveris?", + "@whatIsAHomeserver": {}, + "homeserverDescription": "Visi lietotāja dati tiek glabāti mājasserverī, gluži kā ar e-pasta nodrošinātāju. Ir iespējams izvēlēties, kuru mājasserveri izmantot, saglabājot iespēju sazināties ar ikvienu. Vairāk var uzzināt https://matrix.org.", + "@homeserverDescription": {}, + "updateInstalled": "🎉 Atjauninājums {version} uzstādīts.", + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "changelog": "Izmaiņu žurnāls", + "@changelog": {}, + "countChatsAndCountParticipants": "{chats} tērzēšanas un {participants} dalībnieki", + "@countChatsAndCountParticipants": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + }, + "participants": { + "type": "int" + } + } + }, + "noMoreChatsFound": "Vairs netika atrasta neviena tērzēšana...", + "@noMoreChatsFound": {}, + "joinedChats": "Tērzēšanas, kurās piedalos", + "@joinedChats": {}, + "unread": "Nelasītas", + "@unread": {}, + "space": "Vieta", + "@space": {}, + "spaces": "Vietas", + "@spaces": {}, + "markAsUnread": "Atzīmēt kā nelasītu", + "@markAsUnread": {}, + "sendingAttachment": "Nosūta pielikumu...", + "@sendingAttachment": {}, + "generatingVideoThumbnail": "Izveido video sīktēlu...", + "@generatingVideoThumbnail": {}, + "sendingAttachmentCountOfCount": "Nosūta {index}. pielikumu no {length}...", + "@sendingAttachmentCountOfCount": { + "type": "integer", + "placeholders": { + "index": { + "type": "int" + }, + "length": { + "type": "int" + } + } + }, + "serverLimitReached": "Sasniegts servera ierobežojums. Gaida {seconds} sekundes...", + "@serverLimitReached": { + "type": "integer", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "calculatingFileSize": "Aprēķina datnes lielumu...", + "@calculatingFileSize": {}, + "prepareSendingAttachment": "Sagatavo pielikuma nosūtīšanu...", + "@prepareSendingAttachment": {}, + "compressVideo": "Saspiež video...", + "@compressVideo": {}, + "oneOfYourDevicesIsNotVerified": "Viena no ierīcēm nav apliecināta", + "@oneOfYourDevicesIsNotVerified": {}, + "noticeChatBackupDeviceVerification": "Piezīme: kad visas ierīces tiek savienotas ar tērzēšanu rezerves kopiju, tās tiek automātiski apliecinātas.", + "@noticeChatBackupDeviceVerification": {}, + "continueText": "Turpināt", + "@continueText": {}, + "welcomeText": "Sveicieni! 👋 Šis ir FluffyChat. Tu vari pieteikties jebkurā mājasserverī, kas ir saderīgs ar https://matrix.org. Tad vari tērzēt ar ikvienu. Tas ir milzīgs decentralizētās saziņas tīkls!", + "@welcomeText": {}, + "blur": "Aizmiglojums:", + "@blur": {}, + "setWallpaper": "Iestatīt ekrāntapeti", + "@setWallpaper": {}, + "opacity": "Necaurredzamība:", + "@opacity": {}, + "manageAccount": "Pārvaldīt kontu", + "@manageAccount": {}, + "noContactInformationProvided": "Serveris nesniedz nekādu derīgu saziņas informāciju", + "@noContactInformationProvided": {}, + "serverInformation": "Informācija par serveri:", + "@serverInformation": {}, + "aboutHomeserver": "Par {homeserver}", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "contactServerAdmin": "Sazināties ar servera pārvaldītāju", + "@contactServerAdmin": {}, + "contactServerSecurity": "Sazināties ar servera drošības uzturētājiem", + "@contactServerSecurity": {}, + "supportPage": "Atbalsta lapa", + "@supportPage": {}, + "name": "Nosaukums", + "@name": {}, + "version": "Versija", + "@version": {}, + "website": "Tīmekļvietne", + "@website": {}, + "compressBeforeSending": "Saspiest pirms nosūtīšanas", + "@compressBeforeSending": {}, + "boldText": "Teksts treknrakstā", + "@boldText": {}, + "strikeThrough": "Pārsvītrots", + "@strikeThrough": {}, + "invalidUrl": "Nederīgs URL", + "@invalidUrl": {}, + "addLink": "Pievienot saiti", + "@addLink": {}, + "italicText": "Teksts slīprakstā", + "@italicText": {}, + "pleaseFillOut": "Lūgums aizpildīt", + "@pleaseFillOut": {}, + "sendUncompressed": "Sūtīt nesaspiestu", + "@sendUncompressed": {}, + "sendImages": "Nosūtīt {count} attēlu(s)", + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "compress": "Saspiest", + "@compress": {}, + "unableToJoinChat": "Nevarēja pievienoties tērzēšanai. Varbūt otra puse jau ir aizvērusi sarunu.", + "@unableToJoinChat": {}, + "appWantsToUseForLoginDescription": "Ar šo tiek ļauts lietotnei un tīmekļvietnei kopīgot informāciju par Tevi.", + "@appWantsToUseForLoginDescription": {}, + "appIntroduction": "FluffyChat ļauj tērzēt ar draugiem, kuri izmanto dažādas ziņojumapmaiņas lietotnes. Vairāk var uzzināt https://matrix.org vai vienkārši piesitot *Turpināt*.", + "@appIntroduction": {}, + "synchronizingPleaseWaitCounter": " Sinhronizē... ({percentage}%)", + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "previous": "Iepriekšējais", + "@previous": {}, + "otherPartyNotLoggedIn": "Otra puse pašlaik nav pieteikusies un tādēļ nevar saņemt ziņas.", + "@otherPartyNotLoggedIn": {}, + "appWantsToUseForLogin": "Izmantot '{server}', lai pieteiktos", + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "open": "Atvērt", + "@open": {}, + "waitingForServer": "Gaida serveri...", + "@waitingForServer": {}, + "notificationRuleContainsDisplayNameDescription": "Paziņo lietotājam, kad ziņa satur viņa attēlojamo vārdu.", + "@notificationRuleContainsDisplayNameDescription": {}, + "notificationRuleServerAcl": "Apspiest servera ACL notikumus", + "@notificationRuleServerAcl": {}, + "notificationRuleSuppressNoticesDescription": "Apspiež paziņojumus no automatizētiem klientiem, piemēram, robotprogrammatūras.", + "@notificationRuleSuppressNoticesDescription": {}, + "notificationRuleInviteForMeDescription": "Paziņo lietotājam, kad viņš ir uzaicināts pievienoties istabai.", + "@notificationRuleInviteForMeDescription": {}, + "generalNotificationSettings": "Vispārēji paziņojumu iestatījumi", + "@generalNotificationSettings": {}, + "otherNotificationSettings": "Citi paziņojumu iestatījumi", + "@otherNotificationSettings": {}, + "notificationRuleContainsUserName": "Saturs lietotāja vārdu", + "@notificationRuleContainsUserName": {}, + "notificationRuleMasterDescription": "Pārspēj visas pārējās kārtulas un atspējo visus paziņojumus.", + "@notificationRuleMasterDescription": {}, + "notificationRuleInviteForMe": "Uzaicinājums man", + "@notificationRuleInviteForMe": {}, + "notificationRuleMemberEvent": "Dalībnieka notikums", + "@notificationRuleMemberEvent": {}, + "notificationRuleMemberEventDescription": "Apspiež paziņojums par dalības notikumiem.", + "@notificationRuleMemberEventDescription": {}, + "notificationRuleIsUserMentionDescription": "Paziņo lietotājam, kad viņš ziņā ir tieši pieminēts.", + "@notificationRuleIsUserMentionDescription": {}, + "notificationRuleIsRoomMention": "Istabas pieminēšana", + "@notificationRuleIsRoomMention": {}, + "notificationRuleRoomnotif": "Istabas paziņojums", + "@notificationRuleRoomnotif": {}, + "notificationRuleReaction": "Reakcija", + "@notificationRuleReaction": {}, + "notificationRuleRoomServerAcl": "Istabas servera ACL", + "@notificationRuleRoomServerAcl": {}, + "notificationRuleCall": "Zvans", + "@notificationRuleCall": {}, + "notificationRuleCallDescription": "Paziņo lietotājam par zvaniem.", + "@notificationRuleCallDescription": {}, + "deletePushRuleCanNotBeUndone": "Ja tiek izdzēsts šis paziņojuma iestatījums, to nevar atsaukt.", + "@deletePushRuleCanNotBeUndone": {}, + "more": "Vairāk", + "@more": {}, + "roomNotificationSettings": "Istabu paziņojumu iestatījumi", + "@roomNotificationSettings": {}, + "notificationRuleEncrypted": "Šifrēts", + "@notificationRuleEncrypted": {}, + "notificationRuleJitsi": "Jitsi", + "@notificationRuleJitsi": {}, + "notificationRuleIsUserMention": "Lietotāja pieminēšana", + "@notificationRuleIsUserMention": {}, + "notificationRuleIsRoomMentionDescription": "Paziņo lietotājam, kad tiek pieminēta istaba.", + "@notificationRuleIsRoomMentionDescription": {}, + "notificationRuleMessageDescription": "Paziņo lietotājam par vispārējām ziņām.", + "@notificationRuleMessageDescription": {}, + "notificationRuleServerAclDescription": "Apspiež notikumus par servera ACL notikumiem.", + "@notificationRuleServerAclDescription": {}, + "notificationRuleReactionDescription": "Apspiež paziņojums par reakcijām.", + "@notificationRuleReactionDescription": {}, + "unknownPushRule": "Nezināma pašpiegādes kārtula '{rule}'", + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } + } + }, + "newChatRequest": "📩 Jauns tērzēšanas pieprasījums", + "@newChatRequest": {}, + "notificationRuleContainsUserNameDescription": "Paziņo lietotājam, kad ziņa satur viņa lietotājvārdu.", + "@notificationRuleContainsUserNameDescription": {}, + "notificationRuleRoomnotifDescription": "Paziņo lietotājam, kad ziņa satur \"@istaba\".", + "@notificationRuleRoomnotifDescription": {}, + "notificationRuleEncryptedRoomOneToOneDescription": "Paziņo lietotājam par ziņām šifrētās viens pret viens istabās.", + "@notificationRuleEncryptedRoomOneToOneDescription": {}, + "notificationRuleRoomServerAclDescription": "Apspiež paziņojumus par istabas servera piekļuves kontroles sarakstiem (ACL).", + "@notificationRuleRoomServerAclDescription": {}, + "contentNotificationSettings": "Satura paziņojumu iestatījumi", + "@contentNotificationSettings": {}, + "notificationRuleContainsDisplayName": "Satur attēlojamo vārdu", + "@notificationRuleContainsDisplayName": {}, + "notificationRuleRoomOneToOne": "Viens pret viens istaba", + "@notificationRuleRoomOneToOne": {}, + "notificationRuleJitsiDescription": "Paziņo lietotājam par Jitsi logrīka notikumiem.", + "@notificationRuleJitsiDescription": {}, + "notificationRuleSuppressEditsDescription": "Apspiež paziņojumus par labotām ziņām.", + "@notificationRuleSuppressEditsDescription": {}, + "notificationRuleTombstone": "Kapakmens", + "@notificationRuleTombstone": {}, + "notificationRuleTombstoneDescription": "Paziņo lietotājam par istabu aizvēršanas ziņām.", + "@notificationRuleTombstoneDescription": {}, + "notificationRuleSuppressEdits": "Apspiest labojumus", + "@notificationRuleSuppressEdits": {}, + "notificationRuleEncryptedRoomOneToOne": "Šifrēta viens pret viens istaba", + "@notificationRuleEncryptedRoomOneToOne": {}, + "notificationRuleRoomOneToOneDescription": "Paziņo lietotājam par ziņām viens pret viens istabās.", + "@notificationRuleRoomOneToOneDescription": {}, + "notificationRuleMessage": "Ziņa", + "@notificationRuleMessage": {}, + "notificationRuleEncryptedDescription": "Paziņo lietotājam par ziņām šifrētās istabās.", + "@notificationRuleEncryptedDescription": {}, + "userSpecificNotificationSettings": "Lietotāja paziņojumu iestatījumi", + "@userSpecificNotificationSettings": {}, + "notificationRuleMaster": "Apklusināt visus paziņojumus", + "@notificationRuleMaster": {}, + "notificationRuleSuppressNotices": "Apspiest automātiskās ziņas", + "@notificationRuleSuppressNotices": {}, + "crossVerifiedDevices": "Savstarpēji apliecinātas ierīces", + "@crossVerifiedDevices": {}, + "shareKeysWith": "Kopīgot atslēgas ar...", + "@shareKeysWith": {}, + "shareKeysWithDescription": "Kurām ierīcēm vajadzētu uzticēties, lai tajās varētu lasīt ziņas šifrētajās tērzēšanās?", + "@shareKeysWithDescription": {}, + "allDevices": "Visas ierīces", + "@allDevices": {}, + "crossVerifiedDevicesIfEnabled": "Savstarpēji apliecinātas ierīces, ja iespējots", + "@crossVerifiedDevicesIfEnabled": {}, + "verifiedDevicesOnly": "Tikai apliecinātas ierīces", + "@verifiedDevicesOnly": {}, + "optionalMessage": "(Pēc izvēles) Ziņojums...", + "@optionalMessage": {}, + "takeAPhoto": "Uzņemt attēlu", + "@takeAPhoto": {}, + "recordAVideo": "Ierakstīt video", + "@recordAVideo": {}, + "notSupportedOnThisDevice": "Šajā ierīcē nav atbalstīts", + "@notSupportedOnThisDevice": {}, + "enterNewChat": "Ieiet jaunajā tērzēšanā", + "@enterNewChat": {}, + "commandHint_roomupgrade": "Uzlabot šo istabu uz norādīto istabas versiju", + "@commandHint_roomupgrade": {} +} diff --git a/assets/l10n/intl_nb.arb b/assets/l10n/intl_nb.arb new file mode 100644 index 0000000..598e538 --- /dev/null +++ b/assets/l10n/intl_nb.arb @@ -0,0 +1,1821 @@ +{ + "@@last_modified": "2021-08-14 12:41:09.967351", + "about": "Om", + "@about": { + "type": "String", + "placeholders": {} + }, + "accept": "Godta", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "{username} godtok invitasjonen", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "Konto", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "{username} skrudde på ende-til-ende -kryptering", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "admin": "Administrator", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "alias", + "@alias": { + "type": "String", + "placeholders": {} + }, + "all": "Alle", + "@all": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "{senderName} besvarte anropet", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "Hvem som helst kan delta", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "appLock": "Programlås", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "archive": "Arkiv", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "Skal gjester tillates å ta del", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "Er du sikker?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "areYouSureYouWantToLogout": "Er du sikker på at du vil logge ut?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "For å kunne signere den andre personen, skriv inn ditt sikre lagerpassord eller gjenopprettingsnøkkel.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "Godta denne bekreftelsesforespørselen fra {username}?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "banFromChat": "Bannlys fra sludring", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "Bannlyst", + "@banned": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username} bannlyste {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "Blokker enhet", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "botMessages": "Bot-meldinger", + "@botMessages": { + "type": "String", + "placeholders": {} + }, + "cancel": "Avbryt", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "changeDeviceName": "Endre enhetsnavn", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "{username} endret sludreavatar", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatDescriptionTo": "{username} endret sludrebeskrivelse til: «{description}»", + "@changedTheChatDescriptionTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "description": { + "type": "String" + } + } + }, + "changedTheChatNameTo": "{username} endret sludringsnavn til: «{chatname}»", + "@changedTheChatNameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "chatname": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username} endret sludretilgangene", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username} endret visningsnavn til: {displayname}", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} endret gjestetilgangsreglene", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} endret gjestetilgangsregler til: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username} endret historikksynlighet", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username} endret historikksynlighet til: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username} endret tilgangsreglene", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} endret tilgangsreglene til: {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} endret avataren sin", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "{username} endret rom-aliasene", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username} endret invitasjonslenken", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changePassword": "Endre passord", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "Endre hjemmetjener", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "Endre din stil", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "Endre gruppens navn", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "Krypteringen er skadet", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "chat": "Sludring", + "@chat": { + "type": "String", + "placeholders": {} + }, + "chatBackup": "Sludringssikkerhetskopi", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "chatBackupDescription": "Din sludringssikkerhetskopi er sikret med en sikkerhetsnøkkel. Ikke mist den.", + "@chatBackupDescription": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Sludringsdetaljer", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "Velg et sterkt passord", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "close": "Lukk", + "@close": { + "type": "String", + "placeholders": {} + }, + "compareEmojiMatch": "Sammenlign og forsikre at følgende smilefjes samsvarer med de på den andre enheten:", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "Sammenlign og forsikre at følgende tall samsvarer med de på den andre enheten:", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "configureChat": "Sett opp sludring", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "confirm": "Bekreft", + "@confirm": { + "type": "String", + "placeholders": {} + }, + "connect": "Koble til", + "@connect": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "Kontakt invitert til gruppen", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "containsDisplayName": "Inneholder visningsnavn", + "@containsDisplayName": { + "type": "String", + "placeholders": {} + }, + "containsUserName": "Inneholder brukernavn", + "@containsUserName": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "Innholdet har blitt rapportert til tjeneradministratorene", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "Kopiert til utklippstavle", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "Kopier", + "@copy": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "Kopier til utklippstavle", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "Kunne ikke dekryptere melding: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "countParticipants": "{count} deltagere", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "create": "Opprett", + "@create": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "{username} opprettet sludringen", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "currentlyActive": "Aktiv nå", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "Mørk", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{timeOfDay}, {date}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "dateWithoutYear": "{day} {month}", + "@dateWithoutYear": { + "type": "String", + "placeholders": { + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "dateWithYear": "{day} {month} {year}", + "@dateWithYear": { + "type": "String", + "placeholders": { + "year": { + "type": "String" + }, + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "deactivateAccountWarning": "Dette vil skru av din brukerkonto for godt, og kan ikke angres! Er du sikker?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "Forvalgt tilgangsnivå", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "delete": "Slett", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "Slett konto", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "Slett melding", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "device": "Enhet", + "@device": { + "type": "String", + "placeholders": {} + }, + "deviceId": "Enhets-ID", + "@deviceId": { + "type": "String", + "placeholders": {} + }, + "devices": "Enheter", + "@devices": { + "type": "String", + "placeholders": {} + }, + "directChats": "Direktesludringer", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "Visningsnavn endret", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "Last ned fil", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "edit": "Rediger", + "@edit": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "Rediger blokkerte tjenere", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "editDisplayname": "Rediger visningsnavn", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "Rediger romavatar", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "Smilefjeset finnes allerede!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "Ugyldig smilefjes-kode!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emotePacks": "Smilefjespakker for rommet", + "@emotePacks": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "Smilefjes-innstillinger", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "emoteShortcode": "Smilefjes-kode", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emoteWarnNeedToPick": "Du må velge en smilefjes-kode og et bilde!", + "@emoteWarnNeedToPick": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "Tom sludring", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "Skru på smilefjespakke for hele programmet", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "Skru på kryptering", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "Du vil ikke kunne skru av kryptering lenger. Er du sikker?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "encrypted": "Kryptert", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "encryption": "Kryptering", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "Kryptering er ikke påskrudd", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName} avsluttet samtalen", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "enterAnEmailAddress": "Skriv inn en e-postadresse", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "enterYourHomeserver": "Skriv inn din hjemmetjener", + "@enterYourHomeserver": { + "type": "String", + "placeholders": {} + }, + "everythingReady": "Alt er klart!", + "@everythingReady": { + "type": "String", + "placeholders": {} + }, + "extremeOffensive": "Veldig", + "@extremeOffensive": { + "type": "String", + "placeholders": {} + }, + "fileName": "Filnavn", + "@fileName": { + "type": "String", + "placeholders": {} + }, + "fluffychat": "FluffyChat", + "@fluffychat": { + "type": "String", + "placeholders": {} + }, + "fontSize": "Skriftstørrelse", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "forward": "Videre", + "@forward": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "Fra å ta del", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "Fra invitasjonen", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "group": "Gruppe", + "@group": { + "type": "String", + "placeholders": {} + }, + "groupIsPublic": "Gruppen er offentlig", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "groups": "Grupper", + "@groups": { + "type": "String", + "placeholders": {} + }, + "groupWith": "Gruppe med {displayname}", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "guestsAreForbidden": "Gjester forbudt", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "Gjester kan ta del", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{username} har trukket tilbake invitasjonen til {targetName}", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "help": "Hjelp", + "@help": { + "type": "String", + "placeholders": {} + }, + "hideRedactedEvents": "Skjul tilbaketrukne hendelser", + "@hideRedactedEvents": { + "type": "String", + "placeholders": {} + }, + "hideUnknownEvents": "Skjul ukjente hendelser", + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "howOffensiveIsThisContent": "Hvor støtende er innholdet?", + "@howOffensiveIsThisContent": { + "type": "String", + "placeholders": {} + }, + "id": "ID", + "@id": { + "type": "String", + "placeholders": {} + }, + "identity": "Identitet", + "@identity": { + "type": "String", + "placeholders": {} + }, + "ignore": "Ignorer", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "ignoredUsers": "Ignorerte brukere", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "iHaveClickedOnLink": "Jeg har klikket på lenken", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "Feilaktig passord eller gjenopprettingsnøkkel", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "inoffensive": "Harmløst", + "@inoffensive": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "Inviter kontakt", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "Inviter kontakt til {groupName}", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "invited": "Invitert", + "@invited": { + "type": "String", + "placeholders": {} + }, + "invitedUser": "{username} inviterte {targetName}", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "invitedUsersOnly": "Kun inviterte brukere", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "inviteForMe": "Invitasjon for meg", + "@inviteForMe": { + "type": "String", + "placeholders": {} + }, + "inviteText": "{username} har invitert deg til FluffyChat. \n1. Installer FluffyChat: https://fluffychat.im \n2. Registrer deg eller logg inn \n3. Åpne invitasjonslenken: {link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "isTyping": "skriver…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "{username}ble med i samtalen", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "joinRoom": "Ta del i rom", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "kicked": "{username} kastet ut {targetName}", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickedAndBanned": "{username} kastet ut og bannlyste {targetName}", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickFromChat": "Kast ut av sludringen", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "Sist aktiv: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "leave": "Forlat", + "@leave": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "Forlat sludringen", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "license": "Lisens", + "@license": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "Lys", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "Last inn {count} deltagere til", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "loadingPleaseWait": "Laster inn… Vent.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "loadMore": "Last inn mer…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "login": "Logg inn", + "@login": { + "type": "String", + "placeholders": {} + }, + "logInTo": "Logg inn på {homeserver}", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "logout": "Logg ut", + "@logout": { + "type": "String", + "placeholders": {} + }, + "memberChanges": "Medlemsendringer", + "@memberChanges": { + "type": "String", + "placeholders": {} + }, + "mention": "Nevn", + "@mention": { + "type": "String", + "placeholders": {} + }, + "messages": "Meldinger", + "@messages": { + "type": "String", + "placeholders": {} + }, + "moderator": "Moderator", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "muteChat": "Forstum sludring", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "needPantalaimonWarning": "Merk at du trenger Pantalaimon for å bruke ende-til-ende -kryptering inntil videre.", + "@needPantalaimonWarning": { + "type": "String", + "placeholders": {} + }, + "newChat": "Ny sludring", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "Ny melding i FluffyChat", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "Ny bekreftelsesforespørsel!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "next": "Neste", + "@next": { + "type": "String", + "placeholders": {} + }, + "no": "Nei", + "@no": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "Fant ingen smilefjes. 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "Bruk https://microg.org/ for å få Google-tjenester (uten at det går ut over personvernet) for å få push-merknader i FluffyChat:", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "none": "Ingen", + "@none": { + "type": "String", + "placeholders": {} + }, + "noPasswordRecoveryDescription": "Du har ikke lagt til en måte å gjenopprette passordet ditt på.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "noPermission": "Ingen tilgang", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "Fant ingen rom …", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "notifications": "Merknader", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "notificationsEnabledForThisAccount": "Merknader påslått for denne kontoen", + "@notificationsEnabledForThisAccount": { + "type": "String", + "placeholders": {} + }, + "numUsersTyping": "{count} brukere skriver …", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "offensive": "Støtende", + "@offensive": { + "type": "String", + "placeholders": {} + }, + "offline": "Frakoblet", + "@offline": { + "type": "String", + "placeholders": {} + }, + "ok": "OK", + "@ok": { + "type": "String", + "placeholders": {} + }, + "online": "Pålogget", + "@online": { + "type": "String", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "Nettbasert sikkerhetskopiering av nøkler på", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "Oida, noe gikk galt …", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "Åpne programmet for å lese meldinger", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "openCamera": "Åpne kamera", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "participant": "Deltager", + "@participant": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "Passord eller gjenopprettingsnøkkel", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "password": "Passord", + "@password": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "Passord glemt", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "Passord endret", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "passwordRecovery": "Passordgjenoppretting", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "pickImage": "Velg bilde", + "@pickImage": { + "type": "String", + "placeholders": {} + }, + "pin": "Fest", + "@pin": { + "type": "String", + "placeholders": {} + }, + "play": "Spill av {fileName}", + "@play": { + "type": "String", + "placeholders": { + "fileName": { + "type": "String" + } + } + }, + "pleaseClickOnLink": "Klikk på lenken i e-posten og fortsett.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPassword": "Skriv inn passordet ditt", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "Skriv inn brukernavnet ditt", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "Følg instruksen på nettsiden og trykk på «Neste».", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "privacy": "Personvern", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "Offentlige rom", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "pushRules": "Dyttingsregler", + "@pushRules": { + "type": "String", + "placeholders": {} + }, + "reason": "Grunn", + "@reason": { + "type": "String", + "placeholders": {} + }, + "recording": "Opptak", + "@recording": { + "type": "String", + "placeholders": {} + }, + "redactedAnEvent": "{username} har trukket tilbake en hendelse", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "reject": "Avslå", + "@reject": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "{username} avslo invitasjonen", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "rejoin": "Ta del igjen", + "@rejoin": { + "type": "String", + "placeholders": {} + }, + "remove": "Fjern", + "@remove": { + "type": "String", + "placeholders": {} + }, + "removeAllOtherDevices": "Fjern alle andre enheter", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "removedBy": "Fjernet av {username}", + "@removedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "removeDevice": "Fjern enhet", + "@removeDevice": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "Opphev bannlysning", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "renderRichContent": "Tegn rikt meldingsinnhold", + "@renderRichContent": { + "type": "String", + "placeholders": {} + }, + "replaceRoomWithNewerVersion": "Erstatt rom med nyere versjon", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "reply": "Svar", + "@reply": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "Rapporter melding", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "requestPermission": "Forespør tilgang", + "@requestPermission": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "Rommet har blitt oppgradert", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "search": "Søk", + "@search": { + "type": "String", + "placeholders": {} + }, + "security": "Sikkerhet", + "@security": { + "type": "String", + "placeholders": {} + }, + "seenByUser": "Sett av {username}", + "@seenByUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "send": "Send", + "@send": { + "type": "String", + "placeholders": {} + }, + "sendAMessage": "Send en melding", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "sendAudio": "Send lyd", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendFile": "Send fil", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendImage": "Send bilde", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendMessages": "Send meldinger", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "sendOriginal": "Send original", + "@sendOriginal": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "Send video", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "sentAFile": "{username} sendte en fil", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAnAudio": "{username} sendte lyd", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAPicture": "{username} sendte et bilde", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentASticker": "{username} sendte et klistremerke", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "{username} sendte en video", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentCallInformations": "{senderName} sendte anropsinfo", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "setCustomEmotes": "Sett tilpassede smilefjes", + "@setCustomEmotes": { + "type": "String", + "placeholders": {} + }, + "setInvitationLink": "Sett invitasjonslenke", + "@setInvitationLink": { + "type": "String", + "placeholders": {} + }, + "setPermissionsLevel": "Sett tilgangsnivå", + "@setPermissionsLevel": { + "type": "String", + "placeholders": {} + }, + "setStatus": "Angi status", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "settings": "Innstilinger", + "@settings": { + "type": "String", + "placeholders": {} + }, + "share": "Del", + "@share": { + "type": "String", + "placeholders": {} + }, + "sharedTheLocation": "{username} delte posisjonen", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "skip": "Hopp over", + "@skip": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "Kildekode", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "startedACall": "{senderName} startet en samtale", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "status": "Status", + "@status": { + "type": "String", + "placeholders": {} + }, + "statusExampleMessage": "Hvordan har du det i dag?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "submit": "Send inn", + "@submit": { + "type": "String", + "placeholders": {} + }, + "systemTheme": "System", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "Samsvarer ikke", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "Samsvarer", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "title": "FluffyChat", + "@title": { + "description": "Title for the application", + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "For mange forespørsler. Prøv igjen senere!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "transferFromAnotherDevice": "Overfør fra en annen enhet", + "@transferFromAnotherDevice": { + "type": "String", + "placeholders": {} + }, + "tryToSendAgain": "Prøv å sende igjen", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "unavailable": "Utilgjengelig", + "@unavailable": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username} opphevet bannlysning av {targetName}", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "unblockDevice": "Opphev blokkering av enhet", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "Ukjent enhet", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "unknownEncryptionAlgorithm": "Ukjent krypteringsalgoritme", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unknownEvent": "Ukjent hendelse «{type}»", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "unmuteChat": "Opphev forstumming av sludring", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "unpin": "Løsne", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "unreadChats": "{unreadCount, plural, other{{unreadCount} uleste sludringer}}", + "@unreadChats": { + "type": "String", + "placeholders": { + "unreadCount": { + "type": "int" + } + } + }, + "userAndOthersAreTyping": "{username} og {count} andre skriver…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "userAndUserAreTyping": "{username} og {username2} skriver…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userIsTyping": "{username} skriver…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userLeftTheChat": "{username} har forlatt sludringen", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "username": "Brukernavn", + "@username": { + "type": "String", + "placeholders": {} + }, + "userSentUnknownEvent": "{username} sendte en {type}-hendelse", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "verify": "Bekreft", + "@verify": { + "type": "String", + "placeholders": {} + }, + "verifyStart": "Start bekreftelse", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "Du har bekreftet!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "verifyTitle": "Bekrefter annen konto", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "videoCall": "Videosamtale", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "Sludrehistorikkens synlighet", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "Synlig for alle deltagere", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "Synlig for alle", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "Lydmelding", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "Venter på at samtalepartner skal godta tallene …", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "wallpaper": "Bakgrunnsbilde", + "@wallpaper": { + "type": "String", + "placeholders": {} + }, + "warning": "Advarsel!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "weSentYouAnEmail": "Du har fått en e-post", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "whoCanPerformWhichAction": "Hvem kan utføre hvilken handling", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "Hvem tillates å ta del i denne gruppen", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "Hvorfor ønsker du å rapportere dette?", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "Med disse adressene kan du gjenopprette passordet ditt hvis du trenger det.", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "Skriv en melding …", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "yes": "Ja", + "@yes": { + "type": "String", + "placeholders": {} + }, + "you": "Deg", + "@you": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "Du deltar ikke lenger i denne sludringen", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "Du har blitt bannlyst fra denne sludringen", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "yourPublicKey": "Din offentlige nøkkel", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "toggleUnread": "Marker som lest/ulest", + "@toggleUnread": { + "type": "String", + "placeholders": {} + }, + "toggleMuted": "Veksle forstumming", + "@toggleMuted": { + "type": "String", + "placeholders": {} + }, + "toggleFavorite": "Veksle favorittmerking", + "@toggleFavorite": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "Ingen tilkobling til tjeneren", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "addEmail": "Legg til e-post", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "repeatPassword": "Gjenta passord", + "@repeatPassword": {}, + "addToSpace": "Legg til space", + "@addToSpace": {}, + "allChats": "Alle samtaler", + "@allChats": { + "type": "String", + "placeholders": {} + }, + "autoplayImages": "Automatisk spill av animerte stickers og emojis", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "badServerLoginTypesException": "Denne hjemme serveren støtter følgende innloggings-typer:\n{serverVersions}\nMen denne applikasjonen støtter kun:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "sendOnEnter": "Trykk på enter for å sende", + "@sendOnEnter": {}, + "badServerVersionsException": "Denne hjemme serveren støtter følgene Spec-versjoner:\n{serverVersions}\nMen denne applikasjonen støtter kun {supportedVersions}", + "@badServerVersionsException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "blocked": "Blokkert", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "cantOpenUri": "Kan ikke åpne URI {uri}", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "changeYourAvatar": "Bytt profilbilde", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "notAnImage": "Ikke en bildefil.", + "@notAnImage": {} +} diff --git a/assets/l10n/intl_nl.arb b/assets/l10n/intl_nl.arb new file mode 100644 index 0000000..0706f6d --- /dev/null +++ b/assets/l10n/intl_nl.arb @@ -0,0 +1,3344 @@ +{ + "@@last_modified": "2021-08-14 12:41:09.955292", + "about": "Over ons", + "@about": { + "type": "String", + "placeholders": {} + }, + "accept": "Accepteren", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 {username} heeft de uitnodiging geaccepteerd", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "Account", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐 {username} heeft eind-tot-eindversleuteling geactiveerd", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "addEmail": "Email toevoegen", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "addToSpace": "Aan space toevoegen", + "@addToSpace": {}, + "admin": "Beheerder", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "alias", + "@alias": { + "type": "String", + "placeholders": {} + }, + "all": "Alle", + "@all": { + "type": "String", + "placeholders": {} + }, + "allChats": "Alle chats", + "@allChats": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "{senderName} heeft de oproep beantwoord", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "Iedereen kan toetreden", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "appLock": "App-vergrendeling", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "archive": "Archief", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "Mogen gasten deelnemen", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "Weet je het zeker?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "areYouSureYouWantToLogout": "Weet je zeker dat je wilt uitloggen?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "Voer je beveiligde opslag wachtwoordzin of herstelsleutel in om de andere persoon te kunnen ondertekenen.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "Accepteer je dit verificatieverzoek van {username}?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "autoplayImages": "Automatisch geanimeerde stickers en emoticons afspelen", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "badServerLoginTypesException": "De homeserver ondersteunt de login types:\n{serverVersions}\nMaar deze app ondersteunt alleen:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "badServerVersionsException": "De homeserver ondersteunt de Spec-versies:\n{serverVersions}\nMaar deze app ondersteunt alleen {supportedVersions}", + "@badServerVersionsException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "banFromChat": "Van chat verbannen", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "Verbannen", + "@banned": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username} verbant {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "Apparaat blokkeren", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "blocked": "Geblokkeerd", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "botMessages": "Bot-berichten", + "@botMessages": { + "type": "String", + "placeholders": {} + }, + "cancel": "Annuleren", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "cantOpenUri": "Kan de URI {uri} niet openen", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "changeDeviceName": "Apparaatnaam wijzigen", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "{username} heeft de chatavatar gewijzigd", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatDescriptionTo": "{username} heeft de chatomschrijving gewijzigd in: '{description}'", + "@changedTheChatDescriptionTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "description": { + "type": "String" + } + } + }, + "changedTheChatNameTo": "{username} heeft de chatnaam gewijzigd in: '{chatname}'", + "@changedTheChatNameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "chatname": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username} heeft de chatrechten gewijzigd", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username}'s naam is nu '{displayname}'", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} heeft de toegangsregels voor gasten gewijzigd", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} heeft de gastenregels gewijzigd in: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username} heeft de zichtbaarheid van de geschiedenis gewijzigd", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username} heeft de zichtbaarheid van de geschiedenis gewijzigd in: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username} heeft de toetredingsregels gewijzigd", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} heeft de toetredingsregels gewijzigd in: {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username}'s avatar is gewijzigd", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "{username} heeft de kameraliassen gewijzigd", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username} heeft de uitnodigingslink gewijzigd", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changePassword": "Wachtwoord wijzigen", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "Homeserver wijzigen", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "Je stijl veranderen", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "Groepsnaam wijzigen", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "changeYourAvatar": "Jouw avatar veranderen", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "De versleuteling is beschadigd", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "chat": "Chat", + "@chat": { + "type": "String", + "placeholders": {} + }, + "chatBackup": "Chatback-up", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "chatBackupDescription": "Je oude berichten zijn beveiligd met een herstelsleutel. Zorg ervoor dat je deze niet verliest.", + "@chatBackupDescription": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Chatdetails", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chatHasBeenAddedToThisSpace": "Chat is toegevoegd aan deze space", + "@chatHasBeenAddedToThisSpace": {}, + "chats": "Chats", + "@chats": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "Kies een sterk wachtwoord", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "clearArchive": "Archief wissen", + "@clearArchive": {}, + "close": "Sluiten", + "@close": { + "type": "String", + "placeholders": {} + }, + "commandHint_ban": "Persoon uit deze kamer verbannen", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_html": "Tekst met HTML-opmaak versturen", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_invite": "Persoon in deze kamer uitnodigen", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "commandHint_join": "Toetreden tot de vermelde kamer", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_kick": "Persoon uit deze kamer verwijderen", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_leave": "Deze kamer verlaten", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_me": "Beschrijf jezelf", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "commandHint_myroomavatar": "Jouw avatar voor deze kamer instellen (met mxc-uri)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_myroomnick": "Jouw naam voor deze kamer instellen", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "commandHint_op": "Machtsniveau van de persoon instellen (standaard: 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_plain": "Niet-opgemaakte tekst versturen", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_react": "Antwoord als reactie versturen", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "commandHint_send": "Tekst versturen", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "commandHint_unban": "Persoon weer in deze kamer toestaan", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "commandInvalid": "Opdracht ongeldig", + "@commandInvalid": { + "type": "String" + }, + "commandMissing": "{command} is geen opdracht.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "compareEmojiMatch": "Vergelijk de emoji's", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "Vergelijk de cijfers", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "configureChat": "Chat configureren", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "confirm": "Bevestigen", + "@confirm": { + "type": "String", + "placeholders": {} + }, + "connect": "Verbinden", + "@connect": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "Contact is voor de groep uitgenodigd", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "containsDisplayName": "Bevat naam", + "@containsDisplayName": { + "type": "String", + "placeholders": {} + }, + "containsUserName": "Bevat inlognaam", + "@containsUserName": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "De inhoud is gerapporteerd aan de serverbeheerders", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "Gekopieerd naar klembord", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "Bericht kopiëren", + "@copy": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "Kopieer naar klembord", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "Kan het bericht niet ontsleutelen: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "countParticipants": "{count} personen", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "create": "Aanmaken", + "@create": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "💬 {username} heeft de chat gemaakt", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "createNewSpace": "Maak nieuwe space aan", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "currentlyActive": "Momenteel actief", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "Donker", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "dateWithoutYear": "{day}-{month}", + "@dateWithoutYear": { + "type": "String", + "placeholders": { + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "dateWithYear": "{day}-{month}-{year}", + "@dateWithYear": { + "type": "String", + "placeholders": { + "year": { + "type": "String" + }, + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "deactivateAccountWarning": "Hierdoor wordt je account gedeactiveerd. Dit kan niet ongedaan gemaakt worden! Weet je het zeker?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "Standaard machtigingsniveau voor nieuwe personen", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "delete": "Verwijderen", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "Account verwijderen", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "Bericht verwijderen", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "device": "Apparaat", + "@device": { + "type": "String", + "placeholders": {} + }, + "deviceId": "Apparaat-ID", + "@deviceId": { + "type": "String", + "placeholders": {} + }, + "devices": "Apparaten", + "@devices": { + "type": "String", + "placeholders": {} + }, + "directChats": "Directe chats", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "De naam is gewijzigd", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "Bestand downloaden", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "edit": "Wijzig", + "@edit": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "Geblokkeerde servers wijzigen", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "editDisplayname": "Naam wijzigen", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "editRoomAliases": "Kameraliassen wijzigen", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "Kameravatar wijzigen", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "Emoticon bestaat al!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "Ongeldige emoticon korte code!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emotePacks": "Emoticonpakketten voor de kamer", + "@emotePacks": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "Emoticon-instellingen", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "emoteShortcode": "Emoticon korte code", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emoteWarnNeedToPick": "Je moet een emoticon korte code en afbeelding kiezen!", + "@emoteWarnNeedToPick": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "Lege chat", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "Emoticonpakket overal inschakelen", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "Versleuteling inschakelen", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "Je kunt de versleuteling hierna niet meer uitschakelen. Weet je het zeker?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "encrypted": "Versleuteld", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "encryption": "Versleuteling", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "Versleuteling is niet ingeschakeld", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName} heeft het gesprek beëindigd", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "enterAnEmailAddress": "Voer een email in", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "enterYourHomeserver": "Vul je homeserver in", + "@enterYourHomeserver": { + "type": "String", + "placeholders": {} + }, + "errorObtainingLocation": "Locatie ophalen fout: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "everythingReady": "Alles klaar!", + "@everythingReady": { + "type": "String", + "placeholders": {} + }, + "extremeOffensive": "Extreem beledigend", + "@extremeOffensive": { + "type": "String", + "placeholders": {} + }, + "fileName": "Bestandsnaam", + "@fileName": { + "type": "String", + "placeholders": {} + }, + "fluffychat": "FluffyChat", + "@fluffychat": { + "type": "String", + "placeholders": {} + }, + "fontSize": "Lettergrootte", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "forward": "Stuur door", + "@forward": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "Vanaf toetreden", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "Vanaf uitnodiging", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "goToTheNewRoom": "Ga naar de nieuwe kamer", + "@goToTheNewRoom": { + "type": "String", + "placeholders": {} + }, + "group": "Groep", + "@group": { + "type": "String", + "placeholders": {} + }, + "groupIsPublic": "Groep is openbaar", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "groups": "Groepen", + "@groups": { + "type": "String", + "placeholders": {} + }, + "groupWith": "Groep met {displayname}", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "guestsAreForbidden": "Gasten zijn verboden", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "Gasten kunnen deelnemen", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{username} heeft de uitnodiging voor {targetName} ingetrokken", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "help": "Help", + "@help": { + "type": "String", + "placeholders": {} + }, + "hideRedactedEvents": "Bewerkte gebeurtenissen verbergen", + "@hideRedactedEvents": { + "type": "String", + "placeholders": {} + }, + "hideUnknownEvents": "Onbekende gebeurtenissen verbergen", + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "howOffensiveIsThisContent": "Hoe beledigend is deze inhoud?", + "@howOffensiveIsThisContent": { + "type": "String", + "placeholders": {} + }, + "id": "ID", + "@id": { + "type": "String", + "placeholders": {} + }, + "identity": "Identiteit", + "@identity": { + "type": "String", + "placeholders": {} + }, + "ignore": "Negeer", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "ignoredUsers": "Genegeerde personen", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "iHaveClickedOnLink": "Ik heb op de link geklikt", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "Onjuiste wachtwoordzin of herstelsleutel", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "inoffensive": "Niet beledigend", + "@inoffensive": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "Contact uitnodigen", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "Contact voor {groupName} uitnodigen", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "invited": "Uitgenodigd", + "@invited": { + "type": "String", + "placeholders": {} + }, + "invitedUser": "📩 {username} heeft {targetName} uitgenodigd", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "invitedUsersOnly": "Alleen uitgenodigde personen", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "inviteForMe": "Persoonlijke uitnodiging", + "@inviteForMe": { + "type": "String", + "placeholders": {} + }, + "inviteText": "{username} heeft je uitgenodigd voor FluffyChat.\n1. Bezoek https://fluffychat.im en installeer de app\n2. Registreer of log in\n3. Open deze uitnodigingslink:\n{link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "isTyping": "is aan het typen…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "👋 {username} is toegetreden tot de chat", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "joinRoom": "Toetreden tot de kamer", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "kicked": "👞 {username} heeft {targetName} verwijderd", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickedAndBanned": "🙅 {username} heeft {targetName} verwijderd en verbannen", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickFromChat": "Uit chat verwijderen", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "Laatst actief: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "leave": "Chat verlaten", + "@leave": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "Verliet de chat", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "license": "Licentie", + "@license": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "Licht", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "Laad nog {count} personen", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "loadingPleaseWait": "Bezig met laden… Even geduld.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "loadMore": "Meer laden…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "locationDisabledNotice": "Locatievoorzieningen is uitgeschakeld. Zet dit eerst aan om je locatie te delen.", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "locationPermissionDeniedNotice": "Locatievoorzieningen is geweigerd. Zet hem aan om locatie delen te gebruiken.", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "login": "Inloggen", + "@login": { + "type": "String", + "placeholders": {} + }, + "logInTo": "Inloggen bij {homeserver}", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "logout": "Uitloggen", + "@logout": { + "type": "String", + "placeholders": {} + }, + "memberChanges": "Persoon wijzigingen", + "@memberChanges": { + "type": "String", + "placeholders": {} + }, + "mention": "Vermeld", + "@mention": { + "type": "String", + "placeholders": {} + }, + "messages": "Berichten", + "@messages": { + "type": "String", + "placeholders": {} + }, + "moderator": "Moderator", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "muteChat": "Meldingen uitschakelen", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "needPantalaimonWarning": "Houd er rekening mee dat je voorlopig Pantalaimon nodig hebt om eind-tot-eindversleuteling te gebruiken.", + "@needPantalaimonWarning": { + "type": "String", + "placeholders": {} + }, + "newChat": "Nieuwe chat", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "💬 Nieuw bericht in FluffyChat", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "Nieuw verificatieverzoek!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "next": "Volgende", + "@next": { + "type": "String", + "placeholders": {} + }, + "no": "Nee", + "@no": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "Geen verbinding met de server", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "Geen emoticons gevonden. 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "Je kunt de versleuteling pas activeren zodra de kamer niet meer openbaar toegankelijk is.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "Firebase Cloud Messaging lijkt niet beschikbaar op je apparaat. Om nog steeds pushmeldingen te krijgen, adviseren we om ntfy te installeren. Met ntfy of een andere Unified Push provider kun je pushmeldingen ontvangen op een veilige manier. Je kunt ntfy downloaden van de PlayStore of van F-Droid.", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "noMatrixServer": "{server1} is geen Matrix-server, wil je {server2} gebruiken?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "none": "Geen", + "@none": { + "type": "String", + "placeholders": {} + }, + "noPasswordRecoveryDescription": "Je hebt nog geen manier toegevoegd om je wachtwoord te herstellen.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "noPermission": "Geen toestemming", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "Geen kamers gevonden …", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "notifications": "Meldingen", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "notificationsEnabledForThisAccount": "Meldingen ingeschakeld voor dit account", + "@notificationsEnabledForThisAccount": { + "type": "String", + "placeholders": {} + }, + "numUsersTyping": "{count} personen typen…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "obtainingLocation": "Locatie ophalen…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "offensive": "Beledigend", + "@offensive": { + "type": "String", + "placeholders": {} + }, + "offline": "Offline", + "@offline": { + "type": "String", + "placeholders": {} + }, + "ok": "OK", + "@ok": { + "type": "String", + "placeholders": {} + }, + "online": "Online", + "@online": { + "type": "String", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "Online sleutelback-up is ingeschakeld", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "oopsPushError": "Oeps! Helaas is er een fout opgetreden bij het instellen van de pushmeldingen.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "Oeps, er ging iets mis…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "Open app om de berichten te lezen", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "openCamera": "Camera openen", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "openInMaps": "In kaarten openen", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "or": "Of", + "@or": { + "type": "String", + "placeholders": {} + }, + "participant": "Personen", + "@participant": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "wachtwoordzin of herstelsleutel", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "password": "Wachtwoord", + "@password": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "Wachtwoord vergeten", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "Wachtwoord gewijzigd", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "passwordRecovery": "Wachtwoordherstel", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "people": "Personen", + "@people": { + "type": "String", + "placeholders": {} + }, + "pickImage": "Kies een afbeelding", + "@pickImage": { + "type": "String", + "placeholders": {} + }, + "pin": "Pin", + "@pin": { + "type": "String", + "placeholders": {} + }, + "play": "Speel {fileName}", + "@play": { + "type": "String", + "placeholders": { + "fileName": { + "type": "String" + } + } + }, + "pleaseChoose": "Maak een keuze", + "@pleaseChoose": { + "type": "String", + "placeholders": {} + }, + "pleaseChooseAPasscode": "Kies een toegangscode", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "pleaseClickOnLink": "Klik op de link in de email en ga dan verder.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "pleaseEnter4Digits": "Voer 4 cijfers in of laat leeg om app-vergrendeling uit te schakelen.", + "@pleaseEnter4Digits": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPassword": "Voer jouw wachtwoord in", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPin": "Voer je pincode in", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "Voer je inlognaam in", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "Volg de instructies op de website en tik op volgende.", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "privacy": "Privacy", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "Openbare kamers", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "pushRules": "Meldingsinstellingen", + "@pushRules": { + "type": "String", + "placeholders": {} + }, + "reason": "Reden", + "@reason": { + "type": "String", + "placeholders": {} + }, + "recording": "Opnemen", + "@recording": { + "type": "String", + "placeholders": {} + }, + "redactedAnEvent": "{username} heeft een event verwijderd", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "redactMessage": "Aangepast bericht", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "register": "Registeren", + "@register": { + "type": "String", + "placeholders": {} + }, + "reject": "Afwijzen", + "@reject": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "{username} heeft de uitnodiging afgewezen", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "rejoin": "Opnieuw deelnemen", + "@rejoin": { + "type": "String", + "placeholders": {} + }, + "remove": "Verwijder", + "@remove": { + "type": "String", + "placeholders": {} + }, + "removeAllOtherDevices": "Verwijder alle andere apparaten", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "removedBy": "Verwijderd door {username}", + "@removedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "removeDevice": "Verwijder apparaat", + "@removeDevice": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "Verbanning opheffen", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "removeYourAvatar": "Jouw avatar verwijderen", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "renderRichContent": "Uitgebreide berichtinhoud weergeven", + "@renderRichContent": { + "type": "String", + "placeholders": {} + }, + "replaceRoomWithNewerVersion": "Kamerversie upgraden", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "reply": "Antwoord", + "@reply": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "Bericht rapporteren", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "requestPermission": "Vraag toestemming", + "@requestPermission": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "Kamer is geüpgrade", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "Kamerversie", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "saveFile": "Bestand opslaan", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "search": "Zoeken", + "@search": { + "type": "String", + "placeholders": {} + }, + "security": "Beveiliging", + "@security": { + "type": "String", + "placeholders": {} + }, + "seenByUser": "Gezien door {username}", + "@seenByUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "send": "Verstuur", + "@send": { + "type": "String", + "placeholders": {} + }, + "sendAMessage": "Stuur een bericht", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "sendAsText": "Als tekst versturen", + "@sendAsText": { + "type": "String" + }, + "sendAudio": "Audio versturen", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendFile": "Bestand versturen", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendImage": "Afbeelding versturen", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendMessages": "Berichten versturen", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "sendOriginal": "Origineel versturen", + "@sendOriginal": { + "type": "String", + "placeholders": {} + }, + "sendSticker": "Sticker versturen", + "@sendSticker": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "Video versturen", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "sentAFile": "📁 {username} heeft een bestand verzonden", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAnAudio": "🎤 {username} heeft een audio verzonden", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAPicture": "🖼️ {username} heeft een afbeelding verzonden", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentASticker": "😊 {username} heeft een sticker verzonden", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "🎥 {username} heeft een video verzonden", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentCallInformations": "{senderName} heeft oproepgegevens verzonden", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "setAsCanonicalAlias": "Als hoofdalias instellen", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "setCustomEmotes": "Aangepaste emoticons instellen", + "@setCustomEmotes": { + "type": "String", + "placeholders": {} + }, + "setInvitationLink": "Uitnodigingslink instellen", + "@setInvitationLink": { + "type": "String", + "placeholders": {} + }, + "setPermissionsLevel": "Machtigingsniveau instellen", + "@setPermissionsLevel": { + "type": "String", + "placeholders": {} + }, + "setStatus": "Status instellen", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "settings": "Instellingen", + "@settings": { + "type": "String", + "placeholders": {} + }, + "share": "Delen", + "@share": { + "type": "String", + "placeholders": {} + }, + "sharedTheLocation": "{username} heeft deze locatie gedeeld", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "shareLocation": "Locatie delen", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "showPassword": "Wachtwoord weergeven", + "@showPassword": { + "type": "String", + "placeholders": {} + }, + "singlesignon": "Eenmalig Inloggen", + "@singlesignon": { + "type": "String", + "placeholders": {} + }, + "skip": "Overslaan", + "@skip": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "Broncode", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "spaceIsPublic": "Space is openbaar", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "spaceName": "Spacenaam", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "startedACall": "{senderName} heeft een gesprek gestart", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "status": "Status", + "@status": { + "type": "String", + "placeholders": {} + }, + "statusExampleMessage": "Hoe gaat het met jouw vandaag?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "submit": "Indienen", + "@submit": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWait": "Synchroniseren... Even geduld.", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "systemTheme": "Systeem", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "Ze komen niet overeen", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "Ze komen overeen", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "title": "FluffyChat", + "@title": { + "description": "Title for the application", + "type": "String", + "placeholders": {} + }, + "toggleFavorite": "Favoriet in- of uitschakelen", + "@toggleFavorite": { + "type": "String", + "placeholders": {} + }, + "toggleMuted": "Meldingen in- of uitschakelen", + "@toggleMuted": { + "type": "String", + "placeholders": {} + }, + "toggleUnread": "Markeer gelezen/ongelezen", + "@toggleUnread": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "Te veel verzoeken. Probeer het later nog eens!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "transferFromAnotherDevice": "Overzetten vanaf een ander apparaat", + "@transferFromAnotherDevice": { + "type": "String", + "placeholders": {} + }, + "tryToSendAgain": "Probeer nogmaals te verzenden", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "unavailable": "Niet beschikbaar", + "@unavailable": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username} heeft verbanning {targetName} ongedaan gemaakt", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "unblockDevice": "Deblokkeer apparaat", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "Onbekend apparaat", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "unknownEncryptionAlgorithm": "Onbekend versleutelingsalgoritme", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unknownEvent": "Onbekend evenement '{type}'", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "unmuteChat": "Meldingen inschakelen", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "unpin": "Losmaken", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "unreadChats": "{unreadCount, plural, =1{1 ongelezen chat} other{{unreadCount} ongelezen chats}}", + "@unreadChats": { + "type": "String", + "placeholders": { + "unreadCount": { + "type": "int" + } + } + }, + "userAndOthersAreTyping": "{username} en {count} anderen zijn aan het typen …", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "userAndUserAreTyping": "{username} en {username2} zijn aan het typen …", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userIsTyping": "{username} is aan het typen …", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userLeftTheChat": "🚪 {username} is vertrokken uit de chat", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "username": "Inlognaam", + "@username": { + "type": "String", + "placeholders": {} + }, + "userSentUnknownEvent": "{username} heeft een {type} -gebeurtenis gestuurd", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "verified": "Geverifieerd", + "@verified": { + "type": "String", + "placeholders": {} + }, + "verify": "Verifieer", + "@verify": { + "type": "String", + "placeholders": {} + }, + "verifyStart": "Verificatie starten", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "Je bent succesvol geverifieerd!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "verifyTitle": "Ander account verifiëren", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "videoCall": "Videogesprek", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "Chatgeschiedenis zichtbaarheid", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "Zichtbaar voor alle personen", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "Zichtbaar voor iedereen", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "Spraakbericht versturen", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "Wachten tot partner het verzoek accepteert …", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "Wachten tot je partner de emoji accepteert…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "Wachten tot partner de nummers accepteert …", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "wallpaper": "Achtergrond:", + "@wallpaper": { + "type": "String", + "placeholders": {} + }, + "warning": "Waarschuwing!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "weSentYouAnEmail": "We hebben je een email gestuurd", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "whoCanPerformWhichAction": "Wie kan welke actie uitvoeren", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "Wie mag deelnemen aan deze groep", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "Waarom wil je dit rapporteren?", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "wipeChatBackup": "Wil je de chatback-up wissen om een nieuwe herstelsleutel te kunnen maken?", + "@wipeChatBackup": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "Met deze adressen kun je je wachtwoord herstellen.", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "Schrijf een bericht…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "yes": "Ja", + "@yes": { + "type": "String", + "placeholders": {} + }, + "you": "Jij", + "@you": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "Je neemt niet langer deel aan deze chat", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "Je bent verbannen uit deze chat", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "yourPublicKey": "Je publieke sleutel", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "scanQrCode": "QR-code scannen", + "@scanQrCode": {}, + "sendOnEnter": "Verstuur met enter", + "@sendOnEnter": {}, + "homeserver": "Server", + "@homeserver": {}, + "serverRequiresEmail": "Deze server wil je email laten bevestigen bij de registratie.", + "@serverRequiresEmail": {}, + "oneClientLoggedOut": "Één van jouw apparaten is uitgelogd", + "@oneClientLoggedOut": {}, + "enableMultiAccounts": "(BETA) Multi-accounts inschakelen op dit apparaat", + "@enableMultiAccounts": {}, + "bundleName": "Bundelnaam", + "@bundleName": {}, + "removeFromBundle": "Van bundel verwijderen", + "@removeFromBundle": {}, + "addToBundle": "Aan bundel toevoegen", + "@addToBundle": {}, + "editBundlesForAccount": "Bundels voor dit account wijzigen", + "@editBundlesForAccount": {}, + "addAccount": "Account toevoegen", + "@addAccount": {}, + "link": "Link", + "@link": {}, + "yourChatBackupHasBeenSetUp": "Jouw chatback-up is ingesteld.", + "@yourChatBackupHasBeenSetUp": {}, + "unverified": "Niet geverifieerd", + "@unverified": {}, + "repeatPassword": "Wachtwoord herhalen", + "@repeatPassword": {}, + "messageInfo": "Berichtinfo", + "@messageInfo": {}, + "time": "Tijd", + "@time": {}, + "messageType": "Berichttype", + "@messageType": {}, + "sender": "Afzender", + "@sender": {}, + "openGallery": "Galerij openen", + "@openGallery": {}, + "addToSpaceDescription": "Selecteer een space om deze chat aan toe te voegen.", + "@addToSpaceDescription": {}, + "removeFromSpace": "Uit de space verwijderen", + "@removeFromSpace": {}, + "start": "Start", + "@start": {}, + "commandHint_clearcache": "Cache wissen", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_create": "Maak een lege groepschat\nGebruik --no-encryption om de versleuteling uit te schakelen", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "commandHint_dm": "Start een directe chat\nGebruik --no-encryption om de versleuteling uit te schakelen", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "commandHint_discardsession": "Sessie weggooien", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "openVideoCamera": "Videocamera openen", + "@openVideoCamera": { + "type": "String", + "placeholders": {} + }, + "videoWithSize": "Video ({size})", + "@videoWithSize": { + "type": "String", + "placeholders": { + "size": { + "type": "String" + } + } + }, + "publish": "Publiceren", + "@publish": {}, + "dismiss": "Sluiten", + "@dismiss": {}, + "markAsRead": "Markeer als gelezen", + "@markAsRead": {}, + "reportUser": "Persoon rapporteren", + "@reportUser": {}, + "openChat": "Chat openen", + "@openChat": {}, + "reactedWith": "{sender} reageerde met {reaction}", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "pinMessage": "Maak vast aan kamer", + "@pinMessage": {}, + "emojis": "Emoji's", + "@emojis": {}, + "placeCall": "Bellen", + "@placeCall": {}, + "unsupportedAndroidVersion": "Niet-ondersteunde Android-versie", + "@unsupportedAndroidVersion": {}, + "unsupportedAndroidVersionLong": "Voor deze functie is een nieuwere Android-versie vereist. Controleer op updates of Lineage OS-ondersteuning.", + "@unsupportedAndroidVersionLong": {}, + "videoCallsBetaWarning": "Houd er rekening mee dat videogesprekken momenteel in bèta zijn. Ze werken misschien niet zoals je verwacht of werken niet op alle platformen.", + "@videoCallsBetaWarning": {}, + "voiceCall": "Spraakoproep", + "@voiceCall": {}, + "confirmEventUnpin": "Weet je zeker dat je de gebeurtenis definitief wilt losmaken?", + "@confirmEventUnpin": {}, + "experimentalVideoCalls": "Videogesprekken (experimenteel)", + "@experimentalVideoCalls": {}, + "emailOrUsername": "Email of inlognaam", + "@emailOrUsername": {}, + "nextAccount": "Volgende account", + "@nextAccount": {}, + "switchToAccount": "Naar account {number} overschakelen", + "@switchToAccount": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "previousAccount": "Vorige account", + "@previousAccount": {}, + "widgetCustom": "Aangepast", + "@widgetCustom": {}, + "widgetName": "Naam", + "@widgetName": {}, + "widgetUrlError": "Dit is geen geldige link.", + "@widgetUrlError": {}, + "widgetNameError": "Geef een naam op.", + "@widgetNameError": {}, + "errorAddingWidget": "Fout bij het toevoegen van de widget.", + "@errorAddingWidget": {}, + "widgetJitsi": "Jitsi Meet", + "@widgetJitsi": {}, + "addWidget": "Widget toevoegen", + "@addWidget": {}, + "widgetVideo": "Video", + "@widgetVideo": {}, + "widgetEtherpad": "Tekstnotitie", + "@widgetEtherpad": {}, + "separateChatTypes": "Directe chats en groepen los weergeven", + "@separateChatTypes": { + "type": "String", + "placeholders": {} + }, + "youAcceptedTheInvitation": "👍 Je hebt de uitnodiging geaccepteerd", + "@youAcceptedTheInvitation": {}, + "youRejectedTheInvitation": "Je hebt de uitnodiging afgewezen", + "@youRejectedTheInvitation": {}, + "youJoinedTheChat": "Je bent toegetreden tot de chat", + "@youJoinedTheChat": {}, + "youBannedUser": "Je hebt {user} verbannen", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youHaveWithdrawnTheInvitationFor": "Je hebt de uitnodiging voor {user} ingetrokken", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedBy": "📩 Je bent uitgenodigd door {user}", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedUser": "📩 Je hebt {user} uitgenodigd", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKicked": "👞 Je hebt {user} weggestuurd", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKickedAndBanned": "🙅 Je hebt weggestuurd en verbannen {user}", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youUnbannedUser": "Je hebt de ban op {user} opgeheven", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "recoveryKey": "Herstelsleutel", + "@recoveryKey": {}, + "recoveryKeyLost": "Herstelsleutel verloren?", + "@recoveryKeyLost": {}, + "pleaseEnterRecoveryKey": "Voer jouw herstelsleutel in:", + "@pleaseEnterRecoveryKey": {}, + "users": "Personen", + "@users": {}, + "unlockOldMessages": "Oude berichten ontgrendelen", + "@unlockOldMessages": {}, + "storeInAndroidKeystore": "In Android KeyStore opslaan", + "@storeInAndroidKeystore": {}, + "storeInAppleKeyChain": "In Apple KeyChain opslaan", + "@storeInAppleKeyChain": {}, + "saveKeyManuallyDescription": "Sla deze sleutel handmatig op via delen of het klembord.", + "@saveKeyManuallyDescription": {}, + "pleaseEnterRecoveryKeyDescription": "Om je oude berichten te ontgrendelen voer je jouw herstelsleutel in die gemaakt is in je vorige sessie. Je sleutel is niet je wachtwoord.", + "@pleaseEnterRecoveryKeyDescription": {}, + "storeInSecureStorageDescription": "Sla de herstelsleutel op in de beveiligde opslag van dit apparaat.", + "@storeInSecureStorageDescription": {}, + "storeSecurlyOnThisDevice": "Veilig opslaan op dit apparaat", + "@storeSecurlyOnThisDevice": {}, + "dehydrate": "Sessie exporteren en apparaat wissen", + "@dehydrate": {}, + "dehydrateWarning": "Deze actie kan niet ongedaan worden gemaakt. Zorg ervoor dat je het back-upbestand veilig opslaat.", + "@dehydrateWarning": {}, + "dehydrateTor": "TOR-sessies: Exporteer sessie", + "@dehydrateTor": {}, + "dehydrateTorLong": "Voor TOR-sessies is het aanbevolen de sessie te exporteren alvorens het venster te sluiten.", + "@dehydrateTorLong": {}, + "hydrateTor": "TOR-sessie: Importeren sessie export", + "@hydrateTor": {}, + "hydrateTorLong": "Heb je de vorige keer jouw sessie geëxporteerd met TOR? Importeer het dan snel en ga verder met chatten.", + "@hydrateTorLong": {}, + "hydrate": "Herstellen vanuit back-upbestand", + "@hydrate": {}, + "indexedDbErrorTitle": "Problemen met privémodus", + "@indexedDbErrorTitle": {}, + "indexedDbErrorLong": "Het opslaan van berichten is helaas niet standaard ingeschakeld in de privémodus.\nBezoek alsjeblieft\n - about:config\n - stel dom.indexedDB.privateBrowsing.enabled in op true\nAnders is het niet mogelijk om FluffyChat op te starten.", + "@indexedDbErrorLong": {}, + "countFiles": "{count} bestanden", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "user": "Persoon", + "@user": {}, + "custom": "Aangepast", + "@custom": {}, + "confirmMatrixId": "Bevestig jouw Matrix-ID om je account te verwijderen.", + "@confirmMatrixId": {}, + "supposedMxid": "Dit moet {mxid} zijn", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "commandHint_markasdm": "Markeer als privéberichtenkamer voor Matrix ID", + "@commandHint_markasdm": {}, + "commandHint_markasgroup": "Markeer als groep", + "@commandHint_markasgroup": {}, + "whyIsThisMessageEncrypted": "Waarom is dit bericht onleesbaar?", + "@whyIsThisMessageEncrypted": {}, + "noKeyForThisMessage": "Dit kan gebeuren als het bericht is verzonden voordat je bij je account op dit apparaat hebt aangemeld.\n\nHet is ook mogelijk dat de afzender je apparaat heeft geblokkeerd of dat er iets mis is gegaan met de internetverbinding.\n\nKan je het bericht wel lezen op een andere sessie? Dan kan je het bericht daarvandaan overzetten! Ga naar Instellingen > Apparaten en zorg ervoor dat je apparaten elkaar hebben geverifieerd. Wanneer je de kamer de volgende keer opent en beide sessies op de voorgrond staan, zullen de sleutels automatisch worden verzonden.\n\nWil je de sleutels niet verliezen als je uitlogt of van apparaat wisselt? Zorg er dan voor dat je de chatback-up hebt aangezet in de instellingen.", + "@noKeyForThisMessage": {}, + "enterSpace": "Space betreden", + "@enterSpace": {}, + "allSpaces": "Alle spaces", + "@allSpaces": {}, + "foregroundServiceRunning": "Deze melding verschijnt wanneer de voorgronddienst draait.", + "@foregroundServiceRunning": {}, + "screenSharingTitle": "scherm delen", + "@screenSharingTitle": {}, + "screenSharingDetail": "Je deelt je scherm in FuffyChat", + "@screenSharingDetail": {}, + "callingPermissions": "Telefoon-rechten", + "@callingPermissions": {}, + "callingAccount": "Telefoon-account", + "@callingAccount": {}, + "callingAccountDetails": "Hiermee kan FluffyChat de Android telefoon-app gebruiken.", + "@callingAccountDetails": {}, + "appearOnTop": "Bovenaan verschijnen", + "@appearOnTop": {}, + "appearOnTopDetails": "Laat de app bovenaan verschijnen (niet nodig als je FluffyChat al hebt ingesteld als een belaccount)", + "@appearOnTopDetails": {}, + "otherCallingPermissions": "Microfoon, camera en andere FluffyChat-rechten", + "@otherCallingPermissions": {}, + "newGroup": "Nieuwe groep", + "@newGroup": {}, + "newSpace": "Space aanmaken", + "@newSpace": {}, + "enterRoom": "Kamer betreden", + "@enterRoom": {}, + "numChats": "{number} chats", + "@numChats": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "hideUnimportantStateEvents": "Onbelangrijke statusgebeurtenissen verbergen", + "@hideUnimportantStateEvents": {}, + "doNotShowAgain": "Niet meer tonen", + "@doNotShowAgain": {}, + "googlyEyesContent": "{senderName} stuurt je wiebelogen", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "commandHint_googly": "Wiebel-ogen versturen", + "@commandHint_googly": {}, + "commandHint_cuddle": "Een knuffel versturen", + "@commandHint_cuddle": {}, + "commandHint_hug": "Een knuffel versturen", + "@commandHint_hug": {}, + "cuddleContent": "{senderName} knuffelt je", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "hugContent": "{senderName} omhelst je", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "wasDirectChatDisplayName": "Lege chat (was {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "disableEncryptionWarning": "Om veiligheidsredenen kun je versleuteling niet uitschakelen in een chat, waar deze eerder is ingeschakeld.", + "@disableEncryptionWarning": {}, + "sorryThatsNotPossible": "Sorry, dat is niet mogelijk", + "@sorryThatsNotPossible": {}, + "reopenChat": "Chat heropenen", + "@reopenChat": {}, + "encryptThisChat": "Versleutel deze chat", + "@encryptThisChat": {}, + "deviceKeys": "Apparaatsleutels:", + "@deviceKeys": {}, + "startFirstChat": "Begin je eerste chat", + "@startFirstChat": {}, + "newSpaceDescription": "Met spaces kun je je chats samenvoegen en privé- of openbare community's bouwen.", + "@newSpaceDescription": {}, + "noOtherDevicesFound": "Geen andere apparaten gevonden", + "@noOtherDevicesFound": {}, + "noBackupWarning": "Waarschuwing! Zonder de chatback-up in te schakelen, verlies je de toegang tot je versleutelde berichten. Het is sterk aanbevolen om eerst de chatback-up in te schakelen voordat je uitlogt.", + "@noBackupWarning": {}, + "fileIsTooBigForServer": "Kan niet verzenden! De server ondersteunt alleen bijlages tot {max}.", + "@fileIsTooBigForServer": {}, + "fileHasBeenSavedAt": "Het bestand is opgeslagen op {path}", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "jumpToLastReadMessage": "Spring naar het laatst gelezen bericht", + "@jumpToLastReadMessage": {}, + "readUpToHere": "Lees tot hier", + "@readUpToHere": {}, + "jump": "Spring", + "@jump": {}, + "openLinkInBrowser": "Link in browser openen", + "@openLinkInBrowser": {}, + "allRooms": "Alle groepschats", + "@allRooms": { + "type": "String", + "placeholders": {} + }, + "signInWith": "Aanmelden met {provider}", + "@signInWith": { + "type": "String", + "placeholders": { + "provider": { + "type": "String" + } + } + }, + "notAnImage": "Geen afbeeldingsbestand.", + "@notAnImage": {}, + "importNow": "Nu importeren", + "@importNow": {}, + "importEmojis": "Emoji's importeren", + "@importEmojis": {}, + "importFromZipFile": "Uit zip-bestand importeren", + "@importFromZipFile": {}, + "exportEmotePack": "Emote-pakket als zip exporteren", + "@exportEmotePack": {}, + "replace": "Vervang", + "@replace": {}, + "report": "Rapporteer", + "@report": {}, + "reportErrorDescription": "😭 Oh nee. Er is iets misgegaan. Probeer het later nog eens. Als je wilt, kun je de bug rapporteren aan de ontwikkelaars.", + "@reportErrorDescription": {}, + "sendTypingNotifications": "Typemeldingen verzenden", + "@sendTypingNotifications": {}, + "pleaseTryAgainLaterOrChooseDifferentServer": "Probeer het later nog eens of kies een andere server.", + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "signInWithPassword": "Aanmelden met wachtwoord", + "@signInWithPassword": {}, + "chatPermissions": "Chat toestemmingen", + "@chatPermissions": {}, + "chatDescription": "Chatomschrijving", + "@chatDescription": {}, + "chatDescriptionHasBeenChanged": "Chatomschrijving gewijzigd", + "@chatDescriptionHasBeenChanged": {}, + "noChatDescriptionYet": "Nog geen chatomschrijving gemaakt.", + "@noChatDescriptionYet": {}, + "tryAgain": "Opnieuw proberen", + "@tryAgain": {}, + "redactMessageDescription": "Het bericht zal worden aangepast voor alle deelnemers in dit gesprek. Dit kan niet ongedaan gemaakt worden.", + "@redactMessageDescription": {}, + "redactedByBecause": "Aangepast door {username}, reden: \"{reason}\"", + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "profileNotFound": "De persoon kan niet gevonden worden op de server. Misschien is er een verbindingsprobleem of de persoon bestaat niet.", + "@profileNotFound": {}, + "createGroup": "Groep aanmaken", + "@createGroup": {}, + "inviteContactToGroupQuestion": "Wil je {contact} uitnodigingen voor de chat \"{groupName}\"?", + "@inviteContactToGroupQuestion": {}, + "optionalRedactReason": "(Optioneel) Reden voor aanpassing van dit bericht...", + "@optionalRedactReason": {}, + "addChatDescription": "Voeg een chatomschrijving toe...", + "@addChatDescription": {}, + "invalidServerName": "Foute servernaam", + "@invalidServerName": {}, + "messagesStyle": "Berichten:", + "@messagesStyle": {}, + "shareInviteLink": "Uitnodigingslink delen", + "@shareInviteLink": {}, + "redactedBy": "Aangepast door {username}", + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "directChat": "Directe chat", + "@directChat": {}, + "setChatDescription": "Chatomschrijving instellen", + "@setChatDescription": {}, + "setTheme": "Thema instellen:", + "@setTheme": {}, + "setColorTheme": "Kleurthema instellen:", + "@setColorTheme": {}, + "invite": "Uitnodigen", + "@invite": {}, + "inviteGroupChat": "📨 Groeps-chat uitnodiging", + "@inviteGroupChat": {}, + "invitePrivateChat": "📨 Privé-chat uitnodiging", + "@invitePrivateChat": {}, + "emoteKeyboardNoRecents": "Recent gebruikte emoticons zullen hier verschijnen...", + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "invalidInput": "Ongeldige invoer!", + "@invalidInput": {}, + "wrongPinEntered": "Verkeerde pin ingevoerd! Probeer het nog eens over {seconds} seconden...", + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "banUserDescription": "De persoon zal worden verbannen van de chat en kan niet meer toetreden totdat de verbanning is opgeheven.", + "@banUserDescription": {}, + "removeDevicesDescription": "Je wordt op dit apparaat uitgelogd en zal niet langer in staat zijn om berichten te ontvangen.", + "@removeDevicesDescription": {}, + "unbanUserDescription": "De persoon zal weer in staat zijn om de chat te betreden als ze het proberen.", + "@unbanUserDescription": {}, + "pushNotificationsNotAvailable": "Pushmeldingen zijn niet beschikbaar", + "@pushNotificationsNotAvailable": {}, + "makeAdminDescription": "Wanneer je deze persoon beheerder maakt kun je dit niet ongedaan maken als jullie dezelfde rechten hebben.", + "@makeAdminDescription": {}, + "archiveRoomDescription": "De chat zal naar het archief worden verplaatst. Andere personen zullen in staat zijn te zien dat je de chat hebt verlaten.", + "@archiveRoomDescription": {}, + "hasKnocked": "🚪 {user} heeft geklopt", + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "learnMore": "Lees meer", + "@learnMore": {}, + "roomUpgradeDescription": "De chat zal dan opnieuw gemaakt worden met de nieuwe kamerversie. Alle deelnemers worden geïnformeerd dat ze moeten overstappen naar de nieuwe chat. Je kan meer lezen over kamerversies op https://spec.matrix.org/latest/rooms/", + "@roomUpgradeDescription": {}, + "pleaseEnterANumber": "Vul een getal in groter dan 0", + "@pleaseEnterANumber": {}, + "kickUserDescription": "De persoon is verwijderd uit de chat, maar is niet verbannen. In openbare chats kan de persoon op elk moment opnieuw deelnemen.", + "@kickUserDescription": {}, + "alwaysUse24HourFormat": "true", + "@alwaysUse24HourFormat": { + "description": "Set to true to always display time of day in 24 hour format." + }, + "joinSpace": "Toetreden tot de space", + "@joinSpace": {}, + "block": "Blokkeren", + "@block": {}, + "blockedUsers": "Geblokkeerde personen", + "@blockedUsers": {}, + "presenceStyle": "Aanwezigheid:", + "@presenceStyle": { + "type": "String", + "placeholders": {} + }, + "searchChatsRooms": "Zoek naar #chats, @personen...", + "@searchChatsRooms": {}, + "swipeRightToLeftToReply": "Veeg van rechts naar links om te reageren", + "@swipeRightToLeftToReply": {}, + "calls": "Gesprekken", + "@calls": {}, + "customEmojisAndStickers": "Aangepaste emoticons en stickers", + "@customEmojisAndStickers": {}, + "accessAndVisibilityDescription": "Wie mag toetreden tot deze chat en hoe de chat ontdekt kan worden.", + "@accessAndVisibilityDescription": {}, + "customEmojisAndStickersBody": "Voeg toe of deel aangepaste emoji's of stickers die gebruikt kunnen worden in elke chat.", + "@customEmojisAndStickersBody": {}, + "hideRedactedMessages": "Verberg verwijderde berichten", + "@hideRedactedMessages": {}, + "hideRedactedMessagesBody": "Als iemand een bericht verwijdert, is dit bericht niet meer zichtbaar in de chat.", + "@hideRedactedMessagesBody": {}, + "hideInvalidOrUnknownMessageFormats": "Verberg ongeldige of onbekende berichtformaten", + "@hideInvalidOrUnknownMessageFormats": {}, + "passwordRecoverySettings": "Wachtwoordherstel-instellingen", + "@passwordRecoverySettings": {}, + "youInvitedToBy": "📩 Je bent uitgenodigd via een link voor:\n{alias}", + "@youInvitedToBy": { + "placeholders": { + "alias": { + "type": "String" + } + } + }, + "knock": "Klop", + "@knock": {}, + "overview": "Overzicht", + "@overview": {}, + "hidePresences": "Verberg statuslijst?", + "@hidePresences": {}, + "noOneCanJoin": "Niemand kan deelnemen", + "@noOneCanJoin": {}, + "yourGlobalUserIdIs": "Je Matrix ID is: ", + "@yourGlobalUserIdIs": {}, + "appLockDescription": "Vergendel de app wanneer het niet gebruikt wordt met een pincode", + "@appLockDescription": {}, + "globalChatId": "Globale chat ID", + "@globalChatId": {}, + "accessAndVisibility": "Toegang en zichtbaarheid", + "@accessAndVisibility": {}, + "invitedBy": "📩 Uitgenodigd door: {user}", + "@invitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "publicSpaces": "Openbare spaces", + "@publicSpaces": {}, + "blockUsername": "Negeer inlognaam", + "@blockUsername": {}, + "publicChatAddresses": "Openbare chat adressen", + "@publicChatAddresses": {}, + "createNewAddress": "Creëer nieuw adres", + "@createNewAddress": {}, + "countChatsAndCountParticipants": "{chats} chats en {participants} deelnemers", + "@countChatsAndCountParticipants": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + }, + "participants": { + "type": "int" + } + } + }, + "noMoreChatsFound": "Geen chats gevonden...", + "@noMoreChatsFound": {}, + "joinedChats": "Chats waaraan je deelneemt", + "@joinedChats": {}, + "knocking": "Kloppen", + "@knocking": {}, + "space": "Space", + "@space": {}, + "spaces": "Spaces", + "@spaces": {}, + "unread": "Ongelezen", + "@unread": {}, + "databaseBuildErrorBody": "Het aanmaken van de SQlite database is mislukt. De app probeert nu een traditionele database te gebruiken. Meldt alsjeblieft deze fout aan de ontwikkelaars via deze {url}. De foutmelding is: {error}", + "@databaseBuildErrorBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "groupName": "Groepsnaam", + "@groupName": {}, + "changeGeneralChatSettings": "Algemene chat instellingen wijzigen", + "@changeGeneralChatSettings": {}, + "restricted": "Beperkt", + "@restricted": {}, + "searchForUsers": "Zoek naar @personen...", + "@searchForUsers": {}, + "searchMore": "Zoek meer...", + "@searchMore": {}, + "noPublicLinkHasBeenCreatedYet": "Openbare link is nog niet gecreëerd", + "@noPublicLinkHasBeenCreatedYet": {}, + "groupCanBeFoundViaSearch": "Groep kan gevonden worden via zoeken", + "@groupCanBeFoundViaSearch": {}, + "searchIn": "Zoek in chat \"{chat}\"...", + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "files": "Bestanden", + "@files": {}, + "unreadChatsInApp": "{appname}: {unread} ongelezen chats", + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "noDatabaseEncryption": "Database versleuteling is niet ondersteund op dit platform", + "@noDatabaseEncryption": {}, + "thereAreCountUsersBlocked": "Momenteel zijn er {count} personen geblokkeerd.", + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "markAsUnread": "Als ongelezen markeren", + "@markAsUnread": {}, + "userLevel": "{level} - Persoon", + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "moderatorLevel": "{level} - Moderator", + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "adminLevel": "{level} - Beheerder", + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "stickers": "Stickers", + "@stickers": {}, + "nothingFound": "Niets gevonden...", + "@nothingFound": {}, + "gallery": "Galerij", + "@gallery": {}, + "transparent": "Transparant", + "@transparent": {}, + "incomingMessages": "Inkomende berichten", + "@incomingMessages": {}, + "discover": "Ontdek", + "@discover": {}, + "commandHint_ignore": "Negeer de gegeven Matrix ID", + "@commandHint_ignore": {}, + "noChatsFoundHere": "Hier zijn nog geen chats. Begin een nieuwe chat met iemand door op de onderstaande knop te klikken. ⤵️", + "@noChatsFoundHere": {}, + "unableToJoinChat": "Kan niet toetreden tot de chat. Misschien heeft de andere partij het gesprek al afgesloten.", + "@unableToJoinChat": {}, + "aboutHomeserver": "Over {homeserver}", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "boldText": "Vet gedrukte tekst", + "@boldText": {}, + "italicText": "Cursieve tekst", + "@italicText": {}, + "strikeThrough": "Doorhalen", + "@strikeThrough": {}, + "pleaseFillOut": "Vul alsjeblieft in", + "@pleaseFillOut": {}, + "invalidUrl": "Ongeldige url", + "@invalidUrl": {}, + "addLink": "Koppeling toevoegen", + "@addLink": {}, + "compress": "Comprimeren", + "@compress": {}, + "previous": "Vorige", + "@previous": {}, + "otherPartyNotLoggedIn": "De andere partij is momenteel niet ingelogd en kan daarom geen berichten ontvangen!", + "@otherPartyNotLoggedIn": {}, + "notifyMeFor": "Waarschuw mij voor", + "@notifyMeFor": {}, + "blockListDescription": "Je kunt personen blokkeren die je lastig vallen. Je kan dan geen berichten meer ontvangen of kameruitnodigingen krijgen van de personen op je blokkeerlijst.", + "@blockListDescription": {}, + "sendImages": "Stuur {count} afbeelding(en)", + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "presencesToggle": "Toon statusberichten van andere personen", + "@presencesToggle": { + "type": "String", + "placeholders": {} + }, + "website": "Website", + "@website": {}, + "hideMemberChangesInPublicChats": "Verberg persoon veranderingen in openbare chats", + "@hideMemberChangesInPublicChats": {}, + "hideMemberChangesInPublicChatsBody": "Verberg in de tijdlijn van de chat als iemand zich aanmeldt bij een openbare chat of deze verlaat om de leesbaarheid te verbeteren.", + "@hideMemberChangesInPublicChatsBody": {}, + "startConversation": "Start gesprek", + "@startConversation": {}, + "usersMustKnock": "Personen moeten kloppen", + "@usersMustKnock": {}, + "noUsersFoundWithQuery": "Helaas kan er geen persoon gevonden worden met \"{query}\". Controleer of je een typfout hebt gemaakt.", + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "createGroupAndInviteUsers": "Maak groep en nodig personen uit", + "@createGroupAndInviteUsers": {}, + "userWouldLikeToChangeTheChat": "{user} wil graag deelnemen aan de chat.", + "@userWouldLikeToChangeTheChat": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "chatCanBeDiscoveredViaSearchOnServer": "Chat kan worden gevonden via een zoekopdracht op {server}", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "wrongRecoveryKey": "Helaas... dit lijkt niet de correcte herstelsleutel.", + "@wrongRecoveryKey": {}, + "synchronizingPleaseWaitCounter": " Synchroniseren… ({percentage}%)", + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "databaseMigrationTitle": "Database is geoptimaliseerd", + "@databaseMigrationTitle": {}, + "databaseMigrationBody": "Een ogenblik. Dit kan even duren.", + "@databaseMigrationBody": {}, + "commandHint_sendraw": "Stuur kale json", + "@commandHint_sendraw": {}, + "passwordIsWrong": "Je ingevoerde wachtwoord is fout", + "@passwordIsWrong": {}, + "newPassword": "Nieuw wachtwoord", + "@newPassword": {}, + "pleaseChooseAStrongPassword": "Kies a.j.b. een sterk wachtwoord", + "@pleaseChooseAStrongPassword": {}, + "publicLink": "Openbare link", + "@publicLink": {}, + "select": "Selecteer", + "@select": {}, + "leaveEmptyToClearStatus": "Laat leeg om je status te resetten.", + "@leaveEmptyToClearStatus": {}, + "addChatOrSubSpace": "Voeg chat of subspace toe", + "@addChatOrSubSpace": {}, + "subspace": "Subspace", + "@subspace": {}, + "pleaseEnterYourCurrentPassword": "Vul je huidige wachtwoord in", + "@pleaseEnterYourCurrentPassword": {}, + "passwordsDoNotMatch": "Wachtwoorden komen niet overeen", + "@passwordsDoNotMatch": {}, + "decline": "Weiger", + "@decline": {}, + "thisDevice": "Dit apparaat:", + "@thisDevice": {}, + "contentNotificationSettings": "Contentmelding instellingen", + "@contentNotificationSettings": {}, + "roomNotificationSettings": "Kamermelding instellingen", + "@roomNotificationSettings": {}, + "userSpecificNotificationSettings": "Persoon specifieke melding instellingen", + "@userSpecificNotificationSettings": {}, + "otherNotificationSettings": "Andere melding instellingen", + "@otherNotificationSettings": {}, + "notificationRuleContainsUserName": "Bevat naam van persoon", + "@notificationRuleContainsUserName": {}, + "notificationRuleContainsUserNameDescription": "Stuurt een melding als een bericht de persoon vermeld.", + "@notificationRuleContainsUserNameDescription": {}, + "notificationRuleMaster": "Alle meldingen uitschakelen", + "@notificationRuleMaster": {}, + "notificationRuleMasterDescription": "Overschrijf alle andere regels en meldingen uitschakelen.", + "@notificationRuleMasterDescription": {}, + "notificationRuleMemberEventDescription": "Meldingen voor kamer-gebeurtenissen uitschakelen.", + "@notificationRuleMemberEventDescription": {}, + "notificationRuleIsUserMention": "Persoonvermelding", + "@notificationRuleIsUserMention": {}, + "initAppError": "Er is een fout opgetreden bij het laden van de app", + "@initAppError": {}, + "requestedKeyVerification": "{sender} vraagt een sleutelverificatie", + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "sessionLostBody": "Je sessie is verlopen. Meldt alsjeblieft deze fout aan de ontwikkelaars via deze link {url}. De foutmelding is: {error}", + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "sendTypingNotificationsDescription": "Andere deelnemers in de chat kunnen zien wanneer je een bericht aan het typen bent.", + "@sendTypingNotificationsDescription": {}, + "sendCanceled": "Versturen geannuleerd", + "@sendCanceled": {}, + "opacity": "Doorzichtigheid:", + "@opacity": {}, + "verifyOtherUserDescription": "Als je een persoon verifieert ben je er zeker van dat je echt met haar contact hebt. 💪\n\nWanneer je een verificatie start ziet de persoon een popup in de app. Hier staat een serie van emoji's of getallen die je met elkaar moet vergelijken.\n\nDe beste manier om dit te doen is in persoon of met een videogesprek. 👭", + "@verifyOtherUserDescription": {}, + "changeTheVisibilityOfChatHistory": "Zichtbaarheid van de chat-geschiedenis wijzigen", + "@changeTheVisibilityOfChatHistory": {}, + "whatIsAHomeserver": "Wat is een server?", + "@whatIsAHomeserver": {}, + "sendRoomNotifications": "@room-meldingen versturen", + "@sendRoomNotifications": {}, + "noticeChatBackupDeviceVerification": "Opmerking: Als al je apparaten zijn verbonden met de chat back-up worden ze automatisch geverifieerd.", + "@noticeChatBackupDeviceVerification": {}, + "notificationRuleMemberEvent": "Kamer-gebeurtenis", + "@notificationRuleMemberEvent": {}, + "notificationRuleSuppressNotices": "Automatische berichten uitschakelen", + "@notificationRuleSuppressNotices": {}, + "setWallpaper": "Wallpaper instellen", + "@setWallpaper": {}, + "oneOfYourDevicesIsNotVerified": "Een van jouw apparaten is niet geverifieerd", + "@oneOfYourDevicesIsNotVerified": {}, + "contactServerAdmin": "Contact opnemen met serverbeheerder", + "@contactServerAdmin": {}, + "manageAccount": "Account beheren", + "@manageAccount": {}, + "noContactInformationProvided": "Server geeft geen geldige contactinformatie", + "@noContactInformationProvided": {}, + "waitingForServer": "Wachten op server...", + "@waitingForServer": {}, + "generalNotificationSettings": "Algemene melding instellingen", + "@generalNotificationSettings": {}, + "notificationRuleInviteForMeDescription": "Stuur een melding wanneer een persoon wordt uitgenodigd voor een kamer.", + "@notificationRuleInviteForMeDescription": {}, + "notificationRuleSuppressNoticesDescription": "Meldingen van automatische accounts zoals bots uitschakelen.", + "@notificationRuleSuppressNoticesDescription": {}, + "notificationRuleInviteForMe": "Uitnodiging voor mij", + "@notificationRuleInviteForMe": {}, + "inviteOtherUsers": "Personen voor deze chat uitnodigen", + "@inviteOtherUsers": {}, + "changeTheChatPermissions": "Chat-rechten wijzigen", + "@changeTheChatPermissions": {}, + "changeTheCanonicalRoomAlias": "Standaard openbaar chat-adres wijzigen", + "@changeTheCanonicalRoomAlias": {}, + "blur": "Vervaag:", + "@blur": {}, + "isReadyForKeyVerification": "{sender} is klaar voor de sleutelverificatie", + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "startedKeyVerification": "{sender} start een sleutelverificatie", + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "acceptedKeyVerification": "{sender} accepteerde de sleutelverificatie", + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "canceledKeyVerification": "{sender} annuleerde de sleutelverificatie", + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "knockRestricted": "Kloppen is beperkt", + "@knockRestricted": {}, + "goToSpace": "Ga naar space: {space}", + "@goToSpace": { + "type": "String", + "space": {} + }, + "contactServerSecurity": "Contact opnemen met serverbeveiliger", + "@contactServerSecurity": {}, + "newChatRequest": "📩 Nieuw chat verzoek", + "@newChatRequest": {}, + "updateInstalled": "🎉 Update {version} geïnstalleerd!", + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "discoverHomeservers": "Ontdek servers", + "@discoverHomeservers": {}, + "changelog": "Wijzigingengeschiedenis", + "@changelog": {}, + "loginWithMatrixId": "Inloggen met Matrix ID", + "@loginWithMatrixId": {}, + "calculatingFileSize": "Bestandsgrootte berekenen...", + "@calculatingFileSize": {}, + "sendingAttachment": "Bijlage versturen...", + "@sendingAttachment": {}, + "generatingVideoThumbnail": "Video-voorbeeld genereren...", + "@generatingVideoThumbnail": {}, + "prepareSendingAttachment": "Bijlage versturen voorbereiden...", + "@prepareSendingAttachment": {}, + "compressVideo": "Video comprimeren...", + "@compressVideo": {}, + "serverLimitReached": "Server limiet bereikt! Wacht {seconds} seconden...", + "@serverLimitReached": { + "type": "integer", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "version": "Versie", + "@version": {}, + "supportPage": "Supportpagina", + "@supportPage": {}, + "serverInformation": "Server-informatie:", + "@serverInformation": {}, + "name": "Naam", + "@name": {}, + "verifyOtherDeviceDescription": "Een geverifieerd ander apparaat zorgt ervoor dat de apparaten sleutels uitwisselen, wat je beveiliging versterkt. 💪 Als je de verificatie start verschijnt er een popup op beide apparaten. Hier staat een reeks emoji's of getallen die je met elkaar moet vergelijken. Het is handig om beide apparaten bij de hand te hebben voordat je de verificatie start. 🤳", + "@verifyOtherDeviceDescription": {}, + "commandHint_unignore": "Herstel de negeerde Matrix ID", + "@commandHint_unignore": {}, + "forwardMessageTo": "Bericht doorsturen naar {roomName}?", + "@forwardMessageTo": { + "type": "String", + "placeholders": { + "roomName": { + "type": "String" + } + } + }, + "restoreSessionBody": "De app probeert nu je sessie te herstellen van een back-up. Meldt alsjeblieft deze fout aan de ontwikkelaars via deze link {url}. De foutmelding is: {error}", + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "sendReadReceipts": "Leesbevestigingen versturen", + "@sendReadReceipts": {}, + "formattedMessages": "Opgemaakte berichten", + "@formattedMessages": {}, + "chatPermissionsDescription": "Stel het gewenste rechten-niveau in voor bepaalde acties in deze chat. Het rechten-niveau 0, 50 en 100 zijn gebruikelijk voor deelnemer, moderator en beheerder, maar elke verdeling is mogelijk.", + "@chatPermissionsDescription": {}, + "changeTheDescriptionOfTheGroup": "Chatomschrijving wijzigen", + "@changeTheDescriptionOfTheGroup": {}, + "userRole": "Rol", + "@userRole": {}, + "minimumPowerLevel": "{level} is het minimale rechten-niveau.", + "@minimumPowerLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "String" + } + } + }, + "sendReadReceiptsDescription": "Andere deelnemers van de chat kunnen zien of je een bericht hebt gelezen.", + "@sendReadReceiptsDescription": {}, + "formattedMessagesDescription": "Geef rijke berichtinhoud weer zoals vetgedrukte tekst met markdown.", + "@formattedMessagesDescription": {}, + "verifyOtherUser": "🔐 Persoon verifiëren", + "@verifyOtherUser": {}, + "verifyOtherDevice": "🔐 Ander apparaat verifiëren", + "@verifyOtherDevice": {}, + "doesNotSeemToBeAValidHomeserver": "Dit lijkt geen ondersteunde server. Verkeerde URL?", + "@doesNotSeemToBeAValidHomeserver": {}, + "sendingAttachmentCountOfCount": "Bijlage versturen {index} van {length}...", + "@sendingAttachmentCountOfCount": { + "type": "integer", + "placeholders": { + "index": { + "type": "int" + }, + "length": { + "type": "int" + } + } + }, + "continueText": "Doorgaan", + "@continueText": {}, + "welcomeText": "Hallo hallo 👋 Dit is FluffyChat. Je kan inloggen op elke server die werkt met https://matrix.org. En dan chat je met iedereen. Het is een groot decentraal chat-netwerk!", + "@welcomeText": {}, + "appWantsToUseForLogin": "Inloggen met '{server}'", + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "appWantsToUseForLoginDescription": "Hierbij sta je toe dat de app en website informatie over je delen.", + "@appWantsToUseForLoginDescription": {}, + "open": "Open", + "@open": {}, + "appIntroduction": "FluffyChat laat je chatten met je vrienden tussen verschillende chat-netwerken. Lees meer op https://matrix.org of tik *Continue*.", + "@appIntroduction": {}, + "completedKeyVerification": "{sender} ronde de sleutelverificatie af", + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "homeserverDescription": "Al je data is opgeslagen op de server, net als bij een email-leverancier. Je kan kiezen welke server je gebruikt en toch communiceren met iedereen. Lees meer op https://matrix.org.", + "@homeserverDescription": {}, + "notificationRuleContainsDisplayName": "Bevat de naam", + "@notificationRuleContainsDisplayName": {}, + "notificationRuleIsUserMentionDescription": "Stuur een melding als de persoon direct genoemd wordt in een bericht.", + "@notificationRuleIsUserMentionDescription": {}, + "notificationRuleContainsDisplayNameDescription": "Stuur een melding als de persoon genoemd wordt in het bericht.", + "@notificationRuleContainsDisplayNameDescription": {}, + "notificationRuleIsRoomMention": "Kamervermelding", + "@notificationRuleIsRoomMention": {}, + "notificationRuleIsRoomMentionDescription": "Stuur een melding naar de persoon als er in een kamervermelding is.", + "@notificationRuleIsRoomMentionDescription": {}, + "notificationRuleRoomnotif": "Kamermelding", + "@notificationRuleRoomnotif": {}, + "notificationRuleRoomnotifDescription": "Stuur een melding naar de persoon wanneer een bericht '@room' bevat.", + "@notificationRuleRoomnotifDescription": {}, + "notificationRuleTombstone": "Sleutingsbericht", + "@notificationRuleTombstone": {}, + "notificationRuleReaction": "Reactie", + "@notificationRuleReaction": {}, + "notificationRuleRoomServerAcl": "Kamer Server ACL", + "@notificationRuleRoomServerAcl": {}, + "notificationRuleTombstoneDescription": "Stuur een melding naar de persoon over kamersluitingsberichten.", + "@notificationRuleTombstoneDescription": {}, + "notificationRuleReactionDescription": "Meldingen voor reacties uitschakelen.", + "@notificationRuleReactionDescription": {}, + "notificationRuleRoomServerAclDescription": "Meldingen voor kamer server toegangscontrolelijst (ACL) uitschakelen.", + "@notificationRuleRoomServerAclDescription": {}, + "notificationRuleSuppressEdits": "Bewerkingen uitschakelen", + "@notificationRuleSuppressEdits": {}, + "notificationRuleCall": "Oproep", + "@notificationRuleCall": {}, + "notificationRuleSuppressEditsDescription": "Meldingen voor bewerkte berichten uitschakelen.", + "@notificationRuleSuppressEditsDescription": {}, + "notificationRuleEncryptedRoomOneToOneDescription": "Stuur een melding naar de persoon over berichten in versleutelde een-op-een kamers.", + "@notificationRuleEncryptedRoomOneToOneDescription": {}, + "notificationRuleEncryptedRoomOneToOne": "Versleutelde een-op-een kamer", + "@notificationRuleEncryptedRoomOneToOne": {}, + "notificationRuleRoomOneToOne": "Een-op-een kamer", + "@notificationRuleRoomOneToOne": {}, + "notificationRuleMessage": "Bericht", + "@notificationRuleMessage": {}, + "notificationRuleEncrypted": "Versleuteld", + "@notificationRuleEncrypted": {}, + "notificationRuleRoomOneToOneDescription": "Stuur een melding naar de persoon over berichten in een-op-een kamers.", + "@notificationRuleRoomOneToOneDescription": {}, + "notificationRuleMessageDescription": "Stuur een melding naar de persoon over algemene berichten.", + "@notificationRuleMessageDescription": {}, + "notificationRuleJitsi": "Jitsi", + "@notificationRuleJitsi": {}, + "notificationRuleEncryptedDescription": "Stuur een melding naar de persoon over berichten in versleutelde kamers.", + "@notificationRuleEncryptedDescription": {}, + "notificationRuleJitsiDescription": "Stuur een melding naar de persoon over Jitsi widget gebeurtenissen.", + "@notificationRuleJitsiDescription": {}, + "unknownPushRule": "Onbekende notificatieregel '{rule}'", + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } + } + }, + "notificationRuleServerAcl": "Server ACL gebeurtenissen uitschakelen", + "@notificationRuleServerAcl": {}, + "notificationRuleServerAclDescription": "Meldingen over server ACL gebeurtenissen uitschakelen.", + "@notificationRuleServerAclDescription": {}, + "more": "Meer", + "@more": {}, + "enterNewChat": "Nieuwe chat openen", + "@enterNewChat": {}, + "crossVerifiedDevices": "Kruislings geverifieerde apparaten", + "@crossVerifiedDevices": {}, + "allDevices": "Alle apparaten", + "@allDevices": {}, + "shareKeysWithDescription": "Welke apparaten moeten vertrouwd worden zodat ze je berichten kunnen lezen in versleutelde chats?", + "@shareKeysWithDescription": {}, + "verifiedDevicesOnly": "Alleen geverifieerde apparaten", + "@verifiedDevicesOnly": {}, + "crossVerifiedDevicesIfEnabled": "Kruislings geverifieerde apparaten als ingeschakeld", + "@crossVerifiedDevicesIfEnabled": {}, + "shareKeysWith": "Deel sleutels met...", + "@shareKeysWith": {}, + "notificationRuleCallDescription": "Stuur een melding naar de persoon over oproepen.", + "@notificationRuleCallDescription": {}, + "deletePushRuleCanNotBeUndone": "Als je deze melding-instelling verwijderd, kan dit niet ongedaan gemaakt worden.", + "@deletePushRuleCanNotBeUndone": {}, + "takeAPhoto": "Neem een foto", + "@takeAPhoto": {}, + "recordAVideo": "Neem een video", + "@recordAVideo": {}, + "optionalMessage": "(Optioneel) bericht...", + "@optionalMessage": {}, + "notSupportedOnThisDevice": "Niet ondersteund op dit apparaat", + "@notSupportedOnThisDevice": {}, + "commandHint_roomupgrade": "Upgradeer deze kamer naar de aangegeven kamerversie", + "@commandHint_roomupgrade": {} +} diff --git a/assets/l10n/intl_pl.arb b/assets/l10n/intl_pl.arb new file mode 100644 index 0000000..c86f57c --- /dev/null +++ b/assets/l10n/intl_pl.arb @@ -0,0 +1,3341 @@ +{ + "@@locale": "pl", + "@@last_modified": "2021-08-14 12:41:09.943634", + "about": "O aplikacji", + "@about": { + "type": "String", + "placeholders": {} + }, + "accept": "Akceptuj", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 {username} zaakceptował/-a zaproszenie", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "Konto", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐 {username} aktywował/-a szyfrowanie od końca do końca", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "addEmail": "Dodaj adres email", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "admin": "Administrator", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "alias", + "@alias": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "{senderName} odebrał/-a połączenie", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "Każdy może dołączyć", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "archive": "Archiwum", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "Czy użytkownicy-goście mogą dołączyć", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "Czy na pewno?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "areYouSureYouWantToLogout": "Czy na pewno chcesz się wylogować?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "Aby zalogować inną osobę, proszę wpisać hasło przechowywania lub klucz odzyskiwania.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "Zaakceptować tą prośbę weryfikacji od {username}?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "badServerLoginTypesException": "Serwer obsługuje typy logowania:\n{serverVersions}\nAle ta aplikacja obsługuje tylko:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "badServerVersionsException": "Serwer obsługuje wersje Spec:\n{serverVersions}\nAle aplikacja obsługuje tylko {supportedVersions}", + "@badServerVersionsException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "banFromChat": "Ban w czacie", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "Zbanowany/-a", + "@banned": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username} zbanował/-a {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "Zablokuj urządzenie", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "blocked": "Zablokowane", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "botMessages": "Wiadomości botów", + "@botMessages": { + "type": "String", + "placeholders": {} + }, + "cancel": "Anuluj", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "changeDeviceName": "Zmień nazwę urządzenia", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "{username} zmienił/-a zdjęcie profilowe", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatDescriptionTo": "{username} zmienił/-a opis czatu na '{description}'", + "@changedTheChatDescriptionTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "description": { + "type": "String" + } + } + }, + "changedTheChatNameTo": "{username} zmienił/-a nazwę czatu na '{chatname}'", + "@changedTheChatNameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "chatname": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username} zmienił/-a uprawnienia w czacie", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username} zmienił/-a swoją nazwę wyświetlaną na '{displayname}'", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} zmienił/-a zasady dostępu dla gości", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} zmienił/-a zasady dostępu dla gości na {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username} zmienił/-a widoczność historii", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username} zmienił/-a widoczność historii na {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username} zmienił/-a zasady wejścia", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} zmienił/-a zasady wejścia na {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} zmienił/-a zdjęcie profilowe", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "{username} zmienił/-a alias pokoju", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username} zmienił/-a link z zaproszeniem do pokoju", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changePassword": "Zmień hasło", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "Zmień serwer domyślny", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "Zmień swój styl", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "Zmień nazwę grupy", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "Szyfrowanie zostało uszkodzone", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "chat": "Czat", + "@chat": { + "type": "String", + "placeholders": {} + }, + "chatBackup": "Kopia zapasowa czatów", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "chatBackupDescription": "Twoje stare wiadomości są zabezpieczone kluczem odzyskiwania. Uważaj żeby go nie zgubić.", + "@chatBackupDescription": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Szczegóły czatu", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chats": "Czaty", + "@chats": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "Wybierz silne hasło", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "clearArchive": "Wyczyść archiwum", + "@clearArchive": {}, + "close": "Zamknij", + "@close": { + "type": "String", + "placeholders": {} + }, + "commandHint_ban": "Zbanuj użytkownika w tym pokoju", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_html": "Wyślij tekst sformatowany w HTML", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_invite": "Zaproś użytkownika do pokoju", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "commandHint_join": "Dołącz do podanego pokoju", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_kick": "Usuń tego użytkownika z tego pokoju", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_leave": "Opuść ten pokój", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_me": "Opisz siebie", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "commandHint_myroomavatar": "Ustaw swoje zdjęcie w tym pokoju (przez mxc-uri)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_myroomnick": "Ustaw swoją nazwę wyświetlaną w tym pokoju", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "commandHint_op": "Ustaw poziom uprawnień tego użytkownika (domyślnie: 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_plain": "Wyślij niesformatowany tekst", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_react": "Wyślij odpowiedź jako reakcję", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "commandHint_send": "Wyślij wiadomość", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "commandHint_unban": "Odbanuj użytkownika w tym pokoju", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "commandInvalid": "Nieprawidłowe polecenie", + "@commandInvalid": { + "type": "String" + }, + "commandMissing": "{command} nie jest poleceniem.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "compareEmojiMatch": "Porównaj emoji", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "Porównaj cyfry", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "confirm": "Potwierdź", + "@confirm": { + "type": "String", + "placeholders": {} + }, + "connect": "Połącz", + "@connect": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "Kontakt został zaproszony do grupy", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "containsDisplayName": "Zawiera nazwę wyświetlaną", + "@containsDisplayName": { + "type": "String", + "placeholders": {} + }, + "containsUserName": "Zawiera nazwę użytkownika", + "@containsUserName": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "Skopiowano do schowka", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "Kopiuj", + "@copy": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "Skopiuj do schowka", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "Nie można odszyfrować wiadomości: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "countParticipants": "{count} uczestników", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "create": "Stwórz", + "@create": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "💬 {username} utworzył/-a czat", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "currentlyActive": "Obecnie aktywny/-a", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "Ciemny", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date} {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "dateWithoutYear": "{month}-{day}", + "@dateWithoutYear": { + "type": "String", + "placeholders": { + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "dateWithYear": "{day}.{month}.{year}", + "@dateWithYear": { + "type": "String", + "placeholders": { + "year": { + "type": "String" + }, + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "deactivateAccountWarning": "To zdezaktywuje twoje konto. To jest nieodwracalne! Na pewno chcesz to zrobić?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "delete": "Usuń", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "Usuń konto", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "Usuń wiadomość", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "device": "Urządzenie", + "@device": { + "type": "String", + "placeholders": {} + }, + "deviceId": "Identyfikator urządzenia", + "@deviceId": { + "type": "String", + "placeholders": {} + }, + "devices": "Urządzenia", + "@devices": { + "type": "String", + "placeholders": {} + }, + "directChats": "Czaty bezpośrednie", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "Nazwa wyświetlana została zmieniona", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "Pobierz plik", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "edit": "Edytuj", + "@edit": { + "type": "String", + "placeholders": {} + }, + "editDisplayname": "Edytuj nazwę wyświetlaną", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "editRoomAliases": "Zmień aliasy pokoju", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "Emotikon już istnieje!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "Nieprawidłowy kod emotikonu!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emotePacks": "Paczki emotikonów dla pokoju", + "@emotePacks": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "Ustawienia emotikonów", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "emoteShortcode": "Skrócony kod emotikonu", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emoteWarnNeedToPick": "Musisz wybrać kod emotikonu oraz obraz!", + "@emoteWarnNeedToPick": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "Pusty czat", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "Włącz paczkę emotikonów globalnie", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "Nie będziesz już mógł wyłączyć szyfrowania. Jesteś pewny?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "encrypted": "Szyfrowane", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "encryption": "Szyfrowanie", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "Szyfrowanie nie jest włączone", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName} zakończył/-a połączenie", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "enterAnEmailAddress": "Wpisz adres e-mail", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "enterYourHomeserver": "Wpisz swój serwer domowy", + "@enterYourHomeserver": { + "type": "String", + "placeholders": {} + }, + "everythingReady": "Wszystko gotowe!", + "@everythingReady": { + "type": "String", + "placeholders": {} + }, + "fileName": "Nazwa pliku", + "@fileName": { + "type": "String", + "placeholders": {} + }, + "fluffychat": "FluffyChat", + "@fluffychat": { + "type": "String", + "placeholders": {} + }, + "forward": "Przekaż", + "@forward": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "Od dołączenia", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "Od zaproszenia", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "goToTheNewRoom": "Przejdź do nowego pokoju", + "@goToTheNewRoom": { + "type": "String", + "placeholders": {} + }, + "group": "Grupa", + "@group": { + "type": "String", + "placeholders": {} + }, + "groupIsPublic": "Grupa jest publiczna", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "groupWith": "Grupa z {displayname}", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "guestsAreForbidden": "Goście są zakazani", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "Goście mogą dołączyć", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{username} wycofał/-a zaproszenie dla {targetName}", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "help": "Pomoc", + "@help": { + "type": "String", + "placeholders": {} + }, + "hideRedactedEvents": "Ukryj informacje o usuniętych zdarzeniach", + "@hideRedactedEvents": { + "type": "String", + "placeholders": {} + }, + "hideUnknownEvents": "Ukryj nieznane wdarzenia", + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "id": "Identyfikator", + "@id": { + "type": "String", + "placeholders": {} + }, + "identity": "Tożsamość", + "@identity": { + "type": "String", + "placeholders": {} + }, + "ignoredUsers": "Ignorowani użytkownicy", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "iHaveClickedOnLink": "Nacisnąłem na link", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "Złe hasło bezpieczeństwa lub klucz odzyskiwania", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "Zaproś kontakt", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "Zaproś kontakty do {groupName}", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "invited": "Zaproszono", + "@invited": { + "type": "String", + "placeholders": {} + }, + "invitedUser": "📩 {username} zaprosił/-a {targetName}", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "invitedUsersOnly": "Tylko zaproszeni użytkownicy", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "inviteForMe": "Zaproszenie dla mnie", + "@inviteForMe": { + "type": "String", + "placeholders": {} + }, + "inviteText": "{username} zaprosił/-a Cię do FluffyChat.\n1. Odwiedź fluffychat.im i zainstaluj aplikację\n2. Zarejestuj się lub zaloguj\n3. Otwórz link zaproszenia:\n{link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "isTyping": "pisze…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "👋 {username} dołączył/-a do czatu", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "joinRoom": "Dołącz do pokoju", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "kicked": "👞 {username} wyrzucił/-a {targetName}", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickedAndBanned": "🙅 {username} wyrzucił/-a i zbanował/-a {targetName}", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickFromChat": "Wyrzuć z czatu", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "Ostatnio widziano {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "leave": "Opuść", + "@leave": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "Opuścił/-a czat", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "license": "Licencja", + "@license": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "Jasny", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "Załaduj jeszcze {count} uczestników", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "loadingPleaseWait": "Ładowanie… Proszę czekać.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "loadMore": "Załaduj więcej…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "login": "Zaloguj się", + "@login": { + "type": "String", + "placeholders": {} + }, + "logInTo": "Zaloguj się do {homeserver}", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "logout": "Wyloguj się", + "@logout": { + "type": "String", + "placeholders": {} + }, + "memberChanges": "Zmiany członków", + "@memberChanges": { + "type": "String", + "placeholders": {} + }, + "mention": "Wzmianka", + "@mention": { + "type": "String", + "placeholders": {} + }, + "moderator": "Moderator", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "muteChat": "Wycisz czat", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "needPantalaimonWarning": "Należy pamiętać, że Pantalaimon wymaga na razie szyfrowania od końca do końca.", + "@needPantalaimonWarning": { + "type": "String", + "placeholders": {} + }, + "newChat": "Nowa rozmowa", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "💬 Nowa wiadomość we FluffyChat", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "Nowa prośba o weryfikację!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "next": "Dalej", + "@next": { + "type": "String", + "placeholders": {} + }, + "no": "Nie", + "@no": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "Możesz aktywować szyfrowanie dopiero kiedy pokój nie będzie publicznie dostępny.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "Wygląda na to, że Twoje urządzenie nie obsługuje Firebase Cloud Messaging. Aby wciąż otrzymywać powiadomienia push, zalecamy istalację ntfy. Używając ntfy lub inengo zunifikowanego dostawcy powiadomień push, możesz bezpiecznie otrzymywać takowe powiadomienia. Ntfy można pobrać ze sklepu Google Play Store lub z F-Droid.", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "none": "Brak", + "@none": { + "type": "String", + "placeholders": {} + }, + "noPasswordRecoveryDescription": "Nie dodałeś/-aś jeszcze sposobu odzyskiwania swojego hasła.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "noPermission": "Brak uprawnień", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "Nie znaleziono pokojów…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "notifications": "Powiadomienia", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "notificationsEnabledForThisAccount": "Powiadomienia są włączone dla tego konta", + "@notificationsEnabledForThisAccount": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "Ojej! Coś poszło nie tak…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "Otwórz aplikację by odczytać wiadomości", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "openCamera": "Otwórz aparat", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "password": "Hasło", + "@password": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "Hasło zostało zmienione", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "people": "Osoby", + "@people": { + "type": "String", + "placeholders": {} + }, + "pin": "Przypnij", + "@pin": { + "type": "String", + "placeholders": {} + }, + "play": "Otwórz {fileName}", + "@play": { + "type": "String", + "placeholders": { + "fileName": { + "type": "String" + } + } + }, + "pleaseEnterYourPassword": "Wprowadź swoje hasło", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "Wpisz swoją nazwę użytkownika", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "Wykonaj instrukcje na stronie internetowej i naciśnij „dalej”.", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "Publiczne pokoje", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "pushRules": "Reguły push", + "@pushRules": { + "type": "String", + "placeholders": {} + }, + "recording": "Nagranie", + "@recording": { + "type": "String", + "placeholders": {} + }, + "redactedAnEvent": "{username} usunął/-ęła zdarzenie", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "register": "Zarejestruj", + "@register": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "{username} odrzucił/-a zaproszenie", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "rejoin": "Dołącz ponownie", + "@rejoin": { + "type": "String", + "placeholders": {} + }, + "remove": "Usuń", + "@remove": { + "type": "String", + "placeholders": {} + }, + "removeAllOtherDevices": "Usuń wszystkie inne urządzenia", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "removedBy": "Usunięta przez {username}", + "@removedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "removeDevice": "Usuń urządzenie", + "@removeDevice": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "Odbanuj w czacie", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "reply": "Odpowiedz", + "@reply": { + "type": "String", + "placeholders": {} + }, + "requestPermission": "Prośba o pozwolenie", + "@requestPermission": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "Wersja pokoju", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "seenByUser": "Zobaczone przez {username}", + "@seenByUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "send": "Wyślij", + "@send": { + "type": "String", + "placeholders": {} + }, + "sendAMessage": "Wyślij wiadomość", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "sendFile": "Wyślij plik", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendImage": "Wyślij obraz", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sentAFile": "📁 {username} wysłał/-a plik", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAnAudio": "🎤 {username} wysłał/-a plik dżwiękowy", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAPicture": "🖼️ {username} wysłał/-a zdjęcie", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentASticker": "😊 {username} wysłał/-a naklejkę", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "🎥 {username} wysłał/-a film", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "setAsCanonicalAlias": "Ustaw jako główny alias", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "setInvitationLink": "Ustaw link z zaproszeniem", + "@setInvitationLink": { + "type": "String", + "placeholders": {} + }, + "setStatus": "Ustaw status", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "settings": "Ustawienia", + "@settings": { + "type": "String", + "placeholders": {} + }, + "share": "Udostępnij", + "@share": { + "type": "String", + "placeholders": {} + }, + "sharedTheLocation": "{username} udostępnił/-a swoją lokalizację", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "showPassword": "Pokaż hasło", + "@showPassword": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "Kod żródłowy", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "statusExampleMessage": "Jak się masz dziś?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWait": "Synchronizowanie… Proszę czekać.", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "systemTheme": "System", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "title": "FluffyChat", + "@title": { + "description": "Title for the application", + "type": "String", + "placeholders": {} + }, + "transferFromAnotherDevice": "Przenieś z innego urządzenia", + "@transferFromAnotherDevice": { + "type": "String", + "placeholders": {} + }, + "tryToSendAgain": "Spróbuj wysłać ponownie", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username} odbanował/-a {targetName}", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "unknownDevice": "Nieznane urządzenie", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "unknownEncryptionAlgorithm": "Nieznany algorytm szyfrowania", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unknownEvent": "Nieznane zdarzenie '{type}'", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "unmuteChat": "Wyłącz wyciszenie", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "unpin": "Odepnij", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "unreadChats": "{unreadCount, plural, =1{1 unread chat} other{{unreadCount} unread chats}}", + "@unreadChats": { + "type": "String", + "placeholders": { + "unreadCount": { + "type": "int" + } + } + }, + "userAndOthersAreTyping": "{username} oraz {count} pozostałych pisze…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "userAndUserAreTyping": "{username} i {username2} piszą…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userIsTyping": "{username} pisze…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userLeftTheChat": "🚪 {username} opuścił/-a czat", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "username": "Nazwa użytkownika", + "@username": { + "type": "String", + "placeholders": {} + }, + "userSentUnknownEvent": "{username} wysłał/-a zdarzenie {type}", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "verified": "Zweryfikowane", + "@verified": { + "type": "String", + "placeholders": {} + }, + "verify": "zweryfikuj", + "@verify": { + "type": "String", + "placeholders": {} + }, + "videoCall": "Rozmowa wideo", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "Widoczność historii czatu", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "Widoczny dla wszystkich użytkowników", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "Widoczne dla każdego", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "Wiadomość głosowa", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "wallpaper": "Tapeta:", + "@wallpaper": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "Kto może dołączyć do tej grupy", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "Napisz wiadomość…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "yes": "Tak", + "@yes": { + "type": "String", + "placeholders": {} + }, + "you": "Ty", + "@you": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "Nie uczestniczysz już w tym czacie", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "Zostałeś/-aś zbanowany/-a w tym czacie", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "allChats": "Wszystkie", + "@allChats": { + "type": "String", + "placeholders": {} + }, + "ignore": "Ignoruj", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "Brak połączenia z serwerem", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "obtainingLocation": "Uzyskiwanie lokalizacji…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "addAccount": "Dodaj konto", + "@addAccount": {}, + "serverRequiresEmail": "Ten serwer wymaga potwierdzenia Twojego adresu email w celu rejestracji.", + "@serverRequiresEmail": {}, + "or": "Lub", + "@or": { + "type": "String", + "placeholders": {} + }, + "participant": "Uczestnik", + "@participant": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "Nie pamiętam hasła", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "pleaseChoose": "Proszę wybrać", + "@pleaseChoose": { + "type": "String", + "placeholders": {} + }, + "pleaseClickOnLink": "Proszę kliknij w odnośnik wysłany w wiadomości e-mail, aby kontynuować.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "pleaseEnter4Digits": "Proszę podaj 4 cyfry. By wyłączyć blokadę pozostaw puste.", + "@pleaseEnter4Digits": { + "type": "String", + "placeholders": {} + }, + "removeYourAvatar": "Usuń swoje zdjęcie", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "renderRichContent": "Pokazuj w wiadomościach pogrubienia i podkreślenia", + "@renderRichContent": { + "type": "String", + "placeholders": {} + }, + "replaceRoomWithNewerVersion": "Zamień pokój na nowszą wersję", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "Zgłoś wiadomość", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "saveFile": "Zapisz plik", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "security": "Bezpieczeństwo", + "@security": { + "type": "String", + "placeholders": {} + }, + "search": "Szukaj", + "@search": { + "type": "String", + "placeholders": {} + }, + "sendAsText": "Wyślij jako tekst", + "@sendAsText": { + "type": "String" + }, + "sendAudio": "Wyślij dźwięk", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendMessages": "Wyślij wiadomości", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "sendOriginal": "Wyślij oryginał", + "@sendOriginal": { + "type": "String", + "placeholders": {} + }, + "sendSticker": "Wyślij naklejkę", + "@sendSticker": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "Wyślij film", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "startedACall": "{senderName} rozpoczął/-ęła rozmowę", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "yourPublicKey": "Twój klucz publiczny", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "enableMultiAccounts": "(BETA) Włącza obsługę wielu kont na tym urządzeniu", + "@enableMultiAccounts": {}, + "pickImage": "Wybierz obraz", + "@pickImage": { + "type": "String", + "placeholders": {} + }, + "passwordRecovery": "Odzyskiwanie hasła", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "openInMaps": "Otwórz w mapach", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "link": "Link", + "@link": {}, + "roomHasBeenUpgraded": "Pokój zostać zaktualizowany", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "repeatPassword": "Powtórz hasło", + "@repeatPassword": {}, + "all": "Wszystkie", + "@all": { + "type": "String", + "placeholders": {} + }, + "appLock": "Blokada aplikacji", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "Zgadzają się", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "sendOnEnter": "Wyślij enterem", + "@sendOnEnter": {}, + "autoplayImages": "Automatycznie odtwarzaj animowane naklejki i emotikony", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "cantOpenUri": "Nie można otworzyć linku {uri}", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "configureChat": "Konfiguruj czat", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "homeserver": "Adres serwera", + "@homeserver": {}, + "locationDisabledNotice": "Usługi lokalizacji są wyłączone. Proszę włącz je aby móc udostępnić swoją lokalizację.", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "oneClientLoggedOut": "Jedno z twoich urządzeń zostało wylogowane", + "@oneClientLoggedOut": {}, + "privacy": "Prywatność", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "Nie zgadzają się", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "toggleFavorite": "Przełącz ulubione", + "@toggleFavorite": { + "type": "String", + "placeholders": {} + }, + "yourChatBackupHasBeenSetUp": "Kopia zapasowa Twojego czatu została ustawiona.", + "@yourChatBackupHasBeenSetUp": {}, + "chatHasBeenAddedToThisSpace": "Czat został dodany do tej przestrzeni", + "@chatHasBeenAddedToThisSpace": {}, + "contentHasBeenReported": "Treść została zgłoszona administratorom serwera", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "Edytuj zdjęcie pokoju", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "fontSize": "Rozmiar fontu", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "groups": "Grupy", + "@groups": { + "type": "String", + "placeholders": {} + }, + "locationPermissionDeniedNotice": "Brak uprawnień. Proszę zezwól aplikacji na dostęp do lokalizacji aby móc ją udostępnić.", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "openVideoCamera": "Nagraj film", + "@openVideoCamera": { + "type": "String", + "placeholders": {} + }, + "messages": "Wiadomości", + "@messages": { + "type": "String", + "placeholders": {} + }, + "offensive": "Obraźliwe", + "@offensive": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPin": "Podaj swój PIN", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "reason": "Powód", + "@reason": { + "type": "String", + "placeholders": {} + }, + "redactMessage": "Usuń wiadomość", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "setCustomEmotes": "Ustaw niestandardowe emotikony", + "@setCustomEmotes": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "Dzięki tym adresom możesz odzyskać swoje hasło.", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "spaceIsPublic": "Ustaw jako publiczną", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "shareLocation": "Udostępnij lokalizację", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "setPermissionsLevel": "Ustaw poziom uprawnień", + "@setPermissionsLevel": { + "type": "String", + "placeholders": {} + }, + "skip": "Pomiń", + "@skip": { + "type": "String", + "placeholders": {} + }, + "spaceName": "Nazwa przestrzeni", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "toggleMuted": "Przełącz wyciszone", + "@toggleMuted": { + "type": "String", + "placeholders": {} + }, + "toggleUnread": "Oznacz przeczytane/nieprzeczytane", + "@toggleUnread": { + "type": "String", + "placeholders": {} + }, + "unavailable": "Niedostępne", + "@unavailable": { + "type": "String", + "placeholders": {} + }, + "publish": "Opublikuj", + "@publish": {}, + "scanQrCode": "Skanuj kod QR", + "@scanQrCode": {}, + "createNewSpace": "Nowa przestrzeń", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "offline": "Offline", + "@offline": { + "type": "String", + "placeholders": {} + }, + "addToSpace": "Dodaj do przestrzeni", + "@addToSpace": {}, + "changeYourAvatar": "Zmień swoje zdjęcie", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "commandHint_clearcache": "Wyczyść pamięć podręczną", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_create": "Stwórz pusty czat\nUżyj --no-encryption by wyłączyć szyfrowanie", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "commandHint_dm": "Rozpocznij czat bezpośredni\nUżyj --no-encryption by wyłączyć szyfrowanie", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "editBlockedServers": "Edytuj zablokowane serwery", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "Włącz szyfowanie", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "Domyślny poziom uprawnień dla nowych użytkowników", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "ok": "Ok", + "@ok": { + "type": "String", + "placeholders": {} + }, + "oopsPushError": "Ojej! Wystąpił błąd podczas ustawiania powiadomień push.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "reject": "Odrzuć", + "@reject": { + "type": "String", + "placeholders": {} + }, + "online": "Online", + "@online": { + "type": "String", + "placeholders": {} + }, + "status": "Status", + "@status": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "Zbyt wiele żądań. Proszę spróbować później.", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "commandHint_discardsession": "Odrzuć sesję", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "warning": "Uwaga!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "messageInfo": "Informacje o wiadomości", + "@messageInfo": {}, + "time": "Czas", + "@time": {}, + "messageType": "Rodzaj wiadomości", + "@messageType": {}, + "separateChatTypes": "Oddzielenie czatów bezpośrednich i grupowych", + "@separateChatTypes": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "Oczekiwanie na zaakceptowanie prośby przez drugą osobę…", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "Oczekiwanie na zaakceptowanie emoji przez drugą osobę…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "pleaseChooseAPasscode": "Wybierz kod dostępu", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "unblockDevice": "Odblokuj urządzenie", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "Dlaczego chcesz to zgłosić?", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "removeFromSpace": "Usuń z przestrzeni", + "@removeFromSpace": {}, + "extremeOffensive": "Bardzo obraźliwe", + "@extremeOffensive": { + "type": "String", + "placeholders": {} + }, + "errorObtainingLocation": "Błąd w ustalaniu lokalizacji: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "howOffensiveIsThisContent": "Jak bardzo obraźliwa jest ta treść?", + "@howOffensiveIsThisContent": { + "type": "String", + "placeholders": {} + }, + "inoffensive": "Nieobraźliwe", + "@inoffensive": { + "type": "String", + "placeholders": {} + }, + "recoveryKey": "Klucz odzyskiwania", + "@recoveryKey": {}, + "recoveryKeyLost": "Utracono klucz odzyskiwania?", + "@recoveryKeyLost": {}, + "sentCallInformations": "{senderName} wysłał/-a informacje o połączeniu", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "singlesignon": "Pojedyncze logowanie", + "@singlesignon": { + "type": "String", + "placeholders": {} + }, + "startFirstChat": "Rozpocznij swój pierwszy czat", + "@startFirstChat": {}, + "verifyStart": "Rozpocznij weryfikację", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "Pomyślnie zweryfikowano!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "verifyTitle": "Weryfikowanie innego konta", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "Oczekiwanie na zaakceptowanie numerów przez drugą osobę…", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "sender": "Nadawca", + "@sender": {}, + "openGallery": "Otwórz galerię", + "@openGallery": {}, + "start": "Start", + "@start": {}, + "pleaseEnterRecoveryKeyDescription": "Aby odblokować wcześniejsze wiadomości, wprowadź swój klucz odzyskiwania, który został wygenerowany w poprzedniej sesji. Twój klucz odzyskiwania NIE jest Twoim hasłem.", + "@pleaseEnterRecoveryKeyDescription": {}, + "videoWithSize": "Film ({size})", + "@videoWithSize": { + "type": "String", + "placeholders": { + "size": { + "type": "String" + } + } + }, + "hydrateTorLong": "Czy ostatnio eksportowałeś/-aś swoją sesję na TOR? Szybko ją zaimportuj i kontynuuj rozmowy.", + "@hydrateTorLong": {}, + "dehydrateTorLong": "W przypadku użytkowników sieci TOR zaleca się eksportowanie sesji przed zamknięciem okna.", + "@dehydrateTorLong": {}, + "hydrate": "Przywracanie z pliku kopii zapasowej", + "@hydrate": {}, + "noMatrixServer": "{server1} nie jest serwerem Matriksa, czy chcesz zamiast niego użyć {server2}?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "hydrateTor": "Użytkownicy TOR: Importuj eksport sesji", + "@hydrateTor": {}, + "numUsersTyping": "{count} użytkowników pisze…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "onlineKeyBackupEnabled": "Kopia zapasowa kluczy online jest włączona", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterRecoveryKey": "Wprowadź swój klucz odzyskiwania:", + "@pleaseEnterRecoveryKey": {}, + "submit": "Odeślij", + "@submit": { + "type": "String", + "placeholders": {} + }, + "weSentYouAnEmail": "Wysłaliśmy Ci wiadomość e-mail", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "unverified": "Niezweryfikowane", + "@unverified": {}, + "wipeChatBackup": "Wymazać kopię zapasową czatu, aby utworzyć nowy klucz odzyskiwania?", + "@wipeChatBackup": { + "type": "String", + "placeholders": {} + }, + "whoCanPerformWhichAction": "Kto może wykonywać jakie czynności", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "reportUser": "Zgłoś użytkownika", + "@reportUser": {}, + "dismiss": "Odrzuć", + "@dismiss": {}, + "markAsRead": "Oznacz jako przeczytane", + "@markAsRead": {}, + "passphraseOrKey": "fraza dostępu lub klucz odzyskiwania", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "openChat": "Otwórz czat", + "@openChat": {}, + "addToSpaceDescription": "Wybierz przestrzeń, do której ten czat ma być dodany.", + "@addToSpaceDescription": {}, + "supposedMxid": "To powinno być {mxid}", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "commandHint_markasdm": "Oznacz jako pokój wiadomości bezpośrednich dla podanego Matrix ID", + "@commandHint_markasdm": {}, + "confirmMatrixId": "Potwierdź swój identyfikator Matrix w celu usunięcia konta.", + "@confirmMatrixId": {}, + "commandHint_markasgroup": "Oznacz jako grupę", + "@commandHint_markasgroup": {}, + "noEmotesFound": "Nie znaleziono żadnych emotikonów. 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "dehydrate": "Eksportuj sesję i wymaż urządzenie", + "@dehydrate": {}, + "dehydrateWarning": "Tego nie można cofnąć. Upewnij się, że plik kopii zapasowej jest bezpiecznie przechowywany.", + "@dehydrateWarning": {}, + "dehydrateTor": "Użytkownicy TOR: Eksportuj sesję", + "@dehydrateTor": {}, + "unsupportedAndroidVersion": "Nieobsługiwana wersja systemu Android", + "@unsupportedAndroidVersion": {}, + "widgetCustom": "Własny", + "@widgetCustom": {}, + "widgetEtherpad": "Notatka", + "@widgetEtherpad": {}, + "widgetJitsi": "Jitsi Meet", + "@widgetJitsi": {}, + "pinMessage": "Przypnij do pokoju", + "@pinMessage": {}, + "confirmEventUnpin": "Czy na pewno chcesz trwale odpiąć wydarzenie?", + "@confirmEventUnpin": {}, + "youJoinedTheChat": "Dołączono do czatu", + "@youJoinedTheChat": {}, + "user": "Użytkownik", + "@user": {}, + "custom": "Własne", + "@custom": {}, + "newGroup": "Nowa grupa", + "@newGroup": {}, + "newSpace": "Nowa przestrzeń", + "@newSpace": {}, + "fileIsTooBigForServer": "Nie udało się wysłać! Ten serwer obsługuje załączniki o maksymalnej wielkości {max}.", + "@fileIsTooBigForServer": {}, + "youBannedUser": "Zbanowałeś/-aś {user}", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "users": "Użytkownicy", + "@users": {}, + "countFiles": "{count} plików", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "noOtherDevicesFound": "Nie znaleziono innych urządzeń", + "@noOtherDevicesFound": {}, + "widgetUrlError": "Niepoprawny URL.", + "@widgetUrlError": {}, + "widgetNameError": "Podaj nazwę wyświetlaną.", + "@widgetNameError": {}, + "encryptThisChat": "Zaszyfruj ten czat", + "@encryptThisChat": {}, + "disableEncryptionWarning": "Ze względów bezpieczeństwa nie można wyłączyć szyfrowania w czacie, w którym zostało ono wcześniej włączone.", + "@disableEncryptionWarning": {}, + "deviceKeys": "Klucze urządzenia:", + "@deviceKeys": {}, + "emailOrUsername": "Adres e-mail lub nazwa użytkownika", + "@emailOrUsername": {}, + "indexedDbErrorLong": "Przechowywanie wiadomości niestety nie jest domyślnie włączone w trybie prywatnym.\nOdwiedź\n - about:config\n - ustaw dom.indexedDB.privateBrowsing.enabled na true\nW przeciwnym razie nie jest możliwe uruchomienie FluffyChat.", + "@indexedDbErrorLong": {}, + "saveKeyManuallyDescription": "Zapisz ten klucz ręcznie, uruchamiając systemowe okno dialogowe udostępniania lub schowek.", + "@saveKeyManuallyDescription": {}, + "screenSharingTitle": "udostępnianie ekranu", + "@screenSharingTitle": {}, + "appearOnTopDetails": "Umożliwia wyświetlanie aplikacji nad innymi (nie jest to konieczne, jeśli FluffyChat jest już ustawiony jako konto do dzwonienia)", + "@appearOnTopDetails": {}, + "noKeyForThisMessage": "Może się to zdarzyć, jeśli wiadomość została wysłana przed zalogowaniem się na to konto na tym urządzeniu.\n\nMożliwe jest również, że nadawca zablokował Twoje urządzenie lub coś poszło nie tak z połączeniem internetowym.\n\nJesteś w stanie odczytać wiadomość na innej sesji? W takim razie możesz przenieść z niej wiadomość! Wejdź w Ustawienia > Urządzenia i upewnij się, że Twoje urządzenia zweryfikowały się wzajemnie. Gdy następnym razem otworzysz pokój i obie sesje będą włączone, klucze zostaną przekazane automatycznie.\n\nNie chcesz stracić kluczy podczas wylogowania lub przełączania urządzeń? Upewnij się, że w ustawieniach masz włączoną kopię zapasową czatu.", + "@noKeyForThisMessage": {}, + "sorryThatsNotPossible": "Przepraszamy... to nie jest możliwe", + "@sorryThatsNotPossible": {}, + "noBackupWarning": "Uwaga! Bez włączenia kopii zapasowej czatu, stracisz dostęp do swoich zaszyfrowanych wiadomości. Zaleca się włączenie kopii zapasowej czatu przed wylogowaniem.", + "@noBackupWarning": {}, + "commandHint_googly": "Wyślij kręcące się oczka", + "@commandHint_googly": {}, + "callingPermissions": "Uprawnienia połączeń", + "@callingPermissions": {}, + "storeInAndroidKeystore": "Przechowaj w Android KeyStore", + "@storeInAndroidKeystore": {}, + "commandHint_cuddle": "Wyślij przytulenie", + "@commandHint_cuddle": {}, + "googlyEyesContent": "{senderName} wysyła ci kręcące się oczka", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "cuddleContent": "{senderName} przytula cię", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "hugContent": "{senderName} uściska cię", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "commandHint_hug": "Wyślij uścisk", + "@commandHint_hug": {}, + "reactedWith": "{sender} zareagował/-a z {reaction}", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "emojis": "Emoji", + "@emojis": {}, + "placeCall": "Zadzwoń", + "@placeCall": {}, + "voiceCall": "Połączenie głosowe", + "@voiceCall": {}, + "unsupportedAndroidVersionLong": "Ta funkcja wymaga nowszej wersji systemu Android. Sprawdź aktualizacje lub wsparcie Lineage OS.", + "@unsupportedAndroidVersionLong": {}, + "videoCallsBetaWarning": "Należy pamiętać, że połączenia wideo są obecnie w fazie beta. Mogą nie działać zgodnie z oczekiwaniami lub nie działać w ogóle na wszystkich platformach.", + "@videoCallsBetaWarning": {}, + "experimentalVideoCalls": "Eksperymentalne połączenia wideo", + "@experimentalVideoCalls": {}, + "indexedDbErrorTitle": "Problemy związane z trybem prywatnym", + "@indexedDbErrorTitle": {}, + "switchToAccount": "Przełącz na konto {number}", + "@switchToAccount": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "nextAccount": "Następne konto", + "@nextAccount": {}, + "previousAccount": "Poprzednie konto", + "@previousAccount": {}, + "addWidget": "Dodaj widżet", + "@addWidget": {}, + "widgetVideo": "Film", + "@widgetVideo": {}, + "widgetName": "Nazwa", + "@widgetName": {}, + "errorAddingWidget": "Błąd podczas dodawania widżetu.", + "@errorAddingWidget": {}, + "youRejectedTheInvitation": "Odrzucono zaproszenie", + "@youRejectedTheInvitation": {}, + "youAcceptedTheInvitation": "👍 Zaakceptowałeś/-aś zaproszenie", + "@youAcceptedTheInvitation": {}, + "youHaveWithdrawnTheInvitationFor": "Wycofano zaproszenie dla {user}", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedBy": "📩 Zostałeś/-aś zaproszony/-a przez {user}", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedUser": "📩 Zaprosiłeś/-aś {user}", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKicked": "👞 Wyrzuciłeś/-aś {user}", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKickedAndBanned": "🙅 Wyrzuciłeś/-aś i zbanowałeś/-aś {user}", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youUnbannedUser": "Odbanowałeś/-aś {user}", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "unlockOldMessages": "Odblokuj stare wiadomości", + "@unlockOldMessages": {}, + "storeInSecureStorageDescription": "Przechowaj klucz odzyskiwania w bezpiecznym magazynie tego urządzenia.", + "@storeInSecureStorageDescription": {}, + "storeInAppleKeyChain": "Przechowaj w pęku kluczy Apple", + "@storeInAppleKeyChain": {}, + "storeSecurlyOnThisDevice": "Przechowaj bezpiecznie na tym urządzeniu", + "@storeSecurlyOnThisDevice": {}, + "foregroundServiceRunning": "To powiadomienie pojawia się, gdy usługa w tle jest uruchomiona.", + "@foregroundServiceRunning": {}, + "screenSharingDetail": "Udostępniasz swój ekran w FluffyChat", + "@screenSharingDetail": {}, + "callingAccount": "Konto połączeń", + "@callingAccount": {}, + "callingAccountDetails": "Pozwala FluffyChat używać natywnej aplikacji do wykonywania połączeń w Androidzie.", + "@callingAccountDetails": {}, + "appearOnTop": "Wyświetlaj nad innymi", + "@appearOnTop": {}, + "otherCallingPermissions": "Mikrofon, kamera i inne uprawnienia FluffyChat", + "@otherCallingPermissions": {}, + "whyIsThisMessageEncrypted": "Dlaczego nie można odczytać tej wiadomości?", + "@whyIsThisMessageEncrypted": {}, + "enterSpace": "Wejdź do przestrzeni", + "@enterSpace": {}, + "enterRoom": "Wejdź do pokoju", + "@enterRoom": {}, + "allSpaces": "Wszystkie przestrzenie", + "@allSpaces": {}, + "numChats": "{number} czatów", + "@numChats": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "hideUnimportantStateEvents": "Ukryj nieistotne wydarzenia stanu", + "@hideUnimportantStateEvents": {}, + "doNotShowAgain": "Nie pokazuj ponownie", + "@doNotShowAgain": {}, + "wasDirectChatDisplayName": "Pusty czat (wcześniej {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "newSpaceDescription": "Przestrzenie pozwalają na konsolidację czatów i budowanie prywatnych lub publicznych społeczności.", + "@newSpaceDescription": {}, + "reopenChat": "Otwórz ponownie czat", + "@reopenChat": {}, + "fileHasBeenSavedAt": "Plik został zapisany w ścieżce {path}", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "addToBundle": "Dodaj do pakietu", + "@addToBundle": {}, + "bundleName": "Nazwa pakietu", + "@bundleName": {}, + "editBundlesForAccount": "Edytuj pakiety dla tego konta", + "@editBundlesForAccount": {}, + "jumpToLastReadMessage": "Przejdź do ostatnio przeczytanej wiadomości", + "@jumpToLastReadMessage": {}, + "readUpToHere": "Czytaj do tego miejsca", + "@readUpToHere": {}, + "jump": "Przejdź", + "@jump": {}, + "removeFromBundle": "Usuń z tego pakietu", + "@removeFromBundle": {}, + "openLinkInBrowser": "Otwórz link w przeglądarce", + "@openLinkInBrowser": {}, + "allRooms": "Wszystkie czaty grupowe", + "@allRooms": { + "type": "String", + "placeholders": {} + }, + "reportErrorDescription": "😭 O nie! Coś poszło nie tak. Spróbuj ponownie później. Jeśli chcesz, możesz zgłosić ten błąd autorom programu.", + "@reportErrorDescription": {}, + "setColorTheme": "Ustal styl kolorów:", + "@setColorTheme": {}, + "tryAgain": "Spróbuj ponownie", + "@tryAgain": {}, + "messagesStyle": "Wiadomości:", + "@messagesStyle": {}, + "chatDescription": "Opis czatu", + "@chatDescription": {}, + "invalidServerName": "Nieprawidłowa nazwa serwera", + "@invalidServerName": {}, + "chatPermissions": "Uprawnienia w czacie", + "@chatPermissions": {}, + "signInWithPassword": "Zaloguj się z hasłem", + "@signInWithPassword": {}, + "setChatDescription": "Ustaw opis czatu", + "@setChatDescription": {}, + "importFromZipFile": "Zaimportuj z pliku .zip", + "@importFromZipFile": {}, + "redactedBy": "Usunięte przez {username}", + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "signInWith": "Zaloguj się z {provider}", + "@signInWith": { + "type": "String", + "placeholders": { + "provider": { + "type": "String" + } + } + }, + "optionalRedactReason": "(Opcjonalnie) Powód usunięcia tej wiadomości...", + "@optionalRedactReason": {}, + "exportEmotePack": "Eksportuj pakiet emotikonów jako .zip", + "@exportEmotePack": {}, + "inviteContactToGroupQuestion": "Czy chcesz zaprosić {contact} do czatu „{groupName}”?", + "@inviteContactToGroupQuestion": {}, + "redactedByBecause": "Usunięte przez {username} z powodu „{reason}”", + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "redactMessageDescription": "Wiadomość zostanie usunięta u wszystkich uczestników tej rozmowy. Tego nie można cofnąć.", + "@redactMessageDescription": {}, + "invalidInput": "Nieprawidłowe dane!", + "@invalidInput": {}, + "report": "zgłoś", + "@report": {}, + "addChatDescription": "Dodaj opis tego czatu...", + "@addChatDescription": {}, + "directChat": "Czat bezpośredni", + "@directChat": {}, + "wrongPinEntered": "Wprowadzono nieprawidłowy kod PIN! Spróbuj ponownie za {seconds} sekund...", + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "sendTypingNotifications": "Wysyłaj powiadomienie o pisaniu", + "@sendTypingNotifications": {}, + "inviteGroupChat": "📨 Zaproszenie do rozmowy grupowej", + "@inviteGroupChat": {}, + "invitePrivateChat": "📨 Zaproszenie do rozmowy prywatnej", + "@invitePrivateChat": {}, + "importEmojis": "Zaimportuj emotikony", + "@importEmojis": {}, + "noChatDescriptionYet": "Nie utworzono jeszcze opisu czatu.", + "@noChatDescriptionYet": {}, + "notAnImage": "To nie jest plik obrazu.", + "@notAnImage": {}, + "chatDescriptionHasBeenChanged": "Zmieniono opis czatu", + "@chatDescriptionHasBeenChanged": {}, + "profileNotFound": "Nie można odnaleźć użytkownika na serwerze. Być może wystąpił problem z połączeniem lub użytkownik nie istnieje.", + "@profileNotFound": {}, + "shareInviteLink": "Udostępnij link z zaproszeniem", + "@shareInviteLink": {}, + "emoteKeyboardNoRecents": "Tutaj pojawiają się ostatnio używane emotikony...", + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "setTheme": "Ustaw wygląd:", + "@setTheme": {}, + "replace": "Zastąp", + "@replace": {}, + "pleaseTryAgainLaterOrChooseDifferentServer": "Spróbuj ponownie później lub wybierz inny serwer.", + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "createGroup": "Utwórz grupę", + "@createGroup": {}, + "importNow": "Zaimportuj", + "@importNow": {}, + "invite": "Zaproszenie", + "@invite": {}, + "block": "Zablokuj", + "@block": {}, + "blockedUsers": "Zablokowani użytkownicy", + "@blockedUsers": {}, + "blockUsername": "Ignoruj użytkownika", + "@blockUsername": {}, + "publicLink": "Link publiczny", + "@publicLink": {}, + "transparent": "Przezroczystość", + "@transparent": {}, + "select": "Zaznacz", + "@select": {}, + "calls": "Połączenia", + "@calls": {}, + "overview": "Podsumowanie", + "@overview": {}, + "learnMore": "Dowiedz się więcej", + "@learnMore": {}, + "groupName": "Nazwa grupy", + "@groupName": {}, + "startConversation": "Rozpocznij rozmowę", + "@startConversation": {}, + "newPassword": "Nowe hasło", + "@newPassword": {}, + "thisDevice": "To urządzenie:", + "@thisDevice": {}, + "gallery": "Galeria", + "@gallery": {}, + "files": "Pliki", + "@files": {}, + "discover": "Odkrywaj", + "@discover": {}, + "restricted": "Ograniczone", + "@restricted": {}, + "decline": "Odmów", + "@decline": {}, + "nothingFound": "Nic nie odnaleziono...", + "@nothingFound": {}, + "stickers": "Naklejki", + "@stickers": {}, + "noChatsFoundHere": "Nie jeszcze ma żadnych czatów. Wciśnij poniższy przycisk, aby rozpocząć nowy czat. ⤵️", + "@noChatsFoundHere": {}, + "hideRedactedMessagesBody": "Usunięte wiadomości nie będą widoczne w czacie.", + "@hideRedactedMessagesBody": {}, + "hideMemberChangesInPublicChats": "Ukryj zmiany członkostwa w publicznych czatach", + "@hideMemberChangesInPublicChats": {}, + "passwordRecoverySettings": "Ustawienia odzyskiwania hasła", + "@passwordRecoverySettings": {}, + "hideMemberChangesInPublicChatsBody": "W celu poprawienia czytelności, nie pokazuj w historii publicznego czatu, czy ktoś do niego dołączył lub go opuścił.", + "@hideMemberChangesInPublicChatsBody": {}, + "presenceStyle": "Obecność:", + "@presenceStyle": { + "type": "String", + "placeholders": {} + }, + "invitedBy": "Zaproszony/-a przez {user}", + "@invitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "archiveRoomDescription": "Czat zostanie przeniesiony do archiwum. Pozostali użytkownicy będą mogli zobaczyć, że opuściłeś/-aś czat.", + "@archiveRoomDescription": {}, + "yourGlobalUserIdIs": "Twój globalny identyfikator to: ", + "@yourGlobalUserIdIs": {}, + "canceledKeyVerification": "{sender} anulował/-a weryfikację kluczy", + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "isReadyForKeyVerification": "{sender} jest gotowy/-a do weryfikacji kluczy", + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "commandHint_ignore": "Ignoruj podany identyfikator Matrix", + "@commandHint_ignore": {}, + "commandHint_unignore": "Przestań ignorować podany identyfikator Matrix", + "@commandHint_unignore": {}, + "changeTheChatPermissions": "Zmień uprawnienia w czacie", + "@changeTheChatPermissions": {}, + "changelog": "Lista zmian", + "@changelog": {}, + "inviteOtherUsers": "Zaproś innych użytkowników do tego czatu", + "@inviteOtherUsers": {}, + "blockListDescription": "Możesz zablokować uciążliwych użytkowników. Nie będziesz widzieć ani otrzymywać wiadomości oraz zaproszeń od nich.", + "@blockListDescription": {}, + "formattedMessages": "Sformatowane wiadomości", + "@formattedMessages": {}, + "banUserDescription": "Użytkownik zostanie zbanowany w czacie i nie będzie w stanie dołączyć do czatu do momentu odbanowania.", + "@banUserDescription": {}, + "subspace": "Podprzestrzeń", + "@subspace": {}, + "sendReadReceipts": "Wysyłaj powiadomienia o przeczytaniu wiadomości", + "@sendReadReceipts": {}, + "verifyOtherDevice": "🔐 Zweryfikuj inne urządzenie", + "@verifyOtherDevice": {}, + "prepareSendingAttachment": "Przygotuj wysyłanie załącznika...", + "@prepareSendingAttachment": {}, + "acceptedKeyVerification": "{sender} zaakceptował/-a weryfikację kluczy", + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "databaseMigrationTitle": "Baza danych jest zoptymalizowana", + "@databaseMigrationTitle": {}, + "hasKnocked": "{user} zapukał-/a", + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "userLevel": "{level} - Użytkownik", + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "changeTheVisibilityOfChatHistory": "Zmień widoczność historii czatu", + "@changeTheVisibilityOfChatHistory": {}, + "sendImages": "Wyślij {count} obrazów", + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "noPublicLinkHasBeenCreatedYet": "Nie utworzono jeszcze żadnego publicznego linku", + "@noPublicLinkHasBeenCreatedYet": {}, + "knock": "Zapukaj", + "@knock": {}, + "databaseBuildErrorBody": "Nie udało się utworzyć bazy danych SQLite. Aplikacja na razie spróbuje korzystać ze starej bazy. Prosimy zgłosić ten błąd autorom aplikacji na {url}. Treść błędu to: {error}", + "@databaseBuildErrorBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "restoreSessionBody": "Aplikacja spróbuje teraz odzyskać Twoją sesję z kopii zapasowej. Prosimy zgłosić ten błąd autorom aplikacji na {url}. Treść błędu to: {error}", + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "startedKeyVerification": "{sender} rozpoczął/-ęła weryfikację kluczy", + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "sendTypingNotificationsDescription": "Pozostali uczestnicy czatu mogą widzieć kiedy piszesz nową wiadomość.", + "@sendTypingNotificationsDescription": {}, + "sendReadReceiptsDescription": "Pozostali uczestnicy czatu mogą widzieć zobaczyć kiedy przeczytasz wiadomość.", + "@sendReadReceiptsDescription": {}, + "noDatabaseEncryption": "Szyfrowanie bazy danych nie jest obsługiwane na tej platformie", + "@noDatabaseEncryption": {}, + "thereAreCountUsersBlocked": "Obecnie jest {count} zablokowanych użytkowników.", + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "goToSpace": "Przejdź do przestrzeni {space}", + "@goToSpace": { + "type": "String", + "space": {} + }, + "markAsUnread": "Oznacz jako nieprzeczytane", + "@markAsUnread": {}, + "moderatorLevel": "{level} - Moderator", + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "adminLevel": "{level} - Administrator", + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "sendRoomNotifications": "Wysyłaj powiadomienia @room", + "@sendRoomNotifications": {}, + "chatPermissionsDescription": "Ustal jaki poziom uprawnień jest wymagany dla określonych czynności w czacie. Poziomy uprawnień 0, 50 i 100 zwykle dotyczą odpowiednio użytkowników, moderatorów i administratorów, ale możliwa jest dowolna gradacja.", + "@chatPermissionsDescription": {}, + "changeTheCanonicalRoomAlias": "Zmień główny publiczny czatu", + "@changeTheCanonicalRoomAlias": {}, + "changeTheDescriptionOfTheGroup": "Zmień opis czatu", + "@changeTheDescriptionOfTheGroup": {}, + "sendCanceled": "Anulowano wysyłanie", + "@sendCanceled": {}, + "homeserverDescription": "Wszystkie Twoje dane trzymane są na serwerze domowym, jak u dostawców usług e-mail. Możesz wybrać swój serwer domowy i nadal rozmawiać ze wszystkimi. Dowiedz się więcej na https://matrix.org.", + "@homeserverDescription": {}, + "doesNotSeemToBeAValidHomeserver": "Wydaje się nie być kompatybilnym serwerem domowym. Niepoprawny adres URL?", + "@doesNotSeemToBeAValidHomeserver": {}, + "calculatingFileSize": "Obliczanie rozmiaru pliku...", + "@calculatingFileSize": {}, + "sendingAttachment": "Wysyłanie załącznika...", + "@sendingAttachment": {}, + "generatingVideoThumbnail": "Generowanie podglądu filmu...", + "@generatingVideoThumbnail": {}, + "compressVideo": "Kompresowanie filmu...", + "@compressVideo": {}, + "sendingAttachmentCountOfCount": "Wysyłanie {index} z {length} części załącznika...", + "@sendingAttachmentCountOfCount": { + "type": "integer", + "placeholders": { + "index": { + "type": "int" + }, + "length": { + "type": "int" + } + } + }, + "welcomeText": "No cześć! 👋 Tutaj FluffyChat. Możesz zapisać się do dowolnego serwera domowego, kompatybilnego z https://matrix.org i rozmawiać ze wszystkimi. To duża zdecentralizowana sieć czatów!", + "@welcomeText": {}, + "blur": "Rozmazanie:", + "@blur": {}, + "opacity": "Przezroczystość:", + "@opacity": {}, + "setWallpaper": "Ustaw tapetę", + "@setWallpaper": {}, + "manageAccount": "Zarządzaj kontem", + "@manageAccount": {}, + "noContactInformationProvided": "Serwer nie dostarcza żadnych poprawnych danych kontaktowych", + "@noContactInformationProvided": {}, + "contactServerAdmin": "Skontaktuj się z administratorem serwera", + "@contactServerAdmin": {}, + "compress": "Skompresuj", + "@compress": {}, + "pleaseFillOut": "Proszę wypełnić", + "@pleaseFillOut": {}, + "invalidUrl": "Niepoprawny adres URL", + "@invalidUrl": {}, + "unableToJoinChat": "Nie udało się dołączyć do czatu. Może druga strona zakończyła już rozmowę?", + "@unableToJoinChat": {}, + "aboutHomeserver": "O {homeserver}", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "updateInstalled": "🎉 Zainstalowano aktualizację do wersji {version}!", + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "continueText": "Kontynuuj", + "@continueText": {}, + "noticeChatBackupDeviceVerification": "Uwaga: Urządzenia dodane do kopii zapasowej czatu automatycznie zostają zweryfikowane.", + "@noticeChatBackupDeviceVerification": {}, + "serverLimitReached": "Osiągnięto limit serwera. Czekanie {seconds} sekund...", + "@serverLimitReached": { + "type": "integer", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "oneOfYourDevicesIsNotVerified": "Tylko kiedy Twoje urządzenie nie jest zweryfikowane", + "@oneOfYourDevicesIsNotVerified": {}, + "supportPage": "Strona obsługi użytkownika", + "@supportPage": {}, + "serverInformation": "Informacje o serwerze:", + "@serverInformation": {}, + "name": "Nazwa", + "@name": {}, + "website": "Strona internetowa", + "@website": {}, + "contactServerSecurity": "Skontaktuj się z działem bezpieczeństwa serwera", + "@contactServerSecurity": {}, + "version": "Wersja", + "@version": {}, + "accessAndVisibility": "Dostęp i widoczność", + "@accessAndVisibility": {}, + "customEmojisAndStickers": "Własne emotikony i naklejki", + "@customEmojisAndStickers": {}, + "globalChatId": "Globalny identyfikator czatu", + "@globalChatId": {}, + "accessAndVisibilityDescription": "Kto może dołączyć do tego czatu i w jaki sposób można ten czat znaleźć.", + "@accessAndVisibilityDescription": {}, + "customEmojisAndStickersBody": "Dodaj lub podziel się własnymi emotikonami i naklejkami, które będą mogły być użyte w dowolnym czacie.", + "@customEmojisAndStickersBody": {}, + "hideRedactedMessages": "Nie pokazuj usuniętych wiadomości", + "@hideRedactedMessages": {}, + "hideInvalidOrUnknownMessageFormats": "Ukryj niepoprawne lub nieznane typy wiadomości", + "@hideInvalidOrUnknownMessageFormats": {}, + "notifyMeFor": "Powiadom mnie o", + "@notifyMeFor": {}, + "pushNotificationsNotAvailable": "Powiadomienia push nie są dostępne", + "@pushNotificationsNotAvailable": {}, + "noUsersFoundWithQuery": "Niestety nie udało się nikogo znaleźć poprzez \"{query}\". Proszę sprawdzić, czy w zapytaniu nie ma literówek.", + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "chatCanBeDiscoveredViaSearchOnServer": "Czat będzie można znaleźć, szukając na {server}", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "publicSpaces": "Przestrzenie publiczne", + "@publicSpaces": {}, + "searchMore": "Szukaj dalej...", + "@searchMore": {}, + "formattedMessagesDescription": "Używaj Markdown do wyświetlania dodatkowego formatowania w wiadomościach, jak np. pogrubienie tekstu.", + "@formattedMessagesDescription": {}, + "verifyOtherUser": "🔐 Zweryfikuj innego użytkownika", + "@verifyOtherUser": {}, + "knockRestricted": "Pukanie jest ograniczone", + "@knockRestricted": {}, + "appLockDescription": "Zablokuj aplikację pinem kiedy nie jest używana", + "@appLockDescription": {}, + "knocking": "Pukanie", + "@knocking": {}, + "pleaseChooseAStrongPassword": "Proszę wybrać silne hasło", + "@pleaseChooseAStrongPassword": {}, + "usersMustKnock": "Użytkownicy muszą zapukać", + "@usersMustKnock": {}, + "noOneCanJoin": "Nikt nie może dołączyć", + "@noOneCanJoin": {}, + "alwaysUse24HourFormat": "false", + "@alwaysUse24HourFormat": { + "description": "Set to true to always display time of day in 24 hour format." + }, + "swipeRightToLeftToReply": "Przeciągnij w lewo, by odpowiedzieć", + "@swipeRightToLeftToReply": {}, + "presencesToggle": "Pokazuj zmiany statusów innych użytkowników", + "@presencesToggle": { + "type": "String", + "placeholders": {} + }, + "hidePresences": "Ukryć listę statusów?", + "@hidePresences": {}, + "pleaseEnterANumber": "Proszę podać liczbę większą od 0", + "@pleaseEnterANumber": {}, + "commandHint_sendraw": "Wyślij zwykły JSON", + "@commandHint_sendraw": {}, + "databaseMigrationBody": "Proszę czekać. Może to potrwać chwilę.", + "@databaseMigrationBody": {}, + "leaveEmptyToClearStatus": "Pozostaw puste, aby wyczyścić swój status.", + "@leaveEmptyToClearStatus": {}, + "sessionLostBody": "Twoja sesja została utracona. Prosimy zgłosić ten błąd autorom aplikacji na {url}. Treść błędu to: {error}", + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "forwardMessageTo": "Przekazać wiadomość do {roomName}?", + "@forwardMessageTo": { + "type": "String", + "placeholders": { + "roomName": { + "type": "String" + } + } + }, + "publicChatAddresses": "Adresy publicznych czatów", + "@publicChatAddresses": {}, + "createNewAddress": "Utwórz nowy adres", + "@createNewAddress": {}, + "userRole": "Rola użytkownika/-czki", + "@userRole": {}, + "completedKeyVerification": "{sender} zakończył/-a weryfikację kluczy", + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "italicText": "Kursywa", + "@italicText": {}, + "boldText": "Pogrubienie", + "@boldText": {}, + "strikeThrough": "Przekreślenie", + "@strikeThrough": {}, + "incomingMessages": "Wiadomości przychodzące", + "@incomingMessages": {}, + "discoverHomeservers": "Odkrywaj serwery domowe", + "@discoverHomeservers": {}, + "whatIsAHomeserver": "Czym jest serwer domowy?", + "@whatIsAHomeserver": {}, + "loginWithMatrixId": "Zaloguj się identyfikatorem Matrix", + "@loginWithMatrixId": {}, + "passwordsDoNotMatch": "Hasła się nie zgadzają", + "@passwordsDoNotMatch": {}, + "unbanUserDescription": "Użytkownik będzie w stanie dołączyć do czatu ponownie.", + "@unbanUserDescription": {}, + "roomUpgradeDescription": "Czat zostanie przeniesiony do pokoju w nowej wersji. Wszyscy użytkownicy zostaną powiadomieni o konieczności dołączenia do nowego czatu. Możesz dowiedzieć się więcej o wersjach pokojów na https://spec.matrix.org/latest/rooms/", + "@roomUpgradeDescription": {}, + "userWouldLikeToChangeTheChat": "{user} chce dołączyć do czatu.", + "@userWouldLikeToChangeTheChat": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "requestedKeyVerification": "{sender} poprosił/-a o weryfikację kluczy", + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "changeGeneralChatSettings": "Zmień ogólne ustawienia czatu", + "@changeGeneralChatSettings": {}, + "youInvitedToBy": "Otrzymałeś/-aś link z zaproszeniem do:\n{alias}", + "@youInvitedToBy": { + "placeholders": { + "alias": { + "type": "String" + } + } + }, + "verifyOtherUserDescription": "Jeśli zweryfikujesz innego użytkownika, możesz być pewien/-na z kim naprawdę piszesz. 💪\n\nKiedy rozpoczniesz weryfikację, Ty i ta druga osoba zobaczycie okienko dialogowe. Zobaczycie w nim serię emotikonów lub numery do porównania.\n\nNajlepiej potwierdzić ich zgodność osobiście lub przez wideorozmowę. 👭", + "@verifyOtherUserDescription": {}, + "verifyOtherDeviceDescription": "Jeśli zweryfikujesz inne urządzenie, będzie mogło ono wymienić klucze z dotychczasowym, zwiększając ogólne bezpieczeństwo. 💪 Kiedy rozpoczniesz weryfikację, na obu urządzeniach wyświetli się okno dialogowe. Zobaczysz w nim serię emotikonów lub numery do porównania. Najlepiej mieć oba urządzenia pod ręką przed rozpoczęciem weryfikacji. 🤳", + "@verifyOtherDeviceDescription": {}, + "unreadChatsInApp": "{appname}: {unread} nieprzeczytanych czatów", + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "addLink": "Dodaj link", + "@addLink": {}, + "unread": "Nieprzeczytane", + "@unread": {}, + "space": "Przestrzeń", + "@space": {}, + "spaces": "Przestrzenie", + "@spaces": {}, + "countChatsAndCountParticipants": "{participants}{chats} czatów i {participants} uczestników", + "@countChatsAndCountParticipants": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + }, + "participants": { + "type": "int" + } + } + }, + "noMoreChatsFound": "Nie znaleziono więcej czatów...", + "@noMoreChatsFound": {}, + "joinedChats": "Czaty, do których dołączono", + "@joinedChats": {}, + "removeDevicesDescription": "Nastąpi wylogowanie z tego urządzenia. Nie będziesz w stanie odbierać na nim wiadomości.", + "@removeDevicesDescription": {}, + "makeAdminDescription": "Kiedy użytkownik zostanie adminem, nie będziesz móc tego cofnąć, bo nabierze takich samych uprawnień, jak Ty.", + "@makeAdminDescription": {}, + "searchChatsRooms": "Szukaj #czatów, @użytkowników...", + "@searchChatsRooms": {}, + "createGroupAndInviteUsers": "Utwórz grupę i zaproś użytkowników", + "@createGroupAndInviteUsers": {}, + "groupCanBeFoundViaSearch": "Grupa może być znaleziona poprzez wyszukiwanie", + "@groupCanBeFoundViaSearch": {}, + "wrongRecoveryKey": "Niestety to nie wygląda na poprawny klucz odzyskiwania.", + "@wrongRecoveryKey": {}, + "searchForUsers": "Szukaj @użytkowników...", + "@searchForUsers": {}, + "pleaseEnterYourCurrentPassword": "Proszę podać swoje obecne hasło", + "@pleaseEnterYourCurrentPassword": {}, + "passwordIsWrong": "Podano niepoprawne hasło", + "@passwordIsWrong": {}, + "joinSpace": "Dołącz do przestrzeni", + "@joinSpace": {}, + "addChatOrSubSpace": "Dodaj czat lub podprzestrzeń", + "@addChatOrSubSpace": {}, + "initAppError": "Wystąpił błąd podczas inicjalizacji aplikacji", + "@initAppError": {}, + "minimumPowerLevel": "{level} jest minimalnym poziomem uprawnień.", + "@minimumPowerLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "String" + } + } + }, + "searchIn": "Szukaj w czacie \"{chat}\"...", + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "kickUserDescription": "Użytkownik jest wyrzucony z czatu, ale nie zbanowany. Do czatu publicznego może dołączyć ponownie.", + "@kickUserDescription": {}, + "appWantsToUseForLogin": "Użyj serwera '{server}' do zalogowania się", + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "appWantsToUseForLoginDescription": "Niniejszym zezwalasz aplikacji i witrynie na udostępnianie informacji o sobie.", + "@appWantsToUseForLoginDescription": {}, + "open": "Otwórz", + "@open": {}, + "contentNotificationSettings": "Ustawienia powiadomień o treści", + "@contentNotificationSettings": {}, + "generalNotificationSettings": "Ogólne ustawienia powiadomień", + "@generalNotificationSettings": {}, + "roomNotificationSettings": "Ustawienia powiadomień w pokoju", + "@roomNotificationSettings": {}, + "userSpecificNotificationSettings": "Ustawienia powiadomień dla użytkownika", + "@userSpecificNotificationSettings": {}, + "otherNotificationSettings": "Inne ustawienia powiadomień", + "@otherNotificationSettings": {}, + "notificationRuleContainsUserName": "Zawiera nazwę użytkownika", + "@notificationRuleContainsUserName": {}, + "notificationRuleContainsUserNameDescription": "Powiadamia użytkownika kiedy wiadomość zawiera jego nazwę.", + "@notificationRuleContainsUserNameDescription": {}, + "notificationRuleMaster": "Wycisz wszystkie powiadomienia", + "@notificationRuleMaster": {}, + "notificationRuleMasterDescription": "Zastępuje wszystkie inne reguły i wyłącza wszystkie powiadomienia.", + "@notificationRuleMasterDescription": {}, + "notificationRuleSuppressNotices": "Stłum automatyczne wiadomości", + "@notificationRuleSuppressNotices": {}, + "notificationRuleSuppressNoticesDescription": "Tłumi powiadomienia z automatycznych klientów, takich jak boty.", + "@notificationRuleSuppressNoticesDescription": {}, + "notificationRuleInviteForMe": "Zaproszenia", + "@notificationRuleInviteForMe": {}, + "notificationRuleInviteForMeDescription": "Powiadamia o zaproszeniach do pokoju.", + "@notificationRuleInviteForMeDescription": {}, + "notificationRuleMemberEvent": "Zdarzenia członków pokoju", + "@notificationRuleMemberEvent": {}, + "notificationRuleMemberEventDescription": "Tłumi powiadomienia o zmianach członkostwa w pokoju.", + "@notificationRuleMemberEventDescription": {}, + "notificationRuleIsUserMention": "Wzmianki", + "@notificationRuleIsUserMention": {}, + "notificationRuleIsUserMentionDescription": "Powiadamia o byciu wzmiankowanym w wiadomości.", + "@notificationRuleIsUserMentionDescription": {}, + "notificationRuleContainsDisplayName": "Zawiera nazwę wyświetlaną", + "@notificationRuleContainsDisplayName": {}, + "notificationRuleContainsDisplayNameDescription": "Powiadamia osobę o wiadomości zawierającej jej nazwę wyświetlaną.", + "@notificationRuleContainsDisplayNameDescription": {}, + "notificationRuleIsRoomMention": "Wzmianki pokoju", + "@notificationRuleIsRoomMention": {}, + "notificationRuleIsRoomMentionDescription": "Powiadamia o wzmiankowaniu całego pokoju.", + "@notificationRuleIsRoomMentionDescription": {}, + "notificationRuleRoomnotif": "Powiadomienia w pokoju", + "@notificationRuleRoomnotif": {}, + "notificationRuleRoomnotifDescription": "Powiadamia o wiadomości zawierającej „@room”.", + "@notificationRuleRoomnotifDescription": {}, + "notificationRuleTombstone": "Nagrobki", + "@notificationRuleTombstone": {}, + "notificationRuleTombstoneDescription": "Powiadamia o komunikatach dezaktywacji pokojów.", + "@notificationRuleTombstoneDescription": {}, + "notificationRuleReaction": "Reakcje", + "@notificationRuleReaction": {}, + "notificationRuleReactionDescription": "Tłumi powiadomienia o reakcjach.", + "@notificationRuleReactionDescription": {}, + "notificationRuleSuppressEdits": "Stłum edycje", + "@notificationRuleSuppressEdits": {}, + "notificationRuleSuppressEditsDescription": "Tłumi powiadomienia o edycjach wiadomości.", + "@notificationRuleSuppressEditsDescription": {}, + "notificationRuleCall": "Połączenia", + "@notificationRuleCall": {}, + "notificationRuleRoomServerAclDescription": "Wyłącza powiadomienia dla list kontroli dostępu (ACL) serwerów pokojów.", + "@notificationRuleRoomServerAclDescription": {}, + "notificationRuleRoomServerAcl": "Lista kontroli dostępu serwerów pokojów", + "@notificationRuleRoomServerAcl": {}, + "notificationRuleEncryptedRoomOneToOne": "Szyfrowane pokoje „jeden na jeden”", + "@notificationRuleEncryptedRoomOneToOne": {}, + "notificationRuleCallDescription": "Powiadamia o przychodzących połączeniach.", + "@notificationRuleCallDescription": {}, + "notificationRuleRoomOneToOne": "Pokoje „jeden na jeden”", + "@notificationRuleRoomOneToOne": {}, + "notificationRuleRoomOneToOneDescription": "Powiadamia o wiadomościach w pokojach „jeden na jeden” (one-to-one).", + "@notificationRuleRoomOneToOneDescription": {}, + "notificationRuleMessage": "Wiadomości", + "@notificationRuleMessage": {}, + "unknownPushRule": "Nieznana reguła: '{rule}'", + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } + } + }, + "notificationRuleEncryptedRoomOneToOneDescription": "Powiadamia o wiadomościach w szyfrowanych pokojach „jeden na jeden” (one-to-one).", + "@notificationRuleEncryptedRoomOneToOneDescription": {}, + "notificationRuleEncrypted": "Zaszyfrowane pokoje", + "@notificationRuleEncrypted": {}, + "notificationRuleJitsi": "Jitsi", + "@notificationRuleJitsi": {}, + "notificationRuleServerAcl": "Stłum komunikaty o listach kontroli dostępu serwerów pokojów", + "@notificationRuleServerAcl": {}, + "notificationRuleJitsiDescription": "Powiadamia o komunikatach widżetów Jitsi.", + "@notificationRuleJitsiDescription": {}, + "notificationRuleMessageDescription": "Powiadamia o ogólnych wiadomościach.", + "@notificationRuleMessageDescription": {}, + "notificationRuleEncryptedDescription": "Powiadamia o wiadomościach w zaszyfrowanych pokojach.", + "@notificationRuleEncryptedDescription": {}, + "notificationRuleServerAclDescription": "Tłumi powiadomienia o komunikatach o listach kontroli dostępu (ACL) serwerów pokojów.", + "@notificationRuleServerAclDescription": {}, + "newChatRequest": "📩 Nowa prośba o czat", + "@newChatRequest": {}, + "synchronizingPleaseWaitCounter": " Synchronizowanie… ({percentage}%)", + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "waitingForServer": "Oczekiwanie na serwer...", + "@waitingForServer": {}, + "appIntroduction": "FluffyChat umożliwia czatowanie ze znajomymi za pośrednictwem różnych komunikatorów. Dowiedz się więcej na stronie https://matrix.org lub kliknij na *Kontynuuj*.", + "@appIntroduction": {}, + "previous": "Poprzedni", + "@previous": {}, + "otherPartyNotLoggedIn": "Druga strona nie jest obecnie zalogowana i dlatego nie może odbierać wiadomości!", + "@otherPartyNotLoggedIn": {}, + "deletePushRuleCanNotBeUndone": "Jeśli skasujesz to ustawienie powiadomień, nie będzie się dało tego cofnąć.", + "@deletePushRuleCanNotBeUndone": {}, + "more": "Więcej", + "@more": {}, + "shareKeysWith": "Udostępnij klucze...", + "@shareKeysWith": {}, + "crossVerifiedDevicesIfEnabled": "Urządzenia zweryfikowane krzyżowo, jeśli włączone", + "@crossVerifiedDevicesIfEnabled": {}, + "crossVerifiedDevices": "Urządzenia zweryfikowane krzyżowo", + "@crossVerifiedDevices": {}, + "takeAPhoto": "Zrób zdjęcie", + "@takeAPhoto": {}, + "recordAVideo": "Nagraj film", + "@recordAVideo": {}, + "optionalMessage": "(Opcjonalna) wiadomość...", + "@optionalMessage": {}, + "verifiedDevicesOnly": "Tylko zweryfikowane urządzenia", + "@verifiedDevicesOnly": {}, + "shareKeysWithDescription": "Które urządzenia powinny być zaufane, aby mogły odczytywać Twoje wiadomości w zaszyfrowanych czatach?", + "@shareKeysWithDescription": {}, + "allDevices": "Wszystkie urządzenia", + "@allDevices": {}, + "notSupportedOnThisDevice": "Niewspierane na tym urządzeniu", + "@notSupportedOnThisDevice": {} +} diff --git a/assets/l10n/intl_pt.arb b/assets/l10n/intl_pt.arb new file mode 100644 index 0000000..5068023 --- /dev/null +++ b/assets/l10n/intl_pt.arb @@ -0,0 +1,2129 @@ +{ + "@@last_modified": "2021-08-14 12:41:09.940318", + "copiedToClipboard": "Copiada para a área de transferência", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "login": "Iniciar sessão", + "@login": { + "type": "String", + "placeholders": {} + }, + "about": "Sobre", + "@about": { + "type": "String", + "placeholders": {} + }, + "admin": "Admin", + "@admin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "Tens a certeza?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "notifications": "Notificações", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "account": "Conta", + "@account": { + "type": "String", + "placeholders": {} + }, + "cancel": "Cancelar", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "delete": "Eliminar", + "@delete": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "dateWithYear": "{day}-{month}-{year}", + "@dateWithYear": { + "type": "String", + "placeholders": { + "year": { + "type": "String" + }, + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "help": "Ajuda", + "@help": { + "type": "String", + "placeholders": {} + }, + "messages": "Mensagens", + "@messages": { + "type": "String", + "placeholders": {} + }, + "reason": "Razão", + "@reason": { + "type": "String", + "placeholders": {} + }, + "privacy": "Privacidade", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "openCamera": "Abrir câmara", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "settings": "Configurações", + "@settings": { + "type": "String", + "placeholders": {} + }, + "logout": "Terminar sessão", + "@logout": { + "type": "String", + "placeholders": {} + }, + "search": "Pesquisar", + "@search": { + "type": "String", + "placeholders": {} + }, + "users": "Utilizadores", + "@users": {}, + "close": "Fechar", + "@close": { + "type": "String", + "placeholders": {} + }, + "dateWithoutYear": "{day}-{month}", + "@dateWithoutYear": { + "type": "String", + "placeholders": { + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "@showPassword": { + "type": "String", + "placeholders": {} + }, + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "@connect": { + "type": "String", + "placeholders": {} + }, + "@jumpToLastReadMessage": {}, + "@allRooms": { + "type": "String", + "placeholders": {} + }, + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "@commandHint_cuddle": {}, + "@chats": { + "type": "String", + "placeholders": {} + }, + "@widgetVideo": {}, + "@dismiss": {}, + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "@reportErrorDescription": {}, + "@directChats": { + "type": "String", + "placeholders": {} + }, + "@setPermissionsLevel": { + "type": "String", + "placeholders": {} + }, + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "@addAccount": {}, + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "@chatHasBeenAddedToThisSpace": {}, + "@reply": { + "type": "String", + "placeholders": {} + }, + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "@unsupportedAndroidVersion": {}, + "@device": { + "type": "String", + "placeholders": {} + }, + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "@widgetJitsi": {}, + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "@encryption": { + "type": "String", + "placeholders": {} + }, + "@messageType": {}, + "@indexedDbErrorLong": {}, + "@oneClientLoggedOut": {}, + "@toggleMuted": { + "type": "String", + "placeholders": {} + }, + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@title": { + "description": "Title for the application", + "type": "String", + "placeholders": {} + }, + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "@startFirstChat": {}, + "@callingAccount": {}, + "@requestPermission": { + "type": "String", + "placeholders": {} + }, + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@invited": { + "type": "String", + "placeholders": {} + }, + "@setColorTheme": {}, + "@nextAccount": {}, + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "@singlesignon": { + "type": "String", + "placeholders": {} + }, + "@warning": { + "type": "String", + "placeholders": {} + }, + "@password": { + "type": "String", + "placeholders": {} + }, + "@allSpaces": {}, + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "@user": {}, + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "@youAcceptedTheInvitation": {}, + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@banUserDescription": {}, + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "@widgetEtherpad": {}, + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "@remove": { + "type": "String", + "placeholders": {} + }, + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "@id": { + "type": "String", + "placeholders": {} + }, + "@removeDevicesDescription": {}, + "@changedTheChatDescriptionTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "description": { + "type": "String" + } + } + }, + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@separateChatTypes": { + "type": "String", + "placeholders": {} + }, + "@tryAgain": {}, + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "@blocked": { + "type": "String", + "placeholders": {} + }, + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@removeDevice": { + "type": "String", + "placeholders": {} + }, + "@unbanUserDescription": {}, + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "@sendOnEnter": {}, + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@youRejectedTheInvitation": {}, + "@otherCallingPermissions": {}, + "@messagesStyle": {}, + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "@link": {}, + "@widgetUrlError": {}, + "@emailOrUsername": {}, + "@newSpaceDescription": {}, + "@chatDescription": {}, + "@callingAccountDetails": {}, + "@next": { + "type": "String", + "placeholders": {} + }, + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "@enterSpace": {}, + "@encryptThisChat": {}, + "@fileName": { + "type": "String", + "placeholders": {} + }, + "@unavailable": { + "type": "String", + "placeholders": {} + }, + "@previousAccount": {}, + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "@emoteWarnNeedToPick": { + "type": "String", + "placeholders": {} + }, + "@reopenChat": {}, + "@pleaseEnterRecoveryKey": {}, + "@create": { + "type": "String", + "placeholders": {} + }, + "@toggleFavorite": { + "type": "String", + "placeholders": {} + }, + "@no": { + "type": "String", + "placeholders": {} + }, + "@alias": { + "type": "String", + "placeholders": {} + }, + "@widgetNameError": {}, + "@inoffensive": { + "type": "String", + "placeholders": {} + }, + "@unpin": { + "type": "String", + "placeholders": {} + }, + "@addToBundle": {}, + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "@addWidget": {}, + "@all": { + "type": "String", + "placeholders": {} + }, + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@noKeyForThisMessage": {}, + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "@commandHint_markasgroup": {}, + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "@hydrateTor": {}, + "@pushNotificationsNotAvailable": {}, + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "@storeInAppleKeyChain": {}, + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "@hydrate": {}, + "@invalidServerName": {}, + "@chatPermissions": {}, + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "@wipeChatBackup": { + "type": "String", + "placeholders": {} + }, + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "@sender": {}, + "@storeInAndroidKeystore": {}, + "@hideRedactedEvents": { + "type": "String", + "placeholders": {} + }, + "@online": { + "type": "String", + "placeholders": {} + }, + "@signInWithPassword": {}, + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "@offensive": { + "type": "String", + "placeholders": {} + }, + "@needPantalaimonWarning": { + "type": "String", + "placeholders": {} + }, + "@makeAdminDescription": {}, + "@edit": { + "type": "String", + "placeholders": {} + }, + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "@transferFromAnotherDevice": { + "type": "String", + "placeholders": {} + }, + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "@pushRules": { + "type": "String", + "placeholders": {} + }, + "@goToTheNewRoom": { + "type": "String", + "placeholders": {} + }, + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "@copy": { + "type": "String", + "placeholders": {} + }, + "@saveKeyManuallyDescription": {}, + "@none": { + "type": "String", + "placeholders": {} + }, + "@editBundlesForAccount": {}, + "@renderRichContent": { + "type": "String", + "placeholders": {} + }, + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "@whyIsThisMessageEncrypted": {}, + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@setChatDescription": {}, + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "@importFromZipFile": {}, + "@toggleUnread": { + "type": "String", + "placeholders": {} + }, + "@or": { + "type": "String", + "placeholders": {} + }, + "@dehydrateWarning": {}, + "@sendOriginal": { + "type": "String", + "placeholders": {} + }, + "@noOtherDevicesFound": {}, + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "@seenByUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@yourChatBackupHasBeenSetUp": {}, + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@submit": { + "type": "String", + "placeholders": {} + }, + "@videoCallsBetaWarning": {}, + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "@participant": { + "type": "String", + "placeholders": {} + }, + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "@yes": { + "type": "String", + "placeholders": {} + }, + "@containsDisplayName": { + "type": "String", + "placeholders": {} + }, + "@signInWith": { + "type": "String", + "placeholders": { + "provider": { + "type": "String" + } + } + }, + "@username": { + "type": "String", + "placeholders": {} + }, + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@fileIsTooBigForServer": {}, + "@homeserver": {}, + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "@people": { + "type": "String", + "placeholders": {} + }, + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "@verified": { + "type": "String", + "placeholders": {} + }, + "@repeatPassword": {}, + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "@callingPermissions": {}, + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "@readUpToHere": {}, + "@start": {}, + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "@deviceId": { + "type": "String", + "placeholders": {} + }, + "@register": { + "type": "String", + "placeholders": {} + }, + "@unlockOldMessages": {}, + "@identity": { + "type": "String", + "placeholders": {} + }, + "@numChats": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "@ignore": { + "type": "String", + "placeholders": {} + }, + "@recording": { + "type": "String", + "placeholders": {} + }, + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@moderator": { + "type": "String", + "placeholders": {} + }, + "@optionalRedactReason": {}, + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "@dehydrate": {}, + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "@send": { + "type": "String", + "placeholders": {} + }, + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "@banned": { + "type": "String", + "placeholders": {} + }, + "@sendAsText": { + "type": "String" + }, + "@inviteForMe": { + "type": "String", + "placeholders": {} + }, + "@archiveRoomDescription": {}, + "@exportEmotePack": {}, + "@changedTheChatNameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "chatname": { + "type": "String" + } + } + }, + "@sendSticker": { + "type": "String", + "placeholders": {} + }, + "@switchToAccount": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "@commandInvalid": { + "type": "String" + }, + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "@removedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@newChat": { + "type": "String", + "placeholders": {} + }, + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "@experimentalVideoCalls": {}, + "@pleaseEnterRecoveryKeyDescription": {}, + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "@mention": { + "type": "String", + "placeholders": {} + }, + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "@inviteContactToGroupQuestion": {}, + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@chat": { + "type": "String", + "placeholders": {} + }, + "@group": { + "type": "String", + "placeholders": {} + }, + "@leave": { + "type": "String", + "placeholders": {} + }, + "@skip": { + "type": "String", + "placeholders": {} + }, + "@appearOnTopDetails": {}, + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "@enterRoom": {}, + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@allChats": { + "type": "String", + "placeholders": {} + }, + "@reportUser": {}, + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@confirmEventUnpin": {}, + "@badServerVersionsException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "@license": { + "type": "String", + "placeholders": {} + }, + "@addToSpace": {}, + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "@redactMessageDescription": {}, + "@rejoin": { + "type": "String", + "placeholders": {} + }, + "@recoveryKey": {}, + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "@forward": { + "type": "String", + "placeholders": {} + }, + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "@invalidInput": {}, + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "@dehydrateTorLong": {}, + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "@offline": { + "type": "String", + "placeholders": {} + }, + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "@doNotShowAgain": {}, + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@report": {}, + "@status": { + "type": "String", + "placeholders": {} + }, + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "@memberChanges": { + "type": "String", + "placeholders": {} + }, + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "@unverified": {}, + "@fluffychat": { + "type": "String", + "placeholders": {} + }, + "@howOffensiveIsThisContent": { + "type": "String", + "placeholders": {} + }, + "@serverRequiresEmail": {}, + "@hideUnimportantStateEvents": {}, + "@screenSharingTitle": {}, + "@widgetCustom": {}, + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@addToSpaceDescription": {}, + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "@addChatDescription": {}, + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@publish": {}, + "@openLinkInBrowser": {}, + "@clearArchive": {}, + "@appLock": { + "type": "String", + "placeholders": {} + }, + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "@messageInfo": {}, + "@disableEncryptionWarning": {}, + "@directChat": {}, + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "@sendTypingNotifications": {}, + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "@inviteGroupChat": {}, + "@appearOnTop": {}, + "@invitePrivateChat": {}, + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "@foregroundServiceRunning": {}, + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "@voiceCall": {}, + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "@importEmojis": {}, + "@confirm": { + "type": "String", + "placeholders": {} + }, + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "@noChatDescriptionYet": {}, + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "@removeFromBundle": {}, + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "@confirmMatrixId": {}, + "@learnMore": {}, + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "@you": { + "type": "String", + "placeholders": {} + }, + "@notAnImage": {}, + "@openGallery": {}, + "@chatDescriptionHasBeenChanged": {}, + "@newGroup": {}, + "@bundleName": {}, + "@dehydrateTor": {}, + "@removeFromSpace": {}, + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "@roomUpgradeDescription": {}, + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "@scanQrCode": {}, + "@pleaseEnterANumber": {}, + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@profileNotFound": {}, + "@jump": {}, + "@groups": { + "type": "String", + "placeholders": {} + }, + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@sorryThatsNotPossible": {}, + "@videoWithSize": { + "type": "String", + "placeholders": { + "size": { + "type": "String" + } + } + }, + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@shareInviteLink": {}, + "@commandHint_markasdm": {}, + "@recoveryKeyLost": {}, + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@containsUserName": { + "type": "String", + "placeholders": {} + }, + "@deviceKeys": {}, + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "@everythingReady": { + "type": "String", + "placeholders": {} + }, + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "@setCustomEmotes": { + "type": "String", + "placeholders": {} + }, + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "@notificationsEnabledForThisAccount": { + "type": "String", + "placeholders": {} + }, + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "@setTheme": {}, + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "@youJoinedTheChat": {}, + "@wallpaper": { + "type": "String", + "placeholders": {} + }, + "@openVideoCamera": { + "type": "String", + "placeholders": {} + }, + "@play": { + "type": "String", + "placeholders": { + "fileName": { + "type": "String" + } + } + }, + "@chatBackupDescription": { + "type": "String", + "placeholders": {} + }, + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "@security": { + "type": "String", + "placeholders": {} + }, + "@markAsRead": {}, + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "@widgetName": {}, + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@errorAddingWidget": {}, + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "@commandHint_hug": {}, + "@replace": {}, + "@reject": { + "type": "String", + "placeholders": {} + }, + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "@archive": { + "type": "String", + "placeholders": {} + }, + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "@pleaseEnter4Digits": { + "type": "String", + "placeholders": {} + }, + "@newSpace": {}, + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "@devices": { + "type": "String", + "placeholders": {} + }, + "@accept": { + "type": "String", + "placeholders": {} + }, + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "@emojis": {}, + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "@pleaseChoose": { + "type": "String", + "placeholders": {} + }, + "@share": { + "type": "String", + "placeholders": {} + }, + "@commandHint_googly": {}, + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "@createGroup": {}, + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "@hydrateTorLong": {}, + "@time": {}, + "@enterYourHomeserver": { + "type": "String", + "placeholders": {} + }, + "@botMessages": { + "type": "String", + "placeholders": {} + }, + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "@custom": {}, + "@noBackupWarning": {}, + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "@verify": { + "type": "String", + "placeholders": {} + }, + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "@storeInSecureStorageDescription": {}, + "@openChat": {}, + "@kickUserDescription": {}, + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "@pin": { + "type": "String", + "placeholders": {} + }, + "@importNow": {}, + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "@setInvitationLink": { + "type": "String", + "placeholders": {} + }, + "@pinMessage": {}, + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "@invite": {}, + "@enableMultiAccounts": {}, + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "@emotePacks": { + "type": "String", + "placeholders": {} + }, + "@indexedDbErrorTitle": {}, + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@unsupportedAndroidVersionLong": {}, + "@storeSecurlyOnThisDevice": {}, + "@ok": { + "type": "String", + "placeholders": {} + }, + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "@screenSharingDetail": {}, + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "@unreadChats": { + "type": "String", + "placeholders": { + "unreadCount": { + "type": "int" + } + } + }, + "@pickImage": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "@placeCall": {}, + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "@extremeOffensive": { + "type": "String", + "placeholders": {} + } +} diff --git a/assets/l10n/intl_pt_BR.arb b/assets/l10n/intl_pt_BR.arb new file mode 100644 index 0000000..0b2e503 --- /dev/null +++ b/assets/l10n/intl_pt_BR.arb @@ -0,0 +1,2977 @@ +{ + "@@last_modified": "2021-08-14 12:41:09.925971", + "about": "Sobre", + "@about": { + "type": "String", + "placeholders": {} + }, + "accept": "Aceitar", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 {username} aceitou o convite", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "Conta", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐 {username} ativou a criptografia ponta-a-ponta", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "addEmail": "Adicionar email", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "admin": "Admin", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "cognome", + "@alias": { + "type": "String", + "placeholders": {} + }, + "all": "Todas", + "@all": { + "type": "String", + "placeholders": {} + }, + "allChats": "Todas as conversas", + "@allChats": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "{senderName} atendeu à chamada", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "Qualquer pessoa pode participar", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "appLock": "Trava do aplicativo", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "archive": "Arquivo", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "Usuários convidados podem participar", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "Tem certeza?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "areYouSureYouWantToLogout": "Tem certeza que deseja encerrar a sessão?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "Para poder validar a outra pessoa, por favor, insira sua frase secreta ou chave de recuperação.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "Aceitar esta solicitação de verificação de {username}?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "autoplayImages": "Reproduzir automaticamente figurinhas animadas e emojis", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "badServerLoginTypesException": "O servidor matriz suporta os tipos de login:\n{serverVersions}\nMas este app suporta apenas:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "badServerVersionsException": "O servidor matriz suporta as versões Spec:\n{serverVersions}\nMas este app suporta apenas {supportedVersions}", + "@badServerVersionsException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "banFromChat": "Banir da conversa", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "Banido", + "@banned": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username} baniu {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "Bloquear dispositivo", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "blocked": "Bloqueado", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "botMessages": "Mensagens de robôs", + "@botMessages": { + "type": "String", + "placeholders": {} + }, + "cancel": "Cancelar", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "cantOpenUri": "Não foi possível abrir a URI {uri}", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "changeDeviceName": "Alterar o nome do dispositivo", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "{username} alterou o avatar da conversa", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatDescriptionTo": "{username} alterou a descrição da conversa para: '{description}'", + "@changedTheChatDescriptionTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "description": { + "type": "String" + } + } + }, + "changedTheChatNameTo": "{username} alterou o nome da conversa para: '{chatname}'", + "@changedTheChatNameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "chatname": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username} alterou as permissões na conversa", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username} mudou o seu nome de exibição para: '{displayname}'", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} alterou as regras de acesso dos convidados", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} alterou as regras de acesso dos convidados para: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username} alterou a visibilidade do histórico", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username} alterou a visibilidade do histórico para: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username} alterou as regras para participação", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} alterou as regras para participação para: {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} alterou seu avatar", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "{username} alterou os cognomes da sala", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username} alterou o link de convite", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changePassword": "Alterar a senha", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "Alterar o servidor matriz", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "Alterar o tema", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "Alterar o nome do grupo", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "changeYourAvatar": "Alterar seu avatar", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "A criptografia foi corrompida", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "chat": "Conversas", + "@chat": { + "type": "String", + "placeholders": {} + }, + "chatBackup": "Backup da conversa", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "chatBackupDescription": "Suas mensagens antigas são protegidas com sua chave de recuperação. Por favor, evite perdê-la.", + "@chatBackupDescription": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Detalhes da conversa", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chats": "Conversas", + "@chats": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "Escolha uma senha forte", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "clearArchive": "Limpar arquivo", + "@clearArchive": {}, + "close": "Fechar", + "@close": { + "type": "String", + "placeholders": {} + }, + "commandHint_ban": "Banir um(a) usuário(a) desta sala", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_html": "Enviar mensagem formatada em HTML", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_invite": "Convidar um(a) usuário(a) para esta sala", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "commandHint_join": "Entrar numa sala", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_kick": "Remover um(a) usuário(a) desta sala", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_leave": "Sair desta sala", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_me": "Descrever você mesmo", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "commandHint_myroomavatar": "Determinar sua imagem para esta sala (via mxc-uri)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_myroomnick": "Determinar seu nome de exibição para esta sala", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "commandHint_op": "Determinar o grau de poderes de um(a) usuário(a) (padrão: 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_plain": "Enviar mensagem sem formatação", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_react": "Enviar uma resposta como reação", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "commandHint_send": "Enviar mensagem", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "commandHint_unban": "Revogar o banimento de um(a) usuário(a) desta sala", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "commandInvalid": "Comando inválido", + "@commandInvalid": { + "type": "String" + }, + "commandMissing": "{command} não é um comando.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "compareEmojiMatch": "Por favor compare os emojis", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "Por favor compare os números", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "configureChat": "Configurar conversa", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "confirm": "Confirma", + "@confirm": { + "type": "String", + "placeholders": {} + }, + "connect": "Conectar", + "@connect": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "O contato foi convidado ao grupo", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "containsDisplayName": "Contém nome de exibição", + "@containsDisplayName": { + "type": "String", + "placeholders": {} + }, + "containsUserName": "Contém nome de usuário", + "@containsUserName": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "O conteúdo foi denunciado para quem administra o servidor", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "Copiado para área de transferência", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "Copiar", + "@copy": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "Copiar para a área de transferência", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "Não foi possível decriptar a mensagem: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "countParticipants": "{count} participantes", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "create": "Criar", + "@create": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "💬 {username} criou a conversa", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "createNewSpace": "Novo espaço", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "currentlyActive": "Ativo", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "Escuro", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "dateWithoutYear": "{day}/{month}", + "@dateWithoutYear": { + "type": "String", + "placeholders": { + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "dateWithYear": "{day}/{month}/{year}", + "@dateWithYear": { + "type": "String", + "placeholders": { + "year": { + "type": "String" + }, + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "deactivateAccountWarning": "Isto desativará a conta do usuário. É irreversível! Tem certeza?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "Nível de permissão padrão", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "delete": "Apagar", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "Apagar conta", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "Apagar mensagem", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "device": "Dispositivo", + "@device": { + "type": "String", + "placeholders": {} + }, + "deviceId": "ID do dispositivo", + "@deviceId": { + "type": "String", + "placeholders": {} + }, + "devices": "Dispositivos", + "@devices": { + "type": "String", + "placeholders": {} + }, + "directChats": "Conversas diretas", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "O nome de exibição foi alterado", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "Baixar arquivo", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "edit": "Editar", + "@edit": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "Editar servidores bloqueados", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "editDisplayname": "Editar nome de exibição", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "editRoomAliases": "Editar cognome da sala", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "Editar o avatar da sala", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "Emoji já existe!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "Código emoji inválido!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emotePacks": "Pacote de emoji para a sala", + "@emotePacks": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "Configuração dos Emoji", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "emoteShortcode": "Código Emoji", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emoteWarnNeedToPick": "Você tem que escolher um código emoji e uma imagem!", + "@emoteWarnNeedToPick": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "Conversa vazia", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "Habilitar globalmente o pacote de emoji", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "Habilitar criptografia", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "Você não poderá desabilitar a criptografia posteriormente. Tem certeza?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "encrypted": "Criptografado", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "encryption": "Criptografia", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "A criptografia não está habilitada", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName} finalizou a chamada", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "enterAnEmailAddress": "Inserir endereço de e-mail", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "enterYourHomeserver": "Insira um servidor matriz", + "@enterYourHomeserver": { + "type": "String", + "placeholders": {} + }, + "errorObtainingLocation": "Erro ao obter local: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "everythingReady": "Tudo pronto!", + "@everythingReady": { + "type": "String", + "placeholders": {} + }, + "extremeOffensive": "Extremamente ofensivo", + "@extremeOffensive": { + "type": "String", + "placeholders": {} + }, + "fileName": "Nome do arquivo", + "@fileName": { + "type": "String", + "placeholders": {} + }, + "fluffychat": "FluffyChat", + "@fluffychat": { + "type": "String", + "placeholders": {} + }, + "fontSize": "Tamanho da fonte", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "forward": "Encaminhar", + "@forward": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "Desde que entrou", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "Desde o convite", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "goToTheNewRoom": "Ir para a sala nova", + "@goToTheNewRoom": { + "type": "String", + "placeholders": {} + }, + "group": "Grupo", + "@group": { + "type": "String", + "placeholders": {} + }, + "groupIsPublic": "Grupo público", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "groups": "Grupos", + "@groups": { + "type": "String", + "placeholders": {} + }, + "groupWith": "Grupo com {displayname}", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "guestsAreForbidden": "Convidados estão proibidos", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "Convidados podem participar", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{username} revogou o convite para {targetName}", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "help": "Ajuda", + "@help": { + "type": "String", + "placeholders": {} + }, + "hideRedactedEvents": "Ocultar eventos removidos", + "@hideRedactedEvents": { + "type": "String", + "placeholders": {} + }, + "hideUnknownEvents": "Ocultar eventos desconhecidos", + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "howOffensiveIsThisContent": "O quão ofensivo é este conteúdo?", + "@howOffensiveIsThisContent": { + "type": "String", + "placeholders": {} + }, + "id": "ID", + "@id": { + "type": "String", + "placeholders": {} + }, + "identity": "Identidade", + "@identity": { + "type": "String", + "placeholders": {} + }, + "ignore": "Ignorar", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "ignoredUsers": "Usuários ignorados", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "iHaveClickedOnLink": "Eu cliquei no link", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "Frase secreta ou chave de recuperação incorreta", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "inoffensive": "Inofensivo", + "@inoffensive": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "Convidar contato", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "Convidar contato para {groupName}", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "invited": "Foi convidado", + "@invited": { + "type": "String", + "placeholders": {} + }, + "invitedUser": "📩 {username} convidou {targetName}", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "invitedUsersOnly": "Apenas usuários convidados", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "inviteForMe": "Convite para mim", + "@inviteForMe": { + "type": "String", + "placeholders": {} + }, + "inviteText": "{username} convidou você para o FluffyChat. \n1. Visite fluffychat.im e instale o aplicativo\n2. Entre ou crie uma conta \n3. Abra o link do convite:\n {link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "isTyping": "está escrevendo…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "👋 {username} entrou na conversa", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "joinRoom": "Entrar na sala", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "kicked": "👞 {username} enxotou {targetName}", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickedAndBanned": "🙅 {username} expulsou e baniu {targetName}", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickFromChat": "Expulso da conversa", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "Última vez ativo: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "leave": "Sair", + "@leave": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "Sair da conversa", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "license": "Licença", + "@license": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "Claro", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "Carregue {count} mais participantes", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "loadingPleaseWait": "Carregando... Aguarde.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "loadMore": "Carregando mais…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "locationDisabledNotice": "O serviço de localização está desabilitado. Por favor, habilite-o para compartilhar sua localização.", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "locationPermissionDeniedNotice": "Permissão de localização negada. Conceda as permissões para habilitar o compartilhamento de localização.", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "login": "Iniciar sessão", + "@login": { + "type": "String", + "placeholders": {} + }, + "logInTo": "Conectar a {homeserver}", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "logout": "Encerrar sessão", + "@logout": { + "type": "String", + "placeholders": {} + }, + "memberChanges": "Alterações de membros", + "@memberChanges": { + "type": "String", + "placeholders": {} + }, + "mention": "Mencionar", + "@mention": { + "type": "String", + "placeholders": {} + }, + "messages": "Mensagens", + "@messages": { + "type": "String", + "placeholders": {} + }, + "moderator": "Moderador", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "muteChat": "Silenciar", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "needPantalaimonWarning": "Por favor, observe que, por enquanto, você precisa do Pantalaimon para usar criptografia ponta-a-ponta.", + "@needPantalaimonWarning": { + "type": "String", + "placeholders": {} + }, + "newChat": "Nova conversa", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "💬 Nova mensagem no FluffyChat", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "Nova solicitação de verificação!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "next": "Próximo", + "@next": { + "type": "String", + "placeholders": {} + }, + "no": "Não", + "@no": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "Sem conexão com o servidor", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "Nenhum emoji encontrado. 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "Você só pode ativar criptografia quando a sala não for mais publicamente acessível.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "Aparentemente você não tem serviços Google no seu celular. Para receber notificações no FluffyChat, recomendamos instalar ntfy.", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "noMatrixServer": "{server1} não é um servidor matrix, usar {server2} talvez?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "none": "Nenhum", + "@none": { + "type": "String", + "placeholders": {} + }, + "noPasswordRecoveryDescription": "Você ainda não adicionou uma forma de recuparar sua senha.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "noPermission": "Sem permissão", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "Nenhuma sala encontrada…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "notifications": "Notificações", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "notificationsEnabledForThisAccount": "Notificações habilitadas para esta conta", + "@notificationsEnabledForThisAccount": { + "type": "String", + "placeholders": {} + }, + "numUsersTyping": "{count} usuários estão digitando…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "obtainingLocation": "Obtendo localização…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "offensive": "Ofensivo", + "@offensive": { + "type": "String", + "placeholders": {} + }, + "offline": "Desconectado", + "@offline": { + "type": "String", + "placeholders": {} + }, + "ok": "Ok", + "@ok": { + "type": "String", + "placeholders": {} + }, + "online": "Disponível", + "@online": { + "type": "String", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "Backup de chaves está ativado", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "oopsPushError": "Opa! Infelizmente, um erro ocorreu ao configurar as notificações.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "Opa, algo deu errado…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "Abra o app para ler as mensagens", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "openCamera": "Abra a câmera", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "openInMaps": "Abrir no mapas", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "or": "Ou", + "@or": { + "type": "String", + "placeholders": {} + }, + "participant": "Participante", + "@participant": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "frase secreta ou chave de recuperação", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "password": "Senha", + "@password": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "Esqueci a senha", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "Senha foi alterada", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "passwordRecovery": "Recuperação de senha", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "people": "Pessoas", + "@people": { + "type": "String", + "placeholders": {} + }, + "pickImage": "Escolha uma imagem", + "@pickImage": { + "type": "String", + "placeholders": {} + }, + "pin": "Alfinetar", + "@pin": { + "type": "String", + "placeholders": {} + }, + "play": "Tocar {fileName}", + "@play": { + "type": "String", + "placeholders": { + "fileName": { + "type": "String" + } + } + }, + "pleaseChoose": "Por favor, selecione", + "@pleaseChoose": { + "type": "String", + "placeholders": {} + }, + "pleaseChooseAPasscode": "Por favor, escolha um código", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "pleaseClickOnLink": "Por favor, clique a ligação no e-mail para prosseguir.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "pleaseEnter4Digits": "Por favor, insira 4 dígitos ou deixe em branco para desativar a trava do aplicativo.", + "@pleaseEnter4Digits": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPassword": "Por favor, insira sua senha", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPin": "Por favor, insira seu PIN", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "Por favor, insira seu nome de usuário", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "Por favor, siga as instruções no site e toque em próximo.", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "privacy": "Privacidade", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "Salas públicas", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "pushRules": "Regras de notificação", + "@pushRules": { + "type": "String", + "placeholders": {} + }, + "reason": "Motivo", + "@reason": { + "type": "String", + "placeholders": {} + }, + "recording": "Gravando", + "@recording": { + "type": "String", + "placeholders": {} + }, + "redactedAnEvent": "{username} removeu um evento", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "redactMessage": "Retratar mensagem", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "register": "Registrar", + "@register": { + "type": "String", + "placeholders": {} + }, + "reject": "Recusar", + "@reject": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "{username} recusou o convite", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "rejoin": "Retornar", + "@rejoin": { + "type": "String", + "placeholders": {} + }, + "remove": "Remover", + "@remove": { + "type": "String", + "placeholders": {} + }, + "removeAllOtherDevices": "Remover todos os outros dispositivos", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "removedBy": "Removido por {username}", + "@removedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "removeDevice": "Remover dispositivo", + "@removeDevice": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "Revogar banimento", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "removeYourAvatar": "Remover seu avatar", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "renderRichContent": "Exibir conteúdo formatado", + "@renderRichContent": { + "type": "String", + "placeholders": {} + }, + "replaceRoomWithNewerVersion": "Substituir sala por uma nova versão", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "reply": "Responder", + "@reply": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "Denunciar mensagem", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "requestPermission": "Solicitar permissão", + "@requestPermission": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "Sala foi atualizada", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "Versão da sala", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "saveFile": "Salvar arquivo", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "search": "Buscar", + "@search": { + "type": "String", + "placeholders": {} + }, + "security": "Segurança", + "@security": { + "type": "String", + "placeholders": {} + }, + "seenByUser": "Visto por {username}", + "@seenByUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "send": "Enviar", + "@send": { + "type": "String", + "placeholders": {} + }, + "sendAMessage": "Enviar mensagem", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "sendAsText": "Enviar como texto", + "@sendAsText": { + "type": "String" + }, + "sendAudio": "Enviar audio", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendFile": "Enviar arquivo", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendImage": "Enviar imagem", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendMessages": "Enviar mensagens", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "sendOriginal": "Enviar original", + "@sendOriginal": { + "type": "String", + "placeholders": {} + }, + "sendSticker": "Enviar figurinha", + "@sendSticker": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "Enviar vídeo", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "sentAFile": "📁 {username} enviou um arquivo", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAnAudio": "🎤 {username} enviou um audio", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAPicture": "🖼️ {username} enviou uma imagem", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentASticker": "😊 {username} enviou uma figurinha", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "🎥 {username} enviou um vídeo", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentCallInformations": "{senderName} enviou informações de chamada", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "setAsCanonicalAlias": "Fixar como cognome principal", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "setCustomEmotes": "Implantar emojis personalizados", + "@setCustomEmotes": { + "type": "String", + "placeholders": {} + }, + "setInvitationLink": "Enviar link de convite", + "@setInvitationLink": { + "type": "String", + "placeholders": {} + }, + "setPermissionsLevel": "Determinar níveis de permissão", + "@setPermissionsLevel": { + "type": "String", + "placeholders": {} + }, + "setStatus": "Alterar o status", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "settings": "Configurações", + "@settings": { + "type": "String", + "placeholders": {} + }, + "share": "Compartilhar", + "@share": { + "type": "String", + "placeholders": {} + }, + "sharedTheLocation": "{username} compartilhou sua localização", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "shareLocation": "Compartilhar localização", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "showPassword": "Mostrar senha", + "@showPassword": { + "type": "String", + "placeholders": {} + }, + "singlesignon": "Identidade Única", + "@singlesignon": { + "type": "String", + "placeholders": {} + }, + "skip": "Pular", + "@skip": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "Código fonte", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "spaceIsPublic": "Espaço é público", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "spaceName": "Nome do espaço", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "startedACall": "{senderName} iniciou uma chamada", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "status": "Status", + "@status": { + "type": "String", + "placeholders": {} + }, + "statusExampleMessage": "Como vai você?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "submit": "Submeter", + "@submit": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWait": "Sincronizando… Por favor, aguarde.", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "systemTheme": "Sistema", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "Não correspondem", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "Correspondem", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "title": "FluffyChat", + "@title": { + "description": "Title for the application", + "type": "String", + "placeholders": {} + }, + "toggleFavorite": "Alternar favorito", + "@toggleFavorite": { + "type": "String", + "placeholders": {} + }, + "toggleMuted": "Alternar Silenciado", + "@toggleMuted": { + "type": "String", + "placeholders": {} + }, + "toggleUnread": "Marcar lido/não lido", + "@toggleUnread": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "Demasiadas requisições. Por favor, tente novamente mais tarde!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "transferFromAnotherDevice": "Transferir de outro dispositivo", + "@transferFromAnotherDevice": { + "type": "String", + "placeholders": {} + }, + "tryToSendAgain": "Tente enviar novamente", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "unavailable": "Indisponível", + "@unavailable": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username} revogou o banimento de {targetName}", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "unblockDevice": "Desbloquear dispositivo", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "Dispositivo desconhecido", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "unknownEncryptionAlgorithm": "Algoritmo de criptografia desconhecido", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unknownEvent": "Evento desconhecido '{type}'", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "unmuteChat": "Cancelar silenciamento", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "unpin": "Desalfinetar", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "unreadChats": "{unreadCount, plural, =1{1 conversa não lida} other{{unreadCount} conversas não lidas}}", + "@unreadChats": { + "type": "String", + "placeholders": { + "unreadCount": { + "type": "int" + } + } + }, + "userAndOthersAreTyping": "{username} e mais {count} pessoas estão digitando…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "userAndUserAreTyping": "{username} e {username2} estão digitando…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userIsTyping": "{username} está digitando…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userLeftTheChat": "🚪 {username} saiu da conversa", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "username": "Nome de usuário", + "@username": { + "type": "String", + "placeholders": {} + }, + "userSentUnknownEvent": "{username} enviou um evento {type}", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "verified": "Verificado", + "@verified": { + "type": "String", + "placeholders": {} + }, + "verify": "Verificar", + "@verify": { + "type": "String", + "placeholders": {} + }, + "verifyStart": "Iniciar verificação", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "Verificação efetivada!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "verifyTitle": "Verificando outra conta", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "videoCall": "Vídeochamada", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "Visibilidade do histórico da conversa", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "Visível aos participantes", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "Visível a qualquer pessoa", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "Mensagem de voz", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "Esperando que a outra pessoa aceite a solicitação…", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "Esperando que a outra pessoa aceite os emoji…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "Aguardando a outra pessoa aceitar os números…", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "wallpaper": "Pano de fundo:", + "@wallpaper": { + "type": "String", + "placeholders": {} + }, + "warning": "Atenção!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "weSentYouAnEmail": "Enviamos um e-mail para você", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "whoCanPerformWhichAction": "Quem pode desempenhar quais ações", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "Quais pessoas são permitidas participar deste grupo", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "Por que você quer denunciar isto?", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "wipeChatBackup": "Limpar o backup da conversa para criar uma nova chave de recuperação?", + "@wipeChatBackup": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "Você pode recuperar a sua senha com estes endereços.", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "Escreva uma mensagem…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "yes": "Sim", + "@yes": { + "type": "String", + "placeholders": {} + }, + "you": "Você", + "@you": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "Você não está mais participando desta conversa", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "Você foi banido desta conversa", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "yourPublicKey": "Sua chave pública", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "oneClientLoggedOut": "Um dos seus clientes foi desvinculado", + "@oneClientLoggedOut": {}, + "addAccount": "Adicionar conta", + "@addAccount": {}, + "unverified": "Não verificado", + "@unverified": {}, + "yourChatBackupHasBeenSetUp": "Seu backup de conversas foi configurado.", + "@yourChatBackupHasBeenSetUp": {}, + "editBundlesForAccount": "Editar coleções para esta conta", + "@editBundlesForAccount": {}, + "serverRequiresEmail": "Este servidor precisa validar seu email para efetuar o registro.", + "@serverRequiresEmail": {}, + "messageInfo": "Informações da mensagem", + "@messageInfo": {}, + "sender": "Remetente", + "@sender": {}, + "publish": "Publicar", + "@publish": {}, + "removeFromSpace": "Remover do espaço", + "@removeFromSpace": {}, + "link": "Link", + "@link": {}, + "start": "Começar", + "@start": {}, + "repeatPassword": "Repita a senha", + "@repeatPassword": {}, + "addToSpace": "Adicionar ao espaço", + "@addToSpace": {}, + "sendOnEnter": "Enviar ao pressionar enter", + "@sendOnEnter": {}, + "homeserver": "Servidor matriz", + "@homeserver": {}, + "chatHasBeenAddedToThisSpace": "A conversa foi adicionada a este espaço", + "@chatHasBeenAddedToThisSpace": {}, + "commandHint_clearcache": "Limpar dados temporários", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_create": "Criar uma sala vazia.\nUse --no-encryption para desabilitar a criptografia", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "commandHint_discardsession": "Descartar sessão", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "commandHint_dm": "Iniciar uma conversa direta\nUse --no-encryption para desabilitar a criptografia", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "scanQrCode": "Escanear o código QR", + "@scanQrCode": {}, + "openVideoCamera": "Abra a câmera para um vídeo", + "@openVideoCamera": { + "type": "String", + "placeholders": {} + }, + "addToBundle": "Adicionar à coleção", + "@addToBundle": {}, + "removeFromBundle": "Remover desta coleção", + "@removeFromBundle": {}, + "bundleName": "Nome da coleção", + "@bundleName": {}, + "enableMultiAccounts": "(BETA) Habilitar múltiplas contas neste dispositivo", + "@enableMultiAccounts": {}, + "time": "Hora", + "@time": {}, + "messageType": "Tipo da mensagem", + "@messageType": {}, + "openGallery": "Abrir galeria", + "@openGallery": {}, + "addToSpaceDescription": "Selecione um espaço para adicionar esta conversa.", + "@addToSpaceDescription": {}, + "videoWithSize": "Vídeo ({size})", + "@videoWithSize": { + "type": "String", + "placeholders": { + "size": { + "type": "String" + } + } + }, + "markAsRead": "Marcar como lido", + "@markAsRead": {}, + "dismiss": "Descartar", + "@dismiss": {}, + "separateChatTypes": "Separar Conversas Diretas e Grupos", + "@separateChatTypes": { + "type": "String", + "placeholders": {} + }, + "openChat": "Abrir conversa", + "@openChat": {}, + "reportUser": "Delatar usuário", + "@reportUser": {}, + "emojis": "Emojis", + "@emojis": {}, + "placeCall": "Chamar", + "@placeCall": {}, + "reactedWith": "{sender} reagiu com {reaction}", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "confirmEventUnpin": "Tem certeza que quer desafixar o evento permanentemente?", + "@confirmEventUnpin": {}, + "pinMessage": "Afixar à sala", + "@pinMessage": {}, + "voiceCall": "Chamada de voz", + "@voiceCall": {}, + "unsupportedAndroidVersion": "Versão Android não suportada", + "@unsupportedAndroidVersion": {}, + "widgetNameError": "Por favor, forneça um nome de exibição.", + "@widgetNameError": {}, + "unsupportedAndroidVersionLong": "Esta funcionalidade requer uma versão mais nova do Android. Por favor, busque atualizações ou suporte ao Lineage OS.", + "@unsupportedAndroidVersionLong": {}, + "emailOrUsername": "Email ou nome de usuário", + "@emailOrUsername": {}, + "videoCallsBetaWarning": "Por favor, note que chamadas de vídeo estão atualmente em teste. Podem não funcionar como esperado ou sequer funcionar em algumas plataformas.", + "@videoCallsBetaWarning": {}, + "experimentalVideoCalls": "Vídeo chamadas experimentais", + "@experimentalVideoCalls": {}, + "widgetVideo": "Vídeo", + "@widgetVideo": {}, + "errorAddingWidget": "Erro ao adicionar a ferramenta.", + "@errorAddingWidget": {}, + "addWidget": "Adicionar ferramenta", + "@addWidget": {}, + "widgetEtherpad": "Anotação", + "@widgetEtherpad": {}, + "widgetUrlError": "Isto não é uma URL válida.", + "@widgetUrlError": {}, + "widgetJitsi": "Jitsi Meet", + "@widgetJitsi": {}, + "widgetCustom": "Personalizado", + "@widgetCustom": {}, + "widgetName": "Nome", + "@widgetName": {}, + "switchToAccount": "Alternar para a conta {number}", + "@switchToAccount": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "nextAccount": "Próxima conta", + "@nextAccount": {}, + "previousAccount": "Conta anterior", + "@previousAccount": {}, + "youRejectedTheInvitation": "Você rejeitou o convite", + "@youRejectedTheInvitation": {}, + "youBannedUser": "Você baniu {user}", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youHaveWithdrawnTheInvitationFor": "Você revogou o convite para {user}", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedBy": "📩 Você foi convidado por {user}", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedUser": "📩 Você convidou {user}", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youAcceptedTheInvitation": "👍 Você aceitou o convite", + "@youAcceptedTheInvitation": {}, + "youJoinedTheChat": "Você entrou na conversa", + "@youJoinedTheChat": {}, + "youKicked": "👞 Você expulsou {user}", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKickedAndBanned": "🙅 Você expulsou e baniu {user}", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youUnbannedUser": "Você revogou o banimento de {user}", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "cuddleContent": "{senderName} afagou você", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "pleaseEnterRecoveryKeyDescription": "Para destrancar suas mensagens antigas, por favor, insira sua chave de recuperação gerada numa sessão prévia. Suas chave de recuperação NÃO é sua senha.", + "@pleaseEnterRecoveryKeyDescription": {}, + "indexedDbErrorLong": "Infelizmente, o armazenamento de mensagens não é habilitado por padrão no modo privado.\nPor favor, visite\n- about:config\n- atribua \"true\" a \"dom.indexedDB.privateBrowsing.enabled\"\nDe outro modo, não será possível executar o FluffyChat.", + "@indexedDbErrorLong": {}, + "users": "Usuários", + "@users": {}, + "confirmMatrixId": "Por favor, confirme seu ID Matrix para apagar sua conta.", + "@confirmMatrixId": {}, + "supposedMxid": "Isto deveria ser {mxid}", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "dehydrateTor": "Usuários TOR: Exportar sessão", + "@dehydrateTor": {}, + "recoveryKey": "Chave de recuperação", + "@recoveryKey": {}, + "recoveryKeyLost": "Perdeu a chave de recuperação?", + "@recoveryKeyLost": {}, + "commandHint_cuddle": "Enviar um afago", + "@commandHint_cuddle": {}, + "commandHint_hug": "Enviar um abraço", + "@commandHint_hug": {}, + "commandHint_googly": "Enviar olhos arregalados", + "@commandHint_googly": {}, + "googlyEyesContent": "{senderName} enviou olhos arregalados", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "hugContent": "{senderName} abraçou você", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "commandHint_markasdm": "Marcar como conversa direta para o ID Matrix dado", + "@commandHint_markasdm": {}, + "commandHint_markasgroup": "Marcar como grupo", + "@commandHint_markasgroup": {}, + "hydrateTor": "Usuários TOR: Importar sessão", + "@hydrateTor": {}, + "hydrateTorLong": "Você exportou sua última sessão no TOR? Importe ela rapidamente e continue conversando.", + "@hydrateTorLong": {}, + "hydrate": "Restaurar a partir de arquivo backup", + "@hydrate": {}, + "pleaseEnterRecoveryKey": "Por favor, insira sua chave de recuperação:", + "@pleaseEnterRecoveryKey": {}, + "indexedDbErrorTitle": "Problemas no modo privado", + "@indexedDbErrorTitle": {}, + "storeInSecureStorageDescription": "Guardar a chave de recuperação no armazenamento seguro deste dispositivo.", + "@storeInSecureStorageDescription": {}, + "saveKeyManuallyDescription": "Salvar esta chave manualmente via compartilhamento do sistema ou área de transferência.", + "@saveKeyManuallyDescription": {}, + "storeInAndroidKeystore": "Guardar no cofre do Android", + "@storeInAndroidKeystore": {}, + "storeInAppleKeyChain": "Guardar no chaveiro da Apple", + "@storeInAppleKeyChain": {}, + "storeSecurlyOnThisDevice": "Guardar de modo seguro neste dispositivo", + "@storeSecurlyOnThisDevice": {}, + "user": "Usuário", + "@user": {}, + "custom": "Personalizado", + "@custom": {}, + "foregroundServiceRunning": "Esta notificação aparece quando um serviço está executando.", + "@foregroundServiceRunning": {}, + "callingPermissions": "Permissões de chamada", + "@callingPermissions": {}, + "callingAccount": "Conta para chamadas", + "@callingAccount": {}, + "callingAccountDetails": "Permitir que o FluffyChat use o app de chamadas nativo do Android.", + "@callingAccountDetails": {}, + "appearOnTop": "Aparecer no topo", + "@appearOnTop": {}, + "appearOnTopDetails": "Permitir que o app apareça no topo (desnecessário caso FluffyChat já esteja configurado como conta para chamadas)", + "@appearOnTopDetails": {}, + "otherCallingPermissions": "Microfone, câmera e outras permissões do FluffyChat", + "@otherCallingPermissions": {}, + "newGroup": "Novo grupo", + "@newGroup": {}, + "newSpace": "Novo espaço", + "@newSpace": {}, + "enterSpace": "Entrar no espaço", + "@enterSpace": {}, + "enterRoom": "Entrar na conversa", + "@enterRoom": {}, + "allSpaces": "Todos espaços", + "@allSpaces": {}, + "hideUnimportantStateEvents": "Ocultar eventos desimportantes", + "@hideUnimportantStateEvents": {}, + "countFiles": "{count} arquivos", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "doNotShowAgain": "Não mostrar novamente", + "@doNotShowAgain": {}, + "unlockOldMessages": "Destrancar mensagens antigas", + "@unlockOldMessages": {}, + "dehydrate": "Exportar sessão e limpar dispositivo", + "@dehydrate": {}, + "dehydrateWarning": "Esta ação não pode ser desfeita. Certifique-se de que o arquivo backup está guardado e seguro.", + "@dehydrateWarning": {}, + "dehydrateTorLong": "Para usuários TOR, é recomendado exportar a sessão antes de fechar a janela.", + "@dehydrateTorLong": {}, + "whyIsThisMessageEncrypted": "Por que esta mensagem está ilegível?", + "@whyIsThisMessageEncrypted": {}, + "screenSharingTitle": "Compartilhar tela", + "@screenSharingTitle": {}, + "screenSharingDetail": "Você está compartilhando sua tela no FluffyChat", + "@screenSharingDetail": {}, + "numChats": "{number} conversas", + "@numChats": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "noKeyForThisMessage": "Isto pode ocorrer caso a mensagem tenha sido enviada antes da entrada na sua conta com este dispositivo.\n\nTambém é possível que o remetente tenha bloqueado o seu dispositivo ou ocorreu algum problema com a conexão.\n\nVocê consegue ler as mensagens em outra sessão? Então, pode transferir as mensagens de lá! Vá em Configurações > Dispositivos e confira se os dispositivos verificaram um ao outro. Quando abrir a sala da próxima vez e ambas as sessões estiverem abertas, as chaves serão transmitidas automaticamente.\n\nNão gostaria de perder suas chaves quando sair ou trocar de dispositivos? Certifique-se que o backup de conversas esteja habilitado nas configurações.", + "@noKeyForThisMessage": {}, + "allRooms": "Todos os Chats em Grupo", + "@allRooms": { + "type": "String", + "placeholders": {} + }, + "notAnImage": "Não é uma imagem.", + "@notAnImage": {}, + "importNow": "Importar agora", + "@importNow": {}, + "importEmojis": "Importar Emojis", + "@importEmojis": {}, + "importFromZipFile": "Importar de arquivo .zip", + "@importFromZipFile": {}, + "sendTypingNotifications": "Enviar notificações de digitação", + "@sendTypingNotifications": {}, + "startFirstChat": "Comece seu primeiro chat", + "@startFirstChat": {}, + "exportEmotePack": "Exportar pacote de Emotes como .zip", + "@exportEmotePack": {}, + "replace": "Substituir", + "@replace": {}, + "jumpToLastReadMessage": "Pular para a última mensagem lida", + "@jumpToLastReadMessage": {}, + "reportErrorDescription": "😭 Ah, não. Algo deu errado. Se quiser, pode relatar isto aos desenvolvedores.", + "@reportErrorDescription": {}, + "setColorTheme": "Aplicar paleta de cor:", + "@setColorTheme": {}, + "banUserDescription": "O usuário será banido da conversa e não poderá participar novamente até que isto seja revogado.", + "@banUserDescription": {}, + "removeDevicesDescription": "Você encerrará a sessão neste dispositivo e não poderá mais receber mensagens.", + "@removeDevicesDescription": {}, + "tryAgain": "Tente novamente", + "@tryAgain": {}, + "unbanUserDescription": "O usuário poderá ingressar novamente na conversa, caso tente.", + "@unbanUserDescription": {}, + "messagesStyle": "Mensagens:", + "@messagesStyle": {}, + "newSpaceDescription": "Espaços permitem que você consolide suas conversas e construa comunidades públicas ou privadas.", + "@newSpaceDescription": {}, + "chatDescription": "Descrição da conversa", + "@chatDescription": {}, + "encryptThisChat": "Encriptar esta conversa", + "@encryptThisChat": {}, + "reopenChat": "Reabrir conversa", + "@reopenChat": {}, + "pushNotificationsNotAvailable": "Notificações não estão disponíveis", + "@pushNotificationsNotAvailable": {}, + "invalidServerName": "Nome de usuário inválido", + "@invalidServerName": {}, + "chatPermissions": "Permissões da conversa", + "@chatPermissions": {}, + "signInWithPassword": "Autenticar com senha", + "@signInWithPassword": {}, + "makeAdminDescription": "Assim que promover este usuário a administrador, não poderá desfazê-lo e ele terá as mesmas permissões que você.", + "@makeAdminDescription": {}, + "setChatDescription": "Inserir descrição da conversa", + "@setChatDescription": {}, + "noOtherDevicesFound": "Nenhum outro dispositivo encontrado", + "@noOtherDevicesFound": {}, + "redactedBy": "Removido por {username}", + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "signInWith": "Autenticar com {provider}", + "@signInWith": { + "type": "String", + "placeholders": { + "provider": { + "type": "String" + } + } + }, + "fileIsTooBigForServer": "O servidor avisa que o arquivo é grande demais para ser enviado.", + "@fileIsTooBigForServer": {}, + "readUpToHere": "Marcar como lido até aqui", + "@readUpToHere": {}, + "optionalRedactReason": "(Opcional) Motivo para remover esta mensagem.", + "@optionalRedactReason": {}, + "archiveRoomDescription": "A conversa será movida para o arquivo. Outros usuários verão que você deixou a conversa.", + "@archiveRoomDescription": {}, + "inviteContactToGroupQuestion": "Você quer convidar {contact} para a conversa \"{groupName}\"?", + "@inviteContactToGroupQuestion": {}, + "redactedByBecause": "Removido por {username}, pois: \"{reason}\"", + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "fileHasBeenSavedAt": "Arquivo salvo em {path}", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "redactMessageDescription": "A mensagem será removida para todos participantes desta conversa. Isto não poderá ser desfeito.", + "@redactMessageDescription": {}, + "invalidInput": "Inserção inválida!", + "@invalidInput": {}, + "report": "Relatar", + "@report": {}, + "addChatDescription": "Inserir descrição da conversa...", + "@addChatDescription": {}, + "hasKnocked": "🚪 {user} bateu na porta", + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "openLinkInBrowser": "Abrir no navegador", + "@openLinkInBrowser": {}, + "disableEncryptionWarning": "Por razões de segurança, não possível desabilitar a encriptação uma vez habilitada.", + "@disableEncryptionWarning": {}, + "directChat": "Conversa direta", + "@directChat": {}, + "wrongPinEntered": "PIN incorreto! Tente novamente em {seconds} segundos...", + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "inviteGroupChat": "📨 Convidar para o grupo", + "@inviteGroupChat": {}, + "invitePrivateChat": "📨 Convidar para uma conversa privada", + "@invitePrivateChat": {}, + "wasDirectChatDisplayName": "Conversa vazia (era {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "noChatDescriptionYet": "Nenhuma descrição da conversa disponível.", + "@noChatDescriptionYet": {}, + "learnMore": "Saiba mais", + "@learnMore": {}, + "chatDescriptionHasBeenChanged": "Descrição da conversa alterada", + "@chatDescriptionHasBeenChanged": {}, + "roomUpgradeDescription": "A conversa será recriada com a nova versão de sala. Todos participantes será notificados e terão que migrar para a nova sala. Você pode encontrar mais informações sobre versões de sala em https://spec.matrix.org/latest/room/", + "@roomUpgradeDescription": {}, + "pleaseEnterANumber": "Por favor, insira um número maior que 0", + "@pleaseEnterANumber": {}, + "profileNotFound": "O usuário não foi encontrado neste servidor. Talvez um problema de conexão ou o usuário não existe.", + "@profileNotFound": {}, + "jump": "Pular", + "@jump": {}, + "sorryThatsNotPossible": "Desculpe... isto não é possível", + "@sorryThatsNotPossible": {}, + "shareInviteLink": "Compartilhar convite", + "@shareInviteLink": {}, + "deviceKeys": "Chaves de dispositivo:", + "@deviceKeys": {}, + "emoteKeyboardNoRecents": "Emotes recentes aparecem aqui...", + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "setTheme": "Aplicar tema:", + "@setTheme": {}, + "pleaseTryAgainLaterOrChooseDifferentServer": "Por favor, tente novamente mais tarde ou escolha um servidor diferente.", + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "createGroup": "Criar grupo", + "@createGroup": {}, + "noBackupWarning": "Atenção! Sem habilitar o backup de conversa, você perderá acesso a suas mensagens encriptadas. É altamente recomendável habilitar o backup antes de encerrar a sessão.", + "@noBackupWarning": {}, + "kickUserDescription": "O usuário foi enxotado da conversa, mas não banido. Em conversas públicas, o usuário pode reingressar a qualquer momento.", + "@kickUserDescription": {}, + "invite": "Convidar", + "@invite": {}, + "blockListDescription": "Você pode bloquear usuários que estejam perturbando. Você não receberá mensagens ou convites de usuários na sua lista pessoal de bloqueios.", + "@blockListDescription": {}, + "createGroupAndInviteUsers": "Criar um grupo e convidar pessoas", + "@createGroupAndInviteUsers": {}, + "thisDevice": "Este dispositivo:", + "@thisDevice": {}, + "startConversation": "Começar uma conversa", + "@startConversation": {}, + "publicSpaces": "Espaços públicos", + "@publicSpaces": {}, + "blockedUsers": "Usuários bloqueados", + "@blockedUsers": {}, + "passwordIsWrong": "A senha inserida está incorreta", + "@passwordIsWrong": {}, + "pleaseEnterYourCurrentPassword": "Por favor, insira sua senha atual", + "@pleaseEnterYourCurrentPassword": {}, + "groupCanBeFoundViaSearch": "Grupos podem ser encontrados via busca", + "@groupCanBeFoundViaSearch": {}, + "publicLink": "Link público", + "@publicLink": {}, + "noUsersFoundWithQuery": "Infelizmente, não foi encontrado usuário via \"{query}\". Por favor, verifique se digitou corretamente.", + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "block": "Bloquear", + "@block": {}, + "nothingFound": "Nada foi encontrado...", + "@nothingFound": {}, + "yourGlobalUserIdIs": "Seu ID global é: ", + "@yourGlobalUserIdIs": {}, + "decline": "Rejeitar", + "@decline": {}, + "newPassword": "Nova senha", + "@newPassword": {}, + "passwordsDoNotMatch": "Senhas não batem", + "@passwordsDoNotMatch": {}, + "commandHint_sendraw": "Enviar JSON puro", + "@commandHint_sendraw": {}, + "wrongRecoveryKey": "Desculpe... esta não parece ser a chave de recuperação correta.", + "@wrongRecoveryKey": {}, + "subspace": "Subespaço", + "@subspace": {}, + "select": "Selecionar", + "@select": {}, + "pleaseChooseAStrongPassword": "Por favor, escolha uma senha forte", + "@pleaseChooseAStrongPassword": {}, + "blockUsername": "Ignore usuário", + "@blockUsername": {}, + "addChatOrSubSpace": "Adicionar conversa ou subespaço", + "@addChatOrSubSpace": {}, + "groupName": "Nome do grupo", + "@groupName": {}, + "leaveEmptyToClearStatus": "Deixe em branco para limpar seu Status.", + "@leaveEmptyToClearStatus": {}, + "joinSpace": "Ingressar no espaço", + "@joinSpace": {}, + "searchForUsers": "Buscar por @usuários...", + "@searchForUsers": {}, + "databaseMigrationTitle": "Banco de dados otimizado", + "@databaseMigrationTitle": {}, + "searchChatsRooms": "Buscar por #conversas, @usuários...", + "@searchChatsRooms": {}, + "databaseMigrationBody": "Por favor, espere. Isto pode demorar um pouco.", + "@databaseMigrationBody": {}, + "youInvitedToBy": "Você foi convidado através do link para:\n{alias}", + "@youInvitedToBy": { + "placeholders": { + "alias": { + "type": "String" + } + } + }, + "forwardMessageTo": "Encaminhar mensagem para {roomName}?", + "@forwardMessageTo": { + "type": "String", + "placeholders": { + "roomName": { + "type": "String" + } + } + }, + "formattedMessagesDescription": "Mostrar mensagens ricas com conteúdos tipo negrito usando markdown.", + "@formattedMessagesDescription": {}, + "verifyOtherUser": "🔐 Verificar outro usuário", + "@verifyOtherUser": {}, + "verifyOtherDevice": "🔐 Verificar outro aparelho", + "@verifyOtherDevice": {}, + "acceptedKeyVerification": "{sender} aceitou sua chave de verificação", + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "startedKeyVerification": "{sender} iniciou a chave de verificação", + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "transparent": "Transparente", + "@transparent": {}, + "databaseBuildErrorBody": "Não foi possível construir o banco de dados SQLite. O aplicativo tentará utilizar o banco de dados legado por enquanto. Por favor, reporte este erro aos desenvolvedores em {url}. A mensagem de erro é: {error}", + "@databaseBuildErrorBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "initAppError": "Ocorreu um erro enquanto o aplicativo era iniciado", + "@initAppError": {}, + "restoreSessionBody": "O aplicativo tentará agora restaurar sua sessão a partir do backup. Por favor, reporte este ao desenvolvedor em {url}. A mensagem de erro é: {error}", + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "sendReadReceipts": "Enviar recibos de leitura", + "@sendReadReceipts": {}, + "sendTypingNotificationsDescription": "Outros participantes neste chat podem ver quando você está digitando uma nova mensagem.", + "@sendTypingNotificationsDescription": {}, + "formattedMessages": "Mensagens formatadas", + "@formattedMessages": {}, + "presenceStyle": "Presença:", + "@presenceStyle": { + "type": "String", + "placeholders": {} + }, + "presencesToggle": "Mostrar o status das mensagens de outros usuários", + "@presencesToggle": { + "type": "String", + "placeholders": {} + }, + "commandHint_ignore": "Ignorar o seguinte ID Matrix", + "@commandHint_ignore": {}, + "commandHint_unignore": "Designorar o seguinte ID Matrix", + "@commandHint_unignore": {}, + "hidePresences": "Esconder lista de status?", + "@hidePresences": {}, + "sessionLostBody": "Sua sessão foi desconectada. Por favor, reporte este ao desenvolvedor em {url}. A mensagem de erro é: {error}", + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "sendReadReceiptsDescription": "Outros participantes neste chat podem ver quando você tiver lido uma mensagem.", + "@sendReadReceiptsDescription": {}, + "verifyOtherUserDescription": "Se você verificar outro usuário, você terá certeza que você conhece com quem está conversando. 💪\n\nQuando iniciar uma verificação, você e o outro usuário receberão um popup no aplicativo. Então vocês receberão uma série de emojis ou números para comparar um com o outro.\n\nA melhor maneira de fazer este procedimento é encontrar pessoalmente ou através de um vídeochamada. 👭", + "@verifyOtherUserDescription": {}, + "requestedKeyVerification": "{sender} enviou uma chave de verificação", + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "verifyOtherDeviceDescription": "Quando você verifica outro aparelho, estes aparelhos poderão trocar chaves, aumentando sua segurança. 💪\n\nQuando iniciar a verificação, um popup aparecerá no aplicativo em ambos os aparelhos. Então você verá uma série de emojis ou números que você terá que comparar um com o outro.\n\nÉ melhor fazer esse procedimento com ambos os aparelhos em mãos antes de começar a verificação. 🤳", + "@verifyOtherDeviceDescription": {}, + "canceledKeyVerification": "{sender} cancelou sua chave de verificação", + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "isReadyForKeyVerification": "{sender} está pronto para a chave de verificação", + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "completedKeyVerification": "{sender} completou a chave de verificação", + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "stickers": "Stickers", + "@stickers": {}, + "discover": "Descubra", + "@discover": {}, + "incomingMessages": "Mensagens recebidas", + "@incomingMessages": {}, + "unreadChatsInApp": "{appname}: {unread} mensagens não lidas", + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "appLockDescription": "Bloquear o app com um código PIN quando não estiver usando", + "@appLockDescription": {}, + "accessAndVisibilityDescription": "Quem é permitido entrar nesse chat e como pode ser descoberto.", + "@accessAndVisibilityDescription": {}, + "calls": "Chamadas", + "@calls": {}, + "customEmojisAndStickers": "Emojis e stickers customizados", + "@customEmojisAndStickers": {}, + "customEmojisAndStickersBody": "Adicionar ou compartilhar emojis ou stickers customizados que podem ser usados em qualquer chat.", + "@customEmojisAndStickersBody": {}, + "hideRedactedMessages": "Esconder mensagens excluídas", + "@hideRedactedMessages": {}, + "hideRedactedMessagesBody": "Se alguém excluir uma mensagem, esta mensagem não será mais visível no chat.", + "@hideRedactedMessagesBody": {}, + "hideInvalidOrUnknownMessageFormats": "Esconder formatos de mensagem inválidos ou desconhecidos", + "@hideInvalidOrUnknownMessageFormats": {}, + "hideMemberChangesInPublicChats": "Esconder mudanças de membro em chats públicos", + "@hideMemberChangesInPublicChats": {}, + "hideMemberChangesInPublicChatsBody": "Não mostre se alguém entrou ou saiu no chat para melhorar a legibilidade.", + "@hideMemberChangesInPublicChatsBody": {}, + "overview": "Visão geral", + "@overview": {}, + "notifyMeFor": "Notificar me para", + "@notifyMeFor": {}, + "usersMustKnock": "Usuários devem bater na porta", + "@usersMustKnock": {}, + "noOneCanJoin": "Ninguém pode entrar", + "@noOneCanJoin": {}, + "knocking": "Batendo na porta", + "@knocking": {}, + "chatCanBeDiscoveredViaSearchOnServer": "O chat pode ser descoberto pela pesquisa em {server}", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "publicChatAddresses": "Endereços de chat públicos", + "@publicChatAddresses": {}, + "thereAreCountUsersBlocked": "Nesse momento, há {count} usuários bloqueados.", + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "globalChatId": "ID de chat global", + "@globalChatId": {}, + "accessAndVisibility": "Acesso e visibilidade", + "@accessAndVisibility": {}, + "passwordRecoverySettings": "Configurações de recuperação de senha", + "@passwordRecoverySettings": {}, + "userWouldLikeToChangeTheChat": "{user} gostaria de entrar no chat.", + "@userWouldLikeToChangeTheChat": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "noPublicLinkHasBeenCreatedYet": "Nenhum link público foi criado ainda", + "@noPublicLinkHasBeenCreatedYet": {}, + "userRole": "Cargo do usuário", + "@userRole": {}, + "minimumPowerLevel": "{level} é o nível mínimo de poder.", + "@minimumPowerLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "String" + } + } + }, + "noDatabaseEncryption": "A criptografia do banco de dados não é suportada nesta plataforma", + "@noDatabaseEncryption": {}, + "createNewAddress": "Criar um novo endereço", + "@createNewAddress": {}, + "knock": "Bater na porta", + "@knock": {}, + "searchIn": "Pesquisar em {chat}...", + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "restricted": "Restrito", + "@restricted": {}, + "knockRestricted": "Bater na porta restrito", + "@knockRestricted": {}, + "searchMore": "Pesquisar mais...", + "@searchMore": {}, + "gallery": "Galeria", + "@gallery": {}, + "files": "Arquivos", + "@files": {} +} diff --git a/assets/l10n/intl_pt_PT.arb b/assets/l10n/intl_pt_PT.arb new file mode 100644 index 0000000..1938b24 --- /dev/null +++ b/assets/l10n/intl_pt_PT.arb @@ -0,0 +1,1715 @@ +{ + "repeatPassword": "Repete a palavra-passe", + "@repeatPassword": {}, + "about": "Acerca de", + "@about": { + "type": "String", + "placeholders": {} + }, + "accept": "Aceitar", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "{username} aceitou o convite", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "Conta", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "{username} ativou encriptação ponta-a-ponta", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "addEmail": "Adicionar correio eletrónico", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "addToSpace": "Adicionar ao espaço", + "@addToSpace": {}, + "admin": "Admin", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "alcunha", + "@alias": { + "type": "String", + "placeholders": {} + }, + "all": "Todos(as)", + "@all": { + "type": "String", + "placeholders": {} + }, + "allChats": "Todas as conversas", + "@allChats": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "{senderName} atendeu a chamada", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "Qualquer pessoa pode entrar", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "archive": "Arquivo", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "Todos os visitantes podem entrar", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "Tens a certeza?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "areYouSureYouWantToLogout": "Tens a certeza que queres sair?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "Para poderes assinar a outra pessoa, por favor, insere a tua senha de armazenamento seguro ou a chave de recuperação.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "Aceitar este pedido de verificação de {username}?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "autoplayImages": "Automaticamente reproduzir autocolantes e emotes animados", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "sendOnEnter": "Enviar com Enter", + "@sendOnEnter": {}, + "badServerVersionsException": "O servidor suporta as versões Spec:\n{serverVersions}\nMas esta aplicação apenas suporta {suportedVersions}", + "@badServerVersionsException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "badServerLoginTypesException": "O servidor suporta os tipos de início de sessão:\n{serverVersions}\nMas esta aplicação apenas suporta:\n{suportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "banFromChat": "Banir da conversa", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "Banido(a)", + "@banned": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username} baniu {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "Bloquear dispositivo", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "blocked": "Bloqueado", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "botMessages": "Mensagens de robôs", + "@botMessages": { + "type": "String", + "placeholders": {} + }, + "cancel": "Cancelar", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "cantOpenUri": "Não é possível abrir o URI {uri}", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "changeDeviceName": "Alterar nome do dispositivo", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changedTheChatPermissions": "{username} alterou as permissões da conversa", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username} alterou o seu nome para: '{displayname}'", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} alterou as regras de acesso de visitantes para: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username} alterou as regras de entrada", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} alterou as regras de entrada para: {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} alterou o seu avatar", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "{username} alterou as alcunhas da sala", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username} alterou a ligação de convite", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changePassword": "Alterar palavra-passe", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "Alterar o servidor", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "Alterar o teu estilo", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "Alterar o nome do grupo", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "changeYourAvatar": "Alterar o teu avatar", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "A encriptação foi corrompida", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "chat": "Conversa", + "@chat": { + "type": "String", + "placeholders": {} + }, + "yourChatBackupHasBeenSetUp": "A cópia de segurança foi configurada.", + "@yourChatBackupHasBeenSetUp": {}, + "chatBackup": "Cópia de segurança de conversas", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "chatBackupDescription": "A tuas mensagens antigas estão protegidas com uma chave de recuperação. Por favor, certifica-te que não a perdes.", + "@chatBackupDescription": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Detalhes de conversa", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chatHasBeenAddedToThisSpace": "A conversa foi adicionada a este espaço", + "@chatHasBeenAddedToThisSpace": {}, + "chats": "Conversas", + "@chats": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "Escolhe uma palavra-passe forte", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "clearArchive": "Limpar arquivo", + "@clearArchive": {}, + "close": "Fechar", + "@close": { + "type": "String", + "placeholders": {} + }, + "commandHint_ban": "Banir o utilizador dado desta sala", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_html": "Enviar texto formatado com HTML", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_invite": "Convidar o utilizador dado a esta sala", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "commandHint_join": "Entrar na sala dada", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_kick": "Remover o utilizador dado desta sala", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_leave": "Sair desta sala", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_me": "Descreve-te", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "commandHint_myroomavatar": "Definir a tua imagem para esta sala (por mxc-uri)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_myroomnick": "Definir o teu nome para esta sala", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "commandHint_op": "Definir o nível de poder do utilizador dado (por omissão: 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_plain": "Enviar texto não formatado", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_react": "Enviar respostas como reações", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "commandHint_send": "Enviar texto", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "commandHint_unban": "Perdoar o utilizador dado", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "commandInvalid": "Comando inválido", + "@commandInvalid": { + "type": "String" + }, + "commandMissing": "{command} não é um comando.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "compareEmojiMatch": "Compara e certifica-te que os emojis que se seguem correspondem aos do outro dispositivo:", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "Compara e certifica-te que os números que se seguem correspondem aos do outro dispositivo:", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "configureChat": "Configurar conversa", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "confirm": "Confirmar", + "@confirm": { + "type": "String", + "placeholders": {} + }, + "connect": "Ligar", + "@connect": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "O contacto foi convidado para o grupo", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "containsDisplayName": "Contém nome de exibição", + "@containsDisplayName": { + "type": "String", + "placeholders": {} + }, + "containsUserName": "Contém nome de utilizador", + "@containsUserName": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "O conteúdo foi denunciado aos admins do servidor", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "Copiado para a área de transferência", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "Copiar", + "@copy": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "Copiar para a área de transferência", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "Não foi possível desencriptar mensagem: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "countParticipants": "{count} participantes", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "create": "Criar", + "@create": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "{username} criou a conversa", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "createNewSpace": "Novo espaço", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "currentlyActive": "Ativo(a) agora", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "Escuro", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date} às {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "dateWithoutYear": "{day}-{month}", + "@dateWithoutYear": { + "type": "String", + "placeholders": { + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "dateWithYear": "{day}-{month}-{year}", + "@dateWithYear": { + "type": "String", + "placeholders": { + "year": { + "type": "String" + }, + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "deactivateAccountWarning": "Isto irá desativar a tua conta. Não é reversível! Tens a certeza?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "Nível de permissão normal", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "delete": "Eliminar", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "Eliminar conta", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "Eliminar mensagem", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "device": "Dispositivo", + "@device": { + "type": "String", + "placeholders": {} + }, + "deviceId": "ID de dispositivo", + "@deviceId": { + "type": "String", + "placeholders": {} + }, + "devices": "Dispositivos", + "@devices": { + "type": "String", + "placeholders": {} + }, + "directChats": "Conversas diretas", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "Nome de exibição alterado", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "Descarregar ficheiro", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "edit": "Editar", + "@edit": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "Editar servidores bloqueados", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "editDisplayname": "Editar nome de exibição", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "editRoomAliases": "Editar alcunhas da sala", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "Editar avatar da sala", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "Emote já existente!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "Código de emote inválido!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emotePacks": "Pacotes de emotes da sala", + "@emotePacks": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "Configurações de emotes", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "emoteShortcode": "Código do emote", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emoteWarnNeedToPick": "Precisas de escolher um código de emote e uma imagem!", + "@emoteWarnNeedToPick": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "Conversa vazia", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "Ativar pacote de emotes globalmente", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "Ativar encriptação", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "Nunca mais poderás desativar a encriptação. Tens a certeza?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "encrypted": "Encriptada", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "encryption": "Encriptação", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "A encriptação não está ativada", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName} terminou a chamada", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "enterAnEmailAddress": "Insere um endereço de correio eletrónico", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "homeserver": "Servidor", + "@homeserver": {}, + "enterYourHomeserver": "Insere o teu servidor", + "@enterYourHomeserver": { + "type": "String", + "placeholders": {} + }, + "errorObtainingLocation": "Erro ao obter localização: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "everythingReady": "Tudo a postos!", + "@everythingReady": { + "type": "String", + "placeholders": {} + }, + "extremeOffensive": "Extremamente ofensivo", + "@extremeOffensive": { + "type": "String", + "placeholders": {} + }, + "fileName": "Nome do ficheiro", + "@fileName": { + "type": "String", + "placeholders": {} + }, + "fluffychat": "FluffyChat", + "@fluffychat": { + "type": "String", + "placeholders": {} + }, + "fontSize": "Tamanho da letra", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "forward": "Reencaminhar", + "@forward": { + "type": "String", + "placeholders": {} + }, + "goToTheNewRoom": "Ir para a nova sala", + "@goToTheNewRoom": { + "type": "String", + "placeholders": {} + }, + "group": "Grupo", + "@group": { + "type": "String", + "placeholders": {} + }, + "groupIsPublic": "O grupo é público", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "groups": "Grupos", + "@groups": { + "type": "String", + "placeholders": {} + }, + "groupWith": "Grupo com {displayname}", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "guestsAreForbidden": "São proibidos visitantes", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "Podem entrar visitantes", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{username} revogou o convite para {targetName}", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "help": "Ajuda", + "@help": { + "type": "String", + "placeholders": {} + }, + "hideRedactedEvents": "Esconder eventos eliminados", + "@hideRedactedEvents": { + "type": "String", + "placeholders": {} + }, + "hideUnknownEvents": "Esconder eventos desconhecidos", + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "howOffensiveIsThisContent": "Quão ofensivo é este conteúdo?", + "@howOffensiveIsThisContent": { + "type": "String", + "placeholders": {} + }, + "id": "ID", + "@id": { + "type": "String", + "placeholders": {} + }, + "identity": "Identidade", + "@identity": { + "type": "String", + "placeholders": {} + }, + "ignore": "Ignorar", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "ignoredUsers": "Utilizadores ignorados", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "iHaveClickedOnLink": "Eu cliquei na ligação", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "Senha ou chave de recuperação incorretos", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "inoffensive": "Inofensivo", + "@inoffensive": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "Convidar contacto", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "Convidar contacto para {groupName}", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "invited": "Convidado(a)", + "@invited": { + "type": "String", + "placeholders": {} + }, + "invitedUser": "{username} convidou {targetName}", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "invitedUsersOnly": "Utilizadores(as) convidados(as) apenas", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "inviteForMe": "Convite para mim", + "@inviteForMe": { + "type": "String", + "placeholders": {} + }, + "inviteText": "{username} convidou-te para o FluffyChat.\n1. Instala o FluffyChat: https://fluffychat.im\n2. Regista-te ou inicia sessão.\n3. Abre a ligação de convite: {link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "isTyping": "está a escrever…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "{username} entrou na conversa", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "joinRoom": "Entrar na sala", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "kicked": "{username} expulsou {targetName}", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickedAndBanned": "{username} expulsou e baniu {targetName}", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickFromChat": "Expulsar da conversa", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "Ativo(a) pela última vez: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "leave": "Sair", + "@leave": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "Saiu da conversa", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "license": "Licença", + "@license": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "Claro", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "Carregar mais {count} participantes", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "loadingPleaseWait": "A carregar... Por favor aguarde.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "loadMore": "Carregar mais…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "locationDisabledNotice": "Os serviços de localização estão desativados. Por favor, ativa-os para poder partilhar a sua localização.", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "locationPermissionDeniedNotice": "Permissão de localização recusada. Por favor, concede permissão para poderes partilhar a tua posição.", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "login": "Entrar", + "@login": { + "type": "String", + "placeholders": {} + }, + "logInTo": "Entrar em {homeserver}", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "logout": "Sair", + "@logout": { + "type": "String", + "placeholders": {} + }, + "memberChanges": "Alterações de membros", + "@memberChanges": { + "type": "String", + "placeholders": {} + }, + "mention": "Mencionar", + "@mention": { + "type": "String", + "placeholders": {} + }, + "messages": "Mensagens", + "@messages": { + "type": "String", + "placeholders": {} + }, + "moderator": "Moderador", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "muteChat": "Silenciar conversa", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "needPantalaimonWarning": "Por favor,", + "@needPantalaimonWarning": { + "type": "String", + "placeholders": {} + }, + "newChat": "Nova conversa", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "Nova mensagem no FluffyChat", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "Novo pedido de verificação!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "next": "Próximo", + "@next": { + "type": "String", + "placeholders": {} + }, + "no": "Não", + "@no": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "Nenhuma ligação ao servidor", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "Nenhuns emotes encontrados. 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "Só podes ativar a encriptação quando a sala não for publicamente acessível.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "Parece que não tens nenhuns serviços da Google no seu telemóvel. É uma boa decisão para a sua privacidade! Para receber notificações instantâneas no FluffyChat, recomendamos que uses https://microg.org/ ou https://unifiedpush.org/.", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "noMatrixServer": "{server1} não é um servidor Matrix, usar {server2}?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "none": "Nenhum", + "@none": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "{username} alterou o avatar da conversa", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username} alterou a visibilidade do histórico para: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheChatDescriptionTo": "{username} alterou a descrição da conversa para: '{description}'", + "@changedTheChatDescriptionTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "description": { + "type": "String" + } + } + }, + "changedTheChatNameTo": "{username} alterou o nome da conversa para: '{chatname}'", + "@changedTheChatNameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "chatname": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} alterou as regras de acesso de visitantes", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username} alterou a visibilidade do histórico", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sendAMessage": "Enviar a mensagem", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "sendAudio": "Enviar áudio", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendAsText": "Enviar como texto", + "@sendAsText": { + "type": "String" + }, + "send": "Enviar", + "@send": { + "type": "String", + "placeholders": {} + }, + "appLock": "Bloqueio da aplicação", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "noPasswordRecoveryDescription": "Ainda não adicionaste uma forma de recuperar a tua palavra-passe.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "noPermission": "Sem permissão", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "Não foram encontradas nenhumas salas…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "notifications": "Notificações", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "notificationsEnabledForThisAccount": "Notificações ativadas para esta conta", + "@notificationsEnabledForThisAccount": { + "type": "String", + "placeholders": {} + }, + "numUsersTyping": "Estão {count} utilizadores(as) a escrever…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "obtainingLocation": "A obter localização…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "offensive": "Offensivo", + "@offensive": { + "type": "String", + "placeholders": {} + }, + "offline": "Offline", + "@offline": { + "type": "String", + "placeholders": {} + }, + "ok": "ok", + "@ok": { + "type": "String", + "placeholders": {} + }, + "online": "Online", + "@online": { + "type": "String", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "A cópia de segurança online de chaves está ativada", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "oopsPushError": "Ups! Infelizmente, ocorreu um erro ao configurar as notificações instantâneas.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "Ups, algo correu mal…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "Abrir aplicação para ler mensagens", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "openCamera": "Abrir câmara", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "oneClientLoggedOut": "Um dos teus clientes terminou sessão", + "@oneClientLoggedOut": {}, + "addAccount": "Adicionar conta", + "@addAccount": {}, + "editBundlesForAccount": "Editar pacotes para esta conta", + "@editBundlesForAccount": {}, + "addToBundle": "Adicionar ao pacote", + "@addToBundle": {}, + "removeFromBundle": "Remover deste pacote", + "@removeFromBundle": {}, + "bundleName": "Nome do pacote", + "@bundleName": {}, + "enableMultiAccounts": "(BETA) Ativar múltiplas contas neste dispositivo", + "@enableMultiAccounts": {}, + "openInMaps": "Abrir nos mapas", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "link": "Ligação", + "@link": {}, + "serverRequiresEmail": "Este servidor precisa de validar o teu endereço de correio eletrónico para o registo.", + "@serverRequiresEmail": {}, + "or": "Ou", + "@or": { + "type": "String", + "placeholders": {} + }, + "participant": "Participante", + "@participant": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "senha ou chave de recuperação", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "password": "Palavra-passe", + "@password": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "Palavra-passe esquecida", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "A palavra-passe foi alterada", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "passwordRecovery": "Recuperação de palavra-passe", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "people": "Pessoas", + "@people": { + "type": "String", + "placeholders": {} + }, + "pickImage": "Escolher uma imagem", + "@pickImage": { + "type": "String", + "placeholders": {} + }, + "pin": "Afixar", + "@pin": { + "type": "String", + "placeholders": {} + }, + "play": "Reproduzir {fileName}", + "@play": { + "type": "String", + "placeholders": { + "fileName": { + "type": "String" + } + } + }, + "pleaseChoose": "Por favor, escolhe", + "@pleaseChoose": { + "type": "String", + "placeholders": {} + }, + "pleaseChooseAPasscode": "Por favor, escolhe um código-passe", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "pleaseClickOnLink": "Por favor, clica na ligação no correio eletrónico e depois continua.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "pleaseEnter4Digits": "Por favor, insere 4 dígitos ou deixa vazio para desativar o bloqueio da aplicação.", + "@pleaseEnter4Digits": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPassword": "Por favor, insere a tua palavra-passe", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPin": "Por favor, insere o teu código", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "Por favor, insere o teu nome de utilizador", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "Por favor, segue as instruções no website e clica em \"Seguinte\".", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "privacy": "Privacidade", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "Salas públicas", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "reason": "Razão", + "@reason": { + "type": "String", + "placeholders": {} + }, + "redactedAnEvent": "{username} eliminou um evento", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "recording": "A gravar", + "@recording": { + "type": "String", + "placeholders": {} + }, + "redactMessage": "Eliminar mensagem", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "register": "Registar", + "@register": { + "type": "String", + "placeholders": {} + }, + "reject": "Rejeitar", + "@reject": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "{username} rejeitou o convite", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "rejoin": "Reentrar", + "@rejoin": { + "type": "String", + "placeholders": {} + }, + "remove": "Remover", + "@remove": { + "type": "String", + "placeholders": {} + }, + "removeAllOtherDevices": "Remover todos os outros dispositivos", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "removedBy": "Removido por {username}", + "@removedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "removeDevice": "Remover dispositivo", + "@removeDevice": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "Perdoar nesta conversa", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "removeYourAvatar": "Remover o teu avatar", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "renderRichContent": "Exibir conteúdo de mensagem rico", + "@renderRichContent": { + "type": "String", + "placeholders": {} + }, + "replaceRoomWithNewerVersion": "Substituir sala com versão mais recente", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "reply": "Responder", + "@reply": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "Reportar mensagem", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "requestPermission": "Pedir permissão", + "@requestPermission": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "A sala foi atualizada", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "Versão da sala", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "saveFile": "Guardar ficheiro", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "search": "Procurar", + "@search": { + "type": "String", + "placeholders": {} + }, + "security": "Segurança", + "@security": { + "type": "String", + "placeholders": {} + }, + "seenByUser": "Visto por {username}", + "@seenByUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sendFile": "Enviar ficheiro", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendImage": "Enviar imagem", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendMessages": "Enviar mensagens", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "sendOriginal": "Enviar original", + "@sendOriginal": { + "type": "String", + "placeholders": {} + }, + "sendSticker": "Enviar autocolante", + "@sendSticker": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "Enviar vídeo", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "sentAFile": "{username} enviar um ficheiro", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAnAudio": "{username} enviar um áudio", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAPicture": "{username} enviar uma imagem", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentASticker": "{username} enviou um autocolante", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "{username} enviou um vídeo", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "commandHint_clearcache": "Limpar cache", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_create": "Criar uma conversa de grupo vazia\nUsa --no-encryption para desativar a encriptação", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "commandHint_discardsession": "Descartar sessão", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "commandHint_dm": "Iniciar uma conversa direta\nUsa --no-encryption para desativar a encriptação", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "dehydrate": "Exportar sessão e limpar dispositivo", + "@dehydrate": {}, + "dehydrateWarning": "Esta ação não pode ser revertida. Assegura-te que guardas bem a cópia de segurança.", + "@dehydrateWarning": {}, + "hydrateTorLong": "Exportaste a tua sessão na última vez que estiveste no TOR? Importa-a rapidamente e continua a conversar.", + "@hydrateTorLong": {}, + "dehydrateTor": "Utilizadores do TOR: Exportar sessão", + "@dehydrateTor": {}, + "hydrate": "Restaurar a partir de cópia de segurança", + "@hydrate": {}, + "hydrateTor": "Utilizadores do TOR: Importar sessão", + "@hydrateTor": {}, + "dehydrateTorLong": "Para utilizadores do TOR, é recomendado exportar a sessão antes de fechar a janela.", + "@dehydrateTorLong": {} +} diff --git a/assets/l10n/intl_ro.arb b/assets/l10n/intl_ro.arb new file mode 100644 index 0000000..de592fd --- /dev/null +++ b/assets/l10n/intl_ro.arb @@ -0,0 +1,2517 @@ +{ + "@@last_modified": "2021-08-14 12:41:09.918296", + "about": "Despre", + "@about": { + "type": "String", + "placeholders": {} + }, + "accept": "Accept", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "{username} a aceptat invitați", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "Cont", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "{username} a activat criptarea end-to-end", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "admin": "Administrator", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "poreclă", + "@alias": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "{senderName} a acceptat apelul", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "Oricine se poate alătura", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "archive": "Arhivă", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "Vizitatorii \"guest\" se pot alătura", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "Ești sigur?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "Pentru a putea conecta cealaltă persoană, te rog introdu parola sau cheia ta de recuperare.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "Accepți cererea de verificare de la {username}?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "banFromChat": "Interzis din conversație", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "Interzis", + "@banned": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username} a interzis pe {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "Blochează dispozitiv", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "cancel": "Anulează", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "changeDeviceName": "Schimbă numele dispozitiv", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "{username} a schimbat poza conversați", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatDescriptionTo": "{username} a schimbat descrierea grupului în '{description}'", + "@changedTheChatDescriptionTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "description": { + "type": "String" + } + } + }, + "changedTheChatNameTo": "{username} a schimbat porecla în '{chatname}'", + "@changedTheChatNameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "chatname": { + "type": "String" + } + } + }, + "commandHint_unban": "Dezinterziceți utilizatorul ales din această cameră", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "deviceId": "ID-ul Dispozitiv", + "@deviceId": { + "type": "String", + "placeholders": {} + }, + "devices": "Dispozitive", + "@devices": { + "type": "String", + "placeholders": {} + }, + "directChats": "Chaturi directe", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName} a terminat apelul", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "enterYourHomeserver": "Introduceți homeserverul vostru", + "@enterYourHomeserver": { + "type": "String", + "placeholders": {} + }, + "groupWith": "Grup cu {displayname}", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "howOffensiveIsThisContent": "Cât de ofensiv este acest conținut?", + "@howOffensiveIsThisContent": { + "type": "String", + "placeholders": {} + }, + "kickFromChat": "Dați afară din chat", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "rejoin": "Reintrați", + "@rejoin": { + "type": "String", + "placeholders": {} + }, + "sentCallInformations": "{senderName} a trimis informație de apel", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "showPassword": "Afișați parola", + "@showPassword": { + "type": "String", + "placeholders": {} + }, + "no": "Nu", + "@no": { + "type": "String", + "placeholders": {} + }, + "sendMessages": "Trimiteți mesaje", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "submit": "Trimiteți", + "@submit": { + "type": "String", + "placeholders": {} + }, + "unreadChats": "{unreadCount, plural, =1{Un chat necitit} other{{unreadCount} chaturi necitite}}", + "@unreadChats": { + "type": "String", + "placeholders": { + "unreadCount": { + "type": "int" + } + } + }, + "verifySuccess": "A reușit verificarea!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "Mesaj vocal", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "wallpaper": "Imagine de fundal", + "@wallpaper": { + "type": "String", + "placeholders": {} + }, + "reactedWith": "{sender} a reacționat cu {reaction}", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "changePassword": "Schimbați parola", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "next": "Următor", + "@next": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "Fără conexiune la server", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "noPasswordRecoveryDescription": "Nu ați adăugat încă nici un mod de recuperare pentru parola voastră.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "notifications": "Notificări", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "openVideoCamera": "Deschideți camera pentru video", + "@openVideoCamera": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "Deschideți aplicația să citiți mesajele", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "openCamera": "Deschideți camera", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "removedBy": "Eliminat de {username}", + "@removedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "removeDevice": "Eliminați dispozitivul", + "@removeDevice": { + "type": "String", + "placeholders": {} + }, + "share": "Partajați", + "@share": { + "type": "String", + "placeholders": {} + }, + "shareLocation": "Partajați locația", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "skip": "Săriți peste", + "@skip": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "Codul surs", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "spaceIsPublic": "Spațiul este public", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "spaceName": "Numele spațiului", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "toggleFavorite": "Comutați favoritul", + "@toggleFavorite": { + "type": "String", + "placeholders": {} + }, + "unblockDevice": "Debloca dispozitiv", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "Dispozitiv necunoscut", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "verify": "Verificați", + "@verify": { + "type": "String", + "placeholders": {} + }, + "weSentYouAnEmail": "V-am trimis un email", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "Nu mai participați în acest chat", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "yourPublicKey": "Cheia voastră publică", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "addToSpaceDescription": "Alegeți un spațiu în care să adăugați acest chat.", + "@addToSpaceDescription": {}, + "placeCall": "Faceți apel", + "@placeCall": {}, + "voiceCall": "Apel vocal", + "@voiceCall": {}, + "unsupportedAndroidVersion": "Versiune de Android nesuportat", + "@unsupportedAndroidVersion": {}, + "previousAccount": "Contul anterior", + "@previousAccount": {}, + "userIsTyping": "{username} tastează…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "widgetCustom": "Personalizat", + "@widgetCustom": {}, + "screenSharingTitle": "partajarea de ecran", + "@screenSharingTitle": {}, + "newGroup": "Grup nou", + "@newGroup": {}, + "changedTheRoomInvitationLink": "{username} a schimbat linkul de invitație", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "chat": "Chat", + "@chat": { + "type": "String", + "placeholders": {} + }, + "chats": "Chaturi", + "@chats": { + "type": "String", + "placeholders": {} + }, + "invited": "Invitat", + "@invited": { + "type": "String", + "placeholders": {} + }, + "login": "Conectați-vă", + "@login": { + "type": "String", + "placeholders": {} + }, + "online": "Online", + "@online": { + "type": "String", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "Backup de cheie online este activat", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "removeFromBundle": "Stergeți din acest pachet", + "@removeFromBundle": {}, + "enableMultiAccounts": "(BETA) Activați multiple conturi pe acest dispozitiv", + "@enableMultiAccounts": {}, + "participant": "Participant", + "@participant": { + "type": "String", + "placeholders": {} + }, + "openInMaps": "Deschideți pe hartă", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPin": "Vă rugăm să introduceți pinul vostru", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "privacy": "Confidențialitate", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "pushRules": "Regulile Push", + "@pushRules": { + "type": "String", + "placeholders": {} + }, + "recording": "Înregistrare", + "@recording": { + "type": "String", + "placeholders": {} + }, + "register": "Înregistrați-vă", + "@register": { + "type": "String", + "placeholders": {} + }, + "redactMessage": "Redactați mesaj", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "Versiunea camerei", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "security": "Securitate", + "@security": { + "type": "String", + "placeholders": {} + }, + "sendFile": "Trimiteți fișier", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "setStatus": "Stabiliți status", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "settings": "Configurări", + "@settings": { + "type": "String", + "placeholders": {} + }, + "inviteForMe": "Invitați pentru mine", + "@inviteForMe": { + "type": "String", + "placeholders": {} + }, + "fluffychat": "FluffyChat", + "@fluffychat": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{username} a retras invitația pentru {targetName}", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "help": "Ajutor", + "@help": { + "type": "String", + "placeholders": {} + }, + "unknownEncryptionAlgorithm": "Algoritm de criptare necunoscut", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unmuteChat": "Dezamuțați chat", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "unpin": "Anulează fixarea", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username} a ridicat interzicerea lui {targetName}", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "openChat": "Deschideți Chat", + "@openChat": {}, + "emailOrUsername": "Email sau nume de utilizator", + "@emailOrUsername": {}, + "youBannedUser": "Ați interzis pe {user}", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "fileIsTooBigForServer": "Serverul reportează că fișierul este prea mare să fie trimis.", + "@fileIsTooBigForServer": {}, + "widgetName": "Nume", + "@widgetName": {}, + "sorryThatsNotPossible": "Scuze... acest nu este posibil", + "@sorryThatsNotPossible": {}, + "enableEncryptionWarning": "Activând criptare, nu mai puteți să o dezactivați în viitor. Sunteți sigur?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "commandMissing": "{command} nu este o comandă.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "status": "Status", + "@status": { + "type": "String", + "placeholders": {} + }, + "connect": "Conectați", + "@connect": { + "type": "String", + "placeholders": {} + }, + "you": "Voi", + "@you": { + "type": "String", + "placeholders": {} + }, + "start": "Începeți", + "@start": {}, + "videoCallsBetaWarning": "Vă rugăm să luați notă că apeluri video sunt în beta. Se poate că nu funcționează normal sau de loc pe fie care platformă.", + "@videoCallsBetaWarning": {}, + "pinMessage": "Fixați în cameră", + "@pinMessage": {}, + "wasDirectChatDisplayName": "Chat gol (a fost {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "pleaseClickOnLink": "Vă rugăm să deschideți linkul din email și apoi să procedați.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "reportUser": "Reportați utilizator", + "@reportUser": {}, + "encryptionNotEnabled": "Criptare nu e activată", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "Camere Publice", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "addToBundle": "Adăugați în pachet", + "@addToBundle": {}, + "theyDontMatch": "Nu sunt asemănători", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "loadingPleaseWait": "Încărcând... Vă rugăm să așteptați.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "dateWithoutYear": "{month}-{day}", + "@dateWithoutYear": { + "type": "String", + "placeholders": { + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "theyMatch": "Sunt asemănători", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "title": "FluffyChat", + "@title": { + "description": "Title for the application", + "type": "String", + "placeholders": {} + }, + "toggleMuted": "Comutați amuțeștarea", + "@toggleMuted": { + "type": "String", + "placeholders": {} + }, + "scanQrCode": "Scanați cod QR", + "@scanQrCode": {}, + "addAccount": "Adăugați cont", + "@addAccount": {}, + "experimentalVideoCalls": "Apeluri video experimentale", + "@experimentalVideoCalls": {}, + "confirmEventUnpin": "Sunteți sigur că doriți să anulați permanent fixarea evenimentului?", + "@confirmEventUnpin": {}, + "emojis": "Emoji-uri", + "@emojis": {}, + "switchToAccount": "Schimbați la contul {number}", + "@switchToAccount": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "nextAccount": "Contul următor", + "@nextAccount": {}, + "indexedDbErrorTitle": "Probleme cu modul privat", + "@indexedDbErrorTitle": {}, + "users": "Utilizatori", + "@users": {}, + "startFirstChat": "Începeți primul chatul vostru", + "@startFirstChat": {}, + "callingPermissions": "Permisiuni de apel", + "@callingPermissions": {}, + "callingAccount": "Cont de apel", + "@callingAccount": {}, + "foregroundServiceRunning": "Această notificare apare când serviciul de foreground rulează.", + "@foregroundServiceRunning": {}, + "callingAccountDetails": "Permite FluffyChat să folosească aplicația de apeluri nativă android.", + "@callingAccountDetails": {}, + "appearOnTop": "Apare deasupra", + "@appearOnTop": {}, + "appearOnTopDetails": "Permite aplicația să apare deasupra (nu este necesar dacă aveți FluffyChat stabilit ca cont de apeluri)", + "@appearOnTopDetails": {}, + "currentlyActive": "Activ acum", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "containsDisplayName": "Conține displayname", + "@containsDisplayName": { + "type": "String", + "placeholders": {} + }, + "isTyping": "tastează…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "chatBackup": "Backup de chat", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "repeatPassword": "Repetați parola", + "@repeatPassword": {}, + "changeTheme": "Schimbați tema aplicației", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "chatHasBeenAddedToThisSpace": "Chatul a fost adăugat la acest spațiu", + "@chatHasBeenAddedToThisSpace": {}, + "clearArchive": "Ștergeți arhiva", + "@clearArchive": {}, + "commandHint_markasdm": "Marcați ca cameră de mesaje directe", + "@commandHint_markasdm": {}, + "commandHint_markasgroup": "Marcați ca grup", + "@commandHint_markasgroup": {}, + "commandHint_ban": "Interziceți acesul utilizatorului ales din această cameră", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_clearcache": "Ștergeți cache", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_create": "Creați un grup de chat gol\nFolosiți --no-encryption să dezactivați criptare", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "commandHint_discardsession": "Renunțați sesiunea", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "commandHint_kick": "Dați afară pe utilizatorul ales din această cameră", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_leave": "Renunțați la această cameră", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_myroomavatar": "Alegeți un avatar pentru această cameră (foloșește mxc-uri)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_myroomnick": "Alegeți un displayname pentru această cameră", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "commandHint_op": "Stabiliți nivelul de putere a utilizatorul ales (implicit: 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_plain": "Trimiteți text simplu/neformatat", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_react": "Trimiteți răspuns ca reacție", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "commandHint_send": "Trimiteți text", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "commandInvalid": "Comandă nevalibilă", + "@commandInvalid": { + "type": "String" + }, + "compareEmojiMatch": "Vă rugăm să comparați emoji-urile", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "Vă rugăm să comparați numerele", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "Dezcriptarea mesajului a eșuat: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "create": "Creați", + "@create": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "💬{username} a creat chatul", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "createNewSpace": "Spațiu nou", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "dateWithYear": "{year}-{month}-{day}", + "@dateWithYear": { + "type": "String", + "placeholders": { + "year": { + "type": "String" + }, + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "allRooms": "Toate chaturi de grup", + "@allRooms": { + "type": "String", + "placeholders": {} + }, + "forward": "Înainte", + "@forward": { + "type": "String", + "placeholders": {} + }, + "groups": "Grupuri", + "@groups": { + "type": "String", + "placeholders": {} + }, + "hideRedactedEvents": "Ascunde evenimente redactate", + "@hideRedactedEvents": { + "type": "String", + "placeholders": {} + }, + "hideUnknownEvents": "Ascunde evenimente necunoscute", + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "identity": "Identitate", + "@identity": { + "type": "String", + "placeholders": {} + }, + "ignore": "Ignorați", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "ignoredUsers": "Utilizatori ignorați", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "iHaveClickedOnLink": "Am făcut click pe link", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "Parolă sau cheie de recuperare incorectă", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "inoffensive": "Inofensiv", + "@inoffensive": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "Invitați contact", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "Invitați contact la {groupName}", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "inviteText": "{username} v-a invitat la FluffyChat.\n1. Instalați FluffyChat: https://fluffychat.im\n2. Înregistrați-vă sau conectați-vă\n3. Deschideți invitația: {link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "joinedTheChat": "👋{username} a intrat în chat", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "kicked": "👞{username} a dat afară pe {targetName}", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "lastActiveAgo": "Ultima dată activ: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "leave": "Renunțați", + "@leave": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "A plecat din chat", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "license": "Permis", + "@license": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "Luminat", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "Încărcați încă mai {count} participanți", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "dehydrate": "Exportați sesiunea și ștergeți dispozitivul", + "@dehydrate": {}, + "dehydrateTor": "Utilizatori de TOR: Exportați sesiunea", + "@dehydrateTor": {}, + "dehydrateTorLong": "Pentru utilizatori de TOR, este recomandat să exportați sesiunea înainte de a închideți fereastra.", + "@dehydrateTorLong": {}, + "hydrateTor": "Utilizatori TOR: Importați sesiune exportată", + "@hydrateTor": {}, + "hydrateTorLong": "Ați exportat sesiunea vostră ultima dată pe TOR? Importați-o repede și continuați să conversați.", + "@hydrateTorLong": {}, + "hydrate": "Restaurați din fișier backup", + "@hydrate": {}, + "loadMore": "Încarcă mai multe…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "logout": "Deconectați-vă", + "@logout": { + "type": "String", + "placeholders": {} + }, + "mention": "Menționați", + "@mention": { + "type": "String", + "placeholders": {} + }, + "messages": "Mesaje", + "@messages": { + "type": "String", + "placeholders": {} + }, + "moderator": "Moderator", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "Nu s-a găsit nici un emote. 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "Criptare nu poate fi activată până când camera este accesibilă public.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "none": "Niciunul", + "@none": { + "type": "String", + "placeholders": {} + }, + "noPermission": "Fără permisie", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "Nici o cameră nu s-a găsit…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "notificationsEnabledForThisAccount": "Notificări activate pentru acest cont", + "@notificationsEnabledForThisAccount": { + "type": "String", + "placeholders": {} + }, + "obtainingLocation": "Obținând locație…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "offline": "Offline", + "@offline": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "Ups, ceva a eșuat…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "reject": "Respingeți", + "@reject": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "Revoca interzicerea din chat", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "Camera a fost actualizată", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "setCustomEmotes": "Stabiliți emoji-uri personalizate", + "@setCustomEmotes": { + "type": "String", + "placeholders": {} + }, + "setPermissionsLevel": "Stabiliți nivelul de permisii", + "@setPermissionsLevel": { + "type": "String", + "placeholders": {} + }, + "singlesignon": "Autentificare unică", + "@singlesignon": { + "type": "String", + "placeholders": {} + }, + "startedACall": "{senderName} a început un apel", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "statusExampleMessage": "Ce faceți?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "Prea multe cereri. Vă rugăm să încercați din nou mai tărziu!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "unknownEvent": "Evenimet necunoscut '{type}'", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "verified": "Verificat", + "@verified": { + "type": "String", + "placeholders": {} + }, + "verifyStart": "Începeți verificare", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "videoCall": "Apel video", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "Vizibilitatea istoria chatului", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "Vizibil pentru toți participanți", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "Așteptând pe partenerul să accepte emoji-ul…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "Așteptând pe partenerul să accepte numerele…", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "warning": "Avertizment!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "whoCanPerformWhichAction": "Cine poate face care acțiune", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "Cine se poate alătura la acest grup", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "De ce doriți să reportați acest conținut?", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "wipeChatBackup": "Ștergeți backup-ul vostru de chat să creați o nouă cheie de recuperare?", + "@wipeChatBackup": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "Cu acestea adrese puteți să vă recuperați parola.", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "Ați fost interzis din acest chat", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "messageInfo": "Info mesajului", + "@messageInfo": {}, + "time": "Timp", + "@time": {}, + "messageType": "Fel de mesaj", + "@messageType": {}, + "sender": "Trimițător", + "@sender": {}, + "openGallery": "Deschideți galeria", + "@openGallery": {}, + "removeFromSpace": "Eliminați din spațiu", + "@removeFromSpace": {}, + "publish": "Publicați", + "@publish": {}, + "videoWithSize": "Video ({size})", + "@videoWithSize": { + "type": "String", + "placeholders": { + "size": { + "type": "String" + } + } + }, + "unsupportedAndroidVersionLong": "Această funcție are nevoie de o versiune de Android mai nouă. Vă rugăm să verificați dacă sunt actualizări sau suport de la Lineage OS.", + "@unsupportedAndroidVersionLong": {}, + "dismiss": "Respingeți", + "@dismiss": {}, + "widgetVideo": "Video", + "@widgetVideo": {}, + "widgetEtherpad": "Notiță text", + "@widgetEtherpad": {}, + "widgetJitsi": "Jitsi Meet", + "@widgetJitsi": {}, + "widgetUrlError": "Acest URL nu este valibil.", + "@widgetUrlError": {}, + "widgetNameError": "Vă rugăm să introduceți un nume de afișare.", + "@widgetNameError": {}, + "errorAddingWidget": "Adăugarea widget-ului a eșuat.", + "@errorAddingWidget": {}, + "youRejectedTheInvitation": "Ați respins invitația", + "@youRejectedTheInvitation": {}, + "youJoinedTheChat": "Va-ți alăturat la chat", + "@youJoinedTheChat": {}, + "youAcceptedTheInvitation": "👍Ați acceptat invitația", + "@youAcceptedTheInvitation": {}, + "youHaveWithdrawnTheInvitationFor": "Ați retras invitația pentru {user}", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedBy": "📩Ați fost invitat de {user}", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "unlockOldMessages": "Deblocați mesajele vechi", + "@unlockOldMessages": {}, + "youInvitedUser": "📩Ați invitat pe {user}", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKicked": "👞Ați dat afară pe {user}", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youUnbannedUser": "Ați ridicat interzicerea lui {user}", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "storeInAndroidKeystore": "Stoca în Android KeyStore", + "@storeInAndroidKeystore": {}, + "user": "Utilizator", + "@user": {}, + "custom": "Personalizat", + "@custom": {}, + "screenSharingDetail": "Partajați ecranul în FluffyChat", + "@screenSharingDetail": {}, + "storeSecurlyOnThisDevice": "Stoca sigur pe acest dispozitiv", + "@storeSecurlyOnThisDevice": {}, + "otherCallingPermissions": "Microfon, cameră și alte permisiuni lui FluffyChat", + "@otherCallingPermissions": {}, + "whyIsThisMessageEncrypted": "De ce este acest mesaj ilizibil?", + "@whyIsThisMessageEncrypted": {}, + "newSpace": "Spațiu nou", + "@newSpace": {}, + "enterSpace": "Intrați în spațiu", + "@enterSpace": {}, + "enterRoom": "Intrați în cameră", + "@enterRoom": {}, + "allSpaces": "Toate spațiile", + "@allSpaces": {}, + "numChats": "{number} chaturi", + "@numChats": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "hideUnimportantStateEvents": "Ascundeți evenimente de stare neimportante", + "@hideUnimportantStateEvents": {}, + "doNotShowAgain": "Nu se mai apară din nou", + "@doNotShowAgain": {}, + "newSpaceDescription": "Spațiile vă permit să vă consolidați chaturile și să stabiliți comunități private sau publice.", + "@newSpaceDescription": {}, + "encryptThisChat": "Criptați acest chat", + "@encryptThisChat": {}, + "disableEncryptionWarning": "Pentru motive de securitate, nu este posibil să dezactivați criptarea unui chat în care criptare este activată.", + "@disableEncryptionWarning": {}, + "noBackupWarning": "Avertisment! Fără să activați backup de chat, veți pierde accesul la mesajele voastre criptate. E foarte recomandat să activați backup de chat înainte să vă deconectați.", + "@noBackupWarning": {}, + "noOtherDevicesFound": "Nu s-a găsit alte dispozitive", + "@noOtherDevicesFound": {}, + "fileHasBeenSavedAt": "Fișierul a fost salvat la {path}", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "jump": "Săriți", + "@jump": {}, + "report": "reportați", + "@report": {}, + "jumpToLastReadMessage": "Săriți la ultimul citit mesaj", + "@jumpToLastReadMessage": {}, + "memberChanges": "Schimbări de membri", + "@memberChanges": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "Musafiri pot să se alăture", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "fileName": "Nume de fișier", + "@fileName": { + "type": "String", + "placeholders": {} + }, + "fontSize": "Mărimea fontului", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "De la alăturare", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "De la invitația", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "goToTheNewRoom": "Mergeți la camera nouă", + "@goToTheNewRoom": { + "type": "String", + "placeholders": {} + }, + "group": "Grup", + "@group": { + "type": "String", + "placeholders": {} + }, + "groupIsPublic": "Grupul este public", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "guestsAreForbidden": "Musafiri sunt interziși", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "kickedAndBanned": "🙅{username} a dat afară și a interzis pe {targetName} din cameră", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "dehydrateWarning": "Această actiune nu poate fi anulată. Asigurați-vă că păstrați fișierul backup.", + "@dehydrateWarning": {}, + "joinRoom": "Alăturați la cameră", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "logInTo": "Conectați-vă la {homeserver}", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "locationDisabledNotice": "Servicile de locație sunt dezactivate. Vă rugăm să le activați să împărțiți locația voastră.", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "Se pare că nu aveți serviciile google pe dispozitivul vostru. Această decizie este bună pentru confidențialitatea voastră! Să primiți notificari push în FluffyChat vă recomandăm https://microg.org/ sau https://unifiedpush.org/.", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "noMatrixServer": "{server1} nu este server matrix, înlocuiți cu {server2}?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "numUsersTyping": "{count} utilizatori tastează…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "offensive": "Ofensiv", + "@offensive": { + "type": "String", + "placeholders": {} + }, + "confirm": "Confirmați", + "@confirm": { + "type": "String", + "placeholders": {} + }, + "or": "Sau", + "@or": { + "type": "String", + "placeholders": {} + }, + "serverRequiresEmail": "Acest server trebuie să valideze emailul vostru pentru înregistrare.", + "@serverRequiresEmail": {}, + "waitingPartnerAcceptRequest": "Așteptând pe partenerul să accepte cererea…", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "Întunecat", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "sharedTheLocation": "{username} sa partajat locația", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "setInvitationLink": "Stabiliți linkul de invitație", + "@setInvitationLink": { + "type": "String", + "placeholders": {} + }, + "transferFromAnotherDevice": "Transfera de la alt dispozitiv", + "@transferFromAnotherDevice": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWait": "Sincronizează... Vă rugăm să așteptați.", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "systemTheme": "Sistem", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "toggleUnread": "Marcați Citit/Necitit", + "@toggleUnread": { + "type": "String", + "placeholders": {} + }, + "tryToSendAgain": "Încercați să trimiteți din nou", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "unavailable": "Nedisponibil", + "@unavailable": { + "type": "String", + "placeholders": {} + }, + "userAndUserAreTyping": "{username} și {username2} tastează…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userLeftTheChat": "🚪{username} a plecat din chat", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userAndOthersAreTyping": "{username} și {count} alți tastează…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "userSentUnknownEvent": "{username} a trimis un eveniment {type}", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "unverified": "Neverificat", + "@unverified": {}, + "verifyTitle": "Verificând celălalt cont", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "Vizibil pentru toți", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "readUpToHere": "Citit până aici", + "@readUpToHere": {}, + "changedTheHistoryVisibility": "{username} a schimbat vizibilitatea istoriei chatului", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "copy": "Copiați", + "@copy": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "Displayname a fost schimbat", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "invitedUsersOnly": "Numai utilizatori invitați", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "configureChat": "Configurați chat", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "Copiat în clipboard", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "device": "Dispozitiv", + "@device": { + "type": "String", + "placeholders": {} + }, + "username": "Nume de utilizator", + "@username": { + "type": "String", + "placeholders": {} + }, + "sentAnAudio": "🎤{username} a trimis audio", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAFile": "📁{username} a trimis un fișier", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "indexedDbErrorLong": "Stocarea de mesaje nu este activat implicit în modul privat.\nVă rugăm să vizitați\n- about:config\n- stabiliți dom.indexedDB.privateBrowsing.enabled la true\nAstfel, nu este posibil să folosiți FluffyChat.", + "@indexedDbErrorLong": {}, + "addWidget": "Adăugați widget", + "@addWidget": {}, + "locationPermissionDeniedNotice": "Permisiunea locației blocată. Vă rugăm să o dezblocați să împărțiți locația voastră.", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "newChat": "Chat nou", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "💬 Mesaj nou în FluffyChat", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "sentAPicture": "🖼️ {username} a trimis o poză", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "🎥{username} a trimis un video", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentASticker": "😊 {username} a trimis un sticker", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "storeInSecureStorageDescription": "Păstrați cheia de recuperare în stocarea sigură a acestui dispozitiv.", + "@storeInSecureStorageDescription": {}, + "saveKeyManuallyDescription": "Activați dialogul de partajare sistemului sau folosiți clipboard-ul să salvați manual această cheie.", + "@saveKeyManuallyDescription": {}, + "countFiles": "{count} fișiere", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "hugContent": "{senderName} vă îmbrățișează", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "storeInAppleKeyChain": "Stoca în Apple KeyChain", + "@storeInAppleKeyChain": {}, + "addEmail": "Adăugați email", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "confirmMatrixId": "Vă rugăm să confirmați Matrix ID-ul vostru să ștergeți contul vostru.", + "@confirmMatrixId": {}, + "cuddleContent": "{senderName} vă îmbrățișează", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "supposedMxid": "ID-ul ar trebuii să fie {mxid}", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "commandHint_html": "Trimiteți text format ca HTML", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "addToSpace": "Adăugați la spațiu", + "@addToSpace": {}, + "commandHint_hug": "Trimiteți o îmbrățișare", + "@commandHint_hug": {}, + "badServerVersionsException": "Homeserver-ul suportă versiunele de Spec următoare:\n{serverVersions}\nDar această aplicație suportă numai {supportedVersions}", + "@badServerVersionsException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "badServerLoginTypesException": "Homeserver-ul suportă următoarele feluri de login:\n{serverVersions}\nDar această aplicație suportă numai:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} a schimbat regulile pentru acesul musafirilor la: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} a schimbat regulile de alăturare la: {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "yourChatBackupHasBeenSetUp": "Backup-ul vostru de chat a fost configurat.", + "@yourChatBackupHasBeenSetUp": {}, + "cantOpenUri": "Nu se poate deschide URI-ul {uri}", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username} s-a schimbat displayname la: '{displayname}'", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} a schimbat regulile pentru acesul musafirilor", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changeTheHomeserver": "Schimbați homeserver-ul", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "chatBackupDescription": "Mesajele voastre vechi sunt sigurate cu o cheie de recuperare. Vă rugăm să nu o pierdeți.", + "@chatBackupDescription": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "Conținutul a fost reportat la administratori serverului", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Detalii de chat", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "commandHint_dm": "Porniți un chat direct\nFolosiți --no-encryption să dezactivați criptare", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "commandHint_me": "Descrieți-vă", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "contactHasBeenInvitedToTheGroup": "Contactul a fost invitat la grup", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "containsUserName": "Conține nume de utilizator", + "@containsUserName": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "Copiați în clipboard", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "countParticipants": "{count} participanți", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "delete": "Ștergeți", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deactivateAccountWarning": "Această acțiune va dezactiva contul vostru. Nu poate fi anulat! Sunteți sigur?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "Ștergeți contul", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "Nivel de permisiuni implicită", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "Ștergeți mesajul", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "Descărcați fișierul", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "Activați pachet de emote global", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "everythingReady": "Totul e gata!", + "@everythingReady": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "Editați servere blocate", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "Shortcode de emote nevalibil!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "edit": "Editați", + "@edit": { + "type": "String", + "placeholders": {} + }, + "editRoomAliases": "Schimbați pseudonimele camerei", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "Chat gol", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "Activați criptare", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "encrypted": "Criptat", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "editDisplayname": "Schimbați displayname", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "Schimbați avatarul din cameră", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "Emote deja există!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emotePacks": "Pachete de emoturi din cameră", + "@emotePacks": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "Configurări Emote", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "emoteShortcode": "Shortcode de emote", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emoteWarnNeedToPick": "Trebuie să alegeți shortcode pentru emote și o imagine!", + "@emoteWarnNeedToPick": { + "type": "String", + "placeholders": {} + }, + "encryption": "Criptare", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "enterAnEmailAddress": "Introduceți o adresă email", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "homeserver": "Homeserver", + "@homeserver": {}, + "errorObtainingLocation": "Obținerea locației a eșuat: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "ok": "Ok", + "@ok": { + "type": "String", + "placeholders": {} + }, + "youKickedAndBanned": "🙅Ați dat afară și interzis pe {user}", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "noKeyForThisMessage": "Această chestie poate să se întâmple când mesajul a fost trimis înainte să vă conectați contul cu acest dispozitiv.\n\nO altă explicație ar fi dacă trimițătorul a blocat dispozitivul vostru sau ceva s-a întâmplat cu conexiunea la internet\n\nPuteți să citiți mesajul în o altă seșiune? Atunci puteți să transferați mesajul de acolo! Mergeți la Configurări > Dispozitive și verificați că dispozitivele s-au verificat. Când deschideți camera în viitor și ambele seșiune sunt în foreground, cheile va fi transmise automat. \n\nDoriți să îți păstrați cheile când deconectați sau schimbați dispozitive? Fiți atenți să activați backup de chat în configurări.", + "@noKeyForThisMessage": {}, + "sendAsText": "Trimiteți ca text", + "@sendAsText": { + "type": "String" + }, + "reportErrorDescription": "Ceva a eșuat. Vă rugăm să încercați din nou mai tărziu. Dacă doriți, puteți să reportați problema la dezvoltatori.", + "@reportErrorDescription": {}, + "openLinkInBrowser": "Deschideți linkul în browser", + "@openLinkInBrowser": {}, + "send": "Trimiteți", + "@send": { + "type": "String", + "placeholders": {} + }, + "sendAMessage": "Trimiteți un mesaj", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "sendAudio": "Trimiteți audio", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendOriginal": "Trimiteți original", + "@sendOriginal": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "Trimiteți video", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "sendImage": "Trimiteți imagine", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendSticker": "Trimiteți sticker", + "@sendSticker": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterRecoveryKeyDescription": "Să vă deblocați mesajele vechi, vă rugăm să introduceți cheia de recuperare creată de o seșiune anterioră. Cheia de recuperare NU este parola voastră.", + "@pleaseEnterRecoveryKeyDescription": {}, + "separateChatTypes": "Afișați chaturi directe și grupuri separat", + "@separateChatTypes": { + "type": "String", + "placeholders": {} + }, + "setAsCanonicalAlias": "Stabiliți ca pseudonimul primar", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "Scrieți un mesaj…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "yes": "Da", + "@yes": { + "type": "String", + "placeholders": {} + }, + "markAsRead": "Marcați ca citit", + "@markAsRead": {}, + "oopsPushError": "Ups! Din păcate, o eroare s-a întâmplat cu stabilirea de notificări push.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "oneClientLoggedOut": "Unul dintre clienților voștri a fost deconectat", + "@oneClientLoggedOut": {}, + "editBundlesForAccount": "Editați pachetele pentru acest cont", + "@editBundlesForAccount": {}, + "bundleName": "Numele pachetului", + "@bundleName": {}, + "link": "Link", + "@link": {}, + "passphraseOrKey": "frază de acces sau cheie de recuperare", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "password": "Parolă", + "@password": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "Parola uitată", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "Parola a fost schimbată", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "passwordRecovery": "Recuperare parolei", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "people": "Persoane", + "@people": { + "type": "String", + "placeholders": {} + }, + "pickImage": "Alegeți o imagine", + "@pickImage": { + "type": "String", + "placeholders": {} + }, + "pleaseChoose": "Vă rugăm să alegeți", + "@pleaseChoose": { + "type": "String", + "placeholders": {} + }, + "pin": "Fixați", + "@pin": { + "type": "String", + "placeholders": {} + }, + "pleaseChooseAPasscode": "Vă rugăm să alegeți un passcode", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "pleaseEnter4Digits": "Vă rugăm să introduceți 4 cifre sau puteți să lăsați gol să dezactivați lacătul aplicației.", + "@pleaseEnter4Digits": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPassword": "Vă rugăm să introduceți parola voastră", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "Vă rugăm să introduceți username-ul vostru", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "Vă rugăm să urmați instrucțiunele pe website și apoi să apăsați pe următor.", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "reason": "Motiv", + "@reason": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "{username} a respins invitația", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "redactedAnEvent": "{username} a redactat un eveniment", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "removeAllOtherDevices": "Eliminați toate celelalte dispozitive", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "removeYourAvatar": "Ștergeți avatarul", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "renderRichContent": "Reda conținut bogat al mesajelor", + "@renderRichContent": { + "type": "String", + "placeholders": {} + }, + "replaceRoomWithNewerVersion": "Înlocuiți camera cu versiune mai nouă", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "reply": "Răspundeți", + "@reply": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "Raportați mesajul", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "requestPermission": "Cereți permisiune", + "@requestPermission": { + "type": "String", + "placeholders": {} + }, + "saveFile": "Salvați fișierul", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "search": "Căutați", + "@search": { + "type": "String", + "placeholders": {} + }, + "recoveryKey": "Cheie de recuperare", + "@recoveryKey": {}, + "recoveryKeyLost": "Cheia de recuperare pierdută?", + "@recoveryKeyLost": {}, + "seenByUser": "Văzut de {username}", + "@seenByUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "muteChat": "Amuțați chatul", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "needPantalaimonWarning": "Vă rugăm să fiți conștienți că e nevoie de Pantalaimon să folosiți criptare end-to-end deocamdată.", + "@needPantalaimonWarning": { + "type": "String", + "placeholders": {} + }, + "autoplayImages": "Anima automatic stickere și emote animate", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "sendOnEnter": "Trimite cu tasta enter", + "@sendOnEnter": {}, + "changedTheChatPermissions": "{username} a schimbat permisiunile chatului", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "extremeOffensive": "De foarte mare ofensă", + "@extremeOffensive": { + "type": "String", + "placeholders": {} + }, + "id": "ID", + "@id": { + "type": "String", + "placeholders": {} + }, + "invitedUser": "📩{username} a invitat {targetName}", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "deviceKeys": "Cheile dispozitivului:", + "@deviceKeys": {}, + "pleaseEnterRecoveryKey": "Vă rugăm să introduceți cheia voastră de recuperare:", + "@pleaseEnterRecoveryKey": {}, + "newVerificationRequest": "Cerere de verificare nouă!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "remove": "Eliminați", + "@remove": { + "type": "String", + "placeholders": {} + }, + "play": "Redați {fileName}", + "@play": { + "type": "String", + "placeholders": { + "fileName": { + "type": "String" + } + } + }, + "channelCorruptedDecryptError": "Criptarea a fost corupată", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "Alegeți o parolă robustă", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "commandHint_cuddle": "Trimiteți o îmbrățișare", + "@commandHint_cuddle": {}, + "googlyEyesContent": "{senderName} v-a trimis ochi googly", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "areYouSureYouWantToLogout": "Sunteți sigur că doriți să vă deconectați?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "changedTheRoomAliases": "{username} a schimbat pseudonimele camerei", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changeYourAvatar": "Schimbați avatarul vostru", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "commandHint_join": "Alăturați-vă la camera alesă", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "allChats": "Toate Chaturile", + "@allChats": { + "type": "String", + "placeholders": {} + }, + "commandHint_invite": "Invitați utilizatorul ales la această cameră", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "changeTheNameOfTheGroup": "Schimbați numele grupului", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "commandHint_googly": "Trimiteți câțiva ochi googly", + "@commandHint_googly": {}, + "botMessages": "Mesaje Bot", + "@botMessages": { + "type": "String", + "placeholders": {} + }, + "all": "Toate", + "@all": { + "type": "String", + "placeholders": {} + }, + "blocked": "Blocat", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "changedTheJoinRules": "{username} a schimbat regulile de alăturare", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} s-a schimbat avatarul", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "appLock": "Lacăt aplicație", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "changedTheHistoryVisibilityTo": "{username} a schimbat vizibilitatea istoriei chatului la: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "close": "Închideți", + "@close": { + "type": "String", + "placeholders": {} + }, + "reopenChat": "Deschide din nou chatul", + "@reopenChat": {}, + "pleaseTryAgainLaterOrChooseDifferentServer": "Vă rugăm să încercați din nou mai târziu sau să alegeți un server diferit.", + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "signInWithPassword": "Conectați-vă cu parolă", + "@signInWithPassword": {} +} diff --git a/assets/l10n/intl_ru.arb b/assets/l10n/intl_ru.arb new file mode 100644 index 0000000..c913cc1 --- /dev/null +++ b/assets/l10n/intl_ru.arb @@ -0,0 +1,3379 @@ +{ + "@@locale": "ru", + "@@last_modified": "2021-08-14 12:41:09.903021", + "noSendPermission": "Вы не можете отправлять сообщения", + "@noSendPermission": {}, + "alwaysUse24HourFormat": "нет", + "@alwaysUse24HourFormat": { + "description": "Set to true to always display time of day in 24 hour format." + }, + "repeatPassword": "Повторите пароль", + "@repeatPassword": {}, + "notAnImage": "Это не картинка.", + "@notAnImage": {}, + "setCustomPermissionLevel": "Установить другой уровень прав", + "setPermissionsLevelDescription": "Выберите роль из списка ниже или укажите другой уровень прав.", + "ignoreUser": "Игнорировать", + "normalUser": "Участник", + "remove": "Удалить", + "@remove": { + "type": "String", + "placeholders": {} + }, + "importNow": "Импортировать сейчас", + "@importNow": {}, + "importEmojis": "Импортировать эмодзи", + "@importEmojis": {}, + "importFromZipFile": "Импортировать из ZIP-файла", + "@importFromZipFile": {}, + "exportEmotePack": "Экспортировать набор эмодзи как ZIP", + "@exportEmotePack": {}, + "replace": "Заменить", + "@replace": {}, + "about": "О проекте", + "aboutHomeserver": "О сервере {homeserver}", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "accept": "Принять", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 {username} принял(а) приглашение", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "Учётная запись", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐 {username} активировал(а) сквозное шифрование", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "addEmail": "Добавить электронную почту", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "confirmMatrixId": "Пожалуйста, подтвердите Matrix ID, чтобы удалить свою учётную запись.", + "@confirmMatrixId": {}, + "supposedMxid": "Это должно быть {mxid}", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "addChatDescription": "Добавить описание чата...", + "@addChatDescription": {}, + "addToSpace": "Добавить в пространство", + "@addToSpace": {}, + "admin": "Администратор", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "псевдоним", + "@alias": { + "type": "String", + "placeholders": {} + }, + "all": "Все", + "@all": { + "type": "String", + "placeholders": {} + }, + "allChats": "Все чаты", + "@allChats": { + "type": "String", + "placeholders": {} + }, + "commandHint_roomupgrade": "Обновить эту комнату", + "commandHint_googly": "Отправить выпученные глаза", + "@commandHint_googly": {}, + "commandHint_cuddle": "Отправить улыбку", + "@commandHint_cuddle": {}, + "commandHint_hug": "Отправить обнимашки", + "@commandHint_hug": {}, + "googlyEyesContent": "{senderName} выпучил(а) глаза", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "cuddleContent": "{senderName} улыбнулся(-ась) Вам", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "hugContent": "{senderName} обнял(а) Вас", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "answeredTheCall": "{senderName} ответил(а) на звонок", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "Каждый может присоединиться", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "appLock": "Блокировка приложения", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "appLockDescription": "Заблокировать приложение, когда не используется пин-код", + "@appLockDescription": {}, + "archive": "Архив", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "Разрешено ли гостям присоединяться", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "Вы уверены?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "areYouSureYouWantToLogout": "Вы действительно хотите выйти?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "Для подписи ключа другого пользователя, пожалуйста, введите вашу парольную фразу или ключ восстановления.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "Принять этот запрос подтверждения от {username}?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "autoplayImages": "Автоматически воспроизводить анимированные стикеры и эмодзи", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "badServerLoginTypesException": "Домашний сервер поддерживает следующие типы входа в систему:\n{serverVersions}\nНо это приложение поддерживает только:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "sendTypingNotifications": "Отправлять уведомления о наборе текста", + "@sendTypingNotifications": {}, + "swipeRightToLeftToReply": "Для ответа проведите справа на лево", + "@swipeRightToLeftToReply": {}, + "sendOnEnter": "Отправлять на Enter", + "@sendOnEnter": {}, + "badServerVersionsException": "Домашний сервер поддерживает следующие версии спецификации:\n{serverVersions}\nНо это приложение поддерживает только {supportedVersions}", + "@badServerVersionsException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "countChatsAndCountParticipants": "{chats} чатов и {participants} участников", + "@countChatsAndCountParticipants": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + }, + "participants": { + "type": "int" + } + } + }, + "noMoreChatsFound": "Больше чатов не обнаружено...", + "noChatsFoundHere": "Не было найдено ни одного чата. Начните новый чат, нажав кнопку ниже. ⤵️", + "joinedChats": "Чаты", + "unread": "Непрочитанные", + "space": "Пространство", + "spaces": "Пространства", + "banFromChat": "Забанить", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "Забанен(а)", + "@banned": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username} забанил(а) {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "Заблокировать устройство", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "blocked": "Заблокировано", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "botMessages": "Сообщения от ботов", + "@botMessages": { + "type": "String", + "placeholders": {} + }, + "cancel": "Отмена", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "cantOpenUri": "Не удается открыть URI {uri}", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "changeDeviceName": "Изменить имя устройства", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "{username} изменил(а) аватар чата", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatDescriptionTo": "{username} изменил(а) описание чата на: '{description}'", + "@changedTheChatDescriptionTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "description": { + "type": "String" + } + } + }, + "changedTheChatNameTo": "{username} изменил(а) имя чата на: '{chatname}'", + "@changedTheChatNameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "chatname": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username} изменил(а) права доступа к чату", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username} изменил(а) отображаемое имя на: '{displayname}'", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} изменил(а) правила гостевого доступа", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} изменил(а) правила гостевого доступа на: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username} изменил(а) видимость истории", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username} изменил(а) видимость истории на: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username} изменил(а) правила присоединения", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} изменил(а) правила присоединения на: {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} изменил(а) аватар", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "{username} изменил(а) псевдонимы комнаты", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username} изменил(а) ссылку для приглашения", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changePassword": "Изменить пароль", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "Изменить домашний сервер", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "Персонализация", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "Изменить название группы", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "changeYourAvatar": "Изменить свой аватар", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "Шифрование было повреждено", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "chat": "Чат", + "@chat": { + "type": "String", + "placeholders": {} + }, + "yourChatBackupHasBeenSetUp": "Настроено резервное копирование чатов.", + "@yourChatBackupHasBeenSetUp": {}, + "chatBackup": "Резервное копирование чатов", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "chatBackupDescription": "Резервная копия сообщений защищена ключом восстановления. Сохраните его в надёжном месте.", + "@chatBackupDescription": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Настройки чата", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chatHasBeenAddedToThisSpace": "Чат был добавлен в это пространство", + "@chatHasBeenAddedToThisSpace": {}, + "chats": "Чаты", + "@chats": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "Выберите надёжный пароль", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "clearArchive": "Очистить архив", + "@clearArchive": {}, + "close": "Закрыть", + "@close": { + "type": "String", + "placeholders": {} + }, + "commandHint_markasdm": "Пометить как комнату личных сообщений", + "@commandHint_markasdm": {}, + "commandHint_markasgroup": "Пометить как группу", + "@commandHint_markasgroup": {}, + "commandHint_ban": "Забанить пользователя в этой комнате", + "@commandHint_ban": { + "type": "String", + "description": "/ban @student_a:nightcord.com" + }, + "commandHint_clearcache": "Очистить кэш", + "@commandHint_clearcache": { + "type": "String", + "description": "/clearcache" + }, + "commandHint_create": "Создайте пустой групповой чат\nИспользуйте --no-encryption, чтобы отключить шифрование", + "@commandHint_create": { + "type": "String", + "description": "/create [--no-encryption] <название группы>" + }, + "commandHint_discardsession": "Удалить сеанс", + "@commandHint_discardsession": { + "type": "String", + "description": "/discardsession <комната>" + }, + "commandHint_dm": "Начните личный чат\nИспользуйте --no-encryption, чтобы отключить шифрование", + "@commandHint_dm": { + "type": "String", + "description": "/dm [--no-encryption] " + }, + "commandHint_html": "Отправить текст формата HTML", + "@commandHint_html": { + "type": "String", + "description": "/html <сообщение в формате HTML>" + }, + "commandHint_invite": "Пригласить данного пользователя в эту комнату", + "@commandHint_invite": { + "type": "String", + "description": "/invite " + }, + "commandHint_join": "Присоединиться к данной комнате", + "@commandHint_join": { + "type": "String", + "description": "/join <комната>" + }, + "commandHint_kick": "Удалить данного пользователя из этой комнаты", + "@commandHint_kick": { + "type": "String", + "description": "/kick @student_a:nightcord.com" + }, + "commandHint_leave": "Покинуть эту комнату", + "@commandHint_leave": { + "type": "String", + "description": "/leave" + }, + "commandHint_me": "Опишите действие", + "@commandHint_me": { + "type": "String", + "description": "/me заварил(а) доширак" + }, + "commandHint_myroomavatar": "Установите свою фотографию для этой комнаты (аватар: mxc-uri)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "/myroomavatar mxc://extera.xyz/SomeFileURL" + }, + "commandHint_myroomnick": "Задайте отображаемое имя для этой комнаты", + "@commandHint_myroomnick": { + "type": "String", + "description": "/myroomnick Amia" + }, + "commandHint_op": "Установить уровень прав для пользователя (по умолчанию: 50)", + "@commandHint_op": { + "type": "String", + "description": "/op @k:nightcord.com [100]" + }, + "commandHint_plain": "Отправить неотформатированный текст", + "@commandHint_plain": { + "type": "String", + "description": "/plain Сообщение в виде текста" + }, + "commandHint_react": "Отправить ответ как реакцию", + "@commandHint_react": { + "type": "String", + "description": "/react Вот это да" + }, + "commandHint_send": "Отправить текст", + "@commandHint_send": { + "type": "String", + "description": "/send Сообщение любого вида" + }, + "commandHint_unban": "Разбанить пользователя в этой комнате", + "@commandHint_unban": { + "type": "String", + "description": "/unban @yuki:nightcord.com" + }, + "commandInvalid": "Недопустимая команда", + "@commandInvalid": { + "type": "String" + }, + "commandMissing": "{command} не является командой.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "compareEmojiMatch": "Сравните эмодзи", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "Сравните числа", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "configureChat": "Настроить чат", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "confirm": "Подтвердить", + "@confirm": { + "type": "String", + "placeholders": {} + }, + "connect": "Присоединиться", + "@connect": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "Контакт был приглашен в группу", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "containsDisplayName": "Содержит отображаемое имя", + "@containsDisplayName": { + "type": "String", + "placeholders": {} + }, + "containsUserName": "Содержит имя пользователя", + "@containsUserName": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "Жалоба отправлена", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "Скопировано в буфер обмена", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "Копировать", + "@copy": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "Скопировать в буфер обмена", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "Не удалось расшифровать сообщение: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "countParticipants": "{count} участника(-ов)", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "create": "Создать", + "@create": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "💬 {username} создал(а) чат", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "createGroup": "Создать группу", + "@createGroup": {}, + "createNewSpace": "Новое пространство", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "currentlyActive": "Сейчас активен(-а)", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "Тёмная", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{timeOfDay}, {date}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "dateWithoutYear": "{day}.{month}", + "@dateWithoutYear": { + "type": "String", + "placeholders": { + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "dateWithYear": "{day}.{month}.{year}", + "@dateWithYear": { + "type": "String", + "placeholders": { + "year": { + "type": "String" + }, + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "deactivateAccountWarning": "Это деактивирует ваш аккаунт. Пути назад не будет! Вы уверены?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "Уровень разрешений по умолчанию для новых пользователей", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "delete": "Удалить", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "Удалить аккаунт", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "Удалить сообщение", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "device": "Устройство", + "@device": { + "type": "String", + "placeholders": {} + }, + "deviceId": "Идентификатор устройства", + "@deviceId": { + "type": "String", + "placeholders": {} + }, + "devices": "Устройства", + "@devices": { + "type": "String", + "placeholders": {} + }, + "directChats": "Личные чаты", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "allRooms": "Все группы", + "@allRooms": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "Отображаемое имя было изменено", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "Скачать файл", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "edit": "Редактировать", + "@edit": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "Редактировать заблокированные серверы", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "chatPermissions": "Права в чате", + "@chatPermissions": {}, + "editDisplayname": "Отображаемое имя", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "editRoomAliases": "Редактировать псевдонимы комнаты", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "Изменить аватар комнаты", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "Эмодзи уже существует!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "Недопустимый код эмодзи!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emoteKeyboardNoRecents": "Недавно использованные эмодзи появятся здесь...", + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "emotePacks": "Наборы эмодзи для комнаты", + "@emotePacks": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "Настройки эмодзи", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "globalChatId": "ID глобального чата", + "@globalChatId": {}, + "accessAndVisibility": "Доступность и видимость", + "@accessAndVisibility": {}, + "accessAndVisibilityDescription": "Кто может зайти и как найти этот чат.", + "@accessAndVisibilityDescription": {}, + "calls": "Звонки", + "@calls": {}, + "customEmojisAndStickers": "Пользовательские эмодзи и стикеры", + "@customEmojisAndStickers": {}, + "customEmojisAndStickersBody": "Добавить или поделиться пользовательскими эмодзи или стикерами, которые могут быть применены в любом чате.", + "@customEmojisAndStickersBody": {}, + "emoteShortcode": "Код эмодзи", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emoteWarnNeedToPick": "Вам нужно задать код эмодзи и изображение!", + "@emoteWarnNeedToPick": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "Пустой чат", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "Включить набор эмодзи глобально", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "Включить шифрование", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "Вы не сможете отключить шифрование. Вы уверены?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "encrypted": "Зашифровано", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "encryption": "Шифрование", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "Шифрование не включено", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName} завершил(а) звонок", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "enterAnEmailAddress": "Введите адрес электронной почты", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "homeserver": "Домашний сервер", + "@homeserver": {}, + "enterYourHomeserver": "Введите адрес вашего домашнего сервера", + "@enterYourHomeserver": { + "type": "String", + "placeholders": {} + }, + "errorObtainingLocation": "Ошибка получения местоположения: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "everythingReady": "Всё готово!", + "@everythingReady": { + "type": "String", + "placeholders": {} + }, + "extremeOffensive": "Крайне оскорбительный", + "@extremeOffensive": { + "type": "String", + "placeholders": {} + }, + "fileName": "Имя файла", + "@fileName": { + "type": "String", + "placeholders": {} + }, + "fluffychat": "Extera", + "@fluffychat": { + "type": "String", + "placeholders": {} + }, + "fontSize": "Размер шрифта", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "forward": "Переслать", + "@forward": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "С момента присоединения", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "С момента приглашения", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "goToTheNewRoom": "В новую комнату", + "@goToTheNewRoom": { + "type": "String", + "placeholders": {} + }, + "group": "Группа", + "@group": { + "type": "String", + "placeholders": {} + }, + "chatDescription": "Описание чата", + "@chatDescription": {}, + "chatDescriptionHasBeenChanged": "Описание чата изменено", + "@chatDescriptionHasBeenChanged": {}, + "groupIsPublic": "Публичная группа", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "groups": "Группы", + "@groups": { + "type": "String", + "placeholders": {} + }, + "groupWith": "Группа с {displayname}", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "guestsAreForbidden": "Гости не могут присоединиться", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "Гости могут присоединиться", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{username} отозвал(а) приглашение {targetName}", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "help": "Помощь", + "@help": { + "type": "String", + "placeholders": {} + }, + "hideRedactedEvents": "Скрыть удалённые события", + "@hideRedactedEvents": { + "type": "String", + "placeholders": {} + }, + "hideRedactedMessages": "Скрыть удалённые сообщения", + "@hideRedactedMessages": {}, + "hideRedactedMessagesBody": "Если кто-то удаляет сообщение, оно будет скрыто в чате.", + "@hideRedactedMessagesBody": {}, + "hideInvalidOrUnknownMessageFormats": "Скрыть неверные или неизвестные форматы сообщений", + "@hideInvalidOrUnknownMessageFormats": {}, + "howOffensiveIsThisContent": "Насколько оскорбительным является этот контент?", + "@howOffensiveIsThisContent": { + "type": "String", + "placeholders": {} + }, + "id": "ID", + "@id": { + "type": "String", + "placeholders": {} + }, + "identity": "Идентификация", + "@identity": { + "type": "String", + "placeholders": {} + }, + "block": "Заглушить", + "@block": {}, + "blockedUsers": "Заглушённые пользователи", + "@blockedUsers": {}, + "blockListDescription": "Вы можете игнорировать пользователей на свой вкус: Вы не увидите их сообщения и не получите от них приглашений.", + "@blockListDescription": {}, + "blockUsername": "Игнорировать имя пользователя", + "@blockUsername": {}, + "iHaveClickedOnLink": "Я перешёл по ссылке", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "Неверный пароль или ключ восстановления", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "inoffensive": "Безобидный", + "@inoffensive": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "Пригласить контакт", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroupQuestion": "Вы уверены, что хотите пригласить {contact} в чат \"{groupName}\"?", + "@inviteContactToGroupQuestion": {}, + "inviteContactToGroup": "Пригласить контакт в {groupName}", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "noChatDescriptionYet": "Описание чата не создано.", + "@noChatDescriptionYet": {}, + "tryAgain": "Повторите попытку", + "@tryAgain": {}, + "invalidServerName": "Недопустимое имя сервера", + "@invalidServerName": {}, + "invited": "Приглашён", + "@invited": { + "type": "String", + "placeholders": {} + }, + "redactMessageDescription": "Сообщение будет удалено для всех участников. Это необратимо.", + "@redactMessageDescription": {}, + "optionalRedactReason": "Причина... (Необязательно)", + "@optionalRedactReason": {}, + "invitedUser": "📩 {username} пригласил(а) {targetName}", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "invitedUsersOnly": "Только приглашённым пользователям", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "inviteForMe": "Приглашение для меня", + "@inviteForMe": { + "type": "String", + "placeholders": {} + }, + "inviteText": "{username} пригласил(а) вас в Extera. \n1. Посетите https://extera.xyz/next/next.apk?_invite и установите приложение \n2. Зарегистрируйтесь или войдите \n3. Откройте ссылку приглашения: \n {link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "isTyping": "печатает…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "👋 {username} присоединился(-ась) к чату", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "joinRoom": "Присоединиться к комнате", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "kicked": "👞 {username} выгнал(а) {targetName}", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickedAndBanned": "🙅 {username} забанил(а) {targetName}", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickFromChat": "Выгнать", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "Последнее посещение: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "leave": "Покинуть", + "@leave": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "Покинуть чат", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "license": "Лицензия", + "@license": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "Светлая", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "Загрузить еще {count} участника(-ов)", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "dehydrate": "Экспорт сеанса и очистка устройства", + "@dehydrate": {}, + "dehydrateWarning": "Это действие не может быть отменено. Убедитесь, что вы безопасно сохранили файл резервной копии.", + "@dehydrateWarning": {}, + "dehydrateTor": "Пользователи TOR: Экспорт сеанса", + "@dehydrateTor": {}, + "dehydrateTorLong": "Для пользователей TOR рекомендуется экспортировать сессию перед закрытием окна.", + "@dehydrateTorLong": {}, + "hydrateTor": "Пользователи TOR: Импорт экспорта сессии", + "@hydrateTor": {}, + "hydrateTorLong": "В прошлый раз вы экспортировали свою сессию в TOR? Быстро импортируйте его и продолжайте общение.", + "@hydrateTorLong": {}, + "hydrate": "Восстановить из файла резервной копии", + "@hydrate": {}, + "loadingPleaseWait": "Загрузка... Пожалуйста, подождите.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "loadMore": "Загрузить больше…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "locationDisabledNotice": "Службы определения местоположения отключены. Включите их для отправки местоположения.", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "locationPermissionDeniedNotice": "Разрешение на определение местоположения отклонено. Это необходимо для отправки местоположения.", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "login": "Войти", + "@login": { + "type": "String", + "placeholders": {} + }, + "logInTo": "Войти в {homeserver}", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "logout": "Выйти", + "@logout": { + "type": "String", + "placeholders": {} + }, + "memberChanges": "Изменения участников", + "@memberChanges": { + "type": "String", + "placeholders": {} + }, + "mention": "Упомянуть", + "@mention": { + "type": "String", + "placeholders": {} + }, + "messages": "Сообщения", + "@messages": { + "type": "String", + "placeholders": {} + }, + "messagesStyle": "Сообщения:", + "@messagesStyle": {}, + "moderator": "Модератор", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "muteChat": "Отключить уведомления", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "needPantalaimonWarning": "Помните, что вам нужен Pantalaimon для использования сквозного шифрования.", + "@needPantalaimonWarning": { + "type": "String", + "placeholders": {} + }, + "newChat": "Новый чат", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "💬 Новое сообщение в Extera", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "Новый запрос на подтверждение!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "next": "Далее", + "@next": { + "type": "String", + "placeholders": {} + }, + "no": "Нет", + "@no": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "Нет соединения с сервером", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "Эмодзи не найдены 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "Вы не можете активировать шифрование в общедоступных комнатах.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "На Вашем устройстве не установлены сервисы Google Play. Классное решение! Для получения push-уведомлений, скачайте ntfy из F-Droid. Вы также можете использовать Aurora Store и microG вместо Google Play Services, если Ваш телефон не поддерживает GMS (например, Huawei).", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "noMatrixServer": "{server1} не является matrix-сервером, использовать {server2} вместо него?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "shareInviteLink": "Поделиться приглашением", + "@shareInviteLink": {}, + "scanQrCode": "Сканировать QR-код", + "@scanQrCode": {}, + "none": "Ничего", + "@none": { + "type": "String", + "placeholders": {} + }, + "noPasswordRecoveryDescription": "Вы ещё не добавили способ восстановления пароля.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "noPermission": "Нет прав доступа", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "Комнаты не найдены…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "notifications": "Уведомления", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "notificationsEnabledForThisAccount": "Уведомления включены для этого аккаунта", + "@notificationsEnabledForThisAccount": { + "type": "String", + "placeholders": {} + }, + "numUsersTyping": "{count} пользователей печатают…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "obtainingLocation": "Получение местоположения…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "offensive": "Оскорбительный", + "@offensive": { + "type": "String", + "placeholders": {} + }, + "offline": "Не в сети", + "@offline": { + "type": "String", + "placeholders": {} + }, + "ok": "Ок", + "@ok": { + "type": "String", + "placeholders": {} + }, + "online": "В сети", + "@online": { + "type": "String", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "Резервное копирование ключей включено", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "oopsPushError": "Ой! К сожалению, при настройке push-уведомлений произошла ошибка.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "Ой, что-то пошло не так…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "Откройте приложение чтобы прочитать сообщения", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "openCamera": "Открыть камеру", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "openVideoCamera": "Открыть камеру для видео", + "@openVideoCamera": { + "type": "String", + "placeholders": {} + }, + "oneClientLoggedOut": "Один из ваших аккаунтов был отключен", + "@oneClientLoggedOut": {}, + "addAccount": "Добавить учетную запись", + "@addAccount": {}, + "editBundlesForAccount": "Изменить пакеты для этой учетной записи", + "@editBundlesForAccount": {}, + "addToBundle": "Добавить в пакет", + "@addToBundle": {}, + "removeFromBundle": "Удалить из этого пакета", + "@removeFromBundle": {}, + "bundleName": "Название пакета", + "@bundleName": {}, + "enableMultiAccounts": "(БЕТА) Включить несколько учетных записей на этом устройстве", + "@enableMultiAccounts": {}, + "openInMaps": "Открыть на картах", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "link": "Ссылка", + "@link": {}, + "serverRequiresEmail": "Этот сервер должен подтвердить ваш адрес электронной почты для регистрации.", + "@serverRequiresEmail": {}, + "or": "Или", + "@or": { + "type": "String", + "placeholders": {} + }, + "participant": "Участник", + "@participant": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "Пароль или ключ восстановления", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "password": "Пароль", + "@password": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "Забыли пароль", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "Пароль был изменён", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "hideMemberChangesInPublicChats": "Скрыть изменения участников в общедоступных чатах", + "@hideMemberChangesInPublicChats": {}, + "hideMemberChangesInPublicChatsBody": "Не показывать входы и выходы, изменения отображаемых имён или аватаров в общедоступных чатах.", + "@hideMemberChangesInPublicChatsBody": {}, + "overview": "Обзор", + "@overview": {}, + "notifyMeFor": "Уведомлять меня о", + "@notifyMeFor": {}, + "passwordRecoverySettings": "Настройки восстановления пароля", + "@passwordRecoverySettings": {}, + "passwordRecovery": "Восстановление пароля", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "people": "Люди", + "@people": { + "type": "String", + "placeholders": {} + }, + "pickImage": "Выбрать изображение", + "@pickImage": { + "type": "String", + "placeholders": {} + }, + "pin": "Закрепить", + "@pin": { + "type": "String", + "placeholders": {} + }, + "play": "Проиграть {fileName}", + "@play": { + "type": "String", + "placeholders": { + "fileName": { + "type": "String" + } + } + }, + "pleaseChoose": "Пожалуйста, выберите", + "@pleaseChoose": { + "type": "String", + "placeholders": {} + }, + "pleaseChooseAPasscode": "Пожалуйста, выберите код доступа", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "pleaseClickOnLink": "Пожалуйста, откройте ссылку в электронной почте для того чтобы продолжить.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "pleaseEnter4Digits": "Введите 4 цифры, или оставьте поле пустым, чтобы отключить блокировку приложения.", + "@pleaseEnter4Digits": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterRecoveryKey": "Введите ключ восстановления:", + "@pleaseEnterRecoveryKey": {}, + "pleaseEnterYourPassword": "Пожалуйста, введите ваш пароль", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPin": "Пожалуйста, введите свой пин-код", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "Пожалуйста, введите имя пользователя", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "Следуйте инструкциям на веб-сайте и нажмите «Далее».", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "privacy": "Конфиденциальность", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "Публичные комнаты", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "pushRules": "Правила push", + "@pushRules": { + "type": "String", + "placeholders": {} + }, + "reason": "Причина", + "@reason": { + "type": "String", + "placeholders": {} + }, + "recording": "Запись", + "@recording": { + "type": "String", + "placeholders": {} + }, + "redactedBy": "{username} удалил(а) это сообщение", + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "directChat": "Личный чат", + "@directChat": {}, + "redactedByBecause": "{username} удалил(а) это сообщение. Причина: \"{reason}\"", + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "redactedAnEvent": "{username} удалил(а) сообщение", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "redactMessage": "Удалить сообщение", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "register": "Зарегистрироваться", + "@register": { + "type": "String", + "placeholders": {} + }, + "reject": "Отказать", + "@reject": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "{username} отклонил(а) приглашение", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "rejoin": "Зайти повторно", + "@rejoin": { + "type": "String", + "placeholders": {} + }, + "removeAllOtherDevices": "Удалить все другие устройства", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "removedBy": "Удалено пользователем {username}", + "@removedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "removeDevice": "Удалить устройство", + "@removeDevice": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "Разбанить", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "removeYourAvatar": "Удалить свой аватар", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "replaceRoomWithNewerVersion": "Заменить комнату более новой версией", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "reply": "Ответить", + "@reply": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "Пожаловаться", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "translateMessage": "Перевести сообщение", + "@translateMessage": { + "type": "String", + "placeholders": {} + }, + "translatedMessage": "Переведённое сообщение", + "@translatedMessage": { + "type": "String", + "placeholders": {} + }, + "errorTranslatingMessage": "Не удалось перевести сообщение.", + "@errorTranslatingMessage": { + "type": "String", + "placeholders": {} + }, + "recoverMessage": "Восстановить", + "@recoverMessage": { + "type": "String", + "placeholders": {} + }, + "recoveredMessage": "Восстановленное сообщение", + "@recoveredMessage": { + "type": "String", + "placeholders": {} + }, + "errorRecoveringMessage": "Не удалось восстановить сообщение.", + "@errorRecoveringMessage": { + "type": "String", + "placeholders": {} + }, + "errorRecoveringMessageNoAdmin": "Эта возможность доступна только администраторам на серверах Synapse.", + "@errorRecoveringMessageNoAdmin": { + "type": "String", + "placeholders": {} + }, + "requestPermission": "Запросить разрешение", + "@requestPermission": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "Комната обновлена", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "Версия комнаты", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "saveFile": "Сохранить файл", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "retry": "Повторить", + "@retry": { + "type": "String", + "placeholders": {} + }, + "search": "Поиск", + "@search": { + "type": "String", + "placeholders": {} + }, + "security": "Безопасность", + "@security": { + "type": "String", + "placeholders": {} + }, + "recoveryKey": "Ключ восстановления", + "@recoveryKey": {}, + "recoveryKeyLost": "Ключ восстановления утерян?", + "@recoveryKeyLost": {}, + "seenByUser": "Просмотрено пользователем {username}", + "@seenByUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "send": "Прислать", + "@send": { + "type": "String", + "placeholders": {} + }, + "sendAMessage": "Отправить сообщение", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "sendAsText": "Отправить как текст", + "@sendAsText": { + "type": "String" + }, + "sendAudio": "Отправить аудио", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendFile": "Отправить файл", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendImage": "Отправить изображение", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendImages": "Отправить {count} изображений", + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "sendMessages": "Отправить сообщения", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "sendOriginal": "Отправить оригинал", + "@sendOriginal": { + "type": "String", + "placeholders": {} + }, + "sendSticker": "Отправить стикер", + "@sendSticker": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "Отправить видео", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "sentAFile": "📁 {username} отправил(а) файл", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAnAudio": "🎤 {username} отправил(а) аудио", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAPicture": "🖼️ {username} отправил(а) изображение", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentASticker": "😊 {username} отправил(а) стикер", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "🎥 {username} отправил(а) видео", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentCallInformations": "{senderName} отправил(а) информацию о звонке", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "separateChatTypes": "Разделять личные чаты и группы", + "@separateChatTypes": { + "type": "String", + "placeholders": {} + }, + "setAsCanonicalAlias": "Установить как основной псевдоним", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "setCustomEmotes": "Установить пользовательские эмодзи", + "@setCustomEmotes": { + "type": "String", + "placeholders": {} + }, + "setChatDescription": "Установить описание чата", + "@setChatDescription": {}, + "setInvitationLink": "Установить ссылку для приглашения", + "@setInvitationLink": { + "type": "String", + "placeholders": {} + }, + "setPermissionsLevel": "Установить уровень прав", + "@setPermissionsLevel": { + "type": "String", + "placeholders": {} + }, + "setStatus": "Задать статус", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "settings": "Настройки", + "@settings": { + "type": "String", + "placeholders": {} + }, + "share": "Поделиться", + "@share": { + "type": "String", + "placeholders": {} + }, + "sharedTheLocation": "{username} поделился(-ась) местоположением", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "shareLocation": "Поделиться местоположением", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "showPassword": "Показать пароль", + "@showPassword": { + "type": "String", + "placeholders": {} + }, + "presenceStyle": "Представление:", + "@presenceStyle": { + "type": "String", + "placeholders": {} + }, + "hideAvatarsInInvites": "Скрывать аватары в приглашениях", + "@hideAvatarsInInvites": { + "type": "String", + "placeholders": {} + }, + "hideAvatarsInInvitesDescription": "Не показывать аватары комнат в приглашениях", + "@hideAvatarsInInvitesDescription": { + "type": "String", + "placeholders": {} + }, + "presencesToggle": "Показывать сообщения в статусах других пользователей", + "@presencesToggle": { + "type": "String", + "placeholders": {} + }, + "pureBlackToggle": "Чёрный фон (AMOLED)", + "@pureBlackToggle": { + "type": "String", + "placeholders": {} + }, + "singlesignon": "Единая система авторизации", + "@singlesignon": { + "type": "String", + "placeholders": {} + }, + "skip": "Пропустить", + "@skip": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "Исходный код", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "spaceIsPublic": "Публичное пространство", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "spaceName": "Название пространства", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "startedACall": "{senderName} начал(а) звонок", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "startFirstChat": "Начните Ваш первый чат", + "@startFirstChat": {}, + "status": "Статус", + "@status": { + "type": "String", + "placeholders": {} + }, + "statusExampleMessage": "Как у вас сегодня дела?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "submit": "Отправить", + "@submit": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWait": "Синхронизация… Пожалуйста, подождите.", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWaitCounter": " Синхронизация… ({percentage}%)", + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "systemTheme": "Системная", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "Они не совпадают", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "Они совпадают", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "title": "Extera", + "@title": { + "description": "Title for the application", + "type": "String", + "placeholders": {} + }, + "toggleFavorite": "Переключить избранное", + "@toggleFavorite": { + "type": "String", + "placeholders": {} + }, + "toggleMuted": "Переключить без звука", + "@toggleMuted": { + "type": "String", + "placeholders": {} + }, + "toggleUnread": "Отметить как прочитанное/непрочитанное", + "@toggleUnread": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "Слишком много запросов. Пожалуйста, повторите попытку позже!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "transferFromAnotherDevice": "Перенос с другого устройства", + "@transferFromAnotherDevice": { + "type": "String", + "placeholders": {} + }, + "tryToSendAgain": "Попробуйте отправить ещё раз", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "unavailable": "Недоступен", + "@unavailable": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username} разбанил(а) {targetName}", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "unblockDevice": "Разблокировать устройство", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "Неизвестное устройство", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "unknownEncryptionAlgorithm": "Неизвестный алгоритм шифрования", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unknownEvent": "Неизвестное событие '{type}'", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "unmuteChat": "Включить уведомления", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "unpin": "Открепить", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "unreadChats": "{unreadCount, plural, other{{unreadCount} непрочитанных чата(ов)}}", + "@unreadChats": { + "type": "String", + "placeholders": { + "unreadCount": { + "type": "int" + } + } + }, + "userAndOthersAreTyping": "{username} и {count} других участников печатают…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "userAndUserAreTyping": "{username} и {username2} печатают…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userIsTyping": "{username} печатает…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userLeftTheChat": "🚪 {username} покинул(а) чат", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "username": "Имя пользователя", + "@username": { + "type": "String", + "placeholders": {} + }, + "userSentUnknownEvent": "{username} отправил(а) событие типа \"{type}\"", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "unverified": "Не проверено", + "@unverified": {}, + "verified": "Проверено", + "@verified": { + "type": "String", + "placeholders": {} + }, + "verify": "Проверить", + "@verify": { + "type": "String", + "placeholders": {} + }, + "verifyStart": "Начать проверку", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "Вы успешно проверены!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "verifyTitle": "Проверка другой учётной записи", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "videoCall": "Видеозвонок", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "Видимость истории чата", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "Видима для всех участников", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "Видна всем", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "Отправить голосовое сообщение", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "Ждём, пока другая сторона примет запрос…", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "Ждём, пока другая сторона примет эмодзи…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "В ожидании другой стороны, чтобы принять числа…", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "wallpaper": "Обои:", + "@wallpaper": { + "type": "String", + "placeholders": {} + }, + "warning": "Предупреждение!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "weSentYouAnEmail": "Мы отправили вам электронное письмо", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "whoCanPerformWhichAction": "Кто и какое действие может выполнять", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "Кому разрешено вступать в эту группу", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "Почему вы хотите сообщить об этом?", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "wipeChatBackup": "Удалить резервную копию чата, чтобы создать новый ключ восстановления?", + "@wipeChatBackup": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "По этим адресам вы можете восстановить свой пароль.", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "Напишите сообщение…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "yes": "Да", + "@yes": { + "type": "String", + "placeholders": {} + }, + "you": "Вы", + "@you": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "Вы больше не участвуете в этом чате", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "Вы были забанены в этом чате", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "yourPublicKey": "Ваш открытый ключ", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "messageInfo": "Информация о сообщении", + "@messageInfo": {}, + "time": "Время", + "@time": {}, + "messageType": "Тип сообщения", + "@messageType": {}, + "sender": "Отправитель", + "@sender": {}, + "openGallery": "Открыть галерею", + "@openGallery": {}, + "removeFromSpace": "Удалить из пространства", + "@removeFromSpace": {}, + "addToSpaceDescription": "Выберите пространство, чтобы добавить к нему этот чат.", + "@addToSpaceDescription": {}, + "start": "Начать", + "@start": {}, + "pleaseEnterRecoveryKeyDescription": "Чтобы разблокировать старые сообщения, введите ключ восстановления, сгенерированный в предыдущем сеансе. Ваш ключ восстановления НЕ является вашим паролем.", + "@pleaseEnterRecoveryKeyDescription": {}, + "publish": "Опубликовать", + "@publish": {}, + "videoWithSize": "Видео ({size})", + "@videoWithSize": { + "type": "String", + "placeholders": { + "size": { + "type": "String" + } + } + }, + "openChat": "Открыть чат", + "@openChat": {}, + "markAsRead": "Отметить как прочитанное", + "@markAsRead": {}, + "reportUser": "Сообщить о пользователе", + "@reportUser": {}, + "dismiss": "Отклонить", + "@dismiss": {}, + "reactedWith": "{sender} отправил реакцию: {reaction}", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "pinMessage": "Прикрепить к комнате", + "@pinMessage": {}, + "confirmEventUnpin": "Вы уверены, что хотите открепить событие?", + "@confirmEventUnpin": {}, + "emojis": "Эмодзи", + "@emojis": {}, + "placeCall": "Совершить звонок", + "@placeCall": {}, + "voiceCall": "Голосовой звонок", + "@voiceCall": {}, + "unsupportedAndroidVersion": "Неподдерживаемая версия Android", + "@unsupportedAndroidVersion": {}, + "unsupportedAndroidVersionLong": "Для этой функции требуется более новая версия Android. Проверьте наличие обновлений или поддержку сторонних прошивок.", + "@unsupportedAndroidVersionLong": {}, + "videoCallsBetaWarning": "Обратите внимание, что видеозвонки в настоящее время находятся в бета-версии. Они могут работать не так, как ожидалось, или вообще не работать на всех платформах.", + "@videoCallsBetaWarning": {}, + "experimentalVideoCalls": "Экспериментальные видеозвонки", + "@experimentalVideoCalls": {}, + "emailOrUsername": "Адрес электронной почты или имя пользователя", + "@emailOrUsername": {}, + "indexedDbErrorTitle": "Проблемы с приватным режимом", + "@indexedDbErrorTitle": {}, + "indexedDbErrorLong": "К сожалению, по умолчанию хранилище сообщений не включено в приватном режиме.\nПожалуйста, посетите\n- about:config\n- установите для dom.indexedDB.privateBrowsing.enabled значение true\nВ противном случае запуск Extera будет невозможен.", + "@indexedDbErrorLong": {}, + "switchToAccount": "Переключиться на учётную запись {number}", + "@switchToAccount": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "nextAccount": "Следующая учётная запись", + "@nextAccount": {}, + "previousAccount": "Предыдущая учётная запись", + "@previousAccount": {}, + "addWidget": "Добавить виджет", + "@addWidget": {}, + "widgetVideo": "Видео", + "@widgetVideo": {}, + "widgetEtherpad": "Текстовая записка", + "@widgetEtherpad": {}, + "widgetJitsi": "Видеозвонок Jitsi", + "@widgetJitsi": {}, + "widgetCustom": "Пользовательский", + "@widgetCustom": {}, + "widgetName": "Имя", + "@widgetName": {}, + "widgetUrlError": "Этот URL не действителен.", + "@widgetUrlError": {}, + "widgetNameError": "Пожалуйста, укажите отображаемое имя.", + "@widgetNameError": {}, + "errorAddingWidget": "Ошибка при добавлении виджета.", + "@errorAddingWidget": {}, + "youRejectedTheInvitation": "Вы отклонили приглашение", + "@youRejectedTheInvitation": {}, + "youJoinedTheChat": "Вы присоединились к чату", + "@youJoinedTheChat": {}, + "youAcceptedTheInvitation": "👍 Вы приняли приглашение", + "@youAcceptedTheInvitation": {}, + "youBannedUser": "Вы забанили {user}", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youHaveWithdrawnTheInvitationFor": "Вы отозвали приглашение для {user}", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedToBy": "📩 Вы были приглашены по ссылке в:\n{alias}", + "@youInvitedToBy": { + "placeholders": { + "alias": { + "type": "String" + } + } + }, + "youInvitedBy": "📩 Вы были приглашены {user}", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "invitedBy": "📩 Приглашен(а) {user}", + "@invitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedUser": "📩 Вы пригласили {user}", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKicked": "👞 Вы выгнали {user}", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKickedAndBanned": "🙅 Вы забанили {user}", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youUnbannedUser": "Вы разбанили {user}", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "hasKnocked": "🚪 {user} подал(а) заявку на вступление", + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "usersMustKnock": "По заявке на вступление", + "@usersMustKnock": {}, + "noOneCanJoin": "Никто не может присоединиться", + "@noOneCanJoin": {}, + "userWouldLikeToChangeTheChat": "{user} желает присоединиться к чату.", + "@userWouldLikeToChangeTheChat": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "noPublicLinkHasBeenCreatedYet": "Публичная ссылка еще не была создана", + "@noPublicLinkHasBeenCreatedYet": {}, + "knock": "Подать заявку", + "@knock": {}, + "users": "Пользователи", + "@users": {}, + "unlockOldMessages": "Разблокировать старые сообщения", + "@unlockOldMessages": {}, + "storeInSecureStorageDescription": "Сохраните ключ восстановления в безопасном хранилище этого устройства.", + "@storeInSecureStorageDescription": {}, + "saveKeyManuallyDescription": "Сохраните этот ключ вручную, вызвав диалог общего доступа системы или буфера обмена.", + "@saveKeyManuallyDescription": {}, + "storeInAndroidKeystore": "Сохранить в Android KeyStore", + "@storeInAndroidKeystore": {}, + "storeInAppleKeyChain": "Сохранить в Apple KeyChain", + "@storeInAppleKeyChain": {}, + "storeSecurlyOnThisDevice": "Сохранить на этом устройстве", + "@storeSecurlyOnThisDevice": {}, + "countFiles": "{count} файлов", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "user": "Пользователь", + "@user": {}, + "custom": "Пользовательское", + "@custom": {}, + "foregroundServiceRunning": "Это уведомление появляется, когда запущена основная служба.", + "@foregroundServiceRunning": {}, + "screenSharingTitle": "общий доступ к экрану", + "@screenSharingTitle": {}, + "screenSharingDetail": "Вы делитесь своим экраном в Extera", + "@screenSharingDetail": {}, + "callingPermissions": "Разрешения на звонки", + "@callingPermissions": {}, + "callingAccount": "Аккаунт для звонков", + "@callingAccount": {}, + "callingAccountDetails": "Позволяет Extera использовать системное приложение для звонков.", + "@callingAccountDetails": {}, + "appearOnTop": "Появляться сверху", + "@appearOnTop": {}, + "appearOnTopDetails": "Позволяет приложению отображаться сверху (не требуется, если у Вас уже настроена Extera как аккаунт для звонков)", + "@appearOnTopDetails": {}, + "otherCallingPermissions": "Микрофон, камера и другие разрешения Extera", + "@otherCallingPermissions": {}, + "whyIsThisMessageEncrypted": "Почему это сообщение нечитаемо?", + "@whyIsThisMessageEncrypted": {}, + "noKeyForThisMessage": "Это может произойти, если сообщение было отправлено до того, как вы вошли в свою учетную запись на данном устройстве.\n\nТакже возможно, что отправитель заблокировал ваше устройство или что-то пошло не так с интернет-соединением.\n\nВы можете прочитать сообщение на другой сессии? Тогда вы можете перенести сообщение с неё! Перейдите в Настройки > Устройства и убедитесь, что ваши устройства проверили друг друга. Когда вы откроете комнату в следующий раз и обе сессии будут открыты, ключи будут переданы автоматически.\n\nВы не хотите потерять ключи при выходе из системы или переключении устройств? Убедитесь, что вы включили резервное копирование чата в настройках.", + "@noKeyForThisMessage": {}, + "newGroup": "Новая группа", + "@newGroup": {}, + "newSpace": "Новое пространство", + "@newSpace": {}, + "enterSpace": "Войти в пространство", + "@enterSpace": {}, + "enterRoom": "Войти в комнату", + "@enterRoom": {}, + "allSpaces": "Все пространства", + "@allSpaces": {}, + "numChats": "{number} чатов", + "@numChats": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "hideUnimportantStateEvents": "Скрыть необязательные события статуса", + "@hideUnimportantStateEvents": {}, + "hidePresences": "Скрыть список статусов?", + "@hidePresences": {}, + "doNotShowAgain": "Не показывать снова", + "@doNotShowAgain": {}, + "wasDirectChatDisplayName": "Пустой чат (был {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "newSpaceDescription": "Пространства позволяют объединять Ваши чаты и создавать частные или общедоступные сообщества.", + "@newSpaceDescription": {}, + "encryptThisChat": "Зашифровать этот чат", + "@encryptThisChat": {}, + "disableEncryptionWarning": "В целях безопасности Вы не можете отключить шифрование в чате, где оно было включено.", + "@disableEncryptionWarning": {}, + "sorryThatsNotPossible": "Извините... это невозможно", + "@sorryThatsNotPossible": {}, + "deviceKeys": "Ключи устройств:", + "@deviceKeys": {}, + "reopenChat": "Открыть чат заново", + "@reopenChat": {}, + "noBackupWarning": "Внимание! Без резервного копиирования, Вы потеряете доступ к своим зашифрованным сообщениям. Крайне рекомендуется включить резервное копирование перед выходом.", + "@noBackupWarning": {}, + "noOtherDevicesFound": "Другие устройства не найдены", + "@noOtherDevicesFound": {}, + "fileIsTooBigForServer": "Отправка не удалась! Сервер поддерживает только вложения размером до {max}.", + "@fileIsTooBigForServer": {}, + "fileHasBeenSavedAt": "Файл сохранён в {path}", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "jumpToLastReadMessage": "Последнее прочитанное сообщение", + "@jumpToLastReadMessage": {}, + "readUpToHere": "Непрочитанное", + "@readUpToHere": {}, + "jump": "Перейти", + "@jump": {}, + "openLinkInBrowser": "Открыть ссылку в браузере", + "@openLinkInBrowser": {}, + "reportErrorDescription": "😭 О, нет. Что-то пошло не так. При желании вы можете сообщить об этой ошибке разработчикам.", + "@reportErrorDescription": {}, + "report": "пожаловаться", + "@report": {}, + "signInWithPassword": "Войти с помощью пароля", + "@signInWithPassword": {}, + "pleaseTryAgainLaterOrChooseDifferentServer": "Повторите попытку позже или выберите другой сервер.", + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "signInWith": "Войти с {provider}", + "@signInWith": { + "type": "String", + "placeholders": { + "provider": { + "type": "String" + } + } + }, + "profileNotFound": "Пользователь не найден на сервере. Это может быть проблемой подключения или пользователь не существует.", + "@profileNotFound": {}, + "setTheme": "Тема:", + "@setTheme": {}, + "setColorTheme": "Цветовая тема:", + "@setColorTheme": {}, + "invite": "Пригласить", + "@invite": {}, + "inviteGroupChat": "📨 Приглашение в групповой чат", + "@inviteGroupChat": {}, + "invitePrivateChat": "📨 Приглашение в приватный чат", + "@invitePrivateChat": {}, + "invalidInput": "Недопустимый ввод!", + "@invalidInput": {}, + "wrongPinEntered": "Введён неверный пин-код! Повторите попытку через {seconds} секунд...", + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "pleaseEnterANumber": "Пожалуйста, введите число больше 0", + "@pleaseEnterANumber": {}, + "archiveRoomDescription": "Чат переместится в архив. Другим пользователям будет видно, что вы вышли из чата.", + "@archiveRoomDescription": {}, + "roomUpgradeDescription": "Затем чат будет воссоздан с новой версией комнаты. Все участники будут уведомлены о необходимости перейти в новый чат. Вы можете узнать больше о версиях комнат на https://spec.matrix.org/latest/rooms/", + "@roomUpgradeDescription": {}, + "removeDevicesDescription": "Вы выйдете с этого устройства и больше не будете получать сообщения.", + "@removeDevicesDescription": {}, + "banUserDescription": "Забаненные пользователи не смогут зайти в чат.", + "@banUserDescription": {}, + "unbanUserDescription": "Пользователь сможет зайти в чат снова.", + "@unbanUserDescription": {}, + "kickUserDescription": "Пользователь будет выгнан из чата, но не забанен. В общедоступных чатах пользователь может перезайти когда угодно.", + "@kickUserDescription": {}, + "makeAdminDescription": "Как только вы назначите этого пользователя администратором, пути назад не будет, так как их права доступа и ваши будут одинаковы.", + "@makeAdminDescription": {}, + "pushNotificationsNotAvailable": "Push-уведомления недоступны", + "@pushNotificationsNotAvailable": {}, + "learnMore": "Узнать больше", + "@learnMore": {}, + "yourGlobalUserIdIs": "Ваш глобальный идентификатор - ", + "@yourGlobalUserIdIs": {}, + "noUsersFoundWithQuery": "К сожалению, пользователей по запросу \"{query}\" не найдено. Убедитесь, что вы не совершили опечатку.", + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "knocking": "Подали заявку", + "@knocking": {}, + "chatCanBeDiscoveredViaSearchOnServer": "Чат может быть обнаружен через поиск в {server}", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "searchChatsRooms": "Поиск #чатов, @людей...", + "@searchChatsRooms": {}, + "nothingFound": "Ничего не найдено...", + "@nothingFound": {}, + "groupName": "Название группы", + "@groupName": {}, + "createGroupAndInviteUsers": "Создать и пригласить", + "@createGroupAndInviteUsers": {}, + "groupCanBeFoundViaSearch": "Группа может быть найдена поиском", + "@groupCanBeFoundViaSearch": {}, + "wrongRecoveryKey": "Простите... судя по всему, это неверный ключ восстановления.", + "@wrongRecoveryKey": {}, + "startConversation": "Начать общение", + "@startConversation": {}, + "commandHint_sendraw": "Отправить необработанный json", + "@commandHint_sendraw": {}, + "databaseMigrationTitle": "База данных оптимизирована", + "@databaseMigrationTitle": {}, + "databaseMigrationBody": "Пожалуйста, подождите. Это может занять некоторое время.", + "@databaseMigrationBody": {}, + "leaveEmptyToClearStatus": "Чтобы очистить статус, оставьте поле пустым.", + "@leaveEmptyToClearStatus": {}, + "select": "Выбрать", + "@select": {}, + "searchForUsers": "Поиск @пользователей...", + "@searchForUsers": {}, + "pleaseEnterYourCurrentPassword": "Пожалуйста, введите свой текущий пароль", + "@pleaseEnterYourCurrentPassword": {}, + "newPassword": "Новый пароль", + "@newPassword": {}, + "pleaseChooseAStrongPassword": "Пожалуйста, выберите более надёжный пароль", + "@pleaseChooseAStrongPassword": {}, + "passwordsDoNotMatch": "Пароли не совпадают", + "@passwordsDoNotMatch": {}, + "passwordIsWrong": "Вы ввели неверный пароль", + "@passwordIsWrong": {}, + "publicLink": "Общедоступная ссылка", + "@publicLink": {}, + "publicChatAddresses": "Адреса общедоступного чата", + "@publicChatAddresses": {}, + "createNewAddress": "Создать новый адрес", + "@createNewAddress": {}, + "joinSpace": "Присоединиться к пространству", + "@joinSpace": {}, + "publicSpaces": "Общедоступные пространства", + "@publicSpaces": {}, + "addChatOrSubSpace": "Добавить чат или подпространство", + "@addChatOrSubSpace": {}, + "subspace": "Подпространство", + "@subspace": {}, + "decline": "Отклонить", + "@decline": {}, + "thisDevice": "Данное устройство:", + "@thisDevice": {}, + "initAppError": "Произошла ошибка при запуске приложения", + "@initAppError": {}, + "userRole": "Роль пользователя", + "@userRole": {}, + "minimumPowerLevel": "{level} является минимальным уровнем прав.", + "@minimumPowerLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "String" + } + } + }, + "searchIn": "Поиск в чате \"{chat}\"...", + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "searchMore": "Найти еще...", + "@searchMore": {}, + "gallery": "Галерея", + "@gallery": {}, + "files": "Файлы", + "@files": {}, + "databaseBuildErrorBody": "Невозможно собрать базу данных SQlite. Приложение пытается использовать старую базу данных. Пожалуйста, сообщите об этой ошибке разработчикам по адресу {url}. Сообщение об ошибке: {error}", + "@databaseBuildErrorBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "sessionLostBody": "Ваш сеанс утерян. Пожалуйста, сообщите об этой ошибке разработчикам по адресу {url}. Сообщение об ошибке: {error}", + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "restoreSessionBody": "Приложение пытается восстановить сеанс из резервной копии. Пожалуйста, сообщите об этой ошибке разработчикам по адресу {url}. Сообщение об ошибке: {error}", + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "forwardMessageTo": "Переслать сообщение в {roomName}?", + "@forwardMessageTo": { + "type": "String", + "placeholders": { + "roomName": { + "type": "String" + } + } + }, + "sendReadReceipts": "Отправка отчётов о прочтении", + "@sendReadReceipts": {}, + "sendTypingNotificationsDescription": "Другие участники чата будут видеть, когда Вы набираете новое сообщение.", + "@sendTypingNotificationsDescription": {}, + "sendReadReceiptsDescription": "Другие участники чата увидят, когда Вы прочитали сообщение.", + "@sendReadReceiptsDescription": {}, + "formattedMessages": "Форматированные сообщения", + "@formattedMessages": {}, + "formattedMessagesDescription": "Отображать формат Markdown в сообщениях, например, жирный текст.", + "@formattedMessagesDescription": {}, + "verifyOtherUser": "🔐 Подтвердить другого пользователя", + "@verifyOtherUser": {}, + "verifyOtherUserDescription": "Если вы подтвердите другого пользователя, то вы можете быть уверены, зная, кому Вы действительно пишете. 💪\n\nКогда Вы начинаете подтверждение, Вы и другой пользователь увидите всплывающее окно в приложении. Там Вы увидите ряд чисел или эмодзи, которые Вы должны сравнить друг с другом.\n\nЛучший способ сделать это - встретиться в реальной жизни или по видео звонку. Если Вы читаете это в далёком будущем, где технологии Deepfake сильно развились, то лучше не стоит доверять видеозвонкам. 👭", + "@verifyOtherUserDescription": {}, + "verifyOtherDevice": "🔐 Подтвердить другое устройство", + "@verifyOtherDevice": {}, + "verifyOtherDeviceDescription": "При подтверждении другого устройства эти устройства могут обмениваться ключами, повышая общую безопасность. 💪 При запуске подтверждения в приложении на обоих устройствах появится всплывающее окно. Там вы увидите ряд чисел или эмодзи, которые вы должны сравнить друг с другом. Лучше иметь оба устройства под рукой перед началом проверки. 🤳", + "@verifyOtherDeviceDescription": {}, + "acceptedKeyVerification": "{sender} принял(а) подтверждение ключей", + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "canceledKeyVerification": "{sender} отклонил(а) подтверждение ключей", + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "completedKeyVerification": "{sender} завершил(а) подтверждение ключей", + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "isReadyForKeyVerification": "{sender} готов(а) к подтверждению ключей", + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "requestedKeyVerification": "{sender} запросил(а) подтверждение ключей", + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "startedKeyVerification": "{sender} начал(а) подтверждение ключей", + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "transparent": "Прозрачный", + "@transparent": {}, + "incomingMessages": "Входящие сообщения", + "@incomingMessages": {}, + "stickers": "Стикеры", + "@stickers": {}, + "discover": "Исследовать", + "@discover": {}, + "commandHint_ignore": "Игнорировать данный Matrix ID", + "@commandHint_ignore": {}, + "commandHint_unignore": "Перестать игнорировать данный Matrix ID", + "@commandHint_unignore": {}, + "unreadChatsInApp": "{appname}: {unread} непрочитанных чатов", + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "noDatabaseEncryption": "Шифрование базы данных не поддерживается на этой платформе", + "@noDatabaseEncryption": {}, + "thereAreCountUsersBlocked": "Заблокировано {count} пользователей.", + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "restricted": "Ограничено", + "@restricted": {}, + "knockRestricted": "Ограничено + по запросу", + "@knockRestricted": {}, + "goToSpace": "Перейти к пространству: {space}", + "@goToSpace": { + "type": "String", + "space": {} + }, + "markAsUnread": "Отметить как непрочитанное", + "userLevel": "{level} - Пользователь", + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "moderatorLevel": "{level} - Модератор", + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "adminLevel": "{level} - Администратор", + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "changeGeneralChatSettings": "Изменить общие настройки чата", + "inviteOtherUsers": "Пригласить других пользователей в этот чат", + "changeTheChatPermissions": "Изменить права доступа к чату", + "changeTheVisibilityOfChatHistory": "Изменить видимость истории чата", + "changeTheCanonicalRoomAlias": "Изменить основной общедоступный адрес чата", + "sendRoomNotifications": "Упоминать @room", + "changeTheDescriptionOfTheGroup": "Изменить описание чата", + "chatPermissionsDescription": "Задайте уровень власти, необходимый для совершения определённых действий в этом чате. Уровни прав 0, 50 и 100 обычно обозначают пользователей, модераторов и администраторов соответственно, но другие уровни также возможны.", + "updateInstalled": "🎉 Обновление {version} успешно установлено!", + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "changelog": "Список изменений", + "sendCanceled": "Отправка отменена", + "loginWithMatrixId": "Войти через Matrix ID", + "discoverHomeservers": "Список домашних серверов", + "whatIsAHomeserver": "Для чего нужен домашний сервер?", + "homeserverDescription": "Все ваши данные хранятся на домашнем сервере, прямо как у вашего провайдера электронной почты. Вы можете выбрать, какому серверу вы их доверите, при этом сохраняя возможность общаться со всеми. Узнайте больше на https://matrix.org.", + "doesNotSeemToBeAValidHomeserver": "Кажется, это не домашний сервер. Нет ли в ссылке опечаток?", + "calculatingFileSize": "Вычисление размера файла...", + "prepareSendingAttachment": "Подготовка к отправке вложения...", + "sendingAttachment": "Отправка вложения...", + "generatingVideoThumbnail": "Создание превью видео...", + "compressVideo": "Сжатие видео...", + "sendingAttachmentCountOfCount": "Отправка... {index} {length}...", + "@sendingAttachmentCountOfCount": { + "type": "integer", + "placeholders": { + "index": { + "type": "int" + }, + "length": { + "type": "int" + } + } + }, + "serverLimitReached": "Слишком много запросов. Повторите попытку через {seconds} секунд...", + "@serverLimitReached": { + "type": "integer", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "oneOfYourDevicesIsNotVerified": "Одно из ваших устройств не подтверждено", + "noticeChatBackupDeviceVerification": "Примечание: Если вы подключите все свои устройства к резервному копированию чатов, то они автоматически станут подтверждёнными.", + "continueText": "Продолжить", + "welcomeText": "Добро пожаловать в Extera - приложение для Matrix, огромной децентрализованной сети обмена сообщениями!", + "blur": "Размытие:", + "opacity": "Прозрачность:", + "setWallpaper": "Установить обои", + "manageAccount": "Управление аккаунтом", + "noContactInformationProvided": "Сервер не предоставляет никакой контактной информации", + "contactServerAdmin": "Админ сервера", + "contactServerSecurity": "Безопасность контактов сервера", + "supportPage": "Поддержка", + "serverInformation": "Информация о сервере:", + "name": "Имя", + "version": "Версия", + "website": "Сайт", + "compress": "Сжатие", + "boldText": "Жирный шрифт", + "italicText": "Italic", + "strikeThrough": "Перечёркнутый", + "pleaseFillOut": "Пожалуйста, заполните", + "invalidUrl": "Не верный URL", + "addLink": "Добавить ссылку", + "unableToJoinChat": "Невозможно присоединиться к чату. Возможно, другая сторона уже завершила разговор.", + "previous": "Предыдущий", + "otherPartyNotLoggedIn": "Другая сторона не может получать сообщения.", + "appWantsToUseForLogin": "Использовать '{server}' для входа", + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "appWantsToUseForLoginDescription": "Вы позволяете приложению и веб-сайту делиться информацией о Вас.", + "open": "Открыть", + "waitingForServer": "Ожидание сервера...", + "appIntroduction": "Extera позволяет Вам присоединяться к другим мессенджерам. Узнайте больше на https://matrix.org или просто нажмите *Продолжить*.", + "newChatRequest": "📩 Запрос нового чата", + "contentNotificationSettings": "Настройки уведомлений по тексту", + "generalNotificationSettings": "Общие настройки уведомлений", + "roomNotificationSettings": "Настройки уведомлений комнаты", + "userSpecificNotificationSettings": "Настроки уведомлений пользователя", + "otherNotificationSettings": "Другие настройки уведомлений", + "notificationRuleContainsUserName": "Содержит имя пользователя", + "notificationRuleContainsUserNameDescription": "Уведомляет пользователя когда сообщение содержит его имя пользователя.", + "notificationRuleMaster": "Отключить все уведомления", + "notificationRuleMasterDescription": "Перекрывает все другие правила и отключает все уведомления.", + "notificationRuleSuppressNotices": "Отключить автоматические сообщения", + "notificationRuleSuppressNoticesDescription": "Отключить уведомления от ботов.", + "notificationRuleInviteForMe": "Приглашение для меня", + "notificationRuleInviteForMeDescription": "Уведомляет о приглашениях.", + "notificationRuleMemberEvent": "Изменение участника", + "notificationRuleMemberEventDescription": "Отключить уведомления об изменениях имён, аватаров.", + "notificationRuleIsUserMention": "Упоминание пользователя", + "notificationRuleIsUserMentionDescription": "Отправлять уведомление, когда Вы @упомянуты.", + "notificationRuleContainsDisplayName": "Содержит отображаемое имя", + "notificationRuleContainsDisplayNameDescription": "Отправлять уведомление, если сообщение содержит Ваше отображаемое имя.", + "notificationRuleIsRoomMention": "Упоминание комнаты", + "notificationRuleIsRoomMentionDescription": "Отправлять уведомление, когда в сообщении есть '@room'.", + "notificationRuleRoomnotif": "Упоминание комнаты", + "notificationRuleRoomnotifDescription": "Отправлять уведомление, когда в сообщении есть '@room'.", + "notificationRuleTombstone": "Завершение чата", + "notificationRuleTombstoneDescription": "Отправлять уведомление при завершении чата.", + "notificationRuleReaction": "Реакция", + "notificationRuleReactionDescription": "Отключить уведомления о реакциях.", + "notificationRuleRoomServerAcl": "Заглушить уведомления о ACL", + "notificationRuleRoomServerAclDescription": "Не отправлять уведомления при изменении ACL комнаты.", + "notificationRuleSuppressEdits": "Заглушить изменения", + "notificationRuleSuppressEditsDescription": "Отключить уведомления об изменённых сообщениях.", + "notificationRuleCall": "Звонок", + "notificationRuleCallDescription": "Отправлять уведомления о звонках.", + "notificationRuleEncryptedRoomOneToOne": "Зашифрованные ЛС", + "notificationRuleEncryptedRoomOneToOneDescription": "Отправлять уведомления из зашифрованных личных сообщений.", + "notificationRuleRoomOneToOne": "Личные сообщения", + "notificationRuleRoomOneToOneDescription": "Отправлять уведомления из незашифрованных личных сообщений.", + "notificationRuleMessage": "Сообщения", + "notificationRuleMessageDescription": "Отправлять уведомления из обычных чатов.", + "notificationRuleEncrypted": "Зашифрованные сообщения", + "notificationRuleEncryptedDescription": "Отправлять уведомления из зашифрованных чатов.", + "notificationRuleJitsi": "Jitsi", + "notificationRuleJitsiDescription": "Отправлять уведомления о видеозвонках Jitsi.", + "notificationRuleServerAcl": "Заглушить события ACL", + "notificationRuleServerAclDescription": "Не отправлять уведомления об изменениях ACL.", + "unknownPushRule": "Неизвестное правило push-уведомлений '{rule}'", + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } + } + }, + "deletePushRuleCanNotBeUndone": "Удаление правила push-уведомлений необратимо.", + "more": "Больше", + "shareKeysWith": "Делиться ключами...", + "shareKeysWithDescription": "Какие устройства доверены и смогут читать Ваши зашифрованные сообщения?", + "allDevices": "Со всеми устройствами", + "crossVerifiedDevicesIfEnabled": "С устройствами, заверенными перекрёстной подписью, если включено", + "crossVerifiedDevices": "С устройствами, заверенными перекрёстной подписью", + "verifiedDevicesOnly": "Только с подтверждёнными устройствами", + "takeAPhoto": "Сделать фото", + "recordAVideo": "Записать видео", + "optionalMessage": "Подпись (необязательно)...", + "notSupportedOnThisDevice": "Не поддерживается на этом устройстве", + "enterNewChat": "Перейти в новый чат", + "approve": "Принять", + "youHaveKnocked": "Вы отправили запрос на вступление", + "pleaseWaitUntilInvited": "Пожалуйста, подождите когда администраторы примут Ваш запрос.", + "@about": { + "type": "String", + "placeholders": {} + }, + "hideUnknownEvents": "Скрыть неизвестные события", + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "ignore": "Игнорировать", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "ignoredUsers": "Игнорируемые пользователи", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "renderRichContent": "Показывать текст с форматированием", + "@renderRichContent": { + "type": "String", + "placeholders": {} + }, + "@changeGeneralChatSettings": {}, + "@changeTheChatPermissions": {}, + "@changeTheDescriptionOfTheGroup": {}, + "@inviteOtherUsers": {}, + "@changeTheVisibilityOfChatHistory": {}, + "@unread": {}, + "@space": {}, + "@spaces": {}, + "@markAsUnread": {}, + "@sendCanceled": {}, + "@noChatsFoundHere": {}, + "@changelog": {}, + "@doesNotSeemToBeAValidHomeserver": {}, + "@noMoreChatsFound": {}, + "@compressVideo": {}, + "@oneOfYourDevicesIsNotVerified": {}, + "@chatPermissionsDescription": {}, + "@prepareSendingAttachment": {}, + "@sendRoomNotifications": {}, + "@calculatingFileSize": {}, + "@sendingAttachment": {}, + "@generatingVideoThumbnail": {}, + "@noticeChatBackupDeviceVerification": {}, + "@changeTheCanonicalRoomAlias": {}, + "@loginWithMatrixId": {}, + "@whatIsAHomeserver": {}, + "@homeserverDescription": {}, + "@discoverHomeservers": {}, + "@joinedChats": {}, + "@serverInformation": {}, + "@welcomeText": {}, + "@noContactInformationProvided": {}, + "@boldText": {}, + "@strikeThrough": {}, + "@pleaseFillOut": {}, + "sendUncompressed": "Отправлять без зжатия", + "@sendUncompressed": {}, + "@invalidUrl": {}, + "@addLink": {}, + "@italicText": {}, + "@unableToJoinChat": {}, + "@continueText": {}, + "@blur": {}, + "@opacity": {}, + "@setWallpaper": {}, + "@manageAccount": {}, + "@contactServerAdmin": {}, + "@contactServerSecurity": {}, + "@supportPage": {}, + "@name": {}, + "@version": {}, + "@website": {}, + "@compress": {}, + "@notificationRuleMessage": {}, + "@appWantsToUseForLoginDescription": {}, + "@newChatRequest": {}, + "@allDevices": {}, + "@roomNotificationSettings": {}, + "@notificationRuleContainsUserName": {}, + "@notificationRuleMaster": {}, + "@notificationRuleSuppressNoticesDescription": {}, + "@notificationRuleInviteForMe": {}, + "@notificationRuleMemberEventDescription": {}, + "@notificationRuleIsRoomMention": {}, + "@notificationRuleReactionDescription": {}, + "@notificationRuleCall": {}, + "@notificationRuleSuppressEditsDescription": {}, + "@notificationRuleEncrypted": {}, + "@more": {}, + "@contentNotificationSettings": {}, + "@generalNotificationSettings": {}, + "@userSpecificNotificationSettings": {}, + "@otherNotificationSettings": {}, + "@notificationRuleContainsUserNameDescription": {}, + "@notificationRuleMasterDescription": {}, + "@notificationRuleSuppressNotices": {}, + "@notificationRuleIsUserMention": {}, + "@notificationRuleContainsDisplayName": {}, + "@notificationRuleReaction": {}, + "@takeAPhoto": {}, + "@recordAVideo": {}, + "@enterNewChat": {}, + "@otherPartyNotLoggedIn": {}, + "@open": {}, + "@waitingForServer": {}, + "@appIntroduction": {}, + "@previous": {} +} \ No newline at end of file diff --git a/assets/l10n/intl_sk.arb b/assets/l10n/intl_sk.arb new file mode 100644 index 0000000..bed4ebf --- /dev/null +++ b/assets/l10n/intl_sk.arb @@ -0,0 +1,1462 @@ +{ + "@@locale": "sk", + "@@last_modified": "2021-08-14 12:41:09.879987", + "about": "O aplikácii", + "@about": { + "type": "String", + "placeholders": {} + }, + "accept": "Prijať", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "{username} prijali pozvánku", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "Účet", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "{username} aktivovali koncové šifrovanie", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "admin": "Administrátor", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "alias", + "@alias": { + "type": "String", + "placeholders": {} + }, + "anyoneCanJoin": "Ktokoľvek sa môže pripojiť", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "archive": "Archivovať", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "Môžu sa pripojiť hostia", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "Ste si istí?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "Na overenie tejto osoby, prosím zadajte prístupovu frázu k \"bezpečému úložisku\" alebo \"klúč na obnovu\".", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "Akcepovať žiadosť o verifikáciu od {username}?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "banFromChat": "Zabanovať z chatu", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "Zabanovaný", + "@banned": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username} zabanoval {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "Zakázať zariadenie", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "cancel": "Zrušiť", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "{username} si zmenili svôj avatar", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatDescriptionTo": "{username} zmenili popis chatu na: „{description}“", + "@changedTheChatDescriptionTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "description": { + "type": "String" + } + } + }, + "changedTheChatNameTo": "{username} zmenili meno chatu na: „{chatname}“", + "@changedTheChatNameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "chatname": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username} zmenili nastavenie oprávnení chatu", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username} si zmenili prezývku na: {displayname}", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} zmenili prístupové práva pre hosťov", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} zmenili prístupové práva pro hosťov na: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username} zmenili nastavenie viditelnosti histórie chatu", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username} zmenili nastavenie viditelnosti histórie chatu na: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username} zmenili nastavenie pravidiel pripojenia", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} zmenili nastavenie pravidiel pripojenia na: {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} si zmenili profilový obrázok", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "{username} zmenili nastavenie aliasov chatu", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username} zmenili odkaz k pozvánke do miestnosti", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changeTheHomeserver": "Zmeniť použitý server", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "Zmena štýlu", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "Zmeniť názov skupiny", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "Šifrovanie bolo poškodené", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "chat": "Chat", + "@chat": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Podrobnosti o chate", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "Vyberte si silné heslo", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "close": "Zavrieť", + "@close": { + "type": "String", + "placeholders": {} + }, + "compareEmojiMatch": "Porovnajte a uistite sa, že nasledujúce emotikony sa zhodujú na oboch zariadeniach:", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "Porovnajte a uistite sa, že nasledujúce čísla sa zhodujú na oboch zariadeniach:", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "confirm": "Potvrdiť", + "@confirm": { + "type": "String", + "placeholders": {} + }, + "connect": "Pripojiť", + "@connect": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "Kontakt bol pozvaný do skupiny", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "Skopírované do schránky", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "Kopírovať", + "@copy": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "Nebolo možné dešifrovať správu: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "countParticipants": "{count} účastníkov", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "create": "Vytvoriť", + "@create": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "{username} založili chat", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "currentlyActive": "Momentálne prítomní", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "Tmavá", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "dateWithoutYear": "{day}.{month}", + "@dateWithoutYear": { + "type": "String", + "placeholders": { + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "dateWithYear": "{day}.{month}.{year}", + "@dateWithYear": { + "type": "String", + "placeholders": { + "year": { + "type": "String" + }, + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "delete": "Odstrániť", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "Odstrániť správu", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "device": "Zariadenie", + "@device": { + "type": "String", + "placeholders": {} + }, + "devices": "Zariadenia", + "@devices": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "Prezývka bola zmenená", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "Stiahnuť súbor", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "editDisplayname": "Zmeniť prezývku", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "Emotikon už existuje!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "Nesprávné označenie emotikonu!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "Nastavenie emotikonov", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "emoteShortcode": "Kód emotikonu", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emoteWarnNeedToPick": "Musíte zvoliť kód emotikonu a obrázok!", + "@emoteWarnNeedToPick": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "Prázdny chat", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "Šifrovanie už nebude možné vypnúť. Ste si tým istí?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "encryption": "Šifrovanie", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "Šifrovanie nie je aktívne", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "enterYourHomeserver": "Zadajte svoj homeserver", + "@enterYourHomeserver": { + "type": "String", + "placeholders": {} + }, + "fileName": "Názov súboru", + "@fileName": { + "type": "String", + "placeholders": {} + }, + "fluffychat": "FluffyChat", + "@fluffychat": { + "type": "String", + "placeholders": {} + }, + "forward": "Preposlať", + "@forward": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "Od pripojenia", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "Od pozvania", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "group": "Skupina", + "@group": { + "type": "String", + "placeholders": {} + }, + "groupIsPublic": "Skupina je verejná", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "groupWith": "Skupina s {displayname}", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "guestsAreForbidden": "Hostia sú zakázaní", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "Hostia sa môžu pripojiť", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{username} vzal späť pozvánku pre {targetName}", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "help": "Pomoc", + "@help": { + "type": "String", + "placeholders": {} + }, + "id": "ID", + "@id": { + "type": "String", + "placeholders": {} + }, + "identity": "Identita", + "@identity": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "Nesprávna prístupová fráza alebo kľúč na obnovenie", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "Pozvať kontakt", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "Pozvať kontakt do {groupName}", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "invited": "Pozvanie", + "@invited": { + "type": "String", + "placeholders": {} + }, + "invitedUser": "{username} pozvali {targetName}", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "invitedUsersOnly": "Len pozvaní používatelia", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "inviteText": "{username} vás pozval na FluffyChat.\n1. Nainštalujte si FluffyChat: https://fluffychat.im\n2. Zaregistrujte sa alebo sa prihláste\n3. Otvorte odkaz na pozvánku: {link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "isTyping": "píše…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "{username} sa pripojili do chatu", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "kicked": "{username} vyhodili {targetName}", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickedAndBanned": "{username} vyhodili a zabanovali {targetName}", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickFromChat": "Vyhodiť z chatu", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "Naposledy prítomní: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "leave": "Opustiť", + "@leave": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "Opustili chat", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "license": "Licencia", + "@license": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "Svetlá", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "Načítať ďalších {count} účastníkov", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "loadingPleaseWait": "Načítava sa… Čakajte prosím.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "loadMore": "Načítať viac…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "login": "Prihlásiť sa", + "@login": { + "type": "String", + "placeholders": {} + }, + "logInTo": "Prihlásenie k {homeserver}", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "logout": "Odhlásiť sa", + "@logout": { + "type": "String", + "placeholders": {} + }, + "moderator": "Moderátor", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "muteChat": "Stlmiť chat", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "needPantalaimonWarning": "Prosím berte na vedomie, že na koncové šifrovanie zatiaľ potrebujete Pantalaimon.", + "@needPantalaimonWarning": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "Nová správa v FluffyChate", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "Nová žiadosť o verifikáciu!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "Nenašli sa žiadne emotikony. 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "Zdá sa, že nemáte žiadne služby Googlu v telefóne. To je dobré rozhodnutie pre vaše súkromie! Ak chcete dostávať push notifikácie vo FluffyChat, odporúčame používať microG: https://microg.org/.", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "none": "Žiadne", + "@none": { + "type": "String", + "placeholders": {} + }, + "noPermission": "Chýba povolenie", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "Nenašli sa žiadne miestnosti…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "ok": "ok", + "@ok": { + "type": "String", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "Online záloha kľúčov je zapnutá", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "Och! Niečo sa pokazilo…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "Na prečítanie správy otvorte aplikáciu", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "openCamera": "Otvoriť fotoaparát", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "prístupová fráza alebo kľúč na obnovenie", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "password": "Heslo", + "@password": { + "type": "String", + "placeholders": {} + }, + "pickImage": "Vybrať obrázok", + "@pickImage": { + "type": "String", + "placeholders": {} + }, + "play": "Prehrať {fileName}", + "@play": { + "type": "String", + "placeholders": { + "fileName": { + "type": "String" + } + } + }, + "pleaseEnterYourPassword": "Prosím zadajte svoje heslo", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "Zadajte svoje používateľské meno", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "Verejné miestnosti", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "recording": "Nahrávam", + "@recording": { + "type": "String", + "placeholders": {} + }, + "redactedAnEvent": "{username} odstránili udalosť", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "reject": "Odmietnuť", + "@reject": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "{username} odmietli pozvánku", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "rejoin": "Vrátiť sa", + "@rejoin": { + "type": "String", + "placeholders": {} + }, + "remove": "Odstrániť", + "@remove": { + "type": "String", + "placeholders": {} + }, + "removeAllOtherDevices": "Odstráňiť všetky ostatné zariadenia", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "removedBy": "Odstánené užívateľom {username}", + "@removedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "removeDevice": "Odstráňiť zariadenie", + "@removeDevice": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "Odblokovať", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "renderRichContent": "Zobraziť formátovaný obsah", + "@renderRichContent": { + "type": "String", + "placeholders": {} + }, + "reply": "Odpovedať", + "@reply": { + "type": "String", + "placeholders": {} + }, + "requestPermission": "Vyžiadať si povolenie", + "@requestPermission": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "Miestnosť bola upgradeovaná", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "seenByUser": "Videné užívateľom {username}", + "@seenByUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "send": "Odoslať", + "@send": { + "type": "String", + "placeholders": {} + }, + "sendAMessage": "Odoslať správu", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "sendFile": "Odoslať súbor", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendImage": "Odoslať obrázok", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sentAFile": "{username} poslali súbor", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAnAudio": "{username} poslali zvukovú nahrávku", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAPicture": "{username} poslali obrázok", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentASticker": "{username} poslali nálepku", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "{username} poslali video", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "setInvitationLink": "Nastaviť odkaz pre pozvánku", + "@setInvitationLink": { + "type": "String", + "placeholders": {} + }, + "setStatus": "Nastaviť status", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "settings": "Nastavenia", + "@settings": { + "type": "String", + "placeholders": {} + }, + "share": "Zdieľať", + "@share": { + "type": "String", + "placeholders": {} + }, + "sharedTheLocation": "{username} zdieľa lokáciu", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "skip": "Preskočiť", + "@skip": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "Zdrojový kód", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "statusExampleMessage": "Ako sa dnes máte?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "submit": "Odoslať", + "@submit": { + "type": "String", + "placeholders": {} + }, + "systemTheme": "Systémová farba", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "Sa nezhodujú", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "Zhodujú sa", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "title": "FluffyChat", + "@title": { + "description": "Title for the application", + "type": "String", + "placeholders": {} + }, + "tryToSendAgain": "Skúsiť znova odoslať", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username} odbanovali {targetName}", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "unblockDevice": "Odblokovať zariadenie", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "Neznáme zariadenie", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "unknownEncryptionAlgorithm": "Neznámy šifrovací algoritmus", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unknownEvent": "Neznáma udalosť „{type}“", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "unmuteChat": "Zrušiť stlmenie chatu", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "unreadChats": "{unreadCount, plural, other{{unreadCount} neprečítaných chatov}}", + "@unreadChats": { + "type": "String", + "placeholders": { + "unreadCount": { + "type": "int" + } + } + }, + "userAndOthersAreTyping": "{username} a {count} dalších píšu…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "userAndUserAreTyping": "{username} a {username2} píšu…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userIsTyping": "{username} píše…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userLeftTheChat": "{username} opustili chat", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "username": "Užívateľské meno", + "@username": { + "type": "String", + "placeholders": {} + }, + "userSentUnknownEvent": "{username} poslali udalosť {type}", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "verify": "Overiť", + "@verify": { + "type": "String", + "placeholders": {} + }, + "verifyStart": "Spustiť verifikáciu", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "Verifikácia bola úspešná!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "verifyTitle": "Verifikujem protiľahlý účet", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "videoCall": "Videohovor", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "Viditeľnosť histórie chatu", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "Viditeľné pre všetkých účastníkov", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "Viditeľné pre každého", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "Hlasová správa", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "Čaká sa, kým partner prijme požiadavku…", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "Čaká sa, kým partner prijme emotikon…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "Čaká sa na to, kým partner prijme čísla…", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "wallpaper": "Pozadie", + "@wallpaper": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "Kto môže vstúpiť do tejto skupiny", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "Napísať správu…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "yes": "Áno", + "@yes": { + "type": "String", + "placeholders": {} + }, + "you": "Vy", + "@you": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "Už sa nezúčastňujete tohto chatu", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "Máte zablokovaný prístup k tomuto chatu", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "people": "Ľudia", + "@people": { + "type": "String", + "placeholders": {} + }, + "chats": "Čety", + "@chats": { + "type": "String", + "placeholders": {} + }, + "changePassword": "Zmeniť heslo", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeDeviceName": "Zmeniť názov zariadenia", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "badServerVersionsException": "Domovský server podporuje verzie špecifikácie:\n{serverVersions}\nAle táto aplikácie podporuje iba {supportedVersions}", + "@badServerVersionsException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "answeredTheCall": "{senderName} prevzal hovor", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "sendAudio": "Poslať zvuk", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "addEmail": "Pridať email", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "appLock": "Uzamknutie aplikácie", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "security": "Bezpečnosť", + "@security": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "Nahlásiť správu", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "sendSticker": "Poslať nálepku", + "@sendSticker": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "Verzia miestnosti", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "sendMessages": "Poslať správy", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "joinRoom": "Pripojiť sa k miestnosti", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "setPermissionsLevel": "Nastaviť úroveň oprávnení", + "@setPermissionsLevel": { + "type": "String", + "placeholders": {} + }, + "badServerLoginTypesException": "Server podporuje tieto typy prihlásenia:\n{serverVersions}\nAle táto aplikácia podporuje iba:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "chatBackup": "Záloha chatov", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "addToSpace": "Pridať do priestoru", + "@addToSpace": {}, + "cantOpenUri": "Nemožno otvoriť identifikátor prostriedku {uri}", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "yourChatBackupHasBeenSetUp": "Záloha vašich chatov bola nastavená.", + "@yourChatBackupHasBeenSetUp": {}, + "repeatPassword": "Zopakujte heslo", + "@repeatPassword": {}, + "all": "Všetky", + "@all": { + "type": "String", + "placeholders": {} + }, + "allChats": "Všetky chaty", + "@allChats": { + "type": "String", + "placeholders": {} + }, + "areYouSureYouWantToLogout": "Ste si istí, že sa chcete odhlásiť?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "sendOnEnter": "Odoslať pri vstupe", + "@sendOnEnter": {}, + "ignoredUsers": "Ignorovaní užívatelia", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "ignore": "Ignorovať", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "search": "Hľadať", + "@search": { + "type": "String", + "placeholders": {} + }, + "sendAsText": "Poslať ako text", + "@sendAsText": { + "type": "String" + }, + "sendOriginal": "Poslať originál", + "@sendOriginal": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "Poslať video", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "importNow": "Importovať teraz", + "@importNow": {} +} diff --git a/assets/l10n/intl_sl.arb b/assets/l10n/intl_sl.arb new file mode 100644 index 0000000..4bf5f58 --- /dev/null +++ b/assets/l10n/intl_sl.arb @@ -0,0 +1,659 @@ +{ + "repeatPassword": "Ponovite geslo", + "@repeatPassword": {}, + "about": "O aplikaciji", + "@about": { + "type": "String", + "placeholders": {} + }, + "accept": "Sprejmi", + "@accept": { + "type": "String", + "placeholders": {} + }, + "account": "Račun", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "Uporabnik {username} je aktiviral šifriranje od konca do konca", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "addEmail": "Dodajte e-pošto", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "addToSpace": "Dodajte v prostor", + "@addToSpace": {}, + "alias": "vzdevek", + "@alias": { + "type": "String", + "placeholders": {} + }, + "all": "Vse", + "@all": { + "type": "String", + "placeholders": {} + }, + "allChats": "Vsi klepeti", + "@allChats": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "Oseba {senderName} je odgovorila na klic", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "Pridruži se lahko vsak", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "appLock": "Zaklepanje aplikacije", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "Če želite podpisati drugo osebo, vnesite geslo za varno trgovino ali obnovitveni ključ.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "Ali želite sprejeti to zahtevo za preverjanje od {username}?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "autoplayImages": "Samodejno predvajajte animirane nalepke in čustva", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "badServerLoginTypesException": "Domači strežnik podpira vrste prijave:\n{serverVersions}\nToda ta aplikacija podpira samo:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "sendOnEnter": "Pošlji ob vstopu", + "@sendOnEnter": {}, + "banFromChat": "Prepoved klepeta", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "Prepovedano", + "@banned": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username} je prepovedan v {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "Blokirana naprava", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "blocked": "Blokirano", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "botMessages": "Botova sporočila", + "@botMessages": { + "type": "String", + "placeholders": {} + }, + "cancel": "Prekliči", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "cantOpenUri": "URI-ja {uri} ni mogoče odpreti", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "changedTheChatAvatar": "{username} je spremenil avatar za klepet", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username} je spremenila dovoljenja za klepet", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username} je spremenil svoje prikazno ime v: '{displayname}'", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} je spremenila pravila dostopa za goste", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} je spremenila pravila dostopa za goste v: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username} je spremenil vidnost zgodovine v: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username} je spremenil pravila za pridružitev", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} je spremenila pravila pridružitve v: {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} je spremenil avatar", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "{username} je spremenil vzdevke sobe", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username} je spremenil povezavo za povabilo", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changePassword": "Spremeni geslo", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "Spremenite domači strežnik", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "Spremenite svoj slog", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "Spremenite ime skupine", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "changeYourAvatar": "Spremenite svoj avatar", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "chat": "Klepet", + "@chat": { + "type": "String", + "placeholders": {} + }, + "yourChatBackupHasBeenSetUp": "Varnostna kopija klepeta je nastavljena.", + "@yourChatBackupHasBeenSetUp": {}, + "chatBackup": "Varnostno kopiranje klepeta", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Podrobnosti klepeta", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chatHasBeenAddedToThisSpace": "Klepet je bil dodan v ta prostor", + "@chatHasBeenAddedToThisSpace": {}, + "chats": "Klepeti", + "@chats": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "Izberite močno geslo", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "clearArchive": "Počisti arhiv", + "@clearArchive": {}, + "close": "Zapri", + "@close": { + "type": "String", + "placeholders": {} + }, + "commandHint_ban": "Izključi določenega uporabnika iz te sobe", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_html": "Pošljite besedilo v obliki HTML", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_invite": "Povabi danega uporabnika v to sobo", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "commandHint_join": "Pridružite se dani sobi", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_kick": "Odstranite danega uporabnika iz te sobe", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_me": "Opisi sebe", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "commandHint_myroomavatar": "Nastavite svojo sliko za to sobo", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_op": "Nastavite raven moči danega uporabnika (privzeto: 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_react": "Pošljite odgovor kot reakcijo", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "commandHint_send": "Pošlji besedilo", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "commandHint_unban": "Prekliči izključitev določenega uporabnika iz te sobe", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "commandInvalid": "Ukaz ni veljaven", + "@commandInvalid": { + "type": "String" + }, + "commandMissing": "{command} is not a command.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "compareEmojiMatch": "Primerjajte in se prepričajte, da se naslednji emoji ujemajo s tistimi iz druge naprave:", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "Primerjajte in se prepričajte, da se naslednje številke ujemajo s številkami druge naprave:", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "configureChat": "Konfigurirajte klepet", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "confirm": "Potrdi", + "@confirm": { + "type": "String", + "placeholders": {} + }, + "containsDisplayName": "Vsebuje prikazno ime", + "@containsDisplayName": { + "type": "String", + "placeholders": {} + }, + "containsUserName": "Vsebuje uporabniško ime", + "@containsUserName": { + "type": "String", + "placeholders": {} + }, + "archive": "Arhiv", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "Ali si prepričan?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "{username} je sprejel povabilo", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "areYouSureYouWantToLogout": "Ali ste prepričani, da se želite odjaviti?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "changedTheChatDescriptionTo": "{username} je spremenil opis klepeta v: '{description}'", + "@changedTheChatDescriptionTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "description": { + "type": "String" + } + } + }, + "areGuestsAllowedToJoin": "Ali se lahko gostujoči uporabniki pridružijo", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "admin": "Admin", + "@admin": { + "type": "String", + "placeholders": {} + }, + "badServerVersionsException": "Domači strežnik podpira različice Spec:\n{serverVersions}\nToda ta aplikacija podpira samo {supportedVersions}", + "@badServerVersionsException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "changedTheChatNameTo": "{username} je spremenil ime klepeta v: '{chatname}'", + "@changedTheChatNameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "chatname": { + "type": "String" + } + } + }, + "changeDeviceName": "Spremenite ime naprave", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changedTheHistoryVisibility": "{username} je spremenila vidnost zgodovine", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "channelCorruptedDecryptError": "Šifriranje je poškodovano", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "Vsebina je bila prijavljena skrbnikom strežnika", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "chatBackupDescription": "Varnostna kopija klepeta je zavarovana z varnostnim ključem. Prosimo, pazite, da ga ne izgubite.", + "@chatBackupDescription": { + "type": "String", + "placeholders": {} + }, + "commandHint_myroomnick": "Nastavite prikazno ime za to sobo", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "connect": "Povežite se", + "@connect": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "Kontakt je bil povabljen v skupino", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "commandHint_leave": "Zapusti to sobo", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_plain": "Pošlji neformatirano besedilo", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "copiedToClipboard": "Kopirano v odložišče", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "Kopiraj", + "@copy": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "Kopiraj v odložišče", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "Sporočila ni bilo mogoče dešifrirati: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "countParticipants": "{count} udeležencev", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "create": "Ustvari", + "@create": { + "type": "String", + "placeholders": {} + }, + "createNewSpace": "Nov prostor", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "currentlyActive": "Trenutno aktiven", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "Temno", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "Privzeta raven dovoljenja", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "dateWithYear": "{day}-{month}-{year}", + "@dateWithYear": { + "type": "String", + "placeholders": { + "year": { + "type": "String" + }, + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "dateWithoutYear": "{month}-{day}", + "@dateWithoutYear": { + "type": "String", + "placeholders": { + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "createdTheChat": "{username} je ustvaril klepet", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "deactivateAccountWarning": "S tem boste deaktivirali vaš uporabniški račun. Tega ni mogoče razveljaviti! Ali si prepričan?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + } +} diff --git a/assets/l10n/intl_sr.arb b/assets/l10n/intl_sr.arb new file mode 100644 index 0000000..5c407b3 --- /dev/null +++ b/assets/l10n/intl_sr.arb @@ -0,0 +1,1971 @@ +{ + "@@last_modified": "2021-08-14 12:41:09.857024", + "about": "О програму", + "@about": { + "type": "String", + "placeholders": {} + }, + "accept": "Прихвати", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "{username} прихвата позивницу", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "Налог", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "{username} укључи шифровање с краја на крај", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "addEmail": "Додај е-адресу", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "admin": "Админ", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "алијас", + "@alias": { + "type": "String", + "placeholders": {} + }, + "all": "Сви", + "@all": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "{senderName} одговори на позив", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "свако може да се придружи", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "appLock": "Закључавање апликације", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "archive": "Архива", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "Да ли је гостима дозвољен приступ", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "Сигурни сте?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "areYouSureYouWantToLogout": "Заиста желите да се одјавите?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "Да бисте могли да пријавите другу особу, унесите своју безбедносну фразу или кључ опоравка.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "Прихватате ли захтев за верификацију од корисника {username}?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "badServerLoginTypesException": "Домаћи сервер подржава начине пријаве:\n{serverVersions}\nали ова апликација подржава само:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "badServerVersionsException": "Домаћи сервер подржава верзије:\n{serverVersions}\nали ова апликација подржава само {supportedVersions}", + "@badServerVersionsException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "banFromChat": "Забрани у ћаскању", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "Забрањен", + "@banned": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username} забрани корисника {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "Блокирај уређај", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "blocked": "Блокиран", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "botMessages": "Поруке Бота", + "@botMessages": { + "type": "String", + "placeholders": {} + }, + "cancel": "Откажи", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "changeDeviceName": "Промени назив уређаја", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "{username} промени аватар ћаскања", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatDescriptionTo": "{username} промени опис ћаскања у: „{description}“", + "@changedTheChatDescriptionTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "description": { + "type": "String" + } + } + }, + "changedTheChatNameTo": "{username} промени назив ћаскања у: „{chatname}“", + "@changedTheChatNameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "chatname": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username} измени дозволе ћаскања", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username} промени приказно име на: „{displayname}“", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} измени правила за приступ гостију", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} измени правила за приступ гостију на: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username} измени видљивост историје", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username} измени видљивост историје на: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username} измени правила приступања", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} измени правила приступања на: {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} измени свој аватар", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "{username} измени алијас собе", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username} измени везу позивнице", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changePassword": "Измени лозинку", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "Промени домаћи сервер", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "Измените изглед", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "Измени назив групе", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "changeYourAvatar": "Измените свој аватар", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "Шифровање је покварено", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "chat": "Ћаскање", + "@chat": { + "type": "String", + "placeholders": {} + }, + "chatBackup": "Копија ћаскања", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "chatBackupDescription": "Ваша резервна копија ћаскања је обезбеђена кључем. Немојте да га изгубите.", + "@chatBackupDescription": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Детаљи ћаскања", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chats": "Ћаскања", + "@chats": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "Изаберите јаку лозинку", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "clearArchive": "Очисти архиву", + "@clearArchive": {}, + "close": "Затвори", + "@close": { + "type": "String", + "placeholders": {} + }, + "commandHint_ban": "Блокирај задатог корисника за ову собу", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_html": "Шаљи ХТМЛ обликован текст", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_invite": "Позови задатог корисника у собу", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "commandHint_join": "Придружи се наведеној соби", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_kick": "Уклони задатог корисника из собе", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_leave": "Напусти ову собу", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_me": "Опишите себе", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "commandHint_myroomnick": "Поставља ваш надимак за ову собу", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "commandHint_op": "Подеси ниво задатог корисника (подразумевано: 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_plain": "Шаљи неформатиран текст", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_react": "Шаљи одговор као реакцију", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "commandHint_send": "Пошаљи текст", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "commandHint_unban": "Скини забрану задатом кориснику за ову собу", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "compareEmojiMatch": "Упоредите и проверите да су емоџији идентични као на другом уређају:", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "Упоредите и проверите да су следећи бројеви идентични као на другом уређају:", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "configureChat": "Подешавање ћаскања", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "confirm": "Потврди", + "@confirm": { + "type": "String", + "placeholders": {} + }, + "connect": "Повежи се", + "@connect": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "Особа је позвана у групу", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "containsDisplayName": "Садржи приказно име", + "@containsDisplayName": { + "type": "String", + "placeholders": {} + }, + "containsUserName": "Садржи корисничко име", + "@containsUserName": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "Садржај је пријављен администраторима сервера", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "Копирано у клипборд", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "Копирај", + "@copy": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "Копирај у клипборд", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "Не могу да дешифрујем поруку: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "countParticipants": "учесника: {count}", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "create": "Направи", + "@create": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "{username} направи ћаскање", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "currentlyActive": "Тренутно активно", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "тамни", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "dateWithoutYear": "{day} {month}", + "@dateWithoutYear": { + "type": "String", + "placeholders": { + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "dateWithYear": "{day} {month} {year}", + "@dateWithYear": { + "type": "String", + "placeholders": { + "year": { + "type": "String" + }, + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "deactivateAccountWarning": "Ово ће деактивирати ваш кориснички налог. Не може се повратити! Сигурни сте?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "Подразумевани ниво приступа", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "delete": "Обриши", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "Обриши налог", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "Брисање поруке", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "device": "Уређај", + "@device": { + "type": "String", + "placeholders": {} + }, + "deviceId": "ИД уређаја", + "@deviceId": { + "type": "String", + "placeholders": {} + }, + "devices": "Уређаји", + "@devices": { + "type": "String", + "placeholders": {} + }, + "directChats": "Директна ћаскања", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "Име за приказ је измењено", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "Преузми фајл", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "edit": "Уреди", + "@edit": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "Уреди блокиране сервере", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "editDisplayname": "Уреди име за приказ", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "editRoomAliases": "Уреди алијасе собе", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "Уређује аватар собе", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "Емоти већ постоји!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "Неисправна скраћеница за емоти!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emotePacks": "Пакети емотија за собу", + "@emotePacks": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "Поставке емотија", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "emoteShortcode": "скраћеница", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emoteWarnNeedToPick": "Морате да изаберете скраћеницу и слику за емоти!", + "@emoteWarnNeedToPick": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "празно ћаскање", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "Глобално укључи пакет емотија", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "Укључује шифровање", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "Шифровање више нећете моћи да искључите. Сигурни сте?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "encrypted": "Шифровано", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "encryption": "Шифровање", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "Шифровање није укључено", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName} заврши позив", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "enterAnEmailAddress": "Унесите адресу е-поште", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "enterYourHomeserver": "Унесите свој домаћи сервер", + "@enterYourHomeserver": { + "type": "String", + "placeholders": {} + }, + "everythingReady": "Све је спремно!", + "@everythingReady": { + "type": "String", + "placeholders": {} + }, + "extremeOffensive": "Екстремно увредљив", + "@extremeOffensive": { + "type": "String", + "placeholders": {} + }, + "fileName": "Назив фајла", + "@fileName": { + "type": "String", + "placeholders": {} + }, + "fluffychat": "FluffyChat", + "@fluffychat": { + "type": "String", + "placeholders": {} + }, + "fontSize": "Величина фонта", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "forward": "Напред", + "@forward": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "од приступања", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "од позивања", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "goToTheNewRoom": "Иди у нову собу", + "@goToTheNewRoom": { + "type": "String", + "placeholders": {} + }, + "group": "Група", + "@group": { + "type": "String", + "placeholders": {} + }, + "groupIsPublic": "Група је јавна", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "groups": "Групе", + "@groups": { + "type": "String", + "placeholders": {} + }, + "groupWith": "Група са корисником {displayname}", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "guestsAreForbidden": "гости су забрањени", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "гости могу приступити", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{username} поништи позивницу за корисника {targetName}", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "help": "Помоћ", + "@help": { + "type": "String", + "placeholders": {} + }, + "hideRedactedEvents": "Сакриј редиговане догађаје", + "@hideRedactedEvents": { + "type": "String", + "placeholders": {} + }, + "hideUnknownEvents": "Сакриј непознате догађаје", + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "howOffensiveIsThisContent": "Колико је увредљив овај садржај?", + "@howOffensiveIsThisContent": { + "type": "String", + "placeholders": {} + }, + "id": "ИД", + "@id": { + "type": "String", + "placeholders": {} + }, + "identity": "Идентитет", + "@identity": { + "type": "String", + "placeholders": {} + }, + "ignore": "Игнориши", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "ignoredUsers": "Игнорисани корисници", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "iHaveClickedOnLink": "Кликнуо сам на везу", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "Неисправна фраза или кључ опоравка", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "inoffensive": "Није увредљив", + "@inoffensive": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "Позивање особа", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "Позови особу у групу {groupName}", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "invited": "Позван", + "@invited": { + "type": "String", + "placeholders": {} + }, + "invitedUser": "{username} позва корисника {targetName}", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "invitedUsersOnly": "само позвани корисници", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "inviteForMe": "Позивнице за мене", + "@inviteForMe": { + "type": "String", + "placeholders": {} + }, + "inviteText": "{username} вас позива у FluffyChat. \n1. Инсталирајте FluffyChat: https://fluffychat.im \n2. Региструјте се или пријавите \n3. Отворите везу позивнице: {link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "isTyping": "куца…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "{username} се придружи ћаскању", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "joinRoom": "Придружи се соби", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "kicked": "{username} избаци корисника {targetName}", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickedAndBanned": "{username} избаци и забрани корисника {targetName}", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickFromChat": "Избаци из ћаскања", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "Последња активност: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "leave": "Напусти", + "@leave": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "Напусти ћаскање", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "license": "Лиценца", + "@license": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "светли", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "Учитај још {count} учесника", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "loadingPleaseWait": "Учитавам… Сачекајте.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "loadMore": "Учитај још…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "login": "Пријава", + "@login": { + "type": "String", + "placeholders": {} + }, + "logInTo": "Пријава на {homeserver}", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "logout": "Одјава", + "@logout": { + "type": "String", + "placeholders": {} + }, + "memberChanges": "Измене чланова", + "@memberChanges": { + "type": "String", + "placeholders": {} + }, + "mention": "Спомени", + "@mention": { + "type": "String", + "placeholders": {} + }, + "messages": "Поруке", + "@messages": { + "type": "String", + "placeholders": {} + }, + "moderator": "Модератор", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "muteChat": "Ућуткај ћаскање", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "needPantalaimonWarning": "За сада, потребан је Пантелејмон (Pantalaimon) да бисте користили шифровање с краја на крај.", + "@needPantalaimonWarning": { + "type": "String", + "placeholders": {} + }, + "newChat": "Ново ћаскање", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "Нова порука — FluffyChat", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "Нови захтев за верификацију!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "next": "Следеће", + "@next": { + "type": "String", + "placeholders": {} + }, + "no": "Не", + "@no": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "Нема везе са сервером", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "Нема емотија. 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "Шифровање се може активирати након што соба престане да буде јавно доступна.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "Чини се да немате Гугл услуге на телефону. То је добра одлука за вашу приватност! Да би се протурале нотификације у FluffyChat, препоручујемо коришћење https://microg.org/ или https://unifiedpush.org/", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "none": "Ништа", + "@none": { + "type": "String", + "placeholders": {} + }, + "noPasswordRecoveryDescription": "Још нисте одредили начин за опоравак лозинке.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "noPermission": "Нема дозвола", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "Нисам нашао собе…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "notifications": "Обавештења", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "notificationsEnabledForThisAccount": "Обавештења укључена за овај налог", + "@notificationsEnabledForThisAccount": { + "type": "String", + "placeholders": {} + }, + "numUsersTyping": "{count} корисника куца…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "offensive": "Увредљив", + "@offensive": { + "type": "String", + "placeholders": {} + }, + "offline": "Ван везе", + "@offline": { + "type": "String", + "placeholders": {} + }, + "ok": "у реду", + "@ok": { + "type": "String", + "placeholders": {} + }, + "online": "На вези", + "@online": { + "type": "String", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "Резерва кључева на мрежи је укључена", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "oopsPushError": "Нажалост, дошло је до грешке при подешавању дотурања обавештења.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "Нешто је пошло наопако…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "Отворите апликацију да прочитате поруке", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "openCamera": "Отвори камеру", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "or": "или", + "@or": { + "type": "String", + "placeholders": {} + }, + "participant": "Учесник", + "@participant": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "фраза или кључ опоравка", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "password": "Лозинка", + "@password": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "Заборављена лозинка", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "Лозинка је промењена", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "passwordRecovery": "Опоравак лозинке", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "people": "Људи", + "@people": { + "type": "String", + "placeholders": {} + }, + "pickImage": "Избор слике", + "@pickImage": { + "type": "String", + "placeholders": {} + }, + "pin": "Закачи", + "@pin": { + "type": "String", + "placeholders": {} + }, + "play": "Пусти {fileName}", + "@play": { + "type": "String", + "placeholders": { + "fileName": { + "type": "String" + } + } + }, + "pleaseChoose": "Изаберите", + "@pleaseChoose": { + "type": "String", + "placeholders": {} + }, + "pleaseChooseAPasscode": "Изаберите код за пролаз", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "pleaseClickOnLink": "Кликните на везу у примљеној е-пошти па наставите.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "pleaseEnter4Digits": "Унесите 4 цифре или оставите празно да не закључавате апликацију.", + "@pleaseEnter4Digits": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPassword": "Унесите своју лозинку", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPin": "Унесите свој пин", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "Унесите своје корисничко име", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "Испратите упутства на веб сајту и тапните на „Следеће“.", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "privacy": "Приватност", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "Јавне собе", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "pushRules": "Правила протурања", + "@pushRules": { + "type": "String", + "placeholders": {} + }, + "reason": "Разлог", + "@reason": { + "type": "String", + "placeholders": {} + }, + "recording": "Снимам", + "@recording": { + "type": "String", + "placeholders": {} + }, + "redactedAnEvent": "{username} редигова догађај", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "redactMessage": "Редигуј поруку", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "register": "Регистрација", + "@register": { + "type": "String", + "placeholders": {} + }, + "reject": "Одбиј", + "@reject": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "{username} одби позивницу", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "rejoin": "Поново се придружи", + "@rejoin": { + "type": "String", + "placeholders": {} + }, + "remove": "Уклони", + "@remove": { + "type": "String", + "placeholders": {} + }, + "removeAllOtherDevices": "Уклони све остале уређаје", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "removedBy": "Уклонио корисник {username}", + "@removedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "removeDevice": "Уклони уређај", + "@removeDevice": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "Уклони изгнанство", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "removeYourAvatar": "Уклоните свој аватар", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "renderRichContent": "Приказуј обогаћен садржај поруке", + "@renderRichContent": { + "type": "String", + "placeholders": {} + }, + "replaceRoomWithNewerVersion": "Замени собу новијом верзијом", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "reply": "Одговори", + "@reply": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "Пријави поруку", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "requestPermission": "Затражи дозволу", + "@requestPermission": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "Соба је надограђена", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "Верзија собе", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "search": "Претражи", + "@search": { + "type": "String", + "placeholders": {} + }, + "security": "Безбедност", + "@security": { + "type": "String", + "placeholders": {} + }, + "seenByUser": "{username} прегледа", + "@seenByUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "send": "Пошаљи", + "@send": { + "type": "String", + "placeholders": {} + }, + "sendAMessage": "Пошаљи поруку", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "sendAudio": "Пошаљи аудио", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendFile": "Пошаљи фајл", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendImage": "Пошаљи слику", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendMessages": "Слање порука", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "sendOriginal": "Пошаљи оригинал", + "@sendOriginal": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "Пошаљи видео", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "sentAFile": "{username} посла фајл", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAnAudio": "{username} посла аудио", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAPicture": "{username} посла слику", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentASticker": "{username} посла налепницу", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "{username} посла видео", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentCallInformations": "{senderName} посла податке о позиву", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "setAsCanonicalAlias": "Постави као главни алијас", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "setCustomEmotes": "постави посебне емотије", + "@setCustomEmotes": { + "type": "String", + "placeholders": {} + }, + "setInvitationLink": "Поставља везу позивнице", + "@setInvitationLink": { + "type": "String", + "placeholders": {} + }, + "setPermissionsLevel": "Одреди ниво дозволе", + "@setPermissionsLevel": { + "type": "String", + "placeholders": {} + }, + "setStatus": "Постави статус", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "settings": "Поставке", + "@settings": { + "type": "String", + "placeholders": {} + }, + "share": "Подели", + "@share": { + "type": "String", + "placeholders": {} + }, + "sharedTheLocation": "{username} подели локацију", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "showPassword": "Прикажи лозинку", + "@showPassword": { + "type": "String", + "placeholders": {} + }, + "singlesignon": "Јединствена пријава", + "@singlesignon": { + "type": "String", + "placeholders": {} + }, + "skip": "Прескочи", + "@skip": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "Изворни код", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "startedACall": "{senderName} започе позив", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "status": "Стање", + "@status": { + "type": "String", + "placeholders": {} + }, + "statusExampleMessage": "Како сте данас?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "submit": "Пошаљи", + "@submit": { + "type": "String", + "placeholders": {} + }, + "systemTheme": "системски", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "Не поклапају се", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "Поклапају се", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "title": "FluffyChat", + "@title": { + "description": "Title for the application", + "type": "String", + "placeholders": {} + }, + "toggleFavorite": "Мењај омиљеност", + "@toggleFavorite": { + "type": "String", + "placeholders": {} + }, + "toggleMuted": "Мењај ућутканост", + "@toggleMuted": { + "type": "String", + "placeholders": {} + }, + "toggleUnread": "Означи не/прочитано", + "@toggleUnread": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "Превише упита. Покушајте касније!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "transferFromAnotherDevice": "Пренос са другог уређаја", + "@transferFromAnotherDevice": { + "type": "String", + "placeholders": {} + }, + "tryToSendAgain": "Покушај слање поново", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "unavailable": "Недоступно", + "@unavailable": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username} одблокира корисника {targetName}", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "unblockDevice": "Одблокирај уређај", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "Непознат уређај", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "unknownEncryptionAlgorithm": "Непознат алгоритам шифровања", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unknownEvent": "Непознат догађај „{type}“", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "unmuteChat": "Врати обавештења", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "unpin": "Откачи", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "unreadChats": "{unreadCount, plural, other{непрочитаних ћаскања: {unreadCount}}}", + "@unreadChats": { + "type": "String", + "placeholders": { + "unreadCount": { + "type": "int" + } + } + }, + "userAndOthersAreTyping": "{username} и {count} корисника куцају…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "userAndUserAreTyping": "{username} и {username2} куцају…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userIsTyping": "{username} куца…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userLeftTheChat": "{username} напусти ћаскање", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "username": "Корисничко име", + "@username": { + "type": "String", + "placeholders": {} + }, + "userSentUnknownEvent": "{username} посла {type} догађај", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "verified": "Оверен", + "@verified": { + "type": "String", + "placeholders": {} + }, + "verify": "Верификуј", + "@verify": { + "type": "String", + "placeholders": {} + }, + "verifyStart": "Покрени верификацију", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "Успешно сте верификовали!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "verifyTitle": "Верификујем други налог", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "videoCall": "Видео позив", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "Одреди видљивост историје", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "видљиво свим учесницима", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "видљиво свима", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "Гласовна порука", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "Чекам да саговорник прихвати захтев…", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "Чекам да саговорник прихвати емоџије…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "Чекам да саговорник прихвати бројеве…", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "wallpaper": "Тапета", + "@wallpaper": { + "type": "String", + "placeholders": {} + }, + "warning": "Упозорење!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "weSentYouAnEmail": "Послали смо вам е-пошту", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "whoCanPerformWhichAction": "ко може шта да ради", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "Ко може да се придружи групи", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "Зашто желите ово да пријавите?", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "wipeChatBackup": "Да обришем резервну копију како би направио нови сигурносни кључ?", + "@wipeChatBackup": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "Са овим адресама можете опоравити своју лозинку.", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "напишите поруку…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "yes": "Да", + "@yes": { + "type": "String", + "placeholders": {} + }, + "you": "Ви", + "@you": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "Више не учествујете у овом ћаскању", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "Забрањено вам је ово ћаскање", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "yourPublicKey": "Ваш јавни кључ", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + } +} diff --git a/assets/l10n/intl_sv.arb b/assets/l10n/intl_sv.arb new file mode 100644 index 0000000..5dadb9c --- /dev/null +++ b/assets/l10n/intl_sv.arb @@ -0,0 +1,2863 @@ +{ + "@@last_modified": "2021-08-14 12:41:09.835634", + "about": "Om", + "@about": { + "type": "String", + "placeholders": {} + }, + "accept": "Acceptera", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 {username} accepterade inbjudan", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "Konto", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐 {username} aktiverade ändpunktskryptering", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "admin": "Admin", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "alias", + "@alias": { + "type": "String", + "placeholders": {} + }, + "all": "Alla", + "@all": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "{senderName} besvarade samtalet", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "Vem som helst kan gå med", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "appLock": "App-lås", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "archive": "Arkiv", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "Får gästanvändare gå med", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "Är du säker?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "areYouSureYouWantToLogout": "Är du säker på att du vill logga ut?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "För att kunna signera den andra personen, vänligen ange din lösenfras eller återställningsnyckel för säker lagring.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "Acceptera denna verifikationsförfrågan från {username}?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "badServerVersionsException": "Hemservern stöjder Spec-versionen:\n{serverVersions}\nMen denna app stödjer enbart {supportedVersions}", + "@badServerVersionsException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "banFromChat": "Bannlys från chatt", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "Bannlyst", + "@banned": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username} bannlös {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "Blockera Enhet", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "botMessages": "Bot meddelanden", + "@botMessages": { + "type": "String", + "placeholders": {} + }, + "cancel": "Avbryt", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "changeDeviceName": "Ändra enhetsnamn", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "{username} ändrade sin chatt-avatar", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatDescriptionTo": "{username} ändrade chatt-beskrivningen till: '{description}'", + "@changedTheChatDescriptionTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "description": { + "type": "String" + } + } + }, + "changedTheChatNameTo": "{username} ändrade sitt chatt-namn till: '{chatname}'", + "@changedTheChatNameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "chatname": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username} ändrade chatt-rättigheterna", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username} ändrade visningsnamnet till: '{displayname}'", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} ändrade reglerna för gästaccess", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} ändrade reglerna för gästaccess till: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username} ändrade historikens synlighet", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username} ändrade historikens synlighet till: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username} ändrade anslutningsreglerna", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} ändrade anslutningsreglerna till {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} ändrade sin avatar", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "{username} ändrade rummets alias", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username} ändrade inbjudningslänken", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changePassword": "Ändra lösenord", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "Ändra hemserver", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "Ändra din stil", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "Ändra namn på gruppen", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "Krypteringen har blivit korrupt", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "chat": "Chatt", + "@chat": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Chatt-detaljer", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "Välj ett starkt lösenord", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "close": "Stäng", + "@close": { + "type": "String", + "placeholders": {} + }, + "compareEmojiMatch": "Vänligen jämför uttryckssymbolerna", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "Vänligen jämför siffrorna", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "configureChat": "Konfigurera chatt", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "confirm": "Bekräfta", + "@confirm": { + "type": "String", + "placeholders": {} + }, + "connect": "Anslut", + "@connect": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "Kontakten har blivit inbjuden till gruppen", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "containsDisplayName": "Innehåller visningsnamn", + "@containsDisplayName": { + "type": "String", + "placeholders": {} + }, + "containsUserName": "Innehåller användarnamn", + "@containsUserName": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "Innehållet har rapporterats till server-admins", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "Kopierat till urklipp", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "Kopiera", + "@copy": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "Kunde ej avkoda meddelande: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "countParticipants": "{count} deltagare", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "create": "Skapa", + "@create": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "💬 {username} skapade chatten", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "currentlyActive": "För närvarande aktiv", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "Mörkt", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "dateWithoutYear": "{day}-{month}", + "@dateWithoutYear": { + "type": "String", + "placeholders": { + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "dateWithYear": "{year}-{month}-{day}", + "@dateWithYear": { + "type": "String", + "placeholders": { + "year": { + "type": "String" + }, + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "deactivateAccountWarning": "Detta kommer att avaktivera ditt konto. Det här går inte att ångra! Är du säker?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "Standard behörighetsnivå", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "delete": "Radera", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "Ta bort konto", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "Ta bort meddelande", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "device": "Enhet", + "@device": { + "type": "String", + "placeholders": {} + }, + "deviceId": "Enhets-ID", + "@deviceId": { + "type": "String", + "placeholders": {} + }, + "devices": "Enheter", + "@devices": { + "type": "String", + "placeholders": {} + }, + "directChats": "Direkt chatt", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "Visningsnamn har ändrats", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "Ladda ner fil", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "edit": "Ändra", + "@edit": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "redigera blockerade servrar", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "editDisplayname": "Ändra visningsnamn", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "redigera rumsavatar", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "Dekalen existerar redan!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "Ogiltig dekal-kod!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emotePacks": "Dekalpaket för rummet", + "@emotePacks": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "Emote inställningar", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "emoteShortcode": "Dekal kod", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emoteWarnNeedToPick": "Du måste välja en dekal-kod och en bild!", + "@emoteWarnNeedToPick": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "Tom chatt", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "Aktivera dekal-paket globalt", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "Aktivera kryptering", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "Du kommer inte ha fortsatt möjlighet till att inaktivera krypteringen. Är du säker?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "encrypted": "Krypterad", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "encryption": "Kryptering", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "Kryptering är ej aktiverad", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName} avslutade samtalet", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "enterAnEmailAddress": "Ange en e-postaddress", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "enterYourHomeserver": "Ange din hemserver", + "@enterYourHomeserver": { + "type": "String", + "placeholders": {} + }, + "extremeOffensive": "Extremt stötande", + "@extremeOffensive": { + "type": "String", + "placeholders": {} + }, + "fileName": "Filnamn", + "@fileName": { + "type": "String", + "placeholders": {} + }, + "fluffychat": "FluffyChat", + "@fluffychat": { + "type": "String", + "placeholders": {} + }, + "forward": "Framåt", + "@forward": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "Från att gå med", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "Från inbjudan", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "group": "Grupp", + "@group": { + "type": "String", + "placeholders": {} + }, + "groupIsPublic": "Gruppen är publik", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "groups": "Grupper", + "@groups": { + "type": "String", + "placeholders": {} + }, + "groupWith": "Gruppen med {displayname}", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "guestsAreForbidden": "Gäster är förbjudna", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "Gäster kan ansluta", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{username} har tagit tillbaka inbjudan för {targetName}", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "help": "Hjälp", + "@help": { + "type": "String", + "placeholders": {} + }, + "hideRedactedEvents": "Göm redigerade händelser", + "@hideRedactedEvents": { + "type": "String", + "placeholders": {} + }, + "hideUnknownEvents": "Göm okända händelser", + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "howOffensiveIsThisContent": "Hur stötande är detta innehåll?", + "@howOffensiveIsThisContent": { + "type": "String", + "placeholders": {} + }, + "id": "ID", + "@id": { + "type": "String", + "placeholders": {} + }, + "identity": "Identitet", + "@identity": { + "type": "String", + "placeholders": {} + }, + "ignore": "Ignorera", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "ignoredUsers": "Ignorera användare", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "iHaveClickedOnLink": "Jag har klickat på länken", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "Felaktig lösenordsfras eller åsterställningsnyckel", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "inoffensive": "Oförargligt", + "@inoffensive": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "Bjud in kontakt", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "Bjud in kontakt till {groupName}", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "invited": "Inbjuden", + "@invited": { + "type": "String", + "placeholders": {} + }, + "invitedUser": "📩 {username} bjöd in {targetName}", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "invitedUsersOnly": "Endast inbjudna användare", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "inviteForMe": "Inbjudning till mig", + "@inviteForMe": { + "type": "String", + "placeholders": {} + }, + "inviteText": "{username} bjöd in dig till FluffyChat.\n1. Besök fluffychat.im och installera appen\n2. Registrera dig eller logga in\n3. Öppna inbjudningslänk:\n {link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "isTyping": "skriver…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "👋 {username} anslöt till chatten", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "joinRoom": "Anslut till rum", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "kicked": "👞 {username} sparkade ut {targetName}", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickedAndBanned": "🙅 {username} sparkade och bannade {targetName}", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickFromChat": "Sparka från chatt", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "Senast aktiv: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "leave": "Lämna", + "@leave": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "Lämnade chatten", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "license": "Licens", + "@license": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "Ljust", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "Ladda {count} mer deltagare", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "loadingPleaseWait": "Laddar... Var god vänta.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "loadMore": "Ladda mer…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "login": "Logga in", + "@login": { + "type": "String", + "placeholders": {} + }, + "logInTo": "Logga in till {homeserver}", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "logout": "Logga ut", + "@logout": { + "type": "String", + "placeholders": {} + }, + "memberChanges": "Medlemsändringar", + "@memberChanges": { + "type": "String", + "placeholders": {} + }, + "mention": "Nämn", + "@mention": { + "type": "String", + "placeholders": {} + }, + "messages": "Meddelanden", + "@messages": { + "type": "String", + "placeholders": {} + }, + "moderator": "Moderator", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "muteChat": "Tysta chatt", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "needPantalaimonWarning": "Var medveten om att du behöver Pantalaimon för att använda ändpunktskryptering tillsvidare.", + "@needPantalaimonWarning": { + "type": "String", + "placeholders": {} + }, + "newChat": "Ny chatt", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "💬 Nya meddelanden i FluffyChat", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "Ny verifikationsbegäran!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "next": "Nästa", + "@next": { + "type": "String", + "placeholders": {} + }, + "no": "Nej", + "@no": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "Ingen anslutning till servern", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "Hittade inga dekaler. 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "De ser ut som att du inte har google-tjänster på din telefon. Det är ett bra beslut för din integritet! För att få aviseringar i FluffyChat rekommenderar vi att använda https://microg.org/ eller https://unifiedpush.org/ .", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "none": "Ingen", + "@none": { + "type": "String", + "placeholders": {} + }, + "noPasswordRecoveryDescription": "Du har inte lagt till något sätt för att återställa ditt lösenord än.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "noPermission": "Ingen behörighet", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "Hittade inga rum…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "notifications": "Aviseringar", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "notificationsEnabledForThisAccount": "Aviseringar är påslaget för detta konto", + "@notificationsEnabledForThisAccount": { + "type": "String", + "placeholders": {} + }, + "numUsersTyping": "{count} användare skriver…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "offensive": "Stötande", + "@offensive": { + "type": "String", + "placeholders": {} + }, + "offline": "Offline", + "@offline": { + "type": "String", + "placeholders": {} + }, + "ok": "OK", + "@ok": { + "type": "String", + "placeholders": {} + }, + "online": "Online", + "@online": { + "type": "String", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "Online Nyckel-backup är aktiverad", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "Hoppsan, något gick fel…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "Öppna app för att lästa meddelanden", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "openCamera": "Öppna kamera", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "participant": "Deltagare", + "@participant": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "lösenord eller återställningsnyckel", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "password": "Lösenord", + "@password": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "Glömt lösenord", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "Lösenordet har ändrats", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "passwordRecovery": "Återställ lösenord", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "pickImage": "Välj en bild", + "@pickImage": { + "type": "String", + "placeholders": {} + }, + "pin": "Nåla fast", + "@pin": { + "type": "String", + "placeholders": {} + }, + "play": "Spela {fileName}", + "@play": { + "type": "String", + "placeholders": { + "fileName": { + "type": "String" + } + } + }, + "pleaseChooseAPasscode": "Ange ett lösenord", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "pleaseClickOnLink": "Klicka på länken i e-postmeddelandet för att sedan fortsätta.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "pleaseEnter4Digits": "Ange 4 siffror eller lämna tom för att inaktivera app-lås.", + "@pleaseEnter4Digits": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPassword": "Ange ditt lösenord", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "Ange ditt användarnamn", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "Följ instruktionerna på hemsidan och tryck på nästa.", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "privacy": "Integritet", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "Publika Rum", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "pushRules": "Regler", + "@pushRules": { + "type": "String", + "placeholders": {} + }, + "reason": "Anledning", + "@reason": { + "type": "String", + "placeholders": {} + }, + "recording": "Spelar in", + "@recording": { + "type": "String", + "placeholders": {} + }, + "redactedAnEvent": "{username} redigerade en händelse", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "redactMessage": "Redigera meddelande", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "reject": "Avböj", + "@reject": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "{username} avböjde inbjudan", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "rejoin": "Återanslut", + "@rejoin": { + "type": "String", + "placeholders": {} + }, + "remove": "Ta bort", + "@remove": { + "type": "String", + "placeholders": {} + }, + "removeAllOtherDevices": "Ta bort alla andra enheter", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "removedBy": "Bortagen av {username}", + "@removedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "removeDevice": "Ta bort enhet", + "@removeDevice": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "Ta bort chatt-blockering", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "renderRichContent": "Återge innehåll med rikt meddelande", + "@renderRichContent": { + "type": "String", + "placeholders": {} + }, + "replaceRoomWithNewerVersion": "Ersätt rum med nyare version", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "reply": "Svara", + "@reply": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "Rapportera meddelande", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "requestPermission": "Begär behörighet", + "@requestPermission": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "Rummet har blivit uppgraderat", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "search": "Sök", + "@search": { + "type": "String", + "placeholders": {} + }, + "security": "Säkerhet", + "@security": { + "type": "String", + "placeholders": {} + }, + "seenByUser": "Sedd av {username}", + "@seenByUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "send": "Skicka", + "@send": { + "type": "String", + "placeholders": {} + }, + "sendAMessage": "Skicka ett meddelande", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "sendAudio": "Skicka ljud", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendFile": "Skicka fil", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendImage": "Skicka bild", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendMessages": "Skickade meddelanden", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "sendOriginal": "Skicka orginal", + "@sendOriginal": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "Skicka video", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "sentAFile": "📁 {username} skickade en fil", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAnAudio": "🎤 {username} skickade ett ljudklipp", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAPicture": "🖼️ {username} skickade en bild", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentASticker": "😊 {username} skickade ett klistermärke", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "🎥 {username} skickade en video", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentCallInformations": "{senderName} skickade samtalsinformation", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "setCustomEmotes": "Ställ in anpassade dekaler", + "@setCustomEmotes": { + "type": "String", + "placeholders": {} + }, + "setInvitationLink": "Ställ in inbjudningslänk", + "@setInvitationLink": { + "type": "String", + "placeholders": {} + }, + "setPermissionsLevel": "Ställ in behörighetsnivå", + "@setPermissionsLevel": { + "type": "String", + "placeholders": {} + }, + "setStatus": "Ställ in status", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "settings": "Inställningar", + "@settings": { + "type": "String", + "placeholders": {} + }, + "share": "Dela", + "@share": { + "type": "String", + "placeholders": {} + }, + "sharedTheLocation": "{username} delade sin position", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "skip": "Hoppa över", + "@skip": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "Källkod", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "startedACall": "{senderName} startade ett samtal", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "status": "Status", + "@status": { + "type": "String", + "placeholders": {} + }, + "statusExampleMessage": "Hur mår du i dag?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "submit": "Skicka in", + "@submit": { + "type": "String", + "placeholders": {} + }, + "systemTheme": "System", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "Dom Matchar Inte", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "Dom Matchar", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "title": "FluffyChat", + "@title": { + "description": "Title for the application", + "type": "String", + "placeholders": {} + }, + "toggleFavorite": "Växla favorit", + "@toggleFavorite": { + "type": "String", + "placeholders": {} + }, + "toggleMuted": "Växla tystad", + "@toggleMuted": { + "type": "String", + "placeholders": {} + }, + "toggleUnread": "Markera läst/oläst", + "@toggleUnread": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "För många förfrågningar. Vänligen försök senare!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "tryToSendAgain": "Försök att skicka igen", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "unavailable": "Upptagen", + "@unavailable": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username} avbannade {targetName}", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "unblockDevice": "Avblockera enhet", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "Okänd enhet", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "unknownEncryptionAlgorithm": "Okänd krypteringsalgoritm", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unknownEvent": "Okänd händelse '{type}'", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "unmuteChat": "Slå på ljudet för chatten", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "unpin": "Avnåla", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "unreadChats": "{unreadCount, plural, =1{en oläst chatt} other{{unreadCount} olästa chattar}}", + "@unreadChats": { + "type": "String", + "placeholders": { + "unreadCount": { + "type": "int" + } + } + }, + "userAndOthersAreTyping": "{username} och {count} andra skriver…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "userAndUserAreTyping": "{username} och {username2} skriver…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userIsTyping": "{username} skriver…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userLeftTheChat": "🚪 {username} lämnade chatten", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "username": "Användarnamn", + "@username": { + "type": "String", + "placeholders": {} + }, + "userSentUnknownEvent": "{username} skickade en {type} händelse", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "verify": "Verifiera", + "@verify": { + "type": "String", + "placeholders": {} + }, + "verifyStart": "Starta verifiering", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "Du har lyckats verifiera!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "verifyTitle": "Verifiera andra konton", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "videoCall": "Videosamtal", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "Chatt-historikens synlighet", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "Synlig för alla deltagare", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "Synlig för alla", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "Röstmeddelande", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "Väntar på att deltagaren accepterar begäran…", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "Väntar på att deltagaren accepterar emojien…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "Väntar på att deltagaren accepterar nummer…", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "wallpaper": "Bakgrund:", + "@wallpaper": { + "type": "String", + "placeholders": {} + }, + "warning": "Varning!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "weSentYouAnEmail": "Vi skickade dig ett e-postmeddelande", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "whoCanPerformWhichAction": "Vem kan utföra vilken åtgärd", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "Vilka som är tilllåtna att ansluta till denna grupp", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "Varför vill du rapportera detta?", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "Med dessa addresser kan du återställa ditt lösenord.", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "Skriv ett meddelande…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "yes": "Ja", + "@yes": { + "type": "String", + "placeholders": {} + }, + "you": "Du", + "@you": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "Du deltar inte längre i denna chatt", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "Du har blivit bannad från denna chatt", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "yourPublicKey": "Din publika nyckel", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "commandHint_html": "Skicka HTML-formatted text", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_ban": "Bannlys användaren från detta rum", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "clearArchive": "Rensa arkiv", + "@clearArchive": {}, + "chats": "Chatter", + "@chats": { + "type": "String", + "placeholders": {} + }, + "chatHasBeenAddedToThisSpace": "Chatt har lagts till i detta utrymme", + "@chatHasBeenAddedToThisSpace": {}, + "chatBackup": "Chatt backup", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "changeYourAvatar": "Ändra din avatar", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "cantOpenUri": "Kan inte öppna URL {uri}", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "blocked": "Blockerad", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "badServerLoginTypesException": "Hemma servern stödjer följande inloggnings typer :\n {serverVersions}\nMen denna applikation stödjer enbart:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "autoplayImages": "Automatisk spela upp animerade klistermärken och emoji", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "allChats": "Alla chattar", + "@allChats": { + "type": "String", + "placeholders": {} + }, + "addToSpace": "Lägg till i utrymme", + "@addToSpace": {}, + "addEmail": "Lägg till e-post", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "commandHint_myroomavatar": "Sätt din bild för detta rum (by mxc-uri)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_me": "Beskriv dig själv", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "commandHint_leave": "Lämna detta rum", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_kick": "Ta bort användare från detta rum", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_join": "Gå med i rum", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_invite": "Bjud in användaren till detta rum", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "locationPermissionDeniedNotice": "Plats åtkomst nekad. Var god godkän detta för att kunna dela din plats.", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "locationDisabledNotice": "Platstjänster är inaktiverade. Var god aktivera dom för att kunna dela din plats.", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "goToTheNewRoom": "Gå till det nya rummet", + "@goToTheNewRoom": { + "type": "String", + "placeholders": {} + }, + "fontSize": "Textstorlek", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "everythingReady": "Allt är klart!", + "@everythingReady": { + "type": "String", + "placeholders": {} + }, + "errorObtainingLocation": "Fel vid erhållande av plats: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "editRoomAliases": "Redigera rum alias", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "createNewSpace": "Nytt utrymme", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "Kopiera till urklipp", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "commandMissing": "{command} är inte ett kommando.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "commandInvalid": "Felaktigt kommando", + "@commandInvalid": { + "type": "String" + }, + "commandHint_unban": "Tillåt användare i rummet", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "commandHint_send": "Skicka text", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "commandHint_react": "Skicka svar som reaktion", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "commandHint_plain": "Skicka oformaterad text", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_op": "Sätt användarens kraft nivå ( standard: 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_myroomnick": "Sätt ditt användarnamn för rummet", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "noEncryptionForPublicRooms": "Du kan endast aktivera kryptering när rummet inte längre är publikt tillgängligt.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "noMatrixServer": "{server1} är inte en matrix server, använd {server2} istället?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "obtainingLocation": "Erhåller plats…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "pleaseChoose": "Var god välj", + "@pleaseChoose": { + "type": "String", + "placeholders": {} + }, + "people": "Människor", + "@people": { + "type": "String", + "placeholders": {} + }, + "or": "Eller", + "@or": { + "type": "String", + "placeholders": {} + }, + "openInMaps": "Öppna i karta", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "oopsPushError": "Oj! Tyvärr gick inte aviseringar att slå på.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWait": "Synkroniserar… Var god vänta.", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "spaceName": "Utrymmes namn", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "spaceIsPublic": "Utrymme är publikt", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "showPassword": "Visa lösenord", + "@showPassword": { + "type": "String", + "placeholders": {} + }, + "shareLocation": "Dela plats", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "setAsCanonicalAlias": "Sätt som primärt alias", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "sendSticker": "Skicka klistermärke", + "@sendSticker": { + "type": "String", + "placeholders": {} + }, + "sendAsText": "Skicka som text", + "@sendAsText": { + "type": "String" + }, + "saveFile": "Spara fil", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "Rum version", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "removeYourAvatar": "Ta bort din avatar", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "register": "Registrera", + "@register": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPin": "Ange din pin-kod", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "wipeChatBackup": "Radera din chatt-backup för att skapa en ny återställningsnyckel?", + "@wipeChatBackup": { + "type": "String", + "placeholders": {} + }, + "verified": "Verifierad", + "@verified": { + "type": "String", + "placeholders": {} + }, + "transferFromAnotherDevice": "Överför till annan enhet", + "@transferFromAnotherDevice": { + "type": "String", + "placeholders": {} + }, + "chatBackupDescription": "Din chatt backup är skyddad av en säkerhetsnyckel. Se till att du inte förlorar den.", + "@chatBackupDescription": { + "type": "String", + "placeholders": {} + }, + "commandHint_create": "Skapa en tom grupp-chatt\nAnvänd --no-encryption för att inaktivera kryptering", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "commandHint_discardsession": "Kasta bort sessionen", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "commandHint_dm": "Starta en direkt-chatt\nAnvänd --no-encryption för att inaktivera kryptering", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "homeserver": "Hemserver", + "@homeserver": {}, + "oneClientLoggedOut": "En av dina klienter har loggats ut", + "@oneClientLoggedOut": {}, + "addAccount": "Lägg till konto", + "@addAccount": {}, + "editBundlesForAccount": "Lägg till paket för detta konto", + "@editBundlesForAccount": {}, + "addToBundle": "Utöka paket", + "@addToBundle": {}, + "bundleName": "Paketnamn", + "@bundleName": {}, + "serverRequiresEmail": "Servern behöver validera din e-postadress för registrering.", + "@serverRequiresEmail": {}, + "singlesignon": "Single Sign On", + "@singlesignon": { + "type": "String", + "placeholders": {} + }, + "unverified": "Ej verifierad", + "@unverified": {}, + "messageInfo": "Meddelandeinformation", + "@messageInfo": {}, + "messageType": "Meddelandetyp", + "@messageType": {}, + "time": "Tid", + "@time": {}, + "sender": "Avsändare", + "@sender": {}, + "removeFromSpace": "Ta bort från utrymme", + "@removeFromSpace": {}, + "addToSpaceDescription": "Välj ett utrymme som chatten skall läggas till i.", + "@addToSpaceDescription": {}, + "start": "Starta", + "@start": {}, + "openGallery": "Öppna galleri", + "@openGallery": {}, + "repeatPassword": "Upprepa lösenord", + "@repeatPassword": {}, + "markAsRead": "Markera som läst", + "@markAsRead": {}, + "commandHint_clearcache": "Rensa cache", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "openVideoCamera": "Aktivera kamera för video", + "@openVideoCamera": { + "type": "String", + "placeholders": {} + }, + "link": "Länk", + "@link": {}, + "publish": "Publicera", + "@publish": {}, + "videoWithSize": "Video ({size})", + "@videoWithSize": { + "type": "String", + "placeholders": { + "size": { + "type": "String" + } + } + }, + "reportUser": "Rapportera användare", + "@reportUser": {}, + "openChat": "Öppna Chatt", + "@openChat": {}, + "sendOnEnter": "Skicka med Enter", + "@sendOnEnter": {}, + "scanQrCode": "Skanna QR-kod", + "@scanQrCode": {}, + "yourChatBackupHasBeenSetUp": "Din chatt-backup har konfigurerats.", + "@yourChatBackupHasBeenSetUp": {}, + "removeFromBundle": "Ta bort från paket", + "@removeFromBundle": {}, + "enableMultiAccounts": "(BETA) Aktivera multi-konton på denna enhet", + "@enableMultiAccounts": {}, + "emojis": "Uttryckssymboler", + "@emojis": {}, + "placeCall": "Ring", + "@placeCall": {}, + "voiceCall": "Röstsamtal", + "@voiceCall": {}, + "unsupportedAndroidVersion": "Inget stöd för denna version av Android", + "@unsupportedAndroidVersion": {}, + "videoCallsBetaWarning": "Videosamtal är för närvarande under testning. De kanske inte fungerar som det är tänkt eller på alla plattformar.", + "@videoCallsBetaWarning": {}, + "unsupportedAndroidVersionLong": "Denna funktion kräver en senare version av Android.", + "@unsupportedAndroidVersionLong": {}, + "dismiss": "Avfärda", + "@dismiss": {}, + "reactedWith": "{sender} reagerade med {reaction}", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "pinMessage": "Fäst i rum", + "@pinMessage": {}, + "confirmEventUnpin": "Är du säker på att händelsen inte längre skall vara fastnålad?", + "@confirmEventUnpin": {}, + "experimentalVideoCalls": "Experimentella videosamtal", + "@experimentalVideoCalls": {}, + "switchToAccount": "Byt till konto {number}", + "@switchToAccount": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "nextAccount": "Nästa konto", + "@nextAccount": {}, + "previousAccount": "Föregående konto", + "@previousAccount": {}, + "emailOrUsername": "Användarnamn eller e-postadress", + "@emailOrUsername": {}, + "addWidget": "Lägg till widget", + "@addWidget": {}, + "widgetVideo": "Video", + "@widgetVideo": {}, + "widgetEtherpad": "Anteckning", + "@widgetEtherpad": {}, + "widgetCustom": "Anpassad", + "@widgetCustom": {}, + "widgetName": "Namn", + "@widgetName": {}, + "widgetUrlError": "Detta är inte en giltig URL.", + "@widgetUrlError": {}, + "errorAddingWidget": "Ett fel uppstod när widgeten skulle läggas till.", + "@errorAddingWidget": {}, + "widgetJitsi": "Jitsi-möte", + "@widgetJitsi": {}, + "widgetNameError": "Vänligen ange ett visningsnamn.", + "@widgetNameError": {}, + "storeSecurlyOnThisDevice": "Lagra säkert på denna enhet", + "@storeSecurlyOnThisDevice": {}, + "youJoinedTheChat": "Du gick med i chatten", + "@youJoinedTheChat": {}, + "youAcceptedTheInvitation": "👍 Du accepterade inbjudan", + "@youAcceptedTheInvitation": {}, + "youKicked": "👞 Du sparkade ut {user}", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "hugContent": "{senderName} kramar dig", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "commandHint_markasgroup": "Märk som grupp", + "@commandHint_markasgroup": {}, + "recoveryKeyLost": "Borttappad återställningsnyckel?", + "@recoveryKeyLost": {}, + "indexedDbErrorTitle": "Problem med privat läge", + "@indexedDbErrorTitle": {}, + "youHaveWithdrawnTheInvitationFor": "Du har återkallat inbjudan till {user}", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youUnbannedUser": "Du återkallade förbudet för {user}", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "unlockOldMessages": "Lås upp äldre meddelanden", + "@unlockOldMessages": {}, + "newSpace": "Nytt utrymme", + "@newSpace": {}, + "googlyEyesContent": "{senderName} skickar dig googly ögon", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "dehydrate": "Exportera sessionen och rensa enheten", + "@dehydrate": {}, + "dehydrateWarning": "Denna åtgärd kan inte ångras. Försäkra dig om att backupen är i säkert förvar.", + "@dehydrateWarning": {}, + "dehydrateTor": "TOR-användare: Exportera session", + "@dehydrateTor": {}, + "hydrateTor": "TOR-användare: Importera session från tidigare export", + "@hydrateTor": {}, + "hydrateTorLong": "Exporterade du sessionen när du senast använde TOR? Importera den enkelt och fortsätt chatta.", + "@hydrateTorLong": {}, + "recoveryKey": "Återställningsnyckel", + "@recoveryKey": {}, + "separateChatTypes": "Separata direktchattar och grupper", + "@separateChatTypes": { + "type": "String", + "placeholders": {} + }, + "startFirstChat": "Starta din första chatt", + "@startFirstChat": {}, + "pleaseEnterRecoveryKeyDescription": "Ange din återställningsnyckel från en tidigare session för att låsa upp äldre meddelanden. Din återställningsnyckel är INTE ditt lösenord.", + "@pleaseEnterRecoveryKeyDescription": {}, + "encryptThisChat": "Kryptera denna chatt", + "@encryptThisChat": {}, + "dehydrateTorLong": "TOR-användare rekommenderas att exportera sessionen innan fönstret stängs.", + "@dehydrateTorLong": {}, + "noBackupWarning": "Varning! Om du inte aktiverar säkerhetskopiering av chattar så tappar du åtkomst till krypterade meddelanden. Det är rekommenderat att du aktiverar säkerhetskopiering innan du loggar ut.", + "@noBackupWarning": {}, + "noOtherDevicesFound": "Inga andra enheter hittades", + "@noOtherDevicesFound": {}, + "disableEncryptionWarning": "Av säkerhetsskäl kan du inte stänga av kryptering i en chatt där det tidigare aktiverats.", + "@disableEncryptionWarning": {}, + "sorryThatsNotPossible": "Det där är inte möjligt", + "@sorryThatsNotPossible": {}, + "confirmMatrixId": "Bekräfta ditt Matrix-ID för att radera ditt konto.", + "@confirmMatrixId": {}, + "supposedMxid": "Detta bör vara {mxid}", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "pleaseEnterRecoveryKey": "Ange din återställningsnyckel:", + "@pleaseEnterRecoveryKey": {}, + "commandHint_markasdm": "Märk som rum för direktmeddelanden för det givante Matrix ID", + "@commandHint_markasdm": {}, + "user": "Användare", + "@user": {}, + "indexedDbErrorLong": "Meddelandelagring är tyvärr inte aktiverat i privat läge som standard.\nGå till\n - about:config\n - sätt dom.indexedDB.privateBrowsing.enabled till true\nAnnars går det inte att använda FluffyChat.", + "@indexedDbErrorLong": {}, + "storeInSecureStorageDescription": "Lagra återställningsnyckeln på säker plats på denna enhet.", + "@storeInSecureStorageDescription": {}, + "storeInAppleKeyChain": "Lagra i Apples nyckelkedja (KeyChain)", + "@storeInAppleKeyChain": {}, + "foregroundServiceRunning": "Denna avisering visas när förgrundstjänsten körs.", + "@foregroundServiceRunning": {}, + "custom": "Anpassad", + "@custom": {}, + "countFiles": "{count} filer", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "screenSharingTitle": "skärmdelning", + "@screenSharingTitle": {}, + "noKeyForThisMessage": "Detta kan hända om meddelandet skickades innan du loggade in på ditt konto i den här enheten.\n\nDet kan också vara så att avsändaren har blockerat din enhet eller att något gick fel med internetanslutningen.\n\nKan du läsa meddelandet i en annan session? I sådana fall kan du överföra meddelandet från den sessionen! Gå till Inställningar > Enhet och säkerställ att dina enheter har verifierat varandra. När du öppnar rummet nästa gång och båda sessionerna är i förgrunden, så kommer nycklarna att överföras automatiskt.\n\nVill du inte förlora nycklarna vid utloggning eller när du byter enhet? Säkerställ att du har aktiverat säkerhetskopiering för chatten i inställningarna.", + "@noKeyForThisMessage": {}, + "fileIsTooBigForServer": "Servern informerar om att filen är för stor för att skickas.", + "@fileIsTooBigForServer": {}, + "deviceKeys": "Enhetsnycklar:", + "@deviceKeys": {}, + "enterSpace": "Gå till utrymme", + "@enterSpace": {}, + "commandHint_googly": "Skicka några googly ögon", + "@commandHint_googly": {}, + "commandHint_cuddle": "Skicka en omfamning", + "@commandHint_cuddle": {}, + "commandHint_hug": "Skicka en kram", + "@commandHint_hug": {}, + "users": "Användare", + "@users": {}, + "cuddleContent": "{senderName} omfamnar dig", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "hydrate": "Återställ från säkerhetskopia", + "@hydrate": {}, + "screenSharingDetail": "Du delar din skärm i FluffyChat", + "@screenSharingDetail": {}, + "youRejectedTheInvitation": "Du avvisade inbjudan", + "@youRejectedTheInvitation": {}, + "youBannedUser": "Du förbjöd {user}", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedBy": "📩 Du har blivit inbjuden av {user}", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedUser": "📩 Du bjöd in {user}", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKickedAndBanned": "🙅 Du sparkade ut och förbjöd {user}", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "saveKeyManuallyDescription": "Spara nyckeln manuellt genom att aktivera dela-funktionen eller urklippshanteraren på enheten.", + "@saveKeyManuallyDescription": {}, + "storeInAndroidKeystore": "Lagra i Androids nyckellagring (KeyStore)", + "@storeInAndroidKeystore": {}, + "callingPermissions": "Samtalsbehörighet", + "@callingPermissions": {}, + "callingAccount": "Samtalskonto", + "@callingAccount": {}, + "callingAccountDetails": "Tillåt FluffyChat att använda Androids ring-app.", + "@callingAccountDetails": {}, + "appearOnTop": "Visa ovanpå", + "@appearOnTop": {}, + "appearOnTopDetails": "Tillåt att appen visas ovanpå (behövs inte om du redan har FluffyChat konfigurerat som ett samtalskonto)", + "@appearOnTopDetails": {}, + "otherCallingPermissions": "Mikrofon, kamera och andra behörigheter för FluffyChat", + "@otherCallingPermissions": {}, + "whyIsThisMessageEncrypted": "Varför kan inte detta meddelande läsas?", + "@whyIsThisMessageEncrypted": {}, + "newGroup": "Ny grupp", + "@newGroup": {}, + "enterRoom": "Gå till rummet", + "@enterRoom": {}, + "allSpaces": "Alla utrymmen", + "@allSpaces": {}, + "numChats": "{number} chattar", + "@numChats": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "hideUnimportantStateEvents": "Göm oviktiga tillståndshändelser", + "@hideUnimportantStateEvents": {}, + "doNotShowAgain": "Visa inte igen", + "@doNotShowAgain": {}, + "wasDirectChatDisplayName": "Tom chatt (var {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "newSpaceDescription": "Utrymmen möjliggör konsolidering av chattar och att bygga privata eller offentliga gemenskaper.", + "@newSpaceDescription": {}, + "reopenChat": "Återöppna chatt", + "@reopenChat": {}, + "jumpToLastReadMessage": "Hoppa till det senast lästa meddelandet", + "@jumpToLastReadMessage": {}, + "readUpToHere": "Läs upp till hit", + "@readUpToHere": {}, + "fileHasBeenSavedAt": "Filen har sparats i {path}", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "allRooms": "Alla gruppchattar", + "@allRooms": { + "type": "String", + "placeholders": {} + }, + "reportErrorDescription": "😭 Åh nej. Något gick fel. Om du vill ian du rapportera denna bugg till utvecklarna.", + "@reportErrorDescription": {}, + "setColorTheme": "Välj färgtema:", + "@setColorTheme": {}, + "banUserDescription": "Användaren kommer bannlysas från chatten och kommer inte kunna gå med i chatten igen tills bannlysningen avslutas.", + "@banUserDescription": {}, + "removeDevicesDescription": "Du kommer att bli utloggad från den här enheten och kommer inte längre kunna få meddelanden.", + "@removeDevicesDescription": {}, + "tryAgain": "Försök igen", + "@tryAgain": {}, + "unbanUserDescription": "Användaren kommer kunna gå med i chatten igen om den försöker.", + "@unbanUserDescription": {}, + "messagesStyle": "Meddelanden:", + "@messagesStyle": {}, + "chatDescription": "Chattbeskrivning", + "@chatDescription": {}, + "pushNotificationsNotAvailable": "Aviseringar är inte tillgängligt", + "@pushNotificationsNotAvailable": {}, + "invalidServerName": "Ogiltigt servernamn", + "@invalidServerName": {}, + "chatPermissions": "Chatt-behörigheter", + "@chatPermissions": {}, + "signInWithPassword": "Logga in med lösenord", + "@signInWithPassword": {}, + "makeAdminDescription": "När du gör denna användare till administratör kommer du inte kunna ångra det eftersom de kommer ha samma behörigheter som du.", + "@makeAdminDescription": {}, + "setChatDescription": "Ändra chattens beskrivning", + "@setChatDescription": {}, + "importFromZipFile": "Importera från .zip-fil", + "@importFromZipFile": {}, + "redactedBy": "Borttaget av {username}", + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "signInWith": "Logga in med {provider}", + "@signInWith": { + "type": "String", + "placeholders": { + "provider": { + "type": "String" + } + } + }, + "optionalRedactReason": "(Frivilligt) Anledning till att ta bort det här meddelandet…", + "@optionalRedactReason": {}, + "archiveRoomDescription": "Den här chatten kommer flyttas till arkivet. Andra användare kommer kunna se att du har lämnat chatten.", + "@archiveRoomDescription": {}, + "exportEmotePack": "Exportera Emote-pack som .zip", + "@exportEmotePack": {}, + "inviteContactToGroupQuestion": "Vill du bjuda in {contact} till chatten ”{groupName}”?", + "@inviteContactToGroupQuestion": {}, + "redactedByBecause": "Borttaget av {username} på grund av: ”{reason}”", + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "redactMessageDescription": "Meddelandet kommer tas bort för alla medlemmar i denna konversation. Detta kan inte ångras.", + "@redactMessageDescription": {}, + "invalidInput": "Ogiltig input!", + "@invalidInput": {}, + "report": "rapportera", + "@report": {}, + "addChatDescription": "Lägg till en chattbeskrivning…", + "@addChatDescription": {}, + "hasKnocked": "{user} har knackat", + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "openLinkInBrowser": "Öppna länk i webbläsare", + "@openLinkInBrowser": {}, + "directChat": "Direktchatt", + "@directChat": {}, + "wrongPinEntered": "Fel pin-kod inslagen! Försök igen om {seconds} sekunder…", + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "sendTypingNotifications": "Skicka skrivnotifikationer", + "@sendTypingNotifications": {}, + "inviteGroupChat": "📨 Bjud in gruppchatt", + "@inviteGroupChat": {}, + "invitePrivateChat": "📨 Bjud in privat chatt", + "@invitePrivateChat": {}, + "importEmojis": "Importera emojier", + "@importEmojis": {}, + "noChatDescriptionYet": "Ingen chatt-beskrivning än.", + "@noChatDescriptionYet": {}, + "learnMore": "Lär dig mer", + "@learnMore": {}, + "notAnImage": "Inte en bildfil.", + "@notAnImage": {}, + "chatDescriptionHasBeenChanged": "Chattbeskrivningen ändrades", + "@chatDescriptionHasBeenChanged": {}, + "roomUpgradeDescription": "Chatten kommer då att återskapas med den nya rumversionen. Alla medlemmar kommer bli påminda om att de måste byta till den nya chatten. Du kan läsa mer om rumversioner på https://spec.matrix.org/latest/rooms/", + "@roomUpgradeDescription": {}, + "pleaseEnterANumber": "Vänligen ange ett nummer större än 0", + "@pleaseEnterANumber": {}, + "profileNotFound": "Användaren kunde onte hittas på servern. Kanske är det ett anslutningsproblem eller så finns inte användaren.", + "@profileNotFound": {}, + "jump": "Hoppa", + "@jump": {}, + "shareInviteLink": "Dela inbjudningslänk", + "@shareInviteLink": {}, + "emoteKeyboardNoRecents": "Nyligen använda emotes kommer dyka upp här…", + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "setTheme": "Välj tema:", + "@setTheme": {}, + "replace": "Ersätt", + "@replace": {}, + "pleaseTryAgainLaterOrChooseDifferentServer": "Vänligen försök igen eller välj en annan server.", + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "createGroup": "Skapa grupp", + "@createGroup": {}, + "kickUserDescription": "Användaren sparkas ut ur chatten men bannlyses inte. I offentliga chattar kan användaren gå med igen när som helst.", + "@kickUserDescription": {}, + "importNow": "Importera nu", + "@importNow": {}, + "invite": "Bjud in", + "@invite": {}, + "databaseBuildErrorBody": "Kan inte bygga SQlite-databasen. Appen försöker använda den gamla databasen för nu. Vänligen rapportera problemet till utvecklarna här: {url}. Felmeddelandet är: {error}", + "@databaseBuildErrorBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "blockListDescription": "Du kan blockera användare som stör dig. Du kommer inte få några meddelanden eller rum-inbjudningar från användarna på din personliga blocklista.", + "@blockListDescription": {}, + "createGroupAndInviteUsers": "Skapa en grupp och bjud in användare", + "@createGroupAndInviteUsers": {}, + "initAppError": "Ett problem skedde när appen initierades", + "@initAppError": {}, + "thisDevice": "Denna enhet:", + "@thisDevice": {}, + "startConversation": "Starta konversation", + "@startConversation": {}, + "publicSpaces": "Offentliga utrymmen", + "@publicSpaces": {}, + "blockedUsers": "Blockerade användare", + "@blockedUsers": {}, + "passwordIsWrong": "Det angivna lösenordet är fel", + "@passwordIsWrong": {}, + "pleaseEnterYourCurrentPassword": "Vänligen skriv ditt nuvarande lösenord", + "@pleaseEnterYourCurrentPassword": {}, + "groupCanBeFoundViaSearch": "Gruppen kan hittas genom sökning", + "@groupCanBeFoundViaSearch": {}, + "publicLink": "Offentlig länk", + "@publicLink": {}, + "noUsersFoundWithQuery": "Tyvärr kunde ingen användare hittas med ”{query}”. Vänligen kontrollera om du gjort ett stavfel.", + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "block": "blockera", + "@block": {}, + "nothingFound": "Inget hittades…", + "@nothingFound": {}, + "yourGlobalUserIdIs": "Ditt globala användar-ID är: ", + "@yourGlobalUserIdIs": {}, + "decline": "Neka", + "@decline": {}, + "newPassword": "Nytt lösenord", + "@newPassword": {}, + "passwordsDoNotMatch": "Lösenorden passar inte", + "@passwordsDoNotMatch": {}, + "commandHint_sendraw": "Skicka rå json", + "@commandHint_sendraw": {}, + "wrongRecoveryKey": "Tyvärr verkar detta inte vara den korrekta återställningsnyckeln.", + "@wrongRecoveryKey": {}, + "subspace": "Underutrymme", + "@subspace": {}, + "select": "Ange val", + "@select": {}, + "sessionLostBody": "Din session är förlorad. Vänligen rapportera detta fel till utvecklarna här: {url}. Felmeddelandet är: {error}", + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "pleaseChooseAStrongPassword": "Vänligen välj ett starkt lösenord", + "@pleaseChooseAStrongPassword": {}, + "blockUsername": "Ignorera användarnamn", + "@blockUsername": {}, + "addChatOrSubSpace": "Lägg till chatt eller underutrymme", + "@addChatOrSubSpace": {}, + "groupName": "Gruppnamn", + "@groupName": {}, + "leaveEmptyToClearStatus": "Lämna tom för att ta bort din status.", + "@leaveEmptyToClearStatus": {}, + "joinSpace": "Gå med i utrymme", + "@joinSpace": {}, + "searchForUsers": "Sök efter @användare…", + "@searchForUsers": {}, + "restoreSessionBody": "Appen försöker nu få tillbaks din session från backupen. Vänligen rapportera detta problem till utvecklarna här: {url}. Felmeddelandet är: {error}", + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "databaseMigrationTitle": "Databasen är optimerad", + "@databaseMigrationTitle": {}, + "searchChatsRooms": "Sök efter #chattar, @användare…", + "@searchChatsRooms": {}, + "databaseMigrationBody": "Var vänlig vänta. Detta kan ta en stund.", + "@databaseMigrationBody": {}, + "youInvitedToBy": "📩 Du har blivit inbjuden via länk till:\n{alias}", + "@youInvitedToBy": { + "placeholders": { + "alias": { + "type": "String" + } + } + }, + "sendTypingNotificationsDescription": "Andra deltagare i en diskussion kan se när du skriver.", + "@sendTypingNotificationsDescription": {}, + "formattedMessagesDescription": "Visa formaterat meddelandeinnehåll som fet stil med markdown.", + "@formattedMessagesDescription": {}, + "verifyOtherUser": "🔐 Verifiera användaren", + "@verifyOtherUser": {}, + "formattedMessages": "Formaterade meddelanden", + "@formattedMessages": {}, + "canceledKeyVerification": "{sender} avbröt nyckelverifieringen", + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "completedKeyVerification": "{sender} fullbordade nyckelverifieringen", + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "requestedKeyVerification": "{sender} begärde nyckelverifiering", + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "transparent": "Transparent", + "@transparent": {}, + "startedKeyVerification": "{sender} påbörjade nyckelverifiering", + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "presenceStyle": "Närvaro:", + "@presenceStyle": { + "type": "String", + "placeholders": {} + }, + "presencesToggle": "Visa statusmeddelanden från andra användare", + "@presencesToggle": { + "type": "String", + "placeholders": {} + }, + "hidePresences": "Dölj statuslista?", + "@hidePresences": {}, + "sendReadReceipts": "Skicka läskvitton", + "@sendReadReceipts": {}, + "verifyOtherDevice": "🔐 Verifiera enhet", + "@verifyOtherDevice": {}, + "acceptedKeyVerification": "{sender} accepterade nyckelverifieringen", + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "incomingMessages": "Inkommande meddelanden", + "@incomingMessages": {}, + "forwardMessageTo": "Vidarebefordra meddelandet till {roomName}?", + "@forwardMessageTo": { + "type": "String", + "placeholders": { + "roomName": { + "type": "String" + } + } + }, + "verifyOtherUserDescription": "Om du verifierar en användare så kan du vara säker på vem du verkligen skriver till. 💪\n\nNär du påbörjar en verifiering så ser du och den andra användaren en popup-ruta i appen. I den rutan ser du ett antal tecken som du jämför med vad den andra användaren ser.\n\nDet bästa sättet att göra detta är att träffas fysiskt, eller genom att starta ett videosamtal. 👭", + "@verifyOtherUserDescription": {}, + "verifyOtherDeviceDescription": "När du verifierar en enhet så kan era enheter utväxla nycklar, vilket förbättrar säkerheten. 💪 När du påbörjar en verifiering så ser du en popup-ruta på båda enheterna. I den rutan ser du ett antal tecken som du jämför med det som visas på den andra enheten. Det är bäst att ha båda enheterna till hands innan du påbörjar verifieringen. 🤳", + "@verifyOtherDeviceDescription": {}, + "isReadyForKeyVerification": "{sender} är redo för nyckelverifiering", + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "sendReadReceiptsDescription": "Andra deltagare i en diskussion kan se när du läst ett meddelande.", + "@sendReadReceiptsDescription": {}, + "stickers": "Klistermärken", + "@stickers": {}, + "discover": "Upptäck", + "@discover": {} +} diff --git a/assets/l10n/intl_ta.arb b/assets/l10n/intl_ta.arb new file mode 100644 index 0000000..13033ac --- /dev/null +++ b/assets/l10n/intl_ta.arb @@ -0,0 +1,3172 @@ +{ + "@@last_modified": "2021-08-14 12:41:09.826673", + "acceptedTheInvitation": "👍 {username} அழைப்பை ஏற்றுக்கொண்டது", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "accept": "ஏற்றுக்கொள்", + "@accept": { + "type": "String", + "placeholders": {} + }, + "about": "பற்றி", + "@about": { + "type": "String", + "placeholders": {} + }, + "sendCanceled": "அனுப்பப்பட்டது ரத்து செய்யப்பட்டது", + "@sendCanceled": {}, + "chatDetails": "அரட்டை விவரங்கள்", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "globalChatId": "உலகளாவிய அரட்டை ஐடி", + "@globalChatId": {}, + "accessAndVisibility": "அணுகல் மற்றும் தெரிவுநிலை", + "@accessAndVisibility": {}, + "enterYourHomeserver": "உங்கள் ஓம்சர்வரை உள்ளிடவும்", + "@enterYourHomeserver": { + "type": "String", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "நிகழ்நிலை விசை காப்புப்பிரதி இயக்கப்பட்டது", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "recoveryKey": "மீட்பு விசை", + "@recoveryKey": {}, + "setStatus": "நிலையை அமைக்கவும்", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "title": "பஞ்சுபோன்ற", + "@title": { + "description": "Title for the application", + "type": "String", + "placeholders": {} + }, + "verify": "சரிபார்க்கவும்", + "@verify": { + "type": "String", + "placeholders": {} + }, + "verifyStart": "சரிபார்ப்பைத் தொடங்கவும்", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "unsupportedAndroidVersion": "ஆதரிக்கப்படாத ஆண்ட்ராய்டு பதிப்பு", + "@unsupportedAndroidVersion": {}, + "invitedBy": "{user} அழைத்தார்", + "@invitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "startConversation": "உரையாடலைத் தொடங்குங்கள்", + "@startConversation": {}, + "commandHint_sendraw": "மூல சாதொபொகு ஐ அனுப்புங்கள்", + "@commandHint_sendraw": {}, + "passwordIsWrong": "நீங்கள் உள்ளிட்ட கடவுச்சொல் தவறு", + "@passwordIsWrong": {}, + "publicLink": "பொது இணைப்பு", + "@publicLink": {}, + "forwardMessageTo": "செய்தியை {roomName}க்கு அனுப்பவா?", + "@forwardMessageTo": { + "type": "String", + "placeholders": { + "roomName": { + "type": "String" + } + } + }, + "completedKeyVerification": "{sender} நிறைவு செய்யப்பட்ட விசை சரிபார்ப்பு", + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "incomingMessages": "உள்வரும் செய்திகள்", + "@incomingMessages": {}, + "password": "கடவுச்சொல்", + "@password": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "வெற்று அரட்டை", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "encrypted": "குறியாக்கப்பட்டது", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "reject": "நிராகரிக்கவும்", + "@reject": { + "type": "String", + "placeholders": {} + }, + "importNow": "இப்போது இறக்குமதி செய்யுங்கள்", + "@importNow": {}, + "changedTheChatAvatar": "{username} அரட்டை அவதாரத்தை மாற்றியது", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "widgetName": "பெயர்", + "@widgetName": {}, + "chooseAStrongPassword": "வலுவான கடவுச்சொல்லைத் தேர்வுசெய்க", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "commandHint_me": "உங்களை விவரிக்கவும்", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "commandHint_unban": "இந்த அறையிலிருந்து கொடுக்கப்பட்ட பயனரைத் தடுக்கிறது", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "countParticipants": "{count} பங்கேற்பாளர்கள்", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "editDisplayname": "காட்சி பெயர் திருத்து", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "fileName": "கோப்பு பெயர்", + "@fileName": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{targetName} க்கான அழைப்பை {username} திரும்பப் பெற்றுள்ளார்", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "identity": "முற்றொருமை", + "@identity": { + "type": "String", + "placeholders": {} + }, + "removedBy": "{username} ஆல் அகற்றப்பட்டது", + "@removedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "requestPermission": "இசைவு கோருங்கள்", + "@requestPermission": { + "type": "String", + "placeholders": {} + }, + "user": "பயனர்", + "@user": {}, + "optionalRedactReason": "(விரும்பினால்) இந்த செய்தியை மாற்றியமைப்பதற்கான காரணம் ...", + "@optionalRedactReason": {}, + "device": "சாதனம்", + "@device": { + "type": "String", + "placeholders": {} + }, + "license": "உரிமம்", + "@license": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "குழுவிற்கு தொடர்பு அழைக்கப்பட்டுள்ளது", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "கடவுச்சொல் அல்லது மீட்பு விசை", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "widgetNameError": "காட்சி பெயரை வழங்கவும்.", + "@widgetNameError": {}, + "select": "தேர்ந்தெடு", + "@select": {}, + "compareEmojiMatch": "தயவுசெய்து ஈமோசிகளை ஒப்பிடுக", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "dateWithoutYear": "{month}-{day}", + "@dateWithoutYear": { + "type": "String", + "placeholders": { + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "fromTheInvitation": "அழைப்பிலிருந்து", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "help": "உதவி", + "@help": { + "type": "String", + "placeholders": {} + }, + "invited": "அழைக்கப்பட்டார்", + "@invited": { + "type": "String", + "placeholders": {} + }, + "invitedUsersOnly": "பயனர்களை மட்டுமே அழைத்தது", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "kickedAndBanned": "🙅 {username} உதைத்து {targetName} ஐத் தடை செய்தார்", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "mention": "குறிப்பு", + "@mention": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "புதிய சரிபார்ப்பு கோரிக்கை!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "shareInviteLink": "இணைப்பைப் பகிரவும்", + "@shareInviteLink": {}, + "pickImage": "ஒரு படத்தைத் தேர்ந்தெடுக்கவும்", + "@pickImage": { + "type": "String", + "placeholders": {} + }, + "pin": "முள்", + "@pin": { + "type": "String", + "placeholders": {} + }, + "unavailable": "கிடைக்கவில்லை", + "@unavailable": { + "type": "String", + "placeholders": {} + }, + "voiceCall": "குரல் அழைப்பு", + "@voiceCall": {}, + "youKickedAndBanned": "🙅 நீங்கள் உதைத்து தடைசெய்துள்ளீர்கள் {user}", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKicked": "👞 {user}ஐ உதைத்துள்ளீர்கள்", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "storeInAppleKeyChain": "ஆப்பிள் கீச்சினில் சேமிக்கவும்", + "@storeInAppleKeyChain": {}, + "searchForUsers": "@Users ஐத் தேடுங்கள் ...", + "@searchForUsers": {}, + "pleaseEnterYourCurrentPassword": "உங்கள் தற்போதைய கடவுச்சொல்லை உள்ளிடவும்", + "@pleaseEnterYourCurrentPassword": {}, + "anyoneCanJoin": "யார் வேண்டுமானாலும் சேரலாம்", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "archive": "காப்பகம்", + "@archive": { + "type": "String", + "placeholders": {} + }, + "banFromChat": "அரட்டையிலிருந்து தடை", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "cancel": "ரத்துசெய்", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "edit": "தொகு", + "@edit": { + "type": "String", + "placeholders": {} + }, + "iHaveClickedOnLink": "நான் இணைப்பைக் சொடுக்கு செய்துள்ளேன்", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "pleaseClickOnLink": "மின்னஞ்சலில் உள்ள இணைப்பைக் சொடுக்கு செய்து தொடரவும்.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "உங்கள் பாணியை மாற்றவும்", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "fontSize": "எழுத்துரு அளவு", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "cantOpenUri": "யூரி {uri} வேலை ஐ திறக்க முடியாது", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "repeatPassword": "கடவுச்சொல்லை மீண்டும் செய்யவும்", + "@repeatPassword": {}, + "youRejectedTheInvitation": "நீங்கள் அழைப்பை நிராகரித்தீர்கள்", + "@youRejectedTheInvitation": {}, + "confirmMatrixId": "உங்கள் கணக்கை நீக்க உங்கள் மேட்ரிக்ச் ஐடியை உறுதிப்படுத்தவும்.", + "@confirmMatrixId": {}, + "supposedMxid": "இது {mxid} be ஆக இருக்க வேண்டும்", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "commandHint_googly": "சில கூகிள் கண்களை அனுப்பவும்", + "@commandHint_googly": {}, + "commandHint_cuddle": "ஒரு கசப்பு அனுப்பவும்", + "@commandHint_cuddle": {}, + "startFirstChat": "உங்கள் முதல் அரட்டையைத் தொடங்கவும்", + "@startFirstChat": {}, + "importEmojis": "ஈமோசிகளை இறக்குமதி செய்யுங்கள்", + "@importEmojis": {}, + "exportEmotePack": "எமோட் பேக் .zip என ஏற்றுமதி செய்யுங்கள்", + "@exportEmotePack": {}, + "replace": "மாற்றவும்", + "@replace": {}, + "tryAgain": "மீண்டும் முயற்சிக்கவும்", + "@tryAgain": {}, + "pushNotificationsNotAvailable": "புச் அறிவிப்புகள் கிடைக்கவில்லை", + "@pushNotificationsNotAvailable": {}, + "blockUsername": "பயனர்பெயரை புறக்கணிக்கவும்", + "@blockUsername": {}, + "start": "தொடங்கு", + "@start": {}, + "chatBackup": "அரட்டை காப்புப்பிரதி", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "send": "அனுப்பு", + "@send": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "அவர்கள் பொருந்தவில்லை", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "sendMessages": "செய்திகளை அனுப்பவும்", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "fluffychat": "பஞ்சுபோன்ற", + "@fluffychat": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "கோப்பைப் பதிவிறக்கவும்", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "createNewSpace": "புதிய இடம்", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWait": "ஒத்திசைத்தல்… தயவுசெய்து காத்திருங்கள்.", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "unknownEncryptionAlgorithm": "அறியப்படாத குறியாக்க வழிமுறை", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unverified": "சரிபார்க்கப்படாதது", + "@unverified": {}, + "unmuteChat": "மாறுதல் அரட்டை", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "unreadChats": "{unreadCount, plural, =1{1 unread chat} other{{unreadCount} unread chats}}", + "@unreadChats": { + "type": "String", + "placeholders": { + "unreadCount": { + "type": "int" + } + } + }, + "verifyTitle": "பிற கணக்கை சரிபார்க்கிறது", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "videoCall": "வீடியோ அழைப்பு", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "பங்கேற்பாளர்கள் அனைவருக்கும் தெரியும்", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "குரல் செய்தி", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "reopenChat": "அரட்டையை மீண்டும் திறக்கவும்", + "@reopenChat": {}, + "formattedMessages": "வடிவமைக்கப்பட்ட செய்திகள்", + "@formattedMessages": {}, + "darkTheme": "இருண்ட", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "guestsAreForbidden": "விருந்தினர்கள் தடைசெய்யப்பட்டுள்ளனர்", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "விருந்தினர்கள் சேரலாம்", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "widgetUrlError": "இது சரியான முகவரி அல்ல.", + "@widgetUrlError": {}, + "commandHint_invite": "கொடுக்கப்பட்ட பயனரை இந்த அறைக்கு அழைக்கவும்", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "commandHint_op": "கொடுக்கப்பட்ட பயனரின் ஆற்றல் மட்டத்தை அமைக்கவும் (இயல்புநிலை: 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_plain": "வடிவமைக்கப்படாத உரையை அனுப்பவும்", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandMissing": "{command} என்பது கட்டளை அல்ல.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "inviteForMe": "எனக்கு அழைக்கவும்", + "@inviteForMe": { + "type": "String", + "placeholders": {} + }, + "moderator": "மதிப்பீட்டாளர்", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "shareLocation": "இருப்பிடத்தைப் பகிரவும்", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "addEmail": "மின்னஞ்சல் சேர்க்கவும்", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "all": "அனைத்தும்", + "@all": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "ஒளி", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "allChats": "அனைத்து அரட்டைகளும்", + "@allChats": { + "type": "String", + "placeholders": {} + }, + "sendOnEnter": "Enter ஐ அனுப்பவும்", + "@sendOnEnter": {}, + "pleaseEnterRecoveryKey": "உங்கள் மீட்பு விசையை உள்ளிடவும்:", + "@pleaseEnterRecoveryKey": {}, + "dehydrate": "ஏற்றுமதி அமர்வு மற்றும் சாதனத்தை துடைக்கவும்", + "@dehydrate": {}, + "ok": "சரி", + "@ok": { + "type": "String", + "placeholders": {} + }, + "configureChat": "அரட்டையை உள்ளமைக்கவும்", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "deviceId": "சாதன ஐடி", + "@deviceId": { + "type": "String", + "placeholders": {} + }, + "isTyping": "தட்டச்சு செய்கிறது…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "👋 {username} அரட்டையில் சேர்ந்தார்", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "noConnectionToTheServer": "சேவையகத்துடன் எந்த தொடர்பும் இல்லை", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "உணர்ச்சிகள் எதுவும் காணப்படவில்லை. .", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "notifications": "அறிவிப்புகள்", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "oopsPushError": "அச்சச்சோ! துரதிர்ச்டவசமாக, புச் அறிவிப்புகளை அமைக்கும் போது பிழை ஏற்பட்டது.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "அச்சச்சோ, ஏதோ தவறு நடந்தது…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "bundleName": "மூட்டை பெயர்", + "@bundleName": {}, + "enableMultiAccounts": "(பீட்டா) இந்த சாதனத்தில் பல கணக்குகளை இயக்கவும்", + "@enableMultiAccounts": {}, + "remove": "அகற்று", + "@remove": { + "type": "String", + "placeholders": {} + }, + "recoveryKeyLost": "மீட்பு விசை இழந்ததா?", + "@recoveryKeyLost": {}, + "sendAMessage": "ஒரு செய்தியை அனுப்பவும்", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "spaceIsPublic": "இடம் பொது", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "transferFromAnotherDevice": "மற்றொரு சாதனத்திலிருந்து மாற்றவும்", + "@transferFromAnotherDevice": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "அனைவருக்கும் தெரியும்", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "weSentYouAnEmail": "நாங்கள் உங்களுக்கு ஒரு மின்னஞ்சல் அனுப்பினோம்", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "enterRoom": "அறையை உள்ளிடவும்", + "@enterRoom": {}, + "report": "அறிக்கை", + "@report": {}, + "verifyOtherDevice": "Sevice பிற சாதனத்தை சரிபார்க்கவும்", + "@verifyOtherDevice": {}, + "startedACall": "{senderName} அழைப்பைத் தொடங்கினார்", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "toggleFavorite": "பிடித்ததை மாற்றவும்", + "@toggleFavorite": { + "type": "String", + "placeholders": {} + }, + "userSentUnknownEvent": "{username} ஒரு {type} நிகழ்வை அனுப்பியது", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "verified": "சரிபார்க்கப்பட்டது", + "@verified": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "நீங்கள் வெற்றிகரமாக சரிபார்த்தீர்கள்!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "பங்குதாரர் எண்களை ஏற்றுக்கொள்வதற்காக காத்திருக்கிறார்…", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "warning": "எச்சரிக்கை!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "pinMessage": "அறைக்கு முள்", + "@pinMessage": {}, + "addWidget": "விட்செட்டைச் சேர்க்கவும்", + "@addWidget": {}, + "widgetEtherpad": "உரை குறிப்பு", + "@widgetEtherpad": {}, + "widgetCustom": "தனிப்பயன்", + "@widgetCustom": {}, + "unlockOldMessages": "பழைய செய்திகளைத் திறக்கவும்", + "@unlockOldMessages": {}, + "appearOnTop": "மேலே தோன்றும்", + "@appearOnTop": {}, + "serverLimitReached": "சேவையக வரம்பு அடைந்தது! {seconds} விநாடிகள் காத்திருக்கிறது ...", + "@serverLimitReached": { + "type": "integer", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "acceptedKeyVerification": "{sender} ஏற்றுக்கொள்ளப்பட்ட விசை சரிபார்ப்பு", + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "copyToClipboard": "இடைநிலைப்பலகைக்கு நகலெடுக்கவும்", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "createGroup": "குழுவை உருவாக்கவும்", + "@createGroup": {}, + "editBundlesForAccount": "இந்த கணக்கிற்கான மூட்டைகளைத் திருத்தவும்", + "@editBundlesForAccount": {}, + "seenByUser": "{username} ஆல் பார்த்தது", + "@seenByUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "unpin": "Unpin", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "emojis": "ஈமோசிகள்", + "@emojis": {}, + "indexedDbErrorTitle": "தனியார் பயன்முறை சிக்கல்கள்", + "@indexedDbErrorTitle": {}, + "jumpToLastReadMessage": "கடைசி வாசிப்பு செய்திக்கு செல்லவும்", + "@jumpToLastReadMessage": {}, + "commandHint_markasgroup": "குழுவாக குறி", + "@commandHint_markasgroup": {}, + "commandHint_html": "உஉகுமொ வடிவமைக்கப்பட்ட உரையை அனுப்பவும்", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_kick": "இந்த அறையிலிருந்து கொடுக்கப்பட்ட பயனரை அகற்றவும்", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "deleteMessage": "செய்தியை நீக்கு", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "messageInfo": "செய்தி செய்தி", + "@messageInfo": {}, + "sentAFile": "📁 {username} கோப்பை அனுப்பியுள்ளார்", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "videoWithSize": "வீடியோ ({size})", + "@videoWithSize": { + "type": "String", + "placeholders": { + "size": { + "type": "String" + } + } + }, + "readUpToHere": "இங்கே படிக்கவும்", + "@readUpToHere": {}, + "chatDescriptionHasBeenChanged": "அரட்டை விளக்கம் மாற்றப்பட்டது", + "@chatDescriptionHasBeenChanged": {}, + "reportMessage": "செய்தி அறிக்கை", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "kickFromChat": "அரட்டையிலிருந்து கிக்", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "widgetVideo": "ஒளிதோற்றம்", + "@widgetVideo": {}, + "redactedAnEvent": "{username} ஒரு நிகழ்வை மறுவடிவமைத்தது", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "opacity": "ஒளிபுகாநிலை:", + "@opacity": {}, + "blur": "மங்கலானது:", + "@blur": {}, + "setWallpaper": "வால்பேப்பரை அமைக்கவும்", + "@setWallpaper": {}, + "statusExampleMessage": "இன்று நீங்கள் எப்படி இருக்கிறீர்கள்?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "toggleUnread": "மார்க் படிக்க/படிக்கவில்லை", + "@toggleUnread": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "பல கோரிக்கைகள். தயவுசெய்து பின்னர் மீண்டும் முயற்சிக்கவும்!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "unblockDevice": "சாதனத்தைத் தடைசெய்க", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "தெரியாத சாதனம்", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "addToSpaceDescription": "இந்த அரட்டையைச் சேர்க்க ஒரு இடத்தைத் தேர்ந்தெடுக்கவும்.", + "@addToSpaceDescription": {}, + "errorAddingWidget": "விட்செட்டைச் சேர்ப்பதில் பிழை.", + "@errorAddingWidget": {}, + "youInvitedToBy": "In இணைப்பு வழியாக நீங்கள் அழைக்கப்பட்டுள்ளீர்கள்:\n {alias}", + "@youInvitedToBy": { + "placeholders": { + "alias": { + "type": "String" + } + } + }, + "storeSecurlyOnThisDevice": "இந்த சாதனத்தில் பாதுகாப்பாக சேமிக்கவும்", + "@storeSecurlyOnThisDevice": {}, + "screenSharingTitle": "திரை பகிர்வு", + "@screenSharingTitle": {}, + "appearOnTopDetails": "பயன்பாடு மேலே தோன்ற அனுமதிக்கிறது (நீங்கள் ஏற்கனவே ஒரு அழைப்பு கணக்காக பஞ்சுபோன்ற அமைப்பைக் கொண்டிருந்தால் தேவையில்லை)", + "@appearOnTopDetails": {}, + "newGroup": "புதிய குழு", + "@newGroup": {}, + "noOtherDevicesFound": "வேறு சாதனங்கள் எதுவும் கிடைக்கவில்லை", + "@noOtherDevicesFound": {}, + "sendRoomNotifications": "ஒரு @ROOM அறிவிப்புகளை அனுப்பவும்", + "@sendRoomNotifications": {}, + "generatingVideoThumbnail": "வீடியோ சிறு உருவத்தை உருவாக்குதல் ...", + "@generatingVideoThumbnail": {}, + "reply": "பதில்", + "@reply": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "மற்ற நபரில் கையெழுத்திட, தயவுசெய்து உங்கள் பாதுகாப்பான கடை பாச்ஃபிரேச் அல்லது மீட்பு விசையை உள்ளிடவும்.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "விருந்தினர் பயனர்கள் சேர அனுமதிக்கப்படுகிறார்களா", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSureYouWantToLogout": "நீங்கள் நிச்சயமாக வெளியேற விரும்புகிறீர்களா?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "aboutHomeserver": "{homeserver} பற்றி", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "swipeRightToLeftToReply": "பதிலளிக்க வலமிருந்து இடமாக ச்வைப் செய்யவும்", + "@swipeRightToLeftToReply": {}, + "unread": "படிக்காதது", + "@unread": {}, + "changedTheChatDescriptionTo": "{username} பயனர்பெயர் the அரட்டை விளக்கத்தை மாற்றியது: '{description}'", + "@changedTheChatDescriptionTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "description": { + "type": "String" + } + } + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "deleteAccount": "கணக்கை நீக்கு", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "deviceKeys": "சாதன விசைகள்:", + "@deviceKeys": {}, + "noUsersFoundWithQuery": "துரதிர்ச்டவசமாக \"{query}\" உடன் எந்த பயனரையும் காண முடியவில்லை. நீங்கள் ஒரு எழுத்துப்பிழை செய்தீர்களா என்பதை சரிபார்க்கவும்.", + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "jump": "தாவு", + "@jump": {}, + "yourGlobalUserIdIs": "உங்கள் உலகளாவிய பயனர் ஐடி: ", + "@yourGlobalUserIdIs": {}, + "publicSpaces": "பொது இடங்கள்", + "@publicSpaces": {}, + "discover": "கண்டுபிடி", + "@discover": {}, + "commandHint_unignore": "கொடுக்கப்பட்ட மேட்ரிக்ச் ஐடியை இணைக்கவும்", + "@commandHint_unignore": {}, + "prepareSendingAttachment": "அனுப்பும் இணைப்பைத் தயாரிக்கவும் ...", + "@prepareSendingAttachment": {}, + "sendingAttachment": "இணைப்பை அனுப்புகிறது ...", + "@sendingAttachment": {}, + "continueText": "தொடரவும்", + "@continueText": {}, + "welcomeText": "ஏய் ஏய் 👋 இது பஞ்சுபோன்றது. Https://matrix.org உடன் இணக்கமான எந்த ஓம்சர்வரில் நீங்கள் உள்நுழையலாம். பின்னர் யாருடனும் அரட்டையடிக்கவும். இது ஒரு பெரிய பரவலாக்கப்பட்ட செய்தியிடல் நெட்வொர்க்!", + "@welcomeText": {}, + "name": "பெயர்", + "@name": {}, + "username": "பயனர்பெயர்", + "@username": { + "type": "String", + "placeholders": {} + }, + "whoCanPerformWhichAction": "எந்த செயலைச் செய்ய முடியும்", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "இந்த குழுவில் சேர யார் அனுமதிக்கப்படுகிறார்கள்", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "இந்த அரட்டையில் நீங்கள் இனி பங்கேற்கவில்லை", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "yourPublicKey": "உங்கள் பொது விசை", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "time": "நேரம்", + "@time": {}, + "publish": "வெளியிடுங்கள்", + "@publish": {}, + "openChat": "திறந்த அரட்டை", + "@openChat": {}, + "markAsRead": "படித்தபடி குறி", + "@markAsRead": {}, + "reportUser": "பயனர் புகாரளிக்கவும்", + "@reportUser": {}, + "dismiss": "தள்ளுபடி", + "@dismiss": {}, + "reactedWith": "{sender} {reaction} உடன் பதிலளித்தார்", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "placeCall": "அழைப்பு அழைப்பு", + "@placeCall": {}, + "videoCallsBetaWarning": "வீடியோ அழைப்புகள் தற்போது பீட்டாவில் உள்ளன என்பதை நினைவில் கொள்க. அவர்கள் எதிர்பார்த்தபடி வேலை செய்யக்கூடாது அல்லது எல்லா தளங்களிலும் வேலை செய்யக்கூடாது.", + "@videoCallsBetaWarning": {}, + "experimentalVideoCalls": "சோதனை வீடியோ அழைப்புகள்", + "@experimentalVideoCalls": {}, + "emailOrUsername": "மின்னஞ்சல் அல்லது பயனர்பெயர்", + "@emailOrUsername": {}, + "previousAccount": "முந்தைய கணக்கு", + "@previousAccount": {}, + "noOneCanJoin": "யாரும் சேர முடியாது", + "@noOneCanJoin": {}, + "userWouldLikeToChangeTheChat": "{user} அரட்டையில் சேர விரும்புகிறார்.", + "@userWouldLikeToChangeTheChat": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "newSpace": "புதிய இடம்", + "@newSpace": {}, + "enterSpace": "இடத்தை உள்ளிடவும்", + "@enterSpace": {}, + "wasDirectChatDisplayName": "வெற்று அரட்டை ({oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "openLinkInBrowser": "உலாவியில் திறந்த இணைப்பை திறக்கவும்", + "@openLinkInBrowser": {}, + "reportErrorDescription": "😭 ஓ இல்லை. ஏதோ தவறு நடந்தது. நீங்கள் விரும்பினால், இந்த பிழையை டெவலப்பர்களிடம் புகாரளிக்கலாம்.", + "@reportErrorDescription": {}, + "setTheme": "கருப்பொருள் அமைக்கவும்:", + "@setTheme": {}, + "invite": "அழைக்கவும்", + "@invite": {}, + "wrongPinEntered": "தவறான முள் நுழைந்தது! {seconds} விநாடிகளில் மீண்டும் முயற்சிக்கவும் ...", + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "pleaseEnterANumber": "தயவுசெய்து 0 ஐ விட அதிகமான எண்ணை உள்ளிடவும்", + "@pleaseEnterANumber": {}, + "kickUserDescription": "பயனர் அரட்டையிலிருந்து வெளியேற்றப்படுகிறார், ஆனால் தடை செய்யப்படவில்லை. பொது அரட்டைகளில், பயனர் எந்த நேரத்திலும் மீண்டும் சேரலாம்.", + "@kickUserDescription": {}, + "learnMore": "மேலும் அறிக", + "@learnMore": {}, + "chatCanBeDiscoveredViaSearchOnServer": "{server}", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "knockRestricted": "நாக் தடை", + "@knockRestricted": {}, + "bannedUser": "{username} தடைசெய்யப்பட்ட {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "தொகுதி சாதனம்", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "blocked": "தடுக்கப்பட்டது", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "changeDeviceName": "சாதனத்தின் பெயரை மாற்றவும்", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changedTheDisplaynameTo": "{username} அவற்றின் காட்சி பெயர்: '{displayname}'", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} விருந்தினர் அணுகல் விதிகளை மாற்றியது", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} அவர்களின் அவதாரத்தை மாற்றியது", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "{username} அறை மாற்றுப்பெயர்களை மாற்றியது", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changeTheNameOfTheGroup": "குழுவின் பெயரை மாற்றவும்", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "chats": "அரட்டைகள்", + "@chats": { + "type": "String", + "placeholders": {} + }, + "clearArchive": "தெளிவான காப்பகம்", + "@clearArchive": {}, + "close": "மூடு", + "@close": { + "type": "String", + "placeholders": {} + }, + "commandHint_create": "வெற்று குழு அரட்டையை உருவாக்கவும்\n குறியாக்கத்தை முடக்க-இல்லை-குறியாக்கத்தைப் பயன்படுத்தவும்", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "compareNumbersMatch": "எண்களை ஒப்பிடுக", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "connect": "இணை", + "@connect": { + "type": "String", + "placeholders": {} + }, + "containsUserName": "பயனர்பெயர் உள்ளது", + "@containsUserName": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "இடைநிலைப்பலகைக்கு நகலெடுக்கப்பட்டது", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "நகலெடு", + "@copy": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "செய்தியை மறைகுறியாக்க முடியவில்லை: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "create": "உருவாக்கு", + "@create": { + "type": "String", + "placeholders": {} + }, + "chatPermissions": "அரட்டை அனுமதிகள்", + "@chatPermissions": {}, + "editRoomAliases": "அறை மாற்றுப்பெயர்களைத் திருத்து", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "அறை அவதார் திருத்து", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "forward": "முன்னோக்கி", + "@forward": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "சேருவதிலிருந்து", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "groupWith": "{displayname} உடன் குழு", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "hideRedactedMessages": "சரிசெய்யப்பட்ட செய்திகளை மறைக்கவும்", + "@hideRedactedMessages": {}, + "hideRedactedMessagesBody": "யாராவது ஒரு செய்தியை மாற்றியமைத்தால், இந்த செய்தி இனி அரட்டையில் காணப்படாது.", + "@hideRedactedMessagesBody": {}, + "howOffensiveIsThisContent": "இந்த உள்ளடக்கம் எவ்வளவு ஆபத்தானது?", + "@howOffensiveIsThisContent": { + "type": "String", + "placeholders": {} + }, + "inoffensive": "செயலற்றது", + "@inoffensive": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "தொடர்பை அழைக்கவும்", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "kicked": "👞 {username} {targetName} ஐ உதைத்தார்", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "lastActiveAgo": "கடைசியாக செயலில்: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "leftTheChat": "அரட்டையை விட்டு வெளியேறினார்", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "ஏற்றவும் {count} மேலும் பங்கேற்பாளர்கள்", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "dehydrateWarning": "இந்த செயலை செயல்தவிர்க்க முடியாது. காப்புப்பிரதி கோப்பை பாதுகாப்பாக சேமித்து வைக்கவும்.", + "@dehydrateWarning": {}, + "dehydrateTor": "டோர் பயனர்கள்: ஏற்றுமதி அமர்வு", + "@dehydrateTor": {}, + "hydrateTor": "டோர் பயனர்கள்: இறக்குமதி அமர்வு ஏற்றுமதி", + "@hydrateTor": {}, + "loadMore": "மேலும் ஏற்றவும்…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "logout": "வெளியேற்றம்", + "@logout": { + "type": "String", + "placeholders": {} + }, + "memberChanges": "உறுப்பினர் மாற்றங்கள்", + "@memberChanges": { + "type": "String", + "placeholders": {} + }, + "messagesStyle": "செய்திகள்:", + "@messagesStyle": {}, + "needPantalaimonWarning": "இப்போதைக்கு இறுதி முதல் இறுதி குறியாக்கத்தைப் பயன்படுத்த உங்களுக்கு பாண்டலாயமன் தேவை என்பதை நினைவில் கொள்க.", + "@needPantalaimonWarning": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "Fuf பஞ்சுபோன்ற புதிய செய்தி", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "அறை இனி பகிரங்கமாக அணுக முடியாதவுடன் மட்டுமே நீங்கள் குறியாக்கத்தை செயல்படுத்த முடியும்.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "noMatrixServer": "{server1} என்பது மேட்ரிக்ஸ் சர்வர் இல்லை, அதற்கு பதிலாக {server2} ஐ பயன்படுத்தவா?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "noPermission": "இசைவு இல்லை", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "அறைகள் எதுவும் கிடைக்கவில்லை…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "notificationsEnabledForThisAccount": "இந்த கணக்கிற்கு அறிவிப்புகள் இயக்கப்பட்டன", + "@notificationsEnabledForThisAccount": { + "type": "String", + "placeholders": {} + }, + "numUsersTyping": "{count} பயனர்கள் தட்டச்சு செய்கிறார்கள்…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "offensive": "தாக்குதல்", + "@offensive": { + "type": "String", + "placeholders": {} + }, + "openCamera": "திறந்த கேமரா", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "openVideoCamera": "வீடியோவுக்கு கேமரா திறக்கவும்", + "@openVideoCamera": { + "type": "String", + "placeholders": {} + }, + "addAccount": "கணக்கைச் சேர்க்கவும்", + "@addAccount": {}, + "openInMaps": "வரைபடங்களில் திறந்திருக்கும்", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "link": "இணைப்பு", + "@link": {}, + "serverRequiresEmail": "இந்த சேவையகம் பதிவுக்கு உங்கள் மின்னஞ்சல் முகவரியை சரிபார்க்க வேண்டும்.", + "@serverRequiresEmail": {}, + "passwordForgotten": "கடவுச்சொல் மறந்துவிட்டது", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "கடவுச்சொல் மாற்றப்பட்டுள்ளது", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "pleaseChooseAPasscode": "பாச் குறியீட்டைத் தேர்வுசெய்க", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "பொது அறைகள்", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "removeAllOtherDevices": "மற்ற எல்லா சாதனங்களையும் அகற்றவும்", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "அறை மேம்படுத்தப்பட்டுள்ளது", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "அறை பதிப்பு", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "saveFile": "கோப்பை சேமி", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "sentAnAudio": "🎤 {username} ஆடியோவை அனுப்பியுள்ளார்", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAPicture": "🖼️ {username} படத்தை அனுப்பியுள்ளார்", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "🎥 {username} ஒரு வீடியோவை அனுப்பியுள்ளார்", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "setPermissionsLevel": "இசைவு அளவை அமைக்கவும்", + "@setPermissionsLevel": { + "type": "String", + "placeholders": {} + }, + "settings": "அமைப்புகள்", + "@settings": { + "type": "String", + "placeholders": {} + }, + "sharedTheLocation": "{username} அவற்றின் இருப்பிடத்தைப் பகிர்ந்து கொண்டது", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "showPassword": "கடவுச்சொல்லைக் காட்டு", + "@showPassword": { + "type": "String", + "placeholders": {} + }, + "submit": "சமர்ப்பிக்கவும்", + "@submit": { + "type": "String", + "placeholders": {} + }, + "tryToSendAgain": "மீண்டும் அனுப்ப முயற்சிக்கவும்", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "sendTypingNotifications": "தட்டச்சு அறிவிப்புகளை அனுப்பவும்", + "@sendTypingNotifications": {}, + "enterAnEmailAddress": "மின்னஞ்சல் முகவரியை உள்ளிடவும்", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "blockListDescription": "உங்களை தொந்தரவு செய்யும் பயனர்களைத் தடுக்கலாம். உங்கள் தனிப்பட்ட தொகுதி பட்டியலில் பயனர்களிடமிருந்து எந்த செய்திகளையும் அல்லது அறை அழைப்புகளையும் நீங்கள் பெற முடியாது.", + "@blockListDescription": {}, + "incorrectPassphraseOrKey": "தவறான கடவுச்சொல் அல்லது மீட்பு விசை", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "loadingPleaseWait": "ஏற்றுகிறது… தயவுசெய்து காத்திருங்கள்.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "no": "இல்லை", + "@no": { + "type": "String", + "placeholders": {} + }, + "people": "மக்கள்", + "@people": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "இந்த அரட்டையிலிருந்து உங்களுக்கு தடை விதிக்கப்பட்டுள்ளது", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "messageType": "செய்தி வகை", + "@messageType": {}, + "databaseMigrationTitle": "தரவுத்தளம் உகந்ததாக உள்ளது", + "@databaseMigrationTitle": {}, + "usersMustKnock": "பயனர்கள் தட்ட வேண்டும்", + "@usersMustKnock": {}, + "allSpaces": "அனைத்து இடங்களும்", + "@allSpaces": {}, + "importFromZipFile": ".Zip கோப்பிலிருந்து இறக்குமதி செய்யுங்கள்", + "@importFromZipFile": {}, + "activatedEndToEndEncryption": "{username} இறுதி குறியாக்கத்திற்கு செயல்படுத்தப்பட்ட முடிவு", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "addChatDescription": "அரட்டை விளக்கத்தைச் சேர்க்கவும் ...", + "@addChatDescription": {}, + "addToSpace": "விண்வெளியில் சேர்க்கவும்", + "@addToSpace": {}, + "commandHint_hug": "கட்டிப்பிடிக்கவும்", + "@commandHint_hug": {}, + "cuddleContent": "{senderName} பெயர் you உங்களை கசக்குகிறது", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "hugContent": "{senderName} உங்களை அணைத்துக்கொள்கிறது", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "appLock": "பயன்பாட்டு பூட்டு", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "appLockDescription": "முள் குறியீட்டைக் கொண்டு பயன்படுத்தாதபோது பயன்பாட்டைப் பூட்டவும்", + "@appLockDescription": {}, + "googlyEyesContent": "{senderName} உங்களுக்கு கூகிள் கண்களை அனுப்புகிறது", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "areYouSure": "நீங்கள் உறுதியாக இருக்கிறீர்களா?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "{username}பயனர்பெயர் இருந்து இலிருந்து இந்த சரிபார்ப்பு கோரிக்கையை ஏற்றுக்கொள்ளவா?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "autoplayImages": "அனிமேசன் செய்யப்பட்ட ச்டிக்கர்கள் மற்றும் உணர்ச்சிகளை தானாக இயக்கவும்", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "badServerLoginTypesException": "உள்நாட்டு வகைகளை ஓம்சர்வர் ஆதரிக்கிறது:\n {serverVersions}\n ஆனால் இந்த பயன்பாடு மட்டுமே ஆதரிக்கிறது:\n {supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "badServerVersionsException": "ஓம்சர்வர் ச்பெக் பதிப்புகளை ஆதரிக்கிறது:\n {serverVersions}\n ஆனால் இந்த பயன்பாடு {supportedVersions} மட்டுமே ஆதரிக்கிறது", + "@badServerVersionsException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "noChatsFoundHere": "இங்கே அரட்டைகள் எதுவும் காணப்படவில்லை. கீழே உள்ள பொத்தானைப் பயன்படுத்தி ஒருவருடன் புதிய அரட்டையைத் தொடங்கவும். .", + "@noChatsFoundHere": {}, + "space": "இடைவெளி", + "@space": {}, + "banned": "தடைசெய்யப்பட்டது", + "@banned": { + "type": "String", + "placeholders": {} + }, + "botMessages": "போட் செய்திகள்", + "@botMessages": { + "type": "String", + "placeholders": {} + }, + "changedTheChatNameTo": "{username} அரட்டை பெயரை மாற்றியது: '{chatname}'", + "@changedTheChatNameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "chatname": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username} வரலாற்று தெரிவுநிலையை மாற்றியது: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username} சேர விதிகளை மாற்றியது", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} சேர விதிகளை மாற்றியது: {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username} அழைப்பிதழ் இணைப்பை மாற்றியது", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changePassword": "கடவுச்சொல்லை மாற்றவும்", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "ஓம்சர்வரை மாற்றவும்", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeYourAvatar": "உங்கள் அவதாரத்தை மாற்றவும்", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "குறியாக்கம் சிதைந்துள்ளது", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "chat": "அரட்டை", + "@chat": { + "type": "String", + "placeholders": {} + }, + "yourChatBackupHasBeenSetUp": "உங்கள் அரட்டை காப்புப்பிரதி அமைக்கப்பட்டுள்ளது.", + "@yourChatBackupHasBeenSetUp": {}, + "chatBackupDescription": "உங்கள் பழைய செய்திகள் மீட்பு விசையுடன் பாதுகாக்கப்படுகின்றன. நீங்கள் அதை இழக்கவில்லை என்பதை உறுதிப்படுத்திக் கொள்ளுங்கள்.", + "@chatBackupDescription": { + "type": "String", + "placeholders": {} + }, + "chatHasBeenAddedToThisSpace": "இந்த இடத்தில் அரட்டை சேர்க்கப்பட்டுள்ளது", + "@chatHasBeenAddedToThisSpace": {}, + "commandHint_markasdm": "கொடுக்கப்பட்ட மேட்ரிக்சிற்கான நேரடி செய்தி அறையாக குறிக்கவும்", + "@commandHint_markasdm": {}, + "commandHint_ban": "கொடுக்கப்பட்ட பயனரை இந்த அறையிலிருந்து தடை செய்யுங்கள்", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_clearcache": "தெளிவான தற்காலிக சேமிப்பு", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_discardsession": "அமர்வை நிராகரிக்கவும்", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "commandHint_myroomavatar": "இந்த அறைக்கு உங்கள் படத்தை அமைக்கவும் (MXC-URI எழுதியது)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_myroomnick": "இந்த அறைக்கு உங்கள் காட்சி பெயரை அமைக்கவும்", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "commandInvalid": "கட்டளை தவறானது", + "@commandInvalid": { + "type": "String" + }, + "confirm": "உறுதிப்படுத்தவும்", + "@confirm": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "உள்ளடக்கம் சேவையக நிர்வாகிகளுக்கு தெரிவிக்கப்பட்டுள்ளது", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "💬 {username} அரட்டையை உருவாக்கினார்", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "currentlyActive": "தற்போது செயலில் உள்ளது", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "dateWithYear": "{year}-{month}-{day}", + "@dateWithYear": { + "type": "String", + "placeholders": { + "year": { + "type": "String" + }, + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "deactivateAccountWarning": "இது உங்கள் பயனர் கணக்கை செயலிழக்கச் செய்யும். இதை செயல்தவிர்க்க முடியாது! நீங்கள் உறுதியாக இருக்கிறீர்களா?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "புதிய பயனர்களுக்கான இயல்புநிலை இசைவு நிலை", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "delete": "நீக்கு", + "@delete": { + "type": "String", + "placeholders": {} + }, + "devices": "சாதனங்கள்", + "@devices": { + "type": "String", + "placeholders": {} + }, + "directChats": "நேரடி அரட்டைகள்", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "allRooms": "அனைத்து குழு அரட்டைகளும்", + "@allRooms": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "காட்சி பெயர் மாற்றப்பட்டுள்ளது", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "தடுக்கப்பட்ட சேவையகங்களைத் திருத்து", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "எமோட் ஏற்கனவே உள்ளது!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "தவறான எமோட் சார்ட்கோட்!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emoteKeyboardNoRecents": "அண்மைக் காலத்தில் பயன்படுத்தப்பட்ட உணர்ச்சிகள் இங்கே தோன்றும் ...", + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "emotePacks": "அறைக்கு எமோட் பொதிகள்", + "@emotePacks": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "எமோட் அமைப்புகள்", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "accessAndVisibilityDescription": "இந்த அரட்டையில் யார் சேர அனுமதிக்கப்படுகிறார்கள், அரட்டையை எவ்வாறு கண்டுபிடிப்பது.", + "@accessAndVisibilityDescription": {}, + "calls": "அழைப்புகள்", + "@calls": {}, + "customEmojisAndStickers": "தனிப்பயன் ஈமோசிகள் மற்றும் ச்டிக்கர்கள்", + "@customEmojisAndStickers": {}, + "customEmojisAndStickersBody": "எந்தவொரு அரட்டையிலும் பயன்படுத்தக்கூடிய தனிப்பயன் ஈமோசிகள் அல்லது ச்டிக்கர்களைச் சேர்க்கவும் அல்லது பகிரவும்.", + "@customEmojisAndStickersBody": {}, + "emoteShortcode": "சார்ட்கோட் எமோட்", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emoteWarnNeedToPick": "நீங்கள் ஒரு எமோட் சார்ட்கோட் மற்றும் ஒரு படத்தை எடுக்க வேண்டும்!", + "@emoteWarnNeedToPick": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "உலகளவில் எமோட் பேக்கை இயக்கவும்", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "குறியாக்கத்தை இயக்கவும்", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "நீங்கள் இனி குறியாக்கத்தை முடக்க முடியாது. நீங்கள் உறுதியாக இருக்கிறீர்களா?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "குறியாக்கம் இயக்கப்படவில்லை", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "encryption": "குறியாக்கம்", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName} அழைப்பை முடித்தார்", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "homeserver": "ஓம்சர்வர்", + "@homeserver": {}, + "errorObtainingLocation": "இருப்பிடத்தைப் பெறுவதில் பிழை: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "everythingReady": "எல்லாம் தயாராக!", + "@everythingReady": { + "type": "String", + "placeholders": {} + }, + "extremeOffensive": "மிகவும் தாக்குதல்", + "@extremeOffensive": { + "type": "String", + "placeholders": {} + }, + "goToTheNewRoom": "புதிய அறைக்குச் செல்லுங்கள்", + "@goToTheNewRoom": { + "type": "String", + "placeholders": {} + }, + "group": "குழு", + "@group": { + "type": "String", + "placeholders": {} + }, + "chatDescription": "அரட்டை விளக்கம்", + "@chatDescription": {}, + "groupIsPublic": "குழு பொது", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "hideRedactedEvents": "திருத்தப்பட்ட நிகழ்வுகளை மறைக்கவும்", + "@hideRedactedEvents": { + "type": "String", + "placeholders": {} + }, + "hideInvalidOrUnknownMessageFormats": "தவறான அல்லது அறியப்படாத செய்தி வடிவங்களை மறைக்கவும்", + "@hideInvalidOrUnknownMessageFormats": {}, + "id": "ஐடி", + "@id": { + "type": "String", + "placeholders": {} + }, + "block": "தொகுதி", + "@block": {}, + "inviteContactToGroupQuestion": "\"{groupName}\" அரட்டைக்கு {contact} ஐ அழைக்க விரும்புகிறீர்களா?", + "@inviteContactToGroupQuestion": {}, + "inviteContactToGroup": "{groupName} க்கு தொடர்பை அழை", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "noChatDescriptionYet": "அரட்டை விளக்கம் இதுவரை உருவாக்கப்படவில்லை.", + "@noChatDescriptionYet": {}, + "invalidServerName": "தவறான சேவையக பெயர்", + "@invalidServerName": {}, + "redactMessageDescription": "இந்த உரையாடலில் பங்கேற்பாளர்கள் அனைவருக்கும் செய்தி திருத்தப்படும். இதை செயல்தவிர்க்க முடியாது.", + "@redactMessageDescription": {}, + "invitedUser": "📩 {username} {targetName} அழைக்கப்பட்டார்", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "inviteText": "{username} உங்களை பஞ்சுபோன்றதாக அழைத்தது.\n 1. FulufyChat.im ஐப் பார்வையிட்டு பயன்பாட்டை நிறுவவும்\n 2. பதிவு செய்யுங்கள் அல்லது உள்நுழைக\n 3. அழைப்பிதழ் இணைப்பைத் திறக்கவும்:\n {link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "joinRoom": "அறையில் சேரவும்", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "leave": "விடுப்பு", + "@leave": { + "type": "String", + "placeholders": {} + }, + "dehydrateTorLong": "TOR பயனர்களுக்கு, சாளரத்தை மூடுவதற்கு முன் அமர்வை ஏற்றுமதி செய்ய பரிந்துரைக்கப்படுகிறது.", + "@dehydrateTorLong": {}, + "hydrateTorLong": "உங்கள் அமர்வை கடைசியாக டோரில் ஏற்றுமதி செய்தீர்களா? விரைவாக அதை இறக்குமதி செய்து அரட்டையடிக்கவும்.", + "@hydrateTorLong": {}, + "hydrate": "காப்பு கோப்பிலிருந்து மீட்டமைக்கவும்", + "@hydrate": {}, + "locationDisabledNotice": "இருப்பிட சேவைகள் முடக்கப்பட்டுள்ளன. தயவுசெய்து உங்கள் இருப்பிடத்தைப் பகிர்ந்து கொள்ள அவர்களுக்கு உதவவும்.", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "locationPermissionDeniedNotice": "இருப்பிட இசைவு மறுக்கப்பட்டது. உங்கள் இருப்பிடத்தைப் பகிர்ந்து கொள்ள தயவுசெய்து அவர்களுக்கு வழங்குங்கள்.", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "login": "புகுபதிவு", + "@login": { + "type": "String", + "placeholders": {} + }, + "logInTo": "{homeserver} இல் உள்நுழைக", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "messages": "செய்திகள்", + "@messages": { + "type": "String", + "placeholders": {} + }, + "muteChat": "முடக்கு அரட்டை", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "newChat": "புதிய அரட்டை", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "next": "அடுத்தது", + "@next": { + "type": "String", + "placeholders": {} + }, + "none": "எதுவுமில்லை", + "@none": { + "type": "String", + "placeholders": {} + }, + "noPasswordRecoveryDescription": "உங்கள் கடவுச்சொல்லை மீட்டெடுப்பதற்கான வழியை நீங்கள் இன்னும் சேர்க்கவில்லை.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "செய்திகளைப் படிக்க பயன்பாட்டைத் திறக்கவும்", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "oneClientLoggedOut": "உங்கள் வாடிக்கையாளர்களில் ஒருவர் உள்நுழைந்துள்ளார்", + "@oneClientLoggedOut": {}, + "addToBundle": "மூட்டையில் சேர்க்கவும்", + "@addToBundle": {}, + "or": "அல்லது", + "@or": { + "type": "String", + "placeholders": {} + }, + "hideMemberChangesInPublicChats": "பொது அரட்டைகளில் உறுப்பினர் மாற்றங்களை மறைக்கவும்", + "@hideMemberChangesInPublicChats": {}, + "hideMemberChangesInPublicChatsBody": "வாசிப்புத்திறனை மேம்படுத்த யாராவது ஒரு பொது அரட்டையில் சேர்ந்தால் அல்லது விட்டுவிட்டால் அரட்டை காலவரிசையில் காட்ட வேண்டாம்.", + "@hideMemberChangesInPublicChatsBody": {}, + "overview": "கண்ணோட்டம்", + "@overview": {}, + "notifyMeFor": "எனக்கு அறிவிக்கவும்", + "@notifyMeFor": {}, + "passwordRecoverySettings": "கடவுச்சொல் மீட்பு அமைப்புகள்", + "@passwordRecoverySettings": {}, + "passwordRecovery": "கடவுச்சொல் மீட்பு", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "pleaseChoose": "தயவுசெய்து தேர்வு செய்யவும்", + "@pleaseChoose": { + "type": "String", + "placeholders": {} + }, + "play": "Play {fileName}", + "@play": { + "type": "String", + "placeholders": { + "fileName": { + "type": "String" + } + } + }, + "pleaseEnter4Digits": "பயன்பாட்டு பூட்டை முடக்க 4 இலக்கங்களை உள்ளிடவும் அல்லது காலியாக விடவும்.", + "@pleaseEnter4Digits": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPassword": "உங்கள் கடவுச்சொல்லை உள்ளிடவும்", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPin": "உங்கள் முள் உள்ளிடவும்", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "உங்கள் பயனர்பெயரை உள்ளிடவும்", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "வலைத்தளத்தின் வழிமுறைகளைப் பின்பற்றி அடுத்து தட்டவும்.", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "privacy": "தனியுரிமை", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "reason": "காரணம்", + "@reason": { + "type": "String", + "placeholders": {} + }, + "redactedByBecause": "{username} ஆல் திருத்தப்பட்டது ஏனெனில்: \"{reason}\"", + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "register": "பதிவு செய்யுங்கள்", + "@register": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "{username} அழைப்பை நிராகரித்தது", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "rejoin": "மீண்டும் சேரவும்", + "@rejoin": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "அரட்டையிலிருந்து தடையின்றி", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "removeYourAvatar": "உங்கள் அவதாரத்தை அகற்று", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "replaceRoomWithNewerVersion": "புதிய பதிப்போடு அறையை மாற்றவும்", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "sendAsText": "உரையாக அனுப்பவும்", + "@sendAsText": { + "type": "String" + }, + "sendAudio": "ஆடியோ அனுப்பவும்", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendImage": "படத்தை அனுப்பு", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendImages": "{count} படத்தை அனுப்பு", + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "sendOriginal": "அசல் அனுப்பு", + "@sendOriginal": { + "type": "String", + "placeholders": {} + }, + "sendSticker": "ச்டிக்கரை அனுப்பவும்", + "@sendSticker": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "வீடியோ அனுப்பவும்", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "sentASticker": "😊 {username} ஒரு ச்டிக்கரை அனுப்பியது", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentCallInformations": "{senderName} அனுப்பப்பட்ட அழைப்பு செய்தி", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "separateChatTypes": "நேரடி அரட்டைகள் மற்றும் குழுக்களை பிரிக்கவும்", + "@separateChatTypes": { + "type": "String", + "placeholders": {} + }, + "setAsCanonicalAlias": "முதன்மையான மாற்றுப்பெயராக அமைக்கவும்", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "setCustomEmotes": "தனிப்பயன் உணர்ச்சிகளை அமைக்கவும்", + "@setCustomEmotes": { + "type": "String", + "placeholders": {} + }, + "setChatDescription": "அரட்டை விளக்கத்தை அமைக்கவும்", + "@setChatDescription": {}, + "setInvitationLink": "அழைப்பிதழ் இணைப்பை அமைக்கவும்", + "@setInvitationLink": { + "type": "String", + "placeholders": {} + }, + "share": "பங்கு", + "@share": { + "type": "String", + "placeholders": {} + }, + "presenceStyle": "இருப்பு:", + "@presenceStyle": { + "type": "String", + "placeholders": {} + }, + "presencesToggle": "பிற பயனர்களிடமிருந்து நிலை செய்திகளைக் காட்டு", + "@presencesToggle": { + "type": "String", + "placeholders": {} + }, + "singlesignon": "ஒற்றை அடையாளம்", + "@singlesignon": { + "type": "String", + "placeholders": {} + }, + "skip": "தவிர்", + "@skip": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "மூலக் குறியீடு", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "spaceName": "விண்வெளி பெயர்", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "status": "நிலை", + "@status": { + "type": "String", + "placeholders": {} + }, + "systemTheme": "மண்டலம்", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "அவர்கள் பொருந்துகிறார்கள்", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username} தடைசெய்யப்படாத {targetName}", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "unknownEvent": "அறியப்படாத நிகழ்வு '{type}'", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "userAndOthersAreTyping": "{username} மற்றும் {count} மற்றவர்கள் தட்டச்சு செய்கிறார்கள்…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "userIsTyping": "{username} தட்டச்சு செய்கிறது…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "waitingPartnerAcceptRequest": "கூட்டாளர் கோரிக்கையை ஏற்றுக்கொள்வதற்காக காத்திருக்கிறார்…", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "பங்குதாரர் ஈமோசியை ஏற்றுக்கொள்வதற்காக காத்திருக்கிறார்…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "sender": "அனுப்புநர்", + "@sender": {}, + "openGallery": "திறந்த கேலரி", + "@openGallery": {}, + "wallpaper": "வால்பேப்பர்:", + "@wallpaper": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "இதை ஏன் புகாரளிக்க விரும்புகிறீர்கள்?", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "wipeChatBackup": "புதிய மீட்பு விசையை உருவாக்க உங்கள் அரட்டை காப்புப்பிரதியைத் துடைக்கவா?", + "@wipeChatBackup": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "இந்த முகவரிகள் மூலம் உங்கள் கடவுச்சொல்லை மீட்டெடுக்கலாம்.", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "ஒரு செய்தியை எழுதுங்கள்…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "yes": "ஆம்", + "@yes": { + "type": "String", + "placeholders": {} + }, + "removeFromSpace": "இடத்திலிருந்து அகற்று", + "@removeFromSpace": {}, + "pleaseEnterRecoveryKeyDescription": "உங்கள் பழைய செய்திகளைத் திறக்க, முந்தைய அமர்வில் உருவாக்கப்பட்ட உங்கள் மீட்பு விசையை உள்ளிடவும். உங்கள் மீட்பு விசை உங்கள் கடவுச்சொல் அல்ல.", + "@pleaseEnterRecoveryKeyDescription": {}, + "confirmEventUnpin": "நிகழ்வை நிரந்தரமாக அவிழ்ப்பது உறுதி?", + "@confirmEventUnpin": {}, + "switchToAccount": "கணக்குக்கு மாறவும் {number}", + "@switchToAccount": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "nextAccount": "அடுத்த கணக்கு", + "@nextAccount": {}, + "youJoinedTheChat": "நீங்கள் அரட்டையில் சேர்ந்தீர்கள்", + "@youJoinedTheChat": {}, + "indexedDbErrorLong": "செய்தி சேமிப்பு துரதிர்ச்டவசமாக இயல்புநிலையாக தனிப்பட்ட பயன்முறையில் இயக்கப்படவில்லை.\n தயவுசெய்து பார்வையிடவும்\n - பற்றி: கட்டமைப்பு\n - கணம் dom.indexedDB.privateBrowsing.enabled பெறுநர் true\n இல்லையெனில், பஞ்சுபோன்றவை இயக்க முடியாது.", + "@indexedDbErrorLong": {}, + "youAcceptedTheInvitation": "👍 நீங்கள் அழைப்பை ஏற்றுக்கொண்டீர்கள்", + "@youAcceptedTheInvitation": {}, + "youBannedUser": "நீங்கள் {user} தடை செய்தீர்கள்", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youHaveWithdrawnTheInvitationFor": "{user}க்கான அழைப்பை திரும்பப் பெற்றுவிட்டீர்கள்", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedBy": "📩 நீங்கள் {user} ஆல் அழைக்கப்பட்டுள்ளீர்கள்", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedUser": "📩 {user} ஐ அழைத்தீர்கள்", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youUnbannedUser": "நீங்கள் {user} தடைசெய்யவில்லை", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "hasKnocked": "🚪 {user} தட்டியது", + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "noPublicLinkHasBeenCreatedYet": "பொது இணைப்பு இதுவரை உருவாக்கப்படவில்லை", + "@noPublicLinkHasBeenCreatedYet": {}, + "knock": "தட்டவும்", + "@knock": {}, + "users": "பயனர்கள்", + "@users": {}, + "storeInSecureStorageDescription": "மீட்பு விசையை இந்த சாதனத்தின் பாதுகாப்பான சேமிப்பகத்தில் சேமிக்கவும்.", + "@storeInSecureStorageDescription": {}, + "saveKeyManuallyDescription": "கணினி பகிர்வு உரையாடல் அல்லது கிளிப்போர்டைத் தூண்டுவதன் மூலம் இந்த விசையை கைமுறையாக சேமிக்கவும்.", + "@saveKeyManuallyDescription": {}, + "storeInAndroidKeystore": "ஆண்ட்ராய்டு கீச்டோரில் சேமிக்கவும்", + "@storeInAndroidKeystore": {}, + "countFiles": "{count} கோப்புகள்", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "custom": "தனிப்பயன்", + "@custom": {}, + "foregroundServiceRunning": "முன்புற பணி இயங்கும்போது இந்த அறிவிப்பு தோன்றும்.", + "@foregroundServiceRunning": {}, + "screenSharingDetail": "உங்கள் திரையை FUFFYCHAT இல் பகிர்கிறீர்கள்", + "@screenSharingDetail": {}, + "callingPermissions": "அழைப்பு அனுமதிகள்", + "@callingPermissions": {}, + "callingAccount": "அழைப்பு கணக்கு", + "@callingAccount": {}, + "callingAccountDetails": "சொந்த ஆண்ட்ராய்டு டயலர் பயன்பாட்டைப் பயன்படுத்த பஞ்சுபோன்றது அனுமதிக்கிறது.", + "@callingAccountDetails": {}, + "otherCallingPermissions": "மைக்ரோஃபோன், கேமரா மற்றும் பிற பஞ்சுபோன்ற அனுமதிகள்", + "@otherCallingPermissions": {}, + "numChats": "{number} அரட்டைகள்", + "@numChats": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "hideUnimportantStateEvents": "முக்கியமற்ற மாநில நிகழ்வுகளை மறைக்கவும்", + "@hideUnimportantStateEvents": {}, + "whyIsThisMessageEncrypted": "இந்த செய்தி ஏன் படிக்க முடியாதது?", + "@whyIsThisMessageEncrypted": {}, + "noKeyForThisMessage": "இந்த சாதனத்தில் உங்கள் கணக்கில் கையொப்பமிடுவதற்கு முன்பு செய்தி அனுப்பப்பட்டால் இது நிகழலாம்.\n\n அனுப்புநர் உங்கள் சாதனத்தைத் தடுத்துள்ளார் அல்லது இணைய இணைப்பில் ஏதேனும் தவறு ஏற்பட்டுள்ளது.\n\n மற்றொரு அமர்வில் செய்தியைப் படிக்க முடியுமா? அதிலிருந்து செய்தியை மாற்றலாம்! அமைப்புகள்> சாதனங்களுக்குச் சென்று, உங்கள் சாதனங்கள் ஒருவருக்கொருவர் சரிபார்த்துள்ளன என்பதை உறுதிப்படுத்தவும். அடுத்த முறை நீங்கள் அறையைத் திறக்கும்போது, இரண்டு அமர்வுகளும் முன்னணியில் இருக்கும்போது, விசைகள் தானாகவே அனுப்பப்படும்.\n\n வெளியேறும்போது அல்லது சாதனங்களை மாற்றும்போது விசைகளை இழக்க நீங்கள் விரும்பவில்லையா? அமைப்புகளில் அரட்டை காப்புப்பிரதியை நீங்கள் இயக்கியுள்ளீர்கள் என்பதை உறுதிப்படுத்திக் கொள்ளுங்கள்.", + "@noKeyForThisMessage": {}, + "hidePresences": "நிலை பட்டியலை மறைக்கவா?", + "@hidePresences": {}, + "doNotShowAgain": "மீண்டும் காட்ட வேண்டாம்", + "@doNotShowAgain": {}, + "newSpaceDescription": "உங்கள் அரட்டைகளை ஒருங்கிணைத்து தனியார் அல்லது பொது சமூகங்களை உருவாக்க இடைவெளிகள் உங்களை அனுமதிக்கிறது.", + "@newSpaceDescription": {}, + "disableEncryptionWarning": "பாதுகாப்பு காரணங்களுக்காக நீங்கள் ஒரு அரட்டையில் குறியாக்கத்தை முடக்க முடியாது, அது இதற்கு முன்பு இயக்கப்பட்டிருக்கிறது.", + "@disableEncryptionWarning": {}, + "sorryThatsNotPossible": "மன்னிக்கவும் ... அது சாத்தியமில்லை", + "@sorryThatsNotPossible": {}, + "noBackupWarning": "எச்சரிக்கை! அரட்டை காப்புப்பிரதியை இயக்காமல், உங்கள் மறைகுறியாக்கப்பட்ட செய்திகளுக்கான அணுகலை இழப்பீர்கள். வெளியேறுவதற்கு முன் முதலில் அரட்டை காப்புப்பிரதியை இயக்க மிகவும் பரிந்துரைக்கப்படுகிறது.", + "@noBackupWarning": {}, + "fileIsTooBigForServer": "அனுப்ப முடியவில்லை! சேவையகம் {max} வரை இணைப்புகளை மட்டுமே ஆதரிக்கிறது.", + "@fileIsTooBigForServer": { + "type": "String", + "placeholders": { + "max": { + "type": "String" + } + } + }, + "fileHasBeenSavedAt": "கோப்பு {path}", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "pleaseTryAgainLaterOrChooseDifferentServer": "தயவுசெய்து பின்னர் மீண்டும் முயற்சிக்கவும் அல்லது வேறு சேவையகத்தைத் தேர்வுசெய்க.", + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "signInWith": "{provider} மூலம் உள்நுழையவும்", + "@signInWith": { + "type": "String", + "placeholders": { + "provider": { + "type": "String" + } + } + }, + "profileNotFound": "பயனரை சேவையகத்தில் காண முடியவில்லை. ஒரு இணைப்பு சிக்கல் இருக்கலாம் அல்லது பயனர் இல்லை.", + "@profileNotFound": {}, + "inviteGroupChat": "Compect குழு அரட்டையை அழைக்கவும்", + "@inviteGroupChat": {}, + "invitePrivateChat": "தனிப்பட்ட தனியார் அரட்டையை அழைக்கவும்", + "@invitePrivateChat": {}, + "invalidInput": "தவறான உள்ளீடு!", + "@invalidInput": {}, + "archiveRoomDescription": "அரட்டை காப்பகத்திற்கு நகர்த்தப்படும். மற்ற பயனர்கள் நீங்கள் அரட்டையை விட்டுவிட்டீர்கள் என்பதைக் காண முடியும்.", + "@archiveRoomDescription": {}, + "removeDevicesDescription": "நீங்கள் இந்த சாதனத்திலிருந்து வெளியேறுவீர்கள், இனி செய்திகளைப் பெற முடியாது.", + "@removeDevicesDescription": {}, + "banUserDescription": "பயனர் அரட்டையிலிருந்து தடைசெய்யப்படுவார், மேலும் அவை தடைசெய்யப்படாத வரை மீண்டும் அரட்டையில் நுழைய முடியாது.", + "@banUserDescription": {}, + "makeAdminDescription": "இந்த பயனர் நிர்வாகியை நீங்கள் செய்தவுடன், இதை நீங்கள் செயல்தவிர்க்க முடியாமல் போகலாம், ஏனெனில் அவை உங்களைப் போன்ற அதே அனுமதிகளைக் கொண்டிருக்கும்.", + "@makeAdminDescription": {}, + "knocking": "தட்டுதல்", + "@knocking": {}, + "searchChatsRooms": "#Chats, Us பயனர்களைத் தேடுங்கள் ...", + "@searchChatsRooms": {}, + "nothingFound": "எதுவும் கிடைக்கவில்லை ...", + "@nothingFound": {}, + "groupName": "குழு பெயர்", + "@groupName": {}, + "createGroupAndInviteUsers": "ஒரு குழுவை உருவாக்கி பயனர்களை அழைக்கவும்", + "@createGroupAndInviteUsers": {}, + "groupCanBeFoundViaSearch": "தேடல் வழியாக குழுவை காணலாம்", + "@groupCanBeFoundViaSearch": {}, + "wrongRecoveryKey": "மன்னிக்கவும் ... இது சரியான மீட்பு விசையாகத் தெரியவில்லை.", + "@wrongRecoveryKey": {}, + "databaseMigrationBody": "தயவுசெய்து காத்திருங்கள். இது ஒரு கணம் ஆகலாம்.", + "@databaseMigrationBody": {}, + "newPassword": "புதிய கடவுச்சொல்", + "@newPassword": {}, + "pleaseChooseAStrongPassword": "வலுவான கடவுச்சொல்லைத் தேர்வுசெய்க", + "@pleaseChooseAStrongPassword": {}, + "passwordsDoNotMatch": "கடவுச்சொற்கள் பொருந்தவில்லை", + "@passwordsDoNotMatch": {}, + "joinSpace": "விண்வெளியில் சேரவும்", + "@joinSpace": {}, + "addChatOrSubSpace": "அரட்டை அல்லது துணை இடத்தைச் சேர்க்கவும்", + "@addChatOrSubSpace": {}, + "initAppError": "பயன்பாட்டைத் தொடங்கும்போது பிழை ஏற்பட்டது", + "@initAppError": {}, + "databaseBuildErrorBody": "SQlite தரவுத்தளத்தை உருவாக்க முடியவில்லை. ஆப்ஸ் தற்போதைக்கு மரபு தரவுத்தளத்தைப் பயன்படுத்த முயற்சிக்கிறது. {url} இல் டெவலப்பர்களிடம் இந்தப் பிழையைப் புகாரளிக்கவும். பிழை செய்தி: {error}", + "@databaseBuildErrorBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "sessionLostBody": "உங்கள் அமர்வு தொலைந்துவிட்டது. {url} இல் டெவலப்பர்களிடம் இந்தப் பிழையைப் புகாரளிக்கவும். பிழை செய்தி: {error}", + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "sendTypingNotificationsDescription": "அரட்டையில் பங்கேற்பாளர்கள் நீங்கள் ஒரு புதிய செய்தியைத் தட்டச்சு செய்யும் போது காணலாம்.", + "@sendTypingNotificationsDescription": {}, + "sendReadReceiptsDescription": "அரட்டையில் பங்கேற்பாளர்கள் நீங்கள் ஒரு செய்தியைப் படிக்கும்போது பார்க்கலாம்.", + "@sendReadReceiptsDescription": {}, + "formattedMessagesDescription": "மார்க் டவுனைப் பயன்படுத்தி தைரியமான உரை போன்ற பணக்கார செய்தி உள்ளடக்கத்தைக் காண்பி.", + "@formattedMessagesDescription": {}, + "verifyOtherUser": "Poser மற்ற பயனரை சரிபார்க்கவும்", + "@verifyOtherUser": {}, + "verifyOtherUserDescription": "நீங்கள் மற்றொரு பயனரைச் சரிபார்த்தால், நீங்கள் உண்மையில் யாருக்கு எழுதுகிறீர்கள் என்பது உங்களுக்குத் தெரியும் என்பதை நீங்கள் உறுதியாக நம்பலாம். .\n\n நீங்கள் ஒரு சரிபார்ப்பைத் தொடங்கும்போது, நீங்களும் மற்ற பயனரும் பயன்பாட்டில் ஒரு பாப்அப்பைக் காண்பீர்கள். நீங்கள் ஒருவருக்கொருவர் ஒப்பிட வேண்டிய தொடர்ச்சியான ஈமோசிகள் அல்லது எண்களைக் காண்பீர்கள்.\n\n இதைச் செய்வதற்கான சிறந்த வழி வீடியோ அழைப்பைச் சந்திப்பது அல்லது தொடங்குவது. .", + "@verifyOtherUserDescription": {}, + "verifyOtherDeviceDescription": "நீங்கள் மற்றொரு சாதனத்தை சரிபார்க்கும்போது, அந்த சாதனங்கள் விசைகளை பரிமாறிக்கொள்ளலாம், உங்கள் ஒட்டுமொத்த பாதுகாப்பை அதிகரிக்கும். So நீங்கள் ஒரு சரிபார்ப்பைத் தொடங்கும்போது, இரண்டு சாதனங்களிலும் பயன்பாட்டில் ஒரு பாப்அப் தோன்றும். நீங்கள் ஒருவருக்கொருவர் ஒப்பிட வேண்டிய தொடர்ச்சியான ஈமோசிகள் அல்லது எண்களைக் காண்பீர்கள். நீங்கள் சரிபார்ப்பைத் தொடங்குவதற்கு முன்பு இரண்டு சாதனங்களையும் எளிதில் வைத்திருப்பது நல்லது. .", + "@verifyOtherDeviceDescription": {}, + "canceledKeyVerification": "{sender} ரத்து செய்யப்பட்ட விசை சரிபார்ப்பு", + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "isReadyForKeyVerification": "விசை சரிபார்ப்பிற்கு {sender} தயாராக உள்ளார்", + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "requestedKeyVerification": "{sender} கோரப்பட்ட விசை சரிபார்ப்பு", + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "transparent": "வெளிப்படையானது", + "@transparent": {}, + "stickers": "ச்டிக்கர்கள்", + "@stickers": {}, + "commandHint_ignore": "கொடுக்கப்பட்ட மேட்ரிக்ச் ஐடியை புறக்கணிக்கவும்", + "@commandHint_ignore": {}, + "unreadChatsInApp": "{appname}: {unread} படிக்காத அரட்டைகள்", + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "thereAreCountUsersBlocked": "இப்போது {count} பயனர்கள் தடுக்கப்பட்டுள்ளனர்.", + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "restricted": "தடைசெய்யப்பட்டது", + "@restricted": {}, + "moderatorLevel": "{level} - மதிப்பீட்டாளர்", + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "adminLevel": "{level} - நிர்வாகி", + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "changeGeneralChatSettings": "பொது அரட்டை அமைப்புகளை மாற்றவும்", + "@changeGeneralChatSettings": {}, + "inviteOtherUsers": "இந்த அரட்டைக்கு மற்ற பயனர்களை அழைக்கவும்", + "@inviteOtherUsers": {}, + "changeTheChatPermissions": "அரட்டை அனுமதிகளை மாற்றவும்", + "@changeTheChatPermissions": {}, + "changeTheVisibilityOfChatHistory": "அரட்டை வரலாற்றின் தெரிவுநிலையை மாற்றவும்", + "@changeTheVisibilityOfChatHistory": {}, + "changeTheCanonicalRoomAlias": "முக்கிய பொது அரட்டை முகவரியை மாற்றவும்", + "@changeTheCanonicalRoomAlias": {}, + "changeTheDescriptionOfTheGroup": "அரட்டையின் விளக்கத்தை மாற்றவும்", + "@changeTheDescriptionOfTheGroup": {}, + "chatPermissionsDescription": "இந்த அரட்டையில் சில செயல்களுக்கு எந்த ஆற்றல் நிலை தேவை என்பதை வரையறுக்கவும். 0, 50 மற்றும் 100 ஆற்றல் நிலைகள் பொதுவாக பயனர்கள், மதிப்பீட்டாளர்கள் மற்றும் நிர்வாகிகளைக் குறிக்கின்றன, ஆனால் எந்த தரமும் சாத்தியமாகும்.", + "@chatPermissionsDescription": {}, + "updateInstalled": "🎉 புதுப்பிப்பு {version} நிறுவப்பட்டது!", + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "changelog": "மாற்றபதிவு", + "@changelog": {}, + "homeserverDescription": "உங்கள் எல்லா தரவுகளும் ஒரு மின்னஞ்சல் வழங்குநரைப் போலவே ஓம்சர்வரில் சேமிக்கப்படுகின்றன. நீங்கள் எந்த ஓம்சர்வரை பயன்படுத்த விரும்புகிறீர்கள் என்பதை நீங்கள் தேர்வு செய்யலாம், அதே நேரத்தில் நீங்கள் எல்லோரிடமும் தொடர்பு கொள்ளலாம். Https://matrix.org இல் மேலும் அறிக.", + "@homeserverDescription": {}, + "calculatingFileSize": "கோப்பு அளவைக் கணக்கிடுகிறது ...", + "@calculatingFileSize": {}, + "compressVideo": "அமைக்கும் வீடியோ ...", + "@compressVideo": {}, + "sendingAttachmentCountOfCount": "{length} இன் இணைப்பு {index}ஐ அனுப்புகிறது...", + "@sendingAttachmentCountOfCount": { + "type": "integer", + "placeholders": { + "index": { + "type": "int" + }, + "length": { + "type": "int" + } + } + }, + "oneOfYourDevicesIsNotVerified": "உங்கள் சாதனங்களில் ஒன்று சரிபார்க்கப்படவில்லை", + "@oneOfYourDevicesIsNotVerified": {}, + "noticeChatBackupDeviceVerification": "குறிப்பு: உங்கள் எல்லா சாதனங்களையும் அரட்டை காப்புப்பிரதியுடன் இணைக்கும்போது, அவை தானாகவே சரிபார்க்கப்படும்.", + "@noticeChatBackupDeviceVerification": {}, + "manageAccount": "கணக்கை நிர்வகிக்கவும்", + "@manageAccount": {}, + "noContactInformationProvided": "சேவையகம் எந்த சரியான தொடர்பு தகவலையும் வழங்காது", + "@noContactInformationProvided": {}, + "contactServerAdmin": "சேவையக நிர்வாகி தொடர்பு", + "@contactServerAdmin": {}, + "contactServerSecurity": "சேவையக பாதுகாப்பைத் தொடர்பு கொள்ளுங்கள்", + "@contactServerSecurity": {}, + "supportPage": "உதவி பக்கம்", + "@supportPage": {}, + "serverInformation": "சேவையக தகவல்:", + "@serverInformation": {}, + "version": "பதிப்பு", + "@version": {}, + "website": "வலைத்தளம்", + "@website": {}, + "compress": "சுருக்க", + "@compress": {}, + "alwaysUse24HourFormat": "தவறு", + "@alwaysUse24HourFormat": { + "description": "Set to true to always display time of day in 24 hour format." + }, + "admin": "நிர்வாகி", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "மாற்றுப்பெயர்", + "@alias": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "{senderName} அழைப்புக்கு பதிலளித்தார்", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "commandHint_react": "ஒரு எதிர்வினையாக பதிலை அனுப்பவும்", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "commandHint_send": "உரையை அனுப்பவும்", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "containsDisplayName": "காட்சி பெயரைக் கொண்டுள்ளது", + "@containsDisplayName": { + "type": "String", + "placeholders": {} + }, + "removeFromBundle": "இந்த மூட்டையிலிருந்து அகற்றவும்", + "@removeFromBundle": {}, + "pushRules": "தள்ளி விதிகள்", + "@pushRules": { + "type": "String", + "placeholders": {} + }, + "recording": "பதிவு", + "@recording": { + "type": "String", + "placeholders": {} + }, + "redactedBy": "{username} ஆல் திருத்தப்பட்டது", + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "directChat": "நேரடி அரட்டை", + "@directChat": {}, + "redactMessage": "திருத்தும் செய்தி", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "userAndUserAreTyping": "{username} மற்றும் {username2} தட்டச்சு செய்கின்றன…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userLeftTheChat": "🚪 {username} அரட்டையை விட்டு வெளியேறினார்", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "visibilityOfTheChatHistory": "அரட்டை வரலாற்றின் தெரிவுநிலை", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "you": "நீங்கள்", + "@you": { + "type": "String", + "placeholders": {} + }, + "unsupportedAndroidVersionLong": "இந்த அம்சத்திற்கு புதிய ஆண்ட்ராய்டு பதிப்பு தேவைப்படுகிறது. புதுப்பிப்புகள் அல்லது பரம்பரை OS ஆதரவை சரிபார்க்கவும்.", + "@unsupportedAndroidVersionLong": {}, + "widgetJitsi": "சிட்சி சந்திக்கிறார்", + "@widgetJitsi": {}, + "signInWithPassword": "கடவுச்சொல்லுடன் உள்நுழைக", + "@signInWithPassword": {}, + "setColorTheme": "வண்ண கருப்பொருள் அமைக்கவும்:", + "@setColorTheme": {}, + "roomUpgradeDescription": "அரட்டை பின்னர் புதிய அறை பதிப்பில் மீண்டும் உருவாக்கப்படும். பங்கேற்பாளர்கள் அனைவருக்கும் புதிய அரட்டைக்கு மாற வேண்டும் என்று அறிவிக்கப்படும். அறை பதிப்புகள் பற்றி மேலும் அறிய https://spec.matrix.org/latest/rooms/", + "@roomUpgradeDescription": {}, + "account": "கணக்கு", + "@account": { + "type": "String", + "placeholders": {} + }, + "groups": "குழுக்கள்", + "@groups": { + "type": "String", + "placeholders": {} + }, + "blockedUsers": "தடுக்கப்பட்ட பயனர்கள்", + "@blockedUsers": {}, + "leaveEmptyToClearStatus": "உங்கள் நிலையை அழிக்க காலியாக விடவும்.", + "@leaveEmptyToClearStatus": {}, + "subspace": "துணை", + "@subspace": {}, + "decline": "வீழ்ச்சி", + "@decline": {}, + "thisDevice": "இந்த சாதனம்:", + "@thisDevice": {}, + "minimumPowerLevel": "{level} என்பது குறைந்தபட்ச ஆற்றல் நிலை.", + "@minimumPowerLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "String" + } + } + }, + "gallery": "கேலரி", + "@gallery": {}, + "files": "கோப்புகள்", + "@files": {}, + "noDatabaseEncryption": "இந்த மேடையில் தரவுத்தள குறியாக்கம் ஆதரிக்கப்படவில்லை", + "@noDatabaseEncryption": {}, + "goToSpace": "விண்வெளிக்குச் செல்லுங்கள்: {space}", + "@goToSpace": { + "type": "String", + "space": {} + }, + "markAsUnread": "படிக்காத எனக் குறிக்கவும்", + "@markAsUnread": {}, + "userLevel": "{level} - பயனர்", + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "notAnImage": "படக் கோப்பு அல்ல.", + "@notAnImage": {}, + "encryptThisChat": "இந்த அரட்டையை குறியாக்கவும்", + "@encryptThisChat": {}, + "userRole": "பயனர் பங்கு", + "@userRole": {}, + "publicChatAddresses": "பொது அரட்டை முகவரிகள்", + "@publicChatAddresses": {}, + "createNewAddress": "புதிய முகவரியை உருவாக்கவும்", + "@createNewAddress": {}, + "boldText": "தைரியமான உரை", + "@boldText": {}, + "italicText": "சாய்வு உரை", + "@italicText": {}, + "strikeThrough": "ச்ட்ரைகெத்ரோ", + "@strikeThrough": {}, + "pleaseFillOut": "தயவுசெய்து நிரப்பவும்", + "@pleaseFillOut": {}, + "invalidUrl": "தவறான முகவரி", + "@invalidUrl": {}, + "addLink": "இணைப்பைச் சேர்க்கவும்", + "@addLink": {}, + "searchIn": "அரட்டையில் தேடு \"{chat}\" ...", + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "searchMore": "மேலும் தேடுங்கள் ...", + "@searchMore": {}, + "startedKeyVerification": "{sender} விசை சரிபார்ப்பைத் தொடங்கினார்", + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "loginWithMatrixId": "மேட்ரிக்ச்-ஐடியுடன் உள்நுழைக", + "@loginWithMatrixId": {}, + "discoverHomeservers": "ஓம்சர்சர்களைக் கண்டறியவும்", + "@discoverHomeservers": {}, + "whatIsAHomeserver": "ஓம்சர்வர் என்றால் என்ன?", + "@whatIsAHomeserver": {}, + "doesNotSeemToBeAValidHomeserver": "இணக்கமான ஓம்சர்வர் என்று தெரியவில்லை. தவறான URL?", + "@doesNotSeemToBeAValidHomeserver": {}, + "countChatsAndCountParticipants": "{chats} அரட்டைகள் மற்றும் {participants} பங்கேற்பாளர்கள்", + "@countChatsAndCountParticipants": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + }, + "participants": { + "type": "int" + } + } + }, + "noMoreChatsFound": "இனி அரட்டைகள் கிடைக்கவில்லை ...", + "@noMoreChatsFound": {}, + "joinedChats": "இணைந்த அரட்டைகள்", + "@joinedChats": {}, + "spaces": "இடங்கள்", + "@spaces": {}, + "changedTheChatPermissions": "{username} அரட்டை அனுமதிகளை மாற்றியுள்ளார்", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} விருந்தினர் அணுகல் விதிகளை மாற்றியது: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username} வரலாற்று தெரிவுநிலையை மாற்றியது", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "commandHint_join": "கொடுக்கப்பட்ட அறையில் சேரவும்", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_dm": "நேரடி அரட்டையைத் தொடங்கவும்\n குறியாக்கத்தை முடக்க-இல்லை-குறியாக்கத்தைப் பயன்படுத்தவும்", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "commandHint_leave": "இந்த அறையை விட்டு விடுங்கள்", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "toggleMuted": "முடக்கியது", + "@toggleMuted": { + "type": "String", + "placeholders": {} + }, + "unbanUserDescription": "அவர்கள் முயற்சித்தால் பயனர் மீண்டும் அரட்டையை உள்ளிட முடியும்.", + "@unbanUserDescription": {}, + "restoreSessionBody": "ஆப்ஸ் இப்போது உங்கள் அமர்வை காப்புப்பிரதியிலிருந்து மீட்டெடுக்க முயற்சிக்கிறது. {url} இல் டெவலப்பர்களிடம் இந்தப் பிழையைப் புகாரளிக்கவும். பிழை செய்தி: {error}", + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "sendReadReceipts": "வாசிப்பு ரசீதுகளை அனுப்பவும்", + "@sendReadReceipts": {}, + "unableToJoinChat": "அரட்டையில் சேர முடியவில்லை. ஒருவேளை மற்ற கட்சி ஏற்கனவே உரையாடலை மூடியிருக்கலாம்.", + "@unableToJoinChat": {}, + "noGoogleServicesWarning": "ஃபயர்பேச் முகில் செய்தி உங்கள் சாதனத்தில் கிடைக்கவில்லை. இன்னும் புச் அறிவிப்புகளைப் பெற, NTFY ஐ நிறுவ பரிந்துரைக்கிறோம். NTFY அல்லது மற்றொரு ஒருங்கிணைந்த புச் வழங்குநருடன் நீங்கள் தரவு பாதுகாப்பான வழியில் புச் அறிவிப்புகளைப் பெறலாம். நீங்கள் பிளேச்டோரிலிருந்து அல்லது எஃப்-டிராய்டிலிருந்து NTFY ஐ பதிவிறக்கம் செய்யலாம்.", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "scanQrCode": "QR குறியீட்டை ச்கேன் செய்யுங்கள்", + "@scanQrCode": {}, + "obtainingLocation": "இருப்பிடத்தைப் பெறுதல்…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "offline": "இணையமில்லாமல்", + "@offline": { + "type": "String", + "placeholders": {} + }, + "online": "ஆன்லைனில்", + "@online": { + "type": "String", + "placeholders": {} + }, + "participant": "பங்கேற்பாளர்", + "@participant": { + "type": "String", + "placeholders": {} + }, + "removeDevice": "சாதனத்தை அகற்று", + "@removeDevice": { + "type": "String", + "placeholders": {} + }, + "search": "தேடல்", + "@search": { + "type": "String", + "placeholders": {} + }, + "security": "பாதுகாப்பு", + "@security": { + "type": "String", + "placeholders": {} + }, + "sendFile": "கோப்பு அனுப்பவும்", + "@sendFile": { + "type": "String", + "placeholders": {} + } +} diff --git a/assets/l10n/intl_te.arb b/assets/l10n/intl_te.arb new file mode 100644 index 0000000..60cbd30 --- /dev/null +++ b/assets/l10n/intl_te.arb @@ -0,0 +1,15 @@ +{ + "alwaysUse24HourFormat": "తప్పుడు", + "@alwaysUse24HourFormat": { + "description": "Set to true to always display time of day in 24 hour format." + }, + "notAnImage": "ఇమేజ్ ఫైల్ కాదు.", + "@notAnImage": {}, + "repeatPassword": "పాస్‌వర్డ్‌ను పునరావృతం చేయండి", + "@repeatPassword": {}, + "remove": "తొలగించు", + "@remove": { + "type": "String", + "placeholders": {} + } +} diff --git a/assets/l10n/intl_th.arb b/assets/l10n/intl_th.arb new file mode 100644 index 0000000..4218554 --- /dev/null +++ b/assets/l10n/intl_th.arb @@ -0,0 +1,2156 @@ +{ + "hugContent": "{senderName} กอดคุณ", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "commandHint_cuddle": "ส่งเคล้าเคลียให้", + "@commandHint_cuddle": {}, + "admin": "แอดมิน", + "@admin": { + "type": "String", + "placeholders": {} + }, + "supposedMxid": "อันนี้ควรเป็น {mxid}", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "askSSSSSign": "เพื่อให้สามารถลงนามบุคคลอื่นได้ โปรดป้อนรหัสผ่านร้านค้าที่ปลอดภัยหรือรหัสกู้คืนของคุณ", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "remove": "ลบออก", + "@remove": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "ผู้ใช้ทั่วไปได้รับอนุญาตให้เข้าร่วมหรือไม่", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "sendOnEnter": "ส่งเมื่อกด enter", + "@sendOnEnter": {}, + "answeredTheCall": "{senderName} รับสายแล้ว", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "alias": "นามแฝง", + "@alias": { + "type": "String", + "placeholders": {} + }, + "all": "ทั้งหมด", + "@all": { + "type": "String", + "placeholders": {} + }, + "badServerLoginTypesException": "โฮมเซิร์ฟเวอร์รองรับประเภทการเข้าสู่ระบบ:\n{serverVersions}\nแต่แอปนี้รองรับเฉพาะ:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "edit": "แก้ไข", + "@edit": { + "type": "String", + "placeholders": {} + }, + "copy": "คัดลอก", + "@copy": { + "type": "String", + "placeholders": {} + }, + "importFromZipFile": "นำเข้าจากไฟล์ .zip", + "@importFromZipFile": {}, + "autoplayImages": "เล่นสติ๊กเกอร์และอิโมจิแบบเคลื่อนไหวโดยอัตโนมัติ", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "help": "ช่วยเหลือ", + "@help": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "รายละเอียดแชท", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "repeatPassword": "ใส่รหัสผ่านอีกรอบ", + "@repeatPassword": {}, + "delete": "ลบออก", + "@delete": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 {username} ได้รับการชวนแล้ว", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "send": "ส่ง", + "@send": { + "type": "String", + "placeholders": {} + }, + "exportEmotePack": "ส่งอิโมจิแพ็คออกเป็นไฟล์ .zip", + "@exportEmotePack": {}, + "account": "บัญชี", + "@account": { + "type": "String", + "placeholders": {} + }, + "chat": "แชท", + "@chat": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "คุณแน่ใจไหม?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "allChats": "แชททั้งหมด", + "@allChats": { + "type": "String", + "placeholders": {} + }, + "addToSpace": "เพิ่มไปที่ space", + "@addToSpace": {}, + "about": "เกี่ยวกับ", + "@about": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐 {username} เปิดใช้งาน end to end encryption", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "fluffychat": "FluffyChat", + "@fluffychat": { + "type": "String", + "placeholders": {} + }, + "googlyEyesContent": "{senderName} ส่งตากวนๆให้คุณ", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "addChatDescription": "เพิ่มคำอธิบายการแชท", + "@addChatDescription": {}, + "appLock": "ล็อคแอป", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "sendTypingNotifications": "ส่งการแจ้งเตือนการพิมพ์", + "@sendTypingNotifications": {}, + "importEmojis": "นำเข้าอ๊โมจิ", + "@importEmojis": {}, + "confirmMatrixId": "กรุณายืนยัน Matrix ID ของคุณเพื่อลบบัญชีของคุณ", + "@confirmMatrixId": {}, + "notAnImage": "ไม่ใช่ไฟล์รูปภาพ", + "@notAnImage": {}, + "areYouSureYouWantToLogout": "คุณแน่ใจว่าคุณต้องการที่จะออกจากระบบ?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "cuddleContent": "{senderName} เคล้าเคลียคุณ", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "askVerificationRequest": "ยอมรับคำขอยืนยันนี้จาก {username} หรือไม่", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "addEmail": "เพิ่มอีเมล", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "commandHint_hug": "ส่งกอดให้", + "@commandHint_hug": {}, + "replace": "แทนที่", + "@replace": {}, + "archive": "คลังเก็บ", + "@archive": { + "type": "String", + "placeholders": {} + }, + "accept": "ยอมรับ", + "@accept": { + "type": "String", + "placeholders": {} + }, + "commandHint_googly": "ส่งสายตากวนๆ มาให้หน่อย", + "@commandHint_googly": {}, + "pin": "ปักหมุด", + "@pin": { + "type": "String", + "placeholders": {} + }, + "importNow": "นำเข้าเลย", + "@importNow": {}, + "anyoneCanJoin": "ใครๆ ก็สามารถเข้าร่วมได้", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "@showPassword": { + "type": "String", + "placeholders": {} + }, + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "@connect": { + "type": "String", + "placeholders": {} + }, + "@jumpToLastReadMessage": {}, + "@allRooms": { + "type": "String", + "placeholders": {} + }, + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "@chats": { + "type": "String", + "placeholders": {} + }, + "@widgetVideo": {}, + "@dismiss": {}, + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "@reportErrorDescription": {}, + "@directChats": { + "type": "String", + "placeholders": {} + }, + "@setPermissionsLevel": { + "type": "String", + "placeholders": {} + }, + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "@addAccount": {}, + "@close": { + "type": "String", + "placeholders": {} + }, + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "@chatHasBeenAddedToThisSpace": {}, + "@reply": { + "type": "String", + "placeholders": {} + }, + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "@unsupportedAndroidVersion": {}, + "@device": { + "type": "String", + "placeholders": {} + }, + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "@widgetJitsi": {}, + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "@encryption": { + "type": "String", + "placeholders": {} + }, + "@messageType": {}, + "@indexedDbErrorLong": {}, + "@oneClientLoggedOut": {}, + "@toggleMuted": { + "type": "String", + "placeholders": {} + }, + "@unsupportedAndroidVersionLong": {}, + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@title": { + "description": "Title for the application", + "type": "String", + "placeholders": {} + }, + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "@startFirstChat": {}, + "@callingAccount": {}, + "@requestPermission": { + "type": "String", + "placeholders": {} + }, + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@invited": { + "type": "String", + "placeholders": {} + }, + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "@setColorTheme": {}, + "@nextAccount": {}, + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "@singlesignon": { + "type": "String", + "placeholders": {} + }, + "@warning": { + "type": "String", + "placeholders": {} + }, + "@password": { + "type": "String", + "placeholders": {} + }, + "@allSpaces": {}, + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "@user": {}, + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "@youAcceptedTheInvitation": {}, + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@banUserDescription": {}, + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "@widgetEtherpad": {}, + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "@id": { + "type": "String", + "placeholders": {} + }, + "@removeDevicesDescription": {}, + "@changedTheChatDescriptionTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "description": { + "type": "String" + } + } + }, + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@separateChatTypes": { + "type": "String", + "placeholders": {} + }, + "@tryAgain": {}, + "@blocked": { + "type": "String", + "placeholders": {} + }, + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@dateWithoutYear": { + "type": "String", + "placeholders": { + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "@removeDevice": { + "type": "String", + "placeholders": {} + }, + "@unbanUserDescription": {}, + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "@pickImage": { + "type": "String", + "placeholders": {} + }, + "@youRejectedTheInvitation": {}, + "@otherCallingPermissions": {}, + "@messagesStyle": {}, + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "@link": {}, + "@widgetUrlError": {}, + "@emailOrUsername": {}, + "@newSpaceDescription": {}, + "@chatDescription": {}, + "@callingAccountDetails": {}, + "@next": { + "type": "String", + "placeholders": {} + }, + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@dateWithYear": { + "type": "String", + "placeholders": { + "year": { + "type": "String" + }, + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "@enterSpace": {}, + "@encryptThisChat": {}, + "@fileName": { + "type": "String", + "placeholders": {} + }, + "@unavailable": { + "type": "String", + "placeholders": {} + }, + "@previousAccount": {}, + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "@emoteWarnNeedToPick": { + "type": "String", + "placeholders": {} + }, + "@reopenChat": {}, + "@pleaseEnterRecoveryKey": {}, + "@create": { + "type": "String", + "placeholders": {} + }, + "@toggleFavorite": { + "type": "String", + "placeholders": {} + }, + "@no": { + "type": "String", + "placeholders": {} + }, + "@widgetNameError": {}, + "@inoffensive": { + "type": "String", + "placeholders": {} + }, + "@unpin": { + "type": "String", + "placeholders": {} + }, + "@addToBundle": {}, + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "@addWidget": {}, + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@noKeyForThisMessage": {}, + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "@reason": { + "type": "String", + "placeholders": {} + }, + "@commandHint_markasgroup": {}, + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "@hydrateTor": {}, + "@pushNotificationsNotAvailable": {}, + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "@storeInAppleKeyChain": {}, + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "@hydrate": {}, + "@invalidServerName": {}, + "@chatPermissions": {}, + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "@wipeChatBackup": { + "type": "String", + "placeholders": {} + }, + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "@sender": {}, + "@storeInAndroidKeystore": {}, + "@hideRedactedEvents": { + "type": "String", + "placeholders": {} + }, + "@online": { + "type": "String", + "placeholders": {} + }, + "@signInWithPassword": {}, + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "@offensive": { + "type": "String", + "placeholders": {} + }, + "@needPantalaimonWarning": { + "type": "String", + "placeholders": {} + }, + "@makeAdminDescription": {}, + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "@transferFromAnotherDevice": { + "type": "String", + "placeholders": {} + }, + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "@pushRules": { + "type": "String", + "placeholders": {} + }, + "@goToTheNewRoom": { + "type": "String", + "placeholders": {} + }, + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "@saveKeyManuallyDescription": {}, + "@none": { + "type": "String", + "placeholders": {} + }, + "@editBundlesForAccount": {}, + "@renderRichContent": { + "type": "String", + "placeholders": {} + }, + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "@whyIsThisMessageEncrypted": {}, + "@unreadChats": { + "type": "String", + "placeholders": { + "unreadCount": { + "type": "int" + } + } + }, + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@setChatDescription": {}, + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "@toggleUnread": { + "type": "String", + "placeholders": {} + }, + "@or": { + "type": "String", + "placeholders": {} + }, + "@dehydrateWarning": {}, + "@sendOriginal": { + "type": "String", + "placeholders": {} + }, + "@noOtherDevicesFound": {}, + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "@seenByUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@storeSecurlyOnThisDevice": {}, + "@yourChatBackupHasBeenSetUp": {}, + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@submit": { + "type": "String", + "placeholders": {} + }, + "@videoCallsBetaWarning": {}, + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "@participant": { + "type": "String", + "placeholders": {} + }, + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "@yes": { + "type": "String", + "placeholders": {} + }, + "@containsDisplayName": { + "type": "String", + "placeholders": {} + }, + "@signInWith": { + "type": "String", + "placeholders": { + "provider": { + "type": "String" + } + } + }, + "@username": { + "type": "String", + "placeholders": {} + }, + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@fileIsTooBigForServer": {}, + "@homeserver": {}, + "@people": { + "type": "String", + "placeholders": {} + }, + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "@verified": { + "type": "String", + "placeholders": {} + }, + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "@callingPermissions": {}, + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "@readUpToHere": {}, + "@start": {}, + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "@deviceId": { + "type": "String", + "placeholders": {} + }, + "@register": { + "type": "String", + "placeholders": {} + }, + "@unlockOldMessages": {}, + "@identity": { + "type": "String", + "placeholders": {} + }, + "@numChats": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "@ignore": { + "type": "String", + "placeholders": {} + }, + "@recording": { + "type": "String", + "placeholders": {} + }, + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@moderator": { + "type": "String", + "placeholders": {} + }, + "@optionalRedactReason": {}, + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "@ok": { + "type": "String", + "placeholders": {} + }, + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "@dehydrate": {}, + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "@banned": { + "type": "String", + "placeholders": {} + }, + "@sendAsText": { + "type": "String" + }, + "@inviteForMe": { + "type": "String", + "placeholders": {} + }, + "@archiveRoomDescription": {}, + "@changedTheChatNameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "chatname": { + "type": "String" + } + } + }, + "@sendSticker": { + "type": "String", + "placeholders": {} + }, + "@switchToAccount": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "@commandInvalid": { + "type": "String" + }, + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "@placeCall": {}, + "@removedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@newChat": { + "type": "String", + "placeholders": {} + }, + "@notifications": { + "type": "String", + "placeholders": {} + }, + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "@experimentalVideoCalls": {}, + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "@pleaseEnterRecoveryKeyDescription": {}, + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "@mention": { + "type": "String", + "placeholders": {} + }, + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "@inviteContactToGroupQuestion": {}, + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@group": { + "type": "String", + "placeholders": {} + }, + "@leave": { + "type": "String", + "placeholders": {} + }, + "@skip": { + "type": "String", + "placeholders": {} + }, + "@appearOnTopDetails": {}, + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "@enterRoom": {}, + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@reportUser": {}, + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@confirmEventUnpin": {}, + "@badServerVersionsException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "@license": { + "type": "String", + "placeholders": {} + }, + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "@redactMessageDescription": {}, + "@rejoin": { + "type": "String", + "placeholders": {} + }, + "@recoveryKey": {}, + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "@forward": { + "type": "String", + "placeholders": {} + }, + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "@invalidInput": {}, + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "@dehydrateTorLong": {}, + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "@offline": { + "type": "String", + "placeholders": {} + }, + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "@doNotShowAgain": {}, + "@report": {}, + "@status": { + "type": "String", + "placeholders": {} + }, + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "@memberChanges": { + "type": "String", + "placeholders": {} + }, + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "@unverified": {}, + "@howOffensiveIsThisContent": { + "type": "String", + "placeholders": {} + }, + "@serverRequiresEmail": {}, + "@hideUnimportantStateEvents": {}, + "@screenSharingTitle": {}, + "@widgetCustom": {}, + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@addToSpaceDescription": {}, + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "@cancel": { + "type": "String", + "placeholders": {} + }, + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@publish": {}, + "@openLinkInBrowser": {}, + "@clearArchive": {}, + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "@messageInfo": {}, + "@disableEncryptionWarning": {}, + "@directChat": {}, + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "@inviteGroupChat": {}, + "@appearOnTop": {}, + "@invitePrivateChat": {}, + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "@foregroundServiceRunning": {}, + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "@voiceCall": {}, + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "@confirm": { + "type": "String", + "placeholders": {} + }, + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "@noChatDescriptionYet": {}, + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "@removeFromBundle": {}, + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "@learnMore": {}, + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "@you": { + "type": "String", + "placeholders": {} + }, + "@users": {}, + "@openGallery": {}, + "@chatDescriptionHasBeenChanged": {}, + "@search": { + "type": "String", + "placeholders": {} + }, + "@newGroup": {}, + "@bundleName": {}, + "@dehydrateTor": {}, + "@removeFromSpace": {}, + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "@roomUpgradeDescription": {}, + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "@scanQrCode": {}, + "@logout": { + "type": "String", + "placeholders": {} + }, + "@pleaseEnterANumber": {}, + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@profileNotFound": {}, + "@jump": {}, + "@groups": { + "type": "String", + "placeholders": {} + }, + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@sorryThatsNotPossible": {}, + "@videoWithSize": { + "type": "String", + "placeholders": { + "size": { + "type": "String" + } + } + }, + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@shareInviteLink": {}, + "@commandHint_markasdm": {}, + "@recoveryKeyLost": {}, + "@containsUserName": { + "type": "String", + "placeholders": {} + }, + "@messages": { + "type": "String", + "placeholders": {} + }, + "@login": { + "type": "String", + "placeholders": {} + }, + "@deviceKeys": {}, + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "@everythingReady": { + "type": "String", + "placeholders": {} + }, + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "@setCustomEmotes": { + "type": "String", + "placeholders": {} + }, + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "@notificationsEnabledForThisAccount": { + "type": "String", + "placeholders": {} + }, + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "@settings": { + "type": "String", + "placeholders": {} + }, + "@setTheme": {}, + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "@youJoinedTheChat": {}, + "@wallpaper": { + "type": "String", + "placeholders": {} + }, + "@openVideoCamera": { + "type": "String", + "placeholders": {} + }, + "@play": { + "type": "String", + "placeholders": { + "fileName": { + "type": "String" + } + } + }, + "@chatBackupDescription": { + "type": "String", + "placeholders": {} + }, + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "@security": { + "type": "String", + "placeholders": {} + }, + "@markAsRead": {}, + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "@widgetName": {}, + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@errorAddingWidget": {}, + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "@reject": { + "type": "String", + "placeholders": {} + }, + "@extremeOffensive": { + "type": "String", + "placeholders": {} + }, + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "@pleaseEnter4Digits": { + "type": "String", + "placeholders": {} + }, + "@newSpace": {}, + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "@devices": { + "type": "String", + "placeholders": {} + }, + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "@emojis": {}, + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "@pleaseChoose": { + "type": "String", + "placeholders": {} + }, + "@share": { + "type": "String", + "placeholders": {} + }, + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "@createGroup": {}, + "@privacy": { + "type": "String", + "placeholders": {} + }, + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "@hydrateTorLong": {}, + "@time": {}, + "@enterYourHomeserver": { + "type": "String", + "placeholders": {} + }, + "@botMessages": { + "type": "String", + "placeholders": {} + }, + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "@custom": {}, + "@noBackupWarning": {}, + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "@verify": { + "type": "String", + "placeholders": {} + }, + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "@storeInSecureStorageDescription": {}, + "@openChat": {}, + "@kickUserDescription": {}, + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "@setInvitationLink": { + "type": "String", + "placeholders": {} + }, + "@pinMessage": {}, + "@screenSharingDetail": {}, + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "@invite": {}, + "@enableMultiAccounts": {}, + "@emotePacks": { + "type": "String", + "placeholders": {} + }, + "@indexedDbErrorTitle": {}, + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + } +} diff --git a/assets/l10n/intl_tr.arb b/assets/l10n/intl_tr.arb new file mode 100644 index 0000000..51ba72c --- /dev/null +++ b/assets/l10n/intl_tr.arb @@ -0,0 +1,3186 @@ +{ + "@@locale": "tr", + "@@last_modified": "2021-08-14 12:41:09.803728", + "about": "Hakkında", + "@about": { + "type": "String", + "placeholders": {} + }, + "accept": "Kabul et", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 {username} katılma davetini kabul etti", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "Hesap", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐 {username} uçtan uca şifrelemeyi etkinleştirdi", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "addEmail": "E-posta ekle", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "addToSpace": "Alana ekle", + "@addToSpace": {}, + "admin": "Yönetici", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "takma ad", + "@alias": { + "type": "String", + "placeholders": {} + }, + "all": "Tümü", + "@all": { + "type": "String", + "placeholders": {} + }, + "allChats": "Tüm sohbetler", + "@allChats": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "{senderName} aramayı yanıtladı", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "Herkes katılabilir", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "appLock": "Uygulama kilidi", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "archive": "Arşiv", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "Misafir kullanıcıların katılmasına izin veriliyor mu", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "Emin misiniz?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "areYouSureYouWantToLogout": "Oturumu açmak istediğinizden emin misiniz?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "Diğer kişiyi imzalayabilmek için lütfen güvenli depolama parolanızı veya kurtarma anahtarınızı girin.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "{username} kişisinden gelen bu doğrulama isteği kabul edilsin mi?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "autoplayImages": "Canlandırmalı çıkartmaları ve ifadeleri otomatik olarak oynat", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "badServerLoginTypesException": "Ana sunucu aşağıdaki oturum açma türlerini destekliyor:\n{serverVersions}\nAncak bu uygulama yalnızca aşağıdakileri destekliyor:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "badServerVersionsException": "Ana sunucu aşağıdaki Spec sürümlerini destekliyor:\n{serverVersions}\nAncak bu uygulama yalnızca {supportedVersions} destekliyor", + "@badServerVersionsException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "banFromChat": "Sohbetten engelle", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "Engellendi", + "@banned": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username}, {targetName} kişisini engelledi", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "Aygıtı Engelle", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "blocked": "Engellendi", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "botMessages": "Bot mesajları", + "@botMessages": { + "type": "String", + "placeholders": {} + }, + "cancel": "İptal", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "cantOpenUri": "{uri} URI'si açılamıyor", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "changeDeviceName": "Aygıt adını değiştir", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "{username} sohbet avatarını değiştirdi", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatDescriptionTo": "{username} sohbet açıklamasını değiştirdi: '{description}'", + "@changedTheChatDescriptionTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "description": { + "type": "String" + } + } + }, + "changedTheChatNameTo": "{username} sohbet adını değiştirdi: '{chatname}'", + "@changedTheChatNameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "chatname": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username} sohbet izinlerini değiştirdi", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username} görünen adını '{displayname}' olarak değiştirdi", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} misafir erişim kurallarını değiştirdi", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} misafir erişim kurallarını değiştirdi: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username} geçmiş görünürlüğünü değiştirdi", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username} geçmiş görünürlüğünü değiştirdi: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username} katılım kurallarını değiştirdi", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} katılım kurallarını değiştirdi: {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} avatarını değiştirdi", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "{username} oda takma adlarını değiştirdi", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username} davet bağlantısını değiştirdi", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changePassword": "Parolayı değiştir", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "Ana sunucuyu değiştir", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "Tarzınızı değiştirin", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "Grubun adını değiştir", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "changeYourAvatar": "Avatarınızı değiştirin", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "Şifreleme bozuldu", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "chat": "Sohbet", + "@chat": { + "type": "String", + "placeholders": {} + }, + "chatBackup": "Sohbet yedekleme", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "chatBackupDescription": "Eski mesajlarınız bir kurtarma anahtarı ile güvence altına alındı. Lütfen kaybetmediğinizden emin olun.", + "@chatBackupDescription": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Sohbet ayrıntıları", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chatHasBeenAddedToThisSpace": "Sohbet bu alana eklendi", + "@chatHasBeenAddedToThisSpace": {}, + "chats": "Sohbetler", + "@chats": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "Güçlü bir parola seçin", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "clearArchive": "Arşivi temizle", + "@clearArchive": {}, + "close": "Kapat", + "@close": { + "type": "String", + "placeholders": {} + }, + "commandHint_ban": "Verilen kullanıcıyı bu odadan yasaklayın", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_html": "HTML biçimli metin gönderin", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_invite": "Verilen kullanıcıyı bu odaya davet edin", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "commandHint_join": "Verilen odaya katılın", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_kick": "Verilen kullanıcıyı bu odadan kaldırın", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_leave": "Bu odadan ayrılın", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_me": "Kendinizi tanımlayın", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "commandHint_myroomavatar": "Bu oda için resminizi ayarlayın (mxc-uri ile)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_myroomnick": "Bu oda için görünen adınızı ayarlayın", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "commandHint_op": "Verilen kullanıcının güç seviyesini ayarlayın (öntanımlı: 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_plain": "Biçimlendirilmemiş metin gönderin", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_react": "Tepki olarak yanıt gönderin", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "commandHint_send": "Metin gönderin", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "commandHint_unban": "Verilen kullanıcının bu odadaki yasağını kaldırın", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "commandInvalid": "Komut geçersiz", + "@commandInvalid": { + "type": "String" + }, + "commandMissing": "{command} bir komut değil.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "compareEmojiMatch": "Lütfen emojileri karşılaştırın", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "Lütfen sayıları karşılaştırın", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "configureChat": "Sohbeti yapılandır", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "confirm": "Onayla", + "@confirm": { + "type": "String", + "placeholders": {} + }, + "connect": "Bağlan", + "@connect": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "Kişi gruba davet edildi", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "containsDisplayName": "Görünen ad içerir", + "@containsDisplayName": { + "type": "String", + "placeholders": {} + }, + "containsUserName": "Kullanıcı adı içerir", + "@containsUserName": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "İçerik, sunucu yöneticilerine bildirildi", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "Panoya kopyalandı", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "Kopyala", + "@copy": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "Panoya kopyala", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "Mesajın şifresi çözülemedi: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "countParticipants": "{count} katılımcı", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "create": "Oluştur", + "@create": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "💬 {username} sohbeti oluşturdu", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "createNewSpace": "Yeni alan", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "currentlyActive": "Şu anda etkin", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "Koyu", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "dateWithoutYear": "{day} {month}", + "@dateWithoutYear": { + "type": "String", + "placeholders": { + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "dateWithYear": "{day}/{month}/{year}", + "@dateWithYear": { + "type": "String", + "placeholders": { + "year": { + "type": "String" + }, + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "deactivateAccountWarning": "Bu, kullanıcı hesabınızı devre dışı bırakacak. Bu geri alınamaz! Emin misiniz?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "Yeni kullanıcılar içi öntanımlı izin seviyesi", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "delete": "Sil", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "Hesabı sil", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "Mesajı sil", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "device": "Aygıt", + "@device": { + "type": "String", + "placeholders": {} + }, + "deviceId": "Aygıt kimliği", + "@deviceId": { + "type": "String", + "placeholders": {} + }, + "devices": "Aygıtlar", + "@devices": { + "type": "String", + "placeholders": {} + }, + "directChats": "Doğrudan Sohbetler", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "Görünen ad değiştirildi", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "Dosyayı indir", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "edit": "Düzenle", + "@edit": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "Engellenen sunucuları düzenle", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "editDisplayname": "Görünen adı düzenle", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "editRoomAliases": "Oda takma adlarını düzenle", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "Oda avatarını düzenle", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "İfade zaten var!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "Geçersiz ifade kısa kodu!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emotePacks": "Oda için ifade paketleri", + "@emotePacks": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "İfade Ayarları", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "emoteShortcode": "İfade kısa kodu", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emoteWarnNeedToPick": "Bir ifade kısa kodu ve bir resim seçmeniz gerekiyor!", + "@emoteWarnNeedToPick": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "Boş sohbet", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "İfade paketini küresel olarak etkinleştir", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "Şifrelemeyi etkinleştir", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "Artık şifrelemeyi devre dışı bırakamayacaksınız. Emin misiniz?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "encrypted": "Şifreli", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "encryption": "Şifreleme", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "Şifreleme etkinleştirilmedi", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName} aramayı sonlandırdı", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "enterAnEmailAddress": "Bir e-posta adresi girin", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "enterYourHomeserver": "Ana sunucunuzu girin", + "@enterYourHomeserver": { + "type": "String", + "placeholders": {} + }, + "errorObtainingLocation": "Konum alınırken hata oluştu: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "everythingReady": "Herşey hazır!", + "@everythingReady": { + "type": "String", + "placeholders": {} + }, + "extremeOffensive": "Aşırı rahatsız edici", + "@extremeOffensive": { + "type": "String", + "placeholders": {} + }, + "fileName": "Dosya adı", + "@fileName": { + "type": "String", + "placeholders": {} + }, + "fluffychat": "FluffyChat", + "@fluffychat": { + "type": "String", + "placeholders": {} + }, + "fontSize": "Yazı tipi boyutu", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "forward": "İlet", + "@forward": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "Katılmadan", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "Davetten", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "goToTheNewRoom": "Yeni odaya git", + "@goToTheNewRoom": { + "type": "String", + "placeholders": {} + }, + "group": "Grup", + "@group": { + "type": "String", + "placeholders": {} + }, + "groupIsPublic": "Grup herkese açık", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "groups": "Gruplar", + "@groups": { + "type": "String", + "placeholders": {} + }, + "groupWith": "{displayname} ile grup", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "guestsAreForbidden": "Misafirlere izin verilmiyor", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "Misafirler katılabilir", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{username}, {targetName} için daveti geri çekti", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "help": "Yardım", + "@help": { + "type": "String", + "placeholders": {} + }, + "hideRedactedEvents": "Düzenlenmiş etkinlikleri gizle", + "@hideRedactedEvents": { + "type": "String", + "placeholders": {} + }, + "hideUnknownEvents": "Bilinmeyen etkinlikleri gizle", + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "howOffensiveIsThisContent": "Bu içerik ne kadar rahatsız edici?", + "@howOffensiveIsThisContent": { + "type": "String", + "placeholders": {} + }, + "id": "Kimlik", + "@id": { + "type": "String", + "placeholders": {} + }, + "identity": "Kimlik", + "@identity": { + "type": "String", + "placeholders": {} + }, + "ignore": "Yok say", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "ignoredUsers": "Yok sayılan kullanıcılar", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "iHaveClickedOnLink": "Bağlantıya tıkladım", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "Yanlış parola veya kurtarma anahtarı", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "inoffensive": "Rahatsız edici değil", + "@inoffensive": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "Kişi davet et", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "Kişiyi {groupName} grubuna davet et", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "invited": "Davet edildi", + "@invited": { + "type": "String", + "placeholders": {} + }, + "invitedUser": "📩 {username}, {targetName} kişisini davet etti", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "invitedUsersOnly": "Sadece davet edilen kullanıcılar", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "inviteForMe": "Benim için davet et", + "@inviteForMe": { + "type": "String", + "placeholders": {} + }, + "inviteText": "{username} sizi FluffyChat'e davet etti.\n1. fluffychat.im adresini ziyaret edin ve uygulamayı kurun \n2. Kaydolun veya oturum açın \n3. Davet bağlantısını açın: \n {link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "isTyping": "yazıyor…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "👋 {username} sohbete katıldı", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "joinRoom": "Odaya katıl", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "kicked": "👞 {username}, {targetName} kişisini attı", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickedAndBanned": "🙅 {username}, {targetName} kişisini attı ve engelledi", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickFromChat": "Sohbetten at", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "Son görülen: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "leave": "Ayrıl", + "@leave": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "Sohbetten ayrıldı", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "license": "Lisans", + "@license": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "Açık", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "{count} katılımcı daha yükle", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "loadingPleaseWait": "Yükleniyor… Lütfen bekleyin.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "loadMore": "Daha fazla yükle…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "locationDisabledNotice": "Konum hizmetleri devre dışı. Lütfen konumunuzu paylaşabilmek için etkinleştirin.", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "locationPermissionDeniedNotice": "Konum izni reddedildi. Lütfen konumunuzu paylaşabilmek için izin verin.", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "login": "Oturum aç", + "@login": { + "type": "String", + "placeholders": {} + }, + "logInTo": "{homeserver} üzerinde oturum aç", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "logout": "Oturumu kapat", + "@logout": { + "type": "String", + "placeholders": {} + }, + "memberChanges": "Üye değişiklikleri", + "@memberChanges": { + "type": "String", + "placeholders": {} + }, + "mention": "Bahset", + "@mention": { + "type": "String", + "placeholders": {} + }, + "messages": "Mesajlar", + "@messages": { + "type": "String", + "placeholders": {} + }, + "moderator": "Moderatör", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "muteChat": "Sohbeti sessize al", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "needPantalaimonWarning": "Uçtan uca şifreleme kullanmak için şimdilik Pantalaimon'a ihtiyacınız olduğunu lütfen unutmayın.", + "@needPantalaimonWarning": { + "type": "String", + "placeholders": {} + }, + "newChat": "Yeni sohbet", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "💬 FluffyChat'te yeni mesaj", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "Yeni doğrulama isteği!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "next": "İleri", + "@next": { + "type": "String", + "placeholders": {} + }, + "no": "Hayır", + "@no": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "Sunucuyla bağlantı yok", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "İfade bulunamadı. 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "Şifrelemeyi yalnızca oda artık herkese açık olmadığında etkinleştirebilirsiniz.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "Görünüşe göre cihazınızda Firebase Cloud Messaging yok. Buna rağmen bildirim almaya devam etmek için ntfy yüklemenizi öneriyoruz. ntfy veya başka bir Unified Push sağlayıcısı ile anlık bildirimlerinizi güvenli bir şekilde alabilirsiniz. ntfy'ı PlayStore veya F-Droid'den indirebilirsiniz.", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "noMatrixServer": "{server1} matrix sunucusu değil, onun yerine {server2} kullanılsın mı?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "none": "Yok", + "@none": { + "type": "String", + "placeholders": {} + }, + "noPasswordRecoveryDescription": "Henüz parolanızı kurtarmak için bir yol eklemediniz.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "noPermission": "İzin yok", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "Oda bulunamadı…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "notifications": "Bildirimler", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "notificationsEnabledForThisAccount": "Bu hesap için bildirimler etkinleştirildi", + "@notificationsEnabledForThisAccount": { + "type": "String", + "placeholders": {} + }, + "numUsersTyping": "{count} kullanıcı yazıyor…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "obtainingLocation": "Konum alınıyor…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "offensive": "Rahatsız edici", + "@offensive": { + "type": "String", + "placeholders": {} + }, + "offline": "Çevrim dışı", + "@offline": { + "type": "String", + "placeholders": {} + }, + "ok": "Tamam", + "@ok": { + "type": "String", + "placeholders": {} + }, + "online": "Çevrim içi", + "@online": { + "type": "String", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "Çevrim içi anahtar yedekleme etkinleştirildi", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "oopsPushError": "Tüh! Maalesef anlık bildirimlerini ayarlarken bir hata oluştu.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "Tüh, bir şeyler yanlış gitti…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "Mesajları okumak için uygulamayı aç", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "openCamera": "Kamerayı aç", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "openInMaps": "Haritalarda aç", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "or": "Veya", + "@or": { + "type": "String", + "placeholders": {} + }, + "participant": "Katılımcı", + "@participant": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "parola veya kurtarma anahtarı", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "password": "Parola", + "@password": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "Parola unutuldu", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "Parola değiştirildi", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "passwordRecovery": "Parola kurtarma", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "people": "İnsanlar", + "@people": { + "type": "String", + "placeholders": {} + }, + "pickImage": "Bir resim seç", + "@pickImage": { + "type": "String", + "placeholders": {} + }, + "pin": "Sabitle", + "@pin": { + "type": "String", + "placeholders": {} + }, + "play": "{fileName} dosyasını oynat", + "@play": { + "type": "String", + "placeholders": { + "fileName": { + "type": "String" + } + } + }, + "pleaseChoose": "Lütfen seçin", + "@pleaseChoose": { + "type": "String", + "placeholders": {} + }, + "pleaseChooseAPasscode": "Lütfen bir geçiş kodu seçin", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "pleaseClickOnLink": "Lütfen e-postadaki bağlantıya tıklayın ve devam edin.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "pleaseEnter4Digits": "Lütfen 4 basamak girin veya uygulama kilidini devre dışı bırakmak için boş bırakın.", + "@pleaseEnter4Digits": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPassword": "Lütfen parolanızı girin", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPin": "Lütfen PIN kodunuzu girin", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "Lütfen kullanıcı adınızı girin", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "Lütfen web sitesindeki talimatları izleyin ve \"İleri\" düğmesine dokunun.", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "privacy": "Gizlilik", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "Herkese Açık Odalar", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "pushRules": "Gönderme kuralları", + "@pushRules": { + "type": "String", + "placeholders": {} + }, + "reason": "Neden", + "@reason": { + "type": "String", + "placeholders": {} + }, + "recording": "Kaydediliyor", + "@recording": { + "type": "String", + "placeholders": {} + }, + "redactedAnEvent": "{username} bir etkinliği düzenledi", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "redactMessage": "Mesajı düzenle", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "register": "Kaydol", + "@register": { + "type": "String", + "placeholders": {} + }, + "reject": "Reddet", + "@reject": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "{username} daveti reddetti", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "rejoin": "Yeniden katıl", + "@rejoin": { + "type": "String", + "placeholders": {} + }, + "remove": "Kaldır", + "@remove": { + "type": "String", + "placeholders": {} + }, + "removeAllOtherDevices": "Diğer tüm aygıtları kaldır", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "removedBy": "{username} tarafından kaldırıldı", + "@removedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "removeDevice": "Aygıtı kaldır", + "@removeDevice": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "Sohbet engelini kaldır", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "removeYourAvatar": "Avatarınızı kaldırın", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "renderRichContent": "Zengin mesaj içeriğini görüntüle", + "@renderRichContent": { + "type": "String", + "placeholders": {} + }, + "replaceRoomWithNewerVersion": "Odayı yeni sürümle değiştir", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "reply": "Yanıtla", + "@reply": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "Mesajı bildir", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "requestPermission": "İzin iste", + "@requestPermission": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "Oda yükseltildi", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "Oda sürümü", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "saveFile": "Dosyayı kaydet", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "search": "Ara", + "@search": { + "type": "String", + "placeholders": {} + }, + "security": "Güvenlik", + "@security": { + "type": "String", + "placeholders": {} + }, + "seenByUser": "{username} tarafından görüldü", + "@seenByUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "send": "Gönder", + "@send": { + "type": "String", + "placeholders": {} + }, + "sendAMessage": "Bir mesaj gönder", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "sendAsText": "Metin olarak gönder", + "@sendAsText": { + "type": "String" + }, + "sendAudio": "Ses gönder", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendFile": "Dosya gönder", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendImage": "Resim gönder", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendMessages": "Mesajları gönder", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "sendOriginal": "Orijinali gönder", + "@sendOriginal": { + "type": "String", + "placeholders": {} + }, + "sendSticker": "Çıkartma gönder", + "@sendSticker": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "Video gönder", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "sentAFile": "📁 {username} bir dosya gönderdi", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAnAudio": "🎤 {username} bir ses gönderdi", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAPicture": "🖼️ {username} bir resim gönderdi", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentASticker": "😊 {username} bir çıkartma gönderdi", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "🎥 {username} bir video gönderdi", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentCallInformations": "{senderName} arama bilgilerini gönderdi", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "setAsCanonicalAlias": "Ana takma ad olarak ayarla", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "setCustomEmotes": "Özel ifadeler ayarla", + "@setCustomEmotes": { + "type": "String", + "placeholders": {} + }, + "setInvitationLink": "Davet bağlantısı ayarla", + "@setInvitationLink": { + "type": "String", + "placeholders": {} + }, + "setPermissionsLevel": "İzin seviyesini ayarla", + "@setPermissionsLevel": { + "type": "String", + "placeholders": {} + }, + "setStatus": "Durumu ayarla", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "settings": "Ayarlar", + "@settings": { + "type": "String", + "placeholders": {} + }, + "share": "Paylaş", + "@share": { + "type": "String", + "placeholders": {} + }, + "sharedTheLocation": "{username} konumunu paylaştı", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "shareLocation": "Konumu paylaş", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "showPassword": "Parolayı göster", + "@showPassword": { + "type": "String", + "placeholders": {} + }, + "singlesignon": "Tek oturum açma", + "@singlesignon": { + "type": "String", + "placeholders": {} + }, + "skip": "Atla", + "@skip": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "Kaynak kodları", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "spaceIsPublic": "Alan herkese açık", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "spaceName": "Alan adı", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "startedACall": "{senderName} bir arama başlattı", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "status": "Durum", + "@status": { + "type": "String", + "placeholders": {} + }, + "statusExampleMessage": "Bugün nasılsınız?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "submit": "Gönder", + "@submit": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWait": "Eşzamanlanıyor… Lütfen bekleyin.", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "systemTheme": "Sistem", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "Eşleşmediler", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "Eşleştiler", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "title": "FluffyChat", + "@title": { + "description": "Title for the application", + "type": "String", + "placeholders": {} + }, + "toggleFavorite": "Sık Kullanılanlara Ekle/Çıkar", + "@toggleFavorite": { + "type": "String", + "placeholders": {} + }, + "toggleMuted": "Sessize Al/Sessizden Çıkar", + "@toggleMuted": { + "type": "String", + "placeholders": {} + }, + "toggleUnread": "Okundu/Okunmadı Olarak İşaretle", + "@toggleUnread": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "Çok fazla istek. Lütfen daha sonra tekrar deneyin!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "transferFromAnotherDevice": "Başka bir aygıttan aktar", + "@transferFromAnotherDevice": { + "type": "String", + "placeholders": {} + }, + "tryToSendAgain": "Tekrar göndermeyi deneyin", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "unavailable": "Yok", + "@unavailable": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username}, {targetName} kişisinin engelini kaldırdı", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "unblockDevice": "Aygıtın Engellemesini Kaldır", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "Bilinmeyen aygıt", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "unknownEncryptionAlgorithm": "Bilinmeyen şifreleme algoritması", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unknownEvent": "Bilinmeyen etkinlik '{type}'", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "unmuteChat": "Sohbeti sessizden çıkar", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "unpin": "Sabitlemeyi kaldır", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "unreadChats": "{unreadCount, plural, =1{1 okunmamış sohbet} other{{unreadCount} okunmamış sohbet}}", + "@unreadChats": { + "type": "String", + "placeholders": { + "unreadCount": { + "type": "int" + } + } + }, + "userAndOthersAreTyping": "{username} ve {count} diğer kişi yazıyor…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "userAndUserAreTyping": "{username} ve {username2} yazıyor…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userIsTyping": "{username} yazıyor…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userLeftTheChat": "🚪 {username} sohbetten ayrıldı", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "username": "Kullanıcı adı", + "@username": { + "type": "String", + "placeholders": {} + }, + "userSentUnknownEvent": "{username} bir {type} etkinliği gönderdi", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "verified": "Doğrulandı", + "@verified": { + "type": "String", + "placeholders": {} + }, + "verify": "Doğrula", + "@verify": { + "type": "String", + "placeholders": {} + }, + "verifyStart": "Doğrulamayı Başlat", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "Başarıyla doğrulandı!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "verifyTitle": "Diğer hesap doğrulanıyor", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "videoCall": "Görüntülü arama", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "Sohbet geçmişi görünürlüğü", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "Tüm katılımcılar için görünür", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "Herkes için görünür", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "Sesli mesaj", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "Ortağın isteği kabul etmesi bekleniyor…", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "Ortağın emojiyi kabul etmesi bekleniyor…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "Ortağın numaraları kabul etmesi bekleniyor…", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "wallpaper": "Duvar kağıdı:", + "@wallpaper": { + "type": "String", + "placeholders": {} + }, + "warning": "Uyarı!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "weSentYouAnEmail": "Size bir e-posta gönderdik", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "whoCanPerformWhichAction": "Kim hangi eylemi gerçekleştirebilir", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "Bu gruba kimler katılabilir", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "Bunu neden bildirmek istiyorsunuz?", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "wipeChatBackup": "Yeni bir kurtarma anahtarı oluşturmak için sohbet yedeğiniz silinsin mi?", + "@wipeChatBackup": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "Bu adresler ile parolanızı kurtarabilirsiniz.", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "Bir mesaj yaz…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "yes": "Evet", + "@yes": { + "type": "String", + "placeholders": {} + }, + "you": "Sen", + "@you": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "Artık bu sohbette katılımcı değilsiniz", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "Bu sohbetten engellendiniz", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "yourPublicKey": "Ortak anahtarınız", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "scanQrCode": "QR kodunu tarayın", + "@scanQrCode": {}, + "sendOnEnter": "Enter tuşu ile gönder", + "@sendOnEnter": {}, + "homeserver": "Ana sunucu", + "@homeserver": {}, + "serverRequiresEmail": "Bu sunucunun kayıt için e-posta adresinizi doğrulaması gerekiyor.", + "@serverRequiresEmail": {}, + "enableMultiAccounts": "(BETA) Bu aygıtta çoklu hesapları etkinleştir", + "@enableMultiAccounts": {}, + "bundleName": "Paket adı", + "@bundleName": {}, + "removeFromBundle": "Bu paketten kaldır", + "@removeFromBundle": {}, + "addToBundle": "Pakete ekle", + "@addToBundle": {}, + "editBundlesForAccount": "Bu hesap için paketleri düzenle", + "@editBundlesForAccount": {}, + "addAccount": "Hesap ekle", + "@addAccount": {}, + "oneClientLoggedOut": "İstemcilerinizden birinin oturumu kapatıldı", + "@oneClientLoggedOut": {}, + "link": "Bağlantı", + "@link": {}, + "yourChatBackupHasBeenSetUp": "Sohbet yedeklemeniz ayarlandı.", + "@yourChatBackupHasBeenSetUp": {}, + "unverified": "Doğrulanmadı", + "@unverified": {}, + "repeatPassword": "Parolayı tekrarlayın", + "@repeatPassword": {}, + "messageInfo": "Mesaj bilgileri", + "@messageInfo": {}, + "time": "Zaman", + "@time": {}, + "messageType": "Mesaj Türü", + "@messageType": {}, + "sender": "Gönderen", + "@sender": {}, + "openGallery": "Galeriyi aç", + "@openGallery": {}, + "removeFromSpace": "Alandan kaldır", + "@removeFromSpace": {}, + "addToSpaceDescription": "Bu sohbeti eklemek için bir alan seçin.", + "@addToSpaceDescription": {}, + "start": "Başla", + "@start": {}, + "commandHint_clearcache": "Önbelleği temizleyin", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_dm": "Doğrudan sohbet başlatın\nŞifrelemeyi devre dışı bırakmak için --no-encryption kullanın", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "commandHint_create": "Boş bir grup sohbeti oluşturun\nŞifrelemeyi devre dışı bırakmak için --no-encryption kullanın", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "commandHint_discardsession": "Oturumu silin", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "openVideoCamera": "Bir video için kamerayı aç", + "@openVideoCamera": { + "type": "String", + "placeholders": {} + }, + "publish": "Yayınla", + "@publish": {}, + "videoWithSize": "Video ({size})", + "@videoWithSize": { + "type": "String", + "placeholders": { + "size": { + "type": "String" + } + } + }, + "dismiss": "Kapat", + "@dismiss": {}, + "markAsRead": "Okundu olarak işaretle", + "@markAsRead": {}, + "reportUser": "Kullanıcıyı bildir", + "@reportUser": {}, + "openChat": "Sohbeti Aç", + "@openChat": {}, + "reactedWith": "{sender}, {reaction} ile tepki verdi", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "emojis": "Emojiler", + "@emojis": {}, + "placeCall": "Arama yap", + "@placeCall": {}, + "voiceCall": "Sesli arama", + "@voiceCall": {}, + "unsupportedAndroidVersion": "Desteklenmeyen Android sürümü", + "@unsupportedAndroidVersion": {}, + "unsupportedAndroidVersionLong": "Bu özellik daha yeni bir Android sürümü gerektiriyor. Lütfen güncellemelere veya LineageOS desteğine bakın.", + "@unsupportedAndroidVersionLong": {}, + "pinMessage": "Odaya sabitle", + "@pinMessage": {}, + "confirmEventUnpin": "Etkinliğin sabitlemesini kalıcı olarak kaldırmak istediğinizden emin misiniz?", + "@confirmEventUnpin": {}, + "videoCallsBetaWarning": "Görüntülü aramaların şu anda beta aşamasında olduğunu lütfen unutmayın. Tüm platformlarda beklendiği gibi veya hiç çalışmayabilirler.", + "@videoCallsBetaWarning": {}, + "experimentalVideoCalls": "Deneysel görüntülü aramalar", + "@experimentalVideoCalls": {}, + "emailOrUsername": "E-posta veya kullanıcı adı", + "@emailOrUsername": {}, + "switchToAccount": "{number}. hesaba geç", + "@switchToAccount": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "nextAccount": "Sonraki hesap", + "@nextAccount": {}, + "previousAccount": "Önceki hesap", + "@previousAccount": {}, + "widgetJitsi": "Jitsi Meet", + "@widgetJitsi": {}, + "widgetCustom": "Özel", + "@widgetCustom": {}, + "widgetUrlError": "Bu geçerli bir URL değil.", + "@widgetUrlError": {}, + "widgetNameError": "Lütfen görünecek bir ad girin.", + "@widgetNameError": {}, + "errorAddingWidget": "Widget eklenirken hata oluştu.", + "@errorAddingWidget": {}, + "widgetVideo": "Video", + "@widgetVideo": {}, + "addWidget": "Widget ekle", + "@addWidget": {}, + "widgetEtherpad": "Metin notu", + "@widgetEtherpad": {}, + "widgetName": "Ad", + "@widgetName": {}, + "separateChatTypes": "Doğrudan Sohbetleri ve Grupları Ayır", + "@separateChatTypes": { + "type": "String", + "placeholders": {} + }, + "youJoinedTheChat": "Sohbete katıldınız", + "@youJoinedTheChat": {}, + "youAcceptedTheInvitation": "👍 Daveti kabul ettiniz", + "@youAcceptedTheInvitation": {}, + "youKickedAndBanned": "🙅 {user} kullanıcısını attınız ve yasakladınız", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youUnbannedUser": "{user} kullanıcısının yasağını kaldırdınız", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKicked": "👞 {user} kullanıcısını attınız", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youRejectedTheInvitation": "Daveti reddettiniz", + "@youRejectedTheInvitation": {}, + "youHaveWithdrawnTheInvitationFor": "{user} için daveti geri çektiniz", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedBy": "📩 {user} tarafından davet edildiniz", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedUser": "📩 {user} kullanıcısını davet ettiniz", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youBannedUser": "{user} kullanıcısını yasakladınız", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "storeInAppleKeyChain": "Apple KeyChain'de sakla", + "@storeInAppleKeyChain": {}, + "pleaseEnterRecoveryKey": "Lütfen kurtarma anahtarınızı girin:", + "@pleaseEnterRecoveryKey": {}, + "recoveryKeyLost": "Kurtarma anahtarı kayıp mı?", + "@recoveryKeyLost": {}, + "pleaseEnterRecoveryKeyDescription": "Eski mesajlarınızın kilidini açmak için lütfen önceki bir oturumda oluşturulan kurtarma anahtarınızı girin. Kurtarma anahtarınız parolanız DEĞİLDİR.", + "@pleaseEnterRecoveryKeyDescription": {}, + "users": "Kullanıcılar", + "@users": {}, + "storeInSecureStorageDescription": "Kurtarma anahtarını bu aygıtın güvenli deposunda saklayın.", + "@storeInSecureStorageDescription": {}, + "recoveryKey": "Kurtarma anahtarı", + "@recoveryKey": {}, + "storeInAndroidKeystore": "Android KeyStore'da sakla", + "@storeInAndroidKeystore": {}, + "unlockOldMessages": "Eski mesajların kilidini aç", + "@unlockOldMessages": {}, + "saveKeyManuallyDescription": "Sistem paylaşımı iletişim kutusunu veya panoyu tetikleyerek bu anahtarı elle kaydedin.", + "@saveKeyManuallyDescription": {}, + "storeSecurlyOnThisDevice": "Bu aygıtta güvenli bir şekilde sakla", + "@storeSecurlyOnThisDevice": {}, + "countFiles": "{count} dosya", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "dehydrate": "Oturumu dışa aktar ve aygıtı sil", + "@dehydrate": {}, + "dehydrateTorLong": "TOR kullanıcıları için, pencereyi kapatmadan önce oturumu dışa aktarmaları tavsiye edilir.", + "@dehydrateTorLong": {}, + "dehydrateTor": "TOR Kullanıcıları: Oturumu dışa aktar", + "@dehydrateTor": {}, + "hydrateTor": "TOR Kullanıcıları: Dışa aktarılan oturumu içe aktar", + "@hydrateTor": {}, + "hydrate": "Yedekleme dosyasından geri yükle", + "@hydrate": {}, + "indexedDbErrorTitle": "Gizli mod sorunları", + "@indexedDbErrorTitle": {}, + "dehydrateWarning": "Bu eylem geri alınamaz. Yedekleme dosyasını güvenli bir şekilde sakladığınızdan emin olun.", + "@dehydrateWarning": {}, + "hydrateTorLong": "TOR'da en son oturumunuzu dışa aktardınız mı? Hızlıca içe aktarın ve sohbete devam edin.", + "@hydrateTorLong": {}, + "indexedDbErrorLong": "Mesaj saklama özelliği ne yazık ki öntanımlı olarak gizli modda etkin değildir.\nLütfen\n - about:config sayfasına gidin ve\n - dom.indexedDB.privateBrowsing.enabled seçeneğini true olarak ayarlayın\nAksi takdirde FluffyChat çalıştırılamaz.", + "@indexedDbErrorLong": {}, + "user": "Kullanıcı", + "@user": {}, + "custom": "Özel", + "@custom": {}, + "confirmMatrixId": "Hesabınızı silmek için lütfen Matrix kimliğinizi doğrulayın.", + "@confirmMatrixId": {}, + "supposedMxid": "Bu {mxid} olmalıdır", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "commandHint_markasgroup": "Grup olarak işaretle", + "@commandHint_markasgroup": {}, + "commandHint_markasdm": "Verilen Matrix kimliği için doğrudan mesaj odası olarak işaretle", + "@commandHint_markasdm": {}, + "whyIsThisMessageEncrypted": "Bu mesaj neden okunamıyor?", + "@whyIsThisMessageEncrypted": {}, + "noKeyForThisMessage": "Bu durum, mesaj siz bu aygıtta hesabınızda oturum açmadan önce gönderildiyse meydana gelebilir.\n\nGönderenin aygıtınızı engellemiş olması veya internet bağlantısında bir sorun olması da mümkündür.\n\nMesajı başka bir oturumda okuyabiliyor musunuz? O zaman mesajı oradan aktarabilirsiniz! Ayarlar > Aygıtlar bölümüne gidin ve aygıtlarınızın birbirini doğruladığından emin olun. Odayı bir sonraki sefer açtığınızda ve her iki oturum da ön planda olduğunda, anahtarlar otomatik olarak iletilecektir.\n\nOturumu kapatırken veya aygıt değiştirirken anahtarları kaybetmek istemiyor musunuz? Ayarlarda sohbet yedeklemesini etkinleştirdiğinizden emin olun.", + "@noKeyForThisMessage": {}, + "screenSharingTitle": "ekran paylaşımı", + "@screenSharingTitle": {}, + "callingPermissions": "Arama izinleri", + "@callingPermissions": {}, + "callingAccountDetails": "FluffyChat'in yerel android telefon uygulamasını kullanmasına izin verir.", + "@callingAccountDetails": {}, + "appearOnTop": "Üstte görün", + "@appearOnTop": {}, + "enterSpace": "Alana gir", + "@enterSpace": {}, + "enterRoom": "Odaya gir", + "@enterRoom": {}, + "allSpaces": "Tüm alanlar", + "@allSpaces": {}, + "otherCallingPermissions": "Mikrofon, kamera ve diğer FluffyChat izinleri", + "@otherCallingPermissions": {}, + "foregroundServiceRunning": "Bu bildirim, ön plan hizmeti çalışırken görünür.", + "@foregroundServiceRunning": {}, + "callingAccount": "Arama hesabı", + "@callingAccount": {}, + "appearOnTopDetails": "Uygulamanın üstte görünmesine izin verir (Fluffychat'ı zaten bir arama hesabı olarak ayarladıysanız gerekli değildir)", + "@appearOnTopDetails": {}, + "newGroup": "Yeni grup", + "@newGroup": {}, + "newSpace": "Yeni alan", + "@newSpace": {}, + "screenSharingDetail": "Ekranınızı FuffyChat'te paylaşıyorsunuz", + "@screenSharingDetail": {}, + "numChats": "{number} sohbet", + "@numChats": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "hideUnimportantStateEvents": "Önemsiz durum etkinliklerini gizle", + "@hideUnimportantStateEvents": {}, + "doNotShowAgain": "Tekrar gösterme", + "@doNotShowAgain": {}, + "googlyEyesContent": "{senderName} size şaşkın gözler gönderiyor", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "commandHint_cuddle": "Kucaklama gönder", + "@commandHint_cuddle": {}, + "commandHint_googly": "Şaşkın gözler gönder", + "@commandHint_googly": {}, + "commandHint_hug": "Sarılma gönder", + "@commandHint_hug": {}, + "cuddleContent": "{senderName} sizi kucaklıyor", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "hugContent": "{senderName} size sarılıyor", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "wasDirectChatDisplayName": "Boş sohbet ({oldDisplayName} idi)", + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "startFirstChat": "İlk sohbetinizi başlatın", + "@startFirstChat": {}, + "newSpaceDescription": "Alanlar, sohbetlerinizi birleştirmenize ve özel veya genel topluluklar oluşturmanıza olanak tanır.", + "@newSpaceDescription": {}, + "encryptThisChat": "Bu sohbeti şifrele", + "@encryptThisChat": {}, + "disableEncryptionWarning": "Güvenlik nedeniyle, daha önce etkinleştirildiği bir sohbette şifrelemeyi devre dışı bırakamazsınız.", + "@disableEncryptionWarning": {}, + "sorryThatsNotPossible": "Üzgünüm... bu mümkün değil", + "@sorryThatsNotPossible": {}, + "deviceKeys": "Aygıt anahtarları:", + "@deviceKeys": {}, + "reopenChat": "Sohbeti yeniden aç", + "@reopenChat": {}, + "noBackupWarning": "Uyarı! Sohbet yedeklemesini etkinleştirmezseniz, şifrelenen mesajlarınıza erişiminizi kaybedersiniz. Oturumu kapatmadan önce sohbet yedeklemesini etkinleştirmeniz önemle tavsiye edilir.", + "@noBackupWarning": {}, + "noOtherDevicesFound": "Başka aygıt bulunamadı", + "@noOtherDevicesFound": {}, + "fileIsTooBigForServer": "Gönderilemiyor! Sunucu yalnızca {max} değerine kadar olan ekleri destekliyor.", + "@fileIsTooBigForServer": {}, + "fileHasBeenSavedAt": "Dosya {path} konumuna kaydedildi", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "jumpToLastReadMessage": "Son okunan mesaja atla", + "@jumpToLastReadMessage": {}, + "readUpToHere": "Buraya kadar oku", + "@readUpToHere": {}, + "jump": "Atla", + "@jump": {}, + "openLinkInBrowser": "Bağlantıyı tarayıcıda aç", + "@openLinkInBrowser": {}, + "allRooms": "Tüm Grup Sohbetleri", + "@allRooms": { + "type": "String", + "placeholders": {} + }, + "reportErrorDescription": "😭 Olamaz. Bir şeyler yanlış gitti. İsterseniz bu hatayı geliştiricilere bildirebilirsiniz.", + "@reportErrorDescription": {}, + "report": "bildir", + "@report": {}, + "signInWithPassword": "Parola ile oturum aç", + "@signInWithPassword": {}, + "pleaseTryAgainLaterOrChooseDifferentServer": "Lütfen daha sonra tekrar deneyin veya farklı bir sunucu seçin.", + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "signInWith": "{provider} ile oturum aç", + "@signInWith": { + "type": "String", + "placeholders": { + "provider": { + "type": "String" + } + } + }, + "notAnImage": "Bir resim dosyası değil.", + "@notAnImage": {}, + "importNow": "Şimdi içe aktar", + "@importNow": {}, + "importEmojis": "İfadeleri İçe Aktar", + "@importEmojis": {}, + "importFromZipFile": ".zip dosyasından içe aktar", + "@importFromZipFile": {}, + "exportEmotePack": "İfade paketini .zip olarak dışa aktar", + "@exportEmotePack": {}, + "replace": "Değiştir", + "@replace": {}, + "sendTypingNotifications": "Yazma bildirimleri gönder", + "@sendTypingNotifications": {}, + "messagesStyle": "Mesajlar:", + "@messagesStyle": {}, + "createGroup": "Grup oluştur", + "@createGroup": {}, + "shareInviteLink": "Davet bağlantısını paylaş", + "@shareInviteLink": {}, + "profileNotFound": "Kullanıcı sunucuda bulunamadı. Belki bir bağlantı sorunu vardır veya kullanıcı mevcut değildir.", + "@profileNotFound": {}, + "setTheme": "Temayı ayarla:", + "@setTheme": {}, + "setColorTheme": "Renk temasını ayarla:", + "@setColorTheme": {}, + "inviteContactToGroupQuestion": "{contact} kişisini \"{groupName}\" sohbetine davet etmek istiyor musunuz?", + "@inviteContactToGroupQuestion": {}, + "tryAgain": "Tekrar deneyin", + "@tryAgain": {}, + "redactMessageDescription": "Bu mesaj bu görüşmedeki herkes için düzenlenecek. Bu işlem geri alınamaz.", + "@redactMessageDescription": {}, + "optionalRedactReason": "(İsteğe bağlı) Bu mesajı düzenleme nedeni…", + "@optionalRedactReason": {}, + "invite": "Davet et", + "@invite": {}, + "addChatDescription": "Sohbet açıklaması ekle...", + "@addChatDescription": {}, + "chatPermissions": "Sohbet izinleri", + "@chatPermissions": {}, + "chatDescription": "Sohbet açıklaması", + "@chatDescription": {}, + "noChatDescriptionYet": "Daha sohbet açıklaması oluşturulmadı.", + "@noChatDescriptionYet": {}, + "invalidServerName": "Geçersiz sunucu adı", + "@invalidServerName": {}, + "redactedBy": "{username} tarafından düzenlendi", + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "redactedByBecause": "{username} tarafından \"{reason}\" nedeniyle düzenlendi", + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "setChatDescription": "Sohbet açıklamasını ayarla", + "@setChatDescription": {}, + "chatDescriptionHasBeenChanged": "Sohbet açıklaması değişti", + "@chatDescriptionHasBeenChanged": {}, + "directChat": "Doğrudan sohbet", + "@directChat": {}, + "inviteGroupChat": "📨 Grup sohbetine davet et", + "@inviteGroupChat": {}, + "invitePrivateChat": "📨 Gizli sohbete davet et", + "@invitePrivateChat": {}, + "emoteKeyboardNoRecents": "Son kullanılan ifadeler burada görünecek...", + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "invalidInput": "Geçersiz giriş!", + "@invalidInput": {}, + "wrongPinEntered": "Yanlış PIN girildi! {seconds} saniye sonra tekrar deneyin...", + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "banUserDescription": "Kullanıcı sohbetten yasaklanacak ve yasağı kaldırılana kadar sohbete tekrar giremeyecek.", + "@banUserDescription": {}, + "removeDevicesDescription": "Bu aygıttan çıkış yapacaksınız ve artık mesaj alamayacaksınız.", + "@removeDevicesDescription": {}, + "unbanUserDescription": "Kullanıcı denerse sohbete tekrar girebilecektir.", + "@unbanUserDescription": {}, + "pushNotificationsNotAvailable": "Anlık bildirimler kullanılamıyor", + "@pushNotificationsNotAvailable": {}, + "makeAdminDescription": "Bu kullanıcıyı yönetici yaptıktan sonra, sizinle aynı izinlere sahip olacağı için bunu geri alamayabilirsiniz.", + "@makeAdminDescription": {}, + "archiveRoomDescription": "Sohbet arşive taşınacak. Diğer kullanıcıları sohbeti terk ettiğinizi görebilecek.", + "@archiveRoomDescription": {}, + "hasKnocked": "🚪 {user} tıklattı", + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "learnMore": "Daha fazla bilgi", + "@learnMore": {}, + "roomUpgradeDescription": "Sohbet daha sonra yeni oda sürümüyle yeniden oluşturulacaktır. Tüm katılımcılara yeni sohbete geçmeleri gerektiği bildirilecektir. Oda sürümleri hakkında daha fazla bilgiyi https://spec.matrix.org/latest/rooms/ adresinde bulabilirsiniz.", + "@roomUpgradeDescription": {}, + "pleaseEnterANumber": "Lütfen 0'dan büyük bir sayı girin", + "@pleaseEnterANumber": {}, + "kickUserDescription": "Kullanıcı sohbetten atılır ancak yasaklanmaz. Herkese açık sohbetlerde kullanıcı istediği zaman yeniden katılabilir.", + "@kickUserDescription": {}, + "createGroupAndInviteUsers": "Bir grup oluşturun ve kullanıcıları davet edin", + "@createGroupAndInviteUsers": {}, + "groupCanBeFoundViaSearch": "Grup, arama ile bulunabilir", + "@groupCanBeFoundViaSearch": {}, + "noUsersFoundWithQuery": "Ne yazık ki \"{query}\" ile kullanıcı bulunamadı. Lütfen bir yazım hatası yapıp yapmadığınızı kontrol edin.", + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "yourGlobalUserIdIs": "Genel kullanıcı kimliğiniz: ", + "@yourGlobalUserIdIs": {}, + "groupName": "Grup ismi", + "@groupName": {}, + "searchChatsRooms": "#sohbetler, @kullanıcılar... için arama yapın", + "@searchChatsRooms": {}, + "blockListDescription": "Sizi rahatsız eden kullanıcıları engelleyebilirsiniz. Kişisel engelleme listenizdeki kullanıcılardan herhangi bir mesaj veya oda daveti alamazsınız.", + "@blockListDescription": {}, + "startConversation": "Görüşme başlat", + "@startConversation": {}, + "blockedUsers": "Engellenen kullanıcılar", + "@blockedUsers": {}, + "block": "Engelle", + "@block": {}, + "commandHint_sendraw": "Ham JSON gönder", + "@commandHint_sendraw": {}, + "wrongRecoveryKey": "Üzgünüm... bu doğru kurtarma anahtarı gibi görünmüyor.", + "@wrongRecoveryKey": {}, + "blockUsername": "Kullanıcı adını görmezden gel", + "@blockUsername": {}, + "databaseMigrationTitle": "Veri tabanı iyileştirildi", + "@databaseMigrationTitle": {}, + "databaseMigrationBody": "Lütfen bekleyin. Bu biraz zaman alabilir.", + "@databaseMigrationBody": {}, + "youInvitedToBy": "📩 Bağlantı aracılığıyla davet edildiniz:\n{alias}", + "@youInvitedToBy": { + "placeholders": { + "alias": { + "type": "String" + } + } + }, + "pleaseEnterYourCurrentPassword": "Lütfen geçerli parolanızı girin", + "@pleaseEnterYourCurrentPassword": {}, + "pleaseChooseAStrongPassword": "Lütfen güçlü bir parola seçin", + "@pleaseChooseAStrongPassword": {}, + "addChatOrSubSpace": "Sohbet veya alt alan ekle", + "@addChatOrSubSpace": {}, + "canceledKeyVerification": "{sender} anahtar doğrulamayı iptal etti", + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "publicLink": "Herkese açık bağlantı", + "@publicLink": {}, + "joinSpace": "Alana katıl", + "@joinSpace": {}, + "newPassword": "Yeni parola", + "@newPassword": {}, + "databaseBuildErrorBody": "SQlite veri tabanı oluşturulamadı. Uygulama şimdilik eski veri tabanını kullanmaya çalışıyor. Lütfen bu hatayı {url} adresinde geliştiricilere bildirin. Hata mesajı: {error}", + "@databaseBuildErrorBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "sessionLostBody": "Oturumunuz kayboldu. Lütfen bu hatayı {url} adresinde geliştiricilere bildirin. Hata mesajı: {error}", + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "subspace": "Alt alan", + "@subspace": {}, + "thisDevice": "Bu aygıt:", + "@thisDevice": {}, + "formattedMessagesDescription": "Markdown kullanarak kalın metin gibi zengin mesaj içeriğini görüntüle.", + "@formattedMessagesDescription": {}, + "verifyOtherDevice": "🔐 Diğer aygıtı doğrula", + "@verifyOtherDevice": {}, + "presencesToggle": "Diğer kullanıcıların durum mesajlarını göster", + "@presencesToggle": { + "type": "String", + "placeholders": {} + }, + "presenceStyle": "Bulunma:", + "@presenceStyle": { + "type": "String", + "placeholders": {} + }, + "searchForUsers": "@kullanıcıları ara...", + "@searchForUsers": {}, + "commandHint_ignore": "Verilen matrix kimliğini görmezden gel", + "@commandHint_ignore": {}, + "commandHint_unignore": "Verilen matrix kimliğini görmezden gelmeyi iptal et", + "@commandHint_unignore": {}, + "appLockDescription": "Kullanılmadığında PIN kodu ile uygulamayı kilitle", + "@appLockDescription": {}, + "globalChatId": "Genel sohbet kimliği", + "@globalChatId": {}, + "accessAndVisibility": "Erişim ve görünürlük", + "@accessAndVisibility": {}, + "accessAndVisibilityDescription": "Bu sohbete kimlerin katılmasına izin verilir ve sohbet nasıl keşfedilebilir.", + "@accessAndVisibilityDescription": {}, + "calls": "Aramalar", + "@calls": {}, + "customEmojisAndStickers": "Özel emojiler ve çıkartmalar", + "@customEmojisAndStickers": {}, + "customEmojisAndStickersBody": "Herhangi bir sohbette kullanılabilecek özel emojiler veya çıkartmalar ekleyin veya paylaşın.", + "@customEmojisAndStickersBody": {}, + "hideRedactedMessages": "Düzenlenen mesajları gizle", + "@hideRedactedMessages": {}, + "hideRedactedMessagesBody": "Birisi bir mesajı düzenlerse, bu mesaj artık sohbette görünmeyecektir.", + "@hideRedactedMessagesBody": {}, + "hideMemberChangesInPublicChats": "Herkese açık sohbetlerde üye değişikliklerini gizle", + "@hideMemberChangesInPublicChats": {}, + "hideMemberChangesInPublicChatsBody": "Okunabilirliği artırmak için birisi herkese açık bir sohbete katıldığında veya sohbetten ayrıldığında sohbet zaman çizelgesinde gösterme.", + "@hideMemberChangesInPublicChatsBody": {}, + "passwordRecoverySettings": "Parola kurtarma ayarları", + "@passwordRecoverySettings": {}, + "userWouldLikeToChangeTheChat": "{user} sohbete katılmak istiyor.", + "@userWouldLikeToChangeTheChat": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "noPublicLinkHasBeenCreatedYet": "Henüz herkese açık bir bağlantı oluşturulmadı", + "@noPublicLinkHasBeenCreatedYet": {}, + "knock": "Tıklat", + "@knock": {}, + "knocking": "Tıklat", + "@knocking": {}, + "usersMustKnock": "Kullanıcılar tıklatmalı", + "@usersMustKnock": {}, + "noOneCanJoin": "Kimse katılamaz", + "@noOneCanJoin": {}, + "nothingFound": "Hiçbir şey bulunamadı...", + "@nothingFound": {}, + "sendReadReceiptsDescription": "Sohbetteki diğer katılımcılar bir mesajı okuduğunuzu görebilir.", + "@sendReadReceiptsDescription": {}, + "verifyOtherDeviceDescription": "Başka bir aygıtı doğruladığınızda, bu aygıtlar anahtarları değiş tokuş ederek genel güvenliğinizi artırır. 💪 Bir doğrulama başlattığınızda, her iki aygıttaki uygulamada bir açılır pencere görünecektir. Orada birbirleriyle karşılaştırmanız gereken bir dizi emoji veya sayı göreceksiniz. Doğrulamaya başlamadan önce her iki aygıtın da elinizin altında olması en iyisidir. 🤳", + "@verifyOtherDeviceDescription": {}, + "noDatabaseEncryption": "Veri tabanı şifrelemesi bu platformda desteklenmiyor", + "@noDatabaseEncryption": {}, + "thereAreCountUsersBlocked": "Şu anda {count} engellenen kullanıcı var.", + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "publicSpaces": "Herkese açık alanlar", + "@publicSpaces": {}, + "initAppError": "Uygulama başlatılırken bir hata oluştu", + "@initAppError": {}, + "userRole": "Kullanıcı rolü", + "@userRole": {}, + "hideInvalidOrUnknownMessageFormats": "Geçersiz veya bilinmeyen mesaj biçimlerini gizle", + "@hideInvalidOrUnknownMessageFormats": {}, + "hidePresences": "Durum listesi gizlensin mi?", + "@hidePresences": {}, + "overview": "Genel görünüm", + "@overview": {}, + "decline": "Reddet", + "@decline": {}, + "notifyMeFor": "Beni bilgilendir", + "@notifyMeFor": {}, + "chatCanBeDiscoveredViaSearchOnServer": "Sohbet {server} üzerinde aranarak keşfedilebilir", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "leaveEmptyToClearStatus": "Durumunuzu temizlemek için boş bırakın.", + "@leaveEmptyToClearStatus": {}, + "select": "Seç", + "@select": {}, + "minimumPowerLevel": "{level} en düşük güç seviyesidir.", + "@minimumPowerLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "String" + } + } + }, + "passwordsDoNotMatch": "Parolalar eşleşmiyor", + "@passwordsDoNotMatch": {}, + "passwordIsWrong": "Girdiğiniz parola yanlış", + "@passwordIsWrong": {}, + "publicChatAddresses": "Herkese açık sohbet adresleri", + "@publicChatAddresses": {}, + "createNewAddress": "Yeni adres oluştur", + "@createNewAddress": {}, + "forwardMessageTo": "Mesajlar {roomName} kişisine iletilsin mi?", + "@forwardMessageTo": { + "type": "String", + "placeholders": { + "roomName": { + "type": "String" + } + } + }, + "acceptedKeyVerification": "{sender} anahtar doğrulamayı kabul etti", + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "restoreSessionBody": "Uygulama şimdi oturumunuzu yedekten geri yüklemeye çalışıyor. Lütfen bu hatayı {url} adresinde geliştiricilere bildirin. Hata mesajı: {error}", + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "sendReadReceipts": "Okundu bilgisi gönder", + "@sendReadReceipts": {}, + "completedKeyVerification": "{sender} anahtar doğrulamayı tamamladı", + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "sendTypingNotificationsDescription": "Sohbetteki diğer katılımcılar yeni bir mesaj yazdığınızı görebilir.", + "@sendTypingNotificationsDescription": {}, + "isReadyForKeyVerification": "{sender} anahtar doğrulama için hazır", + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "formattedMessages": "Biçimlendirilen mesajlar", + "@formattedMessages": {}, + "requestedKeyVerification": "{sender} anahtar doğrulama istedi", + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "verifyOtherUser": "🔐 Diğer kullanıcıyı doğrula", + "@verifyOtherUser": {}, + "startedKeyVerification": "{sender} anahtar doğrulama başlattı", + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "transparent": "Şeffaf", + "@transparent": {}, + "discover": "Keşfet", + "@discover": {}, + "incomingMessages": "Gelen mesajlar", + "@incomingMessages": {}, + "verifyOtherUserDescription": "Başka bir kullanıcıyı doğrularsanız, gerçekten kime yazdığınızı bildiğinizden emin olabilirsiniz. 💪\n\nBir doğrulama başlattığınızda, siz ve diğer kullanıcı uygulamada bir açılır pencere görecektir. Orada birbirinizle karşılaştırmanız gereken bir dizi emoji veya sayı göreceksiniz.\n\nBunu yapmanın en iyi yolu buluşmak veya bir görüntülü arama başlatmaktır. 👭", + "@verifyOtherUserDescription": {}, + "stickers": "Çıkartmalar", + "@stickers": {}, + "unreadChatsInApp": "{appname}: {unread} okunmayan sohbet", + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "searchIn": "\"{chat}\" sohbeti içinde ara...", + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "searchMore": "Daha fazla ara...", + "@searchMore": {}, + "gallery": "Galeri", + "@gallery": {}, + "files": "Dosyalar", + "@files": {}, + "knockRestricted": "Tıklatma kısıtlı", + "@knockRestricted": {}, + "restricted": "Kısıtlı", + "@restricted": {}, + "swipeRightToLeftToReply": "Yanıtlamak için sağdan sola kaydır", + "@swipeRightToLeftToReply": {}, + "alwaysUse24HourFormat": "false", + "@alwaysUse24HourFormat": { + "description": "Set to true to always display time of day in 24 hour format." + }, + "countChatsAndCountParticipants": "{chats} sohbet ve {participants} katılımcı", + "@countChatsAndCountParticipants": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + }, + "participants": { + "type": "int" + } + } + }, + "noMoreChatsFound": "Başka sohbet bulunamadı...", + "@noMoreChatsFound": {}, + "goToSpace": "Alana git: {space}", + "@goToSpace": { + "type": "String", + "space": {} + }, + "joinedChats": "Katılınan sohbetler", + "@joinedChats": {}, + "unread": "Okunmadı", + "@unread": {}, + "markAsUnread": "Okunmadı olarak işaretle", + "@markAsUnread": {}, + "space": "Alan", + "@space": {}, + "spaces": "Alanlar", + "@spaces": {}, + "inviteOtherUsers": "Diğer kullanıcıları bu sohbete davet et", + "@inviteOtherUsers": {}, + "changeTheChatPermissions": "Sohbet izinlerini değiştir", + "@changeTheChatPermissions": {}, + "changeTheCanonicalRoomAlias": "Ana herkese açık sohbet adresini değiştir", + "@changeTheCanonicalRoomAlias": {}, + "sendRoomNotifications": "@oda bildirimleri gönder", + "@sendRoomNotifications": {}, + "changeTheDescriptionOfTheGroup": "Sohbetin açıklamasını değiştir", + "@changeTheDescriptionOfTheGroup": {}, + "userLevel": "{level} - Kullanıcı", + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "moderatorLevel": "{level} - Moderatör", + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "adminLevel": "{level} - Yönetici", + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "changeGeneralChatSettings": "Genel sohbet ayarlarını değiştir", + "@changeGeneralChatSettings": {}, + "changeTheVisibilityOfChatHistory": "Sohbet geçmişinin görünürlüğünü değiştir", + "@changeTheVisibilityOfChatHistory": {}, + "invitedBy": "📩 {user} davet etti", + "@invitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "chatPermissionsDescription": "Bu sohbette belirli eylemler için hangi güç düzeyinin gerekli olduğunu tanımlayın. 0, 50 ve 100 güç düzeyleri genellikle kullanıcıları, moderatörleri ve yöneticileri temsil eder, ancak herhangi bir derecelendirme mümkündür.", + "@chatPermissionsDescription": {}, + "changelog": "Değişiklik günlüğü", + "@changelog": {}, + "updateInstalled": "🎉 Güncelleme {version} kuruldu!", + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "sendCanceled": "Gönderme iptal edildi", + "@sendCanceled": {}, + "noChatsFoundHere": "Burada henüz sohbet bulunamadı. Aşağıdaki düğmeyi kullanarak biriyle yeni bir sohbet başlatın. ⤵️", + "@noChatsFoundHere": {}, + "loginWithMatrixId": "Matrix kimliği ile oturum aç", + "@loginWithMatrixId": {}, + "discoverHomeservers": "Ana sunucuları keşfet", + "@discoverHomeservers": {}, + "whatIsAHomeserver": "Ana sunucu nedir?", + "@whatIsAHomeserver": {}, + "homeserverDescription": "Tüm verileriniz tıpkı bir e-posta sağlayıcısı gibi ana sunucuda saklanır. Hangi ana sunucuyu kullanmak istediğinizi seçebilir ve herkesle iletişim kurmaya devam edebilirsiniz. https://matrix.org adresinden daha fazla bilgi edinin.", + "@homeserverDescription": {}, + "doesNotSeemToBeAValidHomeserver": "Uyumlu bir ana sunucu gibi görünmüyor. Yanlış URL mi?", + "@doesNotSeemToBeAValidHomeserver": {}, + "prepareSendingAttachment": "Ek gönderilmeye hazırlanıyor...", + "@prepareSendingAttachment": {}, + "serverLimitReached": "Sunucu sınırına ulaşıldı! {seconds} saniye bekleniyor...", + "@serverLimitReached": { + "type": "integer", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "calculatingFileSize": "Dosya boyutu hesaplanıyor...", + "@calculatingFileSize": {}, + "sendingAttachmentCountOfCount": "Ek {index} / {length} gönderiliyor...", + "@sendingAttachmentCountOfCount": { + "type": "integer", + "placeholders": { + "index": { + "type": "int" + }, + "length": { + "type": "int" + } + } + }, + "sendingAttachment": "Ek gönderiliyor...", + "@sendingAttachment": {}, + "generatingVideoThumbnail": "Video küçük resmi oluşturuluyor...", + "@generatingVideoThumbnail": {}, + "compressVideo": "Video sıkıştırılıyor...", + "@compressVideo": {}, + "oneOfYourDevicesIsNotVerified": "Aygıtlarınızdan biri doğrulanmadı", + "@oneOfYourDevicesIsNotVerified": {}, + "noticeChatBackupDeviceVerification": "Not: Tüm aygıtlarınızı sohbet yedeklemesine bağladığınızda, otomatik olarak doğrulanırlar.", + "@noticeChatBackupDeviceVerification": {}, + "blur": "Blur:", + "@blur": {}, + "opacity": "Şeffaflık:", + "@opacity": {}, + "setWallpaper": "Duvar kağıdı seç", + "@setWallpaper": {}, + "manageAccount": "Hesabı yönet", + "@manageAccount": {}, + "noContactInformationProvided": "Sunucu geçerli bir iletişim bilgisi sunmadı", + "@noContactInformationProvided": {}, + "contactServerAdmin": "Sunucu yöneticisiyle iletişime geçin", + "@contactServerAdmin": {}, + "contactServerSecurity": "Sunucu güvenliğiyle iletişime geçin", + "@contactServerSecurity": {}, + "supportPage": "Destek sayfası", + "@supportPage": {}, + "name": "İsim", + "@name": {}, + "version": "Versiyon", + "@version": {}, + "serverInformation": "Sunucu bilgisi:", + "@serverInformation": {}, + "website": "Web sitesi", + "@website": {}, + "compress": "Sıkıştırma", + "@compress": {}, + "boldText": "Kalın metin", + "@boldText": {}, + "italicText": "İtalik metin", + "@italicText": {}, + "strikeThrough": "Üstü çizili", + "@strikeThrough": {}, + "pleaseFillOut": "Lütfen doldurun", + "@pleaseFillOut": {}, + "aboutHomeserver": "{homeserver} Hakkında", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "invalidUrl": "Geçersiz url", + "@invalidUrl": {}, + "addLink": "Link ekle", + "@addLink": {}, + "unableToJoinChat": "Sohbete girilemiyor. Belki başka birileri konuşmayı kapatmış olabilir.", + "@unableToJoinChat": {}, + "continueText": "Devam et", + "@continueText": {}, + "sendImages": "{count} görsel gönder", + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "welcomeText": "Hey Hey 👋 Karşınızda FluffyChat. https://matrix.org ile uyumlu herhangi bir homeserver'a giriş yapabilirsiniz. Ve herkesle konuşabilirsiniz. Bu koca bir merkeziyetsiz mesajlaşma ağı!", + "@welcomeText": {} +} diff --git a/assets/l10n/intl_uk.arb b/assets/l10n/intl_uk.arb new file mode 100644 index 0000000..6240a8b --- /dev/null +++ b/assets/l10n/intl_uk.arb @@ -0,0 +1,3280 @@ +{ + "@@locale": "uk", + "@@last_modified": "2021-08-14 12:41:09.790615", + "about": "Про застосунок", + "@about": { + "type": "String", + "placeholders": {} + }, + "accept": "Прийняти", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 {username} приймає запрошення", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "Обліковий запис", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐 {username} активує наскрізне шифрування", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "admin": "Адміністратор", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "псевдонім", + "@alias": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "{senderName} відповідає на виклик", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "Будь-хто може приєднатись", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "archive": "Архів", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "Чи дозволено гостям приєднуватись", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "Ви впевнені?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "Для підпису ключа іншого користувача введіть свою парольну фразу або ключ відновлення.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "Прийняти цей запит на підтвердження від {username}?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "banFromChat": "Заблокувати в бесіді", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "Заблоковано", + "@banned": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username} блокує {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "Заблокувати пристрій", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "cancel": "Скасувати", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "{username} змінює аватар бесіди", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatDescriptionTo": "{username} змінює опис бесіди на: '{description}'", + "@changedTheChatDescriptionTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "description": { + "type": "String" + } + } + }, + "changedTheChatNameTo": "{username} змінює назву бесіди на: '{chatname}'", + "@changedTheChatNameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "chatname": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username} змінює права доступу бесіди", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username} змінює показуване ім'я на: '{displayname}'", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} змінює правила гостьового доступу", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} змінює правила гостьового доступу на: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username} змінює видимість історії", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username} змінює видимість історії на: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username} змінює правила приєднання", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} змінює правила приєднання на: {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} змінює аватар", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "{username} змінює псевдоніми кімнати", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username} змінює посилання для запрошення", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changeTheHomeserver": "Змінити домашній сервер", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "Змінити стиль", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "Змінити назву групи", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "Шифрування було пошкоджено", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "chat": "Бесіда", + "@chat": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Подробиці бесіди", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "Виберіть надійний пароль", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "close": "Закрити", + "@close": { + "type": "String", + "placeholders": {} + }, + "compareEmojiMatch": "Порівняйте емодзі", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "Порівняйте цифри", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "confirm": "Підтвердити", + "@confirm": { + "type": "String", + "placeholders": {} + }, + "connect": "Під'єднатись", + "@connect": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "Контакт був запрошений в групу", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "Скопійовано в буфер обміну", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "Копіювати", + "@copy": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "Помилка розшифрування повідомлення: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "countParticipants": "Учасників: {count}", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "create": "Створити", + "@create": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "💬 {username} створює бесіду", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "currentlyActive": "Зараз у мережі", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "Темний", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{timeOfDay}, {date}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "dateWithoutYear": "{day}-{month}", + "@dateWithoutYear": { + "type": "String", + "placeholders": { + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "dateWithYear": "{day}-{month}-{year}", + "@dateWithYear": { + "type": "String", + "placeholders": { + "year": { + "type": "String" + }, + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "delete": "Видалити", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "Видалити повідомлення", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "device": "Пристрій", + "@device": { + "type": "String", + "placeholders": {} + }, + "devices": "Пристрої", + "@devices": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "Показуване ім'я було змінено", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "Завантажити файл", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "editDisplayname": "Змінити показуване ім'я", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "Емодзі вже існує!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "Неприпустимий короткий код емодзі!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "Налаштування емодзі", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "emoteShortcode": "Короткий код для емодзі", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emoteWarnNeedToPick": "Укажіть короткий код емодзі та зображення!", + "@emoteWarnNeedToPick": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "Порожня бесіда", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "Ви більше не зможете вимкнути шифрування. Ви впевнені?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "encryption": "Шифрування", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "Шифрування вимкнено", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName} завершує виклик", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "enterYourHomeserver": "Введіть адресу домашнього сервера", + "@enterYourHomeserver": { + "type": "String", + "placeholders": {} + }, + "fileName": "Назва файлу", + "@fileName": { + "type": "String", + "placeholders": {} + }, + "fluffychat": "FluffyChat", + "@fluffychat": { + "type": "String", + "placeholders": {} + }, + "forward": "Переслати", + "@forward": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "З моменту приєднання", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "З моменту запрошення", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "group": "Група", + "@group": { + "type": "String", + "placeholders": {} + }, + "groupIsPublic": "Загальнодоступна група", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "groupWith": "Група з {displayname}", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "guestsAreForbidden": "Гості не можуть приєднуватись", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "Гості можуть приєднуватись", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{username} відкликає запрошення для {targetName}", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "help": "Довідка", + "@help": { + "type": "String", + "placeholders": {} + }, + "id": "ID", + "@id": { + "type": "String", + "placeholders": {} + }, + "identity": "Ідентифікація", + "@identity": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "Неправильна парольна фраза або ключ відновлення", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "Запросити контакт", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "Запросити контакт до {groupName}", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "invited": "Запрошено", + "@invited": { + "type": "String", + "placeholders": {} + }, + "invitedUser": "📩 {username} запрошує {targetName}", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "invitedUsersOnly": "Лише запрошені користувачі", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "inviteText": "{username} запрошує вас у FluffyChat. \n1. Перейдіть на fluffychat.im й установіть застосунок \n2. Зареєструйтесь або ввійдіть \n3. Відкрийте запрошувальне посилання:\n {link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "isTyping": "пише…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "👋 {username} приєднується до бесіди", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "kicked": "👞 {username} вилучає {targetName}", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickedAndBanned": "🙅 {username} вилучає та блокує {targetName}", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickFromChat": "Вилучити з бесіди", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "Остання активність: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "leave": "Вийти", + "@leave": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "Виходить з бесіди", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "license": "Ліцензія", + "@license": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "Світлий", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "Завантажити ще {count} учасників", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "loadingPleaseWait": "Завантаження… Будь ласка, зачекайте.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "loadMore": "Завантажити ще…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "login": "Увійти", + "@login": { + "type": "String", + "placeholders": {} + }, + "logInTo": "Увійти до {homeserver}", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "logout": "Вийти", + "@logout": { + "type": "String", + "placeholders": {} + }, + "moderator": "Модератор", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "muteChat": "Вимкнути сповіщення", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "needPantalaimonWarning": "Майте на увазі, що на цей час вам потрібен Pantalaimon, щоб використовувати наскрізне шифрування.", + "@needPantalaimonWarning": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "💬 Нове повідомлення у FluffyChat", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "Новий запит перевірки!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "Емоджі не знайдено. 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "Схоже, Firebase Cloud Messaging недоступна на вашому пристрої. Щоб отримувати push-сповіщення, радимо встановити ntfy. За допомогою ntfy або іншого постачальника Unified Push ви можете отримувати push-сповіщення у безпечний спосіб. Ви можете завантажити ntfy з PlayStore або з F-Droid.", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "none": "Нічого", + "@none": { + "type": "String", + "placeholders": {} + }, + "noPermission": "Немає прав доступу", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "Кімнат не знайдено…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "ok": "Гаразд", + "@ok": { + "type": "String", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "Резервне онлайн-копіювання ключів увімкнено", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "Халепа, щось пішло не так…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "Відкрийте застосунок читання повідомлень", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "openCamera": "Відкрити камеру", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "парольна фраза або ключ відновлення", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "password": "Пароль", + "@password": { + "type": "String", + "placeholders": {} + }, + "pickImage": "Вибрати зображення", + "@pickImage": { + "type": "String", + "placeholders": {} + }, + "play": "Відтворити {fileName}", + "@play": { + "type": "String", + "placeholders": { + "fileName": { + "type": "String" + } + } + }, + "pleaseEnterYourPassword": "Введіть свій пароль", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "Введіть своє ім'я користувача", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "Загальнодоступні кімнати", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "recording": "Запис", + "@recording": { + "type": "String", + "placeholders": {} + }, + "redactedAnEvent": "{username} змінює подію", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "reject": "Відхилити", + "@reject": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "{username} відхиляє запрошення", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "rejoin": "Приєднатися знову", + "@rejoin": { + "type": "String", + "placeholders": {} + }, + "remove": "Вилучити", + "@remove": { + "type": "String", + "placeholders": {} + }, + "removeAllOtherDevices": "Вилучити всі інші пристрої", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "removedBy": "Вилучено користувачем {username}", + "@removedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "removeDevice": "Вилучити пристрій", + "@removeDevice": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "Розблокувати у бесіді", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "renderRichContent": "Показувати форматований вміст повідомлення", + "@renderRichContent": { + "type": "String", + "placeholders": {} + }, + "reply": "Відповісти", + "@reply": { + "type": "String", + "placeholders": {} + }, + "requestPermission": "Запит дозволу", + "@requestPermission": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "Кімнату було оновлено", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "seenByUser": "Переглянуто {username}", + "@seenByUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "send": "Надіслати", + "@send": { + "type": "String", + "placeholders": {} + }, + "sendAMessage": "Надіслати повідомлення", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "sendFile": "Надіслати файл", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendImage": "Надіслати зображення", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sentAFile": "📁 {username} надсилає файл", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAnAudio": "🎤 {username} надсилає аудіо", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAPicture": "🖼️ {username} надсилає зображення", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentASticker": "😊 {username} надсилає наліпку", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "🎥 {username} надсилає відео", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "setInvitationLink": "Указати посилання для запрошення", + "@setInvitationLink": { + "type": "String", + "placeholders": {} + }, + "setStatus": "Указати статус", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "settings": "Налаштування", + "@settings": { + "type": "String", + "placeholders": {} + }, + "share": "Поділитися", + "@share": { + "type": "String", + "placeholders": {} + }, + "sharedTheLocation": "{username} ділиться своїм місцеперебуванням", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "skip": "Пропустити", + "@skip": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "Джерельний код", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "statusExampleMessage": "Як справи сьогодні?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "submit": "Надіслати", + "@submit": { + "type": "String", + "placeholders": {} + }, + "systemTheme": "Системна", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "Вони відрізняються", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "Вони збігаються", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "title": "FluffyChat", + "@title": { + "description": "Title for the application", + "type": "String", + "placeholders": {} + }, + "tryToSendAgain": "Спробуйте надіслати ще раз", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username} розблоковує {targetName}", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "unblockDevice": "Розблокувати пристрій", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "Невідомий пристрій", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "unknownEncryptionAlgorithm": "Невідомий алгоритм шифрування", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unknownEvent": "Невідома подія '{type}'", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "unmuteChat": "Увімкнути сповіщення", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "userAndOthersAreTyping": "{username} та {count} інших пишуть…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "userAndUserAreTyping": "{username} і {username2} пишуть…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userIsTyping": "{username} пише…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userLeftTheChat": "🚪 {username} виходить з бесіди", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "username": "Ім'я користувача", + "@username": { + "type": "String", + "placeholders": {} + }, + "userSentUnknownEvent": "{username} надсилає подію {type}", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "verify": "Перевірити", + "@verify": { + "type": "String", + "placeholders": {} + }, + "verifyStart": "Почати перевірку", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "Ви успішно перевірені!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "verifyTitle": "Перевірка іншого облікового запису", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "videoCall": "Відеовиклик", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "Видимість історії бесіди", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "Видима для всіх учасників", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "Видима для всіх", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "Голосове повідомлення", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "Очікування прийняття запиту партнером…", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "Очікування прийняття емоджі партнером…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "Очікування прийняття чисел партнером…", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "wallpaper": "Шпалери:", + "@wallpaper": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "Кому дозволено приєднуватися до цієї групи", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "Написати повідомлення…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "yes": "Так", + "@yes": { + "type": "String", + "placeholders": {} + }, + "you": "Ви", + "@you": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "Ви більше не берете участь у цій бесіді", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "Ви були заблоковані у цій бесіді", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "pushRules": "Правила сповіщень", + "@pushRules": { + "type": "String", + "placeholders": {} + }, + "notificationsEnabledForThisAccount": "Сповіщення ввімкнені для цього облікового запису", + "@notificationsEnabledForThisAccount": { + "type": "String", + "placeholders": {} + }, + "notifications": "Сповіщення", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "memberChanges": "Зміни учасників", + "@memberChanges": { + "type": "String", + "placeholders": {} + }, + "inviteForMe": "Запрошення для мене", + "@inviteForMe": { + "type": "String", + "placeholders": {} + }, + "enterAnEmailAddress": "Введіть адресу е-пошти", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "encrypted": "Зашифровано", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "Увімкнути пакунок емоджі глобально", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "emotePacks": "Набори емоджі для кімнати", + "@emotePacks": { + "type": "String", + "placeholders": {} + }, + "edit": "Редагувати", + "@edit": { + "type": "String", + "placeholders": {} + }, + "directChats": "Особисті бесіди", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "deviceId": "ID пристрою", + "@deviceId": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "Видалити обліковий запис", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "deactivateAccountWarning": "Це деактивує ваш обліковий запис. Це неможливо скасувати! Ви впевнені?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "containsUserName": "Містить ім’я користувача", + "@containsUserName": { + "type": "String", + "placeholders": {} + }, + "containsDisplayName": "Містить показуване ім’я", + "@containsDisplayName": { + "type": "String", + "placeholders": {} + }, + "changePassword": "Змінити пароль", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeDeviceName": "Змінити назву пристрою", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "botMessages": "Повідомлення ботів", + "@botMessages": { + "type": "String", + "placeholders": {} + }, + "or": "Або", + "@or": { + "type": "String", + "placeholders": {} + }, + "setAsCanonicalAlias": "Установити основним псевдонімом", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "verified": "Перевірений", + "@verified": { + "type": "String", + "placeholders": {} + }, + "blocked": "Заблоковано", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "no": "Ні", + "@no": { + "type": "String", + "placeholders": {} + }, + "sendOnEnter": "Надсилати натисканням Enter", + "@sendOnEnter": {}, + "commandHint_ban": "Заблокувати цього користувача кімнати", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_kick": "Вилучити цього користувача з цієї кімнати", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_myroomavatar": "Встановіть зображення для цієї кімнати (від mxc-uri)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_myroomnick": "Укажіть показуване ім'я для цієї кімнати", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "commandMissing": "{command} не є командою.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "copyToClipboard": "Копіювати до буфера обміну", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "createNewSpace": "Новий простір", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "Увімкнути шифрування", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "joinRoom": "Приєднатися до кімнати", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "mention": "Згадати", + "@mention": { + "type": "String", + "placeholders": {} + }, + "next": "Далі", + "@next": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "Немає з'єднання з сервером", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "scanQrCode": "Сканувати QR-код", + "@scanQrCode": {}, + "noPasswordRecoveryDescription": "Ви ще не додали спосіб відновлення пароля.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "numUsersTyping": "{count} користувачів пишуть…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "online": "Онлайн", + "@online": { + "type": "String", + "placeholders": {} + }, + "oopsPushError": "Дідько! На жаль, сталася помилка під час налаштування push-сповіщень.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "Забули пароль", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "pleaseChoose": "Виберіть", + "@pleaseChoose": { + "type": "String", + "placeholders": {} + }, + "pleaseEnter4Digits": "Введіть 4 цифри або залиште порожнім, щоб вимкнути блокування застосунку.", + "@pleaseEnter4Digits": { + "type": "String", + "placeholders": {} + }, + "redactMessage": "Редагувати повідомлення", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "register": "Зареєструватися", + "@register": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "Поскаржитися на повідомлення", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "replaceRoomWithNewerVersion": "Замінити кімнату новішою версією", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "sendAudio": "Надіслати аудіо", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "setCustomEmotes": "Установити користувацькі емоджі", + "@setCustomEmotes": { + "type": "String", + "placeholders": {} + }, + "weSentYouAnEmail": "Ми надіслали вам електронний лист", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "wipeChatBackup": "Стерти резервну копію бесіди, щоб створити новий ключ відновлення?", + "@wipeChatBackup": { + "type": "String", + "placeholders": {} + }, + "addToSpace": "Додати простір", + "@addToSpace": {}, + "roomVersion": "Версія кімнати", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "iHaveClickedOnLink": "Мною виконано перехід за посиланням", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "startedACall": "{senderName} розпочинає виклик", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "appLock": "Блокування застосунку", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "commandInvalid": "Неприпустима команда", + "@commandInvalid": { + "type": "String" + }, + "extremeOffensive": "Украй образливий", + "@extremeOffensive": { + "type": "String", + "placeholders": {} + }, + "howOffensiveIsThisContent": "Наскільки образливий цей вміст?", + "@howOffensiveIsThisContent": { + "type": "String", + "placeholders": {} + }, + "participant": "Учасник", + "@participant": { + "type": "String", + "placeholders": {} + }, + "addEmail": "Додати е-пошту", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "ignore": "Нехтувати", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "fontSize": "Розмір шрифту", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "badServerVersionsException": "Домашній сервер підтримує такі версії специфікацій:\n{serverVersions}\nАле цей застосунок підтримує лише {supportedVersions}", + "@badServerVersionsException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "areYouSureYouWantToLogout": "Ви впевнені, що хочете вийти?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "badServerLoginTypesException": "Домашній сервер підтримує такі типи входу:\n{serverVersions}\nАле цей застосунок підтримує лише:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "all": "Усі", + "@all": { + "type": "String", + "placeholders": {} + }, + "allChats": "Усі бесіди", + "@allChats": { + "type": "String", + "placeholders": {} + }, + "commandHint_join": "Приєднатися до цієї кімнати", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "chats": "Бесіди", + "@chats": { + "type": "String", + "placeholders": {} + }, + "changeYourAvatar": "Змінити аватар", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "link": "Посилання", + "@link": {}, + "security": "Безпека", + "@security": { + "type": "String", + "placeholders": {} + }, + "sendSticker": "Надіслати наліпку", + "@sendSticker": { + "type": "String", + "placeholders": {} + }, + "errorObtainingLocation": "Помилка під час отримання розташування: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "hideRedactedEvents": "Сховати змінені події", + "@hideRedactedEvents": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWait": "Синхронізація… Будь ласка, зачекайте.", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "noMatrixServer": "{server1} не є сервером matrix, використовувати {server2} натомість?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "reason": "Причина", + "@reason": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "Типовий рівень дозволів для нових користувачів", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "sendAsText": "Надіслати як текст", + "@sendAsText": { + "type": "String" + }, + "saveFile": "Зберегти файл", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "autoplayImages": "Автоматично відтворювати анімовані наліпки та емоджі", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "pleaseChooseAPasscode": "Виберіть код доступу", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "pleaseClickOnLink": "Натисніть на посилання в електронному листі, а потім продовжуйте.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "toggleUnread": "Позначити прочитаним/непрочитаним", + "@toggleUnread": { + "type": "String", + "placeholders": {} + }, + "transferFromAnotherDevice": "Перенесення з іншого пристрою", + "@transferFromAnotherDevice": { + "type": "String", + "placeholders": {} + }, + "sendMessages": "Надсилати повідомлення", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "sendOriginal": "Надіслати оригінал", + "@sendOriginal": { + "type": "String", + "placeholders": {} + }, + "whoCanPerformWhichAction": "Хто і яку дію може виконувати", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "Чому ви хочете поскаржитися?", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "messages": "Повідомлення", + "@messages": { + "type": "String", + "placeholders": {} + }, + "newChat": "Нова бесіда", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "everythingReady": "Усе готово!", + "@everythingReady": { + "type": "String", + "placeholders": {} + }, + "homeserver": "Домашній сервер", + "@homeserver": {}, + "goToTheNewRoom": "Перейти до нової кімнати", + "@goToTheNewRoom": { + "type": "String", + "placeholders": {} + }, + "groups": "Групи", + "@groups": { + "type": "String", + "placeholders": {} + }, + "inoffensive": "Необразливий", + "@inoffensive": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "Активувати шифрування можна лише тоді, коли кімната більше не буде загальнодоступною.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "chatHasBeenAddedToThisSpace": "Бесіду додано до цього простору", + "@chatHasBeenAddedToThisSpace": {}, + "chatBackupDescription": "Ваші старі повідомлення захищені ключем відновлення. Переконайтеся, що ви не втратите його.", + "@chatBackupDescription": { + "type": "String", + "placeholders": {} + }, + "chatBackup": "Резервне копіювання бесіди", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "yourChatBackupHasBeenSetUp": "Рез. копію чату налаштовано.", + "@yourChatBackupHasBeenSetUp": {}, + "clearArchive": "Очистити архів", + "@clearArchive": {}, + "commandHint_html": "Надіслати текст у форматі HTML", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_invite": "Запросіть цього користувача до цієї кімнати", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "commandHint_leave": "Вийти з цієї кімнати", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_me": "Опишіть себе", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "hideUnknownEvents": "Сховати невідомі події", + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "ignoredUsers": "Нехтувані користувачі", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "obtainingLocation": "Отримання розташування…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "offensive": "Образливий", + "@offensive": { + "type": "String", + "placeholders": {} + }, + "offline": "Офлайн", + "@offline": { + "type": "String", + "placeholders": {} + }, + "addAccount": "Додати обліковий запис", + "@addAccount": {}, + "enableMultiAccounts": "(БЕТА) Увімкнути кілька облікових записів на цьому пристрої", + "@enableMultiAccounts": {}, + "openInMaps": "Відкрити в картах", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "serverRequiresEmail": "Цей сервер потребує перевірки вашої адресу е-пошти для реєстрації.", + "@serverRequiresEmail": {}, + "pleaseFollowInstructionsOnWeb": "Виконайте вказівки вебсайту та торкніться далі.", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "Надіслати відео", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "removeYourAvatar": "Вилучити свій аватар", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "unpin": "Відкріпити", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "setPermissionsLevel": "Указати рівні дозволів", + "@setPermissionsLevel": { + "type": "String", + "placeholders": {} + }, + "shareLocation": "Поділитися місцеперебуванням", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "singlesignon": "Єдиний вхід", + "@singlesignon": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "Забагато запитів. Спробуйте пізніше!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "unavailable": "Недоступний", + "@unavailable": { + "type": "String", + "placeholders": {} + }, + "unreadChats": "{unreadCount, plural, =1{1 непрочитана бесіда} few{{unreadCount} непрочитані бесіди} many{{unreadCount} непрочитаних бесід} other{{unreadCount} непрочитані бесіди}}", + "@unreadChats": { + "type": "String", + "placeholders": { + "unreadCount": { + "type": "int" + } + } + }, + "withTheseAddressesRecoveryDescription": "За допомогою цих адрес ви можете відновити свій пароль.", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "privacy": "Приватність", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "search": "Пошук", + "@search": { + "type": "String", + "placeholders": {} + }, + "sentCallInformations": "{senderName} надсилає відомості про виклик", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "cantOpenUri": "Не вдалося відкрити URI {uri}", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "contentHasBeenReported": "Скаргу на вміст надіслано адміністраторам сервера", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "commandHint_op": "Укажіть рівень повноважень цього користувача (типово: 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_plain": "Надіслати неформатований текст", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_react": "Надіслати відповідь як реакцію", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "commandHint_send": "Надіслати текст", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "commandHint_unban": "Розблокувати цього користувача у цій кімнаті", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "configureChat": "Налаштувати бесіду", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "Редагувати заблоковані сервери", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "showPassword": "Показати пароль", + "@showPassword": { + "type": "String", + "placeholders": {} + }, + "editRoomAliases": "Змінити псевдоніми кімнати", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "Змінити аватар кімнати", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "Пароль змінено", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "passwordRecovery": "Відновлення пароля", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "people": "Люди", + "@people": { + "type": "String", + "placeholders": {} + }, + "pin": "Закріпити", + "@pin": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPin": "Введіть свій PIN-код", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "spaceName": "Назва простору", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "warning": "Попередження!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "yourPublicKey": "Ваш відкритий ключ", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "spaceIsPublic": "Простір загальнодоступний", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "status": "Статус", + "@status": { + "type": "String", + "placeholders": {} + }, + "unverified": "Неперевірений", + "@unverified": {}, + "locationDisabledNotice": "Служби визначення розташування вимкнені. Увімкніть їх, щоб мати змогу ділитися своїм розташуванням.", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "locationPermissionDeniedNotice": "Дозвіл на розташування відхилено. Надайте можливість ділитися своїм розташуванням.", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "oneClientLoggedOut": "На одному з ваших клієнтів виконано вихід із системи", + "@oneClientLoggedOut": {}, + "bundleName": "Назва вузла", + "@bundleName": {}, + "toggleFavorite": "Перемикнути вибране", + "@toggleFavorite": { + "type": "String", + "placeholders": {} + }, + "removeFromBundle": "Вилучити з цього вузла", + "@removeFromBundle": {}, + "toggleMuted": "Увімкнути/вимкнути звук", + "@toggleMuted": { + "type": "String", + "placeholders": {} + }, + "editBundlesForAccount": "Змінити вузол для цього облікового запису", + "@editBundlesForAccount": {}, + "addToBundle": "Додати до вузлів", + "@addToBundle": {}, + "repeatPassword": "Повторіть пароль", + "@repeatPassword": {}, + "messageInfo": "Відомості про повідомлення", + "@messageInfo": {}, + "time": "Час", + "@time": {}, + "messageType": "Тип повідомлення", + "@messageType": {}, + "openGallery": "Відкрити галерею", + "@openGallery": {}, + "sender": "Відправник", + "@sender": {}, + "addToSpaceDescription": "Виберіть простір, щоб додати до нього цю бесіду.", + "@addToSpaceDescription": {}, + "removeFromSpace": "Вилучити з простору", + "@removeFromSpace": {}, + "start": "Почати", + "@start": {}, + "commandHint_discardsession": "Відкинути сеанс", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "commandHint_clearcache": "Очистити кеш", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_create": "Створіть порожню групову бесіду\nВикористовуйте --no-encryption, щоб вимкнути шифрування", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "commandHint_dm": "Початок особистої бесіди\nВикористовуйте --no-encryption, що вимкнути шифрування", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "openVideoCamera": "Відкрити камеру для відео", + "@openVideoCamera": { + "type": "String", + "placeholders": {} + }, + "publish": "Опублікувати", + "@publish": {}, + "videoWithSize": "Відео ({size})", + "@videoWithSize": { + "type": "String", + "placeholders": { + "size": { + "type": "String" + } + } + }, + "dismiss": "Відхилити", + "@dismiss": {}, + "markAsRead": "Позначити прочитаним", + "@markAsRead": {}, + "reportUser": "Поскаржився на користувача", + "@reportUser": {}, + "openChat": "Відкрити бесіду", + "@openChat": {}, + "reactedWith": "{sender} реагує з {reaction}", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "emojis": "Емоджі", + "@emojis": {}, + "pinMessage": "Прикріпити в кімнаті", + "@pinMessage": {}, + "confirmEventUnpin": "Ви впевнені, що бажаєте назавжди відкріпите подію?", + "@confirmEventUnpin": {}, + "placeCall": "Здійснити виклик", + "@placeCall": {}, + "unsupportedAndroidVersion": "Непідтримувана версія Android", + "@unsupportedAndroidVersion": {}, + "voiceCall": "Голосовий виклик", + "@voiceCall": {}, + "unsupportedAndroidVersionLong": "Для цієї функції потрібна новіша версія Android. Перевірте наявність оновлень або підтримку Lineage OS.", + "@unsupportedAndroidVersionLong": {}, + "videoCallsBetaWarning": "Зауважте, що відеовиклики на ранньому етапі розробки. Вони можуть працювати не так, як очікувалося, або взагалі не працювати на всіх платформах.", + "@videoCallsBetaWarning": {}, + "emailOrUsername": "Електронна адреса або ім’я користувача", + "@emailOrUsername": {}, + "experimentalVideoCalls": "Експериментальні відеовиклики", + "@experimentalVideoCalls": {}, + "switchToAccount": "Перемкнутися на обліковий запис {number}", + "@switchToAccount": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "nextAccount": "Наступний обліковий запис", + "@nextAccount": {}, + "previousAccount": "Попередній обліковий запис", + "@previousAccount": {}, + "addWidget": "Додати віджет", + "@addWidget": {}, + "widgetVideo": "Відео", + "@widgetVideo": {}, + "widgetCustom": "Користувацький", + "@widgetCustom": {}, + "widgetName": "Назва", + "@widgetName": {}, + "widgetNameError": "Укажіть коротку назву.", + "@widgetNameError": {}, + "widgetEtherpad": "Текстова примітка", + "@widgetEtherpad": {}, + "widgetJitsi": "Jitsi Meet", + "@widgetJitsi": {}, + "widgetUrlError": "Це недійсна URL-адреса.", + "@widgetUrlError": {}, + "errorAddingWidget": "Помилка додавання віджета.", + "@errorAddingWidget": {}, + "separateChatTypes": "Розділіть особисті бесіди та групи", + "@separateChatTypes": { + "type": "String", + "placeholders": {} + }, + "youInvitedBy": "📩 Ви були запрошені {user}", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youAcceptedTheInvitation": "👍 Ви погодилися на запрошення", + "@youAcceptedTheInvitation": {}, + "youRejectedTheInvitation": "Ви відхилили запрошення", + "@youRejectedTheInvitation": {}, + "youHaveWithdrawnTheInvitationFor": "Ви відкликали запрошення для {user}", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youBannedUser": "Ви заблокували {user}", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKickedAndBanned": "🙅 Ви вилучили й заблокували {user}", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youJoinedTheChat": "Ви приєдналися до бесіди", + "@youJoinedTheChat": {}, + "youKicked": "👞 Ви вилучили {user}", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youUnbannedUser": "Ви розблокували {user}", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedUser": "📩 Ви запросили {user}", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "saveKeyManuallyDescription": "Збережіть цей ключ вручну, запустивши діалогове вікно спільного доступу до системи або буфер обміну.", + "@saveKeyManuallyDescription": {}, + "storeInAndroidKeystore": "Зберегти в Android KeyStore", + "@storeInAndroidKeystore": {}, + "storeInAppleKeyChain": "Зберегти в Apple KeyChain", + "@storeInAppleKeyChain": {}, + "storeSecurlyOnThisDevice": "Зберегти безпечно на цей пристрій", + "@storeSecurlyOnThisDevice": {}, + "pleaseEnterRecoveryKeyDescription": "Щоб розблокувати старі повідомлення, введіть ключ відновлення, згенерований у попередньому сеансі. Ваш ключ відновлення це НЕ ваш пароль.", + "@pleaseEnterRecoveryKeyDescription": {}, + "pleaseEnterRecoveryKey": "Введіть ключ відновлення:", + "@pleaseEnterRecoveryKey": {}, + "recoveryKey": "Ключ відновлення", + "@recoveryKey": {}, + "recoveryKeyLost": "Ключ відновлення втрачено?", + "@recoveryKeyLost": {}, + "users": "Користувачі", + "@users": {}, + "unlockOldMessages": "Розблокувати старі повідомлення", + "@unlockOldMessages": {}, + "storeInSecureStorageDescription": "Збережіть ключ відновлення в безпечному сховищі цього пристрою.", + "@storeInSecureStorageDescription": {}, + "countFiles": "{count} файлів", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "hydrate": "Відновлення з файлу резервної копії", + "@hydrate": {}, + "hydrateTorLong": "Минулого разу ви експортували свій сеанс із TOR? Швидко імпортуйте його та продовжуйте спілкування.", + "@hydrateTorLong": {}, + "indexedDbErrorTitle": "Проблеми приватного режиму", + "@indexedDbErrorTitle": {}, + "indexedDbErrorLong": "На жаль, сховище повідомлень не ввімкнуто у приватному режимі типово.\nВідкрийте\n - about:config\n - установіть для dom.indexedDB.privateBrowsing.enabled значення true\nІнакше запустити FluffyChat буде неможливо.", + "@indexedDbErrorLong": {}, + "dehydrate": "Експортувати сеанс та очистити пристрій", + "@dehydrate": {}, + "dehydrateWarning": "Цю дію не можна скасувати. Переконайтеся, що ви безпечно зберігаєте файл резервної копії.", + "@dehydrateWarning": {}, + "dehydrateTor": "Користувачі TOR: експорт сеансу", + "@dehydrateTor": {}, + "dehydrateTorLong": "Для користувачів TOR рекомендується експортувати сеанс перед закриттям вікна.", + "@dehydrateTorLong": {}, + "hydrateTor": "Користувачі TOR: імпорт експортованого сеансу", + "@hydrateTor": {}, + "user": "Користувач", + "@user": {}, + "custom": "Користувацький", + "@custom": {}, + "supposedMxid": "Це має бути {mxid}", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "confirmMatrixId": "Підтвердьте свій Matrix ID, щоб видалити свій обліковий запис.", + "@confirmMatrixId": {}, + "commandHint_markasgroup": "Позначити групою", + "@commandHint_markasgroup": {}, + "commandHint_markasdm": "Позначити кімнатою особистого спілкування для надання Matrix ID", + "@commandHint_markasdm": {}, + "whyIsThisMessageEncrypted": "Чому це повідомлення нечитабельне?", + "@whyIsThisMessageEncrypted": {}, + "noKeyForThisMessage": "Це може статися, якщо повідомлення було надіслано до того, як ви ввійшли у свій обліковий запис на цьому пристрої.\n\nТакож можливо, що відправник заблокував ваш пристрій або щось пішло не так з під'єднанням до інтернету.\n\nЧи можете ви прочитати повідомлення на іншому сеансі? Тоді ви зможете перенести повідомлення з нього! Перейдіть до Налаштування > Пристрої та переконайтеся, що ваші пристрої перевірили один одного. Коли ви відкриєте кімнату наступного разу й обидва сеанси будуть на активні, ключі будуть передані автоматично.\n\nВи ж не хочете втрачати ключі після виходу або зміни пристроїв? Переконайтеся, що ви ввімкнули резервне копіювання бесід у налаштуваннях.", + "@noKeyForThisMessage": {}, + "foregroundServiceRunning": "Це сповіщення з'являється під час роботи основної служби.", + "@foregroundServiceRunning": {}, + "screenSharingTitle": "спільний доступ до екрана", + "@screenSharingTitle": {}, + "callingPermissions": "Дозволи на виклик", + "@callingPermissions": {}, + "callingAccount": "Обліковий запис для виклику", + "@callingAccount": {}, + "callingAccountDetails": "Дозволяє FluffyChat використовувати основний застосунок Android для набору номера.", + "@callingAccountDetails": {}, + "appearOnTop": "З'являтися зверху", + "@appearOnTop": {}, + "appearOnTopDetails": "Дозволяє застосунку показуватися зверху (не потрібно, якщо Fluffychat вже налаштований обліковим записом для викликів)", + "@appearOnTopDetails": {}, + "newGroup": "Нова група", + "@newGroup": {}, + "newSpace": "Новий простір", + "@newSpace": {}, + "enterSpace": "Увійти в простір", + "@enterSpace": {}, + "enterRoom": "Увійти в кімнату", + "@enterRoom": {}, + "otherCallingPermissions": "Мікрофон, камера та інші дозволи FluffyChat", + "@otherCallingPermissions": {}, + "allSpaces": "Усі простори", + "@allSpaces": {}, + "screenSharingDetail": "Ви ділитеся своїм екраном FuffyChat", + "@screenSharingDetail": {}, + "numChats": "{number} бесід", + "@numChats": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "hideUnimportantStateEvents": "Сховати неважливі державні свята", + "@hideUnimportantStateEvents": {}, + "doNotShowAgain": "Не показувати знову", + "@doNotShowAgain": {}, + "commandHint_cuddle": "Надіслати пригортайку", + "@commandHint_cuddle": {}, + "googlyEyesContent": "{senderName} надсилає вам гугл-очі", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "commandHint_googly": "Надіслати кілька гугл-очей", + "@commandHint_googly": {}, + "commandHint_hug": "Надіслати обійми", + "@commandHint_hug": {}, + "cuddleContent": "{senderName} пригортається до вас", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "hugContent": "{senderName} обіймає вас", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "wasDirectChatDisplayName": "Порожня бесіда (раніше {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "startFirstChat": "Розпочніть свою першу бесіду", + "@startFirstChat": {}, + "newSpaceDescription": "Простори дозволяють об'єднувати ваші бесіди та створювати приватні або загальнодоступні спільноти.", + "@newSpaceDescription": {}, + "encryptThisChat": "Зашифрувати цю бесіду", + "@encryptThisChat": {}, + "disableEncryptionWarning": "З міркувань безпеки ви не можете вимкнути шифрування в бесіді, ув якій воно було ввімкнене раніше.", + "@disableEncryptionWarning": {}, + "sorryThatsNotPossible": "Вибачте... це неможливо", + "@sorryThatsNotPossible": {}, + "deviceKeys": "Ключі пристрою:", + "@deviceKeys": {}, + "reopenChat": "Відновити бесіду", + "@reopenChat": {}, + "noOtherDevicesFound": "Інших пристроїв не знайдено", + "@noOtherDevicesFound": {}, + "noBackupWarning": "Увага! Якщо ви не ввімкнете резервне копіювання бесіди, ви втратите доступ до своїх зашифрованих повідомлень. Наполегливо радимо ввімкнути резервне копіювання бесіди перед виходом.", + "@noBackupWarning": {}, + "fileIsTooBigForServer": "Не вдалося надіслати! Сервер підтримує вкладення розміром до {max}.", + "@fileIsTooBigForServer": {}, + "fileHasBeenSavedAt": "Файл збережено в {path}", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "jumpToLastReadMessage": "Перейти до останнього прочитаного повідомлення", + "@jumpToLastReadMessage": {}, + "readUpToHere": "Читати тут", + "@readUpToHere": {}, + "jump": "Перейти", + "@jump": {}, + "openLinkInBrowser": "Відкрити посилання у браузері", + "@openLinkInBrowser": {}, + "allRooms": "Усі групові бесіди", + "@allRooms": { + "type": "String", + "placeholders": {} + }, + "reportErrorDescription": "О, ні. Щось пішло не так. Якщо хочете, можете повідомити про помилку розробникам.", + "@reportErrorDescription": {}, + "report": "повідомити", + "@report": {}, + "pleaseTryAgainLaterOrChooseDifferentServer": "Спробуйте пізніше або виберіть інший сервер.", + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "signInWithPassword": "Увійти за допомогою пароля", + "@signInWithPassword": {}, + "signInWith": "Увійти через {provider}", + "@signInWith": { + "type": "String", + "placeholders": { + "provider": { + "type": "String" + } + } + }, + "notAnImage": "Не файл зображення.", + "@notAnImage": {}, + "importNow": "Імпортувати зараз", + "@importNow": {}, + "importEmojis": "Імпорт емодзі", + "@importEmojis": {}, + "importFromZipFile": "Імпорт з файлу .zip", + "@importFromZipFile": {}, + "replace": "Замінити", + "@replace": {}, + "exportEmotePack": "Експортувати набір смайликів у форматі .zip", + "@exportEmotePack": {}, + "sendTypingNotifications": "Надсилати сповіщення про ввід тексту", + "@sendTypingNotifications": {}, + "createGroup": "Створити групу", + "@createGroup": {}, + "inviteContactToGroupQuestion": "Хочете запросити {contact} до бесіди \"{groupName}\"?", + "@inviteContactToGroupQuestion": {}, + "messagesStyle": "Повідомлення:", + "@messagesStyle": {}, + "shareInviteLink": "Надіслати запрошувальне посилання", + "@shareInviteLink": {}, + "tryAgain": "Повторіть спробу", + "@tryAgain": {}, + "setTheme": "Налаштувати тему:", + "@setTheme": {}, + "setColorTheme": "Налаштувати колірну тему:", + "@setColorTheme": {}, + "addChatDescription": "Додати опис бесіди...", + "@addChatDescription": {}, + "chatPermissions": "Дозволи бесіди", + "@chatPermissions": {}, + "chatDescription": "Опис бесіди", + "@chatDescription": {}, + "chatDescriptionHasBeenChanged": "Опис бесіди змінено", + "@chatDescriptionHasBeenChanged": {}, + "noChatDescriptionYet": "Опис бесіди ще не створено.", + "@noChatDescriptionYet": {}, + "invalidServerName": "Недійсна назва сервера", + "@invalidServerName": {}, + "optionalRedactReason": "(Необов'язково) Причина редагування цього повідомлення...", + "@optionalRedactReason": {}, + "redactedBy": "Відредаговано {username}", + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "directChat": "Особисте повідомлення", + "@directChat": {}, + "redactedByBecause": "Відредаговано {username}, тому що: \"{reason}\"", + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "profileNotFound": "Не вдалося знайти користувача на сервері. Можливо, проблема зі з'єднанням або користувач не існує.", + "@profileNotFound": {}, + "invite": "Запросити", + "@invite": {}, + "redactMessageDescription": "Повідомлення буде відредаговано для всіх учасників цієї розмови. Це не можна скасувати.", + "@redactMessageDescription": {}, + "setChatDescription": "Налаштувати опис бесіди", + "@setChatDescription": {}, + "inviteGroupChat": "📨 Запросити до групової бесіди", + "@inviteGroupChat": {}, + "invitePrivateChat": "📨 Запросити до приватної бесіди", + "@invitePrivateChat": {}, + "emoteKeyboardNoRecents": "Тут з'являться нещодавно використані смайлики...", + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "invalidInput": "Недійсний ввід!", + "@invalidInput": {}, + "wrongPinEntered": "Введено неправильний PIN! Повторіть спробу за {seconds} секунд...", + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "banUserDescription": "Користувача буде заблоковано в бесіді, і він не зможе знову увійти в неї, поки його не буде розблоковано.", + "@banUserDescription": {}, + "removeDevicesDescription": "Ви вийдете з цього пристрою і більше не зможете отримувати повідомлення.", + "@removeDevicesDescription": {}, + "unbanUserDescription": "Користувач зможе знову увійти в бесіду, якщо спробує.", + "@unbanUserDescription": {}, + "pushNotificationsNotAvailable": "Push-сповіщення недоступні", + "@pushNotificationsNotAvailable": {}, + "makeAdminDescription": "Після того, як ви зробите цього користувача адміністратором, ви, можливо, не зможете це скасувати, оскільки він матиме ті самі права, що й ви.", + "@makeAdminDescription": {}, + "archiveRoomDescription": "Бесіду буде переміщено до архіву. Інші користувачі зможуть побачити, що ви вийшли з неї.", + "@archiveRoomDescription": {}, + "hasKnocked": "🚪{user} стукає до вас", + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "learnMore": "Докладніше", + "@learnMore": {}, + "roomUpgradeDescription": "Після цього бесіду буде відтворено з новою версією кімнати. Усі учасники отримають сповіщення, що їм потрібно перейти до нової бесіди. Ви можете дізнатися більше про версії кімнат на https://spec.matrix.org/latest/rooms/", + "@roomUpgradeDescription": {}, + "pleaseEnterANumber": "Введіть число більше ніж 0", + "@pleaseEnterANumber": {}, + "kickUserDescription": "Користувача вигнали з бесіди, але не заблокували. До загальнодоступних бесід користувач може приєднатися будь-коли.", + "@kickUserDescription": {}, + "blockListDescription": "Ви можете заблокувати користувачів, які вас турбують. Ви не зможете отримувати жодних повідомлень або запрошень до кімнати від користувачів з вашого персонального списку блокування.", + "@blockListDescription": {}, + "createGroupAndInviteUsers": "Створити групу та запросити користувачів", + "@createGroupAndInviteUsers": {}, + "startConversation": "Розпочати розмову", + "@startConversation": {}, + "blockedUsers": "Заблоковані користувачі", + "@blockedUsers": {}, + "groupCanBeFoundViaSearch": "Групу можна знайти через пошук", + "@groupCanBeFoundViaSearch": {}, + "noUsersFoundWithQuery": "На жаль, не знайдено жодного користувача з запитом \"{query}\".Перевірте, чи не було допущено помилки.", + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "block": "Заблокувати", + "@block": {}, + "yourGlobalUserIdIs": "Ваш глобальний ID користувача: ", + "@yourGlobalUserIdIs": {}, + "commandHint_sendraw": "Надіслати необроблений json", + "@commandHint_sendraw": {}, + "wrongRecoveryKey": "Вибачте... схоже, це неправильний ключ відновлення.", + "@wrongRecoveryKey": {}, + "blockUsername": "Ігнорувати ім'я користувача", + "@blockUsername": {}, + "groupName": "Назва групи", + "@groupName": {}, + "databaseMigrationTitle": "Базу даних оптимізовано", + "@databaseMigrationTitle": {}, + "searchChatsRooms": "Пошук для #chats, @users...", + "@searchChatsRooms": {}, + "databaseMigrationBody": "Зачекайте, будь ласка. Це може тривати деякий час.", + "@databaseMigrationBody": {}, + "thisDevice": "Цей пристрій:", + "@thisDevice": {}, + "publicSpaces": "Загальнодоступний простір", + "@publicSpaces": {}, + "passwordIsWrong": "Введений пароль неправильний", + "@passwordIsWrong": {}, + "pleaseEnterYourCurrentPassword": "Введіть поточний пароль", + "@pleaseEnterYourCurrentPassword": {}, + "publicLink": "Загальнодоступне посилання", + "@publicLink": {}, + "nothingFound": "Нічого не знайдено...", + "@nothingFound": {}, + "decline": "Відхилити", + "@decline": {}, + "newPassword": "Новий пароль", + "@newPassword": {}, + "passwordsDoNotMatch": "Паролі відрізняються", + "@passwordsDoNotMatch": {}, + "subspace": "Підпростір", + "@subspace": {}, + "select": "Вибрати", + "@select": {}, + "pleaseChooseAStrongPassword": "Виберіть надійний пароль", + "@pleaseChooseAStrongPassword": {}, + "addChatOrSubSpace": "Додати бесіду або підпростір", + "@addChatOrSubSpace": {}, + "leaveEmptyToClearStatus": "Лишіть порожнім, щоб оновити статус.", + "@leaveEmptyToClearStatus": {}, + "joinSpace": "Приєднатися до простору", + "@joinSpace": {}, + "searchForUsers": "Пошук @користувачів...", + "@searchForUsers": {}, + "sessionLostBody": "Ваш сеанс втрачено. Будь ласка, повідомте про цю помилку розробникам за адресою {url}. Текст помилки: {error}", + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "databaseBuildErrorBody": "Не вдалося створити базу даних SQlite. Застосунок намагається використовувати стару базу даних. Будь ласка, повідомте про цю помилку розробникам за адресою {url}. Текст помилки: {error}", + "@databaseBuildErrorBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "initAppError": "Виникла помилка під час запуску застосунку", + "@initAppError": {}, + "restoreSessionBody": "Наразі застосунок намагається відновити ваш сеанс з резервної копії. Будь ласка, повідомте про цю помилку розробникам за адресою {url}. Текст помилки: {error}", + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "youInvitedToBy": "📩 Вас запрошено за посиланням на:\n{alias}", + "@youInvitedToBy": { + "placeholders": { + "alias": { + "type": "String" + } + } + }, + "acceptedKeyVerification": "{sender} погоджується звірити ключі", + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "canceledKeyVerification": "{sender} скасовує звірення ключів", + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "requestedKeyVerification": "{sender} просить звірити ключі", + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "transparent": "Прозорий", + "@transparent": {}, + "sendReadReceiptsDescription": "Інші учасники бесіди бачитимуть, що ви прочитали повідомлення.", + "@sendReadReceiptsDescription": {}, + "formattedMessages": "Форматовані повідомлення", + "@formattedMessages": {}, + "forwardMessageTo": "Переслати повідомлення до {roomName}?", + "@forwardMessageTo": { + "type": "String", + "placeholders": { + "roomName": { + "type": "String" + } + } + }, + "sendReadReceipts": "Надіслати підтвердження прочитання", + "@sendReadReceipts": {}, + "sendTypingNotificationsDescription": "Інші учасники бесіди бачитимуть, коли ви набираєте нове повідомлення.", + "@sendTypingNotificationsDescription": {}, + "formattedMessagesDescription": "Показувати розширений вміст повідомлень, наприклад, жирний текст, використовуючи markdown.", + "@formattedMessagesDescription": {}, + "verifyOtherUser": "🔐 Звірити іншого користувача", + "@verifyOtherUser": {}, + "verifyOtherUserDescription": "Якщо ви звіряєте іншого користувача, ви можете бути впевнені, що знаєте, кому ви насправді пишете. 💪\n\nКоли ви почнете звірення, ви та інший користувач побачите спливне вікно в застосунку. Там ви побачите набір смайликів або чисел, які вам потрібно буде порівняти між собою.\n\nНайкращий спосіб зробити це — зустрітися або розпочати відеовиклик. 👭", + "@verifyOtherUserDescription": {}, + "verifyOtherDeviceDescription": "Коли ви звіряєте інший пристрій, ці пристрої можуть обмінюватися ключами, підвищуючи вашу загальну безпеку. 💪 Коли ви розпочнете звірення, в застосунку на обох пристроях з'явиться спливне вікно. Там ви побачите набір смайликів або чисел, які вам потрібно буде порівняти між собою. Найкраще мати обидва пристрої під рукою перед початком звірення. 🤳", + "@verifyOtherDeviceDescription": {}, + "verifyOtherDevice": "🔐 Звірити інший пристрій", + "@verifyOtherDevice": {}, + "completedKeyVerification": "{sender} завершує звірення ключів", + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "isReadyForKeyVerification": "{sender} готовий до звірення ключів", + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "startedKeyVerification": "{sender} розпочинає звірення ключів", + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "presenceStyle": "Присутність:", + "@presenceStyle": { + "type": "String", + "placeholders": {} + }, + "presencesToggle": "Показувати повідомлення про стан від інших користувачів", + "@presencesToggle": { + "type": "String", + "placeholders": {} + }, + "hidePresences": "Сховати список станів?", + "@hidePresences": {}, + "incomingMessages": "Вхідні повідомлення", + "@incomingMessages": {}, + "discover": "Огляд", + "@discover": {}, + "stickers": "Наліпки", + "@stickers": {}, + "searchIn": "Пошук у бесіді \"{chat}\"...", + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "commandHint_ignore": "Ігнорувати цей Matrix ID", + "@commandHint_ignore": {}, + "restricted": "Обмежено", + "@restricted": {}, + "swipeRightToLeftToReply": "Посунути праворуч або ліворуч, щоб відповісти", + "@swipeRightToLeftToReply": {}, + "globalChatId": "Глобальний ID бесіди", + "@globalChatId": {}, + "accessAndVisibility": "Доступ і видимість", + "@accessAndVisibility": {}, + "accessAndVisibilityDescription": "Хто може приєднатися до цієї бесіди і як її можна знайти.", + "@accessAndVisibilityDescription": {}, + "calls": "Виклики", + "@calls": {}, + "customEmojisAndStickers": "Власні емоджі та наліпки", + "@customEmojisAndStickers": {}, + "customEmojisAndStickersBody": "Додавайте або діліться власними емоджі або наліпками, які можна використовувати в будь-якій бесіді.", + "@customEmojisAndStickersBody": {}, + "createNewAddress": "Створити нову адресу", + "@createNewAddress": {}, + "userRole": "Роль користувача", + "@userRole": {}, + "minimumPowerLevel": "{level} — це найнижчий рівень повноважень.", + "@minimumPowerLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "String" + } + } + }, + "commandHint_unignore": "Не ігнорувати цей Matrix ID", + "@commandHint_unignore": {}, + "knockRestricted": "Стук обмежено", + "@knockRestricted": {}, + "appLockDescription": "Блокувати застосунок, коли не використовується ПІН-код", + "@appLockDescription": {}, + "hideRedactedMessages": "Сховати змінені повідомлення", + "@hideRedactedMessages": {}, + "hideRedactedMessagesBody": "Якщо хтось змінить повідомлення, його більше не буде видно в бесіді.", + "@hideRedactedMessagesBody": {}, + "hideInvalidOrUnknownMessageFormats": "Сховати недійсні або невідомі формати повідомлень", + "@hideInvalidOrUnknownMessageFormats": {}, + "hideMemberChangesInPublicChats": "Сховати зміни користувачів у загальнодоступних бесідах", + "@hideMemberChangesInPublicChats": {}, + "hideMemberChangesInPublicChatsBody": "Не показувати в хронології бесіди, якщо хтось приєднується до загальнодоступної бесіди або виходить з неї, щоб покращити її читабельність.", + "@hideMemberChangesInPublicChatsBody": {}, + "overview": "Огляд", + "@overview": {}, + "notifyMeFor": "Сповіщати мене про", + "@notifyMeFor": {}, + "passwordRecoverySettings": "Налаштування відновлення пароля", + "@passwordRecoverySettings": {}, + "userWouldLikeToChangeTheChat": "{user} хоче приєднатися до бесіди.", + "@userWouldLikeToChangeTheChat": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "noPublicLinkHasBeenCreatedYet": "Загальнодоступне посилання ще не створено", + "@noPublicLinkHasBeenCreatedYet": {}, + "knock": "Постукатись", + "@knock": {}, + "knocking": "Стукаються", + "@knocking": {}, + "noDatabaseEncryption": "Шифрування бази даних не підтримується на цій платформі", + "@noDatabaseEncryption": {}, + "usersMustKnock": "Користувачі повинні постукатись", + "@usersMustKnock": {}, + "noOneCanJoin": "Ніхто не може приєднатись", + "@noOneCanJoin": {}, + "chatCanBeDiscoveredViaSearchOnServer": "Бесіду можна знайти за допомогою пошуку на {server}", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "publicChatAddresses": "Адреси загальнодоступної бесіди", + "@publicChatAddresses": {}, + "searchMore": "Шукати ще...", + "@searchMore": {}, + "gallery": "Галерея", + "@gallery": {}, + "files": "Файли", + "@files": {}, + "unreadChatsInApp": "{appname}: {unread} непрочитаних бесід", + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "thereAreCountUsersBlocked": "Наразі заблоковано {count} користувачів.", + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "moderatorLevel": "{level} - Модератор", + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "adminLevel": "{level} - Адміністратор", + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "userLevel": "{level} - Користувач", + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "changeGeneralChatSettings": "Змінити загальні налаштування чату", + "@changeGeneralChatSettings": {}, + "inviteOtherUsers": "Запросити інших користувачів до цього чату", + "@inviteOtherUsers": {}, + "changeTheChatPermissions": "Змінити права доступу до чату", + "@changeTheChatPermissions": {}, + "changeTheVisibilityOfChatHistory": "Змінити видимість історії чату", + "@changeTheVisibilityOfChatHistory": {}, + "changeTheCanonicalRoomAlias": "Змінити основну адресу загальнодоступного чату", + "@changeTheCanonicalRoomAlias": {}, + "sendRoomNotifications": "Надсилати сповіщення @room", + "@sendRoomNotifications": {}, + "space": "Простір", + "@space": {}, + "spaces": "Простори", + "@spaces": {}, + "goToSpace": "Перейти до простору: {space}", + "@goToSpace": { + "type": "String", + "space": {} + }, + "markAsUnread": "Позначити непрочитаним", + "@markAsUnread": {}, + "alwaysUse24HourFormat": "ні", + "@alwaysUse24HourFormat": { + "description": "Set to true to always display time of day in 24 hour format." + }, + "invitedBy": "📩 Запрошений {user}", + "@invitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "changeTheDescriptionOfTheGroup": "Змінити опис чату", + "@changeTheDescriptionOfTheGroup": {}, + "updateInstalled": "🎉 Оновлення {version} встановлено!", + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "changelog": "Зміни", + "@changelog": {}, + "chatPermissionsDescription": "Визначте, який рівень повноважень необхідний для певних дій у цьому чаті. Рівні повноважень 0, 50 і 100 зазвичай представляють користувачів, модераторів та адміністраторів, але можливі будь-які градації.", + "@chatPermissionsDescription": {}, + "countChatsAndCountParticipants": "{chats} чати та {participants} учасників", + "@countChatsAndCountParticipants": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + }, + "participants": { + "type": "int" + } + } + }, + "noMoreChatsFound": "Більше чатів не знайдено...", + "@noMoreChatsFound": {}, + "joinedChats": "Приєднані чати", + "@joinedChats": {}, + "unread": "Непрочитані", + "@unread": {}, + "sendCanceled": "Надсилання скасовано", + "@sendCanceled": {}, + "noChatsFoundHere": "Бесід ще немає. Розпочніть спілкування натиснувши кнопку нижче. ⤵️", + "@noChatsFoundHere": {}, + "loginWithMatrixId": "Увійти за допомогою Matrix-ID", + "@loginWithMatrixId": {}, + "discoverHomeservers": "Знайти домашні сервери", + "@discoverHomeservers": {}, + "whatIsAHomeserver": "Що таке домашній сервер?", + "@whatIsAHomeserver": {}, + "homeserverDescription": "Усі ваші дані зберігаються на домашньому сервері, так само як у постачальника послуг електронної пошти. Ви можете вибрати, який домашній сервер ви хочете використовувати, водночас ви можете спілкуватися з усіма. Докладніше на https://matrix.org.", + "@homeserverDescription": {}, + "doesNotSeemToBeAValidHomeserver": "Здається, це несумісний домашній сервер. Неправильна URL-адреса?", + "@doesNotSeemToBeAValidHomeserver": {}, + "calculatingFileSize": "Обчислення розміру файлу...", + "@calculatingFileSize": {}, + "prepareSendingAttachment": "Підготовка до надсилання вкладення...", + "@prepareSendingAttachment": {}, + "sendingAttachment": "Надсилання вкладення...", + "@sendingAttachment": {}, + "generatingVideoThumbnail": "Генерування мініатюри відео...", + "@generatingVideoThumbnail": {}, + "compressVideo": "Стиснення відео...", + "@compressVideo": {}, + "sendingAttachmentCountOfCount": "Надсилання вкладення {index} з {length}...", + "@sendingAttachmentCountOfCount": { + "type": "integer", + "placeholders": { + "index": { + "type": "int" + }, + "length": { + "type": "int" + } + } + }, + "serverLimitReached": "Досягнуто ліміту сервера! Очікування {seconds} секунд...", + "@serverLimitReached": { + "type": "integer", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "oneOfYourDevicesIsNotVerified": "Один із ваших пристроїв не верифікований", + "@oneOfYourDevicesIsNotVerified": {}, + "noticeChatBackupDeviceVerification": "Примітка: Коли ви під'єднуєте всі свої пристрої до резервної копії бесіди, вони автоматично верифікуються.", + "@noticeChatBackupDeviceVerification": {}, + "continueText": "Продовжити", + "@continueText": {}, + "manageAccount": "Керувати обліковим записом", + "@manageAccount": {}, + "welcomeText": "Привіт-привіт 👋 Це FluffyChat. Ви можете увійти на будь-який сервер, сумісний із https://matrix.org. А потім спілкуватися з будь-ким. Це величезна децентралізована мережа для обміну повідомленнями!", + "@welcomeText": {}, + "blur": "Розмиття:", + "@blur": {}, + "opacity": "Прозорість:", + "@opacity": {}, + "setWallpaper": "Встановити шпалери", + "@setWallpaper": {}, + "aboutHomeserver": "Про {homeserver}", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "noContactInformationProvided": "Сервер не надає жодної дійсної контактної інформації", + "@noContactInformationProvided": {}, + "contactServerSecurity": "Зв’язатися з відділом безпеки сервера", + "@contactServerSecurity": {}, + "supportPage": "Сторінка підтримки", + "@supportPage": {}, + "serverInformation": "Інформація про сервер:", + "@serverInformation": {}, + "contactServerAdmin": "Зв’язатися з адміністратором сервера", + "@contactServerAdmin": {}, + "name": "Ім'я", + "@name": {}, + "version": "Версія", + "@version": {}, + "website": "Вебсайт", + "@website": {}, + "compressBeforeSending": "Стиснути перед відправленням", + "@compressBeforeSending": {}, + "sendUncompressed": "Відправити без стиснення", + "@sendUncompressed": {}, + "boldText": "Жирний текст", + "@boldText": {}, + "italicText": "Курсивний текст", + "@italicText": {}, + "strikeThrough": "Перекреслений текст", + "@strikeThrough": {}, + "pleaseFillOut": "Будь ласка, заповніть", + "@pleaseFillOut": {}, + "invalidUrl": "Недійсний URL", + "@invalidUrl": {}, + "addLink": "Додати посилання", + "@addLink": {}, + "unableToJoinChat": "Неможливо приєднатися до бесіди. Можливо, інша сторона вже закрила розмову.", + "@unableToJoinChat": {}, + "sendImages": "Надіслати {count} зображення", + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "compress": "Стиснути", + "@compress": {}, + "otherPartyNotLoggedIn": "Інша сторона наразі не увійшла в систему, тому не може отримувати повідомлення!", + "@otherPartyNotLoggedIn": {}, + "previous": "Попередній", + "@previous": {}, + "synchronizingPleaseWaitCounter": " Синхронізація… ({percentage}%)", + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "newChatRequest": "📩 Новий запит на спілкування", + "@newChatRequest": {}, + "allDevices": "Усім пристроям", + "@allDevices": {}, + "crossVerifiedDevicesIfEnabled": "З перехресною верифікацією пристроїв, якщо ввімкнено", + "@crossVerifiedDevicesIfEnabled": {}, + "crossVerifiedDevices": "З перехресною верифікацією пристроїв", + "@crossVerifiedDevices": {}, + "appWantsToUseForLogin": "Використати '{server}', щоб увійти", + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "appWantsToUseForLoginDescription": "Цим ви дозволяєте застосунку та вебсайту ділитися інформацією про вас.", + "@appWantsToUseForLoginDescription": {}, + "open": "Відкрити", + "@open": {}, + "waitingForServer": "Очікування сервера...", + "@waitingForServer": {}, + "appIntroduction": "FluffyChat дає змогу спілкуватися з друзями у різних месенджерах. Дізнайтеся більше на https://matrix.org або просто натисніть *Продовжити*.", + "@appIntroduction": {}, + "shareKeysWithDescription": "Яким пристроям довіряти, щоб вони могли читати ваші повідомлення в зашифрованих бесідах?", + "@shareKeysWithDescription": {}, + "verifiedDevicesOnly": "Лише верифіковані пристрої", + "@verifiedDevicesOnly": {}, + "contentNotificationSettings": "Налаштування сповіщень про вміст", + "@contentNotificationSettings": {}, + "generalNotificationSettings": "Загальні налаштування сповіщень", + "@generalNotificationSettings": {}, + "roomNotificationSettings": "Налаштування сповіщень кімнати", + "@roomNotificationSettings": {}, + "userSpecificNotificationSettings": "Налаштування сповіщень для користувача", + "@userSpecificNotificationSettings": {}, + "otherNotificationSettings": "Інші налаштування сповіщень", + "@otherNotificationSettings": {}, + "notificationRuleContainsUserName": "Містить ім'я користувача", + "@notificationRuleContainsUserName": {}, + "notificationRuleContainsUserNameDescription": "Сповіщає користувача, коли повідомлення містить його ім'я користувача.", + "@notificationRuleContainsUserNameDescription": {}, + "notificationRuleMaster": "Вимкнути всі сповіщення", + "@notificationRuleMaster": {}, + "notificationRuleMasterDescription": "Перевизначає всі інші правила і вимикає всі сповіщення.", + "@notificationRuleMasterDescription": {}, + "notificationRuleSuppressNotices": "Заборонити автоматичні повідомлення", + "@notificationRuleSuppressNotices": {}, + "notificationRuleInviteForMe": "Запрошення мене", + "@notificationRuleInviteForMe": {}, + "notificationRuleInviteForMeDescription": "Сповіщає користувача, коли його запрошують до кімнати.", + "@notificationRuleInviteForMeDescription": {}, + "notificationRuleMemberEvent": "Події участі", + "@notificationRuleMemberEvent": {}, + "notificationRuleMemberEventDescription": "Забороняє сповіщення про події учасників.", + "@notificationRuleMemberEventDescription": {}, + "notificationRuleSuppressNoticesDescription": "Забороняє сповіщення від автоматизованих клієнтів, таких як боти.", + "@notificationRuleSuppressNoticesDescription": {}, + "notificationRuleIsUserMention": "Згадки користувачів", + "@notificationRuleIsUserMention": {}, + "commandHint_roomupgrade": "Оновити цю кімнату до версії даної кімнати", + "@commandHint_roomupgrade": {}, + "notificationRuleIsUserMentionDescription": "Сповіщає користувачів, коли безпосередньо їх згадують у повідомленні.", + "@notificationRuleIsUserMentionDescription": {}, + "notificationRuleContainsDisplayName": "Містить показуване ім’я", + "@notificationRuleContainsDisplayName": {}, + "notificationRuleIsRoomMentionDescription": "Сповіщає користувача, коли є згадка всієї кімнати.", + "@notificationRuleIsRoomMentionDescription": {}, + "notificationRuleRoomnotif": "Сповіщення кімнати", + "@notificationRuleRoomnotif": {}, + "notificationRuleRoomnotifDescription": "Сповіщає користувача, коли повідомлення містить '@room'.", + "@notificationRuleRoomnotifDescription": {}, + "notificationRuleContainsDisplayNameDescription": "Сповіщає користувача, коли повідомлення містить показуване ім'я.", + "@notificationRuleContainsDisplayNameDescription": {}, + "notificationRuleIsRoomMention": "Згадки кімнати", + "@notificationRuleIsRoomMention": {} +} diff --git a/assets/l10n/intl_vi.arb b/assets/l10n/intl_vi.arb new file mode 100644 index 0000000..0548e72 --- /dev/null +++ b/assets/l10n/intl_vi.arb @@ -0,0 +1,735 @@ +{ + "@@last_modified": "2021-08-14 12:41:09.781172", + "about": "Giới thiệu", + "@about": { + "type": "String", + "placeholders": {} + }, + "accept": "Đồng ý", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "{username} đã đồng ý lời mời", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "Tài khoản", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "{username} đã kích hoạt mã hóa đầu cuối 2 chiều", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "admin": "Quản trị viên", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "bí danh", + "@alias": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "{senderName} đã trả lời cuộc gọi", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "Mọi người đều có thể gia nhập", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "archive": "Lưu trữ", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "Khách vãng lai có được tham gia không", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "Bạn chắc chứ?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "blockDevice": "Thiết bị bị chặn", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "verified": "Đã xác thực", + "@verified": { + "type": "String", + "placeholders": {} + }, + "transferFromAnotherDevice": "Chuyển từ thiết bị khác", + "@transferFromAnotherDevice": { + "type": "String", + "placeholders": {} + }, + "showPassword": "Hiển thị mật khẩu", + "@showPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "Vui lòng làm theo hướng dẫn trên trang web và bấm tiếp", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "Bạn chỉ có thể kích hoạt mã hoá khi phòng này không mở", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "next": "Tiếp", + "@next": { + "type": "String", + "placeholders": {} + }, + "everythingReady": "Mọi thứ đã sẵn sàng!", + "@everythingReady": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "Cài đặt biểu tượng cảm xúc", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "editDisplayname": "Sửa tên hiển thị", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "Tải ảnh xuống", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "Tên hiển thị đã được thay đổi", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "devices": "Các thiết bị", + "@devices": { + "type": "String", + "placeholders": {} + }, + "deviceId": "Mã xác định thiết bị", + "@deviceId": { + "type": "String", + "placeholders": {} + }, + "device": "Thiết bị", + "@device": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "Xoá tin nhắn", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "Xoá tài khoản", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "delete": "Xoá", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deactivateAccountWarning": "Việc này sẽ vô hiệu hoá tài khoản của bạn. Điều này không thể đảo ngược được! Bạn chắc là vẫn muốn tiếp tục chứ?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "dateWithYear": "{day}/{month}/{year}", + "@dateWithYear": { + "type": "String", + "placeholders": { + "year": { + "type": "String" + }, + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "dateWithoutYear": "{day}/{month}", + "@dateWithoutYear": { + "type": "String", + "placeholders": { + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "currentlyActive": "Đang hoạt động", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "{username} đã tạo cuộc trò chuyện", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "create": "Tạo", + "@create": { + "type": "String", + "placeholders": {} + }, + "countParticipants": "{count} thành viên", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "couldNotDecryptMessage": "Không thể giải mã tin nhắn: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "copy": "Sao chép", + "@copy": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "Liên hệ đã được mời vào nhóm", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "connect": "Kết nối", + "@connect": { + "type": "String", + "placeholders": {} + }, + "confirm": "Xác nhận", + "@confirm": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "So sánh và đảm bảo các số sau đây giống trên máy còn lại", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "compareEmojiMatch": "So sánh và đảm bảo các biểu tượng cảm xúc sau đây giống với các biểu tượng trên máy còn lại", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "close": "Đóng", + "@close": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "Chọn một mật khẩu mạnh", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Chi tiết cuộc trò chuyện", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chatBackupDescription": "Bản sao lưu cuộc trò chuyện của bạn được bảo mật bằng một khoá bảo mật. Bạn đừng làm mất nó.", + "@chatBackupDescription": { + "type": "String", + "placeholders": {} + }, + "chatBackup": "Sao lưu cuộc trò chuyện", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "chat": "Chat", + "@chat": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "Thay đổi tên nhóm", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "Thay đổi máy chủ nhà", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changePassword": "Thay đổi mật khẩu", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changedTheRoomInvitationLink": "{username} đã thay đổi đường dẫn mời", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "{username} đã đổi địa chỉ phòng chat", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} đã thay đổi ảnh đại diện của mình", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} đã thay đổi quy tắc truy cập đối với khách thành: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} đã thay đổi quy tắc truy cập đối với khách", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username} đã thay đổi quyền trong phòng chat", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatNameTo": "{username} đã thay đổi tên phòng chat thành: '{chatname}'", + "@changedTheChatNameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "chatname": { + "type": "String" + } + } + }, + "changedTheChatDescriptionTo": "{username} đã thay đổi mô tả phòng chat thành: '{description}'", + "@changedTheChatDescriptionTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "description": { + "type": "String" + } + } + }, + "changedTheChatAvatar": "{username} đã thay đổi ảnh phòng chat", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changeDeviceName": "Thay đổi tên thiết bị", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "cancel": "Hủy", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "blocked": "Đã chặn", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username} đã cấm {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "banned": "Đã bị cấm", + "@banned": { + "type": "String", + "placeholders": {} + }, + "banFromChat": "Cấm khỏi cuộc trò chuyện", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "badServerVersionsException": "Máy chủ nhà hỗ trợ Spec phiên bản:\n{serverVerions}\nNhưng ứng dụng này chỉ hỗ trợ {supportedVersions}", + "@badServerVersionsException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "badServerLoginTypesException": "Máy chủ nhà hỗ trợ kiểu đăng nhập:\n{serverVersions}\nNhưng ứng dụng này chỉ hỗ trợ:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "askVerificationRequest": "Bạn có đồng ý yêu cầu chứng thực từ {username} không?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "areYouSureYouWantToLogout": "Bạn có chắc bạn muốn đăng xuất không?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "addEmail": "Thêm email", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "notifications": "Thông báo", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "newGroup": "Nhóm mới", + "@newGroup": {}, + "pleaseEnterANumber": "Hãy nhập số lớn hơn 0", + "@pleaseEnterANumber": {}, + "newSpaceDescription": "Không gian cho phép bạn hợp nhất các cuộc trò chuyện của mình và xây dựng cộng đồng riêng tư hoặc công khai.", + "@newSpaceDescription": {}, + "disableEncryptionWarning": "Vì lý do bảo mật, bạn không thể tắt tính năng mã hóa trong cuộc trò chuyện đã được bật tính năng này trước đó.", + "@disableEncryptionWarning": {}, + "makeAdminDescription": "Khi bạn đặt người dùng này làm quản trị viên, bạn không thể hoàn tác việc này vì khi đó họ sẽ có quyền ngang bạn.", + "@makeAdminDescription": {}, + "setColorTheme": "Chọn màu giao diện:", + "@setColorTheme": {}, + "callingAccount": "Gọi tài khoản", + "@callingAccount": {}, + "openLinkInBrowser": "Mở đường dẫn trong trình duyệt", + "@openLinkInBrowser": {}, + "setTheme": "Chọn giao diện:", + "@setTheme": {}, + "invitePrivateChat": "📨 Mời trò chuyện riêng tư", + "@invitePrivateChat": {}, + "inviteGroupChat": "📨 Mời nhóm trò chuyện", + "@inviteGroupChat": {}, + "addToSpace": "Thêm vào không gian", + "@addToSpace": {}, + "importEmojis": "Nhập Biểu cảm", + "@importEmojis": {}, + "importFromZipFile": "Nhập vào từ tệp .zip", + "@importFromZipFile": {}, + "exportEmotePack": "Xuất gói biểu cảm bằng tệp .zip", + "@exportEmotePack": {}, + "hideUnimportantStateEvents": "Ẩn các sự kiện không quan trọng", + "@hideUnimportantStateEvents": {}, + "replace": "Thay thế", + "@replace": {}, + "addChatDescription": "Thêm mô tả hội thoại...", + "@addChatDescription": {}, + "report": "báo cáo", + "@report": {}, + "remove": "Loại bỏ", + "@remove": { + "type": "String", + "placeholders": {} + }, + "restricted": "Bị hạn chế", + "@restricted": {}, + "newSpace": "Không gian mới", + "@newSpace": {}, + "enterRoom": "Nhập phòng", + "@enterRoom": {}, + "signInWithPassword": "Đăng nhập với mật khẩu", + "@signInWithPassword": {}, + "all": "Tất cả", + "@all": { + "type": "String", + "placeholders": {} + }, + "appLock": "Khoá ứng dụng", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "allChats": "Tất cả hội thoại", + "@allChats": { + "type": "String", + "placeholders": {} + }, + "repeatPassword": "Nhập lại mật khẩu", + "@repeatPassword": {}, + "confirmMatrixId": "Hãy xác nhận Matrix ID để xoá tài khoản.", + "@confirmMatrixId": {}, + "supposedMxid": "Đây nên là {mxid}", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "noBackupWarning": "Cẩn thận! Nếu không bật sao lưu trò chuyện, bạn sẽ mất quyền truy cập vào tin nhắn được mã hóa của mình. Chúng tôi khuyên bạn nên bật sao lưu trò chuyện trước khi đăng xuất.", + "@noBackupWarning": {}, + "doNotShowAgain": "Không hiện lại nữa", + "@doNotShowAgain": {}, + "wasDirectChatDisplayName": "Hội thoại trống (từng là {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "reportErrorDescription": "😭 Ôi. Có lỗi xảy ra. Bạn có thể báo cáo lỗi tới nhà phát triển nếu muốn.", + "@reportErrorDescription": {}, + "profileNotFound": "Không tìm thấy người dùng này tại máy chủ. Có thể do lỗi kết nối hoặc người dùng không tồn tại.", + "@profileNotFound": {}, + "banUserDescription": "Người dùng sẽ bị cấm khỏi cuộc trò chuyện và không thể tham gia lại cho tới khi được gỡ cấm.", + "@banUserDescription": {}, + "learnMore": "Tìm hiểu thêm", + "@learnMore": {}, + "incomingMessages": "Tin nhắn đến", + "@incomingMessages": {}, + "encryptThisChat": "Mã hóa cuộc trò chuyện này", + "@encryptThisChat": {}, + "noOtherDevicesFound": "Không tìm thấy thiết bị khác", + "@noOtherDevicesFound": {}, + "fileIsTooBigForServer": "Máy chủ báo cáo rằng tệp tin quá lớn để gửi.", + "@fileIsTooBigForServer": {}, + "signInWith": "Đăng nhập với {provider}", + "@signInWith": { + "type": "String", + "placeholders": { + "provider": { + "type": "String" + } + } + }, + "notAnImage": "Không phải tệp ảnh.", + "@notAnImage": {}, + "importNow": "Nhập vào", + "@importNow": {}, + "allSpaces": "Tất cả không gian", + "@allSpaces": {}, + "enterSpace": "Nhập không gian", + "@enterSpace": {}, + "pleaseTryAgainLaterOrChooseDifferentServer": "Hãy thử lại sau hoặc chọn 1 máy chủ khác.", + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "jumpToLastReadMessage": "Đi tới tin nhắn đã đọc mới nhất", + "@jumpToLastReadMessage": {}, + "commandHint_ignore": "Phớt lờ matrix ID này", + "@commandHint_ignore": {}, + "appLockDescription": "Khoá ứng dụng khi không dùng bằng mã pin", + "@appLockDescription": {}, + "notifyMeFor": "Bật thông báo cho", + "@notifyMeFor": {}, + "settings": "Cài đặt", + "@settings": { + "type": "String", + "placeholders": {} + }, + "sendSticker": "Gửi nhãn dán", + "@sendSticker": { + "type": "String", + "placeholders": {} + }, + "fileHasBeenSavedAt": "Tệp đã được lưu tại {path}", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "readUpToHere": "Đọc tới đây", + "@readUpToHere": {}, + "jump": "Đi tới", + "@jump": {}, + "callingPermissions": "Quyền gọi điện", + "@callingPermissions": {}, + "numChats": "{number} cuộc hội thoại", + "@numChats": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "hidePresences": "Ẩn danh sách trạng thái?", + "@hidePresences": {}, + "sorryThatsNotPossible": "Xin lỗi... không khả dụng", + "@sorryThatsNotPossible": {}, + "reopenChat": "Mở lại cuộc trò chuyện", + "@reopenChat": {}, + "wrongPinEntered": "Nhập sai mã pin! Thử lại sau {seconds} giây...", + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "archiveRoomDescription": "Cuộc trò chuyện sẽ được chuyển tới mục lưu trữ. Người dùng khác sẽ thấy được bạn đã rời khỏi cuộc trò chuyện.", + "@archiveRoomDescription": {}, + "kickUserDescription": "Người dùng bị đuổi khỏi cuộc trò chuyện nhưng không bị cấm. Trong các cuộc trò chuyện công khai, người dùng có thể vào lại bất cứ lúc nào.", + "@kickUserDescription": {}, + "unbanUserDescription": "Người dùng sẽ có thể vào lại cuộc trò chuyện nếu họ thử.", + "@unbanUserDescription": {}, + "pushNotificationsNotAvailable": "Thông báo đẩy không khả dụng", + "@pushNotificationsNotAvailable": {}, + "invite": "Mời", + "@invite": {}, + "invalidInput": "Dữ liệu nhập không hợp lệ!", + "@invalidInput": {}, + "removeDevicesDescription": "Bạn sẽ đăng xuất khỏi thiết bị này và không nhận được tin nhắn nữa.", + "@removeDevicesDescription": {}, + "noUsersFoundWithQuery": "Không tìm thấy người dùng nào với \"{query}\". Hãy kiểm tra xem bạn có nhập nhầm không.", + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "commandHint_unignore": "Bỏ phớt lờ matrix ID này", + "@commandHint_unignore": {}, + "discover": "Khám phá", + "@discover": {}, + "stickers": "Nhãn dán", + "@stickers": {}, + "roomUpgradeDescription": "Cuộc trò chuyện sẽ được tạo lại với phiên bản phòng mới. Tất cả những người tham gia sẽ được thông báo rằng họ cần chuyển sang cuộc trò chuyện mới. Bạn có thể tìm hiểu thêm về các phiên bản phòng tại https://spec.matrix.org/latest/rooms/", + "@roomUpgradeDescription": {}, + "commandHint_hug": "Gửi một cái ôm", + "@commandHint_hug": {}, + "aboutHomeserver": "Về {homeserver}", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "alwaysUse24HourFormat": "Không", + "@alwaysUse24HourFormat": { + "description": "Set to true to always display time of day in 24 hour format." + }, + "hugContent": "{senderName} ôm bạn", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + } +} diff --git a/assets/l10n/intl_zh.arb b/assets/l10n/intl_zh.arb new file mode 100644 index 0000000..3777506 --- /dev/null +++ b/assets/l10n/intl_zh.arb @@ -0,0 +1,3349 @@ +{ + "@@locale": "zh", + "@@last_modified": "2021-08-14 12:41:09.767805", + "about": "关于", + "@about": { + "type": "String", + "placeholders": {} + }, + "accept": "接受", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 {username} 接受了邀请", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "账户", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐 {username} 激活了端到端加密", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "addEmail": "添加电子邮件", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "admin": "管理员", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "别名", + "@alias": { + "type": "String", + "placeholders": {} + }, + "all": "全部", + "@all": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "{senderName} 接听了通话", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "任何人都可以加入", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "appLock": "应用锁", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "archive": "存档", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "是否允许访客加入", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "你确定吗?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "areYouSureYouWantToLogout": "你确定要注销吗?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "请输入你的安全存储的密码短语或恢复密钥,以向对方签名。", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "是否接受来自 {username} 的验证请求?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "badServerLoginTypesException": "主服务器支持的登录方式:\n{serverVersions}\n但此应用仅支持:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "badServerVersionsException": "主服务器支持的 Spec 版本:\n{serverVersions}\n但此应用仅支持 {supportedVersions} 版本", + "@badServerVersionsException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "banFromChat": "从聊天中封禁", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "已封禁", + "@banned": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username} 封禁了 {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "屏蔽设备", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "blocked": "已屏蔽", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "botMessages": "机器人消息", + "@botMessages": { + "type": "String", + "placeholders": {} + }, + "cancel": "取消", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "changeDeviceName": "更改设备名称", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "{username} 更改了聊天头像", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatDescriptionTo": "{username} 将聊天描述更改为:'{description}'", + "@changedTheChatDescriptionTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "description": { + "type": "String" + } + } + }, + "changedTheChatNameTo": "{username} 将聊天名称更改为:'{chatname}'", + "@changedTheChatNameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "chatname": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username} 更改了聊天权限", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username} 将昵称更改为:'{displayname}'", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} 更改了访客访问规则", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} 更改了访客访问规则为:{rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username} 更改了历史记录可见性", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username} 更改了历史记录可见性为:{rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username} 更改了加入的规则", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} 更改了加入的规则为:{joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} 更改了头像", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "{username} 更改了聊天室别名", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username} 更改了邀请链接", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changePassword": "更改密码", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "更改主服务器", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "改变风格", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "更改群组名称", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "changeYourAvatar": "更改你的头像", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "加密已被破坏", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "chat": "聊天", + "@chat": { + "type": "String", + "placeholders": {} + }, + "chatBackup": "聊天记录备份", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "chatBackupDescription": "你的旧消息受恢复密钥保护。请确保你不会丢失它。", + "@chatBackupDescription": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "聊天详情", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chats": "聊天", + "@chats": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "输入一个强密码", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "clearArchive": "清除存档", + "@clearArchive": {}, + "close": "关闭", + "@close": { + "type": "String", + "placeholders": {} + }, + "commandHint_ban": "在此聊天室封禁指定用户", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_html": "发送 HTML 格式化文本", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_invite": "邀请指定用户加入此聊天室", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "commandHint_join": "加入指定聊天室", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_kick": "在此聊天室移除指定用户", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_leave": "退出此聊天室", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_me": "介绍自己", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "commandHint_myroomavatar": "设置你在此聊天室的头像(通过 mxc-uri)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_myroomnick": "设置你在此聊天室的昵称", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "commandHint_op": "设置指定用户的权限等级(默认:50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_plain": "发送纯文本", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_react": "将回复作为回应发送", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "commandHint_send": "发送文本", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "commandHint_unban": "在此聊天室解封指定用户", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "commandInvalid": "指令无效", + "@commandInvalid": { + "type": "String" + }, + "commandMissing": "{command} 不是指令。", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "compareEmojiMatch": "请比较表情符号", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "请比较以下数字", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "configureChat": "配置聊天", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "confirm": "确认", + "@confirm": { + "type": "String", + "placeholders": {} + }, + "connect": "连接", + "@connect": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "联系人已被邀请至群组", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "containsDisplayName": "包含昵称", + "@containsDisplayName": { + "type": "String", + "placeholders": {} + }, + "containsUserName": "包含用户名", + "@containsUserName": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "此内容已被报告至服务器管理员处", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "已复制到剪贴板", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "复制", + "@copy": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "复制到剪贴板", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "不能解密消息: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "countParticipants": "{count} 名参与者", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "create": "创建", + "@create": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "💬 {username} 创建了聊天", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "currentlyActive": "目前活跃", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "深色", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "dateWithoutYear": "{month}-{day}", + "@dateWithoutYear": { + "type": "String", + "placeholders": { + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "dateWithYear": "{year}-{month}-{day}", + "@dateWithYear": { + "type": "String", + "placeholders": { + "year": { + "type": "String" + }, + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "deactivateAccountWarning": "这将停用你的用户账户。这不能被撤销!你确定吗?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "新用户默认权限级别", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "delete": "删除", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "删除账户", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "删除消息", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "device": "设备", + "@device": { + "type": "String", + "placeholders": {} + }, + "deviceId": "设备 ID", + "@deviceId": { + "type": "String", + "placeholders": {} + }, + "devices": "设备", + "@devices": { + "type": "String", + "placeholders": {} + }, + "directChats": "私聊", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "昵称已更改", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "下载文件", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "edit": "编辑", + "@edit": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "编辑被屏蔽的服务器", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "editDisplayname": "编辑昵称", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "editRoomAliases": "编辑聊天室别名", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "编辑聊天室头像", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "表情已存在!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "无效的表情快捷码!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emotePacks": "聊天室的表情包", + "@emotePacks": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "表情设置", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "emoteShortcode": "表情快捷码", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emoteWarnNeedToPick": "你需要选择一个表情快捷码和一张图片!", + "@emoteWarnNeedToPick": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "空聊天", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "在全局启用表情包", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "启用加密", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "你之后将无法停用加密,确定吗?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "encrypted": "已加密", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "encryption": "加密", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "加密未启用", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName} 结束了通话", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "enterAnEmailAddress": "输入一个电子邮件地址", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "enterYourHomeserver": "输入你的主服务器地址", + "@enterYourHomeserver": { + "type": "String", + "placeholders": {} + }, + "everythingReady": "一切就绪!", + "@everythingReady": { + "type": "String", + "placeholders": {} + }, + "extremeOffensive": "令人极度反感", + "@extremeOffensive": { + "type": "String", + "placeholders": {} + }, + "fileName": "文件名", + "@fileName": { + "type": "String", + "placeholders": {} + }, + "fluffychat": "FluffyChat", + "@fluffychat": { + "type": "String", + "placeholders": {} + }, + "fontSize": "字体大小", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "forward": "转发", + "@forward": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "自加入起", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "自邀请起", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "goToTheNewRoom": "前往新的聊天室", + "@goToTheNewRoom": { + "type": "String", + "placeholders": {} + }, + "group": "群组", + "@group": { + "type": "String", + "placeholders": {} + }, + "groupIsPublic": "群组是公开的", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "groups": "群组", + "@groups": { + "type": "String", + "placeholders": {} + }, + "groupWith": "名称为 {displayname} 的群组", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "guestsAreForbidden": "访客禁止加入", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "访客可以加入", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{username} 撤回了对 {targetName} 的邀请", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "help": "帮助", + "@help": { + "type": "String", + "placeholders": {} + }, + "hideRedactedEvents": "隐藏已删除的事件", + "@hideRedactedEvents": { + "type": "String", + "placeholders": {} + }, + "hideUnknownEvents": "隐藏未知的事件", + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "howOffensiveIsThisContent": "这些内容有多令人反感?", + "@howOffensiveIsThisContent": { + "type": "String", + "placeholders": {} + }, + "id": "ID", + "@id": { + "type": "String", + "placeholders": {} + }, + "identity": "身份", + "@identity": { + "type": "String", + "placeholders": {} + }, + "ignore": "忽略", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "ignoredUsers": "已忽略的用户", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "iHaveClickedOnLink": "我已经点击了链接", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "不正确的密码短语或恢复密钥", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "inoffensive": "不令人反感", + "@inoffensive": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "邀请联系人", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "邀请联系人到 {groupName}", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "invited": "已邀请", + "@invited": { + "type": "String", + "placeholders": {} + }, + "invitedUser": "📩 {username} 邀请了 {targetName}", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "invitedUsersOnly": "仅被邀请用户", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "inviteForMe": "发给我的邀请", + "@inviteForMe": { + "type": "String", + "placeholders": {} + }, + "inviteText": "{username} 邀请你使用 FluffyChat。 \n1. 安装 FluffyChat:https://fluffychat.im \n2. 注册或登录 \n3. 打开邀请链接:\n {link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "isTyping": "正在输入…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "👋 {username} 加入了聊天", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "joinRoom": "加入聊天室", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "kicked": "👞 {username} 踢出了 {targetName}", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickedAndBanned": "🙅 {username} 踢出并封禁了 {targetName}", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickFromChat": "从聊天室踢出", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "上次活跃: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "leave": "离开", + "@leave": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "离开了聊天", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "license": "许可证", + "@license": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "浅色", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "加载 {count} 个更多的参与者", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "loadingPleaseWait": "加载中…请等待。", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "loadMore": "加载更多…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "login": "登录", + "@login": { + "type": "String", + "placeholders": {} + }, + "logInTo": "登录 {homeserver}", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "logout": "注销", + "@logout": { + "type": "String", + "placeholders": {} + }, + "memberChanges": "成员变更", + "@memberChanges": { + "type": "String", + "placeholders": {} + }, + "mention": "提及", + "@mention": { + "type": "String", + "placeholders": {} + }, + "messages": "消息", + "@messages": { + "type": "String", + "placeholders": {} + }, + "moderator": "协管员", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "muteChat": "静音聊天", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "needPantalaimonWarning": "请注意当前你需要 Pantalaimon 以使用端到端加密功能。", + "@needPantalaimonWarning": { + "type": "String", + "placeholders": {} + }, + "newChat": "新的聊天", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "💬 FluffyChat 新消息", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "新的验证请求!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "next": "下一步", + "@next": { + "type": "String", + "placeholders": {} + }, + "no": "否", + "@no": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "无法连接服务器", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "未找到表情。😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "你只能在聊天室不可被公众访问时才能启用加密。", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "看起来你手机上没有 Firebase Cloud Messaging。如果仍希望接收 FluffyChat 的推送通知,推荐安装 ntfy。借助 ntfy 或另一个 Unified Push 程序,你可以以一种数据安全的方式接收推送通知。你可以从 PlayStore 或 F-Droid 商店下载 ntfy。", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "none": "无", + "@none": { + "type": "String", + "placeholders": {} + }, + "noPasswordRecoveryDescription": "你尚未添加恢复密码的方法。", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "noPermission": "没有权限", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "未找到聊天室…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "notifications": "通知", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "notificationsEnabledForThisAccount": "已为此账户启用通知", + "@notificationsEnabledForThisAccount": { + "type": "String", + "placeholders": {} + }, + "numUsersTyping": "{count} 人正在输入…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "offensive": "令人反感", + "@offensive": { + "type": "String", + "placeholders": {} + }, + "offline": "离线", + "@offline": { + "type": "String", + "placeholders": {} + }, + "ok": "好", + "@ok": { + "type": "String", + "placeholders": {} + }, + "online": "在线", + "@online": { + "type": "String", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "在线密钥备份已启用", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "oopsPushError": "哎呀!十分不幸,配置推送通知时发生了错误。", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "哎呀,出了点差错…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "打开应用以查看消息", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "openCamera": "打开相机", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "or": "或", + "@or": { + "type": "String", + "placeholders": {} + }, + "participant": "参与者", + "@participant": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "密码短语或恢复密钥", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "password": "密码", + "@password": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "忘记密码", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "密码已被更改", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "passwordRecovery": "密码恢复", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "people": "联系人", + "@people": { + "type": "String", + "placeholders": {} + }, + "pickImage": "选择图像", + "@pickImage": { + "type": "String", + "placeholders": {} + }, + "pin": "置顶", + "@pin": { + "type": "String", + "placeholders": {} + }, + "play": "播放 {fileName}", + "@play": { + "type": "String", + "placeholders": { + "fileName": { + "type": "String" + } + } + }, + "pleaseChoose": "请选择", + "@pleaseChoose": { + "type": "String", + "placeholders": {} + }, + "pleaseChooseAPasscode": "请选择一个密码", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "pleaseClickOnLink": "请点击电子邮件中的链接,然后继续。", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "pleaseEnter4Digits": "请输入 4 位数字或留空以停用应用锁。", + "@pleaseEnter4Digits": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPassword": "请输入你的密码", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPin": "请输入你的 PIN", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "请输入你的用户名", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "请按照网站上的提示,点击下一步。", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "privacy": "隐私", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "公开聊天室", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "pushRules": "推送规则", + "@pushRules": { + "type": "String", + "placeholders": {} + }, + "reason": "原因", + "@reason": { + "type": "String", + "placeholders": {} + }, + "recording": "录制", + "@recording": { + "type": "String", + "placeholders": {} + }, + "redactedAnEvent": "{username} 删除了一个事件", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "redactMessage": "删除消息", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "register": "注册", + "@register": { + "type": "String", + "placeholders": {} + }, + "reject": "拒绝", + "@reject": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "{username} 拒绝了邀请", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "rejoin": "重新加入", + "@rejoin": { + "type": "String", + "placeholders": {} + }, + "remove": "移除", + "@remove": { + "type": "String", + "placeholders": {} + }, + "removeAllOtherDevices": "移除所有其它设备", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "removedBy": "被 {username} 移除", + "@removedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "removeDevice": "移除设备", + "@removeDevice": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "从聊天中解封", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "removeYourAvatar": "移除你的头像", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "renderRichContent": "渲染富文本内容", + "@renderRichContent": { + "type": "String", + "placeholders": {} + }, + "replaceRoomWithNewerVersion": "更新聊天室至新版本", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "reply": "回复", + "@reply": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "举报信息", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "requestPermission": "请求权限", + "@requestPermission": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "聊天室已升级", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "聊天室版本", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "saveFile": "保存文件", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "search": "搜索", + "@search": { + "type": "String", + "placeholders": {} + }, + "security": "安全", + "@security": { + "type": "String", + "placeholders": {} + }, + "seenByUser": "被 {username} 看见", + "@seenByUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "send": "发送", + "@send": { + "type": "String", + "placeholders": {} + }, + "sendAMessage": "发送一条消息", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "sendAsText": "以文本发送", + "@sendAsText": { + "type": "String" + }, + "sendAudio": "发送音频", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendFile": "发送文件", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendImage": "发送图像", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendMessages": "发送消息", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "sendOriginal": "发送原图", + "@sendOriginal": { + "type": "String", + "placeholders": {} + }, + "sendSticker": "发送贴纸", + "@sendSticker": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "发送视频", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "sentAFile": "📁{username} 发送了文件", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAnAudio": "🎤{username} 发送了音频", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAPicture": "🖼️ {username} 发送了图片", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentASticker": "😊 {username} 发送了贴纸", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "🎥 {username} 发送了视频", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentCallInformations": "{senderName} 发送了通话信息", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "setAsCanonicalAlias": "设为主要别名", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "setCustomEmotes": "设置自定义表情", + "@setCustomEmotes": { + "type": "String", + "placeholders": {} + }, + "setInvitationLink": "设置邀请链接", + "@setInvitationLink": { + "type": "String", + "placeholders": {} + }, + "setPermissionsLevel": "设置权限级别", + "@setPermissionsLevel": { + "type": "String", + "placeholders": {} + }, + "setStatus": "设置状态", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "settings": "设置", + "@settings": { + "type": "String", + "placeholders": {} + }, + "share": "分享", + "@share": { + "type": "String", + "placeholders": {} + }, + "sharedTheLocation": "{username} 分享了位置", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "showPassword": "显示密码", + "@showPassword": { + "type": "String", + "placeholders": {} + }, + "singlesignon": "单点登录", + "@singlesignon": { + "type": "String", + "placeholders": {} + }, + "skip": "跳过", + "@skip": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "源代码", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "startedACall": "{senderName} 开始了通话", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "status": "状态", + "@status": { + "type": "String", + "placeholders": {} + }, + "statusExampleMessage": "你今天怎么样?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "submit": "提交", + "@submit": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWait": "同步中…请等待。", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "systemTheme": "系统", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "它们不匹配", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "它们匹配", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "title": "FluffyChat", + "@title": { + "description": "Title for the application", + "type": "String", + "placeholders": {} + }, + "toggleFavorite": "切换收藏", + "@toggleFavorite": { + "type": "String", + "placeholders": {} + }, + "toggleMuted": "切换静音", + "@toggleMuted": { + "type": "String", + "placeholders": {} + }, + "toggleUnread": "标记已读/未读", + "@toggleUnread": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "请求过多。请稍后再试!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "transferFromAnotherDevice": "从其它设备传输", + "@transferFromAnotherDevice": { + "type": "String", + "placeholders": {} + }, + "tryToSendAgain": "尝试重新发送", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "unavailable": "不可用", + "@unavailable": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username} 解封了 {targetName}", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "unblockDevice": "解除屏蔽设备", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "未知设备", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "unknownEncryptionAlgorithm": "未知加密算法", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unknownEvent": "未知事件 '{type}'", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "unmuteChat": "取消静音聊天", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "unpin": "取消置顶", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "unreadChats": "{unreadCount, plural, =1{1 个未读聊天} other{{unreadCount} 个未读聊天}}", + "@unreadChats": { + "type": "String", + "placeholders": { + "unreadCount": { + "type": "int" + } + } + }, + "userAndOthersAreTyping": "{username} 和其他 {count} 人正在输入…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "userAndUserAreTyping": "{username} 和 {username2} 正在输入…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userIsTyping": "{username} 正在输入…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userLeftTheChat": "🚪{username} 离开了聊天", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "username": "用户名", + "@username": { + "type": "String", + "placeholders": {} + }, + "userSentUnknownEvent": "{username} 发送了一个 {type} 事件", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "verified": "已验证", + "@verified": { + "type": "String", + "placeholders": {} + }, + "verify": "验证", + "@verify": { + "type": "String", + "placeholders": {} + }, + "verifyStart": "开始验证", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "你已成功验证!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "verifyTitle": "验证其它账户", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "videoCall": "视频通话", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "聊天记录的可见性", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "对所有参与者可见", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "对所有人可见", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "语音消息", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "等待对方接受请求…", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "等待对方接受 emoji…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "等待对方接受数字…", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "wallpaper": "壁纸:", + "@wallpaper": { + "type": "String", + "placeholders": {} + }, + "warning": "警告!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "weSentYouAnEmail": "我们向你发送了一封电子邮件", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "whoCanPerformWhichAction": "谁可以执行哪些操作", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "谁可以加入此群组", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "你举报的理由是什么?", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "wipeChatBackup": "确定要清除你的聊天记录备份以创建新的恢复密钥吗?", + "@wipeChatBackup": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "通过这些地址,你可以恢复密码。", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "写一条消息…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "yes": "是", + "@yes": { + "type": "String", + "placeholders": {} + }, + "you": "你", + "@you": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "你已不再参与此聊天", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "你已被此聊天封禁", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "yourPublicKey": "你的公钥", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "allChats": "所有聊天", + "@allChats": { + "type": "String", + "placeholders": {} + }, + "addToSpace": "添加到空间", + "@addToSpace": {}, + "obtainingLocation": "获取位置中…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "noMatrixServer": "{server1} 不是一个 Matrix 服务器,试试 {server2}?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "locationPermissionDeniedNotice": "位置权限被拒绝。请授予此权限以分享你的位置.", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "locationDisabledNotice": "位置服务已禁用。请启用此服务以分享你的位置.", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "errorObtainingLocation": "取得地址错误: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "createNewSpace": "创建新空间", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "cantOpenUri": "无法打开 URI {uri}", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "autoplayImages": "自动播放动态贴纸和表情", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "spaceName": "空间名称", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "spaceIsPublic": "空间是公开的", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "shareLocation": "分享位置", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "openInMaps": "在地图中打开", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "sendOnEnter": "按 Enter 键发送", + "@sendOnEnter": {}, + "yourChatBackupHasBeenSetUp": "你的聊天记录备份已设置。", + "@yourChatBackupHasBeenSetUp": {}, + "scanQrCode": "扫描二维码", + "@scanQrCode": {}, + "chatHasBeenAddedToThisSpace": "聊天已添加到此空间", + "@chatHasBeenAddedToThisSpace": {}, + "homeserver": "服务器", + "@homeserver": {}, + "oneClientLoggedOut": "你的一个客户端已登出", + "@oneClientLoggedOut": {}, + "removeFromBundle": "从此集合中移除", + "@removeFromBundle": {}, + "unverified": "未经验证", + "@unverified": {}, + "repeatPassword": "重复输入密码", + "@repeatPassword": {}, + "addAccount": "添加账户", + "@addAccount": {}, + "editBundlesForAccount": "编辑此账户的集合", + "@editBundlesForAccount": {}, + "enableMultiAccounts": "(测试功能)在此设备上添加多个账户", + "@enableMultiAccounts": {}, + "addToBundle": "添加到集合", + "@addToBundle": {}, + "bundleName": "集合名称", + "@bundleName": {}, + "link": "链接", + "@link": {}, + "serverRequiresEmail": "此服务器需要验证你的电子邮件地址以进行注册。", + "@serverRequiresEmail": {}, + "messageType": "消息类型", + "@messageType": {}, + "sender": "发送者", + "@sender": {}, + "openGallery": "打开图库", + "@openGallery": {}, + "messageInfo": "消息信息", + "@messageInfo": {}, + "time": "时间", + "@time": {}, + "addToSpaceDescription": "选择一个空间以添加此聊天。", + "@addToSpaceDescription": {}, + "removeFromSpace": "从此空间中移除", + "@removeFromSpace": {}, + "start": "开始", + "@start": {}, + "commandHint_discardsession": "丢弃会话", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "commandHint_dm": "创建私聊\n使用 --no-encryption 选项来禁用加密", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "commandHint_clearcache": "清除缓存", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_create": "创建空的群聊\n使用 --no-encryption 选项来禁用加密", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "openVideoCamera": "打开相机拍摄视频", + "@openVideoCamera": { + "type": "String", + "placeholders": {} + }, + "publish": "发布", + "@publish": {}, + "videoWithSize": "视频 ({size})", + "@videoWithSize": { + "type": "String", + "placeholders": { + "size": { + "type": "String" + } + } + }, + "dismiss": "忽略", + "@dismiss": {}, + "markAsRead": "标为已读", + "@markAsRead": {}, + "reportUser": "举报用户", + "@reportUser": {}, + "openChat": "打开聊天", + "@openChat": {}, + "reactedWith": "{sender} 回应了 {reaction}", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "confirmEventUnpin": "你确定要永久性取消置顶此事件吗?", + "@confirmEventUnpin": {}, + "pinMessage": "置顶到聊天室", + "@pinMessage": {}, + "emojis": "表情符号", + "@emojis": {}, + "unsupportedAndroidVersionLong": "这个功能需要较新版本的 Android 系统。请检查更新或 Lineage OS 支持。", + "@unsupportedAndroidVersionLong": {}, + "unsupportedAndroidVersion": "不受支持的 Android 版本", + "@unsupportedAndroidVersion": {}, + "voiceCall": "语音通话", + "@voiceCall": {}, + "placeCall": "发起通话", + "@placeCall": {}, + "videoCallsBetaWarning": "请注意,视频通话目前处于测试阶段。它们可能不能像预期的那样工作,或者在所有平台上都不能工作。", + "@videoCallsBetaWarning": {}, + "experimentalVideoCalls": "实验性的视频通话", + "@experimentalVideoCalls": {}, + "emailOrUsername": "电子邮箱或用户名", + "@emailOrUsername": {}, + "switchToAccount": "切换到账户 {number}", + "@switchToAccount": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "nextAccount": "下个账户", + "@nextAccount": {}, + "previousAccount": "上个账户", + "@previousAccount": {}, + "widgetVideo": "视频", + "@widgetVideo": {}, + "widgetJitsi": "Jitsi Meet", + "@widgetJitsi": {}, + "widgetCustom": "自定义", + "@widgetCustom": {}, + "widgetNameError": "请提供昵称。", + "@widgetNameError": {}, + "errorAddingWidget": "添加小部件出错。", + "@errorAddingWidget": {}, + "addWidget": "添加小部件", + "@addWidget": {}, + "widgetEtherpad": "文本笔记", + "@widgetEtherpad": {}, + "widgetName": "名称", + "@widgetName": {}, + "widgetUrlError": "这不是有效的 URL。", + "@widgetUrlError": {}, + "separateChatTypes": "分开私聊和群组", + "@separateChatTypes": { + "type": "String", + "placeholders": {} + }, + "youRejectedTheInvitation": "你拒绝了邀请", + "@youRejectedTheInvitation": {}, + "youJoinedTheChat": "你加入了聊天", + "@youJoinedTheChat": {}, + "youBannedUser": "你封禁了 {user}", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedBy": "📩 你受到了 {user} 的邀请", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedUser": "📩 你邀请了 {user}", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKicked": "👞 你踢出了 {user}", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youUnbannedUser": "你解除了对 {user} 的封禁", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youAcceptedTheInvitation": "👍 你接受了邀请", + "@youAcceptedTheInvitation": {}, + "youHaveWithdrawnTheInvitationFor": "你撤回了对 {user} 的邀请", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKickedAndBanned": "🙅 你踢出并封禁了 {user}", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "storeInSecureStorageDescription": "将恢复密钥存储在此设备的安全存储中。", + "@storeInSecureStorageDescription": {}, + "storeInAppleKeyChain": "存储在 Apple KeyChain 中", + "@storeInAppleKeyChain": {}, + "unlockOldMessages": "解锁旧消息", + "@unlockOldMessages": {}, + "pleaseEnterRecoveryKey": "请输入你的恢复密钥:", + "@pleaseEnterRecoveryKey": {}, + "recoveryKey": "恢复密钥", + "@recoveryKey": {}, + "recoveryKeyLost": "丢失了恢复密钥?", + "@recoveryKeyLost": {}, + "pleaseEnterRecoveryKeyDescription": "要解锁你的旧邮件,请输入你在之前会话中生成的恢复密钥。 你的恢复密钥不是你的密码。", + "@pleaseEnterRecoveryKeyDescription": {}, + "saveKeyManuallyDescription": "通过触发系统共享对话框或剪贴板手动保存此密钥。", + "@saveKeyManuallyDescription": {}, + "storeInAndroidKeystore": "存储在 Android KeyStore 中", + "@storeInAndroidKeystore": {}, + "storeSecurlyOnThisDevice": "安全地存储在此设备上", + "@storeSecurlyOnThisDevice": {}, + "users": "用户", + "@users": {}, + "countFiles": "{count} 个文件", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "dehydrateTor": "TOR 用户:导出会话", + "@dehydrateTor": {}, + "dehydrateTorLong": "建议 TOR 用户在关闭窗口之前导出会话。", + "@dehydrateTorLong": {}, + "hydrateTor": "TOR 用户:导入会话导出", + "@hydrateTor": {}, + "hydrate": "从备份文件恢复", + "@hydrate": {}, + "dehydrate": "导出会话并擦除设备", + "@dehydrate": {}, + "dehydrateWarning": "此操作无法撤消。 确保你安全地存储备份文件。", + "@dehydrateWarning": {}, + "indexedDbErrorTitle": "私有模式问题", + "@indexedDbErrorTitle": {}, + "indexedDbErrorLong": "遗憾的是,默认情况下未在私有模式下启用消息存储。\n请访问\n - about:config\n - 将 dom.indexedDB.privateBrowsing.enabled 设置为 true\n否则,无法运行 FluffyChat。", + "@indexedDbErrorLong": {}, + "hydrateTorLong": "你上次是否导出 TOR 会话? 快速导入它并继续聊天。", + "@hydrateTorLong": {}, + "user": "用户", + "@user": {}, + "custom": "自定义", + "@custom": {}, + "confirmMatrixId": "请确认你的 Matrix ID 以删除账户。", + "@confirmMatrixId": {}, + "supposedMxid": "应为 {mxid}", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "commandHint_markasgroup": "标记为群组", + "@commandHint_markasgroup": {}, + "commandHint_markasdm": "将给定的 Matrix ID 标为私信聊天室", + "@commandHint_markasdm": {}, + "whyIsThisMessageEncrypted": "为什么此消息不可读?", + "@whyIsThisMessageEncrypted": {}, + "noKeyForThisMessage": "如果消息是在你在此设备上登录账户前发送的,就可能发生这种情况。\n\n也有可能是发送者屏蔽了你的设备或网络连接出了问题。\n\n你能在另一个会话中读取消息吗?如果是的话,你可以从它那里传递信息!点击设置 > 设备,并确保你的设备已经相互验证。当你下次打开聊天室,且两个会话都在前台,密钥就会自动传输。\n\n你不想在注销或切换设备时丢失密钥?请确保在设置中启用了聊天备份。", + "@noKeyForThisMessage": {}, + "newGroup": "新群组", + "@newGroup": {}, + "newSpace": "新的空间", + "@newSpace": {}, + "enterSpace": "进入空间", + "@enterSpace": {}, + "enterRoom": "进入聊天室", + "@enterRoom": {}, + "allSpaces": "所有空间", + "@allSpaces": {}, + "appearOnTop": "显示在其它应用上方", + "@appearOnTop": {}, + "appearOnTopDetails": "允许应用显示在顶部(如果你已经将 Fluffychat 设置为呼叫账户,则不需要授予此权限)", + "@appearOnTopDetails": {}, + "otherCallingPermissions": "麦克风、摄像头和其它 FluffyChat 权限", + "@otherCallingPermissions": {}, + "callingPermissions": "呼叫权限", + "@callingPermissions": {}, + "callingAccountDetails": "允许 FluffyChat 使用本机 android 拨号器应用。", + "@callingAccountDetails": {}, + "foregroundServiceRunning": "此通知在前台服务运行时出现。", + "@foregroundServiceRunning": {}, + "screenSharingTitle": "屏幕共享", + "@screenSharingTitle": {}, + "callingAccount": "呼叫账户", + "@callingAccount": {}, + "screenSharingDetail": "你正在 FluffyChat 中共享屏幕", + "@screenSharingDetail": {}, + "numChats": "{number} 个聊天", + "@numChats": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "hideUnimportantStateEvents": "隐藏不重要的状态事件", + "@hideUnimportantStateEvents": {}, + "doNotShowAgain": "不再显示", + "@doNotShowAgain": {}, + "googlyEyesContent": "{senderName} 向你发送了“大眼”表情", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "commandHint_googly": "发送“大眼”表情", + "@commandHint_googly": {}, + "commandHint_cuddle": "发送“搂抱”", + "@commandHint_cuddle": {}, + "commandHint_hug": "发送“拥抱”", + "@commandHint_hug": {}, + "cuddleContent": "{senderName} 搂抱了你", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "hugContent": "{senderName} 拥抱了你", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "wasDirectChatDisplayName": "空聊天(曾是 {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "startFirstChat": "发起你的第一个聊天", + "@startFirstChat": {}, + "newSpaceDescription": "空间让你可以整合聊天并建立私人或公共社区。", + "@newSpaceDescription": {}, + "encryptThisChat": "加密此聊天", + "@encryptThisChat": {}, + "disableEncryptionWarning": "出于安全考虑 ,你不能在之前已启用加密的聊天中禁用加密。", + "@disableEncryptionWarning": {}, + "sorryThatsNotPossible": "非常抱歉……这是做不到的", + "@sorryThatsNotPossible": {}, + "deviceKeys": "设备密钥:", + "@deviceKeys": {}, + "report": "报错", + "@report": {}, + "fileIsTooBigForServer": "无法发送!服务器只支持最大 {max} 的文件。", + "@fileIsTooBigForServer": {}, + "noOtherDevicesFound": "未找到其它设备", + "@noOtherDevicesFound": {}, + "jumpToLastReadMessage": "跳转到上次已读的消息", + "@jumpToLastReadMessage": {}, + "readUpToHere": "读到此处", + "@readUpToHere": {}, + "jump": "跳转", + "@jump": {}, + "openLinkInBrowser": "在浏览器中打开链接", + "@openLinkInBrowser": {}, + "signInWith": "使用 {provider} 登录", + "@signInWith": { + "type": "String", + "placeholders": { + "provider": { + "type": "String" + } + } + }, + "allRooms": "所有群聊", + "@allRooms": { + "type": "String", + "placeholders": {} + }, + "fileHasBeenSavedAt": "文件已保存在 {path}", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "reportErrorDescription": "😭 哦不。出了点差错。如果你愿意,可以向开发人员报告此错误。", + "@reportErrorDescription": {}, + "noBackupWarning": "警告!如果不启用聊天备份,你将无法访问加密消息。强烈建议在注销前先启用聊天备份。", + "@noBackupWarning": {}, + "signInWithPassword": "使用密码登录", + "@signInWithPassword": {}, + "pleaseTryAgainLaterOrChooseDifferentServer": "请稍后再试或选择其它服务器。", + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "reopenChat": "重新打开聊天", + "@reopenChat": {}, + "importEmojis": "导入表情包", + "@importEmojis": {}, + "notAnImage": "不是图像文件。", + "@notAnImage": {}, + "importNow": "立即导入", + "@importNow": {}, + "importFromZipFile": "从 .zip 文件导入", + "@importFromZipFile": {}, + "replace": "替换", + "@replace": {}, + "exportEmotePack": "以 .zip 格式导出表情包", + "@exportEmotePack": {}, + "sendTypingNotifications": "发送正在输入通知", + "@sendTypingNotifications": {}, + "createGroup": "创建群组", + "@createGroup": {}, + "shareInviteLink": "分享邀请链接", + "@shareInviteLink": {}, + "profileNotFound": "服务器上找不到此用户。可能是连接有问题或者用户不存在。", + "@profileNotFound": {}, + "inviteContactToGroupQuestion": "你是否要邀请 {contact} 参与聊天 \"{groupName}\"?", + "@inviteContactToGroupQuestion": {}, + "tryAgain": "重试", + "@tryAgain": {}, + "addChatDescription": "添加聊天说明…", + "@addChatDescription": {}, + "chatPermissions": "聊天权限", + "@chatPermissions": {}, + "chatDescription": "聊天描述", + "@chatDescription": {}, + "chatDescriptionHasBeenChanged": "聊天描述已被更改", + "@chatDescriptionHasBeenChanged": {}, + "noChatDescriptionYet": "尚未创建聊天描述。", + "@noChatDescriptionYet": {}, + "invalidServerName": "服务器名称无效", + "@invalidServerName": {}, + "redactMessageDescription": "消息将为此对话中所有参与者删除。此操作无法撤销。", + "@redactMessageDescription": {}, + "optionalRedactReason": "(可选)删除此消息的原因...", + "@optionalRedactReason": {}, + "setChatDescription": "设置聊天描述", + "@setChatDescription": {}, + "setTheme": "设置主题:", + "@setTheme": {}, + "setColorTheme": "设置主题颜色:", + "@setColorTheme": {}, + "invite": "邀请", + "@invite": {}, + "messagesStyle": "消息:", + "@messagesStyle": {}, + "redactedBy": "已被 {username} 删除", + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "directChat": "私聊", + "@directChat": {}, + "redactedByBecause": "已被 {username} 删除,原因:\"{reason}\"", + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "inviteGroupChat": "📨 邀请至群聊", + "@inviteGroupChat": {}, + "invitePrivateChat": "📨 邀请至私聊", + "@invitePrivateChat": {}, + "emoteKeyboardNoRecents": "最近使用过的表情会出现在这里...", + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "invalidInput": "无效的输入!", + "@invalidInput": {}, + "wrongPinEntered": "输入的 PIN 码不正确!请 {seconds} 秒后重试…", + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "hasKnocked": "{user} 请求了加入聊天室的邀请", + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "pleaseEnterANumber": "请输入大于 0 的数", + "@pleaseEnterANumber": {}, + "banUserDescription": "该用户将被禁止进入聊天室,在解除封禁之前将不能再进入聊天室。", + "@banUserDescription": {}, + "removeDevicesDescription": "你将从此设备登出,无法再接收消息。", + "@removeDevicesDescription": {}, + "unbanUserDescription": "如果用户尝试加入则可以再次进入聊天。", + "@unbanUserDescription": {}, + "pushNotificationsNotAvailable": "通知推送不可用", + "@pushNotificationsNotAvailable": {}, + "makeAdminDescription": "一旦你将该用户设为管理员,你可能无法撤销,因为他们将拥有与你相同的权限。", + "@makeAdminDescription": {}, + "archiveRoomDescription": "聊天将被移至存档。其他用户将能看到你已离开聊天。", + "@archiveRoomDescription": {}, + "learnMore": "了解更多", + "@learnMore": {}, + "roomUpgradeDescription": "将使用新版聊天室来重新创建当前聊天室。所有参与者都会收到通知以切换到新的聊天室。有关聊天室版本的更多信息,请访问 https://spec.matrix.org/latest/rooms/", + "@roomUpgradeDescription": {}, + "kickUserDescription": "该用户会被踢出聊天但没被封禁。在公开聊天中,该用户可以随时重新加入。", + "@kickUserDescription": {}, + "blockListDescription": "你可以屏蔽打扰你的用户。你将不会收到来自屏蔽列表中用户的任何消息或聊天室邀请。", + "@blockListDescription": {}, + "createGroupAndInviteUsers": "创建群组并邀请用户", + "@createGroupAndInviteUsers": {}, + "startConversation": "开始对话", + "@startConversation": {}, + "blockedUsers": "已屏蔽的用户", + "@blockedUsers": {}, + "groupCanBeFoundViaSearch": "可通过搜索找到该群组", + "@groupCanBeFoundViaSearch": {}, + "noUsersFoundWithQuery": "很遗憾,没有找到有关\"{query}\"的用户。请检查是否输入错误。", + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "block": "屏蔽", + "@block": {}, + "yourGlobalUserIdIs": "你的全局用户 ID 是: ", + "@yourGlobalUserIdIs": {}, + "commandHint_sendraw": "发送原始 json", + "@commandHint_sendraw": {}, + "wrongRecoveryKey": "抱歉…这似乎不是正确的恢复密钥。", + "@wrongRecoveryKey": {}, + "blockUsername": "忽略用户名", + "@blockUsername": {}, + "groupName": "群组名称", + "@groupName": {}, + "databaseMigrationTitle": "数据库已优化", + "@databaseMigrationTitle": {}, + "searchChatsRooms": "搜索 #聊天,@用户…", + "@searchChatsRooms": {}, + "databaseMigrationBody": "请稍候。可能需要稍等片刻。", + "@databaseMigrationBody": {}, + "thisDevice": "此设备:", + "@thisDevice": {}, + "publicSpaces": "公开空间", + "@publicSpaces": {}, + "passwordIsWrong": "你输入的密码有误", + "@passwordIsWrong": {}, + "pleaseEnterYourCurrentPassword": "请输入你当前的密码", + "@pleaseEnterYourCurrentPassword": {}, + "publicLink": "公开链接", + "@publicLink": {}, + "nothingFound": "未找到任何内容…", + "@nothingFound": {}, + "decline": "拒绝", + "@decline": {}, + "newPassword": "新的密码", + "@newPassword": {}, + "passwordsDoNotMatch": "密码不匹配", + "@passwordsDoNotMatch": {}, + "subspace": "子空间", + "@subspace": {}, + "select": "选择", + "@select": {}, + "pleaseChooseAStrongPassword": "请选择一个强密码", + "@pleaseChooseAStrongPassword": {}, + "addChatOrSubSpace": "添加聊天或子空间", + "@addChatOrSubSpace": {}, + "leaveEmptyToClearStatus": "留空以清除你的状态。", + "@leaveEmptyToClearStatus": {}, + "joinSpace": "加入空间", + "@joinSpace": {}, + "searchForUsers": "搜索 @用户…", + "@searchForUsers": {}, + "databaseBuildErrorBody": "无法构建 SQLite 数据库。目前应用尝试使用旧数据库。请将此错误报告给开发者,网址为 {url}。错误消息为:{error}", + "@databaseBuildErrorBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "initAppError": "在初始化应用时发生错误", + "@initAppError": {}, + "sessionLostBody": "你的会话已丢失。请将此错误报告给开发者,网址为 {url}。错误消息为:{error}", + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "restoreSessionBody": "应用现在尝试从备份中恢复你的会话。请将此错误报告给开发者,网址为 {url}。错误消息为:{error}", + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "sendTypingNotificationsDescription": "聊天中的其他参与者可以看到你正在输入新消息。", + "@sendTypingNotificationsDescription": {}, + "formattedMessagesDescription": "使用 Markdown 显示富文本内容,例如加粗文本。", + "@formattedMessagesDescription": {}, + "verifyOtherUserDescription": "如果你验证了其他用户,就可以确保你清楚自己正在与谁进行通信。💪\n\n当你开始验证时,你和其他用户将在应用中看到一个弹出窗口。然后你会看到一系列表情符号或数字,你和其他用户需要比较它们是否一致。\n\n最好的方式是线下会面或开始视频通话。👭", + "@verifyOtherUserDescription": {}, + "verifyOtherDeviceDescription": "当你验证另一个设备时,这些设备可以交换密钥,从而提高整体安全性。 💪 当你开始验证时,两个设备上的应用都将显示一个弹出窗口。然后你会看到一系列表情符号或数字,你需要比较两个设备上显示的内容。在开始验证之前,最好将两个设备都放在手边。🤳", + "@verifyOtherDeviceDescription": {}, + "canceledKeyVerification": "{sender} 取消了密钥验证", + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "sendReadReceipts": "发送已读回执", + "@sendReadReceipts": {}, + "formattedMessages": "格式化的消息", + "@formattedMessages": {}, + "verifyOtherDevice": "🔐 验证其它设备", + "@verifyOtherDevice": {}, + "verifyOtherUser": "🔐 验证其他用户", + "@verifyOtherUser": {}, + "forwardMessageTo": "转发消息至 {roomName} ?", + "@forwardMessageTo": { + "type": "String", + "placeholders": { + "roomName": { + "type": "String" + } + } + }, + "sendReadReceiptsDescription": "聊天中的其他参与者可以看到你是否读过消息。", + "@sendReadReceiptsDescription": {}, + "acceptedKeyVerification": "{sender} 接受了密钥验证", + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "isReadyForKeyVerification": "{sender} 已准备好进行密钥验证", + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "completedKeyVerification": "{sender} 完成了密钥验证", + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "requestedKeyVerification": "{sender} 请求了密钥验证", + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "startedKeyVerification": "{sender} 开始了密钥验证", + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "transparent": "透明", + "@transparent": {}, + "youInvitedToBy": "📩 你已通过链接被邀请到:\n{alias}", + "@youInvitedToBy": { + "placeholders": { + "alias": { + "type": "String" + } + } + }, + "presencesToggle": "显示其他用户的状态消息", + "@presencesToggle": { + "type": "String", + "placeholders": {} + }, + "presenceStyle": "是否在线:", + "@presenceStyle": { + "type": "String", + "placeholders": {} + }, + "hidePresences": "隐藏状态列表?", + "@hidePresences": {}, + "incomingMessages": "传入消息", + "@incomingMessages": {}, + "stickers": "贴纸", + "@stickers": {}, + "discover": "发现", + "@discover": {}, + "commandHint_ignore": "忽略给定的 matrix ID", + "@commandHint_ignore": {}, + "commandHint_unignore": "取消忽略给定的 matrix ID", + "@commandHint_unignore": {}, + "unreadChatsInApp": "{appname}: {unread} 未读聊天", + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "appLockDescription": "用 pin 码在不用 FluffyChat 时锁定它", + "@appLockDescription": {}, + "globalChatId": "全局聊天 ID", + "@globalChatId": {}, + "accessAndVisibility": "访问和可见性", + "@accessAndVisibility": {}, + "accessAndVisibilityDescription": "谁可以加入此聊天以及怎样发现该聊天。", + "@accessAndVisibilityDescription": {}, + "calls": "通话", + "@calls": {}, + "customEmojisAndStickers": "自定义表情符号和贴纸", + "@customEmojisAndStickers": {}, + "hideRedactedMessages": "隐藏被涂黑的消息", + "@hideRedactedMessages": {}, + "overview": "概览", + "@overview": {}, + "notifyMeFor": "提示内容", + "@notifyMeFor": {}, + "passwordRecoverySettings": "密码发现设置", + "@passwordRecoverySettings": {}, + "noPublicLinkHasBeenCreatedYet": "尚未创建公开链接", + "@noPublicLinkHasBeenCreatedYet": {}, + "knock": "请求", + "@knock": {}, + "noOneCanJoin": "无人可以加入", + "@noOneCanJoin": {}, + "knocking": "正在请求", + "@knocking": {}, + "chatCanBeDiscoveredViaSearchOnServer": "可通过搜索 {server} 发现聊天", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "thereAreCountUsersBlocked": "目前有 {count} 名用户被封禁。", + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "hideRedactedMessagesBody": "如果某人涂黑了一条消息,那么在聊天中再也看不到这条消息。", + "@hideRedactedMessagesBody": {}, + "hideInvalidOrUnknownMessageFormats": "隐藏无效或未知的消息格式", + "@hideInvalidOrUnknownMessageFormats": {}, + "hideMemberChangesInPublicChats": "在公开聊天中隐藏成员变化", + "@hideMemberChangesInPublicChats": {}, + "hideMemberChangesInPublicChatsBody": "不在聊天时间线中显示某人是否加入或离开了公开聊天来改进可读性。", + "@hideMemberChangesInPublicChatsBody": {}, + "userWouldLikeToChangeTheChat": "{user} 想加入聊天。", + "@userWouldLikeToChangeTheChat": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "customEmojisAndStickersBody": "添加或分享可用于任何聊天的表情符号或贴纸。", + "@customEmojisAndStickersBody": {}, + "usersMustKnock": "用户必须请求加入", + "@usersMustKnock": {}, + "noDatabaseEncryption": "数据库加密在此平台上不受支持", + "@noDatabaseEncryption": {}, + "userRole": "用户角色", + "@userRole": {}, + "minimumPowerLevel": "{level} 是最低权限等级。", + "@minimumPowerLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "String" + } + } + }, + "publicChatAddresses": "公开聊天的地址", + "@publicChatAddresses": {}, + "createNewAddress": "新建地址", + "@createNewAddress": {}, + "searchMore": "搜索更多…", + "@searchMore": {}, + "gallery": "图库", + "@gallery": {}, + "files": "文件", + "@files": {}, + "searchIn": "在 “{chat}” 聊天中搜索…", + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "knockRestricted": "“请求加入”请求受限", + "@knockRestricted": {}, + "restricted": "受限", + "@restricted": {}, + "swipeRightToLeftToReply": "从右向左滑动进行回复", + "@swipeRightToLeftToReply": {}, + "alwaysUse24HourFormat": "false", + "@alwaysUse24HourFormat": { + "description": "Set to true to always display time of day in 24 hour format." + }, + "noMoreChatsFound": "找不到更多聊天…", + "@noMoreChatsFound": {}, + "joinedChats": "已加入的聊天", + "@joinedChats": {}, + "space": "空间", + "@space": {}, + "spaces": "空间", + "@spaces": {}, + "goToSpace": "转到空间:{space}", + "@goToSpace": { + "type": "String", + "space": {} + }, + "markAsUnread": "标为未读", + "@markAsUnread": {}, + "countChatsAndCountParticipants": "{chats} 个聊天和 {participants} 名参与者", + "@countChatsAndCountParticipants": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + }, + "participants": { + "type": "int" + } + } + }, + "unread": "未读", + "@unread": {}, + "userLevel": "{level} - 用户", + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "moderatorLevel": "{level} - 主持人", + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "adminLevel": "{level} - 管理员", + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "inviteOtherUsers": "邀请其他用户到这个聊天", + "@inviteOtherUsers": {}, + "changeTheChatPermissions": "更改聊天权限", + "@changeTheChatPermissions": {}, + "changeTheVisibilityOfChatHistory": "更改聊天历史的可见性", + "@changeTheVisibilityOfChatHistory": {}, + "changeTheCanonicalRoomAlias": "更改主公共聊天地址", + "@changeTheCanonicalRoomAlias": {}, + "sendRoomNotifications": "发送通知聊天室所有人的通知", + "@sendRoomNotifications": {}, + "changeTheDescriptionOfTheGroup": "更改聊天描述", + "@changeTheDescriptionOfTheGroup": {}, + "changeGeneralChatSettings": "更改常规聊天设置", + "@changeGeneralChatSettings": {}, + "invitedBy": "📩 邀请人 {user}", + "@invitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "chatPermissionsDescription": "定义此聊天中哪个权限等级对特定操作是必需的。权限等级 0、50 和 100 通常代表用户、主持人和管理员,但你可以自定义任何等级。", + "@chatPermissionsDescription": {}, + "changelog": "更新记录", + "@changelog": {}, + "updateInstalled": "🎉 已安装更新 {version} !", + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "sendCanceled": "发送被取消", + "@sendCanceled": {}, + "noChatsFoundHere": "此处尚未找到聊天。使用下方按钮 ⤵️ 开始和某人的新聊天", + "@noChatsFoundHere": {}, + "loginWithMatrixId": "使用 Matrix-ID 登录", + "@loginWithMatrixId": {}, + "discoverHomeservers": "发现主服务器", + "@discoverHomeservers": {}, + "whatIsAHomeserver": "什么是主服务器?", + "@whatIsAHomeserver": {}, + "homeserverDescription": "主服务器上就像电子邮件提供商,你的所有数据都存储在上面。你可以选择你想使用哪个主服务器。在 https://matrix.org 上了解更多信息。", + "@homeserverDescription": {}, + "doesNotSeemToBeAValidHomeserver": "似乎不是兼容的主服务器。URL 不正确?", + "@doesNotSeemToBeAValidHomeserver": {}, + "prepareSendingAttachment": "准备发送附件…", + "@prepareSendingAttachment": {}, + "sendingAttachment": "发送附件中…", + "@sendingAttachment": {}, + "calculatingFileSize": "计算文件尺寸中…", + "@calculatingFileSize": {}, + "generatingVideoThumbnail": "生成视频缩略图中…", + "@generatingVideoThumbnail": {}, + "compressVideo": "压缩视频中…", + "@compressVideo": {}, + "sendingAttachmentCountOfCount": "正在发送附件 {index},共 {length} 个附件…", + "@sendingAttachmentCountOfCount": { + "type": "integer", + "placeholders": { + "index": { + "type": "int" + }, + "length": { + "type": "int" + } + } + }, + "serverLimitReached": "达到了服务器限制!等待 {seconds} 秒…", + "@serverLimitReached": { + "type": "integer", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "oneOfYourDevicesIsNotVerified": "您设备中的一台未验证", + "@oneOfYourDevicesIsNotVerified": {}, + "noticeChatBackupDeviceVerification": "注意:当你连接所有设备到聊天备份时,这些设备将被自动验证。", + "@noticeChatBackupDeviceVerification": {}, + "welcomeText": "你好呀 👋 欢迎来到 FluffyChat。你可以登录任意兼容 https://matrix.org 的 homeserver,然后和任何人聊天。这是个巨大的去中心化消息网络!", + "@welcomeText": {}, + "continueText": "继续", + "@continueText": {}, + "blur": "模糊:", + "@blur": {}, + "opacity": "不透明:", + "@opacity": {}, + "setWallpaper": "设置壁纸", + "@setWallpaper": {}, + "manageAccount": "管理账户", + "@manageAccount": {}, + "aboutHomeserver": "关于 {homeserver}", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "version": "版本", + "@version": {}, + "noContactInformationProvided": "服务器未提供任何有效的联系信息", + "@noContactInformationProvided": {}, + "contactServerAdmin": "联系服务器管理员", + "@contactServerAdmin": {}, + "name": "名称", + "@name": {}, + "contactServerSecurity": "联系服务器安全管理", + "@contactServerSecurity": {}, + "supportPage": "支持页面", + "@supportPage": {}, + "serverInformation": "服务器信息:", + "@serverInformation": {}, + "website": "网站", + "@website": {}, + "compressBeforeSending": "发送前压缩", + "@compressBeforeSending": {}, + "italicText": "文件倾斜", + "@italicText": {}, + "strikeThrough": "删除线", + "@strikeThrough": {}, + "pleaseFillOut": "请填写", + "@pleaseFillOut": {}, + "addLink": "添加链接", + "@addLink": {}, + "sendUncompressed": "无压缩发送", + "@sendUncompressed": {}, + "boldText": "文本加粗", + "@boldText": {}, + "invalidUrl": "无效 url", + "@invalidUrl": {}, + "unableToJoinChat": "无法加入聊天。可能其他方面已经关闭了对话。", + "@unableToJoinChat": {}, + "sendImages": "发送 {count} 张图片", + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "compress": "压缩", + "@compress": {}, + "previous": "前一个", + "@previous": {}, + "otherPartyNotLoggedIn": "另一方当前未登录,因而无法接收消息!", + "@otherPartyNotLoggedIn": {}, + "appWantsToUseForLoginDescription": "您特此允许本应用和网站分享关于您的信息。", + "@appWantsToUseForLoginDescription": {}, + "open": "打开", + "@open": {}, + "appWantsToUseForLogin": "使用 '{server}'服务器登录", + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "waitingForServer": "正在等待服务器…", + "@waitingForServer": {}, + "synchronizingPleaseWaitCounter": " 同步中… ({percentage}%)", + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "appIntroduction": "FluffyChat 让使用不同即时通信工具的你和你的好友得以聊天。 访问 https://matrix.org 了解详情或轻按 *继续*。", + "@appIntroduction": {}, + "newChatRequest": "📩 新的聊天请求", + "@newChatRequest": {}, + "generalNotificationSettings": "常规通知设置", + "@generalNotificationSettings": {}, + "userSpecificNotificationSettings": "使用特定通知设置", + "@userSpecificNotificationSettings": {}, + "notificationRuleMaster": "静音所有通知", + "@notificationRuleMaster": {}, + "notificationRuleSuppressNotices": "隐藏自动消息", + "@notificationRuleSuppressNotices": {}, + "notificationRuleInviteForMe": "给我的邀请", + "@notificationRuleInviteForMe": {}, + "notificationRuleInviteForMeDescription": "当用户被邀请加入聊天室时提醒用户。", + "@notificationRuleInviteForMeDescription": {}, + "notificationRuleMemberEvent": "成员事件", + "@notificationRuleMemberEvent": {}, + "notificationRuleMemberEventDescription": "隐藏成员身份事件通知。", + "@notificationRuleMemberEventDescription": {}, + "notificationRuleIsUserMention": "用户提及", + "@notificationRuleIsUserMention": {}, + "notificationRuleIsUserMentionDescription": "当消息中直接提到用户名时通知使用该用户名的用户。", + "@notificationRuleIsUserMentionDescription": {}, + "notificationRuleContainsDisplayName": "包含展示名称", + "@notificationRuleContainsDisplayName": {}, + "notificationRuleIsRoomMention": "聊天室提及", + "@notificationRuleIsRoomMention": {}, + "notificationRuleRoomnotifDescription": "消息包含 \"@room\" 时提醒用户。", + "@notificationRuleRoomnotifDescription": {}, + "notificationRuleTombstone": "墓碑", + "@notificationRuleTombstone": {}, + "notificationRuleRoomServerAcl": "聊天室服务器 ACL", + "@notificationRuleRoomServerAcl": {}, + "notificationRuleSuppressEdits": "隐藏编辑", + "@notificationRuleSuppressEdits": {}, + "notificationRuleCall": "通话", + "@notificationRuleCall": {}, + "notificationRuleRoomOneToOne": "一对一聊天室", + "@notificationRuleRoomOneToOne": {}, + "notificationRuleRoomOneToOneDescription": "在一对一聊天室中提醒用户消息。", + "@notificationRuleRoomOneToOneDescription": {}, + "notificationRuleEncrypted": "已加密", + "@notificationRuleEncrypted": {}, + "notificationRuleEncryptedDescription": "在已加密聊天室中提醒用户消息。", + "@notificationRuleEncryptedDescription": {}, + "notificationRuleJitsi": "Jitsi", + "@notificationRuleJitsi": {}, + "notificationRuleJitsiDescription": "提醒用户 Jitsi 小部件的事件。", + "@notificationRuleJitsiDescription": {}, + "notificationRuleServerAcl": "隐藏服务器 ACL 事件", + "@notificationRuleServerAcl": {}, + "notificationRuleServerAclDescription": "隐藏服务器 ACL 事件的通知。", + "@notificationRuleServerAclDescription": {}, + "deletePushRuleCanNotBeUndone": "删除这个通知设置的操作无法撤销。", + "@deletePushRuleCanNotBeUndone": {}, + "more": "更多", + "@more": {}, + "notificationRuleReactionDescription": "隐藏回应通知。", + "@notificationRuleReactionDescription": {}, + "notificationRuleMessageDescription": "提醒用户常规消息。", + "@notificationRuleMessageDescription": {}, + "notificationRuleContainsUserName": "包含用户名", + "@notificationRuleContainsUserName": {}, + "otherNotificationSettings": "其他通知设置", + "@otherNotificationSettings": {}, + "notificationRuleContainsUserNameDescription": "当消息包含用户名时通知使用该用户名的用户。", + "@notificationRuleContainsUserNameDescription": {}, + "notificationRuleIsRoomMentionDescription": "有聊天室提及时通知用户。", + "@notificationRuleIsRoomMentionDescription": {}, + "contentNotificationSettings": "内容通知设置", + "@contentNotificationSettings": {}, + "notificationRuleMasterDescription": "覆盖所有其他规则并禁用所有通知。", + "@notificationRuleMasterDescription": {}, + "notificationRuleSuppressNoticesDescription": "隐藏来自 bot 等自动客户端的通知。", + "@notificationRuleSuppressNoticesDescription": {}, + "roomNotificationSettings": "聊天室通知设置", + "@roomNotificationSettings": {}, + "notificationRuleRoomServerAclDescription": "隐藏聊天室服务器访问控制列表(ACL)通知。", + "@notificationRuleRoomServerAclDescription": {}, + "notificationRuleContainsDisplayNameDescription": "当消息包含用户的展示名时提醒使用该展示名的用户。", + "@notificationRuleContainsDisplayNameDescription": {}, + "notificationRuleRoomnotif": "聊天室通知", + "@notificationRuleRoomnotif": {}, + "notificationRuleTombstoneDescription": "提醒用户聊天室解散的消息。", + "@notificationRuleTombstoneDescription": {}, + "notificationRuleReaction": "回应", + "@notificationRuleReaction": {}, + "notificationRuleSuppressEditsDescription": "隐藏消息编辑通知。", + "@notificationRuleSuppressEditsDescription": {}, + "notificationRuleCallDescription": "提醒用户通话的消息。", + "@notificationRuleCallDescription": {}, + "notificationRuleEncryptedRoomOneToOne": "已加密一对一聊天室", + "@notificationRuleEncryptedRoomOneToOne": {}, + "notificationRuleEncryptedRoomOneToOneDescription": "在已加密一对一聊天室中提醒用户消息。", + "@notificationRuleEncryptedRoomOneToOneDescription": {}, + "notificationRuleMessage": "消息", + "@notificationRuleMessage": {}, + "unknownPushRule": "未知推送规则 '{rule}'", + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } + } + }, + "crossVerifiedDevices": "交叉验证设备", + "@crossVerifiedDevices": {}, + "shareKeysWithDescription": "选择应当信任哪些设备允许它们读取你在加密聊天中的消息?", + "@shareKeysWithDescription": {}, + "shareKeysWith": "与哪些设备分享密钥…", + "@shareKeysWith": {}, + "allDevices": "所有设备", + "@allDevices": {}, + "crossVerifiedDevicesIfEnabled": "交叉验证设备(如启用)", + "@crossVerifiedDevicesIfEnabled": {}, + "verifiedDevicesOnly": "仅已验证设备", + "@verifiedDevicesOnly": {}, + "optionalMessage": "(可选)消息…", + "@optionalMessage": {}, + "takeAPhoto": "拍照", + "@takeAPhoto": {}, + "recordAVideo": "录像", + "@recordAVideo": {}, + "notSupportedOnThisDevice": "此设备上不受支持", + "@notSupportedOnThisDevice": {}, + "enterNewChat": "进入新聊天", + "@enterNewChat": {}, + "commandHint_roomupgrade": "将此聊天室升级到给定的聊天室版本", + "@commandHint_roomupgrade": {} +} diff --git a/assets/l10n/intl_zh_Hant.arb b/assets/l10n/intl_zh_Hant.arb new file mode 100644 index 0000000..c4f77b8 --- /dev/null +++ b/assets/l10n/intl_zh_Hant.arb @@ -0,0 +1,3253 @@ +{ + "@@last_modified": "2021-08-14 12:41:09.708353", + "about": "關於", + "@about": { + "type": "String", + "placeholders": {} + }, + "accept": "同意", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 {username} 已接受邀請", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "帳號", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐 {username} 已啟用點對點加密", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "addEmail": "新增電子郵件", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "admin": "管理員", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "別稱", + "@alias": { + "type": "String", + "placeholders": {} + }, + "all": "全部", + "@all": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "已開始與 {senderName} 通話", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "任何人可以加入", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "appLock": "密碼鎖定", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "archive": "封存", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "是否允許訪客加入", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "您確定嗎?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "areYouSureYouWantToLogout": "您確定要登出嗎?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "請輸入您安全儲存的密碼短語或恢復金鑰,以向對方簽名。", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "是否接受來自 {username} 的驗證申請?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "badServerLoginTypesException": "目前伺服器支援的登入類型:\n{serverVersions}\n但本應用程式僅支援:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "badServerVersionsException": "目前伺服器支援的協議版本:\n{serverVersions}\n但本應用程式僅支援 {supportedVersions}", + "@badServerVersionsException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "banFromChat": "已從聊天室中封鎖", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "已被封鎖", + "@banned": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username} 封鎖了 {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "封鎖裝置", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "blocked": "已封鎖", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "botMessages": "機器人訊息", + "@botMessages": { + "type": "String", + "placeholders": {} + }, + "cancel": "取消", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "changeDeviceName": "變更裝置名稱", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "{username} 變更了對話頭貼", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatDescriptionTo": "{username} 把聊天室介紹變更為:「{description}」", + "@changedTheChatDescriptionTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "description": { + "type": "String" + } + } + }, + "changedTheChatNameTo": "{username} 把聊天室名稱變更為:「{chatname}」", + "@changedTheChatNameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "chatname": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username} 變更了對話權限", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username} 變更了顯示名稱為:「{displayname}」", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} 變更了訪客訪問規則", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} 變更了訪客訪問規則為:{rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username} 變更了歷史記錄觀察狀態", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username} 變更了歷史紀錄觀察狀態到:{rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username} 變更了加入的規則", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} 變更了加入的規則為:{joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} 變更了頭貼", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "{username} 變更了聊天室名", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username} 變更了邀請連結", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changePassword": "變更密碼", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "變更主機位址", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "變更主題", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "變更了群組名稱", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "加密已被破壞", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "chat": "聊天室", + "@chat": { + "type": "String", + "placeholders": {} + }, + "chatBackup": "備份聊天室", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "chatBackupDescription": "您的過往聊天室記錄已被恢復金鑰加密。請您確保不會弄丟它。", + "@chatBackupDescription": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "對話詳細", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "輸入一個較強的密碼", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "close": "關閉", + "@close": { + "type": "String", + "placeholders": {} + }, + "compareEmojiMatch": "請對比這些表情", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "請對比這些數字", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "configureChat": "設定聊天室", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "confirm": "確認", + "@confirm": { + "type": "String", + "placeholders": {} + }, + "connect": "連接", + "@connect": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "聯絡人已被邀請至群組", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "containsDisplayName": "包含顯示名稱", + "@containsDisplayName": { + "type": "String", + "placeholders": {} + }, + "containsUserName": "包含使用者名稱", + "@containsUserName": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "此內容已被回報給伺服器管理員們", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "已複製到剪貼簿", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "複製", + "@copy": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "複製到剪貼簿", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "不能解密訊息:{error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "countParticipants": "{count} 個參與者", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "create": "建立", + "@create": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "💬 {username} 建立了聊天室", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "currentlyActive": "目前活躍", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "夜間模式", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date} , {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "dateWithoutYear": "{month} - {day}", + "@dateWithoutYear": { + "type": "String", + "placeholders": { + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "dateWithYear": "{year} - {month} - {day}", + "@dateWithYear": { + "type": "String", + "placeholders": { + "year": { + "type": "String" + }, + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "deactivateAccountWarning": "這將停用您的帳號。這個決定是不能挽回的!您確定嗎?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "預設權限等級", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "delete": "刪除", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "刪除帳號", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "刪除訊息", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "device": "裝置", + "@device": { + "type": "String", + "placeholders": {} + }, + "deviceId": "裝置ID", + "@deviceId": { + "type": "String", + "placeholders": {} + }, + "devices": "裝置", + "@devices": { + "type": "String", + "placeholders": {} + }, + "directChats": "直接傳訊", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "顯示名稱已被變更", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "下載文件", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "edit": "編輯", + "@edit": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "編輯被封鎖的伺服器", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "editDisplayname": "編輯顯示名稱", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "編輯聊天室頭貼", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "表情已存在!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "無效的表情快捷鍵!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emotePacks": "聊天室的表情符號", + "@emotePacks": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "表情設定", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "emoteShortcode": "表情快捷鍵", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emoteWarnNeedToPick": "您需要選取一個表情快捷鍵和一張圖片!", + "@emoteWarnNeedToPick": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "空的聊天室", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "在全域啟用表情符號", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "啟用加密", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "您將不能再停用加密,確定嗎?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "encrypted": "已加密的", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "encryption": "加密", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "加密未啟用", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName} 結束了通話", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "enterAnEmailAddress": "輸入一個電子郵件位址", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "enterYourHomeserver": "輸入伺服器位址", + "@enterYourHomeserver": { + "type": "String", + "placeholders": {} + }, + "everythingReady": "一切就緒!", + "@everythingReady": { + "type": "String", + "placeholders": {} + }, + "extremeOffensive": "極端令人反感", + "@extremeOffensive": { + "type": "String", + "placeholders": {} + }, + "fileName": "檔案名稱", + "@fileName": { + "type": "String", + "placeholders": {} + }, + "fluffychat": "FluffyChat", + "@fluffychat": { + "type": "String", + "placeholders": {} + }, + "fontSize": "字體大小", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "forward": "轉發", + "@forward": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "自加入起", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "自邀請起", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "group": "群組", + "@group": { + "type": "String", + "placeholders": {} + }, + "groupIsPublic": "群組是公開的", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "groups": "群組", + "@groups": { + "type": "String", + "placeholders": {} + }, + "groupWith": "名稱為 {displayname} 的群組", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "guestsAreForbidden": "訪客已被禁止", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "訪客可以加入", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{username} 收回了對 {targetName} 的邀請", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "help": "幫助", + "@help": { + "type": "String", + "placeholders": {} + }, + "hideRedactedEvents": "隱藏編輯過的事件", + "@hideRedactedEvents": { + "type": "String", + "placeholders": {} + }, + "hideUnknownEvents": "隱藏未知事件", + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "howOffensiveIsThisContent": "這個內容有多令人反感?", + "@howOffensiveIsThisContent": { + "type": "String", + "placeholders": {} + }, + "id": "ID", + "@id": { + "type": "String", + "placeholders": {} + }, + "identity": "身份", + "@identity": { + "type": "String", + "placeholders": {} + }, + "ignore": "無視", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "ignoredUsers": "已無視的使用者", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "iHaveClickedOnLink": "我已經點擊了網址", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "錯誤的密碼短語或恢復金鑰", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "inoffensive": "不令人反感", + "@inoffensive": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "邀請聯絡人", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "邀請聯絡人到 {groupName}", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "invited": "已邀請", + "@invited": { + "type": "String", + "placeholders": {} + }, + "invitedUser": "📩 {username} 邀請了 {targetName}", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "invitedUsersOnly": "只有被邀請的使用者", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "inviteForMe": "來自我的邀請", + "@inviteForMe": { + "type": "String", + "placeholders": {} + }, + "inviteText": "{username} 邀請您使用 FluffyChat\n1. 安裝 FluffyChat:https://fluffychat.im\n2. 登入或註冊\n3. 打開該邀請網址:\n{link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "isTyping": "正在輸入...…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "👋 {username} 加入了聊天室", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "joinRoom": "加入聊天室", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "kicked": "👞 {username} 踢了 {targetName}", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickedAndBanned": "🙅 {username} 踢了 {targetName} 並將其封鎖", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickFromChat": "從聊天室踢出", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "最後活動時間:{localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "leave": "離開", + "@leave": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "離開了聊天室", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "license": "授權", + "@license": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "日間模式", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "載入 {count} 個更多的參與者", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "loadingPleaseWait": "載入中...... 請稍候。", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "loadMore": "載入更多...…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "login": "登入", + "@login": { + "type": "String", + "placeholders": {} + }, + "logInTo": "登入 {homeserver}", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "logout": "登出", + "@logout": { + "type": "String", + "placeholders": {} + }, + "memberChanges": "變更成員", + "@memberChanges": { + "type": "String", + "placeholders": {} + }, + "mention": "提及", + "@mention": { + "type": "String", + "placeholders": {} + }, + "messages": "訊息", + "@messages": { + "type": "String", + "placeholders": {} + }, + "moderator": "版主", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "muteChat": "將該聊天室靜音", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "needPantalaimonWarning": "請注意您需要 Pantalaimon 才能使用點對點加密功能。", + "@needPantalaimonWarning": { + "type": "String", + "placeholders": {} + }, + "newChat": "新聊天", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "💬 來自 FluffyChat 的新訊息", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "新的驗證請求!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "next": "下一個", + "@next": { + "type": "String", + "placeholders": {} + }, + "no": "否", + "@no": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "無法連接到伺服器", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "表情符號不存在。😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "您只能在這個聊天室不再被允許公開訪問後,才能啟用加密。", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "您手機上沒有安裝 Google 服務框架。這或許對於保護您的隱私而言是個好事!但為了收到 FluffyChat 的推播通知,我們建議您使用 https://microg.org 或 https://unifiedpush.org。", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "none": "無", + "@none": { + "type": "String", + "placeholders": {} + }, + "noPasswordRecoveryDescription": "您尚未新增恢復密碼的方法。", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "noPermission": "沒有權限", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "找不到聊天室...…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "notifications": "通知", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "notificationsEnabledForThisAccount": "已為此帳號啟用通知", + "@notificationsEnabledForThisAccount": { + "type": "String", + "placeholders": {} + }, + "numUsersTyping": "{count} 個人正在輸入...…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "offensive": "令人反感", + "@offensive": { + "type": "String", + "placeholders": {} + }, + "offline": "離線", + "@offline": { + "type": "String", + "placeholders": {} + }, + "ok": "OK", + "@ok": { + "type": "String", + "placeholders": {} + }, + "online": "線上", + "@online": { + "type": "String", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "線上金鑰備份已啟用", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "哎呀!出了一點差錯...…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "打開應用程式以讀取訊息", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "openCamera": "開啟相機", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "participant": "參與者", + "@participant": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "密碼短語或恢復金鑰", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "password": "密碼", + "@password": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "忘記密碼", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "密碼已被變更", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "passwordRecovery": "恢復密碼", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "pickImage": "選擇圖片", + "@pickImage": { + "type": "String", + "placeholders": {} + }, + "pin": "釘選", + "@pin": { + "type": "String", + "placeholders": {} + }, + "play": "播放 {fileName}", + "@play": { + "type": "String", + "placeholders": { + "fileName": { + "type": "String" + } + } + }, + "pleaseChooseAPasscode": "請選擇一個密碼", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "pleaseClickOnLink": "請點擊電子郵件中的網址,然後繼續。", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "pleaseEnter4Digits": "請輸入4位數字,或留空以停用密碼鎖定。", + "@pleaseEnter4Digits": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPassword": "請輸入您的密碼", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "請輸入您的使用者名稱", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "請按照網站上的說明進行操作,然後點擊下一步。", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "privacy": "隱私", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "公開的聊天室", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "pushRules": "推播規則", + "@pushRules": { + "type": "String", + "placeholders": {} + }, + "reason": "原因", + "@reason": { + "type": "String", + "placeholders": {} + }, + "recording": "錄音中", + "@recording": { + "type": "String", + "placeholders": {} + }, + "redactedAnEvent": "{username} 編輯了一個事件", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "redactMessage": "重新編輯訊息", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "reject": "拒絕", + "@reject": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "{username} 拒絕了邀請", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "rejoin": "重新加入", + "@rejoin": { + "type": "String", + "placeholders": {} + }, + "remove": "移除", + "@remove": { + "type": "String", + "placeholders": {} + }, + "removeAllOtherDevices": "移除所有其他裝置", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "removedBy": "被 {username} 移除", + "@removedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "removeDevice": "移除裝置", + "@removeDevice": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "解封聊天室", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "renderRichContent": "繪製圖文訊息內容", + "@renderRichContent": { + "type": "String", + "placeholders": {} + }, + "replaceRoomWithNewerVersion": "用較新的版本取代聊天室", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "reply": "回覆", + "@reply": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "檢舉訊息", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "requestPermission": "請求權限", + "@requestPermission": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "聊天室已更新", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "search": "搜尋", + "@search": { + "type": "String", + "placeholders": {} + }, + "security": "安全", + "@security": { + "type": "String", + "placeholders": {} + }, + "seenByUser": "{username} 已讀", + "@seenByUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "send": "傳送", + "@send": { + "type": "String", + "placeholders": {} + }, + "sendAMessage": "傳送訊息", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "sendAudio": "傳送音訊", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendFile": "傳送文件", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendImage": "傳送圖片", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendMessages": "傳送訊息", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "sendOriginal": "傳送原始內容", + "@sendOriginal": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "傳送影片", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "sentAFile": "{username} 傳送了一個文件", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAnAudio": "🎤{username} 傳送了一個音訊", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAPicture": "🖼️{username} 傳送了一張圖片", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentASticker": "😊{username} 傳送了貼圖", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "🎥{username} 傳送了影片", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentCallInformations": "{senderName} 傳送了通話資訊", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "setCustomEmotes": "自訂表情符號", + "@setCustomEmotes": { + "type": "String", + "placeholders": {} + }, + "setInvitationLink": "設定邀請連結", + "@setInvitationLink": { + "type": "String", + "placeholders": {} + }, + "setPermissionsLevel": "設定權限等級", + "@setPermissionsLevel": { + "type": "String", + "placeholders": {} + }, + "setStatus": "設定狀態", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "settings": "設定", + "@settings": { + "type": "String", + "placeholders": {} + }, + "share": "分享", + "@share": { + "type": "String", + "placeholders": {} + }, + "sharedTheLocation": "{username} 分享了位置", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "showPassword": "顯示密碼", + "@showPassword": { + "type": "String", + "placeholders": {} + }, + "skip": "跳過", + "@skip": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "原始碼", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "startedACall": "{senderName} 開始了通話", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "status": "狀態", + "@status": { + "type": "String", + "placeholders": {} + }, + "statusExampleMessage": "今天過得如何?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "submit": "送出", + "@submit": { + "type": "String", + "placeholders": {} + }, + "systemTheme": "自動", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "它們不相符", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "它們相符", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "title": "FluffyChat", + "@title": { + "description": "Title for the application", + "type": "String", + "placeholders": {} + }, + "toggleFavorite": "切換收藏夾", + "@toggleFavorite": { + "type": "String", + "placeholders": {} + }, + "toggleMuted": "切換靜音", + "@toggleMuted": { + "type": "String", + "placeholders": {} + }, + "toggleUnread": "標示為已讀/未讀", + "@toggleUnread": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "太多請求了。請稍候再試!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "transferFromAnotherDevice": "從其他裝置傳輸", + "@transferFromAnotherDevice": { + "type": "String", + "placeholders": {} + }, + "tryToSendAgain": "再次嘗試傳送", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "unavailable": "無法取得", + "@unavailable": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username} 解除封鎖了 {targetName}", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "unblockDevice": "解除鎖定裝置", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "未知裝置", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "unknownEncryptionAlgorithm": "未知的加密演算法", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unknownEvent": "未知事件「{type}」", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "unmuteChat": "取消靜音聊天室", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "unpin": "取消釘選", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "unreadChats": "{unreadCount, plural, =1 {1 unread chat} other { {unreadCount} 個未讀聊天室} }", + "@unreadChats": { + "type": "String", + "placeholders": { + "unreadCount": { + "type": "int" + } + } + }, + "userAndOthersAreTyping": "{username} 和其他 {count} 個人正在輸入...…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "userAndUserAreTyping": "{username} 和 {username2} 正在輸入...…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userIsTyping": "{username} 正在輸入...…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userLeftTheChat": "{username} 離開了聊天室", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "username": "使用者名稱", + "@username": { + "type": "String", + "placeholders": {} + }, + "userSentUnknownEvent": "{username} 傳送了一個 {type} 事件", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "verified": "已驗證", + "@verified": { + "type": "String", + "placeholders": {} + }, + "verify": "驗證", + "@verify": { + "type": "String", + "placeholders": {} + }, + "verifyStart": "開始驗證", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "您成功驗證了!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "verifyTitle": "正在驗證其他帳號", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "videoCall": "視訊通話", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "聊天室記錄的可見性", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "對所有參與者可見", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "對所有人可見", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "語音訊息", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "正在等待夥伴接受請求...…", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "正在等待夥伴接受表情符號...…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "正在等待夥伴接受數字...…", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "wallpaper": "桌布:", + "@wallpaper": { + "type": "String", + "placeholders": {} + }, + "warning": "警告!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "weSentYouAnEmail": "我們向您傳送了一封電子郵件", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "whoCanPerformWhichAction": "誰可以執行這個動作", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "誰可以加入這個群組", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "您檢舉的原因是什麼?", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "wipeChatBackup": "是否清除您的聊天室記錄備份以建立新的安全金鑰嗎?", + "@wipeChatBackup": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "有了這些位址,您就可以恢復密碼。", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "輸入訊息...…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "yes": "是", + "@yes": { + "type": "String", + "placeholders": {} + }, + "you": "您", + "@you": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "您不再參與這個聊天室了", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "您已經被這個聊天室封鎖", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "yourPublicKey": "您的公鑰", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "people": "人", + "@people": { + "type": "String", + "placeholders": {} + }, + "chats": "聊天室", + "@chats": { + "type": "String", + "placeholders": {} + }, + "allChats": "所有會話", + "@allChats": { + "type": "String", + "placeholders": {} + }, + "commandHint_ban": "在此聊天室封鎖該使用者", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_clearcache": "清除快取", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_create": "建立一個空的群聊\n使用 --no-encryption 選項來停用加密", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "commandHint_discardsession": "丟棄工作階段", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "commandHint_dm": "啟動一對一聊天室\n使用 --no-encryption 選項來停用加密", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "commandHint_invite": "邀請該使用者加入此聊天室", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "commandHint_join": "加入此聊天室", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_kick": "將這個使用者移出此聊天室", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_leave": "退出此聊天室", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_myroomnick": "設定您的聊天室暱稱", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "editRoomAliases": "編輯聊天室名", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "聊天室的版本", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "addToSpace": "加入空間", + "@addToSpace": {}, + "cantOpenUri": "無法打開 URI {uri}", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "repeatPassword": "再次輸入密碼", + "@repeatPassword": {}, + "yourChatBackupHasBeenSetUp": "您的聊天室記錄備份已設定。", + "@yourChatBackupHasBeenSetUp": {}, + "goToTheNewRoom": "前往新聊天室", + "@goToTheNewRoom": { + "type": "String", + "placeholders": {} + }, + "commandHint_myroomavatar": "設定您的聊天室頭貼(通過 mxc-uri)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_unban": "在此聊天室解除封鎖該使用者", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "autoplayImages": "自動播放動態貼圖和表情", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "sendOnEnter": "按 Enter 鍵傳送", + "@sendOnEnter": {}, + "changeYourAvatar": "更改您的大頭貼", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "chatHasBeenAddedToThisSpace": "聊天室已新增到此空間", + "@chatHasBeenAddedToThisSpace": {}, + "clearArchive": "清除存檔", + "@clearArchive": {}, + "hugContent": "{senderName} 擁抱您", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "commandHint_cuddle": "傳送一個摟抱表情", + "@commandHint_cuddle": {}, + "supposedMxid": "此處應爲 {mxid}", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "invalidServerName": "伺服器名稱錯誤", + "@invalidServerName": {}, + "importFromZipFile": "從 .zip 檔案匯入", + "@importFromZipFile": {}, + "homeserver": "伺服器", + "@homeserver": {}, + "exportEmotePack": "將表情包匯出成 .zip 檔案", + "@exportEmotePack": {}, + "commandInvalid": "命令無效", + "@commandInvalid": { + "type": "String" + }, + "commandMissing": "{command} 不是正確的命令。", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "googlyEyesContent": "{senderName} 向您傳送了瞪眼表情", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "addChatDescription": "新增聊天室描述......", + "@addChatDescription": {}, + "sendTypingNotifications": "傳送「輸入中」通知", + "@sendTypingNotifications": {}, + "importEmojis": "匯入表情包", + "@importEmojis": {}, + "confirmMatrixId": "如需刪除你的帳戶,請確認你的 Matrix ID。", + "@confirmMatrixId": {}, + "notAnImage": "不是圖片檔案。", + "@notAnImage": {}, + "cuddleContent": "{senderName} 摟抱您", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "commandHint_hug": "傳送一個擁抱表情", + "@commandHint_hug": {}, + "replace": "取代", + "@replace": {}, + "commandHint_googly": "傳送一些瞪眼表情", + "@commandHint_googly": {}, + "importNow": "立即匯入", + "@importNow": {}, + "blockListDescription": "你可以封鎖打擾你的使用者。你不會再收到任何從已封鎖使用者發來的訊息或聊天室邀請。", + "@blockListDescription": {}, + "blockedUsers": "已封鎖的使用者", + "@blockedUsers": {}, + "block": "封鎖", + "@block": {}, + "discover": "發現", + "@discover": {}, + "alwaysUse24HourFormat": "false", + "@alwaysUse24HourFormat": { + "description": "Set to true to always display time of day in 24 hour format." + }, + "sender": "傳送者", + "@sender": {}, + "voiceCall": "語音通話", + "@voiceCall": {}, + "blockUsername": "無視使用者名稱", + "@blockUsername": {}, + "noBackupWarning": "警告!如果不啟用聊天室備份,您將失去對加密訊息的訪問。強烈建議在登出前先啟用聊天室備份。", + "@noBackupWarning": {}, + "addChatOrSubSpace": "新增聊天室或子空間", + "@addChatOrSubSpace": {}, + "thisDevice": "這個裝置:", + "@thisDevice": {}, + "separateChatTypes": "分開私訊和群組", + "@separateChatTypes": { + "type": "String", + "placeholders": {} + }, + "commandHint_markasdm": "將給定的 Matrix ID 標示為直接訊息房間", + "@commandHint_markasdm": {}, + "commandHint_html": "傳送 HTML 格式的文字", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_send": "傳送文字", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "emoteKeyboardNoRecents": "最近使用的表情將顯示在這裡...", + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "noChatDescriptionYet": "尚未建立聊天室描述。", + "@noChatDescriptionYet": {}, + "optionalRedactReason": "(非必填)收回此訊息的原因...", + "@optionalRedactReason": {}, + "dehydrateWarning": "此操作不能反悔。請確保安全地存儲備份文件。", + "@dehydrateWarning": {}, + "hydrateTorLong": "上次在 TOR 上匯出會話了嗎?快速匯入它已繼續使用聊天室。", + "@hydrateTorLong": {}, + "hydrate": "從備份文件恢復", + "@hydrate": {}, + "locationDisabledNotice": "位置服務被停用。請啟用它們以能夠分享您的位置。", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "noMatrixServer": "{server1} 不是 Matrix 服務器,改用 {server2} 嗎?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "addToBundle": "新增到套組", + "@addToBundle": {}, + "bundleName": "套組名稱", + "@bundleName": {}, + "pleaseEnterYourPin": "請輸入您的密碼", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "redactedByBecause": "由 {username} 編輯,原因:「{reason}」", + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "saveFile": "儲存檔案", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "publish": "發布", + "@publish": {}, + "hasKnocked": "🚪 {user} 敲門了", + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "unlockOldMessages": "解鎖舊消息", + "@unlockOldMessages": {}, + "callingAccountDetails": "允許 FluffyChat 使用原生 Android 撥號應用程式。", + "@callingAccountDetails": {}, + "noOtherDevicesFound": "未找到其他裝置", + "@noOtherDevicesFound": {}, + "noUsersFoundWithQuery": "很遺憾,找不到與「{query}」相符的使用者。請檢查是否有打錯字。", + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "publicLink": "公開網址", + "@publicLink": {}, + "dehydrate": "匯出會話並清除裝置", + "@dehydrate": {}, + "dehydrateTor": "TOR 使用者:匯出會話", + "@dehydrateTor": {}, + "reopenChat": "重新開啟聊天室", + "@reopenChat": {}, + "widgetNameError": "請提供一個顯示名稱。", + "@widgetNameError": {}, + "yourGlobalUserIdIs": "您的全域使用者ID是: ", + "@yourGlobalUserIdIs": {}, + "startFirstChat": "開始您的第一次聊天室", + "@startFirstChat": {}, + "experimentalVideoCalls": "實驗性視訊通話", + "@experimentalVideoCalls": {}, + "youAcceptedTheInvitation": "👍 您接受了邀請", + "@youAcceptedTheInvitation": {}, + "storeSecurlyOnThisDevice": "在此裝置上安全存儲", + "@storeSecurlyOnThisDevice": {}, + "countFiles": "{count} 個文件", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "screenSharingDetail": "您正在 FuffyChat 中分享您的螢幕", + "@screenSharingDetail": {}, + "wrongPinEntered": "輸入的密碼錯誤! {seconds} 秒後再試一次......", + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "archiveRoomDescription": "聊天室將被移動到存檔中。其他使用者將能看到您已離開聊天室。", + "@archiveRoomDescription": {}, + "banUserDescription": "該使用者將被禁止進入聊天室,直到他們被解封之前都無法再次進入聊天室。", + "@banUserDescription": {}, + "searchChatsRooms": "搜尋 #chats, @users...", + "@searchChatsRooms": {}, + "decline": "拒絕", + "@decline": {}, + "sendReadReceipts": "傳送已讀回條", + "@sendReadReceipts": {}, + "formattedMessagesDescription": "使用 markdown 顯示豐富的訊息內容,如粗體文字。", + "@formattedMessagesDescription": {}, + "verifyOtherDevice": "🔐 驗證其他裝置", + "@verifyOtherDevice": {}, + "youInvitedUser": "📩 您邀請了 {user}", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "pinMessage": "釘選到房間", + "@pinMessage": {}, + "youKicked": "👞 您踢出了 {user}", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "users": "使用者", + "@users": {}, + "pleaseChoose": "請選擇", + "@pleaseChoose": { + "type": "String", + "placeholders": {} + }, + "youRejectedTheInvitation": "您拒絕了邀請", + "@youRejectedTheInvitation": {}, + "enterRoom": "進入房間", + "@enterRoom": {}, + "allSpaces": "所有空間", + "@allSpaces": {}, + "indexedDbErrorLong": "預設情況下,私密模式不啟用消息存儲。\n請訪問\n - about:config\n - 將 dom.indexedDB.privateBrowsing.enabled 設定為 true\n否則,無法運行 FluffyChat。", + "@indexedDbErrorLong": {}, + "youKickedAndBanned": "🙅 您踢出並封鎖了 {user}", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "user": "使用者", + "@user": {}, + "custom": "自訂", + "@custom": {}, + "hidePresences": "隱藏狀態列表?", + "@hidePresences": {}, + "signInWithPassword": "使用密碼登入", + "@signInWithPassword": {}, + "setColorTheme": "設定主題顏色:", + "@setColorTheme": {}, + "makeAdminDescription": "一旦您讓這個使用者成為管理員,您可能無法撤銷此操作,因為他們將擁有與您相同的權限。", + "@makeAdminDescription": {}, + "createGroupAndInviteUsers": "建立群組並邀請使用者", + "@createGroupAndInviteUsers": {}, + "groupCanBeFoundViaSearch": "可以透過搜尋找到群組", + "@groupCanBeFoundViaSearch": {}, + "pleaseEnterYourCurrentPassword": "請輸入您當前的密碼", + "@pleaseEnterYourCurrentPassword": {}, + "widgetCustom": "自訂", + "@widgetCustom": {}, + "createGroup": "建立群組", + "@createGroup": {}, + "enterSpace": "進入空間", + "@enterSpace": {}, + "shareLocation": "分享位置", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "widgetVideo": "影片", + "@widgetVideo": {}, + "redactMessageDescription": "該訊息將對此對話中的所有參與者收回。這不能被反悔。", + "@redactMessageDescription": {}, + "removeFromBundle": "從此套組中移除", + "@removeFromBundle": {}, + "widgetName": "名稱", + "@widgetName": {}, + "jump": "跳轉", + "@jump": {}, + "commandHint_unignore": "取消無視已提供的 Matrix ID", + "@commandHint_unignore": {}, + "commandHint_markasgroup": "標示為群組", + "@commandHint_markasgroup": {}, + "commandHint_me": "描述自己", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "commandHint_plain": "傳送未格式化的文字", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_react": "以反應的形式傳送回覆", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "createNewSpace": "新建空間", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "allRooms": "所有群組聊天室", + "@allRooms": { + "type": "String", + "placeholders": {} + }, + "chatPermissions": "聊天室權限", + "@chatPermissions": {}, + "customEmojisAndStickersBody": "新增或分享可在任何聊天室中使用的自訂表情符號或貼圖。", + "@customEmojisAndStickersBody": {}, + "errorObtainingLocation": "取得位置錯誤:{error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "hideRedactedMessages": "隱藏被刪除的訊息", + "@hideRedactedMessages": {}, + "hideInvalidOrUnknownMessageFormats": "隱藏無效或未知的訊息格式", + "@hideInvalidOrUnknownMessageFormats": {}, + "dehydrateTorLong": "對 TOR 使用者,建議在關閉窗口前匯出會話。", + "@dehydrateTorLong": {}, + "hydrateTor": "TOR 使用者:匯入會話", + "@hydrateTor": {}, + "messagesStyle": "訊息樣式:", + "@messagesStyle": {}, + "shareInviteLink": "分享邀請網址", + "@shareInviteLink": {}, + "scanQrCode": "掃描 QR 碼", + "@scanQrCode": {}, + "openVideoCamera": "打開錄影", + "@openVideoCamera": { + "type": "String", + "placeholders": {} + }, + "oneClientLoggedOut": "您的一個客戶端已登出", + "@oneClientLoggedOut": {}, + "addAccount": "新增帳號", + "@addAccount": {}, + "editBundlesForAccount": "為此帳號編輯套組", + "@editBundlesForAccount": {}, + "openInMaps": "在地圖中打開", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "serverRequiresEmail": "該伺服器需要驗證您的註冊電子郵件地址。", + "@serverRequiresEmail": {}, + "or": "或", + "@or": { + "type": "String", + "placeholders": {} + }, + "hideMemberChangesInPublicChatsBody": "若有人加入或離開公開聊天室,將不在聊天室時間軸顯示,以提升資訊可讀性。", + "@hideMemberChangesInPublicChatsBody": {}, + "overview": "概觀", + "@overview": {}, + "notifyMeFor": "通知我", + "@notifyMeFor": {}, + "passwordRecoverySettings": "恢復密碼設定", + "@passwordRecoverySettings": {}, + "redactedBy": "由 {username} 編輯", + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "recoveryKey": "恢復金鑰", + "@recoveryKey": {}, + "spaceName": "空間名稱", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWait": "正在同步... 請稍候。", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "messageInfo": "訊息資訊", + "@messageInfo": {}, + "removeFromSpace": "從空間中移除", + "@removeFromSpace": {}, + "addToSpaceDescription": "選擇一個空間將此聊天室加入。", + "@addToSpaceDescription": {}, + "pleaseEnterRecoveryKeyDescription": "要解鎖您的舊訊息,請輸入在之前的會話中生成的恢復密鑰。您的恢復密鑰不是您的密碼。", + "@pleaseEnterRecoveryKeyDescription": {}, + "videoWithSize": "影片({size})", + "@videoWithSize": { + "type": "String", + "placeholders": { + "size": { + "type": "String" + } + } + }, + "emojis": "表情符號", + "@emojis": {}, + "placeCall": "發起通話", + "@placeCall": {}, + "unsupportedAndroidVersion": "不支持的Android版本", + "@unsupportedAndroidVersion": {}, + "videoCallsBetaWarning": "請注意,視訊通話目前處於測試階段。它們可能不會按預期工作,或者在所有平台上都不工作。", + "@videoCallsBetaWarning": {}, + "widgetUrlError": "這不是一個有效的URL。", + "@widgetUrlError": {}, + "nextAccount": "下一個帳戶", + "@nextAccount": {}, + "previousAccount": "上一個帳戶", + "@previousAccount": {}, + "addWidget": "新增小工具", + "@addWidget": {}, + "errorAddingWidget": "新增小工具時發生錯誤。", + "@errorAddingWidget": {}, + "youJoinedTheChat": "您加入了聊天室", + "@youJoinedTheChat": {}, + "youBannedUser": "您封鎖了 {user}", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youHaveWithdrawnTheInvitationFor": "您已收回對 {user} 的邀請", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedBy": "📩 您被 {user} 邀請", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youUnbannedUser": "您解除封鎖了 {user}", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedToBy": "📩 您通過網址被邀請至:\n{alias}", + "@youInvitedToBy": { + "placeholders": { + "alias": { + "type": "String" + } + } + }, + "callingPermissions": "通話權限", + "@callingPermissions": {}, + "callingAccount": "通話帳戶", + "@callingAccount": {}, + "appearOnTop": "顯示在最上層", + "@appearOnTop": {}, + "newGroup": "新群組", + "@newGroup": {}, + "newSpace": "新空間", + "@newSpace": {}, + "numChats": "{number} 個聊天室", + "@numChats": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "hideUnimportantStateEvents": "隱藏不重要的狀態事件", + "@hideUnimportantStateEvents": {}, + "doNotShowAgain": "不再顯示", + "@doNotShowAgain": {}, + "encryptThisChat": "加密此聊天室", + "@encryptThisChat": {}, + "sorryThatsNotPossible": "抱歉......這是不可能的", + "@sorryThatsNotPossible": {}, + "profileNotFound": "在伺服器上找不到該使用者。可能是連接問題或該使用者不存在。", + "@profileNotFound": {}, + "invite": "邀請", + "@invite": {}, + "invitePrivateChat": "📨 邀請私人聊天室", + "@invitePrivateChat": {}, + "removeDevicesDescription": "您將從這個裝置登出,並將不再能夠接收消息。", + "@removeDevicesDescription": {}, + "unbanUserDescription": "如果該使用者嘗試,他們將能夠再次進入聊天室。", + "@unbanUserDescription": {}, + "kickUserDescription": "該使用者被踢出聊天室,但未被禁止。在公開聊天室中,該使用者可以隨時重新加入。", + "@kickUserDescription": {}, + "pushNotificationsNotAvailable": "推送通知不可用", + "@pushNotificationsNotAvailable": {}, + "learnMore": "了解更多", + "@learnMore": {}, + "nothingFound": "什麼都沒找到......", + "@nothingFound": {}, + "startConversation": "開始對話", + "@startConversation": {}, + "databaseMigrationBody": "請稍候。這可能需要一點時間。", + "@databaseMigrationBody": {}, + "pleaseChooseAStrongPassword": "請選擇一個強密碼", + "@pleaseChooseAStrongPassword": {}, + "passwordIsWrong": "您輸入的密碼錯誤", + "@passwordIsWrong": {}, + "publicChatAddresses": "公開聊天室地址", + "@publicChatAddresses": {}, + "userRole": "使用者角色", + "@userRole": {}, + "minimumPowerLevel": "{level} 是最低權限等級。", + "@minimumPowerLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "String" + } + } + }, + "leaveEmptyToClearStatus": "留空以清除您的狀態。", + "@leaveEmptyToClearStatus": {}, + "select": "選擇", + "@select": {}, + "files": "文件", + "@files": {}, + "forwardMessageTo": "將訊息轉發至 {roomName}?", + "@forwardMessageTo": { + "type": "String", + "placeholders": { + "roomName": { + "type": "String" + } + } + }, + "sendTypingNotificationsDescription": "聊天室中的其他參與者可以看到您正在輸入新訊息。", + "@sendTypingNotificationsDescription": {}, + "verifyOtherDeviceDescription": "當您驗證另一個裝置時,這些裝置可以交換密鑰,提升您的整體安全性。💪 當您開始驗證時,一個彈出視窗將在兩個裝置上的應用程式中出現。在那裡,您將看到一系列的表情符號或數字,您需要相互比較。在開始驗證之前最好有兩個裝置在手邊。🤳", + "@verifyOtherDeviceDescription": {}, + "acceptedKeyVerification": "{sender} 接受了密鑰驗證", + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "completedKeyVerification": "{sender} 完成了密鑰驗證", + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "isReadyForKeyVerification": "{sender} 已準備好進行密鑰驗證", + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "thereAreCountUsersBlocked": "目前有 {count} 名使用者被封鎖。", + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "knockRestricted": "敲門受限", + "@knockRestricted": {}, + "appLockDescription": "未使用時以密碼鎖定應用程式", + "@appLockDescription": {}, + "globalChatId": "全球聊天室 ID", + "@globalChatId": {}, + "accessAndVisibility": "訪問權限和可見性", + "@accessAndVisibility": {}, + "accessAndVisibilityDescription": "誰被允許加入此聊天室以及如何發現聊天室。", + "@accessAndVisibilityDescription": {}, + "calls": "通話", + "@calls": {}, + "chatDescription": "聊天室描述", + "@chatDescription": {}, + "chatDescriptionHasBeenChanged": "聊天室描述已變更", + "@chatDescriptionHasBeenChanged": {}, + "tryAgain": "再試一次", + "@tryAgain": {}, + "pleaseEnterRecoveryKey": "請輸入您的恢復金鑰:", + "@pleaseEnterRecoveryKey": {}, + "directChat": "私訊", + "@directChat": {}, + "register": "註冊", + "@register": { + "type": "String", + "placeholders": {} + }, + "setAsCanonicalAlias": "設為主要別名", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "setChatDescription": "設定聊天室描述", + "@setChatDescription": {}, + "groupName": "群組名稱", + "@groupName": {}, + "searchForUsers": "搜尋 @users...", + "@searchForUsers": {}, + "inviteGroupChat": "📨 邀請群組聊天室", + "@inviteGroupChat": {}, + "setTheme": "設定主題:", + "@setTheme": {}, + "knocking": "敲門", + "@knocking": {}, + "sessionLostBody": "您的會話已丟失。請將此錯誤報告給開發人員,網址為 {url}。錯誤訊息為:{error}", + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "swipeRightToLeftToReply": "向右滑至左以回覆", + "@swipeRightToLeftToReply": {}, + "hideRedactedMessagesBody": "如果有人收回一條訊息,該訊息將不再在聊天室中顯示。", + "@hideRedactedMessagesBody": {}, + "link": "網址", + "@link": {}, + "obtainingLocation": "正在取得位置…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "oopsPushError": "哎呀!設定推送通知時不幸發生錯誤。", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "removeYourAvatar": "移除您的頭像", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "singlesignon": "單一登入", + "@singlesignon": { + "type": "String", + "placeholders": {} + }, + "presenceStyle": "目前狀態:", + "@presenceStyle": { + "type": "String", + "placeholders": {} + }, + "presencesToggle": "顯示其他使用者的狀態訊息", + "@presencesToggle": { + "type": "String", + "placeholders": {} + }, + "spaceIsPublic": "空間是公開的", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "dismiss": "解散", + "@dismiss": {}, + "reactedWith": "{sender} 以 {reaction} 回應", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "confirmEventUnpin": "您確定要永久取消釘選該事件嗎?", + "@confirmEventUnpin": {}, + "switchToAccount": "切換到帳戶 {number}", + "@switchToAccount": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "widgetEtherpad": "文字筆記", + "@widgetEtherpad": {}, + "noOneCanJoin": "沒有人可以加入", + "@noOneCanJoin": {}, + "userWouldLikeToChangeTheChat": "{user} 想要加入聊天室。", + "@userWouldLikeToChangeTheChat": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "noPublicLinkHasBeenCreatedYet": "尚未建立公開網址", + "@noPublicLinkHasBeenCreatedYet": {}, + "saveKeyManuallyDescription": "通過觸發系統分享對話框或剪貼板手動保存此密鑰。", + "@saveKeyManuallyDescription": {}, + "storeInAndroidKeystore": "存儲在 Android KeyStore", + "@storeInAndroidKeystore": {}, + "storeInAppleKeyChain": "存儲在 Apple KeyChain", + "@storeInAppleKeyChain": {}, + "foregroundServiceRunning": "當前景服務正在運行時會顯示此通知。", + "@foregroundServiceRunning": {}, + "screenSharingTitle": "螢幕分享", + "@screenSharingTitle": {}, + "wasDirectChatDisplayName": "空的聊天室(原名稱為 {oldDisplayName} )", + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "otherCallingPermissions": "麥克風、相機和其他 FluffyChat 權限", + "@otherCallingPermissions": {}, + "disableEncryptionWarning": "出於安全原因,您不能在之前已加密的聊天室中停用加密。", + "@disableEncryptionWarning": {}, + "deviceKeys": "裝置密鑰:", + "@deviceKeys": {}, + "fileIsTooBigForServer": "無法發送!該伺服器僅支援最大到 {max} 的附件。", + "@fileIsTooBigForServer": {}, + "fileHasBeenSavedAt": "文件已保存在 {path}", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "jumpToLastReadMessage": "跳至最後讀取的訊息", + "@jumpToLastReadMessage": {}, + "openLinkInBrowser": "在瀏覽器中開啟連結", + "@openLinkInBrowser": {}, + "reportErrorDescription": "😭 哦不。出了些問題。如果您願意,可以將此錯誤報告給開發者。", + "@reportErrorDescription": {}, + "readUpToHere": "讀到這裡", + "@readUpToHere": {}, + "report": "報告", + "@report": {}, + "pleaseEnterANumber": "請輸入大於 0 的數字", + "@pleaseEnterANumber": {}, + "roomUpgradeDescription": "將使用新版本聊天室來重新建立聊天室。所有本聊天室的參與者都會收到通知,他們都需要換到新的聊天室裡。若您想知道有關新版本的更多資訊,請前往 https://spec.matrix.org/latest/rooms/", + "@roomUpgradeDescription": {}, + "wrongRecoveryKey": "抱歉......這似乎不是正確的恢復密鑰。", + "@wrongRecoveryKey": {}, + "passwordsDoNotMatch": "密碼不匹配", + "@passwordsDoNotMatch": {}, + "publicSpaces": "公共空間", + "@publicSpaces": {}, + "subspace": "子空間", + "@subspace": {}, + "initAppError": "初始化應用時發生錯誤", + "@initAppError": {}, + "canceledKeyVerification": "{sender} 取消了密鑰驗證", + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "startedKeyVerification": "{sender} 開始了密鑰驗證", + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "transparent": "透明", + "@transparent": {}, + "incomingMessages": "收到的訊息", + "@incomingMessages": {}, + "databaseMigrationTitle": "資料庫已最佳化", + "@databaseMigrationTitle": {}, + "restoreSessionBody": "應用程式現在嘗試從備份中恢復您的會話。請將此錯誤報告給開發人員,網址為 {url}。錯誤訊息為:{error}", + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "stickers": "貼圖", + "@stickers": {}, + "joinSpace": "加入空間", + "@joinSpace": {}, + "noMoreChatsFound": "沒有更多聊天室了...", + "@noMoreChatsFound": {}, + "commandHint_op": "設定給定使用者的權限等級(預設:50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "customEmojisAndStickers": "自訂表情符號和貼圖", + "@customEmojisAndStickers": {}, + "locationPermissionDeniedNotice": "位置權限被拒絕。請授予它們以能夠分享您的位置。", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroupQuestion": "您想邀請 {contact} 加入 「{groupName}」 聊天室嗎?", + "@inviteContactToGroupQuestion": {}, + "enableMultiAccounts": "(實驗性功能)在此裝置上啟用多個帳號", + "@enableMultiAccounts": {}, + "hideMemberChangesInPublicChats": "在公開聊天室中隱藏成員變動", + "@hideMemberChangesInPublicChats": {}, + "recoveryKeyLost": "遺失恢復金鑰?", + "@recoveryKeyLost": {}, + "sendAsText": "以文字傳送", + "@sendAsText": { + "type": "String" + }, + "sendSticker": "傳送貼圖", + "@sendSticker": { + "type": "String", + "placeholders": {} + }, + "unverified": "尚未驗證", + "@unverified": {}, + "time": "時間", + "@time": {}, + "chatCanBeDiscoveredViaSearchOnServer": "可以透過在 {server} 上的搜尋發現聊天室", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "commandHint_sendraw": "傳送原始 json", + "@commandHint_sendraw": {}, + "newPassword": "新密碼", + "@newPassword": {}, + "createNewAddress": "建立新地址", + "@createNewAddress": {}, + "searchIn": "在聊天室「{chat}」中搜尋......", + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "searchMore": "搜尋更多......", + "@searchMore": {}, + "gallery": "畫廊", + "@gallery": {}, + "databaseBuildErrorBody": "無法建立 SQLite 資料庫。應用程式目前嘗試使用遺留資料庫。請將此錯誤報告給開發人員,網址為 {url}。錯誤訊息為:{error}", + "@databaseBuildErrorBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "sendReadReceiptsDescription": "聊天室中的其他參與者可以看到您已讀取一條訊息。", + "@sendReadReceiptsDescription": {}, + "formattedMessages": "格式化訊息", + "@formattedMessages": {}, + "restricted": "受限", + "@restricted": {}, + "goToSpace": "前往空間:{space}", + "@goToSpace": { + "type": "String", + "space": {} + }, + "markAsUnread": "標示為未讀", + "@markAsUnread": {}, + "noDatabaseEncryption": "此平台不支援資料庫加密", + "@noDatabaseEncryption": {}, + "messageType": "訊息類型", + "@messageType": {}, + "openGallery": "開啟畫廊", + "@openGallery": {}, + "markAsRead": "標示為已讀", + "@markAsRead": {}, + "reportUser": "舉報使用者", + "@reportUser": {}, + "unsupportedAndroidVersionLong": "此功能需要較新的 Android 版本。請檢查更新或 Lineage OS 支持。", + "@unsupportedAndroidVersionLong": {}, + "emailOrUsername": "電子郵件或使用者名", + "@emailOrUsername": {}, + "indexedDbErrorTitle": "私密模式問題", + "@indexedDbErrorTitle": {}, + "widgetJitsi": "Jitsi Meet", + "@widgetJitsi": {}, + "usersMustKnock": "使用者必須敲門", + "@usersMustKnock": {}, + "knock": "敲門", + "@knock": {}, + "storeInSecureStorageDescription": "將恢復密鑰存儲在此裝置的安全存儲中。", + "@storeInSecureStorageDescription": {}, + "appearOnTopDetails": "允許應用程式顯示在最上層(如果您已將 Fluffychat 設定為通話帳戶則不需要)", + "@appearOnTopDetails": {}, + "whyIsThisMessageEncrypted": "為什麼這條訊息無法讀取?", + "@whyIsThisMessageEncrypted": {}, + "noKeyForThisMessage": "如果訊息是在您登入此裝置之前傳送的,就可能會發生這種情況。\n\n也有可能是傳送者已經封鎖了您的裝置,或者網絡連接出了問題。\n\n如果您能在另一個會話中讀取該訊息,那麼您可以從中轉移訊息!前往設定 > 裝置,並確保您的裝置已相互驗證。當您下次打開房間且兩個會話都在前景時,密鑰將自動傳輸。\n\n不想在登出或切換裝置時丟失密鑰?請確保您已在設定中啟用了聊天室備份。", + "@noKeyForThisMessage": {}, + "newSpaceDescription": "空間允許您整合您的聊天室並建立私人或公開社群。", + "@newSpaceDescription": {}, + "pleaseTryAgainLaterOrChooseDifferentServer": "請稍後再試,或選擇不同的伺服器。", + "@pleaseTryAgainLaterOrChooseDifferentServer": {}, + "signInWith": "使用 {provider} 登入", + "@signInWith": { + "type": "String", + "placeholders": { + "provider": { + "type": "String" + } + } + }, + "invalidInput": "無效的輸入!", + "@invalidInput": {}, + "verifyOtherUser": "🔐 驗證其他使用者", + "@verifyOtherUser": {}, + "verifyOtherUserDescription": "如果您驗證了另一個使用者,您可以確定您真正與誰通信。💪\n\n當您開始驗證時,您和另一個使用者將在應用程式中看到一個彈出視窗。在那裡,您將看到一系列的表情符號或數字,您需要相互比較。\n\n最好的方式是見面或開始視訊通話。👭", + "@verifyOtherUserDescription": {}, + "requestedKeyVerification": "{sender} 請求了密鑰驗證", + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "commandHint_ignore": "無視已提供的 Matrix ID", + "@commandHint_ignore": {}, + "countChatsAndCountParticipants": "{chats} 個聊天室和 {participants} 位參與者", + "@countChatsAndCountParticipants": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + }, + "participants": { + "type": "int" + } + } + }, + "joinedChats": "已加入的聊天室", + "@joinedChats": {}, + "unread": "未讀", + "@unread": {}, + "space": "空間", + "@space": {}, + "spaces": "空間", + "@spaces": {}, + "start": "開始", + "@start": {}, + "openChat": "開啟聊天室", + "@openChat": {}, + "unreadChatsInApp": "{appname}:{unread} 未讀聊天室", + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "adminLevel": "{level} - 管理員", + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "userLevel": "{level} - 用戶", + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "moderatorLevel": "{level} - 管理員", + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "invitedBy": "📩 由 {user} 邀請", + "@invitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "doesNotSeemToBeAValidHomeserver": "似乎不是能匹配的歸屬伺服器。伺服器域名打錯了嗎?", + "@doesNotSeemToBeAValidHomeserver": {}, + "noticeChatBackupDeviceVerification": "注意:當您將所有裝置連線到聊天備份時,它們會自動驗證。", + "@noticeChatBackupDeviceVerification": {}, + "sendCanceled": "傳送取消", + "@sendCanceled": {}, + "changelog": "變更日誌", + "@changelog": {}, + "changeTheCanonicalRoomAlias": "變更公開聊天室的主要地址", + "@changeTheCanonicalRoomAlias": {}, + "sendImages": "傳送{count}張圖片", + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "loginWithMatrixId": "以Matrix-ID登入", + "@loginWithMatrixId": {}, + "inviteOtherUsers": "邀請其他用戶進入本聊天", + "@inviteOtherUsers": {}, + "sendRoomNotifications": "傳送一條 @room 群提醒", + "@sendRoomNotifications": {}, + "updateInstalled": "🎉已成功安裝{version}版本!", + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "oneOfYourDevicesIsNotVerified": "你的其中一個裝置尚未驗證", + "@oneOfYourDevicesIsNotVerified": {}, + "chatPermissionsDescription": "定義此聊天中某些操作需要哪個權限等級。 權限等級0、50和100通常代表使用者、版主和管理員,但任何分級都是可能的。", + "@chatPermissionsDescription": {}, + "changeGeneralChatSettings": "變更一般聊天設定", + "@changeGeneralChatSettings": {}, + "manageAccount": "帳號管理", + "@manageAccount": {}, + "changeTheChatPermissions": "變更聊天室權限", + "@changeTheChatPermissions": {}, + "changeTheVisibilityOfChatHistory": "變更過往聊天記錄可見度", + "@changeTheVisibilityOfChatHistory": {}, + "homeserverDescription": "您的所有資料都儲存在歸屬伺服器上,就像電子郵件提供商一樣。 您可以選擇要使用的歸屬伺服器,同時您仍然可以與每個人溝通。 請訪問https://matrix.org瞭解更多資訊。", + "@homeserverDescription": {}, + "sendingAttachment": "附件傳送中…", + "@sendingAttachment": {}, + "compressVideo": "影片壓縮中…", + "@compressVideo": {}, + "opacity": "不透明度:", + "@opacity": {}, + "aboutHomeserver": "關於{homeserver}", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "noChatsFoundHere": "還沒開始聊天嗎?點擊下方按鈕找個人聊聊吧⤵", + "@noChatsFoundHere": {}, + "changeTheDescriptionOfTheGroup": "變更聊天室說明", + "@changeTheDescriptionOfTheGroup": {}, + "discoverHomeservers": "探索歸屬伺服器", + "@discoverHomeservers": {}, + "whatIsAHomeserver": "什麼是歸屬伺服器?", + "@whatIsAHomeserver": {}, + "calculatingFileSize": "正在計算檔案大小…", + "@calculatingFileSize": {}, + "prepareSendingAttachment": "準備傳送附件…", + "@prepareSendingAttachment": {}, + "generatingVideoThumbnail": "生成影片縮圖中…", + "@generatingVideoThumbnail": {}, + "sendingAttachmentCountOfCount": "附件傳送中 {index}/{length}…", + "@sendingAttachmentCountOfCount": { + "type": "integer", + "placeholders": { + "index": { + "type": "int" + }, + "length": { + "type": "int" + } + } + }, + "serverLimitReached": "已達伺服器上限! 請稍等{seconds}秒…", + "@serverLimitReached": { + "type": "integer", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "welcomeText": "嘿,嘿👋這是FluffyChat。 您可以登入任何與https://matrix.org相容的歸屬伺服器後和任何人聊天。 這是一個巨大的去中心化訊息網路!", + "@welcomeText": {}, + "setWallpaper": "設定背景樣式", + "@setWallpaper": {}, + "noContactInformationProvided": "伺服器沒有提供任何有效的聯絡資訊", + "@noContactInformationProvided": {}, + "contactServerAdmin": "聯繫伺服器管理員", + "@contactServerAdmin": {}, + "contactServerSecurity": "聯繫伺服器安管", + "@contactServerSecurity": {}, + "continueText": "繼續", + "@continueText": {}, + "blur": "模糊:", + "@blur": {}, + "synchronizingPleaseWaitCounter": " 同步中… ({percentage}%)", + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "contentNotificationSettings": "內容通知設定", + "@contentNotificationSettings": {}, + "generalNotificationSettings": "常規通知設定", + "@generalNotificationSettings": {}, + "roomNotificationSettings": "聊天室通知設定", + "@roomNotificationSettings": {}, + "userSpecificNotificationSettings": "用戶特定通知設定", + "@userSpecificNotificationSettings": {}, + "otherNotificationSettings": "其他通知設定", + "@otherNotificationSettings": {}, + "notificationRuleContainsUserName": "包含用户名稱", + "@notificationRuleContainsUserName": {}, + "notificationRuleContainsUserNameDescription": "當訊息帶有用户名稱時通知用戶。", + "@notificationRuleContainsUserNameDescription": {}, + "notificationRuleMaster": "靜音所有通知", + "@notificationRuleMaster": {}, + "notificationRuleMasterDescription": "覆蓋所有其他規則並禁止所有通知。", + "@notificationRuleMasterDescription": {}, + "notificationRuleInviteForMe": "邀請我", + "@notificationRuleInviteForMe": {}, + "notificationRuleSuppressNoticesDescription": "隱藏來自bot等的自動化消息。", + "@notificationRuleSuppressNoticesDescription": {}, + "notificationRuleSuppressNotices": "隱藏自動化消息", + "@notificationRuleSuppressNotices": {}, + "notificationRuleMemberEvent": "成員事件", + "@notificationRuleMemberEvent": {}, + "notificationRuleMemberEventDescription": "隱藏成員事件的通知。", + "@notificationRuleMemberEventDescription": {}, + "notificationRuleIsUserMention": "用户提及", + "@notificationRuleIsUserMention": {}, + "notificationRuleInviteForMeDescription": "當用户被邀請到聊天室時,通知他們。", + "@notificationRuleInviteForMeDescription": {}, + "commandHint_roomupgrade": "升級此聊天室至指定版本", + "@commandHint_roomupgrade": {}, + "serverInformation": "伺服器資訊 :", + "@serverInformation": {}, + "name": "名稱", + "@name": {}, + "website": "網站", + "@website": {}, + "compress": "壓縮", + "@compress": {}, + "newChatRequest": "📩 新的聊天邀請", + "@newChatRequest": {}, + "enterNewChat": "進入新聊天室", + "@enterNewChat": {}, + "version": "版本", + "@version": {}, + "unableToJoinChat": "無法加入聊天室。對話可能以被其他方結束。", + "@unableToJoinChat": {}, + "appWantsToUseForLogin": "使用伺服器「{server} 」登入", + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "italicText": "斜體", + "@italicText": {}, + "boldText": "粗體", + "@boldText": {}, + "strikeThrough": "刪除線", + "@strikeThrough": {}, + "pleaseFillOut": "請填充", + "@pleaseFillOut": {}, + "invalidUrl": "無效 url", + "@invalidUrl": {}, + "appWantsToUseForLoginDescription": "你特此允許該應用程式和網站分享關於你的信息。", + "@appWantsToUseForLoginDescription": {}, + "open": "打開", + "@open": {}, + "waitingForServer": "等待伺服器中...", + "@waitingForServer": {}, + "appIntroduction": "FluffyChat 讓你和你的朋友跨越工具聊天。在 https://matrix.org 了解更多或*繼續*。", + "@appIntroduction": {}, + "previous": "上一個", + "@previous": {}, + "otherPartyNotLoggedIn": "對方現未登入,未能接收訊息 !", + "@otherPartyNotLoggedIn": {}, + "supportPage": "幫助頁面", + "@supportPage": {}, + "addLink": "插入連結", + "@addLink": {} +} diff --git a/assets/logo.png b/assets/logo.png new file mode 100644 index 0000000..61d0656 Binary files /dev/null and b/assets/logo.png differ diff --git a/assets/logo.svg b/assets/logo.svg new file mode 100644 index 0000000..767a86a --- /dev/null +++ b/assets/logo.svg @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/assets/logo_transparent.png b/assets/logo_transparent.png new file mode 100644 index 0000000..61d0656 Binary files /dev/null and b/assets/logo_transparent.png differ diff --git a/assets/sas-emoji.json b/assets/sas-emoji.json new file mode 100644 index 0000000..f0eb702 --- /dev/null +++ b/assets/sas-emoji.json @@ -0,0 +1,2178 @@ +[ + { + "number": 0, + "emoji": "🐶", + "description": "Dog", + "unicode": "U+1F436", + "translated_descriptions": { + "ar": "كَلب", + "bg": "Куче", + "ca": "Gos", + "cs": "Pes", + "de": "Hund", + "eo": "Hundo", + "es": "Perro", + "et": "Koer", + "fi": "Koira", + "fr": "Chien", + "hr": "pas", + "hu": "Kutya", + "it": "Cane", + "ja": "犬", + "nb_NO": "Hund", + "nl": "Hond", + "pt_BR": "Cachorro", + "ru": "Собака", + "si": "බල්ලා", + "sk": "Hlava psa", + "sr": "пас", + "sv": "Hund", + "szl": null, + "tzm": "Aydi", + "uk": "Пес", + "zh_Hans": "狗" + } + }, + { + "number": 1, + "emoji": "🐱", + "description": "Cat", + "unicode": "U+1F431", + "translated_descriptions": { + "ar": "هِرَّة", + "bg": "Котка", + "ca": "Gat", + "cs": "Kočka", + "de": "Katze", + "eo": "Kato", + "es": "Gato", + "et": "Kass", + "fi": "Kissa", + "fr": "Chat", + "hr": "mačka", + "hu": "Macska", + "it": "Gatto", + "ja": "猫", + "nb_NO": "Katt", + "nl": "Kat", + "pt_BR": "Gato", + "ru": "Кошка", + "si": "පූසා", + "sk": "Hlava mačky", + "sr": "мачка", + "sv": "Katt", + "szl": null, + "tzm": "Amuc", + "uk": "Кіт", + "zh_Hans": "猫" + } + }, + { + "number": 2, + "emoji": "🦁", + "description": "Lion", + "unicode": "U+1F981", + "translated_descriptions": { + "ar": "أَسَد", + "bg": "Лъв", + "ca": "Lleó", + "cs": "Lev", + "de": "Löwe", + "eo": "Leono", + "es": "León", + "et": "Lõvi", + "fi": "Leijona", + "fr": "Lion", + "hr": "lav", + "hu": "Oroszlán", + "it": "Leone", + "ja": "ライオン", + "nb_NO": "Løve", + "nl": "Leeuw", + "pt_BR": "Leão", + "ru": "Лев", + "si": "සිංහයා", + "sk": "Hlava leva", + "sr": "лав", + "sv": "Lejon", + "szl": null, + "tzm": "Izem", + "uk": "Лев", + "zh_Hans": "狮子" + } + }, + { + "number": 3, + "emoji": "🐎", + "description": "Horse", + "unicode": "U+1F40E", + "translated_descriptions": { + "ar": "حِصَان", + "bg": "Кон", + "ca": "Cavall", + "cs": "Kůň", + "de": "Pferd", + "eo": "Ĉevalo", + "es": "Caballo", + "et": "Hobune", + "fi": "Hevonen", + "fr": "Cheval", + "hr": "konj", + "hu": "Ló", + "it": "Cavallo", + "ja": "馬", + "nb_NO": "Hest", + "nl": "Paard", + "pt_BR": "Cavalo", + "ru": "Лошадь", + "si": "අශ්වයා", + "sk": "Kôň", + "sr": "коњ", + "sv": "Häst", + "szl": null, + "tzm": "Ayyis", + "uk": "Кінь", + "zh_Hans": "马" + } + }, + { + "number": 4, + "emoji": "🦄", + "description": "Unicorn", + "unicode": "U+1F984", + "translated_descriptions": { + "ar": "حِصَانٌ بِقَرن", + "bg": "Еднорог", + "ca": "Unicorn", + "cs": "Jednorožec", + "de": "Einhorn", + "eo": "Unukorno", + "es": "Unicornio", + "et": "Ükssarvik", + "fi": "Yksisarvinen", + "fr": "Licorne", + "hr": "jednorog", + "hu": "Egyszarvú", + "it": "Unicorno", + "ja": "ユニコーン", + "nb_NO": "Enhjørning", + "nl": "Eenhoorn", + "pt_BR": "Unicórnio", + "ru": "Единорог", + "si": null, + "sk": "Hlava jednorožca", + "sr": "једнорог", + "sv": "Enhörning", + "szl": null, + "tzm": null, + "uk": "Єдиноріг", + "zh_Hans": "独角兽" + } + }, + { + "number": 5, + "emoji": "🐷", + "description": "Pig", + "unicode": "U+1F437", + "translated_descriptions": { + "ar": "خِنزِير", + "bg": "Прасе", + "ca": "Porc", + "cs": "Prase", + "de": "Schwein", + "eo": "Porko", + "es": "Cerdo", + "et": "Siga", + "fi": "Sika", + "fr": "Cochon", + "hr": "svinja", + "hu": "Malac", + "it": "Maiale", + "ja": "ブタ", + "nb_NO": "Gris", + "nl": "Varken", + "pt_BR": "Porco", + "ru": "Свинья", + "si": null, + "sk": "Hlava prasaťa", + "sr": "прасе", + "sv": "Gris", + "szl": null, + "tzm": "Ilef", + "uk": "Свиня", + "zh_Hans": "猪" + } + }, + { + "number": 6, + "emoji": "🐘", + "description": "Elephant", + "unicode": "U+1F418", + "translated_descriptions": { + "ar": "فِيل", + "bg": "Слон", + "ca": "Elefant", + "cs": "Slon", + "de": "Elefant", + "eo": "Elefanto", + "es": "Elefante", + "et": "Elevant", + "fi": "Norsu", + "fr": "Éléphant", + "hr": "slon", + "hu": "Elefánt", + "it": "Elefante", + "ja": "ゾウ", + "nb_NO": "Elefant", + "nl": "Olifant", + "pt_BR": "Elefante", + "ru": "Слон", + "si": null, + "sk": "Slon", + "sr": "слон", + "sv": "Elefant", + "szl": null, + "tzm": "Ilu", + "uk": "Слон", + "zh_Hans": "大象" + } + }, + { + "number": 7, + "emoji": "🐰", + "description": "Rabbit", + "unicode": "U+1F430", + "translated_descriptions": { + "ar": "أَرنَب", + "bg": "Заек", + "ca": "Conill", + "cs": "Králík", + "de": "Hase", + "eo": "Kuniklo", + "es": "Conejo", + "et": "Jänes", + "fi": "Kani", + "fr": "Lapin", + "hr": "zec", + "hu": "Nyúl", + "it": "Coniglio", + "ja": "うさぎ", + "nb_NO": "Kanin", + "nl": "Konijn", + "pt_BR": "Coelho", + "ru": "Кролик", + "si": null, + "sk": "Hlava zajaca", + "sr": "зец", + "sv": "Kanin", + "szl": null, + "tzm": "Agnin", + "uk": "Кріль", + "zh_Hans": "兔子" + } + }, + { + "number": 8, + "emoji": "🐼", + "description": "Panda", + "unicode": "U+1F43C", + "translated_descriptions": { + "ar": "باندَا", + "bg": "Панда", + "ca": "Panda", + "cs": "Panda", + "de": "Panda", + "eo": "Pando", + "es": "Panda", + "et": "Panda", + "fi": "Panda", + "fr": "Panda", + "hr": "panda", + "hu": "Panda", + "it": "Panda", + "ja": "パンダ", + "nb_NO": "Panda", + "nl": "Panda", + "pt_BR": "Panda", + "ru": "Панда", + "si": null, + "sk": "Hlava pandy", + "sr": "панда", + "sv": "Panda", + "szl": null, + "tzm": null, + "uk": "Панда", + "zh_Hans": "熊猫" + } + }, + { + "number": 9, + "emoji": "🐓", + "description": "Rooster", + "unicode": "U+1F413", + "translated_descriptions": { + "ar": "دِيك", + "bg": "Петел", + "ca": "Gall", + "cs": "Kohout", + "de": "Hahn", + "eo": "Virkoko", + "es": "Gallo", + "et": "Kukk", + "fi": "Kukko", + "fr": "Coq", + "hr": "kokot", + "hu": "Kakas", + "it": "Gallo", + "ja": "ニワトリ", + "nb_NO": "Hane", + "nl": "Haan", + "pt_BR": "Galo", + "ru": "Петух", + "si": null, + "sk": "Kohút", + "sr": "петао", + "sv": "Tupp", + "szl": null, + "tzm": "Ayaẓiḍ", + "uk": "Когут", + "zh_Hans": "公鸡" + } + }, + { + "number": 10, + "emoji": "🐧", + "description": "Penguin", + "unicode": "U+1F427", + "translated_descriptions": { + "ar": "بِطريق", + "bg": "Пингвин", + "ca": "Pingüí", + "cs": "Tučňák", + "de": "Pinguin", + "eo": "Pingveno", + "es": "Pingüino", + "et": "Pingviin", + "fi": "Pingviini", + "fr": "Manchot", + "hr": "pingvin", + "hu": "Pingvin", + "it": "Pinguino", + "ja": "ペンギン", + "nb_NO": "Pingvin", + "nl": "Pinguïn", + "pt_BR": "Pinguim", + "ru": "Пингвин", + "si": null, + "sk": "Tučniak", + "sr": "пингвин", + "sv": "Pingvin", + "szl": null, + "tzm": null, + "uk": "Пінгвін", + "zh_Hans": "企鹅" + } + }, + { + "number": 11, + "emoji": "🐢", + "description": "Turtle", + "unicode": "U+1F422", + "translated_descriptions": { + "ar": "سُلحفاة", + "bg": "Костенурка", + "ca": "Tortuga", + "cs": "Želva", + "de": "Schildkröte", + "eo": "Testudo", + "es": "Tortuga", + "et": "Kilpkonn", + "fi": "Kilpikonna", + "fr": "Tortue", + "hr": "kornjača", + "hu": "Teknős", + "it": "Tartaruga", + "ja": "亀", + "nb_NO": "Skilpadde", + "nl": "Schildpad", + "pt_BR": "Tartaruga", + "ru": "Черепаха", + "si": null, + "sk": "Korytnačka", + "sr": "корњача", + "sv": "Sköldpadda", + "szl": null, + "tzm": "Ifker", + "uk": "Черепаха", + "zh_Hans": "乌龟" + } + }, + { + "number": 12, + "emoji": "🐟", + "description": "Fish", + "unicode": "U+1F41F", + "translated_descriptions": { + "ar": "سَمَكَة", + "bg": "Риба", + "ca": "Peix", + "cs": "Ryba", + "de": "Fisch", + "eo": "Fiŝo", + "es": "Pez", + "et": "Kala", + "fi": "Kala", + "fr": "Poisson", + "hr": "riba", + "hu": "Hal", + "it": "Pesce", + "ja": "魚", + "nb_NO": "Fisk", + "nl": "Vis", + "pt_BR": "Peixe", + "ru": "Рыба", + "si": null, + "sk": "Ryba", + "sr": "риба", + "sv": "Fisk", + "szl": null, + "tzm": "Aselm", + "uk": "Риба", + "zh_Hans": "鱼" + } + }, + { + "number": 13, + "emoji": "🐙", + "description": "Octopus", + "unicode": "U+1F419", + "translated_descriptions": { + "ar": "أُخطُبُوط", + "bg": "Октопод", + "ca": "Pop", + "cs": "Chobotnice", + "de": "Oktopus", + "eo": "Polpo", + "es": "Pulpo", + "et": "Kaheksajalg", + "fi": "Tursas", + "fr": "Poulpe", + "hr": "hobotnica", + "hu": "Polip", + "it": "Polpo", + "ja": "たこ", + "nb_NO": "Blekksprut", + "nl": "Octopus", + "pt_BR": "Polvo", + "ru": "Осьминог", + "si": null, + "sk": "Chobotnica", + "sr": "октопод", + "sv": "Bläckfisk", + "szl": null, + "tzm": null, + "uk": "Восьминіг", + "zh_Hans": "章鱼" + } + }, + { + "number": 14, + "emoji": "🦋", + "description": "Butterfly", + "unicode": "U+1F98B", + "translated_descriptions": { + "ar": "فَرَاشَة", + "bg": "Пеперуда", + "ca": "Papallona", + "cs": "Motýl", + "de": "Schmetterling", + "eo": "Papilio", + "es": "Mariposa", + "et": "Liblikas", + "fi": "Perhonen", + "fr": "Papillon", + "hr": "leptir", + "hu": "Pillangó", + "it": "Farfalla", + "ja": "ちょうちょ", + "nb_NO": "Sommerfugl", + "nl": "Vlinder", + "pt_BR": "Borboleta", + "ru": "Бабочка", + "si": null, + "sk": "Motýľ", + "sr": "лептир", + "sv": "Fjäril", + "szl": null, + "tzm": null, + "uk": "Метелик", + "zh_Hans": "蝴蝶" + } + }, + { + "number": 15, + "emoji": "🌷", + "description": "Flower", + "unicode": "U+1F337", + "translated_descriptions": { + "ar": "زَهرَة", + "bg": "Цвете", + "ca": "Flor", + "cs": "Květina", + "de": "Blume", + "eo": "Floro", + "es": "Flor", + "et": "Lill", + "fi": "Kukka", + "fr": "Fleur", + "hr": "svijet", + "hu": "Virág", + "it": "Fiore", + "ja": "花", + "nb_NO": "Blomst", + "nl": "Bloem", + "pt_BR": "Flor", + "ru": "Цветок", + "si": null, + "sk": "Tulipán", + "sr": "цвет", + "sv": "Blomma", + "szl": null, + "tzm": null, + "uk": "Квітка", + "zh_Hans": "花" + } + }, + { + "number": 16, + "emoji": "🌳", + "description": "Tree", + "unicode": "U+1F333", + "translated_descriptions": { + "ar": "شَجَرَة", + "bg": "Дърво", + "ca": "Arbre", + "cs": "Strom", + "de": "Baum", + "eo": "Arbo", + "es": "Árbol", + "et": "Puu", + "fi": "Puu", + "fr": "Arbre", + "hr": "drvo", + "hu": "Fa", + "it": "Albero", + "ja": "木", + "nb_NO": "Tre", + "nl": "Boom", + "pt_BR": "Árvore", + "ru": "Дерево", + "si": null, + "sk": "Listnatý strom", + "sr": "дрво", + "sv": "Träd", + "szl": null, + "tzm": "Aseklu", + "uk": "Дерево", + "zh_Hans": "树" + } + }, + { + "number": 17, + "emoji": "🌵", + "description": "Cactus", + "unicode": "U+1F335", + "translated_descriptions": { + "ar": "صبار", + "bg": "Кактус", + "ca": "Cactus", + "cs": "Kaktus", + "de": "Kaktus", + "eo": "Kakto", + "es": "Cactus", + "et": "Kaktus", + "fi": "Kaktus", + "fr": "Cactus", + "hr": "kaktus", + "hu": "Kaktusz", + "it": "Cactus", + "ja": "サボテン", + "nb_NO": "Kaktus", + "nl": "Cactus", + "pt_BR": "Cacto", + "ru": "Кактус", + "si": null, + "sk": "Kaktus", + "sr": "кактус", + "sv": "Kaktus", + "szl": null, + "tzm": null, + "uk": "Кактус", + "zh_Hans": "仙人掌" + } + }, + { + "number": 18, + "emoji": "🍄", + "description": "Mushroom", + "unicode": "U+1F344", + "translated_descriptions": { + "ar": "فُطر", + "bg": "Гъба", + "ca": "Bolet", + "cs": "Houba", + "de": "Pilz", + "eo": "Fungo", + "es": "Seta", + "et": "Seen", + "fi": "Sieni", + "fr": "Champignon", + "hr": "gljiva", + "hu": "Gomba", + "it": "Fungo", + "ja": "きのこ", + "nb_NO": "Sopp", + "nl": "Paddenstoel", + "pt_BR": "Cogumelo", + "ru": "Гриб", + "si": null, + "sk": "Huba", + "sr": "печурка", + "sv": "Svamp", + "szl": null, + "tzm": "Agursel", + "uk": "Гриб", + "zh_Hans": "蘑菇" + } + }, + { + "number": 19, + "emoji": "🌏", + "description": "Globe", + "unicode": "U+1F30F", + "translated_descriptions": { + "ar": "كُرَةٌ أرضِيَّة", + "bg": "Глобус", + "ca": "Globus terraqüi", + "cs": "Zeměkoule", + "de": "Globus", + "eo": "Globo", + "es": "Globo", + "et": "Maakera", + "fi": "Maapallo", + "fr": "Globe", + "hr": "Globus", + "hu": "Földgömb", + "it": "Globo", + "ja": "地球", + "nb_NO": "Globus", + "nl": "Wereldbol", + "pt_BR": "Globo", + "ru": "Глобус", + "si": null, + "sk": "Zemeguľa", + "sr": "глобус", + "sv": "Jordklot", + "szl": null, + "tzm": null, + "uk": "Глобус", + "zh_Hans": "地球" + } + }, + { + "number": 20, + "emoji": "🌙", + "description": "Moon", + "unicode": "U+1F319", + "translated_descriptions": { + "ar": "قَمَر", + "bg": "Луна", + "ca": "Lluna", + "cs": "Měsíc", + "de": "Mond", + "eo": "Luno", + "es": "Luna", + "et": "Kuu", + "fi": "Kuu", + "fr": "Lune", + "hr": "mjesec", + "hu": "Hold", + "it": "Luna", + "ja": "月", + "nb_NO": "Måne", + "nl": "Maan", + "pt_BR": "Lua", + "ru": "Луна", + "si": null, + "sk": "Polmesiac", + "sr": "месец", + "sv": "Måne", + "szl": null, + "tzm": "Ayyur", + "uk": "Місяць", + "zh_Hans": "月亮" + } + }, + { + "number": 21, + "emoji": "☁️", + "description": "Cloud", + "unicode": "U+2601U+FE0F", + "translated_descriptions": { + "ar": "سَحابَة", + "bg": "Облак", + "ca": "Núvol", + "cs": "Mrak", + "de": "Wolke", + "eo": "Nubo", + "es": "Nube", + "et": "Pilv", + "fi": "Pilvi", + "fr": "Nuage", + "hr": "oblak", + "hu": "Felhő", + "it": "Nuvola", + "ja": "雲", + "nb_NO": "Sky", + "nl": "Wolk", + "pt_BR": "Nuvem", + "ru": "Облако", + "si": null, + "sk": "Oblak", + "sr": "облак", + "sv": "Moln", + "szl": null, + "tzm": null, + "uk": "Хмара", + "zh_Hans": "云" + } + }, + { + "number": 22, + "emoji": "🔥", + "description": "Fire", + "unicode": "U+1F525", + "translated_descriptions": { + "ar": "نار", + "bg": "Огън", + "ca": "Foc", + "cs": "Oheň", + "de": "Feuer", + "eo": "Fajro", + "es": "Fuego", + "et": "Tuli", + "fi": "Tuli", + "fr": "Feu", + "hr": "vatra", + "hu": "Tűz", + "it": "Fuoco", + "ja": "炎", + "nb_NO": "Flamme", + "nl": "Vuur", + "pt_BR": "Fogo", + "ru": "Огонь", + "si": null, + "sk": "Oheň", + "sr": "ватра", + "sv": "Eld", + "szl": null, + "tzm": "Timessi", + "uk": "Вогонь", + "zh_Hans": "火" + } + }, + { + "number": 23, + "emoji": "🍌", + "description": "Banana", + "unicode": "U+1F34C", + "translated_descriptions": { + "ar": "مَوزَة", + "bg": "Банан", + "ca": "Plàtan", + "cs": "Banán", + "de": "Banane", + "eo": "Banano", + "es": "Plátano", + "et": "Banaan", + "fi": "Banaani", + "fr": "Banane", + "hr": "banana", + "hu": "Banán", + "it": "Banana", + "ja": "バナナ", + "nb_NO": "Banan", + "nl": "Banaan", + "pt_BR": "Banana", + "ru": "Банан", + "si": null, + "sk": "Banán", + "sr": "банана", + "sv": "Banan", + "szl": null, + "tzm": "Tabanant", + "uk": "Банан", + "zh_Hans": "香蕉" + } + }, + { + "number": 24, + "emoji": "🍎", + "description": "Apple", + "unicode": "U+1F34E", + "translated_descriptions": { + "ar": "تُفَّاحَة", + "bg": "Ябълка", + "ca": "Poma", + "cs": "Jablko", + "de": "Apfel", + "eo": "Pomo", + "es": "Manzana", + "et": "Õun", + "fi": "Omena", + "fr": "Pomme", + "hr": "jabuka", + "hu": "Alma", + "it": "Mela", + "ja": "リンゴ", + "nb_NO": "Eple", + "nl": "Appel", + "pt_BR": "Maçã", + "ru": "Яблоко", + "si": null, + "sk": "Červené jablko", + "sr": "јабука", + "sv": "Äpple", + "szl": null, + "tzm": "Tadeffuyt", + "uk": "Яблуко", + "zh_Hans": "苹果" + } + }, + { + "number": 25, + "emoji": "🍓", + "description": "Strawberry", + "unicode": "U+1F353", + "translated_descriptions": { + "ar": "فَراوِلَة", + "bg": "Ягода", + "ca": "Maduixa", + "cs": "Jahoda", + "de": "Erdbeere", + "eo": "Frago", + "es": "Fresa", + "et": "Maasikas", + "fi": "Mansikka", + "fr": "Fraise", + "hr": "jagoda", + "hu": "Eper", + "it": "Fragola", + "ja": "いちご", + "nb_NO": "Jordbær", + "nl": "Aardbei", + "pt_BR": "Morango", + "ru": "Клубника", + "si": null, + "sk": "Jahoda", + "sr": "јагода", + "sv": "Jordgubbe", + "szl": null, + "tzm": null, + "uk": "Полуниця", + "zh_Hans": "草莓" + } + }, + { + "number": 26, + "emoji": "🌽", + "description": "Corn", + "unicode": "U+1F33D", + "translated_descriptions": { + "ar": "ذُرَة", + "bg": "Царевица", + "ca": "Blat de moro", + "cs": "Kukuřice", + "de": "Mais", + "eo": "Maizo", + "es": "Maíz", + "et": "Mais", + "fi": "Maissi", + "fr": "Maïs", + "hr": "kukuruza", + "hu": "Kukorica", + "it": "Mais", + "ja": "とうもろこし", + "nb_NO": "Mais", + "nl": "Maïs", + "pt_BR": "Milho", + "ru": "Кукуруза", + "si": null, + "sk": "Kukuričný klas", + "sr": "кукуруз", + "sv": "Majs", + "szl": null, + "tzm": null, + "uk": "Кукурудза", + "zh_Hans": "玉米" + } + }, + { + "number": 27, + "emoji": "🍕", + "description": "Pizza", + "unicode": "U+1F355", + "translated_descriptions": { + "ar": "بِيتزا", + "bg": "Пица", + "ca": "Pizza", + "cs": "Pizza", + "de": "Pizza", + "eo": "Pico", + "es": "Pizza", + "et": "Pitsa", + "fi": "Pizza", + "fr": "Pizza", + "hr": "pizza", + "hu": "Pizza", + "it": "Pizza", + "ja": "ピザ", + "nb_NO": "Pizza", + "nl": "Pizza", + "pt_BR": "Pizza", + "ru": "Пицца", + "si": null, + "sk": "Pizza", + "sr": "пица", + "sv": "Pizza", + "szl": null, + "tzm": null, + "uk": "Піца", + "zh_Hans": "披萨" + } + }, + { + "number": 28, + "emoji": "🎂", + "description": "Cake", + "unicode": "U+1F382", + "translated_descriptions": { + "ar": "كَعكَة", + "bg": "Торта", + "ca": "Pastís", + "cs": "Dort", + "de": "Kuchen", + "eo": "Torto", + "es": "Tarta", + "et": "Kook", + "fi": "Kakku", + "fr": "Gâteau", + "hr": "torta", + "hu": "Süti", + "it": "Torta", + "ja": "ケーキ", + "nb_NO": "Kake", + "nl": "Taart", + "pt_BR": "Bolo", + "ru": "Торт", + "si": null, + "sk": "Narodeninová torta", + "sr": "торта", + "sv": "Tårta", + "szl": null, + "tzm": null, + "uk": "Пиріг", + "zh_Hans": "蛋糕" + } + }, + { + "number": 29, + "emoji": "❤️", + "description": "Heart", + "unicode": "U+2764U+FE0F", + "translated_descriptions": { + "ar": "قَلب", + "bg": "Сърце", + "ca": "Cor", + "cs": "Srdce", + "de": "Herz", + "eo": "Koro", + "es": "Corazón", + "et": "Süda", + "fi": "Sydän", + "fr": "Cœur", + "hr": "srca", + "hu": "Szív", + "it": "Cuore", + "ja": "ハート", + "nb_NO": "Hjerte", + "nl": "Hart", + "pt_BR": "Coração", + "ru": "Сердце", + "si": null, + "sk": "červené srdce", + "sr": "срце", + "sv": "Hjärta", + "szl": null, + "tzm": "Ul", + "uk": "Серце", + "zh_Hans": "心" + } + }, + { + "number": 30, + "emoji": "😀", + "description": "Smiley", + "unicode": "U+1F600", + "translated_descriptions": { + "ar": "اِبتِسَامَة", + "bg": "Усмивка", + "ca": "Somrient", + "cs": "Smajlík", + "de": "Lächeln", + "eo": "Rideto", + "es": "Emoticono", + "et": "Smaili", + "fi": "Hymynaama", + "fr": "Sourire", + "hr": "smajlića", + "hu": "Mosoly", + "it": "Faccina sorridente", + "ja": "スマイル", + "nb_NO": "Smilefjes", + "nl": "Smiley", + "pt_BR": "Sorriso", + "ru": "Улыбка", + "si": null, + "sk": "Škeriaca sa tvár", + "sr": "смајли", + "sv": "Smiley", + "szl": null, + "tzm": null, + "uk": "Посмішка", + "zh_Hans": "笑脸" + } + }, + { + "number": 31, + "emoji": "🤖", + "description": "Robot", + "unicode": "U+1F916", + "translated_descriptions": { + "ar": "رُوبُوت", + "bg": "Робот", + "ca": "Robot", + "cs": "Robot", + "de": "Roboter", + "eo": "Roboto", + "es": "Robot", + "et": "Robot", + "fi": "Robotti", + "fr": "Robot", + "hr": "robot", + "hu": "Robot", + "it": "Robot", + "ja": "ロボと", + "nb_NO": "Robot", + "nl": "Robot", + "pt_BR": "Robô", + "ru": "Робот", + "si": null, + "sk": "Robot", + "sr": "робот", + "sv": "Robot", + "szl": null, + "tzm": "Aṛubu", + "uk": "Робот", + "zh_Hans": "机器人" + } + }, + { + "number": 32, + "emoji": "🎩", + "description": "Hat", + "unicode": "U+1F3A9", + "translated_descriptions": { + "ar": "قُبَّعَة", + "bg": "Шапка", + "ca": "Barret", + "cs": "Klobouk", + "de": "Hut", + "eo": "Ĉapelo", + "es": "Sombrero", + "et": "Kübar", + "fi": "Hattu", + "fr": "Chapeau", + "hr": "kapa", + "hu": "Kalap", + "it": "Cappello", + "ja": "帽子", + "nb_NO": "Hatt", + "nl": "Hoed", + "pt_BR": "Chapéu", + "ru": "Шляпа", + "si": null, + "sk": "Cilinder", + "sr": "шешир", + "sv": "Hatt", + "szl": null, + "tzm": "Taraza", + "uk": "Капелюх", + "zh_Hans": "帽子" + } + }, + { + "number": 33, + "emoji": "👓", + "description": "Glasses", + "unicode": "U+1F453", + "translated_descriptions": { + "ar": "نَظَّارَة", + "bg": "Очила", + "ca": "Ulleres", + "cs": "Brýle", + "de": "Brille", + "eo": "Okulvitroj", + "es": "Gafas", + "et": "Prillid", + "fi": "Silmälasit", + "fr": "Lunettes", + "hr": "naočale", + "hu": "Szemüveg", + "it": "Occhiali", + "ja": "めがね", + "nb_NO": "Briller", + "nl": "Bril", + "pt_BR": "Óculos", + "ru": "Очки", + "si": null, + "sk": "Okuliare", + "sr": "наочаре", + "sv": "Glasögon", + "szl": null, + "tzm": null, + "uk": "Окуляри", + "zh_Hans": "眼镜" + } + }, + { + "number": 34, + "emoji": "🔧", + "description": "Spanner", + "unicode": "U+1F527", + "translated_descriptions": { + "ar": "مِفتَاحُ رَبط", + "bg": "Гаечен ключ", + "ca": "Clau anglesa", + "cs": "Klíč", + "de": "Schraubenschlüssel", + "eo": "Ŝraŭbŝlosilo", + "es": "Llave inglesa", + "et": "Mutrivõti", + "fi": "Kiintoavain", + "fr": "Clé à molette", + "hr": "ključ", + "hu": "Csavarkulcs", + "it": "Chiave inglese", + "ja": "スパナ", + "nb_NO": "Fastnøkkel", + "nl": "Moersleutel", + "pt_BR": "Chave inglesa", + "ru": "Ключ", + "si": null, + "sk": "Francúzsky kľúč", + "sr": "кључ", + "sv": "Skruvnyckel", + "szl": null, + "tzm": null, + "uk": "Гайковий ключ", + "zh_Hans": "扳手" + } + }, + { + "number": 35, + "emoji": "🎅", + "description": "Santa", + "unicode": "U+1F385", + "translated_descriptions": { + "ar": "سانتا", + "bg": "Дядо Коледа", + "ca": "Pare Noél", + "cs": "Mikuláš", + "de": "Weihnachtsmann", + "eo": "Kristnaska viro", + "es": "Papá Noel", + "et": "Jõuluvana", + "fi": "Joulupukki", + "fr": "Père Noël", + "hr": "deda Mraz", + "hu": "Télapó", + "it": "Babbo Natale", + "ja": "サンタ", + "nb_NO": "Julenisse", + "nl": "Kerstman", + "pt_BR": "Papai-noel", + "ru": "Санта", + "si": null, + "sk": "Santa Claus", + "sr": "деда Мраз", + "sv": "Tomte", + "szl": null, + "tzm": null, + "uk": "Санта Клаус", + "zh_Hans": "圣诞老人" + } + }, + { + "number": 36, + "emoji": "👍", + "description": "Thumbs Up", + "unicode": "U+1F44D", + "translated_descriptions": { + "ar": "رَفعُ إِبهَام", + "bg": "Палец нагоре", + "ca": "Polzes amunt", + "cs": "Palec nahoru", + "de": "Daumen Hoch", + "eo": "Dikfingro supren", + "es": "Pulgar arriba", + "et": "Pöidlad püsti", + "fi": "Peukalo ylös", + "fr": "Pouce en l’air", + "hr": "palac gore", + "hu": "Hüvelykujj fel", + "it": "Pollice alzato", + "ja": "いいね", + "nb_NO": "Tommel Opp", + "nl": "Duim omhoog", + "pt_BR": "Joinha", + "ru": "Большой палец вверх", + "si": null, + "sk": "Palec nahor", + "sr": "палчић горе", + "sv": "Tummen upp", + "szl": null, + "tzm": null, + "uk": "Великий палець вгору", + "zh_Hans": "赞" + } + }, + { + "number": 37, + "emoji": "☂️", + "description": "Umbrella", + "unicode": "U+2602U+FE0F", + "translated_descriptions": { + "ar": "مِظَلَّة", + "bg": "Чадър", + "ca": "Paraigües", + "cs": "Deštník", + "de": "Regenschirm", + "eo": "Ombrelo", + "es": "Paraguas", + "et": "Vihmavari", + "fi": "Sateenvarjo", + "fr": "Parapluie", + "hr": "kišobran", + "hu": "Esernyő", + "it": "Ombrello", + "ja": "傘", + "nb_NO": "Paraply", + "nl": "Paraplu", + "pt_BR": "Guarda-chuva", + "ru": "Зонт", + "si": null, + "sk": "Dáždnik", + "sr": "кишобран", + "sv": "Paraply", + "szl": null, + "tzm": null, + "uk": "Парасолька", + "zh_Hans": "伞" + } + }, + { + "number": 38, + "emoji": "⌛", + "description": "Hourglass", + "unicode": "U+231B", + "translated_descriptions": { + "ar": "سَاعَةٌ رَملِيَّة", + "bg": "Пясъчен часовник", + "ca": "Rellotge de sorra", + "cs": "Přesýpací hodiny", + "de": "Sanduhr", + "eo": "Sablohorloĝo", + "es": "Reloj de arena", + "et": "Liivakell", + "fi": "Tiimalasi", + "fr": "Sablier", + "hr": "pješčani sat", + "hu": "Homokóra", + "it": "Clessidra", + "ja": "砂時計", + "nb_NO": "Timeglass", + "nl": "Zandloper", + "pt_BR": "Ampulheta", + "ru": "Песочные часы", + "si": null, + "sk": "Presýpacie hodiny", + "sr": "пешчаник", + "sv": "Timglas", + "szl": null, + "tzm": null, + "uk": "Пісковий годинник", + "zh_Hans": "沙漏" + } + }, + { + "number": 39, + "emoji": "⏰", + "description": "Clock", + "unicode": "U+23F0", + "translated_descriptions": { + "ar": "سَاعَة", + "bg": "Часовник", + "ca": "Rellotge", + "cs": "Hodiny", + "de": "Uhr", + "eo": "Horloĝo", + "es": "Reloj", + "et": "Kell", + "fi": "Pöytäkello", + "fr": "Réveil", + "hr": "sat", + "hu": "Óra", + "it": "Orologio", + "ja": "時計", + "nb_NO": "Klokke", + "nl": "Wekker", + "pt_BR": "Relógio", + "ru": "Часы", + "si": null, + "sk": "Budík", + "sr": "сат", + "sv": "Klocka", + "szl": null, + "tzm": null, + "uk": "Годинник", + "zh_Hans": "时钟" + } + }, + { + "number": 40, + "emoji": "🎁", + "description": "Gift", + "unicode": "U+1F381", + "translated_descriptions": { + "ar": "هَدِيَّة", + "bg": "Подарък", + "ca": "Regal", + "cs": "Dárek", + "de": "Geschenk", + "eo": "Donaco", + "es": "Regalo", + "et": "Kingitus", + "fi": "Lahja", + "fr": "Cadeau", + "hr": "poklon", + "hu": "Ajándék", + "it": "Regalo", + "ja": "ギフト", + "nb_NO": "Gave", + "nl": "Geschenk", + "pt_BR": "Presente", + "ru": "Подарок", + "si": null, + "sk": "Zabalený darček", + "sr": "поклон", + "sv": "Present", + "szl": null, + "tzm": null, + "uk": "Подарунок", + "zh_Hans": "礼物" + } + }, + { + "number": 41, + "emoji": "💡", + "description": "Light Bulb", + "unicode": "U+1F4A1", + "translated_descriptions": { + "ar": "مِصبَاح", + "bg": "Лампа", + "ca": "Bombeta", + "cs": "Žárovka", + "de": "Glühbirne", + "eo": "Lampo", + "es": "Bombilla", + "et": "Lambipirn", + "fi": "Hehkulamppu", + "fr": "Ampoule", + "hr": "žarulja", + "hu": "Égő", + "it": "Lampadina", + "ja": "電球", + "nb_NO": "Lyspære", + "nl": "Gloeilamp", + "pt_BR": "Lâmpada", + "ru": "Лампочка", + "si": null, + "sk": "Žiarovka", + "sr": "сијалица", + "sv": "Lampa", + "szl": null, + "tzm": null, + "uk": "Лампочка", + "zh_Hans": "灯泡" + } + }, + { + "number": 42, + "emoji": "📕", + "description": "Book", + "unicode": "U+1F4D5", + "translated_descriptions": { + "ar": "كِتَاب", + "bg": "Книга", + "ca": "Llibre", + "cs": "Kniha", + "de": "Buch", + "eo": "Libro", + "es": "Libro", + "et": "Raamat", + "fi": "Kirja", + "fr": "Livre", + "hr": "knjiga", + "hu": "Könyv", + "it": "Libro", + "ja": "本", + "nb_NO": "Bok", + "nl": "Boek", + "pt_BR": "Livro", + "ru": "Книга", + "si": null, + "sk": "Zatvorená kniha", + "sr": "књига", + "sv": "Bok", + "szl": null, + "tzm": "Adlis", + "uk": "Книга", + "zh_Hans": "书" + } + }, + { + "number": 43, + "emoji": "✏️", + "description": "Pencil", + "unicode": "U+270FU+FE0F", + "translated_descriptions": { + "ar": "قَلَمُ رَصاص", + "bg": "Молив", + "ca": "Llapis", + "cs": "Tužka", + "de": "Bleistift", + "eo": "Krajono", + "es": "Lápiz", + "et": "Pliiats", + "fi": "Lyijykynä", + "fr": "Crayon", + "hr": "olovka", + "hu": "Ceruza", + "it": "Matita", + "ja": "鉛筆", + "nb_NO": "Blyant", + "nl": "Potlood", + "pt_BR": "Lápis", + "ru": "Карандаш", + "si": null, + "sk": "Ceruzka", + "sr": "оловка", + "sv": "Penna", + "szl": null, + "tzm": null, + "uk": "Олівець", + "zh_Hans": "铅笔" + } + }, + { + "number": 44, + "emoji": "📎", + "description": "Paperclip", + "unicode": "U+1F4CE", + "translated_descriptions": { + "ar": "مِشبَكُ وَرَق", + "bg": "Кламер", + "ca": "Clip", + "cs": "Sponka", + "de": "Büroklammer", + "eo": "Paperkuntenilo", + "es": "Clip", + "et": "Kirjaklamber", + "fi": "Paperiliitin", + "fr": "Trombone", + "hr": "spajalica", + "hu": "Gémkapocs", + "it": "Graffetta", + "ja": "クリップ", + "nb_NO": "BInders", + "nl": "Papierklemmetje", + "pt_BR": "Clipe de papel", + "ru": "Скрепка", + "si": null, + "sk": "Sponka na papier", + "sr": "спајалица", + "sv": "Gem", + "szl": null, + "tzm": null, + "uk": "Спиначка", + "zh_Hans": "回形针" + } + }, + { + "number": 45, + "emoji": "✂️", + "description": "Scissors", + "unicode": "U+2702U+FE0F", + "translated_descriptions": { + "ar": "مِقَصّ", + "bg": "Ножици", + "ca": "Tisores", + "cs": "Nůžky", + "de": "Schere", + "eo": "Tondilo", + "es": "Tijeras", + "et": "Käärid", + "fi": "Sakset", + "fr": "Ciseaux", + "hr": "škare", + "hu": "Olló", + "it": "Forbici", + "ja": "はさみ", + "nb_NO": "Saks", + "nl": "Schaar", + "pt_BR": "Tesoura", + "ru": "Ножницы", + "si": null, + "sk": "Nožnice", + "sr": "маказе", + "sv": "Sax", + "szl": null, + "tzm": null, + "uk": "Ножиці", + "zh_Hans": "剪刀" + } + }, + { + "number": 46, + "emoji": "🔒", + "description": "Lock", + "unicode": "U+1F512", + "translated_descriptions": { + "ar": "قُفل", + "bg": "Катинар", + "ca": "Cadenat", + "cs": "Zámek", + "de": "Schloss", + "eo": "Seruro", + "es": "Candado", + "et": "Lukk", + "fi": "Lukko", + "fr": "Cadenas", + "hr": "zaključati", + "hu": "Lakat", + "it": "Lucchetto", + "ja": "錠前", + "nb_NO": "Lås", + "nl": "Slot", + "pt_BR": "Cadeado", + "ru": "Замок", + "si": null, + "sk": "Zatvorená zámka", + "sr": "катанац", + "sv": "Lås", + "szl": null, + "tzm": null, + "uk": "Замок", + "zh_Hans": "锁" + } + }, + { + "number": 47, + "emoji": "🔑", + "description": "Key", + "unicode": "U+1F511", + "translated_descriptions": { + "ar": "مِفتَاح", + "bg": "Ключ", + "ca": "Clau", + "cs": "Klíč", + "de": "Schlüssel", + "eo": "Ŝlosilo", + "es": "Llave", + "et": "Võti", + "fi": "Avain", + "fr": "Clé", + "hr": "ključ", + "hu": "Kulcs", + "it": "Chiave", + "ja": "鍵", + "nb_NO": "Nøkkel", + "nl": "Sleutel", + "pt_BR": "Chave", + "ru": "Ключ", + "si": null, + "sk": "Kľúč", + "sr": "кључ", + "sv": "Nyckel", + "szl": null, + "tzm": "Tasarut", + "uk": "Ключ", + "zh_Hans": "钥匙" + } + }, + { + "number": 48, + "emoji": "🔨", + "description": "Hammer", + "unicode": "U+1F528", + "translated_descriptions": { + "ar": "مِطرَقَة", + "bg": "Чук", + "ca": "Martell", + "cs": "Kladivo", + "de": "Hammer", + "eo": "Martelo", + "es": "Martillo", + "et": "Haamer", + "fi": "Vasara", + "fr": "Marteau", + "hr": "čekić", + "hu": "Kalapács", + "it": "Martello", + "ja": "金槌", + "nb_NO": "Hammer", + "nl": "Hamer", + "pt_BR": "Martelo", + "ru": "Молоток", + "si": null, + "sk": "Kladivo", + "sr": "чекић", + "sv": "Hammare", + "szl": null, + "tzm": null, + "uk": "Молоток", + "zh_Hans": "锤子" + } + }, + { + "number": 49, + "emoji": "☎️", + "description": "Telephone", + "unicode": "U+260EU+FE0F", + "translated_descriptions": { + "ar": "تِلِفُون", + "bg": "Телефон", + "ca": "Telèfon", + "cs": "Telefon", + "de": "Telefon", + "eo": "Telefono", + "es": "Telefono", + "et": "Telefon", + "fi": "Puhelin", + "fr": "Téléphone", + "hr": "telefon", + "hu": "Telefon", + "it": "Telefono", + "ja": "電話機", + "nb_NO": "Telefon", + "nl": "Telefoon", + "pt_BR": "Telefone", + "ru": "Телефон", + "si": null, + "sk": "Telefón", + "sr": "телефон", + "sv": "Telefon", + "szl": null, + "tzm": "Atilifun", + "uk": "Телефон", + "zh_Hans": "电话" + } + }, + { + "number": 50, + "emoji": "🏁", + "description": "Flag", + "unicode": "U+1F3C1", + "translated_descriptions": { + "ar": "عَلَم", + "bg": "Флаг", + "ca": "Bandera", + "cs": "Vlajka", + "de": "Flagge", + "eo": "Flago", + "es": "Bandera", + "et": "Lipp", + "fi": "Lippu", + "fr": "Drapeau", + "hr": "zastava", + "hu": "Zászló", + "it": "Bandiera", + "ja": "旗", + "nb_NO": "Flagg", + "nl": "Vlag", + "pt_BR": "Bandeira", + "ru": "Флаг", + "si": null, + "sk": "Kockovaná zástava", + "sr": "застава", + "sv": "Flagga", + "szl": null, + "tzm": "Acenyal", + "uk": "Прапор", + "zh_Hans": "旗帜" + } + }, + { + "number": 51, + "emoji": "🚂", + "description": "Train", + "unicode": "U+1F682", + "translated_descriptions": { + "ar": "قِطَار", + "bg": "Влак", + "ca": "Tren", + "cs": "Vlak", + "de": "Zug", + "eo": "Vagonaro", + "es": "Tren", + "et": "Rong", + "fi": "Juna", + "fr": "Train", + "hr": "vlak", + "hu": "Vonat", + "it": "Treno", + "ja": "電車", + "nb_NO": "Tog", + "nl": "Trein", + "pt_BR": "Trem", + "ru": "Поезд", + "si": null, + "sk": "Rušeň", + "sr": "воз", + "sv": "Tåg", + "szl": null, + "tzm": null, + "uk": "Потяг", + "zh_Hans": "火车" + } + }, + { + "number": 52, + "emoji": "🚲", + "description": "Bicycle", + "unicode": "U+1F6B2", + "translated_descriptions": { + "ar": "دَرّاجَة", + "bg": "Колело", + "ca": "Bicicleta", + "cs": "Kolo", + "de": "Fahrrad", + "eo": "Biciklo", + "es": "Bicicleta", + "et": "Jalgratas", + "fi": "Polkupyörä", + "fr": "Vélo", + "hr": "bicikl", + "hu": "Kerékpár", + "it": "Bicicletta", + "ja": "自転車", + "nb_NO": "Sykkel", + "nl": "Fiets", + "pt_BR": "Bicicleta", + "ru": "Велосипед", + "si": null, + "sk": "Bicykel", + "sr": "бицикл", + "sv": "Cykel", + "szl": null, + "tzm": null, + "uk": "Велосипед", + "zh_Hans": "自行车" + } + }, + { + "number": 53, + "emoji": "✈️", + "description": "Aeroplane", + "unicode": "U+2708U+FE0F", + "translated_descriptions": { + "ar": "طَائِرة", + "bg": "Самолет", + "ca": "Avió", + "cs": "Letadlo", + "de": "Flugzeug", + "eo": "Aviadilo", + "es": "Avión", + "et": "Lennuk", + "fi": "Lentokone", + "fr": "Avion", + "hr": "avion", + "hu": "Repülő", + "it": "Aeroplano", + "ja": "飛行機", + "nb_NO": "Fly", + "nl": "Vliegtuig", + "pt_BR": "Avião", + "ru": "Самолет", + "si": null, + "sk": "Lietadlo", + "sr": "авион", + "sv": "Flygplan", + "szl": null, + "tzm": null, + "uk": "Літак", + "zh_Hans": "飞机" + } + }, + { + "number": 54, + "emoji": "🚀", + "description": "Rocket", + "unicode": "U+1F680", + "translated_descriptions": { + "ar": "صَارُوخ", + "bg": "Ракета", + "ca": "Coet", + "cs": "Raketa", + "de": "Rakete", + "eo": "Raketo", + "es": "Cohete", + "et": "Rakett", + "fi": "Raketti", + "fr": "Fusée", + "hr": "raketa", + "hu": "Rakáta", + "it": "Razzo", + "ja": "ロケット", + "nb_NO": "Rakett", + "nl": "Raket", + "pt_BR": "Foguete", + "ru": "Ракета", + "si": null, + "sk": "Raketa", + "sr": "ракета", + "sv": "Raket", + "szl": null, + "tzm": null, + "uk": "Ракета", + "zh_Hans": "火箭" + } + }, + { + "number": 55, + "emoji": "🏆", + "description": "Trophy", + "unicode": "U+1F3C6", + "translated_descriptions": { + "ar": "كَأسُ النَّصر", + "bg": "Трофей", + "ca": "Trofeu", + "cs": "Pohár", + "de": "Pokal", + "eo": "Trofeo", + "es": "Trofeo", + "et": "Auhind", + "fi": "Palkinto", + "fr": "Trophée", + "hr": "trofej", + "hu": "Trófea", + "it": "Trofeo", + "ja": "トロフィー", + "nb_NO": "Pokal", + "nl": "Trofee", + "pt_BR": "Troféu", + "ru": "Кубок", + "si": null, + "sk": "Trofej", + "sr": "пехар", + "sv": "Trofé", + "szl": null, + "tzm": null, + "uk": "Приз", + "zh_Hans": "奖杯" + } + }, + { + "number": 56, + "emoji": "⚽", + "description": "Ball", + "unicode": "U+26BD", + "translated_descriptions": { + "ar": "كُرَة", + "bg": "Топка", + "ca": "Pilota", + "cs": "Míč", + "de": "Ball", + "eo": "Pilko", + "es": "Bola", + "et": "Pall", + "fi": "Pallo", + "fr": "Ballon", + "hr": "lopta", + "hu": "Labda", + "it": "Palla", + "ja": "ボール", + "nb_NO": "Ball", + "nl": "Bal", + "pt_BR": "Bola", + "ru": "Мяч", + "si": null, + "sk": "Futbal", + "sr": "лопта", + "sv": "Boll", + "szl": null, + "tzm": "Tcama", + "uk": "М'яч", + "zh_Hans": "球" + } + }, + { + "number": 57, + "emoji": "🎸", + "description": "Guitar", + "unicode": "U+1F3B8", + "translated_descriptions": { + "ar": "غيتار", + "bg": "Китара", + "ca": "Guitarra", + "cs": "Kytara", + "de": "Gitarre", + "eo": "Gitaro", + "es": "Guitarra", + "et": "Kitarr", + "fi": "Kitara", + "fr": "Guitare", + "hr": "gitara", + "hu": "Gitár", + "it": "Chitarra", + "ja": "ギター", + "nb_NO": "Gitar", + "nl": "Gitaar", + "pt_BR": "Guitarra", + "ru": "Гитара", + "si": null, + "sk": "Gitara", + "sr": "гитара", + "sv": "Gitarr", + "szl": null, + "tzm": "Agiṭaṛ", + "uk": "Гітара", + "zh_Hans": "吉他" + } + }, + { + "number": 58, + "emoji": "🎺", + "description": "Trumpet", + "unicode": "U+1F3BA", + "translated_descriptions": { + "ar": "بُوق", + "bg": "Тромпет", + "ca": "Trompeta", + "cs": "Trumpeta", + "de": "Trompete", + "eo": "Trumpeto", + "es": "Trompeta", + "et": "Trompet", + "fi": "Trumpetti", + "fr": "Trompette", + "hr": "truba", + "hu": "Trombita", + "it": "Trombetta", + "ja": "トランペット", + "nb_NO": "Trompet", + "nl": "Trompet", + "pt_BR": "Trombeta", + "ru": "Труба", + "si": null, + "sk": "Trúbka", + "sr": "труба", + "sv": "Trumpet", + "szl": null, + "tzm": null, + "uk": "Труба", + "zh_Hans": "喇叭" + } + }, + { + "number": 59, + "emoji": "🔔", + "description": "Bell", + "unicode": "U+1F514", + "translated_descriptions": { + "ar": "جَرَس", + "bg": "Звънец", + "ca": "Campana", + "cs": "Zvonek", + "de": "Glocke", + "eo": "Sonorilo", + "es": "Campana", + "et": "Kelluke", + "fi": "Soittokello", + "fr": "Cloche", + "hr": "zvono", + "hu": "Harang", + "it": "Campana", + "ja": "ベル", + "nb_NO": "Bjelle", + "nl": "Bel", + "pt_BR": "Sino", + "ru": "Колокол", + "si": null, + "sk": "Zvon", + "sr": "звоно", + "sv": "Bjällra", + "szl": null, + "tzm": null, + "uk": "Дзвін", + "zh_Hans": "铃铛" + } + }, + { + "number": 60, + "emoji": "⚓", + "description": "Anchor", + "unicode": "U+2693", + "translated_descriptions": { + "ar": "مِرسَاة", + "bg": "Котва", + "ca": "Àncora", + "cs": "Kotva", + "de": "Anker", + "eo": "Ankro", + "es": "Ancla", + "et": "Ankur", + "fi": "Ankkuri", + "fr": "Ancre", + "hr": "sidro", + "hu": "Horgony", + "it": "Ancora", + "ja": "いかり", + "nb_NO": "Anker", + "nl": "Anker", + "pt_BR": "Âncora", + "ru": "Якорь", + "si": null, + "sk": "Kotva", + "sr": "сидро", + "sv": "Ankare", + "szl": null, + "tzm": null, + "uk": "Якір", + "zh_Hans": "锚" + } + }, + { + "number": 61, + "emoji": "🎧", + "description": "Headphones", + "unicode": "U+1F3A7", + "translated_descriptions": { + "ar": "سَمّاعَة رَأس", + "bg": "Слушалки", + "ca": "Auriculars", + "cs": "Sluchátka", + "de": "Kopfhörer", + "eo": "Kapaŭdilo", + "es": "Cascos", + "et": "Kõrvaklapid", + "fi": "Kuulokkeet", + "fr": "Casque audio", + "hr": "slušalice", + "hu": "Fejhallgató", + "it": "Cuffie", + "ja": "ヘッドホン", + "nb_NO": "Hodetelefoner", + "nl": "Koptelefoon", + "pt_BR": "Fones de ouvido", + "ru": "Наушники", + "si": null, + "sk": "Slúchadlá", + "sr": "слушалице", + "sv": "Hörlurar", + "szl": null, + "tzm": null, + "uk": "Навушники", + "zh_Hans": "耳机" + } + }, + { + "number": 62, + "emoji": "📁", + "description": "Folder", + "unicode": "U+1F4C1", + "translated_descriptions": { + "ar": "مُجَلَّد", + "bg": "Папка", + "ca": "Carpeta", + "cs": "Složka", + "de": "Ordner", + "eo": "Dosierujo", + "es": "Carpeta", + "et": "Kaust", + "fi": "Kansio", + "fr": "Dossier", + "hr": "mapu", + "hu": "Mappa", + "it": "Cartella", + "ja": "フォルダ", + "nb_NO": "Mappe", + "nl": "Map", + "pt_BR": "Pasta", + "ru": "Папка", + "si": null, + "sk": "Fascikel", + "sr": "фасцикла", + "sv": "Mapp", + "szl": null, + "tzm": "Asdaw", + "uk": "Тека", + "zh_Hans": "文件夹" + } + }, + { + "number": 63, + "emoji": "📌", + "description": "Pin", + "unicode": "U+1F4CC", + "translated_descriptions": { + "ar": "دَبُّوس", + "bg": "Кабърче", + "ca": "Xinxeta", + "cs": "Špendlík", + "de": "Stecknadel", + "eo": "Pinglo", + "es": "Alfiler", + "et": "Nööpnõel", + "fi": "Nuppineula", + "fr": "Punaise", + "hr": "pribadača", + "hu": "Rajszeg", + "it": "Puntina", + "ja": "ピン", + "nb_NO": "Tegnestift", + "nl": "Duimspijker", + "pt_BR": "Alfinete", + "ru": "Булавка", + "si": null, + "sk": "Špendlík", + "sr": "чиода", + "sv": "Häftstift", + "szl": null, + "tzm": null, + "uk": "Кнопка", + "zh_Hans": "图钉" + } + } +] \ No newline at end of file diff --git a/assets/sounds/call.ogg b/assets/sounds/call.ogg new file mode 100644 index 0000000..63b5d4d Binary files /dev/null and b/assets/sounds/call.ogg differ diff --git a/assets/sounds/notification.ogg b/assets/sounds/notification.ogg new file mode 100644 index 0000000..390f2bf Binary files /dev/null and b/assets/sounds/notification.ogg differ diff --git a/assets/sounds/phone.ogg b/assets/sounds/phone.ogg new file mode 100644 index 0000000..7cd2864 Binary files /dev/null and b/assets/sounds/phone.ogg differ diff --git a/config.json b/config.json new file mode 100644 index 0000000..40ccb95 --- /dev/null +++ b/config.json @@ -0,0 +1,10 @@ +{ + "application_name": "Extera", + "application_welcome_message": null, + "default_homeserver": "extera.xyz", + "web_base_url": "https://fluffychat.im/web", + "privacy_url": "https://fluffychat.im/en/privacy.html", + "render_html": true, + "hide_redacted_events": false, + "hide_unknown_events": false + } \ No newline at end of file diff --git a/config.sample.json b/config.sample.json new file mode 100644 index 0000000..ff37ec2 --- /dev/null +++ b/config.sample.json @@ -0,0 +1,10 @@ +{ + "application_name": "FluffyChat", + "application_welcome_message": null, + "default_homeserver": "matrix.org", + "web_base_url": "https://fluffychat.im/web", + "privacy_url": "https://fluffychat.im/en/privacy.html", + "render_html": false, + "hide_redacted_events": false, + "hide_unknown_events": false +} \ No newline at end of file diff --git a/devtools_options.yaml b/devtools_options.yaml new file mode 100644 index 0000000..fa0b357 --- /dev/null +++ b/devtools_options.yaml @@ -0,0 +1,3 @@ +description: This file stores settings for Dart & Flutter DevTools. +documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states +extensions: diff --git a/docs/.well-known/org.flathub.VerifiedApps.txt b/docs/.well-known/org.flathub.VerifiedApps.txt new file mode 100644 index 0000000..a9a5eb4 --- /dev/null +++ b/docs/.well-known/org.flathub.VerifiedApps.txt @@ -0,0 +1,2 @@ +# im.fluffychat.Fluffychat +8b25b37b-f160-4350-b4f6-9a04554e8f9e \ No newline at end of file diff --git a/docs/LICENSE b/docs/LICENSE new file mode 100644 index 0000000..2e59d72 --- /dev/null +++ b/docs/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Tailwind Toolbox + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/docs/OFL.txt b/docs/OFL.txt new file mode 100644 index 0000000..075d1ae --- /dev/null +++ b/docs/OFL.txt @@ -0,0 +1,91 @@ +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/docs/appstore-badge.png b/docs/appstore-badge.png new file mode 100644 index 0000000..e96d5c0 Binary files /dev/null and b/docs/appstore-badge.png differ diff --git a/docs/browser-badge.png b/docs/browser-badge.png new file mode 100644 index 0000000..fa6f278 Binary files /dev/null and b/docs/browser-badge.png differ diff --git a/docs/favicon.png b/docs/favicon.png new file mode 100644 index 0000000..d55415b Binary files /dev/null and b/docs/favicon.png differ diff --git a/docs/fdroid_button.png b/docs/fdroid_button.png new file mode 100644 index 0000000..31e43f2 Binary files /dev/null and b/docs/fdroid_button.png differ diff --git a/docs/feature1.gif b/docs/feature1.gif new file mode 100644 index 0000000..db6c8be Binary files /dev/null and b/docs/feature1.gif differ diff --git a/docs/feature2.gif b/docs/feature2.gif new file mode 100644 index 0000000..d6cf974 Binary files /dev/null and b/docs/feature2.gif differ diff --git a/docs/feature3.gif b/docs/feature3.gif new file mode 100644 index 0000000..cd56dc5 Binary files /dev/null and b/docs/feature3.gif differ diff --git a/docs/feature4.gif b/docs/feature4.gif new file mode 100644 index 0000000..4f1c35d Binary files /dev/null and b/docs/feature4.gif differ diff --git a/docs/feature5.gif b/docs/feature5.gif new file mode 100644 index 0000000..b301d8f Binary files /dev/null and b/docs/feature5.gif differ diff --git a/docs/feature6.gif b/docs/feature6.gif new file mode 100644 index 0000000..d9fdba8 Binary files /dev/null and b/docs/feature6.gif differ diff --git a/docs/feature7.gif b/docs/feature7.gif new file mode 100644 index 0000000..ced2184 Binary files /dev/null and b/docs/feature7.gif differ diff --git a/docs/feature8.gif b/docs/feature8.gif new file mode 100644 index 0000000..95bf4e8 Binary files /dev/null and b/docs/feature8.gif differ diff --git a/docs/feature9.gif b/docs/feature9.gif new file mode 100644 index 0000000..a05001d Binary files /dev/null and b/docs/feature9.gif differ diff --git a/docs/firefox_icon.png b/docs/firefox_icon.png new file mode 100644 index 0000000..6accca9 Binary files /dev/null and b/docs/firefox_icon.png differ diff --git a/docs/flathub-badge-en.png b/docs/flathub-badge-en.png new file mode 100644 index 0000000..facf256 Binary files /dev/null and b/docs/flathub-badge-en.png differ diff --git a/docs/google-play-badge.png b/docs/google-play-badge.png new file mode 100644 index 0000000..6a93e18 Binary files /dev/null and b/docs/google-play-badge.png differ diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 0000000..22cf4a3 --- /dev/null +++ b/docs/index.html @@ -0,0 +1,179 @@ + + + + + + + FluffyChat Official Website + + + + + + + + + + + + + + + +
+ +
+ FluffyChat Logo +

The cutest messenger in [matrix] +

+ + Mobile and desktop screenshots + +
+ + + + + + + + +
+ +
+
+ Animated dancing woman +

Easy to use

+

FluffyChat is designed to be as easy to use as possible. No one + should be left behind.

+
+
+ Animated pencil +

Material You

+

The well polished design is based on Material You and works great on + all platforms.

+
+
+ Animated mechanical arm +

Secure

+

With end-to-end encryption, cross-signing and encrypted backups, + FluffyChat is one of the most secure messenger out there.

+
+ + +
+ Animated planet earth +

Decentral

+

You can choose the server you want to use or + even self-host your own!

+
+
+ Animated bell +

Push Notifications

+

You can choose between Firebase Cloud Messaging or the more privacy + focused Unified Push.

+
+
+ Animated rocket +

Spaces

+

With spaces you can join or create a community which organizes chats + and users. Using sub-spaces you can even nest your communities.

+
+ + +
+ Animated glass sphere +

Video calls

+

Still an experimental feature but you can already try out video and + audio calls, compatible with other [matrix] clients.

+
+
+ Animated chick +

Stickers

+

Create your own sticker sets and share them with your friends. You + can even use them as inline emojis.

+
+
+ Animated whoa emoji +

Compatible

+

FluffyChat is compatible with any other [matrix] client like Element, + Nheko, Cinny + or NeoChat. +

+
+
+ + +
+ +
+ + + + \ No newline at end of file diff --git a/docs/info-logo.png b/docs/info-logo.png new file mode 100644 index 0000000..ceb42f0 Binary files /dev/null and b/docs/info-logo.png differ diff --git a/docs/kofi_button_dark.png b/docs/kofi_button_dark.png new file mode 100644 index 0000000..b005e7a Binary files /dev/null and b/docs/kofi_button_dark.png differ diff --git a/docs/mastodon.svg b/docs/mastodon.svg new file mode 100644 index 0000000..0f8baeb --- /dev/null +++ b/docs/mastodon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/docs/screenshots/desktop.png b/docs/screenshots/desktop.png new file mode 100644 index 0000000..3199258 Binary files /dev/null and b/docs/screenshots/desktop.png differ diff --git a/docs/screenshots/mobile.png b/docs/screenshots/mobile.png new file mode 100644 index 0000000..3e8a352 Binary files /dev/null and b/docs/screenshots/mobile.png differ diff --git a/docs/screenshots/product.jpeg b/docs/screenshots/product.jpeg new file mode 100644 index 0000000..32bf258 Binary files /dev/null and b/docs/screenshots/product.jpeg differ diff --git a/docs/screenshots/screenshots.png b/docs/screenshots/screenshots.png new file mode 100644 index 0000000..b974493 Binary files /dev/null and b/docs/screenshots/screenshots.png differ diff --git a/docs/screenshots/showcase1.jpeg b/docs/screenshots/showcase1.jpeg new file mode 100644 index 0000000..94875ee Binary files /dev/null and b/docs/screenshots/showcase1.jpeg differ diff --git a/docs/screenshots/showcase2.jpeg b/docs/screenshots/showcase2.jpeg new file mode 100644 index 0000000..4b78b88 Binary files /dev/null and b/docs/screenshots/showcase2.jpeg differ diff --git a/docs/screenshots/showcase3.jpeg b/docs/screenshots/showcase3.jpeg new file mode 100644 index 0000000..44c2ef4 Binary files /dev/null and b/docs/screenshots/showcase3.jpeg differ diff --git a/docs/screenshots/showcase4.jpeg b/docs/screenshots/showcase4.jpeg new file mode 100644 index 0000000..75978f0 Binary files /dev/null and b/docs/screenshots/showcase4.jpeg differ diff --git a/docs/screenshots/showcase5.jpeg b/docs/screenshots/showcase5.jpeg new file mode 100644 index 0000000..ca25818 Binary files /dev/null and b/docs/screenshots/showcase5.jpeg differ diff --git a/docs/snap-store-badge.svg b/docs/snap-store-badge.svg new file mode 100644 index 0000000..294d873 --- /dev/null +++ b/docs/snap-store-badge.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/tailwind.config.js b/docs/tailwind.config.js new file mode 100644 index 0000000..2991816 --- /dev/null +++ b/docs/tailwind.config.js @@ -0,0 +1,14 @@ +module.exports = { + purge: [ + './index.html' + ], + darkMode: false, + theme: { + extend: {}, + }, + variants: { + extend: {}, + }, + plugins: [], + } + \ No newline at end of file diff --git a/err.txt b/err.txt new file mode 100644 index 0000000..8a35812 --- /dev/null +++ b/err.txt @@ -0,0 +1,5071 @@ +Resolving dependencies... +Downloading packages... + _fe_analyzer_shared 67.0.0 (82.0.0 available) + analyzer 6.4.1 (7.4.5 available) + app_links 6.3.3 (6.4.0 available) + archive 3.6.1 (4.0.7 available) + args 2.5.0 (2.7.0 available) + audio_session 0.1.21 (0.2.2 available) + barbecue 0.4.0 (0.5.0 available) + charcode 1.3.1 (1.4.0 available) + checked_yaml 2.0.3 (2.0.4 available) + chewie 1.11.0 (1.11.3 available) + cli_util 0.4.1 (0.4.2 available) + convert 3.1.1 (3.1.2 available) + coverage 1.13.1 (1.14.1 available) + crypto 3.0.5 (3.0.6 available) + csslib 0.17.3 (1.0.2 available) + dart_style 2.3.6 (3.1.0 available) + dart_webrtc 1.4.10 (1.5.3+hotfix.2 available) + dbus 0.7.10 (0.7.11 available) + desktop_drop 0.4.4 (0.6.0 available) + device_info_plus 10.1.2 (11.4.0 available) + device_info_plus_platform_interface 7.0.1 (7.0.2 available) + emoji_picker_flutter 3.1.0 (4.3.0 available) + ffi 2.1.3 (2.1.4 available) + file_picker 8.1.2 (10.1.9 available) + file_selector_android 0.5.1+9 (0.5.1+14 available) + file_selector_linux 0.9.3 (0.9.3+2 available) + file_selector_macos 0.9.4+2 (0.9.4+3 available) + file_selector_windows 0.9.3+3 (0.9.3+4 available) + fixnum 1.1.0 (1.1.1 available) + flutter_foreground_task 6.5.0 (9.1.0 available) + flutter_gen 5.9.0 (5.10.0 available) + flutter_gen_core 5.9.0 (5.10.0 available) + flutter_lints 3.0.2 (6.0.0 available) + flutter_local_notifications 17.2.4 (19.2.1 available) + flutter_local_notifications_linux 4.0.1 (6.0.0 available) + flutter_local_notifications_platform_interface 7.2.0 (9.0.0 available) + flutter_map 6.2.1 (8.1.1 available) + flutter_native_splash 2.4.1 (2.4.6 available) + flutter_plugin_android_lifecycle 2.0.23 (2.0.28 available) + flutter_secure_storage 9.2.2 (9.2.4 available) + flutter_secure_storage_linux 1.2.1 (2.0.1 available) + flutter_secure_storage_macos 3.1.2 (4.0.0 available) + flutter_secure_storage_platform_interface 1.1.2 (2.0.1 available) + flutter_secure_storage_web 1.2.1 (2.0.0 available) + flutter_secure_storage_windows 3.1.2 (4.0.0 available) +! flutter_web_auth_2 3.1.2-without-v1 from git https://github.com/ThexXTURBOXx/flutter_web_auth_2.git at 48682f in flutter_web_auth_2 (overridden) + flutter_web_auth_2_platform_interface 3.1.0 (4.1.0 available) + flutter_webrtc 0.12.9 (0.14.1 available) + geolocator 13.0.1 (14.0.1 available) + geolocator_android 4.6.1 (5.0.1+1 available) + geolocator_apple 2.3.7 (2.3.13 available) + geolocator_platform_interface 4.2.4 (4.2.6 available) + geolocator_web 4.1.1 (4.1.3 available) + geolocator_windows 0.2.3 (0.2.5 available) + get_it 7.7.0 (8.0.3 available) + glob 2.1.2 (2.1.3 available) + go_router 14.8.1 (15.1.2 available) + html 0.15.4 (0.15.6 available) + http 1.2.2 (1.4.0 available) + http_multi_server 3.2.1 (3.2.2 available) + http_parser 4.0.2 (4.1.2 available) + image 4.2.0 (4.5.4 available) + image_picker_android 0.8.12+15 (0.8.12+23 available) + image_picker_for_web 3.0.5 (3.0.6 available) + image_picker_ios 0.8.12 (0.8.12+2 available) + image_picker_linux 0.2.1+1 (0.2.1+2 available) + image_picker_macos 0.2.1+1 (0.2.1+2 available) + image_picker_platform_interface 2.10.0 (2.10.1 available) + io 1.0.4 (1.0.5 available) + js 0.6.7 (0.7.2 available) + just_audio 0.9.41 (0.10.3 available) + just_audio_platform_interface 4.3.0 (4.5.0 available) + just_audio_web 0.4.13 (0.4.16 available) + lints 3.0.0 (6.0.0 available) + logger 2.4.0 (2.5.0 available) + logging 1.2.0 (1.3.0 available) + markdown 7.2.2 (7.3.0 available) + material_color_utilities 0.11.1 (0.13.0 available) + matrix 0.40.0 (0.40.2 available) + meta 1.16.0 (1.17.0 available) + mime 1.0.6 (2.0.0 available) + msix 3.16.8 (3.16.9 available) + package_config 2.1.0 (2.2.0 available) + package_info_plus 8.0.2 (8.3.0 available) + package_info_plus_platform_interface 3.0.1 (3.2.0 available) + pana 0.21.45 (0.22.21 available) + pasteboard 0.2.0 (0.4.0 available) + path_provider 2.1.4 (2.1.5 available) + path_provider_android 2.2.11 (2.2.17 available) + path_provider_foundation 2.4.0 (2.4.1 available) + permission_handler 11.3.1 (12.0.0+1 available) + permission_handler_android 12.0.12 (13.0.1 available) + permission_handler_apple 9.4.5 (9.4.7 available) + permission_handler_html 0.1.3+2 (0.1.3+5 available) + permission_handler_platform_interface 4.2.3 (4.3.0 available) + petitparser 6.0.2 (6.1.0 available) + platform_detect 2.1.0 (2.1.5 available) + pointer_interceptor_web 0.10.2+1 (0.10.3 available) + pretty_qr_code 3.3.0 (3.4.0 available) + process 5.0.3 (5.0.4 available) + provider 6.1.2 (6.1.5 available) + pub_semver 2.1.4 (2.2.0 available) + pubspec_parse 1.3.0 (1.5.0 available) + record 5.1.2 (6.0.0 available) + record_android 1.2.6 (1.3.3 available) + record_darwin 1.1.2 (1.2.2 available) + record_linux 0.7.2 (1.1.0 available) + record_platform_interface 1.1.0 (1.2.0 available) + record_web 1.1.3 (1.1.8 available) + record_windows 1.0.3 (1.0.6 available) + share_plus 10.0.2 (11.0.0 available) + share_plus_platform_interface 5.0.0 (6.0.0 available) + shared_preferences 2.3.2 (2.5.3 available) + shared_preferences_android 2.3.3 (affected by advisory: [^0], 2.4.10 available) + shared_preferences_foundation 2.5.3 (2.5.4 available) + shared_preferences_web 2.4.2 (2.4.3 available) + shelf 1.4.1 (1.4.2 available) + shelf_web_socket 2.0.0 (3.0.0 available) + source_maps 0.10.12 (0.10.13 available) + sqflite 2.3.3+2 (2.4.2 available) + sqflite_common 2.5.4+4 (2.5.5 available) + sqflite_common_ffi 2.3.3+1 (2.3.5 available) + sqlcipher_flutter_libs 0.6.4 (0.6.6 available) + sqlite3 2.4.6 (2.7.6 available) + string_validator 0.3.0 (1.1.0 available) + synchronized 3.3.0+3 (3.3.1 available) + tar 1.0.5 (2.0.0 available) + timezone 0.9.4 (0.10.1 available) + typed_data 1.3.2 (1.4.0 available) + unicode 0.3.1 (1.1.8 available) + unifiedpush 5.0.2 (6.0.2 available) + unifiedpush_android 2.3.0 (3.1.0 available) + unifiedpush_platform_interface 2.0.2 (3.0.1 available) + unorm_dart 0.2.0 (0.3.0 available) + url_launcher 6.3.0 (6.3.1 available) + url_launcher_android 6.3.12 (6.3.16 available) + url_launcher_ios 6.3.1 (6.3.3 available) + url_launcher_linux 3.2.0 (3.2.1 available) + url_launcher_macos 3.2.1 (3.2.2 available) + url_launcher_web 2.3.3 (2.4.1 available) + url_launcher_windows 3.1.2 (3.1.4 available) + video_player 2.9.5 (2.10.0 available) + video_player_android 2.8.2 (2.8.7 available) + video_player_avfoundation 2.7.0 (2.7.1 available) + video_player_web 2.3.4 (2.3.5 available) + vm_service 15.0.0 (15.0.1 available) + wakelock_plus 1.2.11 (1.3.2 available) + wakelock_plus_platform_interface 1.2.2 (1.2.3 available) + watcher 1.1.0 (1.1.1 available) + web 1.1.0 (1.1.1 available) + web_socket 0.1.6 (1.0.1 available) + web_socket_channel 3.0.1 (3.0.3 available) + webrtc_interface 1.2.2+hotfix.1 (1.2.2+hotfix.2 available) +! win32 5.5.3 (overridden) (5.13.0 available) + win32_registry 1.1.5 (2.1.0 available) + yaml 3.1.2 (3.1.3 available) +Got dependencies! +Dependencies are affected by security advisories: + [^0]: https://github.com/advisories/GHSA-3hpf-ff72-j67p +155 packages have newer versions incompatible with dependency constraints. +Try `flutter pub outdated` for more information. +"ar": 86 untranslated message(s). +"be": 784 untranslated message(s). +"bn": 780 untranslated message(s). +"bo": 784 untranslated message(s). +"ca": 25 untranslated message(s). +"cs": 242 untranslated message(s). +"de": 46 untranslated message(s). +"el": 734 untranslated message(s). +"eo": 435 untranslated message(s). +"es": 20 untranslated message(s). +"et": 19 untranslated message(s). +"eu": 22 untranslated message(s). +"fa": 292 untranslated message(s). +"fi": 251 untranslated message(s). +"fil": 587 untranslated message(s). +"fr": 124 untranslated message(s). +"ga": 19 untranslated message(s). +"gl": 19 untranslated message(s). +"he": 539 untranslated message(s). +"hi": 777 untranslated message(s). +"hr": 147 untranslated message(s). +"hu": 121 untranslated message(s). +"ia": 770 untranslated message(s). +"id": 19 untranslated message(s). +"ie": 543 untranslated message(s). +"it": 25 untranslated message(s). +"ja": 321 untranslated message(s). +"ka": 637 untranslated message(s). +"ko": 48 untranslated message(s). +"lt": 321 untranslated message(s). +"lv": 19 untranslated message(s). +"nb": 485 untranslated message(s). +"nl": 19 untranslated message(s). +"pl": 21 untranslated message(s). +"pt": 762 untranslated message(s). +"pt_BR": 152 untranslated message(s). +"pt_PT": 486 untranslated message(s). +"ro": 293 untranslated message(s). +"sk": 552 untranslated message(s). +"sl": 680 untranslated message(s). +"sr": 456 untranslated message(s). +"sv": 189 untranslated message(s). +"ta": 88 untranslated message(s). +"te": 780 untranslated message(s). +"th": 734 untranslated message(s). +"tr": 88 untranslated message(s). +"uk": 50 untranslated message(s). +"vi": 631 untranslated message(s). +"zh": 19 untranslated message(s). +"zh_Hant": 61 untranslated message(s). +To see a detailed report, use the untranslated-messages-file +option in the l10n.yaml file: +untranslated-messages-file: desiredFileName.txt +: + + +This will generate a JSON format file containing all messages that +need to be translated. +Launching lib/main.dart on Linux in debug mode... +Building Linux application... +ERROR: lib/utils/client_manager.dart:7:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/utils/platform_infos.dart:6:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/utils/background_push.dart:27:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/widgets/fluffy_chat_app.dart:3:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/utils/init_with_restore.dart:4:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/builder.dart:5:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/utils/error_reporter.dart:4:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/utils/push_helper.dart:7:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/widgets/matrix.dart:9:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/cipher.dart:7:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/utils/matrix_sdk_extensions/matrix_locals.dart:1:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/utils/matrix_sdk_extensions/matrix_file_extension.dart:7:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/utils/uia_request_manager.dart:3:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart:3:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/widgets/future_loading_dialog.dart:6:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/key_verification/key_verification_dialog.dart:7:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/widgets/local_notifications_extension.dart:7:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/archive/archive.dart:3:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/chat/chat.dart:17:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/chat_access_settings/chat_access_settings_controller.dart:3:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/chat_details/chat_details.dart:4:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/chat_encryption_settings/chat_encryption_settings.dart:3:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/chat_list/chat_list.dart:9:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/chat_permissions_settings/chat_permissions_settings.dart:5:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/device_settings/device_settings.dart:4:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/homeserver_picker/homeserver_picker.dart:7:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/invitation_selection/invitation_selection.dart:5:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/login/login.dart:5:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/new_group/new_group.dart:5:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/new_private_chat/new_private_chat.dart:7:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/settings/settings.dart:6:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/settings_3pid/settings_3pid.dart:3:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/settings_emotes/settings_emotes.dart:7:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/settings_ignore_list/settings_ignore_list.dart:3:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/settings_notifications/settings_notifications.dart:5:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/settings_password/settings_password.dart:3:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/settings_security/settings_security.dart:3:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/widgets/share_scaffold_dialog.dart:4:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/widgets/lock_screen.dart:6:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/widgets/adaptive_dialogs/show_text_input_dialog.dart:3:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/dialer/dialer.dart:27:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/utils/url_launcher.dart:4:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/utils/localized_exception_extension.dart:6:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/archive/archive_view.dart:3:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/chat/recovered_event_dialog.dart:7:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/chat/translated_event_dialog.dart:7:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/chat/chat_view.dart:7:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/chat/event_info_dialog.dart:5:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/chat/recording_dialog.dart:7:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/chat/send_file_dialog.dart:6:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/chat/send_location_dialog.dart:6:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/chat_access_settings/chat_access_settings_page.dart:3:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/chat_details/chat_details_view.dart:3:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/chat_encryption_settings/chat_encryption_settings_view.dart:4:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/chat_list/chat_list_view.dart:3:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/utils/show_update_snackbar.dart:3:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/bootstrap/bootstrap_dialog.dart:3:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/chat_members/chat_members_view.dart:3:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/chat_permissions_settings/chat_permissions_settings_view.dart:3:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/widgets/permission_slider_dialog.dart:3:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/chat_search/chat_search_view.dart:3:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/device_settings/device_settings_view.dart:3:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/homeserver_picker/homeserver_picker_view.dart:3:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/invitation_selection/invitation_selection_view.dart:3:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/login/login_view.dart:3:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/new_group/new_group_view.dart:3:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/new_private_chat/new_private_chat_view.dart:3:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/new_private_chat/qr_scanner_modal.dart:6:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/utils/fluffy_share.dart:4:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/widgets/adaptive_dialogs/user_dialog.dart:4:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/settings/settings_view.dart:3:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/settings_3pid/settings_3pid_view.dart:3:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/settings_chat/settings_chat_view.dart:3:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/settings_emotes/import_archive_dialog.dart:8:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/settings_emotes/settings_emotes_view.dart:4:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/settings_homeserver/settings_homeserver_view.dart:5:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/settings_ignore_list/settings_ignore_list_view.dart:3:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/settings_multiple_emotes/settings_multiple_emotes_view.dart:3:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/settings_notifications/push_rule_extensions.dart:1:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/settings_notifications/settings_notifications_view.dart:3:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/settings_password/settings_password_view.dart:3:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/settings_security/settings_security_view.dart:3:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/settings_style/settings_style_view.dart:7:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/widgets/adaptive_dialogs/public_room_dialog.dart:4:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/chat_list/chat_list_item.dart:3:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/chat/events/message.dart:6:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/chat/chat_app_bar_title.dart:3:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/chat/encryption_button.dart:3:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/chat/pinned_events.dart:5:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/chat/reply_display.dart:3:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/widgets/chat_settings_popup_menu.dart:5:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/chat/chat_emoji_picker.dart:4:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/chat/chat_input_row.dart:4:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/utils/date_time_extension.dart:3:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/chat_details/participant_list_item.dart:3:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/widgets/mxc_image_viewer.dart:3:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/widgets/qr_code_viewer.dart:4:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/widgets/navigation_rail.dart:3:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/chat_list/chat_list_body.dart:4:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/chat_permissions_settings/permission_list_tile.dart:3:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/chat_search/chat_search_files_tab.dart:3:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/chat_search/chat_search_images_tab.dart:3:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/chat_search/chat_search_message_tab.dart:3:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/device_settings/user_device_list_item.dart:3:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/widgets/layouts/login_scaffold.dart:3:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/chat/events/state_message.dart:3:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/utils/room_status_extension.dart:3:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/chat/events/room_creation_state_event.dart:3:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/widgets/member_actions_popup_menu_button.dart:3:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/chat/events/message_content.dart:5:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/chat/events/reply_content.dart:3:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/utils/sync_status_localization.dart:3:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/chat/sticker_picker_dialog.dart:3:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/chat/input_bar.dart:5:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/chat_list/space_view.dart:4:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/chat_list/chat_list_header.dart:3:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/chat/events/video_player.dart:10:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/chat/events/cute_events.dart:5:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/utils/markdown_context_builder.dart:3:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/chat/command_hints.dart:3:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/chat_list/client_chooser_button.dart:3:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/pages/image_viewer/image_viewer_view.dart:3:8: Error: Error when reading '../../.pub-cache/hosted/pub.dev/flutter_gen-5.9.0/lib/gen_l10n/l10n.dart': No such file or directory +ERROR: import 'package:flutter_gen/gen_l10n/l10n.dart'; +ERROR: ^ +ERROR: lib/utils/background_push.dart:56:3: Error: Type 'L10n' not found. +ERROR: L10n? l10n; +ERROR: ^^^^ +ERROR: lib/utils/push_helper.dart:22:3: Error: Type 'L10n' not found. +ERROR: L10n? l10n, +ERROR: ^^^^ +ERROR: lib/utils/push_helper.dart:65:3: Error: Type 'L10n' not found. +ERROR: L10n? l10n, +ERROR: ^^^^ +ERROR: lib/utils/push_helper.dart:310:3: Error: Type 'L10n' not found. +ERROR: L10n l10n, +ERROR: ^^^^ +ERROR: lib/utils/matrix_sdk_extensions/matrix_locals.dart:6:9: Error: Type 'L10n' not found. +ERROR: final L10n l10n; +ERROR: ^^^^ +ERROR: lib/pages/chat/event_info_dialog.dart:23:9: Error: Type 'L10n' not found. +ERROR: final L10n l10n; +ERROR: ^^^^ +ERROR: lib/pages/chat_access_settings/chat_access_settings_page.dart:263:26: Error: Type 'L10n' not found. +ERROR: String localizedString(L10n l10n) { +ERROR: ^^^^ +ERROR: lib/pages/settings_homeserver/settings_homeserver_view.dart:295:26: Error: Type 'L10n' not found. +ERROR: String localizedString(L10n l10n) { +ERROR: ^^^^ +ERROR: lib/pages/settings_notifications/push_rule_extensions.dart:5:26: Error: Type 'L10n' not found. +ERROR: String getPushRuleName(L10n l10n) { +ERROR: ^^^^ +ERROR: lib/pages/settings_notifications/push_rule_extensions.dart:52:33: Error: Type 'L10n' not found. +ERROR: String getPushRuleDescription(L10n l10n) { +ERROR: ^^^^ +ERROR: lib/pages/settings_notifications/push_rule_extensions.dart:101:20: Error: Type 'L10n' not found. +ERROR: String localized(L10n l10n) { +ERROR: ^^^^ +ERROR: lib/pages/settings_security/settings_security_view.dart:206:20: Error: Type 'L10n' not found. +ERROR: String localized(L10n l10n) { +ERROR: ^^^^ +ERROR: lib/pages/chat/command_hints.dart:27:20: Error: Type 'L10n' not found. +ERROR: String commandHint(L10n l10n, String command) { +ERROR: ^^^^ +ERROR: lib/utils/client_manager.dart:55:34: Error: Method not found: 'lookupL10n'. +ERROR: final l10n = await lookupL10n(PlatformDispatcher.instance.locale); +ERROR: ^^^^^^^^^^ +ERROR: lib/utils/platform_infos.dart:57:23: Error: Undefined name 'L10n'. +ERROR: label: Text(L10n.of(context).sourceCode), +ERROR: ^^^^ +ERROR: lib/utils/background_push.dart:56:3: Error: 'L10n' isn't a type. +ERROR: L10n? l10n; +ERROR: ^^^^ +ERROR: lib/utils/background_push.dart:61:33: Error: The getter 'L10n' isn't defined for the class 'BackgroundPush'. +ERROR: - 'BackgroundPush' is from 'package:fluffychat/utils/background_push.dart' ('lib/utils/background_push.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: l10n ??= (context != null ? L10n.of(context) : null) ?? +ERROR: ^^^^ +ERROR: lib/utils/background_push.dart:62:16: Error: The getter 'L10n' isn't defined for the class 'BackgroundPush'. +ERROR: - 'BackgroundPush' is from 'package:fluffychat/utils/background_push.dart' ('lib/utils/background_push.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: (await L10n.delegate.load(PlatformDispatcher.instance.locale)); +ERROR: ^^^^ +ERROR: lib/widgets/fluffy_chat_app.dart:52:33: Error: The getter 'L10n' isn't defined for the class 'FluffyChatApp'. +ERROR: - 'FluffyChatApp' is from 'package:fluffychat/widgets/fluffy_chat_app.dart' ('lib/widgets/fluffy_chat_app.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: localizationsDelegates: L10n.localizationsDelegates, +ERROR: ^^^^ +ERROR: lib/widgets/fluffy_chat_app.dart:53:27: Error: The getter 'L10n' isn't defined for the class 'FluffyChatApp'. +ERROR: - 'FluffyChatApp' is from 'package:fluffychat/widgets/fluffy_chat_app.dart' ('lib/widgets/fluffy_chat_app.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: supportedLocales: L10n.supportedLocales, +ERROR: ^^^^ +ERROR: lib/utils/init_with_restore.dart:106:26: Error: The method 'lookupL10n' isn't defined for the class 'Client'. +ERROR: - 'Client' is from 'package:matrix/src/client.dart' ('../../.pub-cache/hosted/pub.dev/matrix-0.40.0/lib/src/client.dart'). +ERROR: Try correcting the name to the name of an existing method, or defining a method named 'lookupL10n'. +ERROR: final l10n = await lookupL10n(PlatformDispatcher.instance.locale); +ERROR: ^^^^^^^^^^ +ERROR: lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/builder.dart:45:26: Error: Method not found: 'lookupL10n'. +ERROR: final l10n = await lookupL10n(PlatformDispatcher.instance.locale); +ERROR: ^^^^^^^^^^ +ERROR: lib/utils/error_reporter.dart:25:21: Error: The getter 'L10n' isn't defined for the class 'ErrorReporter'. +ERROR: - 'ErrorReporter' is from 'package:fluffychat/utils/error_reporter.dart' ('lib/utils/error_reporter.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(L10n.of(context).reportErrorDescription), +ERROR: ^^^^ +ERROR: lib/utils/error_reporter.dart:40:25: Error: The getter 'L10n' isn't defined for the class 'ErrorReporter'. +ERROR: - 'ErrorReporter' is from 'package:fluffychat/utils/error_reporter.dart' ('lib/utils/error_reporter.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: child: Text(L10n.of(context).close), +ERROR: ^^^^ +ERROR: lib/utils/error_reporter.dart:46:25: Error: The getter 'L10n' isn't defined for the class 'ErrorReporter'. +ERROR: - 'ErrorReporter' is from 'package:fluffychat/utils/error_reporter.dart' ('lib/utils/error_reporter.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: child: Text(L10n.of(context).copy), +ERROR: ^^^^ +ERROR: lib/utils/error_reporter.dart:60:25: Error: The getter 'L10n' isn't defined for the class 'ErrorReporter'. +ERROR: - 'ErrorReporter' is from 'package:fluffychat/utils/error_reporter.dart' ('lib/utils/error_reporter.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: child: Text(L10n.of(context).report), +ERROR: ^^^^ +ERROR: lib/utils/push_helper.dart:22:3: Error: 'L10n' isn't a type. +ERROR: L10n? l10n, +ERROR: ^^^^ +ERROR: lib/utils/push_helper.dart:37:20: Error: Method not found: 'lookupL10n'. +ERROR: l10n ??= await lookupL10n(const Locale('en')); +ERROR: ^^^^^^^^^^ +ERROR: lib/utils/push_helper.dart:65:3: Error: 'L10n' isn't a type. +ERROR: L10n? l10n, +ERROR: ^^^^ +ERROR: lib/utils/push_helper.dart:138:18: Error: Undefined name 'L10n'. +ERROR: l10n ??= await L10n.delegate.load(PlatformDispatcher.instance.locale); +ERROR: ^^^^ +ERROR: lib/utils/push_helper.dart:310:3: Error: 'L10n' isn't a type. +ERROR: L10n l10n, +ERROR: ^^^^ +ERROR: lib/widgets/matrix.dart:293:27: Error: The getter 'L10n' isn't defined for the class 'MatrixState'. +ERROR: - 'MatrixState' is from 'package:fluffychat/widgets/matrix.dart' ('lib/widgets/matrix.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: content: Text(L10n.of(context).oneClientLoggedOut), +ERROR: ^^^^ +ERROR: lib/widgets/matrix.dart:344:20: Error: The getter 'L10n' isn't defined for the class 'MatrixState'. +ERROR: - 'MatrixState' is from 'package:fluffychat/widgets/matrix.dart' ('lib/widgets/matrix.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).pushNotificationsNotAvailable, +ERROR: ^^^^ +ERROR: lib/widgets/matrix.dart:347:32: Error: The getter 'L10n' isn't defined for the class 'MatrixState'. +ERROR: - 'MatrixState' is from 'package:fluffychat/widgets/matrix.dart' ('lib/widgets/matrix.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: link == null ? L10n.of(context).ok : L10n.of(context).learnMore, +ERROR: ^^^^ +ERROR: lib/widgets/matrix.dart:347:54: Error: The getter 'L10n' isn't defined for the class 'MatrixState'. +ERROR: - 'MatrixState' is from 'package:fluffychat/widgets/matrix.dart' ('lib/widgets/matrix.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: link == null ? L10n.of(context).ok : L10n.of(context).learnMore, +ERROR: ^^^^ +ERROR: lib/widgets/matrix.dart:348:26: Error: The getter 'L10n' isn't defined for the class 'MatrixState'. +ERROR: - 'MatrixState' is from 'package:fluffychat/widgets/matrix.dart' ('lib/widgets/matrix.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: cancelLabel: L10n.of(context).doNotShowAgain, +ERROR: ^^^^ +ERROR: lib/widgets/matrix.dart:466:14: Error: The getter 'L10n' isn't defined for the class 'MatrixState'. +ERROR: - 'MatrixState' is from 'package:fluffychat/widgets/matrix.dart' ('lib/widgets/matrix.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).dehydrate, +ERROR: ^^^^ +ERROR: lib/widgets/matrix.dart:467:16: Error: The getter 'L10n' isn't defined for the class 'MatrixState'. +ERROR: - 'MatrixState' is from 'package:fluffychat/widgets/matrix.dart' ('lib/widgets/matrix.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: message: L10n.of(context).dehydrateWarning, +ERROR: ^^^^ +ERROR: lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/cipher.dart:60:22: Error: Method not found: 'lookupL10n'. +ERROR: final l10n = await lookupL10n(PlatformDispatcher.instance.locale); +ERROR: ^^^^^^^^^^ +ERROR: lib/utils/matrix_sdk_extensions/matrix_locals.dart:6:9: Error: 'L10n' isn't a type. +ERROR: final L10n l10n; +ERROR: ^^^^ +ERROR: lib/utils/matrix_sdk_extensions/matrix_file_extension.dart:26:32: Error: The getter 'L10n' isn't defined for the class 'MatrixFile'. +ERROR: - 'MatrixFile' is from 'package:matrix/src/utils/matrix_file.dart' ('../../.pub-cache/hosted/pub.dev/matrix-0.40.0/lib/src/utils/matrix_file.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: confirmButtonText: L10n.of(context).saveFile, +ERROR: ^^^^ +ERROR: lib/utils/matrix_sdk_extensions/matrix_file_extension.dart:30:26: Error: The getter 'L10n' isn't defined for the class 'MatrixFile'. +ERROR: - 'MatrixFile' is from 'package:matrix/src/utils/matrix_file.dart' ('../../.pub-cache/hosted/pub.dev/matrix-0.40.0/lib/src/utils/matrix_file.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: dialogTitle: L10n.of(context).saveFile, +ERROR: ^^^^ +ERROR: lib/utils/matrix_sdk_extensions/matrix_file_extension.dart:48:11: Error: The getter 'L10n' isn't defined for the class 'MatrixFile'. +ERROR: - 'MatrixFile' is from 'package:matrix/src/utils/matrix_file.dart' ('../../.pub-cache/hosted/pub.dev/matrix-0.40.0/lib/src/utils/matrix_file.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).fileHasBeenSavedAt(downloadPath), +ERROR: ^^^^ +ERROR: lib/utils/uia_request_manager.dart:14:18: Error: The getter 'L10n' isn't defined for the class 'MatrixState'. +ERROR: - 'MatrixState' is from 'package:fluffychat/widgets/matrix.dart' ('lib/widgets/matrix.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: final l10n = L10n.of(context); +ERROR: ^^^^ +ERROR: lib/utils/uia_request_manager.dart:52:28: Error: The getter 'L10n' isn't defined for the class 'MatrixState'. +ERROR: - 'MatrixState' is from 'package:fluffychat/widgets/matrix.dart' ('lib/widgets/matrix.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: UiaException(L10n.of(context).serverRequiresEmail), +ERROR: ^^^^ +ERROR: lib/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart:47:40: Error: Undefined name 'L10n'. +ERROR: child: Text(cancelLabel ?? L10n.of(context).cancel), +ERROR: ^^^^ +ERROR: lib/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart:54:26: Error: Undefined name 'L10n'. +ERROR: okLabel ?? L10n.of(context).ok, +ERROR: ^^^^ +ERROR: lib/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart:99:36: Error: Undefined name 'L10n'. +ERROR: child: Text(okLabel ?? L10n.of(context).close), +ERROR: ^^^^ +ERROR: lib/widgets/future_loading_dialog.dart:97:27: Error: The getter 'L10n' isn't defined for the class 'LoadingDialogState'. +ERROR: - 'LoadingDialogState' is from 'package:fluffychat/widgets/future_loading_dialog.dart' ('lib/widgets/future_loading_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: : widget.title ?? L10n.of(context).loadingPleaseWait; +ERROR: ^^^^ +ERROR: lib/widgets/future_loading_dialog.dart:137:49: Error: The getter 'L10n' isn't defined for the class 'LoadingDialogState'. +ERROR: - 'LoadingDialogState' is from 'package:fluffychat/widgets/future_loading_dialog.dart' ('lib/widgets/future_loading_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: child: Text(widget.backLabel ?? L10n.of(context).close), +ERROR: ^^^^ +ERROR: lib/pages/key_verification/key_verification_dialog.dart:91:16: Error: The getter 'L10n' isn't defined for the class 'KeyVerificationPageState'. +ERROR: - 'KeyVerificationPageState' is from 'package:fluffychat/pages/key_verification/key_verification_dialog.dart' ('lib/pages/key_verification/key_verification_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).incorrectPassphraseOrKey, +ERROR: ^^^^ +ERROR: lib/pages/key_verification/key_verification_dialog.dart:110:22: Error: The getter 'L10n' isn't defined for the class 'KeyVerificationPageState'. +ERROR: - 'KeyVerificationPageState' is from 'package:fluffychat/pages/key_verification/key_verification_dialog.dart' ('lib/pages/key_verification/key_verification_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: var title = Text(L10n.of(context).verifyTitle); +ERROR: ^^^^ +ERROR: lib/pages/key_verification/key_verification_dialog.dart:128:17: Error: The getter 'L10n' isn't defined for the class 'KeyVerificationPageState'. +ERROR: - 'KeyVerificationPageState' is from 'package:fluffychat/pages/key_verification/key_verification_dialog.dart' ('lib/pages/key_verification/key_verification_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).askSSSSSign, +ERROR: ^^^^ +ERROR: lib/pages/key_verification/key_verification_dialog.dart:144:29: Error: The getter 'L10n' isn't defined for the class 'KeyVerificationPageState'. +ERROR: - 'KeyVerificationPageState' is from 'package:fluffychat/pages/key_verification/key_verification_dialog.dart' ('lib/pages/key_verification/key_verification_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: hintText: L10n.of(context).passphraseOrKey, +ERROR: ^^^^ +ERROR: lib/pages/key_verification/key_verification_dialog.dart:156:15: Error: The getter 'L10n' isn't defined for the class 'KeyVerificationPageState'. +ERROR: - 'KeyVerificationPageState' is from 'package:fluffychat/pages/key_verification/key_verification_dialog.dart' ('lib/pages/key_verification/key_verification_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).submit, +ERROR: ^^^^ +ERROR: lib/pages/key_verification/key_verification_dialog.dart:164:15: Error: The getter 'L10n' isn't defined for the class 'KeyVerificationPageState'. +ERROR: - 'KeyVerificationPageState' is from 'package:fluffychat/pages/key_verification/key_verification_dialog.dart' ('lib/pages/key_verification/key_verification_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).skip, +ERROR: ^^^^ +ERROR: lib/pages/key_verification/key_verification_dialog.dart:171:22: Error: The getter 'L10n' isn't defined for the class 'KeyVerificationPageState'. +ERROR: - 'KeyVerificationPageState' is from 'package:fluffychat/pages/key_verification/key_verification_dialog.dart' ('lib/pages/key_verification/key_verification_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title = Text(L10n.of(context).newVerificationRequest); +ERROR: ^^^^ +ERROR: lib/pages/key_verification/key_verification_dialog.dart:183:15: Error: The getter 'L10n' isn't defined for the class 'KeyVerificationPageState'. +ERROR: - 'KeyVerificationPageState' is from 'package:fluffychat/pages/key_verification/key_verification_dialog.dart' ('lib/pages/key_verification/key_verification_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).askVerificationRequest(displayName), +ERROR: ^^^^ +ERROR: lib/pages/key_verification/key_verification_dialog.dart:193:15: Error: The getter 'L10n' isn't defined for the class 'KeyVerificationPageState'. +ERROR: - 'KeyVerificationPageState' is from 'package:fluffychat/pages/key_verification/key_verification_dialog.dart' ('lib/pages/key_verification/key_verification_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).reject, +ERROR: ^^^^ +ERROR: lib/pages/key_verification/key_verification_dialog.dart:201:25: Error: The getter 'L10n' isn't defined for the class 'KeyVerificationPageState'. +ERROR: - 'KeyVerificationPageState' is from 'package:fluffychat/pages/key_verification/key_verification_dialog.dart' ('lib/pages/key_verification/key_verification_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: child: Text(L10n.of(context).accept), +ERROR: ^^^^ +ERROR: lib/pages/key_verification/key_verification_dialog.dart:227:17: Error: The getter 'L10n' isn't defined for the class 'KeyVerificationPageState'. +ERROR: - 'KeyVerificationPageState' is from 'package:fluffychat/pages/key_verification/key_verification_dialog.dart' ('lib/pages/key_verification/key_verification_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).waitingPartnerAcceptRequest, +ERROR: ^^^^ +ERROR: lib/pages/key_verification/key_verification_dialog.dart:236:25: Error: The getter 'L10n' isn't defined for the class 'KeyVerificationPageState'. +ERROR: - 'KeyVerificationPageState' is from 'package:fluffychat/pages/key_verification/key_verification_dialog.dart' ('lib/pages/key_verification/key_verification_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: child: Text(L10n.of(context).cancel), +ERROR: ^^^^ +ERROR: lib/pages/key_verification/key_verification_dialog.dart:248:13: Error: The getter 'L10n' isn't defined for the class 'KeyVerificationPageState'. +ERROR: - 'KeyVerificationPageState' is from 'package:fluffychat/pages/key_verification/key_verification_dialog.dart' ('lib/pages/key_verification/key_verification_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).compareEmojiMatch, +ERROR: ^^^^ +ERROR: lib/pages/key_verification/key_verification_dialog.dart:258:24: Error: The getter 'L10n' isn't defined for the class 'KeyVerificationPageState'. +ERROR: - 'KeyVerificationPageState' is from 'package:fluffychat/pages/key_verification/key_verification_dialog.dart' ('lib/pages/key_verification/key_verification_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title = Text(L10n.of(context).compareNumbersMatch); +ERROR: ^^^^ +ERROR: lib/pages/key_verification/key_verification_dialog.dart:277:15: Error: The getter 'L10n' isn't defined for the class 'KeyVerificationPageState'. +ERROR: - 'KeyVerificationPageState' is from 'package:fluffychat/pages/key_verification/key_verification_dialog.dart' ('lib/pages/key_verification/key_verification_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).theyDontMatch, +ERROR: ^^^^ +ERROR: lib/pages/key_verification/key_verification_dialog.dart:285:25: Error: The getter 'L10n' isn't defined for the class 'KeyVerificationPageState'. +ERROR: - 'KeyVerificationPageState' is from 'package:fluffychat/pages/key_verification/key_verification_dialog.dart' ('lib/pages/key_verification/key_verification_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: child: Text(L10n.of(context).theyMatch), +ERROR: ^^^^ +ERROR: lib/pages/key_verification/key_verification_dialog.dart:291:15: Error: The getter 'L10n' isn't defined for the class 'KeyVerificationPageState'. +ERROR: - 'KeyVerificationPageState' is from 'package:fluffychat/pages/key_verification/key_verification_dialog.dart' ('lib/pages/key_verification/key_verification_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: ? L10n.of(context).waitingPartnerEmoji +ERROR: ^^^^ +ERROR: lib/pages/key_verification/key_verification_dialog.dart:292:15: Error: The getter 'L10n' isn't defined for the class 'KeyVerificationPageState'. +ERROR: - 'KeyVerificationPageState' is from 'package:fluffychat/pages/key_verification/key_verification_dialog.dart' ('lib/pages/key_verification/key_verification_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: : L10n.of(context).waitingPartnerNumbers; +ERROR: ^^^^ +ERROR: lib/pages/key_verification/key_verification_dialog.dart:307:22: Error: The getter 'L10n' isn't defined for the class 'KeyVerificationPageState'. +ERROR: - 'KeyVerificationPageState' is from 'package:fluffychat/pages/key_verification/key_verification_dialog.dart' ('lib/pages/key_verification/key_verification_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title = Text(L10n.of(context).verifySuccess); +ERROR: ^^^^ +ERROR: lib/pages/key_verification/key_verification_dialog.dart:319:15: Error: The getter 'L10n' isn't defined for the class 'KeyVerificationPageState'. +ERROR: - 'KeyVerificationPageState' is from 'package:fluffychat/pages/key_verification/key_verification_dialog.dart' ('lib/pages/key_verification/key_verification_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).close, +ERROR: ^^^^ +ERROR: lib/pages/key_verification/key_verification_dialog.dart:343:15: Error: The getter 'L10n' isn't defined for the class 'KeyVerificationPageState'. +ERROR: - 'KeyVerificationPageState' is from 'package:fluffychat/pages/key_verification/key_verification_dialog.dart' ('lib/pages/key_verification/key_verification_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).close, +ERROR: ^^^^ +ERROR: lib/widgets/local_notifications_extension.dart:34:57: Error: The getter 'L10n' isn't defined for the class 'MatrixState'. +ERROR: - 'MatrixState' is from 'package:fluffychat/widgets/matrix.dart' ('lib/widgets/matrix.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: event.room.getLocalizedDisplayname(MatrixLocals(L10n.of(context))); +ERROR: ^^^^ +ERROR: lib/widgets/local_notifications_extension.dart:36:20: Error: The getter 'L10n' isn't defined for the class 'MatrixState'. +ERROR: - 'MatrixState' is from 'package:fluffychat/widgets/matrix.dart' ('lib/widgets/matrix.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: MatrixLocals(L10n.of(context)), +ERROR: ^^^^ +ERROR: lib/widgets/local_notifications_extension.dart:88:13: Error: The getter 'L10n' isn't defined for the class 'MatrixState'. +ERROR: - 'MatrixState' is from 'package:fluffychat/widgets/matrix.dart' ('lib/widgets/matrix.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).openChat, +ERROR: ^^^^ +ERROR: lib/widgets/local_notifications_extension.dart:92:13: Error: The getter 'L10n' isn't defined for the class 'MatrixState'. +ERROR: - 'MatrixState' is from 'package:fluffychat/widgets/matrix.dart' ('lib/widgets/matrix.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).markAsRead, +ERROR: ^^^^ +ERROR: lib/pages/archive/archive.dart:45:18: Error: The getter 'L10n' isn't defined for the class 'ArchiveController'. +ERROR: - 'ArchiveController' is from 'package:fluffychat/pages/archive/archive.dart' ('lib/pages/archive/archive.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).areYouSure, +ERROR: ^^^^ +ERROR: lib/pages/archive/archive.dart:46:20: Error: The getter 'L10n' isn't defined for the class 'ArchiveController'. +ERROR: - 'ArchiveController' is from 'package:fluffychat/pages/archive/archive.dart' ('lib/pages/archive/archive.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: okLabel: L10n.of(context).yes, +ERROR: ^^^^ +ERROR: lib/pages/archive/archive.dart:47:24: Error: The getter 'L10n' isn't defined for the class 'ArchiveController'. +ERROR: - 'ArchiveController' is from 'package:fluffychat/pages/archive/archive.dart' ('lib/pages/archive/archive.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: cancelLabel: L10n.of(context).cancel, +ERROR: ^^^^ +ERROR: lib/pages/archive/archive.dart:48:20: Error: The getter 'L10n' isn't defined for the class 'ArchiveController'. +ERROR: - 'ArchiveController' is from 'package:fluffychat/pages/archive/archive.dart' ('lib/pages/archive/archive.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: message: L10n.of(context).clearArchive, +ERROR: ^^^^ +ERROR: lib/pages/chat/chat.dart:69:36: Error: The getter 'L10n' isn't defined for the class 'ChatPage'. +ERROR: - 'ChatPage' is from 'package:fluffychat/pages/chat/chat.dart' ('lib/pages/chat/chat.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: appBar: AppBar(title: Text(L10n.of(context).oopsSomethingWentWrong)), +ERROR: ^^^^ +ERROR: lib/pages/chat/chat.dart:73:25: Error: The getter 'L10n' isn't defined for the class 'ChatPage'. +ERROR: - 'ChatPage' is from 'package:fluffychat/pages/chat/chat.dart' ('lib/pages/chat/chat.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: child: Text(L10n.of(context).youAreNoLongerParticipatingInThisChat), +ERROR: ^^^^ +ERROR: lib/pages/chat/chat.dart:253:13: Error: The getter 'L10n' isn't defined for the class 'ChatController'. +ERROR: - 'ChatController' is from 'package:fluffychat/pages/chat/chat.dart' ('lib/pages/chat/chat.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).otherPartyNotLoggedIn, +ERROR: ^^^^ +ERROR: lib/pages/chat/chat.dart:518:20: Error: The getter 'L10n' isn't defined for the class 'ChatController'. +ERROR: - 'ChatController' is from 'package:fluffychat/pages/chat/chat.dart' ('lib/pages/chat/chat.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: final l10n = L10n.of(context); +ERROR: ^^^^ +ERROR: lib/pages/chat/chat.dart:624:18: Error: The getter 'L10n' isn't defined for the class 'ChatController'. +ERROR: - 'ChatController' is from 'package:fluffychat/pages/chat/chat.dart' ('lib/pages/chat/chat.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).unsupportedAndroidVersion, +ERROR: ^^^^ +ERROR: lib/pages/chat/chat.dart:625:20: Error: The getter 'L10n' isn't defined for the class 'ChatController'. +ERROR: - 'ChatController' is from 'package:fluffychat/pages/chat/chat.dart' ('lib/pages/chat/chat.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: message: L10n.of(context).unsupportedAndroidVersionLong, +ERROR: ^^^^ +ERROR: lib/pages/chat/chat.dart:626:20: Error: The getter 'L10n' isn't defined for the class 'ChatController'. +ERROR: - 'ChatController' is from 'package:fluffychat/pages/chat/chat.dart' ('lib/pages/chat/chat.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: okLabel: L10n.of(context).close, +ERROR: ^^^^ +ERROR: lib/pages/chat/chat.dart:706:51: Error: The getter 'L10n' isn't defined for the class 'ChatController'. +ERROR: - 'ChatController' is from 'package:fluffychat/pages/chat/chat.dart' ('lib/pages/chat/chat.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: .calcLocalizedBodyFallback(MatrixLocals(L10n.of(context))); +ERROR: ^^^^ +ERROR: lib/pages/chat/chat.dart:711:26: Error: The getter 'L10n' isn't defined for the class 'ChatController'. +ERROR: - 'ChatController' is from 'package:fluffychat/pages/chat/chat.dart' ('lib/pages/chat/chat.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: MatrixLocals(L10n.of(context)), +ERROR: ^^^^ +ERROR: lib/pages/chat/chat.dart:730:32: Error: The getter 'L10n' isn't defined for the class 'ChatController'. +ERROR: - 'ChatController' is from 'package:fluffychat/pages/chat/chat.dart' ('lib/pages/chat/chat.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: SnackBar(content: Text(L10n.of(context).errorRecoveringMessageNoAdmin)), +ERROR: ^^^^ +ERROR: lib/pages/chat/chat.dart:745:32: Error: The getter 'L10n' isn't defined for the class 'ChatController'. +ERROR: - 'ChatController' is from 'package:fluffychat/pages/chat/chat.dart' ('lib/pages/chat/chat.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: SnackBar(content: Text(L10n.of(context).errorRecoveringMessage)), +ERROR: ^^^^ +ERROR: lib/pages/chat/chat.dart:763:32: Error: The getter 'L10n' isn't defined for the class 'ChatController'. +ERROR: - 'ChatController' is from 'package:fluffychat/pages/chat/chat.dart' ('lib/pages/chat/chat.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: SnackBar(content: Text(L10n.of(context).errorTranslatingMessage)), +ERROR: ^^^^ +ERROR: lib/pages/chat/chat.dart:772:32: Error: The getter 'L10n' isn't defined for the class 'ChatController'. +ERROR: - 'ChatController' is from 'package:fluffychat/pages/chat/chat.dart' ('lib/pages/chat/chat.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: SnackBar(content: Text(L10n.of(context).errorTranslatingMessage)), +ERROR: ^^^^ +ERROR: lib/pages/chat/chat.dart:794:14: Error: The getter 'L10n' isn't defined for the class 'ChatController'. +ERROR: - 'ChatController' is from 'package:fluffychat/pages/chat/chat.dart' ('lib/pages/chat/chat.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).reportMessage, +ERROR: ^^^^ +ERROR: lib/pages/chat/chat.dart:795:16: Error: The getter 'L10n' isn't defined for the class 'ChatController'. +ERROR: - 'ChatController' is from 'package:fluffychat/pages/chat/chat.dart' ('lib/pages/chat/chat.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: message: L10n.of(context).howOffensiveIsThisContent, +ERROR: ^^^^ +ERROR: lib/pages/chat/chat.dart:796:20: Error: The getter 'L10n' isn't defined for the class 'ChatController'. +ERROR: - 'ChatController' is from 'package:fluffychat/pages/chat/chat.dart' ('lib/pages/chat/chat.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: cancelLabel: L10n.of(context).cancel, +ERROR: ^^^^ +ERROR: lib/pages/chat/chat.dart:800:18: Error: The getter 'L10n' isn't defined for the class 'ChatController'. +ERROR: - 'ChatController' is from 'package:fluffychat/pages/chat/chat.dart' ('lib/pages/chat/chat.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: label: L10n.of(context).extremeOffensive, +ERROR: ^^^^ +ERROR: lib/pages/chat/chat.dart:804:18: Error: The getter 'L10n' isn't defined for the class 'ChatController'. +ERROR: - 'ChatController' is from 'package:fluffychat/pages/chat/chat.dart' ('lib/pages/chat/chat.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: label: L10n.of(context).offensive, +ERROR: ^^^^ +ERROR: lib/pages/chat/chat.dart:808:18: Error: The getter 'L10n' isn't defined for the class 'ChatController'. +ERROR: - 'ChatController' is from 'package:fluffychat/pages/chat/chat.dart' ('lib/pages/chat/chat.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: label: L10n.of(context).inoffensive, +ERROR: ^^^^ +ERROR: lib/pages/chat/chat.dart:815:14: Error: The getter 'L10n' isn't defined for the class 'ChatController'. +ERROR: - 'ChatController' is from 'package:fluffychat/pages/chat/chat.dart' ('lib/pages/chat/chat.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).whyDoYouWantToReportThis, +ERROR: ^^^^ +ERROR: lib/pages/chat/chat.dart:816:16: Error: The getter 'L10n' isn't defined for the class 'ChatController'. +ERROR: - 'ChatController' is from 'package:fluffychat/pages/chat/chat.dart' ('lib/pages/chat/chat.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: okLabel: L10n.of(context).ok, +ERROR: ^^^^ +ERROR: lib/pages/chat/chat.dart:817:20: Error: The getter 'L10n' isn't defined for the class 'ChatController'. +ERROR: - 'ChatController' is from 'package:fluffychat/pages/chat/chat.dart' ('lib/pages/chat/chat.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: cancelLabel: L10n.of(context).cancel, +ERROR: ^^^^ +ERROR: lib/pages/chat/chat.dart:818:17: Error: The getter 'L10n' isn't defined for the class 'ChatController'. +ERROR: - 'ChatController' is from 'package:fluffychat/pages/chat/chat.dart' ('lib/pages/chat/chat.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: hintText: L10n.of(context).reason, +ERROR: ^^^^ +ERROR: lib/pages/chat/chat.dart:860:20: Error: The getter 'L10n' isn't defined for the class 'ChatController'. +ERROR: - 'ChatController' is from 'package:fluffychat/pages/chat/chat.dart' ('lib/pages/chat/chat.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).redactMessage, +ERROR: ^^^^ +ERROR: lib/pages/chat/chat.dart:861:22: Error: The getter 'L10n' isn't defined for the class 'ChatController'. +ERROR: - 'ChatController' is from 'package:fluffychat/pages/chat/chat.dart' ('lib/pages/chat/chat.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: message: L10n.of(context).redactMessageDescription, +ERROR: ^^^^ +ERROR: lib/pages/chat/chat.dart:863:23: Error: The getter 'L10n' isn't defined for the class 'ChatController'. +ERROR: - 'ChatController' is from 'package:fluffychat/pages/chat/chat.dart' ('lib/pages/chat/chat.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: hintText: L10n.of(context).optionalRedactReason, +ERROR: ^^^^ +ERROR: lib/pages/chat/chat.dart:864:22: Error: The getter 'L10n' isn't defined for the class 'ChatController'. +ERROR: - 'ChatController' is from 'package:fluffychat/pages/chat/chat.dart' ('lib/pages/chat/chat.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: okLabel: L10n.of(context).remove, +ERROR: ^^^^ +ERROR: lib/pages/chat/chat.dart:865:26: Error: The getter 'L10n' isn't defined for the class 'ChatController'. +ERROR: - 'ChatController' is from 'package:fluffychat/pages/chat/chat.dart' ('lib/pages/chat/chat.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: cancelLabel: L10n.of(context).cancel, +ERROR: ^^^^ +ERROR: lib/pages/chat/chat.dart:1132:30: Error: The getter 'L10n' isn't defined for the class 'ChatController'. +ERROR: - 'ChatController' is from 'package:fluffychat/pages/chat/chat.dart' ('lib/pages/chat/chat.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: MatrixLocals(L10n.of(context)), +ERROR: ^^^^ +ERROR: lib/pages/chat/chat.dart:1222:14: Error: The getter 'L10n' isn't defined for the class 'ChatController'. +ERROR: - 'ChatController' is from 'package:fluffychat/pages/chat/chat.dart' ('lib/pages/chat/chat.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).unpin, +ERROR: ^^^^ +ERROR: lib/pages/chat/chat.dart:1223:16: Error: The getter 'L10n' isn't defined for the class 'ChatController'. +ERROR: - 'ChatController' is from 'package:fluffychat/pages/chat/chat.dart' ('lib/pages/chat/chat.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: message: L10n.of(context).confirmEventUnpin, +ERROR: ^^^^ +ERROR: lib/pages/chat/chat.dart:1224:16: Error: The getter 'L10n' isn't defined for the class 'ChatController'. +ERROR: - 'ChatController' is from 'package:fluffychat/pages/chat/chat.dart' ('lib/pages/chat/chat.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: okLabel: L10n.of(context).unpin, +ERROR: ^^^^ +ERROR: lib/pages/chat/chat.dart:1225:20: Error: The getter 'L10n' isn't defined for the class 'ChatController'. +ERROR: - 'ChatController' is from 'package:fluffychat/pages/chat/chat.dart' ('lib/pages/chat/chat.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: cancelLabel: L10n.of(context).cancel, +ERROR: ^^^^ +ERROR: lib/pages/chat/chat.dart:1319:20: Error: The getter 'L10n' isn't defined for the class 'ChatController'. +ERROR: - 'ChatController' is from 'package:fluffychat/pages/chat/chat.dart' ('lib/pages/chat/chat.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).unsupportedAndroidVersion, +ERROR: ^^^^ +ERROR: lib/pages/chat/chat.dart:1320:22: Error: The getter 'L10n' isn't defined for the class 'ChatController'. +ERROR: - 'ChatController' is from 'package:fluffychat/pages/chat/chat.dart' ('lib/pages/chat/chat.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: message: L10n.of(context).unsupportedAndroidVersionLong, +ERROR: ^^^^ +ERROR: lib/pages/chat/chat.dart:1321:22: Error: The getter 'L10n' isn't defined for the class 'ChatController'. +ERROR: - 'ChatController' is from 'package:fluffychat/pages/chat/chat.dart' ('lib/pages/chat/chat.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: okLabel: L10n.of(context).close, +ERROR: ^^^^ +ERROR: lib/pages/chat/chat.dart:1328:14: Error: The getter 'L10n' isn't defined for the class 'ChatController'. +ERROR: - 'ChatController' is from 'package:fluffychat/pages/chat/chat.dart' ('lib/pages/chat/chat.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).warning, +ERROR: ^^^^ +ERROR: lib/pages/chat/chat.dart:1329:16: Error: The getter 'L10n' isn't defined for the class 'ChatController'. +ERROR: - 'ChatController' is from 'package:fluffychat/pages/chat/chat.dart' ('lib/pages/chat/chat.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: message: L10n.of(context).videoCallsBetaWarning, +ERROR: ^^^^ +ERROR: lib/pages/chat/chat.dart:1330:20: Error: The getter 'L10n' isn't defined for the class 'ChatController'. +ERROR: - 'ChatController' is from 'package:fluffychat/pages/chat/chat.dart' ('lib/pages/chat/chat.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: cancelLabel: L10n.of(context).cancel, +ERROR: ^^^^ +ERROR: lib/pages/chat/chat.dart:1333:18: Error: The getter 'L10n' isn't defined for the class 'ChatController'. +ERROR: - 'ChatController' is from 'package:fluffychat/pages/chat/chat.dart' ('lib/pages/chat/chat.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: label: L10n.of(context).voiceCall, +ERROR: ^^^^ +ERROR: lib/pages/chat/chat.dart:1338:18: Error: The getter 'L10n' isn't defined for the class 'ChatController'. +ERROR: - 'ChatController' is from 'package:fluffychat/pages/chat/chat.dart' ('lib/pages/chat/chat.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: label: L10n.of(context).videoCall, +ERROR: ^^^^ +ERROR: lib/pages/chat_access_settings/chat_access_settings_controller.dart:157:14: Error: The getter 'L10n' isn't defined for the class 'ChatAccessSettingsController'. +ERROR: - 'ChatAccessSettingsController' is from 'package:fluffychat/pages/chat_access_settings/chat_access_settings_controller.dart' ('lib/pages/chat_access_settings/chat_access_settings_controller.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).replaceRoomWithNewerVersion, +ERROR: ^^^^ +ERROR: lib/pages/chat_access_settings/chat_access_settings_controller.dart:158:20: Error: The getter 'L10n' isn't defined for the class 'ChatAccessSettingsController'. +ERROR: - 'ChatAccessSettingsController' is from 'package:fluffychat/pages/chat_access_settings/chat_access_settings_controller.dart' ('lib/pages/chat_access_settings/chat_access_settings_controller.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: cancelLabel: L10n.of(context).cancel, +ERROR: ^^^^ +ERROR: lib/pages/chat_access_settings/chat_access_settings_controller.dart:175:24: Error: The getter 'L10n' isn't defined for the class 'ChatAccessSettingsController'. +ERROR: - 'ChatAccessSettingsController' is from 'package:fluffychat/pages/chat_access_settings/chat_access_settings_controller.dart' ('lib/pages/chat_access_settings/chat_access_settings_controller.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: okLabel: L10n.of(context).yes, +ERROR: ^^^^ +ERROR: lib/pages/chat_access_settings/chat_access_settings_controller.dart:176:28: Error: The getter 'L10n' isn't defined for the class 'ChatAccessSettingsController'. +ERROR: - 'ChatAccessSettingsController' is from 'package:fluffychat/pages/chat_access_settings/chat_access_settings_controller.dart' ('lib/pages/chat_access_settings/chat_access_settings_controller.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: cancelLabel: L10n.of(context).cancel, +ERROR: ^^^^ +ERROR: lib/pages/chat_access_settings/chat_access_settings_controller.dart:177:22: Error: The getter 'L10n' isn't defined for the class 'ChatAccessSettingsController'. +ERROR: - 'ChatAccessSettingsController' is from 'package:fluffychat/pages/chat_access_settings/chat_access_settings_controller.dart' ('lib/pages/chat_access_settings/chat_access_settings_controller.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).areYouSure, +ERROR: ^^^^ +ERROR: lib/pages/chat_access_settings/chat_access_settings_controller.dart:178:24: Error: The getter 'L10n' isn't defined for the class 'ChatAccessSettingsController'. +ERROR: - 'ChatAccessSettingsController' is from 'package:fluffychat/pages/chat_access_settings/chat_access_settings_controller.dart' ('lib/pages/chat_access_settings/chat_access_settings_controller.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: message: L10n.of(context).roomUpgradeDescription, +ERROR: ^^^^ +ERROR: lib/pages/chat_access_settings/chat_access_settings_controller.dart:200:14: Error: The getter 'L10n' isn't defined for the class 'ChatAccessSettingsController'. +ERROR: - 'ChatAccessSettingsController' is from 'package:fluffychat/pages/chat_access_settings/chat_access_settings_controller.dart' ('lib/pages/chat_access_settings/chat_access_settings_controller.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).editRoomAliases, +ERROR: ^^^^ +ERROR: lib/pages/chat_access_settings/chat_access_settings_controller.dart:203:17: Error: The getter 'L10n' isn't defined for the class 'ChatAccessSettingsController'. +ERROR: - 'ChatAccessSettingsController' is from 'package:fluffychat/pages/chat_access_settings/chat_access_settings_controller.dart' ('lib/pages/chat_access_settings/chat_access_settings_controller.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: hintText: L10n.of(context).alias, +ERROR: ^^^^ +ERROR: lib/pages/chat_access_settings/chat_access_settings_controller.dart:220:14: Error: The getter 'L10n' isn't defined for the class 'ChatAccessSettingsController'. +ERROR: - 'ChatAccessSettingsController' is from 'package:fluffychat/pages/chat_access_settings/chat_access_settings_controller.dart' ('lib/pages/chat_access_settings/chat_access_settings_controller.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).setAsCanonicalAlias, +ERROR: ^^^^ +ERROR: lib/pages/chat_access_settings/chat_access_settings_controller.dart:222:16: Error: The getter 'L10n' isn't defined for the class 'ChatAccessSettingsController'. +ERROR: - 'ChatAccessSettingsController' is from 'package:fluffychat/pages/chat_access_settings/chat_access_settings_controller.dart' ('lib/pages/chat_access_settings/chat_access_settings_controller.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: okLabel: L10n.of(context).yes, +ERROR: ^^^^ +ERROR: lib/pages/chat_access_settings/chat_access_settings_controller.dart:223:20: Error: The getter 'L10n' isn't defined for the class 'ChatAccessSettingsController'. +ERROR: - 'ChatAccessSettingsController' is from 'package:fluffychat/pages/chat_access_settings/chat_access_settings_controller.dart' ('lib/pages/chat_access_settings/chat_access_settings_controller.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: cancelLabel: L10n.of(context).no, +ERROR: ^^^^ +ERROR: lib/pages/chat_details/chat_details.dart:47:14: Error: The getter 'L10n' isn't defined for the class 'ChatDetailsController'. +ERROR: - 'ChatDetailsController' is from 'package:fluffychat/pages/chat_details/chat_details.dart' ('lib/pages/chat_details/chat_details.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).changeTheNameOfTheGroup, +ERROR: ^^^^ +ERROR: lib/pages/chat_details/chat_details.dart:48:16: Error: The getter 'L10n' isn't defined for the class 'ChatDetailsController'. +ERROR: - 'ChatDetailsController' is from 'package:fluffychat/pages/chat_details/chat_details.dart' ('lib/pages/chat_details/chat_details.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: okLabel: L10n.of(context).ok, +ERROR: ^^^^ +ERROR: lib/pages/chat_details/chat_details.dart:49:20: Error: The getter 'L10n' isn't defined for the class 'ChatDetailsController'. +ERROR: - 'ChatDetailsController' is from 'package:fluffychat/pages/chat_details/chat_details.dart' ('lib/pages/chat_details/chat_details.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: cancelLabel: L10n.of(context).cancel, +ERROR: ^^^^ +ERROR: lib/pages/chat_details/chat_details.dart:52:11: Error: The getter 'L10n' isn't defined for the class 'ChatDetailsController'. +ERROR: - 'ChatDetailsController' is from 'package:fluffychat/pages/chat_details/chat_details.dart' ('lib/pages/chat_details/chat_details.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context), +ERROR: ^^^^ +ERROR: lib/pages/chat_details/chat_details.dart:63:32: Error: The getter 'L10n' isn't defined for the class 'ChatDetailsController'. +ERROR: - 'ChatDetailsController' is from 'package:fluffychat/pages/chat_details/chat_details.dart' ('lib/pages/chat_details/chat_details.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: SnackBar(content: Text(L10n.of(context).displaynameHasBeenChanged)), +ERROR: ^^^^ +ERROR: lib/pages/chat_details/chat_details.dart:72:14: Error: The getter 'L10n' isn't defined for the class 'ChatDetailsController'. +ERROR: - 'ChatDetailsController' is from 'package:fluffychat/pages/chat_details/chat_details.dart' ('lib/pages/chat_details/chat_details.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).setChatDescription, +ERROR: ^^^^ +ERROR: lib/pages/chat_details/chat_details.dart:73:16: Error: The getter 'L10n' isn't defined for the class 'ChatDetailsController'. +ERROR: - 'ChatDetailsController' is from 'package:fluffychat/pages/chat_details/chat_details.dart' ('lib/pages/chat_details/chat_details.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: okLabel: L10n.of(context).ok, +ERROR: ^^^^ +ERROR: lib/pages/chat_details/chat_details.dart:74:20: Error: The getter 'L10n' isn't defined for the class 'ChatDetailsController'. +ERROR: - 'ChatDetailsController' is from 'package:fluffychat/pages/chat_details/chat_details.dart' ('lib/pages/chat_details/chat_details.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: cancelLabel: L10n.of(context).cancel, +ERROR: ^^^^ +ERROR: lib/pages/chat_details/chat_details.dart:75:17: Error: The getter 'L10n' isn't defined for the class 'ChatDetailsController'. +ERROR: - 'ChatDetailsController' is from 'package:fluffychat/pages/chat_details/chat_details.dart' ('lib/pages/chat_details/chat_details.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: hintText: L10n.of(context).noChatDescriptionYet, +ERROR: ^^^^ +ERROR: lib/pages/chat_details/chat_details.dart:88:25: Error: The getter 'L10n' isn't defined for the class 'ChatDetailsController'. +ERROR: - 'ChatDetailsController' is from 'package:fluffychat/pages/chat_details/chat_details.dart' ('lib/pages/chat_details/chat_details.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: content: Text(L10n.of(context).chatDescriptionHasBeenChanged), +ERROR: ^^^^ +ERROR: lib/pages/chat_details/chat_details.dart:114:18: Error: The getter 'L10n' isn't defined for the class 'ChatDetailsController'. +ERROR: - 'ChatDetailsController' is from 'package:fluffychat/pages/chat_details/chat_details.dart' ('lib/pages/chat_details/chat_details.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: label: L10n.of(context).openCamera, +ERROR: ^^^^ +ERROR: lib/pages/chat_details/chat_details.dart:120:16: Error: The getter 'L10n' isn't defined for the class 'ChatDetailsController'. +ERROR: - 'ChatDetailsController' is from 'package:fluffychat/pages/chat_details/chat_details.dart' ('lib/pages/chat_details/chat_details.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: label: L10n.of(context).openGallery, +ERROR: ^^^^ +ERROR: lib/pages/chat_details/chat_details.dart:126:18: Error: The getter 'L10n' isn't defined for the class 'ChatDetailsController'. +ERROR: - 'ChatDetailsController' is from 'package:fluffychat/pages/chat_details/chat_details.dart' ('lib/pages/chat_details/chat_details.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: label: L10n.of(context).delete, +ERROR: ^^^^ +ERROR: lib/pages/chat_details/chat_details.dart:135:20: Error: The getter 'L10n' isn't defined for the class 'ChatDetailsController'. +ERROR: - 'ChatDetailsController' is from 'package:fluffychat/pages/chat_details/chat_details.dart' ('lib/pages/chat_details/chat_details.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).editRoomAvatar, +ERROR: ^^^^ +ERROR: lib/pages/chat_details/chat_details.dart:136:26: Error: The getter 'L10n' isn't defined for the class 'ChatDetailsController'. +ERROR: - 'ChatDetailsController' is from 'package:fluffychat/pages/chat_details/chat_details.dart' ('lib/pages/chat_details/chat_details.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: cancelLabel: L10n.of(context).cancel, +ERROR: ^^^^ +ERROR: lib/pages/chat_encryption_settings/chat_encryption_settings.dart:37:16: Error: The getter 'L10n' isn't defined for the class 'ChatEncryptionSettingsController'. +ERROR: - 'ChatEncryptionSettingsController' is from 'package:fluffychat/pages/chat_encryption_settings/chat_encryption_settings.dart' ('lib/pages/chat_encryption_settings/chat_encryption_settings.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).sorryThatsNotPossible, +ERROR: ^^^^ +ERROR: lib/pages/chat_encryption_settings/chat_encryption_settings.dart:38:18: Error: The getter 'L10n' isn't defined for the class 'ChatEncryptionSettingsController'. +ERROR: - 'ChatEncryptionSettingsController' is from 'package:fluffychat/pages/chat_encryption_settings/chat_encryption_settings.dart' ('lib/pages/chat_encryption_settings/chat_encryption_settings.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: message: L10n.of(context).disableEncryptionWarning, +ERROR: ^^^^ +ERROR: lib/pages/chat_encryption_settings/chat_encryption_settings.dart:45:16: Error: The getter 'L10n' isn't defined for the class 'ChatEncryptionSettingsController'. +ERROR: - 'ChatEncryptionSettingsController' is from 'package:fluffychat/pages/chat_encryption_settings/chat_encryption_settings.dart' ('lib/pages/chat_encryption_settings/chat_encryption_settings.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).sorryThatsNotPossible, +ERROR: ^^^^ +ERROR: lib/pages/chat_encryption_settings/chat_encryption_settings.dart:46:18: Error: The getter 'L10n' isn't defined for the class 'ChatEncryptionSettingsController'. +ERROR: - 'ChatEncryptionSettingsController' is from 'package:fluffychat/pages/chat_encryption_settings/chat_encryption_settings.dart' ('lib/pages/chat_encryption_settings/chat_encryption_settings.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: message: L10n.of(context).noEncryptionForPublicRooms, +ERROR: ^^^^ +ERROR: lib/pages/chat_encryption_settings/chat_encryption_settings.dart:53:16: Error: The getter 'L10n' isn't defined for the class 'ChatEncryptionSettingsController'. +ERROR: - 'ChatEncryptionSettingsController' is from 'package:fluffychat/pages/chat_encryption_settings/chat_encryption_settings.dart' ('lib/pages/chat_encryption_settings/chat_encryption_settings.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).sorryThatsNotPossible, +ERROR: ^^^^ +ERROR: lib/pages/chat_encryption_settings/chat_encryption_settings.dart:54:18: Error: The getter 'L10n' isn't defined for the class 'ChatEncryptionSettingsController'. +ERROR: - 'ChatEncryptionSettingsController' is from 'package:fluffychat/pages/chat_encryption_settings/chat_encryption_settings.dart' ('lib/pages/chat_encryption_settings/chat_encryption_settings.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: message: L10n.of(context).noPermission, +ERROR: ^^^^ +ERROR: lib/pages/chat_encryption_settings/chat_encryption_settings.dart:60:14: Error: The getter 'L10n' isn't defined for the class 'ChatEncryptionSettingsController'. +ERROR: - 'ChatEncryptionSettingsController' is from 'package:fluffychat/pages/chat_encryption_settings/chat_encryption_settings.dart' ('lib/pages/chat_encryption_settings/chat_encryption_settings.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).areYouSure, +ERROR: ^^^^ +ERROR: lib/pages/chat_encryption_settings/chat_encryption_settings.dart:61:16: Error: The getter 'L10n' isn't defined for the class 'ChatEncryptionSettingsController'. +ERROR: - 'ChatEncryptionSettingsController' is from 'package:fluffychat/pages/chat_encryption_settings/chat_encryption_settings.dart' ('lib/pages/chat_encryption_settings/chat_encryption_settings.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: message: L10n.of(context).enableEncryptionWarning, +ERROR: ^^^^ +ERROR: lib/pages/chat_encryption_settings/chat_encryption_settings.dart:62:16: Error: The getter 'L10n' isn't defined for the class 'ChatEncryptionSettingsController'. +ERROR: - 'ChatEncryptionSettingsController' is from 'package:fluffychat/pages/chat_encryption_settings/chat_encryption_settings.dart' ('lib/pages/chat_encryption_settings/chat_encryption_settings.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: okLabel: L10n.of(context).yes, +ERROR: ^^^^ +ERROR: lib/pages/chat_encryption_settings/chat_encryption_settings.dart:63:20: Error: The getter 'L10n' isn't defined for the class 'ChatEncryptionSettingsController'. +ERROR: - 'ChatEncryptionSettingsController' is from 'package:fluffychat/pages/chat_encryption_settings/chat_encryption_settings.dart' ('lib/pages/chat_encryption_settings/chat_encryption_settings.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: cancelLabel: L10n.of(context).cancel, +ERROR: ^^^^ +ERROR: lib/pages/chat_encryption_settings/chat_encryption_settings.dart:75:14: Error: The getter 'L10n' isn't defined for the class 'ChatEncryptionSettingsController'. +ERROR: - 'ChatEncryptionSettingsController' is from 'package:fluffychat/pages/chat_encryption_settings/chat_encryption_settings.dart' ('lib/pages/chat_encryption_settings/chat_encryption_settings.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).verifyOtherUser, +ERROR: ^^^^ +ERROR: lib/pages/chat_encryption_settings/chat_encryption_settings.dart:76:16: Error: The getter 'L10n' isn't defined for the class 'ChatEncryptionSettingsController'. +ERROR: - 'ChatEncryptionSettingsController' is from 'package:fluffychat/pages/chat_encryption_settings/chat_encryption_settings.dart' ('lib/pages/chat_encryption_settings/chat_encryption_settings.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: message: L10n.of(context).verifyOtherUserDescription, +ERROR: ^^^^ +ERROR: lib/pages/chat_encryption_settings/chat_encryption_settings.dart:77:16: Error: The getter 'L10n' isn't defined for the class 'ChatEncryptionSettingsController'. +ERROR: - 'ChatEncryptionSettingsController' is from 'package:fluffychat/pages/chat_encryption_settings/chat_encryption_settings.dart' ('lib/pages/chat_encryption_settings/chat_encryption_settings.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: okLabel: L10n.of(context).ok, +ERROR: ^^^^ +ERROR: lib/pages/chat_encryption_settings/chat_encryption_settings.dart:78:20: Error: The getter 'L10n' isn't defined for the class 'ChatEncryptionSettingsController'. +ERROR: - 'ChatEncryptionSettingsController' is from 'package:fluffychat/pages/chat_encryption_settings/chat_encryption_settings.dart' ('lib/pages/chat_encryption_settings/chat_encryption_settings.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: cancelLabel: L10n.of(context).cancel, +ERROR: ^^^^ +ERROR: lib/pages/chat_list/chat_list.dart:59:16: Error: The getter 'L10n' isn't defined for the class 'ActiveFilter'. +ERROR: - 'ActiveFilter' is from 'package:fluffychat/pages/chat_list/chat_list.dart' ('lib/pages/chat_list/chat_list.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: return L10n.of(context).all; +ERROR: ^^^^ +ERROR: lib/pages/chat_list/chat_list.dart:61:16: Error: The getter 'L10n' isn't defined for the class 'ActiveFilter'. +ERROR: - 'ActiveFilter' is from 'package:fluffychat/pages/chat_list/chat_list.dart' ('lib/pages/chat_list/chat_list.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: return L10n.of(context).messages; +ERROR: ^^^^ +ERROR: lib/pages/chat_list/chat_list.dart:63:16: Error: The getter 'L10n' isn't defined for the class 'ActiveFilter'. +ERROR: - 'ActiveFilter' is from 'package:fluffychat/pages/chat_list/chat_list.dart' ('lib/pages/chat_list/chat_list.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: return L10n.of(context).unread; +ERROR: ^^^^ +ERROR: lib/pages/chat_list/chat_list.dart:65:16: Error: The getter 'L10n' isn't defined for the class 'ActiveFilter'. +ERROR: - 'ActiveFilter' is from 'package:fluffychat/pages/chat_list/chat_list.dart' ('lib/pages/chat_list/chat_list.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: return L10n.of(context).groups; +ERROR: ^^^^ +ERROR: lib/pages/chat_list/chat_list.dart:67:16: Error: The getter 'L10n' isn't defined for the class 'ActiveFilter'. +ERROR: - 'ActiveFilter' is from 'package:fluffychat/pages/chat_list/chat_list.dart' ('lib/pages/chat_list/chat_list.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: return L10n.of(context).spaces; +ERROR: ^^^^ +ERROR: lib/pages/chat_list/chat_list.dart:123:25: Error: The getter 'L10n' isn't defined for the class 'ChatListController'. +ERROR: - 'ChatListController' is from 'package:fluffychat/pages/chat_list/chat_list.dart' ('lib/pages/chat_list/chat_list.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: content: Text(L10n.of(context).youHaveBeenBannedFromThisChat), +ERROR: ^^^^ +ERROR: lib/pages/chat_list/chat_list.dart:176:14: Error: The getter 'L10n' isn't defined for the class 'ChatListController'. +ERROR: - 'ChatListController' is from 'package:fluffychat/pages/chat_list/chat_list.dart' ('lib/pages/chat_list/chat_list.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).changeTheHomeserver, +ERROR: ^^^^ +ERROR: lib/pages/chat_list/chat_list.dart:178:16: Error: The getter 'L10n' isn't defined for the class 'ChatListController'. +ERROR: - 'ChatListController' is from 'package:fluffychat/pages/chat_list/chat_list.dart' ('lib/pages/chat_list/chat_list.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: okLabel: L10n.of(context).ok, +ERROR: ^^^^ +ERROR: lib/pages/chat_list/chat_list.dart:179:20: Error: The getter 'L10n' isn't defined for the class 'ChatListController'. +ERROR: - 'ChatListController' is from 'package:fluffychat/pages/chat_list/chat_list.dart' ('lib/pages/chat_list/chat_list.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: cancelLabel: L10n.of(context).cancel, +ERROR: ^^^^ +ERROR: lib/pages/chat_list/chat_list.dart:187:13: Error: The getter 'L10n' isn't defined for the class 'ChatListController'. +ERROR: - 'ChatListController' is from 'package:fluffychat/pages/chat_list/chat_list.dart' ('lib/pages/chat_list/chat_list.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: : L10n.of(context).invalidServerName, +ERROR: ^^^^ +ERROR: lib/pages/chat_list/chat_list.dart:446:51: Error: The getter 'L10n' isn't defined for the class 'ChatListController'. +ERROR: - 'ChatListController' is from 'package:fluffychat/pages/chat_list/chat_list.dart' ('lib/pages/chat_list/chat_list.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: room.getLocalizedDisplayname(MatrixLocals(L10n.of(context))); +ERROR: ^^^^ +ERROR: lib/pages/chat_list/chat_list.dart:499:21: Error: The getter 'L10n' isn't defined for the class 'ChatListController'. +ERROR: - 'ChatListController' is from 'package:fluffychat/pages/chat_list/chat_list.dart' ('lib/pages/chat_list/chat_list.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).goToSpace(space.getLocalizedDisplayname()), +ERROR: ^^^^ +ERROR: lib/pages/chat_list/chat_list.dart:519:25: Error: The getter 'L10n' isn't defined for the class 'ChatListController'. +ERROR: - 'ChatListController' is from 'package:fluffychat/pages/chat_list/chat_list.dart' ('lib/pages/chat_list/chat_list.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: ? L10n.of(context).muteChat +ERROR: ^^^^ +ERROR: lib/pages/chat_list/chat_list.dart:520:25: Error: The getter 'L10n' isn't defined for the class 'ChatListController'. +ERROR: - 'ChatListController' is from 'package:fluffychat/pages/chat_list/chat_list.dart' ('lib/pages/chat_list/chat_list.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: : L10n.of(context).unmuteChat, +ERROR: ^^^^ +ERROR: lib/pages/chat_list/chat_list.dart:538:25: Error: The getter 'L10n' isn't defined for the class 'ChatListController'. +ERROR: - 'ChatListController' is from 'package:fluffychat/pages/chat_list/chat_list.dart' ('lib/pages/chat_list/chat_list.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: ? L10n.of(context).markAsRead +ERROR: ^^^^ +ERROR: lib/pages/chat_list/chat_list.dart:539:25: Error: The getter 'L10n' isn't defined for the class 'ChatListController'. +ERROR: - 'ChatListController' is from 'package:fluffychat/pages/chat_list/chat_list.dart' ('lib/pages/chat_list/chat_list.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: : L10n.of(context).markAsUnread, +ERROR: ^^^^ +ERROR: lib/pages/chat_list/chat_list.dart:555:25: Error: The getter 'L10n' isn't defined for the class 'ChatListController'. +ERROR: - 'ChatListController' is from 'package:fluffychat/pages/chat_list/chat_list.dart' ('lib/pages/chat_list/chat_list.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: ? L10n.of(context).unpin +ERROR: ^^^^ +ERROR: lib/pages/chat_list/chat_list.dart:556:25: Error: The getter 'L10n' isn't defined for the class 'ChatListController'. +ERROR: - 'ChatListController' is from 'package:fluffychat/pages/chat_list/chat_list.dart' ('lib/pages/chat_list/chat_list.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: : L10n.of(context).pin, +ERROR: ^^^^ +ERROR: lib/pages/chat_list/chat_list.dart:569:24: Error: The getter 'L10n' isn't defined for the class 'ChatListController'. +ERROR: - 'ChatListController' is from 'package:fluffychat/pages/chat_list/chat_list.dart' ('lib/pages/chat_list/chat_list.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: Text(L10n.of(context).addToSpace), +ERROR: ^^^^ +ERROR: lib/pages/chat_list/chat_list.dart:586:19: Error: The getter 'L10n' isn't defined for the class 'ChatListController'. +ERROR: - 'ChatListController' is from 'package:fluffychat/pages/chat_list/chat_list.dart' ('lib/pages/chat_list/chat_list.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).accept, +ERROR: ^^^^ +ERROR: lib/pages/chat_list/chat_list.dart:604:17: Error: The getter 'L10n' isn't defined for the class 'ChatListController'. +ERROR: - 'ChatListController' is from 'package:fluffychat/pages/chat_list/chat_list.dart' ('lib/pages/chat_list/chat_list.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).block, +ERROR: ^^^^ +ERROR: lib/pages/chat_list/chat_list.dart:622:23: Error: The getter 'L10n' isn't defined for the class 'ChatListController'. +ERROR: - 'ChatListController' is from 'package:fluffychat/pages/chat_list/chat_list.dart' ('lib/pages/chat_list/chat_list.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: ? L10n.of(context).delete +ERROR: ^^^^ +ERROR: lib/pages/chat_list/chat_list.dart:623:23: Error: The getter 'L10n' isn't defined for the class 'ChatListController'. +ERROR: - 'ChatListController' is from 'package:fluffychat/pages/chat_list/chat_list.dart' ('lib/pages/chat_list/chat_list.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: : L10n.of(context).leave, +ERROR: ^^^^ +ERROR: lib/pages/chat_list/chat_list.dart:684:18: Error: The getter 'L10n' isn't defined for the class 'ChatListController'. +ERROR: - 'ChatListController' is from 'package:fluffychat/pages/chat_list/chat_list.dart' ('lib/pages/chat_list/chat_list.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).areYouSure, +ERROR: ^^^^ +ERROR: lib/pages/chat_list/chat_list.dart:685:20: Error: The getter 'L10n' isn't defined for the class 'ChatListController'. +ERROR: - 'ChatListController' is from 'package:fluffychat/pages/chat_list/chat_list.dart' ('lib/pages/chat_list/chat_list.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: message: L10n.of(context).archiveRoomDescription, +ERROR: ^^^^ +ERROR: lib/pages/chat_list/chat_list.dart:686:20: Error: The getter 'L10n' isn't defined for the class 'ChatListController'. +ERROR: - 'ChatListController' is from 'package:fluffychat/pages/chat_list/chat_list.dart' ('lib/pages/chat_list/chat_list.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: okLabel: L10n.of(context).leave, +ERROR: ^^^^ +ERROR: lib/pages/chat_list/chat_list.dart:687:24: Error: The getter 'L10n' isn't defined for the class 'ChatListController'. +ERROR: - 'ChatListController' is from 'package:fluffychat/pages/chat_list/chat_list.dart' ('lib/pages/chat_list/chat_list.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: cancelLabel: L10n.of(context).cancel, +ERROR: ^^^^ +ERROR: lib/pages/chat_list/chat_list.dart:699:18: Error: The getter 'L10n' isn't defined for the class 'ChatListController'. +ERROR: - 'ChatListController' is from 'package:fluffychat/pages/chat_list/chat_list.dart' ('lib/pages/chat_list/chat_list.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).space, +ERROR: ^^^^ +ERROR: lib/pages/chat_list/chat_list.dart:705:61: Error: The getter 'L10n' isn't defined for the class 'ChatListController'. +ERROR: - 'ChatListController' is from 'package:fluffychat/pages/chat_list/chat_list.dart' ('lib/pages/chat_list/chat_list.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: .getLocalizedDisplayname(MatrixLocals(L10n.of(context))), +ERROR: ^^^^ +ERROR: lib/pages/chat_list/chat_list.dart:724:14: Error: The getter 'L10n' isn't defined for the class 'ChatListController'. +ERROR: - 'ChatListController' is from 'package:fluffychat/pages/chat_list/chat_list.dart' ('lib/pages/chat_list/chat_list.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).hidePresences, +ERROR: ^^^^ +ERROR: lib/pages/chat_list/chat_list.dart:740:14: Error: The getter 'L10n' isn't defined for the class 'ChatListController'. +ERROR: - 'ChatListController' is from 'package:fluffychat/pages/chat_list/chat_list.dart' ('lib/pages/chat_list/chat_list.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).setStatus, +ERROR: ^^^^ +ERROR: lib/pages/chat_list/chat_list.dart:741:16: Error: The getter 'L10n' isn't defined for the class 'ChatListController'. +ERROR: - 'ChatListController' is from 'package:fluffychat/pages/chat_list/chat_list.dart' ('lib/pages/chat_list/chat_list.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: message: L10n.of(context).leaveEmptyToClearStatus, +ERROR: ^^^^ +ERROR: lib/pages/chat_list/chat_list.dart:742:16: Error: The getter 'L10n' isn't defined for the class 'ChatListController'. +ERROR: - 'ChatListController' is from 'package:fluffychat/pages/chat_list/chat_list.dart' ('lib/pages/chat_list/chat_list.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: okLabel: L10n.of(context).ok, +ERROR: ^^^^ +ERROR: lib/pages/chat_list/chat_list.dart:743:20: Error: The getter 'L10n' isn't defined for the class 'ChatListController'. +ERROR: - 'ChatListController' is from 'package:fluffychat/pages/chat_list/chat_list.dart' ('lib/pages/chat_list/chat_list.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: cancelLabel: L10n.of(context).cancel, +ERROR: ^^^^ +ERROR: lib/pages/chat_list/chat_list.dart:744:17: Error: The getter 'L10n' isn't defined for the class 'ChatListController'. +ERROR: - 'ChatListController' is from 'package:fluffychat/pages/chat_list/chat_list.dart' ('lib/pages/chat_list/chat_list.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: hintText: L10n.of(context).statusExampleMessage, +ERROR: ^^^^ +ERROR: lib/pages/chat_list/chat_list.dart:799:13: Error: The getter 'L10n' isn't defined for the class 'ChatListController'. +ERROR: - 'ChatListController' is from 'package:fluffychat/pages/chat_list/chat_list.dart' ('lib/pages/chat_list/chat_list.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).oneOfYourDevicesIsNotVerified, +ERROR: ^^^^ +ERROR: lib/pages/chat_list/chat_list.dart:810:20: Error: The getter 'L10n' isn't defined for the class 'ChatListController'. +ERROR: - 'ChatListController' is from 'package:fluffychat/pages/chat_list/chat_list.dart' ('lib/pages/chat_list/chat_list.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: label: L10n.of(context).settings, +ERROR: ^^^^ +ERROR: lib/pages/chat_list/chat_list.dart:848:18: Error: The getter 'L10n' isn't defined for the class 'ChatListController'. +ERROR: - 'ChatListController' is from 'package:fluffychat/pages/chat_list/chat_list.dart' ('lib/pages/chat_list/chat_list.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: final l10n = L10n.of(context); +ERROR: ^^^^ +ERROR: lib/pages/chat_list/chat_list.dart:854:14: Error: The getter 'L10n' isn't defined for the class 'ChatListController'. +ERROR: - 'ChatListController' is from 'package:fluffychat/pages/chat_list/chat_list.dart' ('lib/pages/chat_list/chat_list.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).editBundlesForAccount, +ERROR: ^^^^ +ERROR: lib/pages/chat_list/chat_list.dart:855:20: Error: The getter 'L10n' isn't defined for the class 'ChatListController'. +ERROR: - 'ChatListController' is from 'package:fluffychat/pages/chat_list/chat_list.dart' ('lib/pages/chat_list/chat_list.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: cancelLabel: L10n.of(context).cancel, +ERROR: ^^^^ +ERROR: lib/pages/chat_list/chat_list.dart:859:18: Error: The getter 'L10n' isn't defined for the class 'ChatListController'. +ERROR: - 'ChatListController' is from 'package:fluffychat/pages/chat_list/chat_list.dart' ('lib/pages/chat_list/chat_list.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: label: L10n.of(context).addToBundle, +ERROR: ^^^^ +ERROR: lib/pages/chat_list/chat_list.dart:864:20: Error: The getter 'L10n' isn't defined for the class 'ChatListController'. +ERROR: - 'ChatListController' is from 'package:fluffychat/pages/chat_list/chat_list.dart' ('lib/pages/chat_list/chat_list.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: label: L10n.of(context).removeFromBundle, +ERROR: ^^^^ +ERROR: lib/pages/chat_permissions_settings/chat_permissions_settings.dart:34:32: Error: The getter 'L10n' isn't defined for the class 'ChatPermissionsSettingsController'. +ERROR: - 'ChatPermissionsSettingsController' is from 'package:fluffychat/pages/chat_permissions_settings/chat_permissions_settings.dart' ('lib/pages/chat_permissions_settings/chat_permissions_settings.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: SnackBar(content: Text(L10n.of(context).noPermission)), +ERROR: ^^^^ +ERROR: lib/pages/device_settings/device_settings.dart:57:18: Error: The getter 'L10n' isn't defined for the class 'DevicesSettingsController'. +ERROR: - 'DevicesSettingsController' is from 'package:fluffychat/pages/device_settings/device_settings.dart' ('lib/pages/device_settings/device_settings.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).areYouSure, +ERROR: ^^^^ +ERROR: lib/pages/device_settings/device_settings.dart:58:20: Error: The getter 'L10n' isn't defined for the class 'DevicesSettingsController'. +ERROR: - 'DevicesSettingsController' is from 'package:fluffychat/pages/device_settings/device_settings.dart' ('lib/pages/device_settings/device_settings.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: okLabel: L10n.of(context).remove, +ERROR: ^^^^ +ERROR: lib/pages/device_settings/device_settings.dart:59:24: Error: The getter 'L10n' isn't defined for the class 'DevicesSettingsController'. +ERROR: - 'DevicesSettingsController' is from 'package:fluffychat/pages/device_settings/device_settings.dart' ('lib/pages/device_settings/device_settings.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: cancelLabel: L10n.of(context).cancel, +ERROR: ^^^^ +ERROR: lib/pages/device_settings/device_settings.dart:60:20: Error: The getter 'L10n' isn't defined for the class 'DevicesSettingsController'. +ERROR: - 'DevicesSettingsController' is from 'package:fluffychat/pages/device_settings/device_settings.dart' ('lib/pages/device_settings/device_settings.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: message: L10n.of(context).removeDevicesDescription, +ERROR: ^^^^ +ERROR: lib/pages/device_settings/device_settings.dart:88:14: Error: The getter 'L10n' isn't defined for the class 'DevicesSettingsController'. +ERROR: - 'DevicesSettingsController' is from 'package:fluffychat/pages/device_settings/device_settings.dart' ('lib/pages/device_settings/device_settings.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).changeDeviceName, +ERROR: ^^^^ +ERROR: lib/pages/device_settings/device_settings.dart:89:16: Error: The getter 'L10n' isn't defined for the class 'DevicesSettingsController'. +ERROR: - 'DevicesSettingsController' is from 'package:fluffychat/pages/device_settings/device_settings.dart' ('lib/pages/device_settings/device_settings.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: okLabel: L10n.of(context).ok, +ERROR: ^^^^ +ERROR: lib/pages/device_settings/device_settings.dart:90:20: Error: The getter 'L10n' isn't defined for the class 'DevicesSettingsController'. +ERROR: - 'DevicesSettingsController' is from 'package:fluffychat/pages/device_settings/device_settings.dart' ('lib/pages/device_settings/device_settings.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: cancelLabel: L10n.of(context).cancel, +ERROR: ^^^^ +ERROR: lib/pages/device_settings/device_settings.dart:108:14: Error: The getter 'L10n' isn't defined for the class 'DevicesSettingsController'. +ERROR: - 'DevicesSettingsController' is from 'package:fluffychat/pages/device_settings/device_settings.dart' ('lib/pages/device_settings/device_settings.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).verifyOtherDevice, +ERROR: ^^^^ +ERROR: lib/pages/device_settings/device_settings.dart:109:16: Error: The getter 'L10n' isn't defined for the class 'DevicesSettingsController'. +ERROR: - 'DevicesSettingsController' is from 'package:fluffychat/pages/device_settings/device_settings.dart' ('lib/pages/device_settings/device_settings.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: message: L10n.of(context).verifyOtherDeviceDescription, +ERROR: ^^^^ +ERROR: lib/pages/device_settings/device_settings.dart:110:16: Error: The getter 'L10n' isn't defined for the class 'DevicesSettingsController'. +ERROR: - 'DevicesSettingsController' is from 'package:fluffychat/pages/device_settings/device_settings.dart' ('lib/pages/device_settings/device_settings.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: okLabel: L10n.of(context).ok, +ERROR: ^^^^ +ERROR: lib/pages/device_settings/device_settings.dart:111:20: Error: The getter 'L10n' isn't defined for the class 'DevicesSettingsController'. +ERROR: - 'DevicesSettingsController' is from 'package:fluffychat/pages/device_settings/device_settings.dart' ('lib/pages/device_settings/device_settings.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: cancelLabel: L10n.of(context).cancel, +ERROR: ^^^^ +ERROR: lib/pages/homeserver_picker/homeserver_picker.dart:52:18: Error: The getter 'L10n' isn't defined for the class 'HomeserverPickerController'. +ERROR: - 'HomeserverPickerController' is from 'package:fluffychat/pages/homeserver_picker/homeserver_picker.dart' ('lib/pages/homeserver_picker/homeserver_picker.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).indexedDbErrorTitle, +ERROR: ^^^^ +ERROR: lib/pages/homeserver_picker/homeserver_picker.dart:53:20: Error: The getter 'L10n' isn't defined for the class 'HomeserverPickerController'. +ERROR: - 'HomeserverPickerController' is from 'package:fluffychat/pages/homeserver_picker/homeserver_picker.dart' ('lib/pages/homeserver_picker/homeserver_picker.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: message: L10n.of(context).indexedDbErrorLong, +ERROR: ^^^^ +ERROR: lib/pages/homeserver_picker/homeserver_picker.dart:84:18: Error: The getter 'L10n' isn't defined for the class 'HomeserverPickerController'. +ERROR: - 'HomeserverPickerController' is from 'package:fluffychat/pages/homeserver_picker/homeserver_picker.dart' ('lib/pages/homeserver_picker/homeserver_picker.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: final l10n = L10n.of(context); +ERROR: ^^^^ +ERROR: lib/pages/invitation_selection/invitation_selection.dart:66:25: Error: The getter 'L10n' isn't defined for the class 'InvitationSelectionController'. +ERROR: - 'InvitationSelectionController' is from 'package:fluffychat/pages/invitation_selection/invitation_selection.dart' ('lib/pages/invitation_selection/invitation_selection.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: content: Text(L10n.of(context).contactHasBeenInvitedToTheGroup), +ERROR: ^^^^ +ERROR: lib/pages/login/login.dart:37:38: Error: The getter 'L10n' isn't defined for the class 'LoginController'. +ERROR: - 'LoginController' is from 'package:fluffychat/pages/login/login.dart' ('lib/pages/login/login.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: setState(() => usernameError = L10n.of(context).pleaseEnterYourUsername); +ERROR: ^^^^ +ERROR: lib/pages/login/login.dart:42:38: Error: The getter 'L10n' isn't defined for the class 'LoginController'. +ERROR: - 'LoginController' is from 'package:fluffychat/pages/login/login.dart' ('lib/pages/login/login.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: setState(() => passwordError = L10n.of(context).pleaseEnterYourPassword); +ERROR: ^^^^ +ERROR: lib/pages/login/login.dart:132:20: Error: The getter 'L10n' isn't defined for the class 'LoginController'. +ERROR: - 'LoginController' is from 'package:fluffychat/pages/login/login.dart' ('lib/pages/login/login.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context) +ERROR: ^^^^ +ERROR: lib/pages/login/login.dart:134:22: Error: The getter 'L10n' isn't defined for the class 'LoginController'. +ERROR: - 'LoginController' is from 'package:fluffychat/pages/login/login.dart' ('lib/pages/login/login.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: okLabel: L10n.of(context).ok, +ERROR: ^^^^ +ERROR: lib/pages/login/login.dart:135:26: Error: The getter 'L10n' isn't defined for the class 'LoginController'. +ERROR: - 'LoginController' is from 'package:fluffychat/pages/login/login.dart' ('lib/pages/login/login.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: cancelLabel: L10n.of(context).cancel, +ERROR: ^^^^ +ERROR: lib/pages/login/login.dart:163:14: Error: The getter 'L10n' isn't defined for the class 'LoginController'. +ERROR: - 'LoginController' is from 'package:fluffychat/pages/login/login.dart' ('lib/pages/login/login.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).passwordForgotten, +ERROR: ^^^^ +ERROR: lib/pages/login/login.dart:164:16: Error: The getter 'L10n' isn't defined for the class 'LoginController'. +ERROR: - 'LoginController' is from 'package:fluffychat/pages/login/login.dart' ('lib/pages/login/login.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: message: L10n.of(context).enterAnEmailAddress, +ERROR: ^^^^ +ERROR: lib/pages/login/login.dart:165:16: Error: The getter 'L10n' isn't defined for the class 'LoginController'. +ERROR: - 'LoginController' is from 'package:fluffychat/pages/login/login.dart' ('lib/pages/login/login.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: okLabel: L10n.of(context).ok, +ERROR: ^^^^ +ERROR: lib/pages/login/login.dart:166:20: Error: The getter 'L10n' isn't defined for the class 'LoginController'. +ERROR: - 'LoginController' is from 'package:fluffychat/pages/login/login.dart' ('lib/pages/login/login.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: cancelLabel: L10n.of(context).cancel, +ERROR: ^^^^ +ERROR: lib/pages/login/login.dart:169:17: Error: The getter 'L10n' isn't defined for the class 'LoginController'. +ERROR: - 'LoginController' is from 'package:fluffychat/pages/login/login.dart' ('lib/pages/login/login.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: hintText: L10n.of(context).enterAnEmailAddress, +ERROR: ^^^^ +ERROR: lib/pages/login/login.dart:187:14: Error: The getter 'L10n' isn't defined for the class 'LoginController'. +ERROR: - 'LoginController' is from 'package:fluffychat/pages/login/login.dart' ('lib/pages/login/login.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).passwordForgotten, +ERROR: ^^^^ +ERROR: lib/pages/login/login.dart:188:16: Error: The getter 'L10n' isn't defined for the class 'LoginController'. +ERROR: - 'LoginController' is from 'package:fluffychat/pages/login/login.dart' ('lib/pages/login/login.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: message: L10n.of(context).chooseAStrongPassword, +ERROR: ^^^^ +ERROR: lib/pages/login/login.dart:189:16: Error: The getter 'L10n' isn't defined for the class 'LoginController'. +ERROR: - 'LoginController' is from 'package:fluffychat/pages/login/login.dart' ('lib/pages/login/login.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: okLabel: L10n.of(context).ok, +ERROR: ^^^^ +ERROR: lib/pages/login/login.dart:190:20: Error: The getter 'L10n' isn't defined for the class 'LoginController'. +ERROR: - 'LoginController' is from 'package:fluffychat/pages/login/login.dart' ('lib/pages/login/login.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: cancelLabel: L10n.of(context).cancel, +ERROR: ^^^^ +ERROR: lib/pages/login/login.dart:200:14: Error: The getter 'L10n' isn't defined for the class 'LoginController'. +ERROR: - 'LoginController' is from 'package:fluffychat/pages/login/login.dart' ('lib/pages/login/login.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).weSentYouAnEmail, +ERROR: ^^^^ +ERROR: lib/pages/login/login.dart:201:16: Error: The getter 'L10n' isn't defined for the class 'LoginController'. +ERROR: - 'LoginController' is from 'package:fluffychat/pages/login/login.dart' ('lib/pages/login/login.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: message: L10n.of(context).pleaseClickOnLink, +ERROR: ^^^^ +ERROR: lib/pages/login/login.dart:202:16: Error: The getter 'L10n' isn't defined for the class 'LoginController'. +ERROR: - 'LoginController' is from 'package:fluffychat/pages/login/login.dart' ('lib/pages/login/login.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: okLabel: L10n.of(context).iHaveClickedOnLink, +ERROR: ^^^^ +ERROR: lib/pages/login/login.dart:226:32: Error: The getter 'L10n' isn't defined for the class 'LoginController'. +ERROR: - 'LoginController' is from 'package:fluffychat/pages/login/login.dart' ('lib/pages/login/login.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: SnackBar(content: Text(L10n.of(context).passwordHasBeenChanged)), +ERROR: ^^^^ +ERROR: lib/pages/new_group/new_group.dart:127:32: Error: The getter 'L10n' isn't defined for the class 'NewGroupController'. +ERROR: - 'NewGroupController' is from 'package:fluffychat/pages/new_group/new_group.dart' ('lib/pages/new_group/new_group.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: setState(() => error = L10n.of(context).pleaseFillOut); +ERROR: ^^^^ +ERROR: lib/pages/new_private_chat/new_private_chat.dart:77:15: Error: The getter 'L10n' isn't defined for the class 'NewPrivateChatController'. +ERROR: - 'NewPrivateChatController' is from 'package:fluffychat/pages/new_private_chat/new_private_chat.dart' ('lib/pages/new_private_chat/new_private_chat.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).unsupportedAndroidVersionLong, +ERROR: ^^^^ +ERROR: lib/pages/new_private_chat/new_private_chat.dart:97:30: Error: The getter 'L10n' isn't defined for the class 'NewPrivateChatController'. +ERROR: - 'NewPrivateChatController' is from 'package:fluffychat/pages/new_private_chat/new_private_chat.dart' ('lib/pages/new_private_chat/new_private_chat.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: SnackBar(content: Text(L10n.of(context).copiedToClipboard)), +ERROR: ^^^^ +ERROR: lib/pages/settings/settings.dart:41:14: Error: The getter 'L10n' isn't defined for the class 'SettingsController'. +ERROR: - 'SettingsController' is from 'package:fluffychat/pages/settings/settings.dart' ('lib/pages/settings/settings.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).editDisplayname, +ERROR: ^^^^ +ERROR: lib/pages/settings/settings.dart:42:16: Error: The getter 'L10n' isn't defined for the class 'SettingsController'. +ERROR: - 'SettingsController' is from 'package:fluffychat/pages/settings/settings.dart' ('lib/pages/settings/settings.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: okLabel: L10n.of(context).ok, +ERROR: ^^^^ +ERROR: lib/pages/settings/settings.dart:43:20: Error: The getter 'L10n' isn't defined for the class 'SettingsController'. +ERROR: - 'SettingsController' is from 'package:fluffychat/pages/settings/settings.dart' ('lib/pages/settings/settings.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: cancelLabel: L10n.of(context).cancel, +ERROR: ^^^^ +ERROR: lib/pages/settings/settings.dart:63:18: Error: The getter 'L10n' isn't defined for the class 'SettingsController'. +ERROR: - 'SettingsController' is from 'package:fluffychat/pages/settings/settings.dart' ('lib/pages/settings/settings.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).areYouSureYouWantToLogout, +ERROR: ^^^^ +ERROR: lib/pages/settings/settings.dart:64:20: Error: The getter 'L10n' isn't defined for the class 'SettingsController'. +ERROR: - 'SettingsController' is from 'package:fluffychat/pages/settings/settings.dart' ('lib/pages/settings/settings.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: message: L10n.of(context).noBackupWarning, +ERROR: ^^^^ +ERROR: lib/pages/settings/settings.dart:66:20: Error: The getter 'L10n' isn't defined for the class 'SettingsController'. +ERROR: - 'SettingsController' is from 'package:fluffychat/pages/settings/settings.dart' ('lib/pages/settings/settings.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: okLabel: L10n.of(context).logout, +ERROR: ^^^^ +ERROR: lib/pages/settings/settings.dart:67:24: Error: The getter 'L10n' isn't defined for the class 'SettingsController'. +ERROR: - 'SettingsController' is from 'package:fluffychat/pages/settings/settings.dart' ('lib/pages/settings/settings.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: cancelLabel: L10n.of(context).cancel, +ERROR: ^^^^ +ERROR: lib/pages/settings/settings.dart:85:18: Error: The getter 'L10n' isn't defined for the class 'SettingsController'. +ERROR: - 'SettingsController' is from 'package:fluffychat/pages/settings/settings.dart' ('lib/pages/settings/settings.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: label: L10n.of(context).openCamera, +ERROR: ^^^^ +ERROR: lib/pages/settings/settings.dart:91:16: Error: The getter 'L10n' isn't defined for the class 'SettingsController'. +ERROR: - 'SettingsController' is from 'package:fluffychat/pages/settings/settings.dart' ('lib/pages/settings/settings.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: label: L10n.of(context).openGallery, +ERROR: ^^^^ +ERROR: lib/pages/settings/settings.dart:97:18: Error: The getter 'L10n' isn't defined for the class 'SettingsController'. +ERROR: - 'SettingsController' is from 'package:fluffychat/pages/settings/settings.dart' ('lib/pages/settings/settings.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: label: L10n.of(context).removeYourAvatar, +ERROR: ^^^^ +ERROR: lib/pages/settings/settings.dart:106:20: Error: The getter 'L10n' isn't defined for the class 'SettingsController'. +ERROR: - 'SettingsController' is from 'package:fluffychat/pages/settings/settings.dart' ('lib/pages/settings/settings.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).changeYourAvatar, +ERROR: ^^^^ +ERROR: lib/pages/settings/settings.dart:107:26: Error: The getter 'L10n' isn't defined for the class 'SettingsController'. +ERROR: - 'SettingsController' is from 'package:fluffychat/pages/settings/settings.dart' ('lib/pages/settings/settings.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: cancelLabel: L10n.of(context).cancel, +ERROR: ^^^^ +ERROR: lib/pages/settings/settings.dart:190:16: Error: The getter 'L10n' isn't defined for the class 'SettingsController'. +ERROR: - 'SettingsController' is from 'package:fluffychat/pages/settings/settings.dart' ('lib/pages/settings/settings.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).chatBackup, +ERROR: ^^^^ +ERROR: lib/pages/settings/settings.dart:191:18: Error: The getter 'L10n' isn't defined for the class 'SettingsController'. +ERROR: - 'SettingsController' is from 'package:fluffychat/pages/settings/settings.dart' ('lib/pages/settings/settings.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: message: L10n.of(context).onlineKeyBackupEnabled, +ERROR: ^^^^ +ERROR: lib/pages/settings/settings.dart:192:18: Error: The getter 'L10n' isn't defined for the class 'SettingsController'. +ERROR: - 'SettingsController' is from 'package:fluffychat/pages/settings/settings.dart' ('lib/pages/settings/settings.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: okLabel: L10n.of(context).close, +ERROR: ^^^^ +ERROR: lib/pages/settings_3pid/settings_3pid.dart:26:14: Error: The getter 'L10n' isn't defined for the class 'Settings3PidController'. +ERROR: - 'Settings3PidController' is from 'package:fluffychat/pages/settings_3pid/settings_3pid.dart' ('lib/pages/settings_3pid/settings_3pid.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).enterAnEmailAddress, +ERROR: ^^^^ +ERROR: lib/pages/settings_3pid/settings_3pid.dart:27:16: Error: The getter 'L10n' isn't defined for the class 'Settings3PidController'. +ERROR: - 'Settings3PidController' is from 'package:fluffychat/pages/settings_3pid/settings_3pid.dart' ('lib/pages/settings_3pid/settings_3pid.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: okLabel: L10n.of(context).ok, +ERROR: ^^^^ +ERROR: lib/pages/settings_3pid/settings_3pid.dart:28:20: Error: The getter 'L10n' isn't defined for the class 'Settings3PidController'. +ERROR: - 'Settings3PidController' is from 'package:fluffychat/pages/settings_3pid/settings_3pid.dart' ('lib/pages/settings_3pid/settings_3pid.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: cancelLabel: L10n.of(context).cancel, +ERROR: ^^^^ +ERROR: lib/pages/settings_3pid/settings_3pid.dart:29:17: Error: The getter 'L10n' isn't defined for the class 'Settings3PidController'. +ERROR: - 'Settings3PidController' is from 'package:fluffychat/pages/settings_3pid/settings_3pid.dart' ('lib/pages/settings_3pid/settings_3pid.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: hintText: L10n.of(context).enterAnEmailAddress, +ERROR: ^^^^ +ERROR: lib/pages/settings_3pid/settings_3pid.dart:46:14: Error: The getter 'L10n' isn't defined for the class 'Settings3PidController'. +ERROR: - 'Settings3PidController' is from 'package:fluffychat/pages/settings_3pid/settings_3pid.dart' ('lib/pages/settings_3pid/settings_3pid.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).weSentYouAnEmail, +ERROR: ^^^^ +ERROR: lib/pages/settings_3pid/settings_3pid.dart:47:16: Error: The getter 'L10n' isn't defined for the class 'Settings3PidController'. +ERROR: - 'Settings3PidController' is from 'package:fluffychat/pages/settings_3pid/settings_3pid.dart' ('lib/pages/settings_3pid/settings_3pid.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: message: L10n.of(context).pleaseClickOnLink, +ERROR: ^^^^ +ERROR: lib/pages/settings_3pid/settings_3pid.dart:48:16: Error: The getter 'L10n' isn't defined for the class 'Settings3PidController'. +ERROR: - 'Settings3PidController' is from 'package:fluffychat/pages/settings_3pid/settings_3pid.dart' ('lib/pages/settings_3pid/settings_3pid.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: okLabel: L10n.of(context).iHaveClickedOnLink, +ERROR: ^^^^ +ERROR: lib/pages/settings_3pid/settings_3pid.dart:72:18: Error: The getter 'L10n' isn't defined for the class 'Settings3PidController'. +ERROR: - 'Settings3PidController' is from 'package:fluffychat/pages/settings_3pid/settings_3pid.dart' ('lib/pages/settings_3pid/settings_3pid.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).areYouSure, +ERROR: ^^^^ +ERROR: lib/pages/settings_3pid/settings_3pid.dart:73:20: Error: The getter 'L10n' isn't defined for the class 'Settings3PidController'. +ERROR: - 'Settings3PidController' is from 'package:fluffychat/pages/settings_3pid/settings_3pid.dart' ('lib/pages/settings_3pid/settings_3pid.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: okLabel: L10n.of(context).yes, +ERROR: ^^^^ +ERROR: lib/pages/settings_3pid/settings_3pid.dart:74:24: Error: The getter 'L10n' isn't defined for the class 'Settings3PidController'. +ERROR: - 'Settings3PidController' is from 'package:fluffychat/pages/settings_3pid/settings_3pid.dart' ('lib/pages/settings_3pid/settings_3pid.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: cancelLabel: L10n.of(context).cancel, +ERROR: ^^^^ +ERROR: lib/pages/settings_emotes/settings_emotes.dart:142:16: Error: The getter 'L10n' isn't defined for the class 'EmotesSettingsController'. +ERROR: - 'EmotesSettingsController' is from 'package:fluffychat/pages/settings_emotes/settings_emotes.dart' ('lib/pages/settings_emotes/settings_emotes.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).emoteExists, +ERROR: ^^^^ +ERROR: lib/pages/settings_emotes/settings_emotes.dart:143:18: Error: The getter 'L10n' isn't defined for the class 'EmotesSettingsController'. +ERROR: - 'EmotesSettingsController' is from 'package:fluffychat/pages/settings_emotes/settings_emotes.dart' ('lib/pages/settings_emotes/settings_emotes.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: okLabel: L10n.of(context).ok, +ERROR: ^^^^ +ERROR: lib/pages/settings_emotes/settings_emotes.dart:152:16: Error: The getter 'L10n' isn't defined for the class 'EmotesSettingsController'. +ERROR: - 'EmotesSettingsController' is from 'package:fluffychat/pages/settings_emotes/settings_emotes.dart' ('lib/pages/settings_emotes/settings_emotes.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).emoteInvalid, +ERROR: ^^^^ +ERROR: lib/pages/settings_emotes/settings_emotes.dart:153:18: Error: The getter 'L10n' isn't defined for the class 'EmotesSettingsController'. +ERROR: - 'EmotesSettingsController' is from 'package:fluffychat/pages/settings_emotes/settings_emotes.dart' ('lib/pages/settings_emotes/settings_emotes.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: okLabel: L10n.of(context).ok, +ERROR: ^^^^ +ERROR: lib/pages/settings_emotes/settings_emotes.dart:188:16: Error: The getter 'L10n' isn't defined for the class 'EmotesSettingsController'. +ERROR: - 'EmotesSettingsController' is from 'package:fluffychat/pages/settings_emotes/settings_emotes.dart' ('lib/pages/settings_emotes/settings_emotes.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).emoteWarnNeedToPick, +ERROR: ^^^^ +ERROR: lib/pages/settings_emotes/settings_emotes.dart:189:18: Error: The getter 'L10n' isn't defined for the class 'EmotesSettingsController'. +ERROR: - 'EmotesSettingsController' is from 'package:fluffychat/pages/settings_emotes/settings_emotes.dart' ('lib/pages/settings_emotes/settings_emotes.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: okLabel: L10n.of(context).ok, +ERROR: ^^^^ +ERROR: lib/pages/settings_emotes/settings_emotes.dart:198:16: Error: The getter 'L10n' isn't defined for the class 'EmotesSettingsController'. +ERROR: - 'EmotesSettingsController' is from 'package:fluffychat/pages/settings_emotes/settings_emotes.dart' ('lib/pages/settings_emotes/settings_emotes.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).emoteExists, +ERROR: ^^^^ +ERROR: lib/pages/settings_emotes/settings_emotes.dart:199:18: Error: The getter 'L10n' isn't defined for the class 'EmotesSettingsController'. +ERROR: - 'EmotesSettingsController' is from 'package:fluffychat/pages/settings_emotes/settings_emotes.dart' ('lib/pages/settings_emotes/settings_emotes.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: okLabel: L10n.of(context).ok, +ERROR: ^^^^ +ERROR: lib/pages/settings_emotes/settings_emotes.dart:207:16: Error: The getter 'L10n' isn't defined for the class 'EmotesSettingsController'. +ERROR: - 'EmotesSettingsController' is from 'package:fluffychat/pages/settings_emotes/settings_emotes.dart' ('lib/pages/settings_emotes/settings_emotes.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).emoteInvalid, +ERROR: ^^^^ +ERROR: lib/pages/settings_emotes/settings_emotes.dart:208:18: Error: The getter 'L10n' isn't defined for the class 'EmotesSettingsController'. +ERROR: - 'EmotesSettingsController' is from 'package:fluffychat/pages/settings_emotes/settings_emotes.dart' ('lib/pages/settings_emotes/settings_emotes.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: okLabel: L10n.of(context).ok, +ERROR: ^^^^ +ERROR: lib/pages/settings_ignore_list/settings_ignore_list.dart:38:21: Error: The getter 'L10n' isn't defined for the class 'SettingsIgnoreListController'. +ERROR: - 'SettingsIgnoreListController' is from 'package:fluffychat/pages/settings_ignore_list/settings_ignore_list.dart' ('lib/pages/settings_ignore_list/settings_ignore_list.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: errorText = L10n.of(context).invalidInput; +ERROR: ^^^^ +ERROR: lib/pages/settings_notifications/settings_notifications.dart:34:20: Error: The getter 'L10n' isn't defined for the class 'SettingsNotificationsController'. +ERROR: - 'SettingsNotificationsController' is from 'package:fluffychat/pages/settings_notifications/settings_notifications.dart' ('lib/pages/settings_notifications/settings_notifications.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: cancelLabel: L10n.of(context).cancel, +ERROR: ^^^^ +ERROR: lib/pages/settings_notifications/settings_notifications.dart:37:18: Error: The getter 'L10n' isn't defined for the class 'SettingsNotificationsController'. +ERROR: - 'SettingsNotificationsController' is from 'package:fluffychat/pages/settings_notifications/settings_notifications.dart' ('lib/pages/settings_notifications/settings_notifications.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: label: L10n.of(context).delete, +ERROR: ^^^^ +ERROR: lib/pages/settings_notifications/settings_notifications.dart:108:44: Error: The getter 'L10n' isn't defined for the class 'SettingsNotificationsController'. +ERROR: - 'SettingsNotificationsController' is from 'package:fluffychat/pages/settings_notifications/settings_notifications.dart' ('lib/pages/settings_notifications/settings_notifications.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(rule.getPushRuleName(L10n.of(context))), +ERROR: ^^^^ +ERROR: lib/pages/settings_notifications/settings_notifications.dart:129:27: Error: The getter 'L10n' isn't defined for the class 'SettingsNotificationsController'. +ERROR: - 'SettingsNotificationsController' is from 'package:fluffychat/pages/settings_notifications/settings_notifications.dart' ('lib/pages/settings_notifications/settings_notifications.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: child: Text(L10n.of(context).close), +ERROR: ^^^^ +ERROR: lib/pages/settings_notifications/settings_notifications.dart:136:19: Error: The getter 'L10n' isn't defined for the class 'SettingsNotificationsController'. +ERROR: - 'SettingsNotificationsController' is from 'package:fluffychat/pages/settings_notifications/settings_notifications.dart' ('lib/pages/settings_notifications/settings_notifications.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).delete, +ERROR: ^^^^ +ERROR: lib/pages/settings_notifications/settings_notifications.dart:150:18: Error: The getter 'L10n' isn't defined for the class 'SettingsNotificationsController'. +ERROR: - 'SettingsNotificationsController' is from 'package:fluffychat/pages/settings_notifications/settings_notifications.dart' ('lib/pages/settings_notifications/settings_notifications.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).areYouSure, +ERROR: ^^^^ +ERROR: lib/pages/settings_notifications/settings_notifications.dart:151:20: Error: The getter 'L10n' isn't defined for the class 'SettingsNotificationsController'. +ERROR: - 'SettingsNotificationsController' is from 'package:fluffychat/pages/settings_notifications/settings_notifications.dart' ('lib/pages/settings_notifications/settings_notifications.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: message: L10n.of(context).deletePushRuleCanNotBeUndone, +ERROR: ^^^^ +ERROR: lib/pages/settings_notifications/settings_notifications.dart:152:20: Error: The getter 'L10n' isn't defined for the class 'SettingsNotificationsController'. +ERROR: - 'SettingsNotificationsController' is from 'package:fluffychat/pages/settings_notifications/settings_notifications.dart' ('lib/pages/settings_notifications/settings_notifications.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: okLabel: L10n.of(context).delete, +ERROR: ^^^^ +ERROR: lib/pages/settings_password/settings_password.dart:34:28: Error: The getter 'L10n' isn't defined for the class 'SettingsPasswordController'. +ERROR: - 'SettingsPasswordController' is from 'package:fluffychat/pages/settings_password/settings_password.dart' ('lib/pages/settings_password/settings_password.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: oldPasswordError = L10n.of(context).pleaseEnterYourPassword; +ERROR: ^^^^ +ERROR: lib/pages/settings_password/settings_password.dart:41:29: Error: The getter 'L10n' isn't defined for the class 'SettingsPasswordController'. +ERROR: - 'SettingsPasswordController' is from 'package:fluffychat/pages/settings_password/settings_password.dart' ('lib/pages/settings_password/settings_password.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: newPassword1Error = L10n.of(context).pleaseChooseAStrongPassword; +ERROR: ^^^^ +ERROR: lib/pages/settings_password/settings_password.dart:47:29: Error: The getter 'L10n' isn't defined for the class 'SettingsPasswordController'. +ERROR: - 'SettingsPasswordController' is from 'package:fluffychat/pages/settings_password/settings_password.dart' ('lib/pages/settings_password/settings_password.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: newPassword2Error = L10n.of(context).passwordsDoNotMatch; +ERROR: ^^^^ +ERROR: lib/pages/settings_password/settings_password.dart:63:25: Error: The getter 'L10n' isn't defined for the class 'SettingsPasswordController'. +ERROR: - 'SettingsPasswordController' is from 'package:fluffychat/pages/settings_password/settings_password.dart' ('lib/pages/settings_password/settings_password.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: content: Text(L10n.of(context).passwordHasBeenChanged), +ERROR: ^^^^ +ERROR: lib/pages/settings_security/settings_security.dart:30:14: Error: The getter 'L10n' isn't defined for the class 'SettingsSecurityController'. +ERROR: - 'SettingsSecurityController' is from 'package:fluffychat/pages/settings_security/settings_security.dart' ('lib/pages/settings_security/settings_security.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).pleaseChooseAPasscode, +ERROR: ^^^^ +ERROR: lib/pages/settings_security/settings_security.dart:31:16: Error: The getter 'L10n' isn't defined for the class 'SettingsSecurityController'. +ERROR: - 'SettingsSecurityController' is from 'package:fluffychat/pages/settings_security/settings_security.dart' ('lib/pages/settings_security/settings_security.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: message: L10n.of(context).pleaseEnter4Digits, +ERROR: ^^^^ +ERROR: lib/pages/settings_security/settings_security.dart:32:20: Error: The getter 'L10n' isn't defined for the class 'SettingsSecurityController'. +ERROR: - 'SettingsSecurityController' is from 'package:fluffychat/pages/settings_security/settings_security.dart' ('lib/pages/settings_security/settings_security.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: cancelLabel: L10n.of(context).cancel, +ERROR: ^^^^ +ERROR: lib/pages/settings_security/settings_security.dart:37:16: Error: The getter 'L10n' isn't defined for the class 'SettingsSecurityController'. +ERROR: - 'SettingsSecurityController' is from 'package:fluffychat/pages/settings_security/settings_security.dart' ('lib/pages/settings_security/settings_security.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: return L10n.of(context).pleaseEnter4Digits; +ERROR: ^^^^ +ERROR: lib/pages/settings_security/settings_security.dart:54:18: Error: The getter 'L10n' isn't defined for the class 'SettingsSecurityController'. +ERROR: - 'SettingsSecurityController' is from 'package:fluffychat/pages/settings_security/settings_security.dart' ('lib/pages/settings_security/settings_security.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).warning, +ERROR: ^^^^ +ERROR: lib/pages/settings_security/settings_security.dart:55:20: Error: The getter 'L10n' isn't defined for the class 'SettingsSecurityController'. +ERROR: - 'SettingsSecurityController' is from 'package:fluffychat/pages/settings_security/settings_security.dart' ('lib/pages/settings_security/settings_security.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: message: L10n.of(context).deactivateAccountWarning, +ERROR: ^^^^ +ERROR: lib/pages/settings_security/settings_security.dart:56:20: Error: The getter 'L10n' isn't defined for the class 'SettingsSecurityController'. +ERROR: - 'SettingsSecurityController' is from 'package:fluffychat/pages/settings_security/settings_security.dart' ('lib/pages/settings_security/settings_security.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: okLabel: L10n.of(context).ok, +ERROR: ^^^^ +ERROR: lib/pages/settings_security/settings_security.dart:57:24: Error: The getter 'L10n' isn't defined for the class 'SettingsSecurityController'. +ERROR: - 'SettingsSecurityController' is from 'package:fluffychat/pages/settings_security/settings_security.dart' ('lib/pages/settings_security/settings_security.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: cancelLabel: L10n.of(context).cancel, +ERROR: ^^^^ +ERROR: lib/pages/settings_security/settings_security.dart:67:14: Error: The getter 'L10n' isn't defined for the class 'SettingsSecurityController'. +ERROR: - 'SettingsSecurityController' is from 'package:fluffychat/pages/settings_security/settings_security.dart' ('lib/pages/settings_security/settings_security.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).confirmMatrixId, +ERROR: ^^^^ +ERROR: lib/pages/settings_security/settings_security.dart:72:16: Error: The getter 'L10n' isn't defined for the class 'SettingsSecurityController'. +ERROR: - 'SettingsSecurityController' is from 'package:fluffychat/pages/settings_security/settings_security.dart' ('lib/pages/settings_security/settings_security.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: okLabel: L10n.of(context).delete, +ERROR: ^^^^ +ERROR: lib/pages/settings_security/settings_security.dart:73:20: Error: The getter 'L10n' isn't defined for the class 'SettingsSecurityController'. +ERROR: - 'SettingsSecurityController' is from 'package:fluffychat/pages/settings_security/settings_security.dart' ('lib/pages/settings_security/settings_security.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: cancelLabel: L10n.of(context).cancel, +ERROR: ^^^^ +ERROR: lib/pages/settings_security/settings_security.dart:70:13: Error: The getter 'L10n' isn't defined for the class 'SettingsSecurityController'. +ERROR: - 'SettingsSecurityController' is from 'package:fluffychat/pages/settings_security/settings_security.dart' ('lib/pages/settings_security/settings_security.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: : L10n.of(context).supposedMxid(supposedMxid), +ERROR: ^^^^ +ERROR: lib/pages/settings_security/settings_security.dart:81:14: Error: The getter 'L10n' isn't defined for the class 'SettingsSecurityController'. +ERROR: - 'SettingsSecurityController' is from 'package:fluffychat/pages/settings_security/settings_security.dart' ('lib/pages/settings_security/settings_security.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).pleaseEnterYourPassword, +ERROR: ^^^^ +ERROR: lib/pages/settings_security/settings_security.dart:82:16: Error: The getter 'L10n' isn't defined for the class 'SettingsSecurityController'. +ERROR: - 'SettingsSecurityController' is from 'package:fluffychat/pages/settings_security/settings_security.dart' ('lib/pages/settings_security/settings_security.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: okLabel: L10n.of(context).ok, +ERROR: ^^^^ +ERROR: lib/pages/settings_security/settings_security.dart:83:20: Error: The getter 'L10n' isn't defined for the class 'SettingsSecurityController'. +ERROR: - 'SettingsSecurityController' is from 'package:fluffychat/pages/settings_security/settings_security.dart' ('lib/pages/settings_security/settings_security.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: cancelLabel: L10n.of(context).cancel, +ERROR: ^^^^ +ERROR: lib/widgets/share_scaffold_dialog.dart:81:21: Error: The getter 'L10n' isn't defined for the class '_ShareScaffoldDialogState'. +ERROR: - '_ShareScaffoldDialogState' is from 'package:fluffychat/widgets/share_scaffold_dialog.dart' ('lib/widgets/share_scaffold_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(L10n.of(context).share), +ERROR: ^^^^ +ERROR: lib/widgets/share_scaffold_dialog.dart:103:27: Error: The getter 'L10n' isn't defined for the class '_ShareScaffoldDialogState'. +ERROR: - '_ShareScaffoldDialogState' is from 'package:fluffychat/widgets/share_scaffold_dialog.dart' ('lib/widgets/share_scaffold_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: hintText: L10n.of(context).search, +ERROR: ^^^^ +ERROR: lib/widgets/share_scaffold_dialog.dart:124:30: Error: The getter 'L10n' isn't defined for the class '_ShareScaffoldDialogState'. +ERROR: - '_ShareScaffoldDialogState' is from 'package:fluffychat/widgets/share_scaffold_dialog.dart' ('lib/widgets/share_scaffold_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: MatrixLocals(L10n.of(context)), +ERROR: ^^^^ +ERROR: lib/widgets/share_scaffold_dialog.dart:171:33: Error: The getter 'L10n' isn't defined for the class '_ShareScaffoldDialogState'. +ERROR: - '_ShareScaffoldDialogState' is from 'package:fluffychat/widgets/share_scaffold_dialog.dart' ('lib/widgets/share_scaffold_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: child: Text(L10n.of(context).forward), +ERROR: ^^^^ +ERROR: lib/widgets/lock_screen.dart:33:22: Error: The getter 'L10n' isn't defined for the class '_LockScreenState'. +ERROR: - '_LockScreenState' is from 'package:fluffychat/widgets/lock_screen.dart' ('lib/widgets/lock_screen.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: _errorText = L10n.of(context).invalidInput; +ERROR: ^^^^ +ERROR: lib/widgets/lock_screen.dart:49:20: Error: The getter 'L10n' isn't defined for the class '_LockScreenState'. +ERROR: - '_LockScreenState' is from 'package:fluffychat/widgets/lock_screen.dart' ('lib/widgets/lock_screen.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: _errorText = L10n.of(context).wrongPinEntered(_coolDownSeconds); +ERROR: ^^^^ +ERROR: lib/widgets/lock_screen.dart:66:21: Error: The getter 'L10n' isn't defined for the class '_LockScreenState'. +ERROR: - '_LockScreenState' is from 'package:fluffychat/widgets/lock_screen.dart' ('lib/widgets/lock_screen.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(L10n.of(context).pleaseEnterYourPin), +ERROR: ^^^^ +ERROR: lib/widgets/adaptive_dialogs/show_text_input_dialog.dart:85:42: Error: Undefined name 'L10n'. +ERROR: child: Text(cancelLabel ?? L10n.of(context).cancel), +ERROR: ^^^^ +ERROR: lib/widgets/adaptive_dialogs/show_text_input_dialog.dart:99:28: Error: Undefined name 'L10n'. +ERROR: okLabel ?? L10n.of(context).ok, +ERROR: ^^^^ +ERROR: lib/pages/dialer/dialer.dart:137:22: Error: The getter 'L10n' isn't defined for the class 'MyCallingPage'. +ERROR: - 'MyCallingPage' is from 'package:fluffychat/pages/dialer/dialer.dart' ('lib/pages/dialer/dialer.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: MatrixLocals(L10n.of(widget.context)), +ERROR: ^^^^ +ERROR: lib/pages/dialer/dialer.dart:299:17: Error: The getter 'L10n' isn't defined for the class 'MyCallingPage'. +ERROR: - 'MyCallingPage' is from 'package:fluffychat/pages/dialer/dialer.dart' ('lib/pages/dialer/dialer.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(widget.context).foregroundServiceRunning, +ERROR: ^^^^ +ERROR: lib/pages/dialer/dialer.dart:305:30: Error: The getter 'L10n' isn't defined for the class 'MyCallingPage'. +ERROR: - 'MyCallingPage' is from 'package:fluffychat/pages/dialer/dialer.dart' ('lib/pages/dialer/dialer.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: notificationTitle: L10n.of(widget.context).screenSharingTitle, +ERROR: ^^^^ +ERROR: lib/pages/dialer/dialer.dart:306:29: Error: The getter 'L10n' isn't defined for the class 'MyCallingPage'. +ERROR: - 'MyCallingPage' is from 'package:fluffychat/pages/dialer/dialer.dart' ('lib/pages/dialer/dialer.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: notificationText: L10n.of(widget.context).screenSharingDetail, +ERROR: ^^^^ +ERROR: lib/pages/dialer/dialer.dart:460:24: Error: The getter 'L10n' isn't defined for the class 'MyCallingPage'. +ERROR: - 'MyCallingPage' is from 'package:fluffychat/pages/dialer/dialer.dart' ('lib/pages/dialer/dialer.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: MatrixLocals(L10n.of(widget.context)), +ERROR: ^^^^ +ERROR: lib/utils/url_launcher.dart:41:32: Error: The getter 'L10n' isn't defined for the class 'UrlLauncher'. +ERROR: - 'UrlLauncher' is from 'package:fluffychat/utils/url_launcher.dart' ('lib/utils/url_launcher.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: SnackBar(content: Text(L10n.of(context).cantOpenUri(url!))), +ERROR: ^^^^ +ERROR: lib/utils/url_launcher.dart:51:16: Error: The getter 'L10n' isn't defined for the class 'UrlLauncher'. +ERROR: - 'UrlLauncher' is from 'package:fluffychat/utils/url_launcher.dart' ('lib/utils/url_launcher.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).openLinkInBrowser, +ERROR: ^^^^ +ERROR: lib/utils/url_launcher.dart:53:18: Error: The getter 'L10n' isn't defined for the class 'UrlLauncher'. +ERROR: - 'UrlLauncher' is from 'package:fluffychat/utils/url_launcher.dart' ('lib/utils/url_launcher.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: okLabel: L10n.of(context).open, +ERROR: ^^^^ +ERROR: lib/utils/url_launcher.dart:54:22: Error: The getter 'L10n' isn't defined for the class 'UrlLauncher'. +ERROR: - 'UrlLauncher' is from 'package:fluffychat/utils/url_launcher.dart' ('lib/utils/url_launcher.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: cancelLabel: L10n.of(context).cancel, +ERROR: ^^^^ +ERROR: lib/utils/url_launcher.dart:95:32: Error: The getter 'L10n' isn't defined for the class 'UrlLauncher'. +ERROR: - 'UrlLauncher' is from 'package:fluffychat/utils/url_launcher.dart' ('lib/utils/url_launcher.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: SnackBar(content: Text(L10n.of(context).cantOpenUri(url!))), +ERROR: ^^^^ +ERROR: lib/utils/localized_exception_extension.dart:34:14: Error: The getter 'L10n' isn't defined for the class 'Object'. +ERROR: - 'Object' is from 'dart:core'. +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: return L10n.of(context).fileIsTooBigForServer( +ERROR: ^^^^ +ERROR: lib/utils/localized_exception_extension.dart:39:14: Error: The getter 'L10n' isn't defined for the class 'Object'. +ERROR: - 'Object' is from 'dart:core'. +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: return L10n.of(context).otherPartyNotLoggedIn; +ERROR: ^^^^ +ERROR: lib/utils/localized_exception_extension.dart:45:20: Error: The getter 'L10n' isn't defined for the class 'Object'. +ERROR: - 'Object' is from 'dart:core'. +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: return L10n.of(context).passwordIsWrong; +ERROR: ^^^^ +ERROR: lib/utils/localized_exception_extension.dart:47:18: Error: The getter 'L10n' isn't defined for the class 'Object'. +ERROR: - 'Object' is from 'dart:core'. +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: return L10n.of(context).noPermission; +ERROR: ^^^^ +ERROR: lib/utils/localized_exception_extension.dart:49:18: Error: The getter 'L10n' isn't defined for the class 'Object'. +ERROR: - 'Object' is from 'dart:core'. +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: return L10n.of(context).tooManyRequestsWarning; +ERROR: ^^^^ +ERROR: lib/utils/localized_exception_extension.dart:52:20: Error: The getter 'L10n' isn't defined for the class 'Object'. +ERROR: - 'Object' is from 'dart:core'. +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: return L10n.of(context).unableToJoinChat; +ERROR: ^^^^ +ERROR: lib/utils/localized_exception_extension.dart:58:14: Error: The getter 'L10n' isn't defined for the class 'Object'. +ERROR: - 'Object' is from 'dart:core'. +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: return L10n.of(context).wrongRecoveryKey; +ERROR: ^^^^ +ERROR: lib/utils/localized_exception_extension.dart:71:14: Error: The getter 'L10n' isn't defined for the class 'Object'. +ERROR: - 'Object' is from 'dart:core'. +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: return L10n.of(context).badServerLoginTypesException( +ERROR: ^^^^ +ERROR: lib/utils/localized_exception_extension.dart:81:14: Error: The getter 'L10n' isn't defined for the class 'Object'. +ERROR: - 'Object' is from 'dart:core'. +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: return L10n.of(context).noConnectionToTheServer; +ERROR: ^^^^ +ERROR: lib/utils/localized_exception_extension.dart:85:14: Error: The getter 'L10n' isn't defined for the class 'Object'. +ERROR: - 'Object' is from 'dart:core'. +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: return L10n.of(context).doesNotSeemToBeAValidHomeserver; +ERROR: ^^^^ +ERROR: lib/utils/localized_exception_extension.dart:89:14: Error: The getter 'L10n' isn't defined for the class 'Object'. +ERROR: - 'Object' is from 'dart:core'. +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: return L10n.of(context).noContactInformationProvided; +ERROR: ^^^^ +ERROR: lib/utils/localized_exception_extension.dart:95:14: Error: The getter 'L10n' isn't defined for the class 'Object'. +ERROR: - 'Object' is from 'dart:core'. +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: return L10n.of(context).unableToJoinChat; +ERROR: ^^^^ +ERROR: lib/utils/localized_exception_extension.dart:99:12: Error: The getter 'L10n' isn't defined for the class 'Object'. +ERROR: - 'Object' is from 'dart:core'. +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: return L10n.of(context).oopsSomethingWentWrong; +ERROR: ^^^^ +ERROR: lib/pages/archive/archive_view.dart:23:23: Error: The getter 'L10n' isn't defined for the class 'ArchiveView'. +ERROR: - 'ArchiveView' is from 'package:fluffychat/pages/archive/archive_view.dart' ('lib/pages/archive/archive_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(L10n.of(context).archive), +ERROR: ^^^^ +ERROR: lib/pages/archive/archive_view.dart:30:31: Error: The getter 'L10n' isn't defined for the class 'ArchiveView'. +ERROR: - 'ArchiveView' is from 'package:fluffychat/pages/archive/archive_view.dart' ('lib/pages/archive/archive_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: label: Text(L10n.of(context).clearArchive), +ERROR: ^^^^ +ERROR: lib/pages/archive/archive_view.dart:43:21: Error: The getter 'L10n' isn't defined for the class 'ArchiveView'. +ERROR: - 'ArchiveView' is from 'package:fluffychat/pages/archive/archive_view.dart' ('lib/pages/archive/archive_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).oopsSomethingWentWrong, +ERROR: ^^^^ +ERROR: lib/pages/chat/recovered_event_dialog.dart:56:16: Error: The getter 'L10n' isn't defined for the class 'RecoveredEventDialogState'. +ERROR: - 'RecoveredEventDialogState' is from 'package:fluffychat/pages/chat/recovered_event_dialog.dart' ('lib/pages/chat/recovered_event_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(L10n.of(context).recoveredMessage) +ERROR: ^^^^ +ERROR: lib/pages/chat/translated_event_dialog.dart:56:16: Error: The getter 'L10n' isn't defined for the class 'TranslatedEventDialogState'. +ERROR: - 'TranslatedEventDialogState' is from 'package:fluffychat/pages/chat/translated_event_dialog.dart' ('lib/pages/chat/translated_event_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(L10n.of(context).translatedMessage) +ERROR: ^^^^ +ERROR: lib/pages/chat/chat_view.dart:44:22: Error: The getter 'L10n' isn't defined for the class 'ChatView'. +ERROR: - 'ChatView' is from 'package:fluffychat/pages/chat/chat_view.dart' ('lib/pages/chat/chat_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: tooltip: L10n.of(context).edit, +ERROR: ^^^^ +ERROR: lib/pages/chat/chat_view.dart:49:20: Error: The getter 'L10n' isn't defined for the class 'ChatView'. +ERROR: - 'ChatView' is from 'package:fluffychat/pages/chat/chat_view.dart' ('lib/pages/chat/chat_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: tooltip: L10n.of(context).copy, +ERROR: ^^^^ +ERROR: lib/pages/chat/chat_view.dart:55:20: Error: The getter 'L10n' isn't defined for the class 'ChatView'. +ERROR: - 'ChatView' is from 'package:fluffychat/pages/chat/chat_view.dart' ('lib/pages/chat/chat_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: tooltip: L10n.of(context).translateMessage, +ERROR: ^^^^ +ERROR: lib/pages/chat/chat_view.dart:63:24: Error: The getter 'L10n' isn't defined for the class 'ChatView'. +ERROR: - 'ChatView' is from 'package:fluffychat/pages/chat/chat_view.dart' ('lib/pages/chat/chat_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: tooltip: L10n.of(context).share, +ERROR: ^^^^ +ERROR: lib/pages/chat/chat_view.dart:71:22: Error: The getter 'L10n' isn't defined for the class 'ChatView'. +ERROR: - 'ChatView' is from 'package:fluffychat/pages/chat/chat_view.dart' ('lib/pages/chat/chat_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: tooltip: L10n.of(context).pinMessage, +ERROR: ^^^^ +ERROR: lib/pages/chat/chat_view.dart:76:22: Error: The getter 'L10n' isn't defined for the class 'ChatView'. +ERROR: - 'ChatView' is from 'package:fluffychat/pages/chat/chat_view.dart' ('lib/pages/chat/chat_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: tooltip: L10n.of(context).redactMessage, +ERROR: ^^^^ +ERROR: lib/pages/chat/chat_view.dart:106:26: Error: The getter 'L10n' isn't defined for the class 'ChatView'. +ERROR: - 'ChatView' is from 'package:fluffychat/pages/chat/chat_view.dart' ('lib/pages/chat/chat_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: Text(L10n.of(context).messageInfo), +ERROR: ^^^^ +ERROR: lib/pages/chat/chat_view.dart:116:26: Error: The getter 'L10n' isn't defined for the class 'ChatView'. +ERROR: - 'ChatView' is from 'package:fluffychat/pages/chat/chat_view.dart' ('lib/pages/chat/chat_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: Text(L10n.of(context).recoverMessage), +ERROR: ^^^^ +ERROR: lib/pages/chat/chat_view.dart:130:28: Error: The getter 'L10n' isn't defined for the class 'ChatView'. +ERROR: - 'ChatView' is from 'package:fluffychat/pages/chat/chat_view.dart' ('lib/pages/chat/chat_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: Text(L10n.of(context).reportMessage), +ERROR: ^^^^ +ERROR: lib/pages/chat/chat_view.dart:145:22: Error: The getter 'L10n' isn't defined for the class 'ChatView'. +ERROR: - 'ChatView' is from 'package:fluffychat/pages/chat/chat_view.dart' ('lib/pages/chat/chat_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: tooltip: L10n.of(context).placeCall, +ERROR: ^^^^ +ERROR: lib/pages/chat/chat_view.dart:205:34: Error: The getter 'L10n' isn't defined for the class 'ChatView'. +ERROR: - 'ChatView' is from 'package:fluffychat/pages/chat/chat_view.dart' ('lib/pages/chat/chat_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: tooltip: L10n.of(context).close, +ERROR: ^^^^ +ERROR: lib/pages/chat/chat_view.dart:236:38: Error: The getter 'L10n' isn't defined for the class 'ChatView'. +ERROR: - 'ChatView' is from 'package:fluffychat/pages/chat/chat_view.dart' ('lib/pages/chat/chat_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: tooltip: L10n.of(context).close, +ERROR: ^^^^ +ERROR: lib/pages/chat/chat_view.dart:242:34: Error: The getter 'L10n' isn't defined for the class 'ChatView'. +ERROR: - 'ChatView' is from 'package:fluffychat/pages/chat/chat_view.dart' ('lib/pages/chat/chat_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).jumpToLastReadMessage, +ERROR: ^^^^ +ERROR: lib/pages/chat/chat_view.dart:250:41: Error: The getter 'L10n' isn't defined for the class 'ChatView'. +ERROR: - 'ChatView' is from 'package:fluffychat/pages/chat/chat_view.dart' ('lib/pages/chat/chat_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: child: Text(L10n.of(context).jump), +ERROR: ^^^^ +ERROR: lib/pages/chat/chat_view.dart:318:45: Error: The getter 'L10n' isn't defined for the class 'ChatView'. +ERROR: - 'ChatView' is from 'package:fluffychat/pages/chat/chat_view.dart' ('lib/pages/chat/chat_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: label: Text(L10n.of(context).enterNewChat), +ERROR: ^^^^ +ERROR: lib/pages/chat/chat_view.dart:354:47: Error: The getter 'L10n' isn't defined for the class 'ChatView'. +ERROR: - 'ChatView' is from 'package:fluffychat/pages/chat/chat_view.dart' ('lib/pages/chat/chat_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).leave, +ERROR: ^^^^ +ERROR: lib/pages/chat/chat_view.dart:368:47: Error: The getter 'L10n' isn't defined for the class 'ChatView'. +ERROR: - 'ChatView' is from 'package:fluffychat/pages/chat/chat_view.dart' ('lib/pages/chat/chat_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).reopenChat, +ERROR: ^^^^ +ERROR: lib/pages/chat/event_info_dialog.dart:17:35: Error: The getter 'L10n' isn't defined for the class 'Event'. +ERROR: - 'Event' is from 'package:matrix/src/event.dart' ('../../.pub-cache/hosted/pub.dev/matrix-0.40.0/lib/src/event.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: EventInfoDialog(l10n: L10n.of(context), event: this), +ERROR: ^^^^ +ERROR: lib/pages/chat/event_info_dialog.dart:23:9: Error: 'L10n' isn't a type. +ERROR: final L10n l10n; +ERROR: ^^^^ +ERROR: lib/pages/chat/event_info_dialog.dart:44:21: Error: The getter 'L10n' isn't defined for the class 'EventInfoDialog'. +ERROR: - 'EventInfoDialog' is from 'package:fluffychat/pages/chat/event_info_dialog.dart' ('lib/pages/chat/event_info_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(L10n.of(context).messageInfo), +ERROR: ^^^^ +ERROR: lib/pages/chat/event_info_dialog.dart:58:25: Error: The getter 'L10n' isn't defined for the class 'EventInfoDialog'. +ERROR: - 'EventInfoDialog' is from 'package:fluffychat/pages/chat/event_info_dialog.dart' ('lib/pages/chat/event_info_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(L10n.of(context).sender), +ERROR: ^^^^ +ERROR: lib/pages/chat/event_info_dialog.dart:64:28: Error: The getter 'L10n' isn't defined for the class 'EventInfoDialog'. +ERROR: - 'EventInfoDialog' is from 'package:fluffychat/pages/chat/event_info_dialog.dart' ('lib/pages/chat/event_info_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text('${L10n.of(context).time}:'), +ERROR: ^^^^ +ERROR: lib/pages/chat/event_info_dialog.dart:68:28: Error: The getter 'L10n' isn't defined for the class 'EventInfoDialog'. +ERROR: - 'EventInfoDialog' is from 'package:fluffychat/pages/chat/event_info_dialog.dart' ('lib/pages/chat/event_info_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text('${L10n.of(context).status}:'), +ERROR: ^^^^ +ERROR: lib/pages/chat/event_info_dialog.dart:71:35: Error: The getter 'L10n' isn't defined for the class 'EventInfoDialog'. +ERROR: - 'EventInfoDialog' is from 'package:fluffychat/pages/chat/event_info_dialog.dart' ('lib/pages/chat/event_info_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: ListTile(title: Text('${L10n.of(context).sourceCode}:')), +ERROR: ^^^^ +ERROR: lib/pages/chat/event_info_dialog.dart:90:37: Error: The getter 'L10n' isn't defined for the class 'EventInfoDialog'. +ERROR: - 'EventInfoDialog' is from 'package:fluffychat/pages/chat/event_info_dialog.dart' ('lib/pages/chat/event_info_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: ListTile(title: Text('${L10n.of(context).encrypted}:')), +ERROR: ^^^^ +ERROR: lib/pages/chat/recording_dialog.dart:140:16: Error: The getter 'L10n' isn't defined for the class 'RecordingDialogState'. +ERROR: - 'RecordingDialogState' is from 'package:fluffychat/pages/chat/recording_dialog.dart' ('lib/pages/chat/recording_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: ? Text(L10n.of(context).oopsSomethingWentWrong) +ERROR: ^^^^ +ERROR: lib/pages/chat/recording_dialog.dart:188:15: Error: The getter 'L10n' isn't defined for the class 'RecordingDialogState'. +ERROR: - 'RecordingDialogState' is from 'package:fluffychat/pages/chat/recording_dialog.dart' ('lib/pages/chat/recording_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).cancel, +ERROR: ^^^^ +ERROR: lib/pages/chat/recording_dialog.dart:197:27: Error: The getter 'L10n' isn't defined for the class 'RecordingDialogState'. +ERROR: - 'RecordingDialogState' is from 'package:fluffychat/pages/chat/recording_dialog.dart' ('lib/pages/chat/recording_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: child: Text(L10n.of(context).send), +ERROR: ^^^^ +ERROR: lib/pages/chat/recording_dialog.dart:208:13: Error: The getter 'L10n' isn't defined for the class 'RecordingDialogState'. +ERROR: - 'RecordingDialogState' is from 'package:fluffychat/pages/chat/recording_dialog.dart' ('lib/pages/chat/recording_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).cancel, +ERROR: ^^^^ +ERROR: lib/pages/chat/recording_dialog.dart:217:25: Error: The getter 'L10n' isn't defined for the class 'RecordingDialogState'. +ERROR: - 'RecordingDialogState' is from 'package:fluffychat/pages/chat/recording_dialog.dart' ('lib/pages/chat/recording_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: child: Text(L10n.of(context).send), +ERROR: ^^^^ +ERROR: lib/pages/chat/send_file_dialog.dart:50:18: Error: The getter 'L10n' isn't defined for the class 'SendFileDialogState'. +ERROR: - 'SendFileDialogState' is from 'package:fluffychat/pages/chat/send_file_dialog.dart' ('lib/pages/chat/send_file_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: final l10n = L10n.of(context); +ERROR: ^^^^ +ERROR: lib/pages/chat/send_file_dialog.dart:200:19: Error: The getter 'L10n' isn't defined for the class 'SendFileDialogState'. +ERROR: - 'SendFileDialogState' is from 'package:fluffychat/pages/chat/send_file_dialog.dart' ('lib/pages/chat/send_file_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: var sendStr = L10n.of(context).sendFile; +ERROR: ^^^^ +ERROR: lib/pages/chat/send_file_dialog.dart:209:11: Error: The getter 'L10n' isn't defined for the class 'SendFileDialogState'. +ERROR: - 'SendFileDialogState' is from 'package:fluffychat/pages/chat/send_file_dialog.dart' ('lib/pages/chat/send_file_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: : L10n.of(context).countFiles(widget.files.length); +ERROR: ^^^^ +ERROR: lib/pages/chat/send_file_dialog.dart:218:19: Error: The getter 'L10n' isn't defined for the class 'SendFileDialogState'. +ERROR: - 'SendFileDialogState' is from 'package:fluffychat/pages/chat/send_file_dialog.dart' ('lib/pages/chat/send_file_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: sendStr = L10n.of(context).sendImage; +ERROR: ^^^^ +ERROR: lib/pages/chat/send_file_dialog.dart:220:19: Error: The getter 'L10n' isn't defined for the class 'SendFileDialogState'. +ERROR: - 'SendFileDialogState' is from 'package:fluffychat/pages/chat/send_file_dialog.dart' ('lib/pages/chat/send_file_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: sendStr = L10n.of(context).sendImages(widget.files.length); +ERROR: ^^^^ +ERROR: lib/pages/chat/send_file_dialog.dart:223:17: Error: The getter 'L10n' isn't defined for the class 'SendFileDialogState'. +ERROR: - 'SendFileDialogState' is from 'package:fluffychat/pages/chat/send_file_dialog.dart' ('lib/pages/chat/send_file_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: sendStr = L10n.of(context).sendAudio; +ERROR: ^^^^ +ERROR: lib/pages/chat/send_file_dialog.dart:225:17: Error: The getter 'L10n' isn't defined for the class 'SendFileDialogState'. +ERROR: - 'SendFileDialogState' is from 'package:fluffychat/pages/chat/send_file_dialog.dart' ('lib/pages/chat/send_file_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: sendStr = L10n.of(context).sendVideo; +ERROR: ^^^^ +ERROR: lib/pages/chat/send_file_dialog.dart:235:30: Error: The getter 'L10n' isn't defined for the class 'SendFileDialogState'. +ERROR: - 'SendFileDialogState' is from 'package:fluffychat/pages/chat/send_file_dialog.dart' ('lib/pages/chat/send_file_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: snapshot.data ?? L10n.of(context).calculatingFileSize; +ERROR: ^^^^ +ERROR: lib/pages/chat/send_file_dialog.dart:364:36: Error: The getter 'L10n' isn't defined for the class 'SendFileDialogState'. +ERROR: - 'SendFileDialogState' is from 'package:fluffychat/pages/chat/send_file_dialog.dart' ('lib/pages/chat/send_file_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: labelText: L10n.of(context).optionalMessage, +ERROR: ^^^^ +ERROR: lib/pages/chat/send_file_dialog.dart:401:37: Error: The getter 'L10n' isn't defined for the class 'SendFileDialogState'. +ERROR: - 'SendFileDialogState' is from 'package:fluffychat/pages/chat/send_file_dialog.dart' ('lib/pages/chat/send_file_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).compress, +ERROR: ^^^^ +ERROR: lib/pages/chat/send_file_dialog.dart:414:35: Error: The getter 'L10n' isn't defined for the class 'SendFileDialogState'. +ERROR: - 'SendFileDialogState' is from 'package:fluffychat/pages/chat/send_file_dialog.dart' ('lib/pages/chat/send_file_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).notSupportedOnThisDevice, +ERROR: ^^^^ +ERROR: lib/pages/chat/send_file_dialog.dart:430:27: Error: The getter 'L10n' isn't defined for the class 'SendFileDialogState'. +ERROR: - 'SendFileDialogState' is from 'package:fluffychat/pages/chat/send_file_dialog.dart' ('lib/pages/chat/send_file_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: child: Text(L10n.of(context).cancel), +ERROR: ^^^^ +ERROR: lib/pages/chat/send_file_dialog.dart:434:27: Error: The getter 'L10n' isn't defined for the class 'SendFileDialogState'. +ERROR: - 'SendFileDialogState' is from 'package:fluffychat/pages/chat/send_file_dialog.dart' ('lib/pages/chat/send_file_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: child: Text(L10n.of(context).send), +ERROR: ^^^^ +ERROR: lib/pages/chat/send_location_dialog.dart:102:28: Error: The getter 'L10n' isn't defined for the class 'SendLocationDialogState'. +ERROR: - 'SendLocationDialogState' is from 'package:fluffychat/pages/chat/send_location_dialog.dart' ('lib/pages/chat/send_location_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: contentWidget = Text(L10n.of(context).locationDisabledNotice); +ERROR: ^^^^ +ERROR: lib/pages/chat/send_location_dialog.dart:104:28: Error: The getter 'L10n' isn't defined for the class 'SendLocationDialogState'. +ERROR: - 'SendLocationDialogState' is from 'package:fluffychat/pages/chat/send_location_dialog.dart' ('lib/pages/chat/send_location_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: contentWidget = Text(L10n.of(context).locationPermissionDeniedNotice); +ERROR: ^^^^ +ERROR: lib/pages/chat/send_location_dialog.dart:107:16: Error: The getter 'L10n' isn't defined for the class 'SendLocationDialogState'. +ERROR: - 'SendLocationDialogState' is from 'package:fluffychat/pages/chat/send_location_dialog.dart' ('lib/pages/chat/send_location_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: Text(L10n.of(context).errorObtainingLocation(error.toString())); +ERROR: ^^^^ +ERROR: lib/pages/chat/send_location_dialog.dart:115:16: Error: The getter 'L10n' isn't defined for the class 'SendLocationDialogState'. +ERROR: - 'SendLocationDialogState' is from 'package:fluffychat/pages/chat/send_location_dialog.dart' ('lib/pages/chat/send_location_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: Text(L10n.of(context).obtainingLocation), +ERROR: ^^^^ +ERROR: lib/pages/chat/send_location_dialog.dart:120:19: Error: The getter 'L10n' isn't defined for the class 'SendLocationDialogState'. +ERROR: - 'SendLocationDialogState' is from 'package:fluffychat/pages/chat/send_location_dialog.dart' ('lib/pages/chat/send_location_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(L10n.of(context).shareLocation), +ERROR: ^^^^ +ERROR: lib/pages/chat/send_location_dialog.dart:125:23: Error: The getter 'L10n' isn't defined for the class 'SendLocationDialogState'. +ERROR: - 'SendLocationDialogState' is from 'package:fluffychat/pages/chat/send_location_dialog.dart' ('lib/pages/chat/send_location_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: child: Text(L10n.of(context).cancel), +ERROR: ^^^^ +ERROR: lib/pages/chat/send_location_dialog.dart:128:72: Error: The getter 'L10n' isn't defined for the class 'SendLocationDialogState'. +ERROR: - 'SendLocationDialogState' is from 'package:fluffychat/pages/chat/send_location_dialog.dart' ('lib/pages/chat/send_location_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: AdaptiveDialogAction(onPressed: requestLocation, child: Text(L10n.of(context).retry)), +ERROR: ^^^^ +ERROR: lib/pages/chat/send_location_dialog.dart:132:25: Error: The getter 'L10n' isn't defined for the class 'SendLocationDialogState'. +ERROR: - 'SendLocationDialogState' is from 'package:fluffychat/pages/chat/send_location_dialog.dart' ('lib/pages/chat/send_location_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: child: Text(L10n.of(context).send), +ERROR: ^^^^ +ERROR: lib/pages/chat_access_settings/chat_access_settings_page.dart:23:21: Error: The getter 'L10n' isn't defined for the class 'ChatAccessSettingsPageView'. +ERROR: - 'ChatAccessSettingsPageView' is from 'package:fluffychat/pages/chat_access_settings/chat_access_settings_page.dart' ('lib/pages/chat_access_settings/chat_access_settings_page.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(L10n.of(context).accessAndVisibility), +ERROR: ^^^^ +ERROR: lib/pages/chat_access_settings/chat_access_settings_page.dart:41:21: Error: The getter 'L10n' isn't defined for the class 'ChatAccessSettingsPageView'. +ERROR: - 'ChatAccessSettingsPageView' is from 'package:fluffychat/pages/chat_access_settings/chat_access_settings_page.dart' ('lib/pages/chat_access_settings/chat_access_settings_page.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).visibilityOfTheChatHistory, +ERROR: ^^^^ +ERROR: lib/pages/chat_access_settings/chat_access_settings_page.dart:52:60: Error: The getter 'L10n' isn't defined for the class 'ChatAccessSettingsPageView'. +ERROR: - 'ChatAccessSettingsPageView' is from 'package:fluffychat/pages/chat_access_settings/chat_access_settings_page.dart' ('lib/pages/chat_access_settings/chat_access_settings_page.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: .getLocalizedString(MatrixLocals(L10n.of(context))), +ERROR: ^^^^ +ERROR: lib/pages/chat_access_settings/chat_access_settings_page.dart:64:21: Error: The getter 'L10n' isn't defined for the class 'ChatAccessSettingsPageView'. +ERROR: - 'ChatAccessSettingsPageView' is from 'package:fluffychat/pages/chat_access_settings/chat_access_settings_page.dart' ('lib/pages/chat_access_settings/chat_access_settings_page.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).whoIsAllowedToJoinThisGroup, +ERROR: ^^^^ +ERROR: lib/pages/chat_access_settings/chat_access_settings_page.dart:75:50: Error: The getter 'L10n' isn't defined for the class 'ChatAccessSettingsPageView'. +ERROR: - 'ChatAccessSettingsPageView' is from 'package:fluffychat/pages/chat_access_settings/chat_access_settings_page.dart' ('lib/pages/chat_access_settings/chat_access_settings_page.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: joinRule.localizedString(L10n.of(context)), +ERROR: ^^^^ +ERROR: lib/pages/chat_access_settings/chat_access_settings_page.dart:89:23: Error: The getter 'L10n' isn't defined for the class 'ChatAccessSettingsPageView'. +ERROR: - 'ChatAccessSettingsPageView' is from 'package:fluffychat/pages/chat_access_settings/chat_access_settings_page.dart' ('lib/pages/chat_access_settings/chat_access_settings_page.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).areGuestsAllowedToJoin, +ERROR: ^^^^ +ERROR: lib/pages/chat_access_settings/chat_access_settings_page.dart:100:40: Error: The getter 'L10n' isn't defined for the class 'ChatAccessSettingsPageView'. +ERROR: - 'ChatAccessSettingsPageView' is from 'package:fluffychat/pages/chat_access_settings/chat_access_settings_page.dart' ('lib/pages/chat_access_settings/chat_access_settings_page.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: MatrixLocals(L10n.of(context)), +ERROR: ^^^^ +ERROR: lib/pages/chat_access_settings/chat_access_settings_page.dart:113:23: Error: The getter 'L10n' isn't defined for the class 'ChatAccessSettingsPageView'. +ERROR: - 'ChatAccessSettingsPageView' is from 'package:fluffychat/pages/chat_access_settings/chat_access_settings_page.dart' ('lib/pages/chat_access_settings/chat_access_settings_page.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).publicChatAddresses, +ERROR: ^^^^ +ERROR: lib/pages/chat_access_settings/chat_access_settings_page.dart:121:32: Error: The getter 'L10n' isn't defined for the class 'ChatAccessSettingsPageView'. +ERROR: - 'ChatAccessSettingsPageView' is from 'package:fluffychat/pages/chat_access_settings/chat_access_settings_page.dart' ('lib/pages/chat_access_settings/chat_access_settings_page.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: tooltip: L10n.of(context).createNewAddress, +ERROR: ^^^^ +ERROR: lib/pages/chat_access_settings/chat_access_settings_page.dart:174:25: Error: The getter 'L10n' isn't defined for the class 'ChatAccessSettingsPageView'. +ERROR: - 'ChatAccessSettingsPageView' is from 'package:fluffychat/pages/chat_access_settings/chat_access_settings_page.dart' ('lib/pages/chat_access_settings/chat_access_settings_page.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).chatCanBeDiscoveredViaSearchOnServer( +ERROR: ^^^^ +ERROR: lib/pages/chat_access_settings/chat_access_settings_page.dart:183:31: Error: The getter 'L10n' isn't defined for the class 'ChatAccessSettingsPageView'. +ERROR: - 'ChatAccessSettingsPageView' is from 'package:fluffychat/pages/chat_access_settings/chat_access_settings_page.dart' ('lib/pages/chat_access_settings/chat_access_settings_page.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(L10n.of(context).globalChatId), +ERROR: ^^^^ +ERROR: lib/pages/chat_access_settings/chat_access_settings_page.dart:191:31: Error: The getter 'L10n' isn't defined for the class 'ChatAccessSettingsPageView'. +ERROR: - 'ChatAccessSettingsPageView' is from 'package:fluffychat/pages/chat_access_settings/chat_access_settings_page.dart' ('lib/pages/chat_access_settings/chat_access_settings_page.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(L10n.of(context).roomVersion), +ERROR: ^^^^ +ERROR: lib/pages/chat_access_settings/chat_access_settings_page.dart:263:26: Error: 'L10n' isn't a type. +ERROR: String localizedString(L10n l10n) { +ERROR: ^^^^ +ERROR: lib/pages/chat_details/chat_details_view.dart:33:23: Error: The getter 'L10n' isn't defined for the class 'ChatDetailsView'. +ERROR: - 'ChatDetailsView' is from 'package:fluffychat/pages/chat_details/chat_details_view.dart' ('lib/pages/chat_details/chat_details_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(L10n.of(context).oopsSomethingWentWrong), +ERROR: ^^^^ +ERROR: lib/pages/chat_details/chat_details_view.dart:36:23: Error: The getter 'L10n' isn't defined for the class 'ChatDetailsView'. +ERROR: - 'ChatDetailsView' is from 'package:fluffychat/pages/chat_details/chat_details_view.dart' ('lib/pages/chat_details/chat_details_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: child: Text(L10n.of(context).youAreNoLongerParticipatingInThisChat), +ERROR: ^^^^ +ERROR: lib/pages/chat_details/chat_details_view.dart:56:24: Error: The getter 'L10n' isn't defined for the class 'ChatDetailsView'. +ERROR: - 'ChatDetailsView' is from 'package:fluffychat/pages/chat_details/chat_details_view.dart' ('lib/pages/chat_details/chat_details_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: MatrixLocals(L10n.of(context)), +ERROR: ^^^^ +ERROR: lib/pages/chat_details/chat_details_view.dart:66:28: Error: The getter 'L10n' isn't defined for the class 'ChatDetailsView'. +ERROR: - 'ChatDetailsView' is from 'package:fluffychat/pages/chat_details/chat_details_view.dart' ('lib/pages/chat_details/chat_details_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: tooltip: L10n.of(context).share, +ERROR: ^^^^ +ERROR: lib/pages/chat_details/chat_details_view.dart:75:28: Error: The getter 'L10n' isn't defined for the class 'ChatDetailsView'. +ERROR: - 'ChatDetailsView' is from 'package:fluffychat/pages/chat_details/chat_details_view.dart' ('lib/pages/chat_details/chat_details_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: tooltip: L10n.of(context).share, +ERROR: ^^^^ +ERROR: lib/pages/chat_details/chat_details_view.dart:85:25: Error: The getter 'L10n' isn't defined for the class 'ChatDetailsView'. +ERROR: - 'ChatDetailsView' is from 'package:fluffychat/pages/chat_details/chat_details_view.dart' ('lib/pages/chat_details/chat_details_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(L10n.of(context).chatDetails), +ERROR: ^^^^ +ERROR: lib/pages/chat_details/chat_details_view.dart:174:45: Error: The getter 'L10n' isn't defined for the class 'ChatDetailsView'. +ERROR: - 'ChatDetailsView' is from 'package:fluffychat/pages/chat_details/chat_details_view.dart' ('lib/pages/chat_details/chat_details_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: ? L10n.of(context).directChat +ERROR: ^^^^ +ERROR: lib/pages/chat_details/chat_details_view.dart:197:39: Error: The getter 'L10n' isn't defined for the class 'ChatDetailsView'. +ERROR: - 'ChatDetailsView' is from 'package:fluffychat/pages/chat_details/chat_details_view.dart' ('lib/pages/chat_details/chat_details_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).countParticipants( +ERROR: ^^^^ +ERROR: lib/pages/chat_details/chat_details_view.dart:214:31: Error: The getter 'L10n' isn't defined for the class 'ChatDetailsView'. +ERROR: - 'ChatDetailsView' is from 'package:fluffychat/pages/chat_details/chat_details_view.dart' ('lib/pages/chat_details/chat_details_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).chatDescription, +ERROR: ^^^^ +ERROR: lib/pages/chat_details/chat_details_view.dart:226:43: Error: The getter 'L10n' isn't defined for the class 'ChatDetailsView'. +ERROR: - 'ChatDetailsView' is from 'package:fluffychat/pages/chat_details/chat_details_view.dart' ('lib/pages/chat_details/chat_details_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: label: Text(L10n.of(context).setChatDescription), +ERROR: ^^^^ +ERROR: lib/pages/chat_details/chat_details_view.dart:244:35: Error: The getter 'L10n' isn't defined for the class 'ChatDetailsView'. +ERROR: - 'ChatDetailsView' is from 'package:fluffychat/pages/chat_details/chat_details_view.dart' ('lib/pages/chat_details/chat_details_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: ? L10n.of(context).noChatDescriptionYet +ERROR: ^^^^ +ERROR: lib/pages/chat_details/chat_details_view.dart:276:39: Error: The getter 'L10n' isn't defined for the class 'ChatDetailsView'. +ERROR: - 'ChatDetailsView' is from 'package:fluffychat/pages/chat_details/chat_details_view.dart' ('lib/pages/chat_details/chat_details_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(L10n.of(context).customEmojisAndStickers), +ERROR: ^^^^ +ERROR: lib/pages/chat_details/chat_details_view.dart:277:42: Error: The getter 'L10n' isn't defined for the class 'ChatDetailsView'. +ERROR: - 'ChatDetailsView' is from 'package:fluffychat/pages/chat_details/chat_details_view.dart' ('lib/pages/chat_details/chat_details_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: subtitle: Text(L10n.of(context).setCustomEmotes), +ERROR: ^^^^ +ERROR: lib/pages/chat_details/chat_details_view.dart:289:31: Error: The getter 'L10n' isn't defined for the class 'ChatDetailsView'. +ERROR: - 'ChatDetailsView' is from 'package:fluffychat/pages/chat_details/chat_details_view.dart' ('lib/pages/chat_details/chat_details_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).accessAndVisibility, +ERROR: ^^^^ +ERROR: lib/pages/chat_details/chat_details_view.dart:292:31: Error: The getter 'L10n' isn't defined for the class 'ChatDetailsView'. +ERROR: - 'ChatDetailsView' is from 'package:fluffychat/pages/chat_details/chat_details_view.dart' ('lib/pages/chat_details/chat_details_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).accessAndVisibilityDescription, +ERROR: ^^^^ +ERROR: lib/pages/chat_details/chat_details_view.dart:300:41: Error: The getter 'L10n' isn't defined for the class 'ChatDetailsView'. +ERROR: - 'ChatDetailsView' is from 'package:fluffychat/pages/chat_details/chat_details_view.dart' ('lib/pages/chat_details/chat_details_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(L10n.of(context).chatPermissions), +ERROR: ^^^^ +ERROR: lib/pages/chat_details/chat_details_view.dart:302:31: Error: The getter 'L10n' isn't defined for the class 'ChatDetailsView'. +ERROR: - 'ChatDetailsView' is from 'package:fluffychat/pages/chat_details/chat_details_view.dart' ('lib/pages/chat_details/chat_details_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).whoCanPerformWhichAction, +ERROR: ^^^^ +ERROR: lib/pages/chat_details/chat_details_view.dart:318:29: Error: The getter 'L10n' isn't defined for the class 'ChatDetailsView'. +ERROR: - 'ChatDetailsView' is from 'package:fluffychat/pages/chat_details/chat_details_view.dart' ('lib/pages/chat_details/chat_details_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).countParticipants( +ERROR: ^^^^ +ERROR: lib/pages/chat_details/chat_details_view.dart:329:41: Error: The getter 'L10n' isn't defined for the class 'ChatDetailsView'. +ERROR: - 'ChatDetailsView' is from 'package:fluffychat/pages/chat_details/chat_details_view.dart' ('lib/pages/chat_details/chat_details_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(L10n.of(context).inviteContact), +ERROR: ^^^^ +ERROR: lib/pages/chat_details/chat_details_view.dart:347:29: Error: The getter 'L10n' isn't defined for the class 'ChatDetailsView'. +ERROR: - 'ChatDetailsView' is from 'package:fluffychat/pages/chat_details/chat_details_view.dart' ('lib/pages/chat_details/chat_details_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).loadCountMoreParticipants( +ERROR: ^^^^ +ERROR: lib/pages/chat_encryption_settings/chat_encryption_settings_view.dart:34:23: Error: The getter 'L10n' isn't defined for the class 'ChatEncryptionSettingsView'. +ERROR: - 'ChatEncryptionSettingsView' is from 'package:fluffychat/pages/chat_encryption_settings/chat_encryption_settings_view.dart' ('lib/pages/chat_encryption_settings/chat_encryption_settings_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(L10n.of(context).encryption), +ERROR: ^^^^ +ERROR: lib/pages/chat_encryption_settings/chat_encryption_settings_view.dart:38:27: Error: The getter 'L10n' isn't defined for the class 'ChatEncryptionSettingsView'. +ERROR: - 'ChatEncryptionSettingsView' is from 'package:fluffychat/pages/chat_encryption_settings/chat_encryption_settings_view.dart' ('lib/pages/chat_encryption_settings/chat_encryption_settings_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: child: Text(L10n.of(context).help), +ERROR: ^^^^ +ERROR: lib/pages/chat_encryption_settings/chat_encryption_settings_view.dart:52:29: Error: The getter 'L10n' isn't defined for the class 'ChatEncryptionSettingsView'. +ERROR: - 'ChatEncryptionSettingsView' is from 'package:fluffychat/pages/chat_encryption_settings/chat_encryption_settings_view.dart' ('lib/pages/chat_encryption_settings/chat_encryption_settings_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(L10n.of(context).encryptThisChat), +ERROR: ^^^^ +ERROR: lib/pages/chat_encryption_settings/chat_encryption_settings_view.dart:70:35: Error: The getter 'L10n' isn't defined for the class 'ChatEncryptionSettingsView'. +ERROR: - 'ChatEncryptionSettingsView' is from 'package:fluffychat/pages/chat_encryption_settings/chat_encryption_settings_view.dart' ('lib/pages/chat_encryption_settings/chat_encryption_settings_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: label: Text(L10n.of(context).verifyStart), +ERROR: ^^^^ +ERROR: lib/pages/chat_encryption_settings/chat_encryption_settings_view.dart:78:21: Error: The getter 'L10n' isn't defined for the class 'ChatEncryptionSettingsView'. +ERROR: - 'ChatEncryptionSettingsView' is from 'package:fluffychat/pages/chat_encryption_settings/chat_encryption_settings_view.dart' ('lib/pages/chat_encryption_settings/chat_encryption_settings_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).deviceKeys, +ERROR: ^^^^ +ERROR: lib/pages/chat_encryption_settings/chat_encryption_settings_view.dart:94:32: Error: The getter 'L10n' isn't defined for the class 'ChatEncryptionSettingsView'. +ERROR: - 'ChatEncryptionSettingsView' is from 'package:fluffychat/pages/chat_encryption_settings/chat_encryption_settings_view.dart' ('lib/pages/chat_encryption_settings/chat_encryption_settings_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: '${L10n.of(context).oopsSomethingWentWrong}: ${snapshot.error}', +ERROR: ^^^^ +ERROR: lib/pages/chat_encryption_settings/chat_encryption_settings_view.dart:136:37: Error: The getter 'L10n' isn't defined for the class 'ChatEncryptionSettingsView'. +ERROR: - 'ChatEncryptionSettingsView' is from 'package:fluffychat/pages/chat_encryption_settings/chat_encryption_settings_view.dart' ('lib/pages/chat_encryption_settings/chat_encryption_settings_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).unknownDevice, +ERROR: ^^^^ +ERROR: lib/pages/chat_encryption_settings/chat_encryption_settings_view.dart:170:33: Error: The getter 'L10n' isn't defined for the class 'ChatEncryptionSettingsView'. +ERROR: - 'ChatEncryptionSettingsView' is from 'package:fluffychat/pages/chat_encryption_settings/chat_encryption_settings_view.dart' ('lib/pages/chat_encryption_settings/chat_encryption_settings_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).unknownEncryptionAlgorithm, +ERROR: ^^^^ +ERROR: lib/pages/chat_encryption_settings/chat_encryption_settings_view.dart:186:23: Error: The getter 'L10n' isn't defined for the class 'ChatEncryptionSettingsView'. +ERROR: - 'ChatEncryptionSettingsView' is from 'package:fluffychat/pages/chat_encryption_settings/chat_encryption_settings_view.dart' ('lib/pages/chat_encryption_settings/chat_encryption_settings_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).encryptionNotEnabled, +ERROR: ^^^^ +ERROR: lib/pages/chat_list/chat_list_view.dart:58:27: Error: The getter 'L10n' isn't defined for the class 'ChatListView'. +ERROR: - 'ChatListView' is from 'package:fluffychat/pages/chat_list/chat_list_view.dart' ('lib/pages/chat_list/chat_list_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).chat, +ERROR: ^^^^ +ERROR: lib/utils/show_update_snackbar.dart:25:27: Error: Undefined name 'L10n'. +ERROR: content: Text(L10n.of(context).updateInstalled(currentVersion)), +ERROR: ^^^^ +ERROR: lib/utils/show_update_snackbar.dart:27:22: Error: Undefined name 'L10n'. +ERROR: label: L10n.of(context).changelog, +ERROR: ^^^^ +ERROR: lib/pages/bootstrap/bootstrap_dialog.dart:64:14: Error: The getter 'L10n' isn't defined for the class 'BootstrapDialogState'. +ERROR: - 'BootstrapDialogState' is from 'package:fluffychat/pages/bootstrap/bootstrap_dialog.dart' ('lib/pages/bootstrap/bootstrap_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: return L10n.of(context).storeInAndroidKeystore; +ERROR: ^^^^ +ERROR: lib/pages/bootstrap/bootstrap_dialog.dart:67:14: Error: The getter 'L10n' isn't defined for the class 'BootstrapDialogState'. +ERROR: - 'BootstrapDialogState' is from 'package:fluffychat/pages/bootstrap/bootstrap_dialog.dart' ('lib/pages/bootstrap/bootstrap_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: return L10n.of(context).storeInAppleKeyChain; +ERROR: ^^^^ +ERROR: lib/pages/bootstrap/bootstrap_dialog.dart:69:12: Error: The getter 'L10n' isn't defined for the class 'BootstrapDialogState'. +ERROR: - 'BootstrapDialogState' is from 'package:fluffychat/pages/bootstrap/bootstrap_dialog.dart' ('lib/pages/bootstrap/bootstrap_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: return L10n.of(context).storeSecurlyOnThisDevice; +ERROR: ^^^^ +ERROR: lib/pages/bootstrap/bootstrap_dialog.dart:95:17: Error: The getter 'L10n' isn't defined for the class 'BootstrapDialogState'. +ERROR: - 'BootstrapDialogState' is from 'package:fluffychat/pages/bootstrap/bootstrap_dialog.dart' ('lib/pages/bootstrap/bootstrap_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: titleText = L10n.of(context).loadingPleaseWait; +ERROR: ^^^^ +ERROR: lib/pages/bootstrap/bootstrap_dialog.dart:100:19: Error: The getter 'L10n' isn't defined for the class 'BootstrapDialogState'. +ERROR: - 'BootstrapDialogState' is from 'package:fluffychat/pages/bootstrap/bootstrap_dialog.dart' ('lib/pages/bootstrap/bootstrap_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: titleText = L10n.of(context).recoveryKey; +ERROR: ^^^^ +ERROR: lib/pages/bootstrap/bootstrap_dialog.dart:108:23: Error: The getter 'L10n' isn't defined for the class 'BootstrapDialogState'. +ERROR: - 'BootstrapDialogState' is from 'package:fluffychat/pages/bootstrap/bootstrap_dialog.dart' ('lib/pages/bootstrap/bootstrap_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(L10n.of(context).recoveryKey), +ERROR: ^^^^ +ERROR: lib/pages/bootstrap/bootstrap_dialog.dart:126:34: Error: The getter 'L10n' isn't defined for the class 'BootstrapDialogState'. +ERROR: - 'BootstrapDialogState' is from 'package:fluffychat/pages/bootstrap/bootstrap_dialog.dart' ('lib/pages/bootstrap/bootstrap_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: subtitle: Text(L10n.of(context).chatBackupDescription), +ERROR: ^^^^ +ERROR: lib/pages/bootstrap/bootstrap_dialog.dart:156:30: Error: The getter 'L10n' isn't defined for the class 'BootstrapDialogState'. +ERROR: - 'BootstrapDialogState' is from 'package:fluffychat/pages/bootstrap/bootstrap_dialog.dart' ('lib/pages/bootstrap/bootstrap_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: Text(L10n.of(context).storeInSecureStorageDescription), +ERROR: ^^^^ +ERROR: lib/pages/bootstrap/bootstrap_dialog.dart:167:31: Error: The getter 'L10n' isn't defined for the class 'BootstrapDialogState'. +ERROR: - 'BootstrapDialogState' is from 'package:fluffychat/pages/bootstrap/bootstrap_dialog.dart' ('lib/pages/bootstrap/bootstrap_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(L10n.of(context).copyToClipboard), +ERROR: ^^^^ +ERROR: lib/pages/bootstrap/bootstrap_dialog.dart:168:34: Error: The getter 'L10n' isn't defined for the class 'BootstrapDialogState'. +ERROR: - 'BootstrapDialogState' is from 'package:fluffychat/pages/bootstrap/bootstrap_dialog.dart' ('lib/pages/bootstrap/bootstrap_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: subtitle: Text(L10n.of(context).saveKeyManuallyDescription), +ERROR: ^^^^ +ERROR: lib/pages/bootstrap/bootstrap_dialog.dart:173:31: Error: The getter 'L10n' isn't defined for the class 'BootstrapDialogState'. +ERROR: - 'BootstrapDialogState' is from 'package:fluffychat/pages/bootstrap/bootstrap_dialog.dart' ('lib/pages/bootstrap/bootstrap_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: label: Text(L10n.of(context).next), +ERROR: ^^^^ +ERROR: lib/pages/bootstrap/bootstrap_dialog.dart:230:27: Error: The getter 'L10n' isn't defined for the class 'BootstrapDialogState'. +ERROR: - 'BootstrapDialogState' is from 'package:fluffychat/pages/bootstrap/bootstrap_dialog.dart' ('lib/pages/bootstrap/bootstrap_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(L10n.of(context).chatBackup), +ERROR: ^^^^ +ERROR: lib/pages/bootstrap/bootstrap_dialog.dart:248:25: Error: The getter 'L10n' isn't defined for the class 'BootstrapDialogState'. +ERROR: - 'BootstrapDialogState' is from 'package:fluffychat/pages/bootstrap/bootstrap_dialog.dart' ('lib/pages/bootstrap/bootstrap_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).pleaseEnterRecoveryKeyDescription, +ERROR: ^^^^ +ERROR: lib/pages/bootstrap/bootstrap_dialog.dart:268:36: Error: The getter 'L10n' isn't defined for the class 'BootstrapDialogState'. +ERROR: - 'BootstrapDialogState' is from 'package:fluffychat/pages/bootstrap/bootstrap_dialog.dart' ('lib/pages/bootstrap/bootstrap_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: labelText: L10n.of(context).recoveryKey, +ERROR: ^^^^ +ERROR: lib/pages/bootstrap/bootstrap_dialog.dart:284:35: Error: The getter 'L10n' isn't defined for the class 'BootstrapDialogState'. +ERROR: - 'BootstrapDialogState' is from 'package:fluffychat/pages/bootstrap/bootstrap_dialog.dart' ('lib/pages/bootstrap/bootstrap_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: label: Text(L10n.of(context).unlockOldMessages), +ERROR: ^^^^ +ERROR: lib/pages/bootstrap/bootstrap_dialog.dart:327:39: Error: The getter 'L10n' isn't defined for the class 'BootstrapDialogState'. +ERROR: - 'BootstrapDialogState' is from 'package:fluffychat/pages/bootstrap/bootstrap_dialog.dart' ('lib/pages/bootstrap/bootstrap_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).wrongRecoveryKey, +ERROR: ^^^^ +ERROR: lib/pages/bootstrap/bootstrap_dialog.dart:351:39: Error: The getter 'L10n' isn't defined for the class 'BootstrapDialogState'. +ERROR: - 'BootstrapDialogState' is from 'package:fluffychat/pages/bootstrap/bootstrap_dialog.dart' ('lib/pages/bootstrap/bootstrap_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: child: Text(L10n.of(context).or), +ERROR: ^^^^ +ERROR: lib/pages/bootstrap/bootstrap_dialog.dart:359:35: Error: The getter 'L10n' isn't defined for the class 'BootstrapDialogState'. +ERROR: - 'BootstrapDialogState' is from 'package:fluffychat/pages/bootstrap/bootstrap_dialog.dart' ('lib/pages/bootstrap/bootstrap_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: label: Text(L10n.of(context).transferFromAnotherDevice), +ERROR: ^^^^ +ERROR: lib/pages/bootstrap/bootstrap_dialog.dart:365:40: Error: The getter 'L10n' isn't defined for the class 'BootstrapDialogState'. +ERROR: - 'BootstrapDialogState' is from 'package:fluffychat/pages/bootstrap/bootstrap_dialog.dart' ('lib/pages/bootstrap/bootstrap_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).verifyOtherDevice, +ERROR: ^^^^ +ERROR: lib/pages/bootstrap/bootstrap_dialog.dart:366:42: Error: The getter 'L10n' isn't defined for the class 'BootstrapDialogState'. +ERROR: - 'BootstrapDialogState' is from 'package:fluffychat/pages/bootstrap/bootstrap_dialog.dart' ('lib/pages/bootstrap/bootstrap_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: message: L10n.of(context) +ERROR: ^^^^ +ERROR: lib/pages/bootstrap/bootstrap_dialog.dart:368:42: Error: The getter 'L10n' isn't defined for the class 'BootstrapDialogState'. +ERROR: - 'BootstrapDialogState' is from 'package:fluffychat/pages/bootstrap/bootstrap_dialog.dart' ('lib/pages/bootstrap/bootstrap_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: okLabel: L10n.of(context).ok, +ERROR: ^^^^ +ERROR: lib/pages/bootstrap/bootstrap_dialog.dart:369:46: Error: The getter 'L10n' isn't defined for the class 'BootstrapDialogState'. +ERROR: - 'BootstrapDialogState' is from 'package:fluffychat/pages/bootstrap/bootstrap_dialog.dart' ('lib/pages/bootstrap/bootstrap_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: cancelLabel: L10n.of(context).cancel, +ERROR: ^^^^ +ERROR: lib/pages/bootstrap/bootstrap_dialog.dart:396:35: Error: The getter 'L10n' isn't defined for the class 'BootstrapDialogState'. +ERROR: - 'BootstrapDialogState' is from 'package:fluffychat/pages/bootstrap/bootstrap_dialog.dart' ('lib/pages/bootstrap/bootstrap_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: label: Text(L10n.of(context).recoveryKeyLost), +ERROR: ^^^^ +ERROR: lib/pages/bootstrap/bootstrap_dialog.dart:404:44: Error: The getter 'L10n' isn't defined for the class 'BootstrapDialogState'. +ERROR: - 'BootstrapDialogState' is from 'package:fluffychat/pages/bootstrap/bootstrap_dialog.dart' ('lib/pages/bootstrap/bootstrap_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).recoveryKeyLost, +ERROR: ^^^^ +ERROR: lib/pages/bootstrap/bootstrap_dialog.dart:405:46: Error: The getter 'L10n' isn't defined for the class 'BootstrapDialogState'. +ERROR: - 'BootstrapDialogState' is from 'package:fluffychat/pages/bootstrap/bootstrap_dialog.dart' ('lib/pages/bootstrap/bootstrap_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: message: L10n.of(context).wipeChatBackup, +ERROR: ^^^^ +ERROR: lib/pages/bootstrap/bootstrap_dialog.dart:406:46: Error: The getter 'L10n' isn't defined for the class 'BootstrapDialogState'. +ERROR: - 'BootstrapDialogState' is from 'package:fluffychat/pages/bootstrap/bootstrap_dialog.dart' ('lib/pages/bootstrap/bootstrap_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: okLabel: L10n.of(context).ok, +ERROR: ^^^^ +ERROR: lib/pages/bootstrap/bootstrap_dialog.dart:407:50: Error: The getter 'L10n' isn't defined for the class 'BootstrapDialogState'. +ERROR: - 'BootstrapDialogState' is from 'package:fluffychat/pages/bootstrap/bootstrap_dialog.dart' ('lib/pages/bootstrap/bootstrap_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: cancelLabel: L10n.of(context).cancel, +ERROR: ^^^^ +ERROR: lib/pages/bootstrap/bootstrap_dialog.dart:445:23: Error: The getter 'L10n' isn't defined for the class 'BootstrapDialogState'. +ERROR: - 'BootstrapDialogState' is from 'package:fluffychat/pages/bootstrap/bootstrap_dialog.dart' ('lib/pages/bootstrap/bootstrap_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: titleText = L10n.of(context).oopsSomethingWentWrong; +ERROR: ^^^^ +ERROR: lib/pages/bootstrap/bootstrap_dialog.dart:451:27: Error: The getter 'L10n' isn't defined for the class 'BootstrapDialogState'. +ERROR: - 'BootstrapDialogState' is from 'package:fluffychat/pages/bootstrap/bootstrap_dialog.dart' ('lib/pages/bootstrap/bootstrap_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: child: Text(L10n.of(context).close), +ERROR: ^^^^ +ERROR: lib/pages/bootstrap/bootstrap_dialog.dart:456:23: Error: The getter 'L10n' isn't defined for the class 'BootstrapDialogState'. +ERROR: - 'BootstrapDialogState' is from 'package:fluffychat/pages/bootstrap/bootstrap_dialog.dart' ('lib/pages/bootstrap/bootstrap_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: titleText = L10n.of(context).everythingReady; +ERROR: ^^^^ +ERROR: lib/pages/bootstrap/bootstrap_dialog.dart:467:17: Error: The getter 'L10n' isn't defined for the class 'BootstrapDialogState'. +ERROR: - 'BootstrapDialogState' is from 'package:fluffychat/pages/bootstrap/bootstrap_dialog.dart' ('lib/pages/bootstrap/bootstrap_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).yourChatBackupHasBeenSetUp, +ERROR: ^^^^ +ERROR: lib/pages/bootstrap/bootstrap_dialog.dart:477:27: Error: The getter 'L10n' isn't defined for the class 'BootstrapDialogState'. +ERROR: - 'BootstrapDialogState' is from 'package:fluffychat/pages/bootstrap/bootstrap_dialog.dart' ('lib/pages/bootstrap/bootstrap_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: child: Text(L10n.of(context).close), +ERROR: ^^^^ +ERROR: lib/pages/bootstrap/bootstrap_dialog.dart:492:34: Error: The getter 'L10n' isn't defined for the class 'BootstrapDialogState'. +ERROR: - 'BootstrapDialogState' is from 'package:fluffychat/pages/bootstrap/bootstrap_dialog.dart' ('lib/pages/bootstrap/bootstrap_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(titleText ?? L10n.of(context).loadingPleaseWait), +ERROR: ^^^^ +ERROR: lib/pages/chat_members/chat_members_view.dart:24:23: Error: The getter 'L10n' isn't defined for the class 'ChatMembersView'. +ERROR: - 'ChatMembersView' is from 'package:fluffychat/pages/chat_members/chat_members_view.dart' ('lib/pages/chat_members/chat_members_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(L10n.of(context).oopsSomethingWentWrong), +ERROR: ^^^^ +ERROR: lib/pages/chat_members/chat_members_view.dart:27:23: Error: The getter 'L10n' isn't defined for the class 'ChatMembersView'. +ERROR: - 'ChatMembersView' is from 'package:fluffychat/pages/chat_members/chat_members_view.dart' ('lib/pages/chat_members/chat_members_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: child: Text(L10n.of(context).youAreNoLongerParticipatingInThisChat), +ERROR: ^^^^ +ERROR: lib/pages/chat_members/chat_members_view.dart:44:11: Error: The getter 'L10n' isn't defined for the class 'ChatMembersView'. +ERROR: - 'ChatMembersView' is from 'package:fluffychat/pages/chat_members/chat_members_view.dart' ('lib/pages/chat_members/chat_members_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).countParticipants(roomCount), +ERROR: ^^^^ +ERROR: lib/pages/chat_members/chat_members_view.dart:72:37: Error: The getter 'L10n' isn't defined for the class 'ChatMembersView'. +ERROR: - 'ChatMembersView' is from 'package:fluffychat/pages/chat_members/chat_members_view.dart' ('lib/pages/chat_members/chat_members_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: label: Text(L10n.of(context).tryAgain), +ERROR: ^^^^ +ERROR: lib/pages/chat_members/chat_members_view.dart:122:45: Error: The getter 'L10n' isn't defined for the class 'ChatMembersView'. +ERROR: - 'ChatMembersView' is from 'package:fluffychat/pages/chat_members/chat_members_view.dart' ('lib/pages/chat_members/chat_members_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: hintText: L10n.of(context).search, +ERROR: ^^^^ +ERROR: lib/pages/chat_members/chat_members_view.dart:144:45: Error: The getter 'L10n' isn't defined for the class 'ChatMembersView'. +ERROR: - 'ChatMembersView' is from 'package:fluffychat/pages/chat_members/chat_members_view.dart' ('lib/pages/chat_members/chat_members_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).banned, +ERROR: ^^^^ +ERROR: lib/pages/chat_members/chat_members_view.dart:146:45: Error: The getter 'L10n' isn't defined for the class 'ChatMembersView'. +ERROR: - 'ChatMembersView' is from 'package:fluffychat/pages/chat_members/chat_members_view.dart' ('lib/pages/chat_members/chat_members_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).invited, +ERROR: ^^^^ +ERROR: lib/pages/chat_members/chat_members_view.dart:147:62: Error: The getter 'L10n' isn't defined for the class 'ChatMembersView'. +ERROR: - 'ChatMembersView' is from 'package:fluffychat/pages/chat_members/chat_members_view.dart' ('lib/pages/chat_members/chat_members_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: Membership.join => L10n.of(context) +ERROR: ^^^^ +ERROR: lib/pages/chat_members/chat_members_view.dart:157:45: Error: The getter 'L10n' isn't defined for the class 'ChatMembersView'. +ERROR: - 'ChatMembersView' is from 'package:fluffychat/pages/chat_members/chat_members_view.dart' ('lib/pages/chat_members/chat_members_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).knocking, +ERROR: ^^^^ +ERROR: lib/pages/chat_members/chat_members_view.dart:159:45: Error: The getter 'L10n' isn't defined for the class 'ChatMembersView'. +ERROR: - 'ChatMembersView' is from 'package:fluffychat/pages/chat_members/chat_members_view.dart' ('lib/pages/chat_members/chat_members_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).leftTheChat, +ERROR: ^^^^ +ERROR: lib/pages/chat_permissions_settings/chat_permissions_settings_view.dart:23:21: Error: The getter 'L10n' isn't defined for the class 'ChatPermissionsSettingsView'. +ERROR: - 'ChatPermissionsSettingsView' is from 'package:fluffychat/pages/chat_permissions_settings/chat_permissions_settings_view.dart' ('lib/pages/chat_permissions_settings/chat_permissions_settings_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(L10n.of(context).chatPermissions), +ERROR: ^^^^ +ERROR: lib/pages/chat_permissions_settings/chat_permissions_settings_view.dart:34:41: Error: The getter 'L10n' isn't defined for the class 'ChatPermissionsSettingsView'. +ERROR: - 'ChatPermissionsSettingsView' is from 'package:fluffychat/pages/chat_permissions_settings/chat_permissions_settings_view.dart' ('lib/pages/chat_permissions_settings/chat_permissions_settings_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: return Center(child: Text(L10n.of(context).noRoomsFound)); +ERROR: ^^^^ +ERROR: lib/pages/chat_permissions_settings/chat_permissions_settings_view.dart:49:21: Error: The getter 'L10n' isn't defined for the class 'ChatPermissionsSettingsView'. +ERROR: - 'ChatPermissionsSettingsView' is from 'package:fluffychat/pages/chat_permissions_settings/chat_permissions_settings_view.dart' ('lib/pages/chat_permissions_settings/chat_permissions_settings_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).chatPermissionsDescription, +ERROR: ^^^^ +ERROR: lib/pages/chat_permissions_settings/chat_permissions_settings_view.dart:55:21: Error: The getter 'L10n' isn't defined for the class 'ChatPermissionsSettingsView'. +ERROR: - 'ChatPermissionsSettingsView' is from 'package:fluffychat/pages/chat_permissions_settings/chat_permissions_settings_view.dart' ('lib/pages/chat_permissions_settings/chat_permissions_settings_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).chatPermissions, +ERROR: ^^^^ +ERROR: lib/pages/chat_permissions_settings/chat_permissions_settings_view.dart:80:25: Error: The getter 'L10n' isn't defined for the class 'ChatPermissionsSettingsView'. +ERROR: - 'ChatPermissionsSettingsView' is from 'package:fluffychat/pages/chat_permissions_settings/chat_permissions_settings_view.dart' ('lib/pages/chat_permissions_settings/chat_permissions_settings_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).notifications, +ERROR: ^^^^ +ERROR: lib/pages/chat_permissions_settings/chat_permissions_settings_view.dart:115:25: Error: The getter 'L10n' isn't defined for the class 'ChatPermissionsSettingsView'. +ERROR: - 'ChatPermissionsSettingsView' is from 'package:fluffychat/pages/chat_permissions_settings/chat_permissions_settings_view.dart' ('lib/pages/chat_permissions_settings/chat_permissions_settings_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).configureChat, +ERROR: ^^^^ +ERROR: lib/widgets/permission_slider_dialog.dart:18:19: Error: Undefined name 'L10n'. +ERROR: title: Text(L10n.of(context).chatPermissions), +ERROR: ^^^^ +ERROR: lib/widgets/permission_slider_dialog.dart:26:18: Error: Undefined name 'L10n'. +ERROR: Text(L10n.of(context).setPermissionsLevelDescription), +ERROR: ^^^^ +ERROR: lib/widgets/permission_slider_dialog.dart:33:28: Error: Undefined name 'L10n'. +ERROR: labelText: L10n.of(context).custom, +ERROR: ^^^^ +ERROR: lib/widgets/permission_slider_dialog.dart:46:29: Error: Undefined name 'L10n'. +ERROR: error.value = L10n.of(context).pleaseEnterANumber; +ERROR: ^^^^ +ERROR: lib/widgets/permission_slider_dialog.dart:50:29: Error: Undefined name 'L10n'. +ERROR: error.value = L10n.of(context).noPermission; +ERROR: ^^^^ +ERROR: lib/widgets/permission_slider_dialog.dart:55:23: Error: Undefined name 'L10n'. +ERROR: child: Text(L10n.of(context).setCustomPermissionLevel), +ERROR: ^^^^ +ERROR: lib/widgets/permission_slider_dialog.dart:61:25: Error: Undefined name 'L10n'. +ERROR: child: Text(L10n.of(context).admin), +ERROR: ^^^^ +ERROR: lib/widgets/permission_slider_dialog.dart:67:25: Error: Undefined name 'L10n'. +ERROR: child: Text(L10n.of(context).moderator), +ERROR: ^^^^ +ERROR: lib/widgets/permission_slider_dialog.dart:73:25: Error: Undefined name 'L10n'. +ERROR: child: Text(L10n.of(context).normalUser), +ERROR: ^^^^ +ERROR: lib/pages/chat_search/chat_search_view.dart:23:36: Error: The getter 'L10n' isn't defined for the class 'ChatSearchView'. +ERROR: - 'ChatSearchView' is from 'package:fluffychat/pages/chat_search/chat_search_view.dart' ('lib/pages/chat_search/chat_search_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: appBar: AppBar(title: Text(L10n.of(context).oopsSomethingWentWrong)), +ERROR: ^^^^ +ERROR: lib/pages/chat_search/chat_search_view.dart:27:25: Error: The getter 'L10n' isn't defined for the class 'ChatSearchView'. +ERROR: - 'ChatSearchView' is from 'package:fluffychat/pages/chat_search/chat_search_view.dart' ('lib/pages/chat_search/chat_search_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: child: Text(L10n.of(context).youAreNoLongerParticipatingInThisChat), +ERROR: ^^^^ +ERROR: lib/pages/chat_search/chat_search_view.dart:40:11: Error: The getter 'L10n' isn't defined for the class 'ChatSearchView'. +ERROR: - 'ChatSearchView' is from 'package:fluffychat/pages/chat_search/chat_search_view.dart' ('lib/pages/chat_search/chat_search_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).searchIn( +ERROR: ^^^^ +ERROR: lib/pages/chat_search/chat_search_view.dart:41:55: Error: The getter 'L10n' isn't defined for the class 'ChatSearchView'. +ERROR: - 'ChatSearchView' is from 'package:fluffychat/pages/chat_search/chat_search_view.dart' ('lib/pages/chat_search/chat_search_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: room.getLocalizedDisplayname(MatrixLocals(L10n.of(context))), +ERROR: ^^^^ +ERROR: lib/pages/chat_search/chat_search_view.dart:61:29: Error: The getter 'L10n' isn't defined for the class 'ChatSearchView'. +ERROR: - 'ChatSearchView' is from 'package:fluffychat/pages/chat_search/chat_search_view.dart' ('lib/pages/chat_search/chat_search_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: hintText: L10n.of(context).search, +ERROR: ^^^^ +ERROR: lib/pages/chat_search/chat_search_view.dart:79:33: Error: The getter 'L10n' isn't defined for the class 'ChatSearchView'. +ERROR: - 'ChatSearchView' is from 'package:fluffychat/pages/chat_search/chat_search_view.dart' ('lib/pages/chat_search/chat_search_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: Tab(child: Text(L10n.of(context).messages)), +ERROR: ^^^^ +ERROR: lib/pages/chat_search/chat_search_view.dart:80:33: Error: The getter 'L10n' isn't defined for the class 'ChatSearchView'. +ERROR: - 'ChatSearchView' is from 'package:fluffychat/pages/chat_search/chat_search_view.dart' ('lib/pages/chat_search/chat_search_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: Tab(child: Text(L10n.of(context).gallery)), +ERROR: ^^^^ +ERROR: lib/pages/chat_search/chat_search_view.dart:81:33: Error: The getter 'L10n' isn't defined for the class 'ChatSearchView'. +ERROR: - 'ChatSearchView' is from 'package:fluffychat/pages/chat_search/chat_search_view.dart' ('lib/pages/chat_search/chat_search_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: Tab(child: Text(L10n.of(context).files)), +ERROR: ^^^^ +ERROR: lib/pages/device_settings/device_settings_view.dart:21:21: Error: The getter 'L10n' isn't defined for the class 'DevicesSettingsView'. +ERROR: - 'DevicesSettingsView' is from 'package:fluffychat/pages/device_settings/device_settings_view.dart' ('lib/pages/device_settings/device_settings_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(L10n.of(context).devices), +ERROR: ^^^^ +ERROR: lib/pages/device_settings/device_settings_view.dart:61:31: Error: The getter 'L10n' isn't defined for the class 'DevicesSettingsView'. +ERROR: - 'DevicesSettingsView' is from 'package:fluffychat/pages/device_settings/device_settings_view.dart' ('lib/pages/device_settings/device_settings_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context) +ERROR: ^^^^ +ERROR: lib/pages/device_settings/device_settings_view.dart:74:29: Error: The getter 'L10n' isn't defined for the class 'DevicesSettingsView'. +ERROR: - 'DevicesSettingsView' is from 'package:fluffychat/pages/device_settings/device_settings_view.dart' ('lib/pages/device_settings/device_settings_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).thisDevice, +ERROR: ^^^^ +ERROR: lib/pages/device_settings/device_settings_view.dart:101:33: Error: The getter 'L10n' isn't defined for the class 'DevicesSettingsView'. +ERROR: - 'DevicesSettingsView' is from 'package:fluffychat/pages/device_settings/device_settings_view.dart' ('lib/pages/device_settings/device_settings_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).removeAllOtherDevices, +ERROR: ^^^^ +ERROR: lib/pages/device_settings/device_settings_view.dart:121:41: Error: The getter 'L10n' isn't defined for the class 'DevicesSettingsView'. +ERROR: - 'DevicesSettingsView' is from 'package:fluffychat/pages/device_settings/device_settings_view.dart' ('lib/pages/device_settings/device_settings_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: child: Text(L10n.of(context).noOtherDevicesFound), +ERROR: ^^^^ +ERROR: lib/pages/homeserver_picker/homeserver_picker_view.dart:33:17: Error: The getter 'L10n' isn't defined for the class 'HomeserverPickerView'. +ERROR: - 'HomeserverPickerView' is from 'package:fluffychat/pages/homeserver_picker/homeserver_picker_view.dart' ('lib/pages/homeserver_picker/homeserver_picker_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: ? L10n.of(context).addAccount +ERROR: ^^^^ +ERROR: lib/pages/homeserver_picker/homeserver_picker_view.dart:34:17: Error: The getter 'L10n' isn't defined for the class 'HomeserverPickerView'. +ERROR: - 'HomeserverPickerView' is from 'package:fluffychat/pages/homeserver_picker/homeserver_picker_view.dart' ('lib/pages/homeserver_picker/homeserver_picker_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: : L10n.of(context).login, +ERROR: ^^^^ +ERROR: lib/pages/homeserver_picker/homeserver_picker_view.dart:47:26: Error: The getter 'L10n' isn't defined for the class 'HomeserverPickerView'. +ERROR: - 'HomeserverPickerView' is from 'package:fluffychat/pages/homeserver_picker/homeserver_picker_view.dart' ('lib/pages/homeserver_picker/homeserver_picker_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: Text(L10n.of(context).hydrate), +ERROR: ^^^^ +ERROR: lib/pages/homeserver_picker/homeserver_picker_view.dart:58:26: Error: The getter 'L10n' isn't defined for the class 'HomeserverPickerView'. +ERROR: - 'HomeserverPickerView' is from 'package:fluffychat/pages/homeserver_picker/homeserver_picker_view.dart' ('lib/pages/homeserver_picker/homeserver_picker_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: Text(L10n.of(context).privacy), +ERROR: ^^^^ +ERROR: lib/pages/homeserver_picker/homeserver_picker_view.dart:69:26: Error: The getter 'L10n' isn't defined for the class 'HomeserverPickerView'. +ERROR: - 'HomeserverPickerView' is from 'package:fluffychat/pages/homeserver_picker/homeserver_picker_view.dart' ('lib/pages/homeserver_picker/homeserver_picker_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: Text(L10n.of(context).about), +ERROR: ^^^^ +ERROR: lib/pages/homeserver_picker/homeserver_picker_view.dart:102:39: Error: The getter 'L10n' isn't defined for the class 'HomeserverPickerView'. +ERROR: - 'HomeserverPickerView' is from 'package:fluffychat/pages/homeserver_picker/homeserver_picker_view.dart' ('lib/pages/homeserver_picker/homeserver_picker_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(L10n.of(context).hydrateTor), +ERROR: ^^^^ +ERROR: lib/pages/homeserver_picker/homeserver_picker_view.dart:103:42: Error: The getter 'L10n' isn't defined for the class 'HomeserverPickerView'. +ERROR: - 'HomeserverPickerView' is from 'package:fluffychat/pages/homeserver_picker/homeserver_picker_view.dart' ('lib/pages/homeserver_picker/homeserver_picker_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: subtitle: Text(L10n.of(context).hydrateTorLong), +ERROR: ^^^^ +ERROR: lib/pages/homeserver_picker/homeserver_picker_view.dart:124:31: Error: The getter 'L10n' isn't defined for the class 'HomeserverPickerView'. +ERROR: - 'HomeserverPickerView' is from 'package:fluffychat/pages/homeserver_picker/homeserver_picker_view.dart' ('lib/pages/homeserver_picker/homeserver_picker_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: text: L10n.of(context).appIntroduction, +ERROR: ^^^^ +ERROR: lib/pages/homeserver_picker/homeserver_picker_view.dart:169:41: Error: The getter 'L10n' isn't defined for the class 'HomeserverPickerView'. +ERROR: - 'HomeserverPickerView' is from 'package:fluffychat/pages/homeserver_picker/homeserver_picker_view.dart' ('lib/pages/homeserver_picker/homeserver_picker_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).whatIsAHomeserver, +ERROR: ^^^^ +ERROR: lib/pages/homeserver_picker/homeserver_picker_view.dart:172:47: Error: The getter 'L10n' isn't defined for the class 'HomeserverPickerView'. +ERROR: - 'HomeserverPickerView' is from 'package:fluffychat/pages/homeserver_picker/homeserver_picker_view.dart' ('lib/pages/homeserver_picker/homeserver_picker_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: text: L10n.of(context) +ERROR: ^^^^ +ERROR: lib/pages/homeserver_picker/homeserver_picker_view.dart:194:45: Error: The getter 'L10n' isn't defined for the class 'HomeserverPickerView'. +ERROR: - 'HomeserverPickerView' is from 'package:fluffychat/pages/homeserver_picker/homeserver_picker_view.dart' ('lib/pages/homeserver_picker/homeserver_picker_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context) +ERROR: ^^^^ +ERROR: lib/pages/homeserver_picker/homeserver_picker_view.dart:200:55: Error: The getter 'L10n' isn't defined for the class 'HomeserverPickerView'. +ERROR: - 'HomeserverPickerView' is from 'package:fluffychat/pages/homeserver_picker/homeserver_picker_view.dart' ('lib/pages/homeserver_picker/homeserver_picker_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: child: Text(L10n.of(context).close), +ERROR: ^^^^ +ERROR: lib/pages/homeserver_picker/homeserver_picker_view.dart:221:40: Error: The getter 'L10n' isn't defined for the class 'HomeserverPickerView'. +ERROR: - 'HomeserverPickerView' is from 'package:fluffychat/pages/homeserver_picker/homeserver_picker_view.dart' ('lib/pages/homeserver_picker/homeserver_picker_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: : Text(L10n.of(context).continueText), +ERROR: ^^^^ +ERROR: lib/pages/homeserver_picker/homeserver_picker_view.dart:233:41: Error: The getter 'L10n' isn't defined for the class 'HomeserverPickerView'. +ERROR: - 'HomeserverPickerView' is from 'package:fluffychat/pages/homeserver_picker/homeserver_picker_view.dart' ('lib/pages/homeserver_picker/homeserver_picker_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: child: Text(L10n.of(context).loginWithMatrixId), +ERROR: ^^^^ +ERROR: lib/pages/invitation_selection/invitation_selection_view.dart:24:23: Error: The getter 'L10n' isn't defined for the class 'InvitationSelectionView'. +ERROR: - 'InvitationSelectionView' is from 'package:fluffychat/pages/invitation_selection/invitation_selection_view.dart' ('lib/pages/invitation_selection/invitation_selection_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(L10n.of(context).oopsSomethingWentWrong), +ERROR: ^^^^ +ERROR: lib/pages/invitation_selection/invitation_selection_view.dart:27:23: Error: The getter 'L10n' isn't defined for the class 'InvitationSelectionView'. +ERROR: - 'InvitationSelectionView' is from 'package:fluffychat/pages/invitation_selection/invitation_selection_view.dart' ('lib/pages/invitation_selection/invitation_selection_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: child: Text(L10n.of(context).youAreNoLongerParticipatingInThisChat), +ERROR: ^^^^ +ERROR: lib/pages/invitation_selection/invitation_selection_view.dart:32:43: Error: The getter 'L10n' isn't defined for the class 'InvitationSelectionView'. +ERROR: - 'InvitationSelectionView' is from 'package:fluffychat/pages/invitation_selection/invitation_selection_view.dart' ('lib/pages/invitation_selection/invitation_selection_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: final groupName = room.name.isEmpty ? L10n.of(context).group : room.name; +ERROR: ^^^^ +ERROR: lib/pages/invitation_selection/invitation_selection_view.dart:38:21: Error: The getter 'L10n' isn't defined for the class 'InvitationSelectionView'. +ERROR: - 'InvitationSelectionView' is from 'package:fluffychat/pages/invitation_selection/invitation_selection_view.dart' ('lib/pages/invitation_selection/invitation_selection_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(L10n.of(context).inviteContact), +ERROR: ^^^^ +ERROR: lib/pages/invitation_selection/invitation_selection_view.dart:59:29: Error: The getter 'L10n' isn't defined for the class 'InvitationSelectionView'. +ERROR: - 'InvitationSelectionView' is from 'package:fluffychat/pages/invitation_selection/invitation_selection_view.dart' ('lib/pages/invitation_selection/invitation_selection_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: hintText: L10n.of(context).inviteContactToGroup(groupName), +ERROR: ^^^^ +ERROR: lib/pages/invitation_selection/invitation_selection_view.dart:99:33: Error: The getter 'L10n' isn't defined for the class 'InvitationSelectionView'. +ERROR: - 'InvitationSelectionView' is from 'package:fluffychat/pages/invitation_selection/invitation_selection_view.dart' ('lib/pages/invitation_selection/invitation_selection_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).user, +ERROR: ^^^^ +ERROR: lib/pages/invitation_selection/invitation_selection_view.dart:125:37: Error: The getter 'L10n' isn't defined for the class 'InvitationSelectionView'. +ERROR: - 'InvitationSelectionView' is from 'package:fluffychat/pages/invitation_selection/invitation_selection_view.dart' ('lib/pages/invitation_selection/invitation_selection_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).user, +ERROR: ^^^^ +ERROR: lib/pages/invitation_selection/invitation_selection_view.dart:134:37: Error: The getter 'L10n' isn't defined for the class 'InvitationSelectionView'. +ERROR: - 'InvitationSelectionView' is from 'package:fluffychat/pages/invitation_selection/invitation_selection_view.dart' ('lib/pages/invitation_selection/invitation_selection_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).user, +ERROR: ^^^^ +ERROR: lib/pages/invitation_selection/invitation_selection_view.dart:165:18: Error: The getter 'L10n' isn't defined for the class '_InviteContactListTile'. +ERROR: - '_InviteContactListTile' is from 'package:fluffychat/pages/invitation_selection/invitation_selection_view.dart' ('lib/pages/invitation_selection/invitation_selection_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: final l10n = L10n.of(context); +ERROR: ^^^^ +ERROR: lib/pages/login/login_view.dart:23:19: Error: The getter 'L10n' isn't defined for the class 'LoginView'. +ERROR: - 'LoginView' is from 'package:fluffychat/pages/login/login_view.dart' ('lib/pages/login/login_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: final title = L10n.of(context).logInTo(homeserver); +ERROR: ^^^^ +ERROR: lib/pages/login/login_view.dart:74:34: Error: The getter 'L10n' isn't defined for the class 'LoginView'. +ERROR: - 'LoginView' is from 'package:fluffychat/pages/login/login_view.dart' ('lib/pages/login/login_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: labelText: L10n.of(context).emailOrUsername, +ERROR: ^^^^ +ERROR: lib/pages/login/login_view.dart:104:34: Error: The getter 'L10n' isn't defined for the class 'LoginView'. +ERROR: - 'LoginView' is from 'package:fluffychat/pages/login/login_view.dart' ('lib/pages/login/login_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: labelText: L10n.of(context).password, +ERROR: ^^^^ +ERROR: lib/pages/login/login_view.dart:119:32: Error: The getter 'L10n' isn't defined for the class 'LoginView'. +ERROR: - 'LoginView' is from 'package:fluffychat/pages/login/login_view.dart' ('lib/pages/login/login_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: : Text(L10n.of(context).login), +ERROR: ^^^^ +ERROR: lib/pages/login/login_view.dart:132:33: Error: The getter 'L10n' isn't defined for the class 'LoginView'. +ERROR: - 'LoginView' is from 'package:fluffychat/pages/login/login_view.dart' ('lib/pages/login/login_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: child: Text(L10n.of(context).passwordForgotten), +ERROR: ^^^^ +ERROR: lib/pages/new_group/new_group_view.dart:31:17: Error: The getter 'L10n' isn't defined for the class 'NewGroupView'. +ERROR: - 'NewGroupView' is from 'package:fluffychat/pages/new_group/new_group_view.dart' ('lib/pages/new_group/new_group_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: ? L10n.of(context).newSpace +ERROR: ^^^^ +ERROR: lib/pages/new_group/new_group_view.dart:32:17: Error: The getter 'L10n' isn't defined for the class 'NewGroupView'. +ERROR: - 'NewGroupView' is from 'package:fluffychat/pages/new_group/new_group_view.dart' ('lib/pages/new_group/new_group_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: : L10n.of(context).createGroup, +ERROR: ^^^^ +ERROR: lib/pages/new_group/new_group_view.dart:47:33: Error: The getter 'L10n' isn't defined for the class 'NewGroupView'. +ERROR: - 'NewGroupView' is from 'package:fluffychat/pages/new_group/new_group_view.dart' ('lib/pages/new_group/new_group_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: label: Text(L10n.of(context).group), +ERROR: ^^^^ +ERROR: lib/pages/new_group/new_group_view.dart:51:33: Error: The getter 'L10n' isn't defined for the class 'NewGroupView'. +ERROR: - 'NewGroupView' is from 'package:fluffychat/pages/new_group/new_group_view.dart' ('lib/pages/new_group/new_group_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: label: Text(L10n.of(context).space), +ERROR: ^^^^ +ERROR: lib/pages/new_group/new_group_view.dart:86:25: Error: The getter 'L10n' isn't defined for the class 'NewGroupView'. +ERROR: - 'NewGroupView' is from 'package:fluffychat/pages/new_group/new_group_view.dart' ('lib/pages/new_group/new_group_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: ? L10n.of(context).spaceName +ERROR: ^^^^ +ERROR: lib/pages/new_group/new_group_view.dart:87:25: Error: The getter 'L10n' isn't defined for the class 'NewGroupView'. +ERROR: - 'NewGroupView' is from 'package:fluffychat/pages/new_group/new_group_view.dart' ('lib/pages/new_group/new_group_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: : L10n.of(context).groupName, +ERROR: ^^^^ +ERROR: lib/pages/new_group/new_group_view.dart:97:23: Error: The getter 'L10n' isn't defined for the class 'NewGroupView'. +ERROR: - 'NewGroupView' is from 'package:fluffychat/pages/new_group/new_group_view.dart' ('lib/pages/new_group/new_group_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: ? L10n.of(context).spaceIsPublic +ERROR: ^^^^ +ERROR: lib/pages/new_group/new_group_view.dart:98:23: Error: The getter 'L10n' isn't defined for the class 'NewGroupView'. +ERROR: - 'NewGroupView' is from 'package:fluffychat/pages/new_group/new_group_view.dart' ('lib/pages/new_group/new_group_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: : L10n.of(context).groupIsPublic, +ERROR: ^^^^ +ERROR: lib/pages/new_group/new_group_view.dart:111:35: Error: The getter 'L10n' isn't defined for the class 'NewGroupView'. +ERROR: - 'NewGroupView' is from 'package:fluffychat/pages/new_group/new_group_view.dart' ('lib/pages/new_group/new_group_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(L10n.of(context).groupCanBeFoundViaSearch), +ERROR: ^^^^ +ERROR: lib/pages/new_group/new_group_view.dart:132:25: Error: The getter 'L10n' isn't defined for the class 'NewGroupView'. +ERROR: - 'NewGroupView' is from 'package:fluffychat/pages/new_group/new_group_view.dart' ('lib/pages/new_group/new_group_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).enableEncryption, +ERROR: ^^^^ +ERROR: lib/pages/new_group/new_group_view.dart:154:38: Error: The getter 'L10n' isn't defined for the class 'NewGroupView'. +ERROR: - 'NewGroupView' is from 'package:fluffychat/pages/new_group/new_group_view.dart' ('lib/pages/new_group/new_group_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: subtitle: Text(L10n.of(context).newSpaceDescription), +ERROR: ^^^^ +ERROR: lib/pages/new_group/new_group_view.dart:169:33: Error: The getter 'L10n' isn't defined for the class 'NewGroupView'. +ERROR: - 'NewGroupView' is from 'package:fluffychat/pages/new_group/new_group_view.dart' ('lib/pages/new_group/new_group_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: ? L10n.of(context).createNewSpace +ERROR: ^^^^ +ERROR: lib/pages/new_group/new_group_view.dart:170:33: Error: The getter 'L10n' isn't defined for the class 'NewGroupView'. +ERROR: - 'NewGroupView' is from 'package:fluffychat/pages/new_group/new_group_view.dart' ('lib/pages/new_group/new_group_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: : L10n.of(context).createGroupAndInviteUsers, +ERROR: ^^^^ +ERROR: lib/pages/new_private_chat/new_private_chat_view.dart:34:21: Error: The getter 'L10n' isn't defined for the class 'NewPrivateChatView'. +ERROR: - 'NewPrivateChatView' is from 'package:fluffychat/pages/new_private_chat/new_private_chat_view.dart' ('lib/pages/new_private_chat/new_private_chat_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(L10n.of(context).newChat), +ERROR: ^^^^ +ERROR: lib/pages/new_private_chat/new_private_chat_view.dart:40:25: Error: The getter 'L10n' isn't defined for the class 'NewPrivateChatView'. +ERROR: - 'NewPrivateChatView' is from 'package:fluffychat/pages/new_private_chat/new_private_chat_view.dart' ('lib/pages/new_private_chat/new_private_chat_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: child: Text(L10n.of(context).help), +ERROR: ^^^^ +ERROR: lib/pages/new_private_chat/new_private_chat_view.dart:58:29: Error: The getter 'L10n' isn't defined for the class 'NewPrivateChatView'. +ERROR: - 'NewPrivateChatView' is from 'package:fluffychat/pages/new_private_chat/new_private_chat_view.dart' ('lib/pages/new_private_chat/new_private_chat_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: hintText: L10n.of(context).searchForUsers, +ERROR: ^^^^ +ERROR: lib/pages/new_private_chat/new_private_chat_view.dart:115:37: Error: The getter 'L10n' isn't defined for the class 'NewPrivateChatView'. +ERROR: - 'NewPrivateChatView' is from 'package:fluffychat/pages/new_private_chat/new_private_chat_view.dart' ('lib/pages/new_private_chat/new_private_chat_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: text: L10n.of(context).yourGlobalUserIdIs, +ERROR: ^^^^ +ERROR: lib/pages/new_private_chat/new_private_chat_view.dart:138:35: Error: The getter 'L10n' isn't defined for the class 'NewPrivateChatView'. +ERROR: - 'NewPrivateChatView' is from 'package:fluffychat/pages/new_private_chat/new_private_chat_view.dart' ('lib/pages/new_private_chat/new_private_chat_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(L10n.of(context).shareInviteLink), +ERROR: ^^^^ +ERROR: lib/pages/new_private_chat/new_private_chat_view.dart:147:35: Error: The getter 'L10n' isn't defined for the class 'NewPrivateChatView'. +ERROR: - 'NewPrivateChatView' is from 'package:fluffychat/pages/new_private_chat/new_private_chat_view.dart' ('lib/pages/new_private_chat/new_private_chat_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(L10n.of(context).createGroup), +ERROR: ^^^^ +ERROR: lib/pages/new_private_chat/new_private_chat_view.dart:157:37: Error: The getter 'L10n' isn't defined for the class 'NewPrivateChatView'. +ERROR: - 'NewPrivateChatView' is from 'package:fluffychat/pages/new_private_chat/new_private_chat_view.dart' ('lib/pages/new_private_chat/new_private_chat_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(L10n.of(context).scanQrCode), +ERROR: ^^^^ +ERROR: lib/pages/new_private_chat/new_private_chat_view.dart:221:41: Error: The getter 'L10n' isn't defined for the class 'NewPrivateChatView'. +ERROR: - 'NewPrivateChatView' is from 'package:fluffychat/pages/new_private_chat/new_private_chat_view.dart' ('lib/pages/new_private_chat/new_private_chat_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: label: Text(L10n.of(context).tryAgain), +ERROR: ^^^^ +ERROR: lib/pages/new_private_chat/new_private_chat_view.dart:239:31: Error: The getter 'L10n' isn't defined for the class 'NewPrivateChatView'. +ERROR: - 'NewPrivateChatView' is from 'package:fluffychat/pages/new_private_chat/new_private_chat_view.dart' ('lib/pages/new_private_chat/new_private_chat_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).noUsersFoundWithQuery( +ERROR: ^^^^ +ERROR: lib/pages/new_private_chat/qr_scanner_modal.dart:38:20: Error: The getter 'L10n' isn't defined for the class 'QrScannerModalState'. +ERROR: - 'QrScannerModalState' is from 'package:fluffychat/pages/new_private_chat/qr_scanner_modal.dart' ('lib/pages/new_private_chat/qr_scanner_modal.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: tooltip: L10n.of(context).close, +ERROR: ^^^^ +ERROR: lib/pages/new_private_chat/qr_scanner_modal.dart:40:21: Error: The getter 'L10n' isn't defined for the class 'QrScannerModalState'. +ERROR: - 'QrScannerModalState' is from 'package:fluffychat/pages/new_private_chat/qr_scanner_modal.dart' ('lib/pages/new_private_chat/qr_scanner_modal.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(L10n.of(context).scanQrCode), +ERROR: ^^^^ +ERROR: lib/utils/fluffy_share.dart:28:30: Error: Undefined name 'L10n'. +ERROR: SnackBar(content: Text(L10n.of(context).copiedToClipboard)), +ERROR: ^^^^ +ERROR: lib/utils/fluffy_share.dart:37:7: Error: Undefined name 'L10n'. +ERROR: L10n.of(context).inviteText( +ERROR: ^^^^ +ERROR: lib/widgets/adaptive_dialogs/user_dialog.dart:46:9: Error: The getter 'L10n' isn't defined for the class 'UserDialog'. +ERROR: - 'UserDialog' is from 'package:fluffychat/widgets/adaptive_dialogs/user_dialog.dart' ('lib/widgets/adaptive_dialogs/user_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).user; +ERROR: ^^^^ +ERROR: lib/widgets/adaptive_dialogs/user_dialog.dart:65:19: Error: The getter 'L10n' isn't defined for the class 'UserDialog'. +ERROR: - 'UserDialog' is from 'package:fluffychat/widgets/adaptive_dialogs/user_dialog.dart' ('lib/widgets/adaptive_dialogs/user_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: ? L10n.of(context).currentlyActive +ERROR: ^^^^ +ERROR: lib/widgets/adaptive_dialogs/user_dialog.dart:67:23: Error: The getter 'L10n' isn't defined for the class 'UserDialog'. +ERROR: - 'UserDialog' is from 'package:fluffychat/widgets/adaptive_dialogs/user_dialog.dart' ('lib/widgets/adaptive_dialogs/user_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: ? L10n.of(context).lastActiveAgo( +ERROR: ^^^^ +ERROR: lib/widgets/adaptive_dialogs/user_dialog.dart:182:21: Error: The getter 'L10n' isn't defined for the class 'UserDialog'. +ERROR: - 'UserDialog' is from 'package:fluffychat/widgets/adaptive_dialogs/user_dialog.dart' ('lib/widgets/adaptive_dialogs/user_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: ? L10n.of(context).startConversation +ERROR: ^^^^ +ERROR: lib/widgets/adaptive_dialogs/user_dialog.dart:183:21: Error: The getter 'L10n' isn't defined for the class 'UserDialog'. +ERROR: - 'UserDialog' is from 'package:fluffychat/widgets/adaptive_dialogs/user_dialog.dart' ('lib/widgets/adaptive_dialogs/user_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: : L10n.of(context).sendAMessage, +ERROR: ^^^^ +ERROR: lib/widgets/adaptive_dialogs/user_dialog.dart:197:15: Error: The getter 'L10n' isn't defined for the class 'UserDialog'. +ERROR: - 'UserDialog' is from 'package:fluffychat/widgets/adaptive_dialogs/user_dialog.dart' ('lib/widgets/adaptive_dialogs/user_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).ignoreUser, +ERROR: ^^^^ +ERROR: lib/widgets/adaptive_dialogs/user_dialog.dart:205:23: Error: The getter 'L10n' isn't defined for the class 'UserDialog'. +ERROR: - 'UserDialog' is from 'package:fluffychat/widgets/adaptive_dialogs/user_dialog.dart' ('lib/widgets/adaptive_dialogs/user_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: child: Text(L10n.of(context).close), +ERROR: ^^^^ +ERROR: lib/pages/settings/settings_view.dart:53:33: Error: The getter 'L10n' isn't defined for the class 'SettingsView'. +ERROR: - 'SettingsView' is from 'package:fluffychat/pages/settings/settings_view.dart' ('lib/pages/settings/settings_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(L10n.of(context).settings), +ERROR: ^^^^ +ERROR: lib/pages/settings/settings_view.dart:71:27: Error: The getter 'L10n' isn't defined for the class 'SettingsView'. +ERROR: - 'SettingsView' is from 'package:fluffychat/pages/settings/settings_view.dart' ('lib/pages/settings/settings_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).user; +ERROR: ^^^^ +ERROR: lib/pages/settings/settings_view.dart:162:35: Error: The getter 'L10n' isn't defined for the class 'SettingsView'. +ERROR: - 'SettingsView' is from 'package:fluffychat/pages/settings/settings_view.dart' ('lib/pages/settings/settings_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(L10n.of(context).manageAccount), +ERROR: ^^^^ +ERROR: lib/pages/settings/settings_view.dart:173:35: Error: The getter 'L10n' isn't defined for the class 'SettingsView'. +ERROR: - 'SettingsView' is from 'package:fluffychat/pages/settings/settings_view.dart' ('lib/pages/settings/settings_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(L10n.of(context).chatBackup), +ERROR: ^^^^ +ERROR: lib/pages/settings/settings_view.dart:181:35: Error: The getter 'L10n' isn't defined for the class 'SettingsView'. +ERROR: - 'SettingsView' is from 'package:fluffychat/pages/settings/settings_view.dart' ('lib/pages/settings/settings_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(L10n.of(context).chatBackup), +ERROR: ^^^^ +ERROR: lib/pages/settings/settings_view.dart:189:33: Error: The getter 'L10n' isn't defined for the class 'SettingsView'. +ERROR: - 'SettingsView' is from 'package:fluffychat/pages/settings/settings_view.dart' ('lib/pages/settings/settings_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(L10n.of(context).changeTheme), +ERROR: ^^^^ +ERROR: lib/pages/settings/settings_view.dart:197:33: Error: The getter 'L10n' isn't defined for the class 'SettingsView'. +ERROR: - 'SettingsView' is from 'package:fluffychat/pages/settings/settings_view.dart' ('lib/pages/settings/settings_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(L10n.of(context).notifications), +ERROR: ^^^^ +ERROR: lib/pages/settings/settings_view.dart:206:33: Error: The getter 'L10n' isn't defined for the class 'SettingsView'. +ERROR: - 'SettingsView' is from 'package:fluffychat/pages/settings/settings_view.dart' ('lib/pages/settings/settings_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(L10n.of(context).devices), +ERROR: ^^^^ +ERROR: lib/pages/settings/settings_view.dart:214:33: Error: The getter 'L10n' isn't defined for the class 'SettingsView'. +ERROR: - 'SettingsView' is from 'package:fluffychat/pages/settings/settings_view.dart' ('lib/pages/settings/settings_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(L10n.of(context).chat), +ERROR: ^^^^ +ERROR: lib/pages/settings/settings_view.dart:222:33: Error: The getter 'L10n' isn't defined for the class 'SettingsView'. +ERROR: - 'SettingsView' is from 'package:fluffychat/pages/settings/settings_view.dart' ('lib/pages/settings/settings_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(L10n.of(context).security), +ERROR: ^^^^ +ERROR: lib/pages/settings/settings_view.dart:233:23: Error: The getter 'L10n' isn't defined for the class 'SettingsView'. +ERROR: - 'SettingsView' is from 'package:fluffychat/pages/settings/settings_view.dart' ('lib/pages/settings/settings_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).aboutHomeserver( +ERROR: ^^^^ +ERROR: lib/pages/settings/settings_view.dart:246:33: Error: The getter 'L10n' isn't defined for the class 'SettingsView'. +ERROR: - 'SettingsView' is from 'package:fluffychat/pages/settings/settings_view.dart' ('lib/pages/settings/settings_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(L10n.of(context).privacy), +ERROR: ^^^^ +ERROR: lib/pages/settings/settings_view.dart:251:33: Error: The getter 'L10n' isn't defined for the class 'SettingsView'. +ERROR: - 'SettingsView' is from 'package:fluffychat/pages/settings/settings_view.dart' ('lib/pages/settings/settings_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(L10n.of(context).about), +ERROR: ^^^^ +ERROR: lib/pages/settings/settings_view.dart:257:33: Error: The getter 'L10n' isn't defined for the class 'SettingsView'. +ERROR: - 'SettingsView' is from 'package:fluffychat/pages/settings/settings_view.dart' ('lib/pages/settings/settings_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(L10n.of(context).logout), +ERROR: ^^^^ +ERROR: lib/pages/settings_3pid/settings_3pid_view.dart:23:21: Error: The getter 'L10n' isn't defined for the class 'Settings3PidView'. +ERROR: - 'Settings3PidView' is from 'package:fluffychat/pages/settings_3pid/settings_3pid_view.dart' ('lib/pages/settings_3pid/settings_3pid_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(L10n.of(context).passwordRecovery), +ERROR: ^^^^ +ERROR: lib/pages/settings_3pid/settings_3pid_view.dart:28:22: Error: The getter 'L10n' isn't defined for the class 'Settings3PidView'. +ERROR: - 'Settings3PidView' is from 'package:fluffychat/pages/settings_3pid/settings_3pid_view.dart' ('lib/pages/settings_3pid/settings_3pid_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: tooltip: L10n.of(context).addEmail, +ERROR: ^^^^ +ERROR: lib/pages/settings_3pid/settings_3pid_view.dart:69:27: Error: The getter 'L10n' isn't defined for the class 'Settings3PidView'. +ERROR: - 'Settings3PidView' is from 'package:fluffychat/pages/settings_3pid/settings_3pid_view.dart' ('lib/pages/settings_3pid/settings_3pid_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: ? L10n.of(context).noPasswordRecoveryDescription +ERROR: ^^^^ +ERROR: lib/pages/settings_3pid/settings_3pid_view.dart:70:27: Error: The getter 'L10n' isn't defined for the class 'Settings3PidView'. +ERROR: - 'Settings3PidView' is from 'package:fluffychat/pages/settings_3pid/settings_3pid_view.dart' ('lib/pages/settings_3pid/settings_3pid_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: : L10n.of(context) +ERROR: ^^^^ +ERROR: lib/pages/settings_3pid/settings_3pid_view.dart:86:34: Error: The getter 'L10n' isn't defined for the class 'Settings3PidView'. +ERROR: - 'Settings3PidView' is from 'package:fluffychat/pages/settings_3pid/settings_3pid_view.dart' ('lib/pages/settings_3pid/settings_3pid_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: tooltip: L10n.of(context).delete, +ERROR: ^^^^ +ERROR: lib/pages/settings_chat/settings_chat_view.dart:25:21: Error: The getter 'L10n' isn't defined for the class 'SettingsChatView'. +ERROR: - 'SettingsChatView' is from 'package:fluffychat/pages/settings_chat/settings_chat_view.dart' ('lib/pages/settings_chat/settings_chat_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(L10n.of(context).chat), +ERROR: ^^^^ +ERROR: lib/pages/settings_chat/settings_chat_view.dart:35:24: Error: The getter 'L10n' isn't defined for the class 'SettingsChatView'. +ERROR: - 'SettingsChatView' is from 'package:fluffychat/pages/settings_chat/settings_chat_view.dart' ('lib/pages/settings_chat/settings_chat_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).formattedMessages, +ERROR: ^^^^ +ERROR: lib/pages/settings_chat/settings_chat_view.dart:36:27: Error: The getter 'L10n' isn't defined for the class 'SettingsChatView'. +ERROR: - 'SettingsChatView' is from 'package:fluffychat/pages/settings_chat/settings_chat_view.dart' ('lib/pages/settings_chat/settings_chat_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: subtitle: L10n.of(context).formattedMessagesDescription, +ERROR: ^^^^ +ERROR: lib/pages/settings_chat/settings_chat_view.dart:42:24: Error: The getter 'L10n' isn't defined for the class 'SettingsChatView'. +ERROR: - 'SettingsChatView' is from 'package:fluffychat/pages/settings_chat/settings_chat_view.dart' ('lib/pages/settings_chat/settings_chat_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).hideMemberChangesInPublicChats, +ERROR: ^^^^ +ERROR: lib/pages/settings_chat/settings_chat_view.dart:43:27: Error: The getter 'L10n' isn't defined for the class 'SettingsChatView'. +ERROR: - 'SettingsChatView' is from 'package:fluffychat/pages/settings_chat/settings_chat_view.dart' ('lib/pages/settings_chat/settings_chat_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: subtitle: L10n.of(context).hideMemberChangesInPublicChatsBody, +ERROR: ^^^^ +ERROR: lib/pages/settings_chat/settings_chat_view.dart:49:24: Error: The getter 'L10n' isn't defined for the class 'SettingsChatView'. +ERROR: - 'SettingsChatView' is from 'package:fluffychat/pages/settings_chat/settings_chat_view.dart' ('lib/pages/settings_chat/settings_chat_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).hideRedactedMessages, +ERROR: ^^^^ +ERROR: lib/pages/settings_chat/settings_chat_view.dart:50:27: Error: The getter 'L10n' isn't defined for the class 'SettingsChatView'. +ERROR: - 'SettingsChatView' is from 'package:fluffychat/pages/settings_chat/settings_chat_view.dart' ('lib/pages/settings_chat/settings_chat_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: subtitle: L10n.of(context).hideRedactedMessagesBody, +ERROR: ^^^^ +ERROR: lib/pages/settings_chat/settings_chat_view.dart:56:24: Error: The getter 'L10n' isn't defined for the class 'SettingsChatView'. +ERROR: - 'SettingsChatView' is from 'package:fluffychat/pages/settings_chat/settings_chat_view.dart' ('lib/pages/settings_chat/settings_chat_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).hideInvalidOrUnknownMessageFormats, +ERROR: ^^^^ +ERROR: lib/pages/settings_chat/settings_chat_view.dart:63:26: Error: The getter 'L10n' isn't defined for the class 'SettingsChatView'. +ERROR: - 'SettingsChatView' is from 'package:fluffychat/pages/settings_chat/settings_chat_view.dart' ('lib/pages/settings_chat/settings_chat_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).autoplayImages, +ERROR: ^^^^ +ERROR: lib/pages/settings_chat/settings_chat_view.dart:69:24: Error: The getter 'L10n' isn't defined for the class 'SettingsChatView'. +ERROR: - 'SettingsChatView' is from 'package:fluffychat/pages/settings_chat/settings_chat_view.dart' ('lib/pages/settings_chat/settings_chat_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).sendOnEnter, +ERROR: ^^^^ +ERROR: lib/pages/settings_chat/settings_chat_view.dart:75:24: Error: The getter 'L10n' isn't defined for the class 'SettingsChatView'. +ERROR: - 'SettingsChatView' is from 'package:fluffychat/pages/settings_chat/settings_chat_view.dart' ('lib/pages/settings_chat/settings_chat_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).swipeRightToLeftToReply, +ERROR: ^^^^ +ERROR: lib/pages/settings_chat/settings_chat_view.dart:83:19: Error: The getter 'L10n' isn't defined for the class 'SettingsChatView'. +ERROR: - 'SettingsChatView' is from 'package:fluffychat/pages/settings_chat/settings_chat_view.dart' ('lib/pages/settings_chat/settings_chat_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).customEmojisAndStickers, +ERROR: ^^^^ +ERROR: lib/pages/settings_chat/settings_chat_view.dart:91:29: Error: The getter 'L10n' isn't defined for the class 'SettingsChatView'. +ERROR: - 'SettingsChatView' is from 'package:fluffychat/pages/settings_chat/settings_chat_view.dart' ('lib/pages/settings_chat/settings_chat_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(L10n.of(context).customEmojisAndStickers), +ERROR: ^^^^ +ERROR: lib/pages/settings_chat/settings_chat_view.dart:92:32: Error: The getter 'L10n' isn't defined for the class 'SettingsChatView'. +ERROR: - 'SettingsChatView' is from 'package:fluffychat/pages/settings_chat/settings_chat_view.dart' ('lib/pages/settings_chat/settings_chat_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: subtitle: Text(L10n.of(context).customEmojisAndStickersBody), +ERROR: ^^^^ +ERROR: lib/pages/settings_chat/settings_chat_view.dart:102:19: Error: The getter 'L10n' isn't defined for the class 'SettingsChatView'. +ERROR: - 'SettingsChatView' is from 'package:fluffychat/pages/settings_chat/settings_chat_view.dart' ('lib/pages/settings_chat/settings_chat_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).calls, +ERROR: ^^^^ +ERROR: lib/pages/settings_chat/settings_chat_view.dart:110:24: Error: The getter 'L10n' isn't defined for the class 'SettingsChatView'. +ERROR: - 'SettingsChatView' is from 'package:fluffychat/pages/settings_chat/settings_chat_view.dart' ('lib/pages/settings_chat/settings_chat_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).experimentalVideoCalls, +ERROR: ^^^^ +ERROR: lib/pages/settings_emotes/import_archive_dialog.dart:47:19: Error: The getter 'L10n' isn't defined for the class '_ImportEmoteArchiveDialogState'. +ERROR: - '_ImportEmoteArchiveDialogState' is from 'package:fluffychat/pages/settings_emotes/import_archive_dialog.dart' ('lib/pages/settings_emotes/import_archive_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(L10n.of(context).importEmojis), +ERROR: ^^^^ +ERROR: lib/pages/settings_emotes/import_archive_dialog.dart:76:23: Error: The getter 'L10n' isn't defined for the class '_ImportEmoteArchiveDialogState'. +ERROR: - '_ImportEmoteArchiveDialogState' is from 'package:fluffychat/pages/settings_emotes/import_archive_dialog.dart' ('lib/pages/settings_emotes/import_archive_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: child: Text(L10n.of(context).cancel), +ERROR: ^^^^ +ERROR: lib/pages/settings_emotes/import_archive_dialog.dart:84:23: Error: The getter 'L10n' isn't defined for the class '_ImportEmoteArchiveDialogState'. +ERROR: - '_ImportEmoteArchiveDialogState' is from 'package:fluffychat/pages/settings_emotes/import_archive_dialog.dart' ('lib/pages/settings_emotes/import_archive_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: child: Text(L10n.of(context).importNow), +ERROR: ^^^^ +ERROR: lib/pages/settings_emotes/import_archive_dialog.dart:124:20: Error: The getter 'L10n' isn't defined for the class '_ImportEmoteArchiveDialogState'. +ERROR: - '_ImportEmoteArchiveDialogState' is from 'package:fluffychat/pages/settings_emotes/import_archive_dialog.dart' ('lib/pages/settings_emotes/import_archive_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).emoteExists, +ERROR: ^^^^ +ERROR: lib/pages/settings_emotes/import_archive_dialog.dart:126:26: Error: The getter 'L10n' isn't defined for the class '_ImportEmoteArchiveDialogState'. +ERROR: - '_ImportEmoteArchiveDialogState' is from 'package:fluffychat/pages/settings_emotes/import_archive_dialog.dart' ('lib/pages/settings_emotes/import_archive_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: cancelLabel: L10n.of(context).replace, +ERROR: ^^^^ +ERROR: lib/pages/settings_emotes/import_archive_dialog.dart:127:22: Error: The getter 'L10n' isn't defined for the class '_ImportEmoteArchiveDialogState'. +ERROR: - '_ImportEmoteArchiveDialogState' is from 'package:fluffychat/pages/settings_emotes/import_archive_dialog.dart' ('lib/pages/settings_emotes/import_archive_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: okLabel: L10n.of(context).skip, +ERROR: ^^^^ +ERROR: lib/pages/settings_emotes/import_archive_dialog.dart:245:20: Error: The getter 'L10n' isn't defined for the class '_EmojiImportPreviewState'. +ERROR: - '_EmojiImportPreviewState' is from 'package:fluffychat/pages/settings_emotes/import_archive_dialog.dart' ('lib/pages/settings_emotes/import_archive_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: tooltip: L10n.of(context).remove, +ERROR: ^^^^ +ERROR: lib/pages/settings_emotes/import_archive_dialog.dart:281:33: Error: The getter 'L10n' isn't defined for the class '_EmojiImportPreviewState'. +ERROR: - '_EmojiImportPreviewState' is from 'package:fluffychat/pages/settings_emotes/import_archive_dialog.dart' ('lib/pages/settings_emotes/import_archive_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: hintText: L10n.of(context).emoteShortcode, +ERROR: ^^^^ +ERROR: lib/pages/settings_emotes/import_archive_dialog.dart:332:15: Error: The getter 'L10n' isn't defined for the class '_ImageFileError'. +ERROR: - '_ImageFileError' is from 'package:fluffychat/pages/settings_emotes/import_archive_dialog.dart' ('lib/pages/settings_emotes/import_archive_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).notAnImage, +ERROR: ^^^^ +ERROR: lib/pages/settings_emotes/settings_emotes_view.dart:29:21: Error: The getter 'L10n' isn't defined for the class 'EmotesSettingsView'. +ERROR: - 'EmotesSettingsView' is from 'package:fluffychat/pages/settings_emotes/settings_emotes_view.dart' ('lib/pages/settings_emotes/settings_emotes_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(L10n.of(context).customEmojisAndStickers), +ERROR: ^^^^ +ERROR: lib/pages/settings_emotes/settings_emotes_view.dart:46:29: Error: The getter 'L10n' isn't defined for the class 'EmotesSettingsView'. +ERROR: - 'EmotesSettingsView' is from 'package:fluffychat/pages/settings_emotes/settings_emotes_view.dart' ('lib/pages/settings_emotes/settings_emotes_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: child: Text(L10n.of(context).importFromZipFile), +ERROR: ^^^^ +ERROR: lib/pages/settings_emotes/settings_emotes_view.dart:50:29: Error: The getter 'L10n' isn't defined for the class 'EmotesSettingsView'. +ERROR: - 'EmotesSettingsView' is from 'package:fluffychat/pages/settings_emotes/settings_emotes_view.dart' ('lib/pages/settings_emotes/settings_emotes_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: child: Text(L10n.of(context).exportEmotePack), +ERROR: ^^^^ +ERROR: lib/pages/settings_emotes/settings_emotes_view.dart:86:35: Error: The getter 'L10n' isn't defined for the class 'EmotesSettingsView'. +ERROR: - 'EmotesSettingsView' is from 'package:fluffychat/pages/settings_emotes/settings_emotes_view.dart' ('lib/pages/settings_emotes/settings_emotes_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: hintText: L10n.of(context).emoteShortcode, +ERROR: ^^^^ +ERROR: lib/pages/settings_emotes/settings_emotes_view.dart:117:29: Error: The getter 'L10n' isn't defined for the class 'EmotesSettingsView'. +ERROR: - 'EmotesSettingsView' is from 'package:fluffychat/pages/settings_emotes/settings_emotes_view.dart' ('lib/pages/settings_emotes/settings_emotes_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(L10n.of(context).enableEmotesGlobally), +ERROR: ^^^^ +ERROR: lib/pages/settings_emotes/settings_emotes_view.dart:128:25: Error: The getter 'L10n' isn't defined for the class 'EmotesSettingsView'. +ERROR: - 'EmotesSettingsView' is from 'package:fluffychat/pages/settings_emotes/settings_emotes_view.dart' ('lib/pages/settings_emotes/settings_emotes_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).noEmotesFound, +ERROR: ^^^^ +ERROR: lib/pages/settings_emotes/settings_emotes_view.dart:189:45: Error: The getter 'L10n' isn't defined for the class 'EmotesSettingsView'. +ERROR: - 'EmotesSettingsView' is from 'package:fluffychat/pages/settings_emotes/settings_emotes_view.dart' ('lib/pages/settings_emotes/settings_emotes_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: hintText: L10n.of(context).emoteShortcode, +ERROR: ^^^^ +ERROR: lib/pages/settings_emotes/settings_emotes_view.dart:273:21: Error: The getter 'L10n' isn't defined for the class '_ImagePickerState'. +ERROR: - '_ImagePickerState' is from 'package:fluffychat/pages/settings_emotes/settings_emotes_view.dart' ('lib/pages/settings_emotes/settings_emotes_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: child: Text(L10n.of(context).pickImage), +ERROR: ^^^^ +ERROR: lib/pages/settings_homeserver/settings_homeserver_view.dart:33:11: Error: The getter 'L10n' isn't defined for the class 'SettingsHomeserverView'. +ERROR: - 'SettingsHomeserverView' is from 'package:fluffychat/pages/settings_homeserver/settings_homeserver_view.dart' ('lib/pages/settings_homeserver/settings_homeserver_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context) +ERROR: ^^^^ +ERROR: lib/pages/settings_homeserver/settings_homeserver_view.dart:45:19: Error: The getter 'L10n' isn't defined for the class 'SettingsHomeserverView'. +ERROR: - 'SettingsHomeserverView' is from 'package:fluffychat/pages/settings_homeserver/settings_homeserver_view.dart' ('lib/pages/settings_homeserver/settings_homeserver_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).serverInformation, +ERROR: ^^^^ +ERROR: lib/pages/settings_homeserver/settings_homeserver_view.dart:82:25: Error: The getter 'L10n' isn't defined for the class 'SettingsHomeserverView'. +ERROR: - 'SettingsHomeserverView' is from 'package:fluffychat/pages/settings_homeserver/settings_homeserver_view.dart' ('lib/pages/settings_homeserver/settings_homeserver_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).noContactInformationProvided, +ERROR: ^^^^ +ERROR: lib/pages/settings_homeserver/settings_homeserver_view.dart:92:39: Error: The getter 'L10n' isn't defined for the class 'SettingsHomeserverView'. +ERROR: - 'SettingsHomeserverView' is from 'package:fluffychat/pages/settings_homeserver/settings_homeserver_view.dart' ('lib/pages/settings_homeserver/settings_homeserver_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(L10n.of(context).supportPage), +ERROR: ^^^^ +ERROR: lib/pages/settings_homeserver/settings_homeserver_view.dart:101:35: Error: The getter 'L10n' isn't defined for the class 'SettingsHomeserverView'. +ERROR: - 'SettingsHomeserverView' is from 'package:fluffychat/pages/settings_homeserver/settings_homeserver_view.dart' ('lib/pages/settings_homeserver/settings_homeserver_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context), +ERROR: ^^^^ +ERROR: lib/pages/settings_homeserver/settings_homeserver_view.dart:161:37: Error: The getter 'L10n' isn't defined for the class 'SettingsHomeserverView'. +ERROR: - 'SettingsHomeserverView' is from 'package:fluffychat/pages/settings_homeserver/settings_homeserver_view.dart' ('lib/pages/settings_homeserver/settings_homeserver_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(L10n.of(context).name), +ERROR: ^^^^ +ERROR: lib/pages/settings_homeserver/settings_homeserver_view.dart:165:37: Error: The getter 'L10n' isn't defined for the class 'SettingsHomeserverView'. +ERROR: - 'SettingsHomeserverView' is from 'package:fluffychat/pages/settings_homeserver/settings_homeserver_view.dart' ('lib/pages/settings_homeserver/settings_homeserver_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(L10n.of(context).version), +ERROR: ^^^^ +ERROR: lib/pages/settings_homeserver/settings_homeserver_view.dart:295:26: Error: 'L10n' isn't a type. +ERROR: String localizedString(L10n l10n) { +ERROR: ^^^^ +ERROR: lib/pages/settings_ignore_list/settings_ignore_list_view.dart:25:21: Error: The getter 'L10n' isn't defined for the class 'SettingsIgnoreListView'. +ERROR: - 'SettingsIgnoreListView' is from 'package:fluffychat/pages/settings_ignore_list/settings_ignore_list_view.dart' ('lib/pages/settings_ignore_list/settings_ignore_list_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(L10n.of(context).blockedUsers), +ERROR: ^^^^ +ERROR: lib/pages/settings_ignore_list/settings_ignore_list_view.dart:46:34: Error: The getter 'L10n' isn't defined for the class 'SettingsIgnoreListView'. +ERROR: - 'SettingsIgnoreListView' is from 'package:fluffychat/pages/settings_ignore_list/settings_ignore_list_view.dart' ('lib/pages/settings_ignore_list/settings_ignore_list_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: labelText: L10n.of(context).blockUsername, +ERROR: ^^^^ +ERROR: lib/pages/settings_ignore_list/settings_ignore_list_view.dart:48:34: Error: The getter 'L10n' isn't defined for the class 'SettingsIgnoreListView'. +ERROR: - 'SettingsIgnoreListView' is from 'package:fluffychat/pages/settings_ignore_list/settings_ignore_list_view.dart' ('lib/pages/settings_ignore_list/settings_ignore_list_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: tooltip: L10n.of(context).block, +ERROR: ^^^^ +ERROR: lib/pages/settings_ignore_list/settings_ignore_list_view.dart:56:21: Error: The getter 'L10n' isn't defined for the class 'SettingsIgnoreListView'. +ERROR: - 'SettingsIgnoreListView' is from 'package:fluffychat/pages/settings_ignore_list/settings_ignore_list_view.dart' ('lib/pages/settings_ignore_list/settings_ignore_list_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).blockListDescription, +ERROR: ^^^^ +ERROR: lib/pages/settings_ignore_list/settings_ignore_list_view.dart:92:36: Error: The getter 'L10n' isn't defined for the class 'SettingsIgnoreListView'. +ERROR: - 'SettingsIgnoreListView' is from 'package:fluffychat/pages/settings_ignore_list/settings_ignore_list_view.dart' ('lib/pages/settings_ignore_list/settings_ignore_list_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: tooltip: L10n.of(context).delete, +ERROR: ^^^^ +ERROR: lib/pages/settings_multiple_emotes/settings_multiple_emotes_view.dart:21:21: Error: The getter 'L10n' isn't defined for the class 'MultipleEmotesSettingsView'. +ERROR: - 'MultipleEmotesSettingsView' is from 'package:fluffychat/pages/settings_multiple_emotes/settings_multiple_emotes_view.dart' ('lib/pages/settings_multiple_emotes/settings_multiple_emotes_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(L10n.of(context).emotePacks), +ERROR: ^^^^ +ERROR: lib/pages/settings_notifications/push_rule_extensions.dart:5:26: Error: 'L10n' isn't a type. +ERROR: String getPushRuleName(L10n l10n) { +ERROR: ^^^^ +ERROR: lib/pages/settings_notifications/push_rule_extensions.dart:52:33: Error: 'L10n' isn't a type. +ERROR: String getPushRuleDescription(L10n l10n) { +ERROR: ^^^^ +ERROR: lib/pages/settings_notifications/push_rule_extensions.dart:101:20: Error: 'L10n' isn't a type. +ERROR: String localized(L10n l10n) { +ERROR: ^^^^ +ERROR: lib/pages/settings_notifications/settings_notifications_view.dart:35:21: Error: The getter 'L10n' isn't defined for the class 'SettingsNotificationsView'. +ERROR: - 'SettingsNotificationsView' is from 'package:fluffychat/pages/settings_notifications/settings_notifications_view.dart' ('lib/pages/settings_notifications/settings_notifications_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(L10n.of(context).notifications), +ERROR: ^^^^ +ERROR: lib/pages/settings_notifications/settings_notifications_view.dart:55:51: Error: The getter 'L10n' isn't defined for the class 'SettingsNotificationsView'. +ERROR: - 'SettingsNotificationsView' is from 'package:fluffychat/pages/settings_notifications/settings_notifications_view.dart' ('lib/pages/settings_notifications/settings_notifications_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: category.kind.localized(L10n.of(context)), +ERROR: ^^^^ +ERROR: lib/pages/settings_notifications/settings_notifications_view.dart:64:60: Error: The getter 'L10n' isn't defined for the class 'SettingsNotificationsView'. +ERROR: - 'SettingsNotificationsView' is from 'package:fluffychat/pages/settings_notifications/settings_notifications_view.dart' ('lib/pages/settings_notifications/settings_notifications_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(rule.getPushRuleName(L10n.of(context))), +ERROR: ^^^^ +ERROR: lib/pages/settings_notifications/settings_notifications_view.dart:70:37: Error: The getter 'L10n' isn't defined for the class 'SettingsNotificationsView'. +ERROR: - 'SettingsNotificationsView' is from 'package:fluffychat/pages/settings_notifications/settings_notifications_view.dart' ('lib/pages/settings_notifications/settings_notifications_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context), +ERROR: ^^^^ +ERROR: lib/pages/settings_notifications/settings_notifications_view.dart:81:39: Error: The getter 'L10n' isn't defined for the class 'SettingsNotificationsView'. +ERROR: - 'SettingsNotificationsView' is from 'package:fluffychat/pages/settings_notifications/settings_notifications_view.dart' ('lib/pages/settings_notifications/settings_notifications_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).more, +ERROR: ^^^^ +ERROR: lib/pages/settings_notifications/settings_notifications_view.dart:113:23: Error: The getter 'L10n' isn't defined for the class 'SettingsNotificationsView'. +ERROR: - 'SettingsNotificationsView' is from 'package:fluffychat/pages/settings_notifications/settings_notifications_view.dart' ('lib/pages/settings_notifications/settings_notifications_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).devices, +ERROR: ^^^^ +ERROR: lib/pages/settings_notifications/settings_notifications_view.dart:143:41: Error: The getter 'L10n' isn't defined for the class 'SettingsNotificationsView'. +ERROR: - 'SettingsNotificationsView' is from 'package:fluffychat/pages/settings_notifications/settings_notifications_view.dart' ('lib/pages/settings_notifications/settings_notifications_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: child: Text(L10n.of(context).noOtherDevicesFound), +ERROR: ^^^^ +ERROR: lib/pages/settings_password/settings_password_view.dart:19:21: Error: The getter 'L10n' isn't defined for the class 'SettingsPasswordView'. +ERROR: - 'SettingsPasswordView' is from 'package:fluffychat/pages/settings_password/settings_password_view.dart' ('lib/pages/settings_password/settings_password_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(L10n.of(context).changePassword), +ERROR: ^^^^ +ERROR: lib/pages/settings_password/settings_password_view.dart:38:32: Error: The getter 'L10n' isn't defined for the class 'SettingsPasswordView'. +ERROR: - 'SettingsPasswordView' is from 'package:fluffychat/pages/settings_password/settings_password_view.dart' ('lib/pages/settings_password/settings_password_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: labelText: L10n.of(context).pleaseEnterYourCurrentPassword, +ERROR: ^^^^ +ERROR: lib/pages/settings_password/settings_password_view.dart:51:32: Error: The getter 'L10n' isn't defined for the class 'SettingsPasswordView'. +ERROR: - 'SettingsPasswordView' is from 'package:fluffychat/pages/settings_password/settings_password_view.dart' ('lib/pages/settings_password/settings_password_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: labelText: L10n.of(context).newPassword, +ERROR: ^^^^ +ERROR: lib/pages/settings_password/settings_password_view.dart:64:32: Error: The getter 'L10n' isn't defined for the class 'SettingsPasswordView'. +ERROR: - 'SettingsPasswordView' is from 'package:fluffychat/pages/settings_password/settings_password_view.dart' ('lib/pages/settings_password/settings_password_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: labelText: L10n.of(context).repeatPassword, +ERROR: ^^^^ +ERROR: lib/pages/settings_password/settings_password_view.dart:76:32: Error: The getter 'L10n' isn't defined for the class 'SettingsPasswordView'. +ERROR: - 'SettingsPasswordView' is from 'package:fluffychat/pages/settings_password/settings_password_view.dart' ('lib/pages/settings_password/settings_password_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: : Text(L10n.of(context).changePassword), +ERROR: ^^^^ +ERROR: lib/pages/settings_password/settings_password_view.dart:81:31: Error: The getter 'L10n' isn't defined for the class 'SettingsPasswordView'. +ERROR: - 'SettingsPasswordView' is from 'package:fluffychat/pages/settings_password/settings_password_view.dart' ('lib/pages/settings_password/settings_password_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: child: Text(L10n.of(context).passwordRecoverySettings), +ERROR: ^^^^ +ERROR: lib/pages/settings_security/settings_security_view.dart:28:21: Error: The getter 'L10n' isn't defined for the class 'SettingsSecurityView'. +ERROR: - 'SettingsSecurityView' is from 'package:fluffychat/pages/settings_security/settings_security_view.dart' ('lib/pages/settings_security/settings_security_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(L10n.of(context).security), +ERROR: ^^^^ +ERROR: lib/pages/settings_security/settings_security_view.dart:55:23: Error: The getter 'L10n' isn't defined for the class 'SettingsSecurityView'. +ERROR: - 'SettingsSecurityView' is from 'package:fluffychat/pages/settings_security/settings_security_view.dart' ('lib/pages/settings_security/settings_security_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).security, +ERROR: ^^^^ +ERROR: lib/pages/settings_security/settings_security_view.dart:63:28: Error: The getter 'L10n' isn't defined for the class 'SettingsSecurityView'. +ERROR: - 'SettingsSecurityView' is from 'package:fluffychat/pages/settings_security/settings_security_view.dart' ('lib/pages/settings_security/settings_security_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).hideAvatarsInInvites, +ERROR: ^^^^ +ERROR: lib/pages/settings_security/settings_security_view.dart:65:25: Error: The getter 'L10n' isn't defined for the class 'SettingsSecurityView'. +ERROR: - 'SettingsSecurityView' is from 'package:fluffychat/pages/settings_security/settings_security_view.dart' ('lib/pages/settings_security/settings_security_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).hideAvatarsInInvitesDescription, +ERROR: ^^^^ +ERROR: lib/pages/settings_security/settings_security_view.dart:72:23: Error: The getter 'L10n' isn't defined for the class 'SettingsSecurityView'. +ERROR: - 'SettingsSecurityView' is from 'package:fluffychat/pages/settings_security/settings_security_view.dart' ('lib/pages/settings_security/settings_security_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).privacy, +ERROR: ^^^^ +ERROR: lib/pages/settings_security/settings_security_view.dart:80:28: Error: The getter 'L10n' isn't defined for the class 'SettingsSecurityView'. +ERROR: - 'SettingsSecurityView' is from 'package:fluffychat/pages/settings_security/settings_security_view.dart' ('lib/pages/settings_security/settings_security_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).sendTypingNotifications, +ERROR: ^^^^ +ERROR: lib/pages/settings_security/settings_security_view.dart:82:25: Error: The getter 'L10n' isn't defined for the class 'SettingsSecurityView'. +ERROR: - 'SettingsSecurityView' is from 'package:fluffychat/pages/settings_security/settings_security_view.dart' ('lib/pages/settings_security/settings_security_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).sendTypingNotificationsDescription, +ERROR: ^^^^ +ERROR: lib/pages/settings_security/settings_security_view.dart:88:28: Error: The getter 'L10n' isn't defined for the class 'SettingsSecurityView'. +ERROR: - 'SettingsSecurityView' is from 'package:fluffychat/pages/settings_security/settings_security_view.dart' ('lib/pages/settings_security/settings_security_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).sendReadReceipts, +ERROR: ^^^^ +ERROR: lib/pages/settings_security/settings_security_view.dart:89:31: Error: The getter 'L10n' isn't defined for the class 'SettingsSecurityView'. +ERROR: - 'SettingsSecurityView' is from 'package:fluffychat/pages/settings_security/settings_security_view.dart' ('lib/pages/settings_security/settings_security_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: subtitle: L10n.of(context).sendReadReceiptsDescription, +ERROR: ^^^^ +ERROR: lib/pages/settings_security/settings_security_view.dart:96:33: Error: The getter 'L10n' isn't defined for the class 'SettingsSecurityView'. +ERROR: - 'SettingsSecurityView' is from 'package:fluffychat/pages/settings_security/settings_security_view.dart' ('lib/pages/settings_security/settings_security_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(L10n.of(context).blockedUsers), +ERROR: ^^^^ +ERROR: lib/pages/settings_security/settings_security_view.dart:98:23: Error: The getter 'L10n' isn't defined for the class 'SettingsSecurityView'. +ERROR: - 'SettingsSecurityView' is from 'package:fluffychat/pages/settings_security/settings_security_view.dart' ('lib/pages/settings_security/settings_security_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).thereAreCountUsersBlocked( +ERROR: ^^^^ +ERROR: lib/pages/settings_security/settings_security_view.dart:109:37: Error: The getter 'L10n' isn't defined for the class 'SettingsSecurityView'. +ERROR: - 'SettingsSecurityView' is from 'package:fluffychat/pages/settings_security/settings_security_view.dart' ('lib/pages/settings_security/settings_security_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(L10n.of(context).appLock), +ERROR: ^^^^ +ERROR: lib/pages/settings_security/settings_security_view.dart:110:40: Error: The getter 'L10n' isn't defined for the class 'SettingsSecurityView'. +ERROR: - 'SettingsSecurityView' is from 'package:fluffychat/pages/settings_security/settings_security_view.dart' ('lib/pages/settings_security/settings_security_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: subtitle: Text(L10n.of(context).appLockDescription), +ERROR: ^^^^ +ERROR: lib/pages/settings_security/settings_security_view.dart:117:23: Error: The getter 'L10n' isn't defined for the class 'SettingsSecurityView'. +ERROR: - 'SettingsSecurityView' is from 'package:fluffychat/pages/settings_security/settings_security_view.dart' ('lib/pages/settings_security/settings_security_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).shareKeysWith, +ERROR: ^^^^ +ERROR: lib/pages/settings_security/settings_security_view.dart:123:36: Error: The getter 'L10n' isn't defined for the class 'SettingsSecurityView'. +ERROR: - 'SettingsSecurityView' is from 'package:fluffychat/pages/settings_security/settings_security_view.dart' ('lib/pages/settings_security/settings_security_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: subtitle: Text(L10n.of(context).shareKeysWithDescription), +ERROR: ^^^^ +ERROR: lib/pages/settings_security/settings_security_view.dart:141:61: Error: The getter 'L10n' isn't defined for the class 'SettingsSecurityView'. +ERROR: - 'SettingsSecurityView' is from 'package:fluffychat/pages/settings_security/settings_security_view.dart' ('lib/pages/settings_security/settings_security_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: child: Text(share.localized(L10n.of(context))), +ERROR: ^^^^ +ERROR: lib/pages/settings_security/settings_security_view.dart:152:23: Error: The getter 'L10n' isn't defined for the class 'SettingsSecurityView'. +ERROR: - 'SettingsSecurityView' is from 'package:fluffychat/pages/settings_security/settings_security_view.dart' ('lib/pages/settings_security/settings_security_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).account, +ERROR: ^^^^ +ERROR: lib/pages/settings_security/settings_security_view.dart:160:33: Error: The getter 'L10n' isn't defined for the class 'SettingsSecurityView'. +ERROR: - 'SettingsSecurityView' is from 'package:fluffychat/pages/settings_security/settings_security_view.dart' ('lib/pages/settings_security/settings_security_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(L10n.of(context).yourPublicKey), +ERROR: ^^^^ +ERROR: lib/pages/settings_security/settings_security_view.dart:172:35: Error: The getter 'L10n' isn't defined for the class 'SettingsSecurityView'. +ERROR: - 'SettingsSecurityView' is from 'package:fluffychat/pages/settings_security/settings_security_view.dart' ('lib/pages/settings_security/settings_security_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(L10n.of(context).changePassword), +ERROR: ^^^^ +ERROR: lib/pages/settings_security/settings_security_view.dart:180:23: Error: The getter 'L10n' isn't defined for the class 'SettingsSecurityView'. +ERROR: - 'SettingsSecurityView' is from 'package:fluffychat/pages/settings_security/settings_security_view.dart' ('lib/pages/settings_security/settings_security_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).dehydrate, +ERROR: ^^^^ +ERROR: lib/pages/settings_security/settings_security_view.dart:190:23: Error: The getter 'L10n' isn't defined for the class 'SettingsSecurityView'. +ERROR: - 'SettingsSecurityView' is from 'package:fluffychat/pages/settings_security/settings_security_view.dart' ('lib/pages/settings_security/settings_security_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).deleteAccount, +ERROR: ^^^^ +ERROR: lib/pages/settings_security/settings_security_view.dart:206:20: Error: 'L10n' isn't a type. +ERROR: String localized(L10n l10n) { +ERROR: ^^^^ +ERROR: lib/pages/settings_style/settings_style_view.dart:38:21: Error: The getter 'L10n' isn't defined for the class 'SettingsStyleView'. +ERROR: - 'SettingsStyleView' is from 'package:fluffychat/pages/settings_style/settings_style_view.dart' ('lib/pages/settings_style/settings_style_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(L10n.of(context).changeTheme), +ERROR: ^^^^ +ERROR: lib/pages/settings_style/settings_style_view.dart:54:33: Error: The getter 'L10n' isn't defined for the class 'SettingsStyleView'. +ERROR: - 'SettingsStyleView' is from 'package:fluffychat/pages/settings_style/settings_style_view.dart' ('lib/pages/settings_style/settings_style_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: label: Text(L10n.of(context).lightTheme), +ERROR: ^^^^ +ERROR: lib/pages/settings_style/settings_style_view.dart:59:33: Error: The getter 'L10n' isn't defined for the class 'SettingsStyleView'. +ERROR: - 'SettingsStyleView' is from 'package:fluffychat/pages/settings_style/settings_style_view.dart' ('lib/pages/settings_style/settings_style_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: label: Text(L10n.of(context).darkTheme), +ERROR: ^^^^ +ERROR: lib/pages/settings_style/settings_style_view.dart:64:33: Error: The getter 'L10n' isn't defined for the class 'SettingsStyleView'. +ERROR: - 'SettingsStyleView' is from 'package:fluffychat/pages/settings_style/settings_style_view.dart' ('lib/pages/settings_style/settings_style_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: label: Text(L10n.of(context).systemTheme), +ERROR: ^^^^ +ERROR: lib/pages/settings_style/settings_style_view.dart:71:22: Error: The getter 'L10n' isn't defined for the class 'SettingsStyleView'. +ERROR: - 'SettingsStyleView' is from 'package:fluffychat/pages/settings_style/settings_style_view.dart' ('lib/pages/settings_style/settings_style_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).pureBlackToggle, +ERROR: ^^^^ +ERROR: lib/pages/settings_style/settings_style_view.dart:81:17: Error: The getter 'L10n' isn't defined for the class 'SettingsStyleView'. +ERROR: - 'SettingsStyleView' is from 'package:fluffychat/pages/settings_style/settings_style_view.dart' ('lib/pages/settings_style/settings_style_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).setColorTheme, +ERROR: ^^^^ +ERROR: lib/pages/settings_style/settings_style_view.dart:111:31: Error: The getter 'L10n' isn't defined for the class 'SettingsStyleView'. +ERROR: - 'SettingsStyleView' is from 'package:fluffychat/pages/settings_style/settings_style_view.dart' ('lib/pages/settings_style/settings_style_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: ? L10n.of(context).systemTheme +ERROR: ^^^^ +ERROR: lib/pages/settings_style/settings_style_view.dart:149:17: Error: The getter 'L10n' isn't defined for the class 'SettingsStyleView'. +ERROR: - 'SettingsStyleView' is from 'package:fluffychat/pages/settings_style/settings_style_view.dart' ('lib/pages/settings_style/settings_style_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).messagesStyle, +ERROR: ^^^^ +ERROR: lib/pages/settings_style/settings_style_view.dart:329:37: Error: The getter 'L10n' isn't defined for the class 'SettingsStyleView'. +ERROR: - 'SettingsStyleView' is from 'package:fluffychat/pages/settings_style/settings_style_view.dart' ('lib/pages/settings_style/settings_style_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: label: Text(L10n.of(context).setWallpaper), +ERROR: ^^^^ +ERROR: lib/pages/settings_style/settings_style_view.dart:340:44: Error: The getter 'L10n' isn't defined for the class 'SettingsStyleView'. +ERROR: - 'SettingsStyleView' is from 'package:fluffychat/pages/settings_style/settings_style_view.dart' ('lib/pages/settings_style/settings_style_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: ListTile(title: Text(L10n.of(context).opacity)), +ERROR: ^^^^ +ERROR: lib/pages/settings_style/settings_style_view.dart:350:44: Error: The getter 'L10n' isn't defined for the class 'SettingsStyleView'. +ERROR: - 'SettingsStyleView' is from 'package:fluffychat/pages/settings_style/settings_style_view.dart' ('lib/pages/settings_style/settings_style_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: ListTile(title: Text(L10n.of(context).blur)), +ERROR: ^^^^ +ERROR: lib/pages/settings_style/settings_style_view.dart:366:27: Error: The getter 'L10n' isn't defined for the class 'SettingsStyleView'. +ERROR: - 'SettingsStyleView' is from 'package:fluffychat/pages/settings_style/settings_style_view.dart' ('lib/pages/settings_style/settings_style_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(L10n.of(context).fontSize), +ERROR: ^^^^ +ERROR: lib/pages/settings_style/settings_style_view.dart:382:17: Error: The getter 'L10n' isn't defined for the class 'SettingsStyleView'. +ERROR: - 'SettingsStyleView' is from 'package:fluffychat/pages/settings_style/settings_style_view.dart' ('lib/pages/settings_style/settings_style_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).overview, +ERROR: ^^^^ +ERROR: lib/pages/settings_style/settings_style_view.dart:390:22: Error: The getter 'L10n' isn't defined for the class 'SettingsStyleView'. +ERROR: - 'SettingsStyleView' is from 'package:fluffychat/pages/settings_style/settings_style_view.dart' ('lib/pages/settings_style/settings_style_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).presencesToggle, +ERROR: ^^^^ +ERROR: lib/pages/settings_style/settings_style_view.dart:396:22: Error: The getter 'L10n' isn't defined for the class 'SettingsStyleView'. +ERROR: - 'SettingsStyleView' is from 'package:fluffychat/pages/settings_style/settings_style_view.dart' ('lib/pages/settings_style/settings_style_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).separateChatTypes, +ERROR: ^^^^ +ERROR: lib/widgets/adaptive_dialogs/public_room_dialog.dart:55:16: Error: The getter 'L10n' isn't defined for the class 'PublicRoomDialog'. +ERROR: - 'PublicRoomDialog' is from 'package:fluffychat/widgets/adaptive_dialogs/public_room_dialog.dart' ('lib/widgets/adaptive_dialogs/public_room_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).youHaveKnocked, +ERROR: ^^^^ +ERROR: lib/widgets/adaptive_dialogs/public_room_dialog.dart:56:18: Error: The getter 'L10n' isn't defined for the class 'PublicRoomDialog'. +ERROR: - 'PublicRoomDialog' is from 'package:fluffychat/widgets/adaptive_dialogs/public_room_dialog.dart' ('lib/widgets/adaptive_dialogs/public_room_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: message: L10n.of(context).pleaseWaitUntilInvited, +ERROR: ^^^^ +ERROR: lib/widgets/adaptive_dialogs/public_room_dialog.dart:83:14: Error: The getter 'L10n' isn't defined for the class 'PublicRoomDialog'. +ERROR: - 'PublicRoomDialog' is from 'package:fluffychat/widgets/adaptive_dialogs/public_room_dialog.dart' ('lib/widgets/adaptive_dialogs/public_room_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: throw (L10n.of(context).noRoomsFound); +ERROR: ^^^^ +ERROR: lib/widgets/adaptive_dialogs/public_room_dialog.dart:183:23: Error: The getter 'L10n' isn't defined for the class 'PublicRoomDialog'. +ERROR: - 'PublicRoomDialog' is from 'package:fluffychat/widgets/adaptive_dialogs/public_room_dialog.dart' ('lib/widgets/adaptive_dialogs/public_room_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).countParticipants( +ERROR: ^^^^ +ERROR: lib/widgets/adaptive_dialogs/public_room_dialog.dart:217:19: Error: The getter 'L10n' isn't defined for the class 'PublicRoomDialog'. +ERROR: - 'PublicRoomDialog' is from 'package:fluffychat/widgets/adaptive_dialogs/public_room_dialog.dart' ('lib/widgets/adaptive_dialogs/public_room_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: ? L10n.of(context).knock +ERROR: ^^^^ +ERROR: lib/widgets/adaptive_dialogs/public_room_dialog.dart:219:23: Error: The getter 'L10n' isn't defined for the class 'PublicRoomDialog'. +ERROR: - 'PublicRoomDialog' is from 'package:fluffychat/widgets/adaptive_dialogs/public_room_dialog.dart' ('lib/widgets/adaptive_dialogs/public_room_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: ? L10n.of(context).joinSpace +ERROR: ^^^^ +ERROR: lib/widgets/adaptive_dialogs/public_room_dialog.dart:220:23: Error: The getter 'L10n' isn't defined for the class 'PublicRoomDialog'. +ERROR: - 'PublicRoomDialog' is from 'package:fluffychat/widgets/adaptive_dialogs/public_room_dialog.dart' ('lib/widgets/adaptive_dialogs/public_room_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: : L10n.of(context).joinRoom, +ERROR: ^^^^ +ERROR: lib/widgets/adaptive_dialogs/public_room_dialog.dart:226:23: Error: The getter 'L10n' isn't defined for the class 'PublicRoomDialog'. +ERROR: - 'PublicRoomDialog' is from 'package:fluffychat/widgets/adaptive_dialogs/public_room_dialog.dart' ('lib/widgets/adaptive_dialogs/public_room_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: child: Text(L10n.of(context).close), +ERROR: ^^^^ +ERROR: lib/pages/chat_list/chat_list_item.dart:49:16: Error: The getter 'L10n' isn't defined for the class 'ChatListItem'. +ERROR: - 'ChatListItem' is from 'package:fluffychat/pages/chat_list/chat_list_item.dart' ('lib/pages/chat_list/chat_list_item.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).areYouSure, +ERROR: ^^^^ +ERROR: lib/pages/chat_list/chat_list_item.dart:50:18: Error: The getter 'L10n' isn't defined for the class 'ChatListItem'. +ERROR: - 'ChatListItem' is from 'package:fluffychat/pages/chat_list/chat_list_item.dart' ('lib/pages/chat_list/chat_list_item.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: okLabel: L10n.of(context).leave, +ERROR: ^^^^ +ERROR: lib/pages/chat_list/chat_list_item.dart:51:22: Error: The getter 'L10n' isn't defined for the class 'ChatListItem'. +ERROR: - 'ChatListItem' is from 'package:fluffychat/pages/chat_list/chat_list_item.dart' ('lib/pages/chat_list/chat_list_item.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: cancelLabel: L10n.of(context).cancel, +ERROR: ^^^^ +ERROR: lib/pages/chat_list/chat_list_item.dart:52:18: Error: The getter 'L10n' isn't defined for the class 'ChatListItem'. +ERROR: - 'ChatListItem' is from 'package:fluffychat/pages/chat_list/chat_list_item.dart' ('lib/pages/chat_list/chat_list_item.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: message: L10n.of(context).archiveRoomDescription, +ERROR: ^^^^ +ERROR: lib/pages/chat_list/chat_list_item.dart:84:20: Error: The getter 'L10n' isn't defined for the class 'ChatListItem'. +ERROR: - 'ChatListItem' is from 'package:fluffychat/pages/chat_list/chat_list_item.dart' ('lib/pages/chat_list/chat_list_item.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: MatrixLocals(L10n.of(context)), +ERROR: ^^^^ +ERROR: lib/pages/chat_list/chat_list_item.dart:280:29: Error: The getter 'L10n' isn't defined for the class 'ChatListItem'. +ERROR: - 'ChatListItem' is from 'package:fluffychat/pages/chat_list/chat_list_item.dart' ('lib/pages/chat_list/chat_list_item.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).countChatsAndCountParticipants( +ERROR: ^^^^ +ERROR: lib/pages/chat_list/chat_list_item.dart:301:54: Error: The getter 'L10n' isn't defined for the class 'ChatListItem'. +ERROR: - 'ChatListItem' is from 'package:fluffychat/pages/chat_list/chat_list_item.dart' ('lib/pages/chat_list/chat_list_item.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: MatrixLocals(L10n.of(context)), +ERROR: ^^^^ +ERROR: lib/pages/chat_list/chat_list_item.dart:313:48: Error: The getter 'L10n' isn't defined for the class 'ChatListItem'. +ERROR: - 'ChatListItem' is from 'package:fluffychat/pages/chat_list/chat_list_item.dart' ('lib/pages/chat_list/chat_list_item.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: MatrixLocals(L10n.of(context)), +ERROR: ^^^^ +ERROR: lib/pages/chat_list/chat_list_item.dart:332:49: Error: The getter 'L10n' isn't defined for the class 'ChatListItem'. +ERROR: - 'ChatListItem' is from 'package:fluffychat/pages/chat_list/chat_list_item.dart' ('lib/pages/chat_list/chat_list_item.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: ? L10n.of(context).newChatRequest +ERROR: ^^^^ +ERROR: lib/pages/chat_list/chat_list_item.dart:333:49: Error: The getter 'L10n' isn't defined for the class 'ChatListItem'. +ERROR: - 'ChatListItem' is from 'package:fluffychat/pages/chat_list/chat_list_item.dart' ('lib/pages/chat_list/chat_list_item.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: : L10n.of(context) +ERROR: ^^^^ +ERROR: lib/pages/chat_list/chat_list_item.dart:336:43: Error: The getter 'L10n' isn't defined for the class 'ChatListItem'. +ERROR: - 'ChatListItem' is from 'package:fluffychat/pages/chat_list/chat_list_item.dart' ('lib/pages/chat_list/chat_list_item.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).emptyChat, +ERROR: ^^^^ +ERROR: lib/pages/chat/events/message.dart:549:21: Error: The getter 'L10n' isn't defined for the class 'Message'. +ERROR: - 'Message' is from 'package:fluffychat/pages/chat/events/message.dart' ('lib/pages/chat/events/message.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).readUpToHere, +ERROR: ^^^^ +ERROR: lib/pages/chat/chat_app_bar_title.dart:46:30: Error: The getter 'L10n' isn't defined for the class 'ChatAppBarTitle'. +ERROR: - 'ChatAppBarTitle' is from 'package:fluffychat/pages/chat/chat_app_bar_title.dart' ('lib/pages/chat/chat_app_bar_title.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: MatrixLocals(L10n.of(context)), +ERROR: ^^^^ +ERROR: lib/pages/chat/chat_app_bar_title.dart:57:61: Error: The getter 'L10n' isn't defined for the class 'ChatAppBarTitle'. +ERROR: - 'ChatAppBarTitle' is from 'package:fluffychat/pages/chat/chat_app_bar_title.dart' ('lib/pages/chat/chat_app_bar_title.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: room.getLocalizedDisplayname(MatrixLocals(L10n.of(context))), +ERROR: ^^^^ +ERROR: lib/pages/chat/chat_app_bar_title.dart:85:37: Error: The getter 'L10n' isn't defined for the class 'ChatAppBarTitle'. +ERROR: - 'ChatAppBarTitle' is from 'package:fluffychat/pages/chat/chat_app_bar_title.dart' ('lib/pages/chat/chat_app_bar_title.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).currentlyActive, +ERROR: ^^^^ +ERROR: lib/pages/chat/chat_app_bar_title.dart:91:37: Error: The getter 'L10n' isn't defined for the class 'ChatAppBarTitle'. +ERROR: - 'ChatAppBarTitle' is from 'package:fluffychat/pages/chat/chat_app_bar_title.dart' ('lib/pages/chat/chat_app_bar_title.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).lastActiveAgo( +ERROR: ^^^^ +ERROR: lib/pages/chat/encryption_button.dart:28:19: Error: The getter 'L10n' isn't defined for the class 'EncryptionButton'. +ERROR: - 'EncryptionButton' is from 'package:fluffychat/pages/chat/encryption_button.dart' ('lib/pages/chat/encryption_button.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: ? L10n.of(context).encrypted +ERROR: ^^^^ +ERROR: lib/pages/chat/encryption_button.dart:29:19: Error: The getter 'L10n' isn't defined for the class 'EncryptionButton'. +ERROR: - 'EncryptionButton' is from 'package:fluffychat/pages/chat/encryption_button.dart' ('lib/pages/chat/encryption_button.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: : L10n.of(context).encryptionNotEnabled, +ERROR: ^^^^ +ERROR: lib/pages/chat/pinned_events.dart:35:20: Error: The getter 'L10n' isn't defined for the class 'PinnedEvents'. +ERROR: - 'PinnedEvents' is from 'package:fluffychat/pages/chat/pinned_events.dart' ('lib/pages/chat/pinned_events.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).pin, +ERROR: ^^^^ +ERROR: lib/pages/chat/pinned_events.dart:36:26: Error: The getter 'L10n' isn't defined for the class 'PinnedEvents'. +ERROR: - 'PinnedEvents' is from 'package:fluffychat/pages/chat/pinned_events.dart' ('lib/pages/chat/pinned_events.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: cancelLabel: L10n.of(context).cancel, +ERROR: ^^^^ +ERROR: lib/pages/chat/pinned_events.dart:43:40: Error: The getter 'L10n' isn't defined for the class 'PinnedEvents'. +ERROR: - 'PinnedEvents' is from 'package:fluffychat/pages/chat/pinned_events.dart' ('lib/pages/chat/pinned_events.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: MatrixLocals(L10n.of(context)), +ERROR: ^^^^ +ERROR: lib/pages/chat/pinned_events.dart:72:30: Error: The getter 'L10n' isn't defined for the class 'PinnedEvents'. +ERROR: - 'PinnedEvents' is from 'package:fluffychat/pages/chat/pinned_events.dart' ('lib/pages/chat/pinned_events.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: MatrixLocals(L10n.of(context)), +ERROR: ^^^^ +ERROR: lib/pages/chat/pinned_events.dart:76:15: Error: The getter 'L10n' isn't defined for the class 'PinnedEvents'. +ERROR: - 'PinnedEvents' is from 'package:fluffychat/pages/chat/pinned_events.dart' ('lib/pages/chat/pinned_events.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).loadingPleaseWait, +ERROR: ^^^^ +ERROR: lib/pages/chat/pinned_events.dart:82:22: Error: The getter 'L10n' isn't defined for the class 'PinnedEvents'. +ERROR: - 'PinnedEvents' is from 'package:fluffychat/pages/chat/pinned_events.dart' ('lib/pages/chat/pinned_events.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: tooltip: L10n.of(context).unpin, +ERROR: ^^^^ +ERROR: lib/pages/chat/reply_display.dart:32:22: Error: The getter 'L10n' isn't defined for the class 'ReplyDisplay'. +ERROR: - 'ReplyDisplay' is from 'package:fluffychat/pages/chat/reply_display.dart' ('lib/pages/chat/reply_display.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: tooltip: L10n.of(context).close, +ERROR: ^^^^ +ERROR: lib/pages/chat/reply_display.dart:73:26: Error: The getter 'L10n' isn't defined for the class '_EditContent'. +ERROR: - '_EditContent' is from 'package:fluffychat/pages/chat/reply_display.dart' ('lib/pages/chat/reply_display.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: MatrixLocals(L10n.of(context)), +ERROR: ^^^^ +ERROR: lib/widgets/chat_settings_popup_menu.dart:106:26: Error: The getter 'L10n' isn't defined for the class 'ChatSettingsPopupMenuState'. +ERROR: - 'ChatSettingsPopupMenuState' is from 'package:fluffychat/widgets/chat_settings_popup_menu.dart' ('lib/widgets/chat_settings_popup_menu.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: Text(L10n.of(context).chatDetails), +ERROR: ^^^^ +ERROR: lib/widgets/chat_settings_popup_menu.dart:117:26: Error: The getter 'L10n' isn't defined for the class 'ChatSettingsPopupMenuState'. +ERROR: - 'ChatSettingsPopupMenuState' is from 'package:fluffychat/widgets/chat_settings_popup_menu.dart' ('lib/widgets/chat_settings_popup_menu.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: Text(L10n.of(context).muteChat), +ERROR: ^^^^ +ERROR: lib/widgets/chat_settings_popup_menu.dart:128:26: Error: The getter 'L10n' isn't defined for the class 'ChatSettingsPopupMenuState'. +ERROR: - 'ChatSettingsPopupMenuState' is from 'package:fluffychat/widgets/chat_settings_popup_menu.dart' ('lib/widgets/chat_settings_popup_menu.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: Text(L10n.of(context).unmuteChat), +ERROR: ^^^^ +ERROR: lib/widgets/chat_settings_popup_menu.dart:138:24: Error: The getter 'L10n' isn't defined for the class 'ChatSettingsPopupMenuState'. +ERROR: - 'ChatSettingsPopupMenuState' is from 'package:fluffychat/widgets/chat_settings_popup_menu.dart' ('lib/widgets/chat_settings_popup_menu.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: Text(L10n.of(context).search), +ERROR: ^^^^ +ERROR: lib/widgets/chat_settings_popup_menu.dart:148:24: Error: The getter 'L10n' isn't defined for the class 'ChatSettingsPopupMenuState'. +ERROR: - 'ChatSettingsPopupMenuState' is from 'package:fluffychat/widgets/chat_settings_popup_menu.dart' ('lib/widgets/chat_settings_popup_menu.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: Text(L10n.of(context).leave), +ERROR: ^^^^ +ERROR: lib/widgets/chat_settings_popup_menu.dart:60:26: Error: The getter 'L10n' isn't defined for the class 'ChatSettingsPopupMenuState'. +ERROR: - 'ChatSettingsPopupMenuState' is from 'package:fluffychat/widgets/chat_settings_popup_menu.dart' ('lib/widgets/chat_settings_popup_menu.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).areYouSure, +ERROR: ^^^^ +ERROR: lib/widgets/chat_settings_popup_menu.dart:61:28: Error: The getter 'L10n' isn't defined for the class 'ChatSettingsPopupMenuState'. +ERROR: - 'ChatSettingsPopupMenuState' is from 'package:fluffychat/widgets/chat_settings_popup_menu.dart' ('lib/widgets/chat_settings_popup_menu.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: message: L10n.of(context).archiveRoomDescription, +ERROR: ^^^^ +ERROR: lib/widgets/chat_settings_popup_menu.dart:62:28: Error: The getter 'L10n' isn't defined for the class 'ChatSettingsPopupMenuState'. +ERROR: - 'ChatSettingsPopupMenuState' is from 'package:fluffychat/widgets/chat_settings_popup_menu.dart' ('lib/widgets/chat_settings_popup_menu.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: okLabel: L10n.of(context).leave, +ERROR: ^^^^ +ERROR: lib/widgets/chat_settings_popup_menu.dart:63:32: Error: The getter 'L10n' isn't defined for the class 'ChatSettingsPopupMenuState'. +ERROR: - 'ChatSettingsPopupMenuState' is from 'package:fluffychat/widgets/chat_settings_popup_menu.dart' ('lib/widgets/chat_settings_popup_menu.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: cancelLabel: L10n.of(context).cancel, +ERROR: ^^^^ +ERROR: lib/pages/chat/chat_emoji_picker.dart:33:33: Error: The getter 'L10n' isn't defined for the class 'ChatEmojiPicker'. +ERROR: - 'ChatEmojiPicker' is from 'package:fluffychat/pages/chat/chat_emoji_picker.dart' ('lib/pages/chat/chat_emoji_picker.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: Tab(text: L10n.of(context).emojis), +ERROR: ^^^^ +ERROR: lib/pages/chat/chat_emoji_picker.dart:34:33: Error: The getter 'L10n' isn't defined for the class 'ChatEmojiPicker'. +ERROR: - 'ChatEmojiPicker' is from 'package:fluffychat/pages/chat/chat_emoji_picker.dart' ('lib/pages/chat/chat_emoji_picker.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: Tab(text: L10n.of(context).stickers), +ERROR: ^^^^ +ERROR: lib/pages/chat/chat_emoji_picker.dart:104:11: Error: The getter 'L10n' isn't defined for the class 'NoRecent'. +ERROR: - 'NoRecent' is from 'package:fluffychat/pages/chat/chat_emoji_picker.dart' ('lib/pages/chat/chat_emoji_picker.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).emoteKeyboardNoRecents, +ERROR: ^^^^ +ERROR: lib/pages/chat/chat_input_row.dart:35:13: Error: The getter 'L10n' isn't defined for the class 'ChatInputRow'. +ERROR: - 'ChatInputRow' is from 'package:fluffychat/pages/chat/chat_input_row.dart' ('lib/pages/chat/chat_input_row.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).noSendPermission, +ERROR: ^^^^ +ERROR: lib/pages/chat/chat_input_row.dart:48:13: Error: The getter 'L10n' isn't defined for the class 'ChatInputRow'. +ERROR: - 'ChatInputRow' is from 'package:fluffychat/pages/chat/chat_input_row.dart' ('lib/pages/chat/chat_input_row.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).otherPartyNotLoggedIn, +ERROR: ^^^^ +ERROR: lib/pages/chat/chat_input_row.dart:75:30: Error: The getter 'L10n' isn't defined for the class 'ChatInputRow'. +ERROR: - 'ChatInputRow' is from 'package:fluffychat/pages/chat/chat_input_row.dart' ('lib/pages/chat/chat_input_row.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: Text(L10n.of(context).delete), +ERROR: ^^^^ +ERROR: lib/pages/chat/chat_input_row.dart:88:30: Error: The getter 'L10n' isn't defined for the class 'ChatInputRow'. +ERROR: - 'ChatInputRow' is from 'package:fluffychat/pages/chat/chat_input_row.dart' ('lib/pages/chat/chat_input_row.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: Text(L10n.of(context).forward), +ERROR: ^^^^ +ERROR: lib/pages/chat/chat_input_row.dart:104:38: Error: The getter 'L10n' isn't defined for the class 'ChatInputRow'. +ERROR: - 'ChatInputRow' is from 'package:fluffychat/pages/chat/chat_input_row.dart' ('lib/pages/chat/chat_input_row.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: Text(L10n.of(context).reply), +ERROR: ^^^^ +ERROR: lib/pages/chat/chat_input_row.dart:116:38: Error: The getter 'L10n' isn't defined for the class 'ChatInputRow'. +ERROR: - 'ChatInputRow' is from 'package:fluffychat/pages/chat/chat_input_row.dart' ('lib/pages/chat/chat_input_row.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: Text(L10n.of(context).tryToSendAgain), +ERROR: ^^^^ +ERROR: lib/pages/chat/chat_input_row.dart:151:39: Error: The getter 'L10n' isn't defined for the class 'ChatInputRow'. +ERROR: - 'ChatInputRow' is from 'package:fluffychat/pages/chat/chat_input_row.dart' ('lib/pages/chat/chat_input_row.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(L10n.of(context).shareLocation), +ERROR: ^^^^ +ERROR: lib/pages/chat/chat_input_row.dart:163:37: Error: The getter 'L10n' isn't defined for the class 'ChatInputRow'. +ERROR: - 'ChatInputRow' is from 'package:fluffychat/pages/chat/chat_input_row.dart' ('lib/pages/chat/chat_input_row.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(L10n.of(context).sendImage), +ERROR: ^^^^ +ERROR: lib/pages/chat/chat_input_row.dart:175:37: Error: The getter 'L10n' isn't defined for the class 'ChatInputRow'. +ERROR: - 'ChatInputRow' is from 'package:fluffychat/pages/chat/chat_input_row.dart' ('lib/pages/chat/chat_input_row.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(L10n.of(context).sendVideo), +ERROR: ^^^^ +ERROR: lib/pages/chat/chat_input_row.dart:187:37: Error: The getter 'L10n' isn't defined for the class 'ChatInputRow'. +ERROR: - 'ChatInputRow' is from 'package:fluffychat/pages/chat/chat_input_row.dart' ('lib/pages/chat/chat_input_row.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(L10n.of(context).sendFile), +ERROR: ^^^^ +ERROR: lib/pages/chat/chat_input_row.dart:217:39: Error: The getter 'L10n' isn't defined for the class 'ChatInputRow'. +ERROR: - 'ChatInputRow' is from 'package:fluffychat/pages/chat/chat_input_row.dart' ('lib/pages/chat/chat_input_row.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(L10n.of(context).recordAVideo), +ERROR: ^^^^ +ERROR: lib/pages/chat/chat_input_row.dart:230:39: Error: The getter 'L10n' isn't defined for the class 'ChatInputRow'. +ERROR: - 'ChatInputRow' is from 'package:fluffychat/pages/chat/chat_input_row.dart' ('lib/pages/chat/chat_input_row.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(L10n.of(context).takeAPhoto), +ERROR: ^^^^ +ERROR: lib/pages/chat/chat_input_row.dart:242:28: Error: The getter 'L10n' isn't defined for the class 'ChatInputRow'. +ERROR: - 'ChatInputRow' is from 'package:fluffychat/pages/chat/chat_input_row.dart' ('lib/pages/chat/chat_input_row.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: tooltip: L10n.of(context).emojis, +ERROR: ^^^^ +ERROR: lib/pages/chat/chat_input_row.dart:301:33: Error: The getter 'L10n' isn't defined for the class 'ChatInputRow'. +ERROR: - 'ChatInputRow' is from 'package:fluffychat/pages/chat/chat_input_row.dart' ('lib/pages/chat/chat_input_row.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: hintText: L10n.of(context).writeAMessage, +ERROR: ^^^^ +ERROR: lib/pages/chat/chat_input_row.dart:318:34: Error: The getter 'L10n' isn't defined for the class 'ChatInputRow'. +ERROR: - 'ChatInputRow' is from 'package:fluffychat/pages/chat/chat_input_row.dart' ('lib/pages/chat/chat_input_row.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: tooltip: L10n.of(context).voiceMessage, +ERROR: ^^^^ +ERROR: lib/pages/chat/chat_input_row.dart:330:34: Error: The getter 'L10n' isn't defined for the class 'ChatInputRow'. +ERROR: - 'ChatInputRow' is from 'package:fluffychat/pages/chat/chat_input_row.dart' ('lib/pages/chat/chat_input_row.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: tooltip: L10n.of(context).send, +ERROR: ^^^^ +ERROR: lib/utils/date_time_extension.dart:32:15: Error: The getter 'L10n' isn't defined for the class 'DateTime'. +ERROR: - 'DateTime' is from 'dart:core'. +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).alwaysUse24HourFormat == 'true') +ERROR: ^^^^ +ERROR: lib/utils/date_time_extension.dart:33:33: Error: The getter 'L10n' isn't defined for the class 'DateTime'. +ERROR: - 'DateTime' is from 'dart:core'. +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: ? DateFormat('HH:mm', L10n.of(context).localeName).format(this) +ERROR: ^^^^ +ERROR: lib/utils/date_time_extension.dart:34:34: Error: The getter 'L10n' isn't defined for the class 'DateTime'. +ERROR: - 'DateTime' is from 'dart:core'. +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: : DateFormat('h:mm a', L10n.of(context).localeName).format(this); +ERROR: ^^^^ +ERROR: lib/utils/date_time_extension.dart:74:12: Error: The getter 'L10n' isn't defined for the class 'DateTime'. +ERROR: - 'DateTime' is from 'dart:core'. +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: return L10n.of(context).dateAndTimeOfDay( +ERROR: ^^^^ +ERROR: lib/pages/chat_details/participant_list_item.dart:20:25: Error: The getter 'L10n' isn't defined for the class 'ParticipantListItem'. +ERROR: - 'ParticipantListItem' is from 'package:fluffychat/pages/chat_details/participant_list_item.dart' ('lib/pages/chat_details/participant_list_item.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: Membership.ban => L10n.of(context).banned, +ERROR: ^^^^ +ERROR: lib/pages/chat_details/participant_list_item.dart:21:28: Error: The getter 'L10n' isn't defined for the class 'ParticipantListItem'. +ERROR: - 'ParticipantListItem' is from 'package:fluffychat/pages/chat_details/participant_list_item.dart' ('lib/pages/chat_details/participant_list_item.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: Membership.invite => L10n.of(context).invited, +ERROR: ^^^^ +ERROR: lib/pages/chat_details/participant_list_item.dart:23:27: Error: The getter 'L10n' isn't defined for the class 'ParticipantListItem'. +ERROR: - 'ParticipantListItem' is from 'package:fluffychat/pages/chat_details/participant_list_item.dart' ('lib/pages/chat_details/participant_list_item.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: Membership.knock => L10n.of(context).knocking, +ERROR: ^^^^ +ERROR: lib/pages/chat_details/participant_list_item.dart:24:27: Error: The getter 'L10n' isn't defined for the class 'ParticipantListItem'. +ERROR: - 'ParticipantListItem' is from 'package:fluffychat/pages/chat_details/participant_list_item.dart' ('lib/pages/chat_details/participant_list_item.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: Membership.leave => L10n.of(context).leftTheChat, +ERROR: ^^^^ +ERROR: lib/pages/chat_details/participant_list_item.dart:28:11: Error: The getter 'L10n' isn't defined for the class 'ParticipantListItem'. +ERROR: - 'ParticipantListItem' is from 'package:fluffychat/pages/chat_details/participant_list_item.dart' ('lib/pages/chat_details/participant_list_item.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: ? L10n.of(context).admin +ERROR: ^^^^ +ERROR: lib/pages/chat_details/participant_list_item.dart:30:15: Error: The getter 'L10n' isn't defined for the class 'ParticipantListItem'. +ERROR: - 'ParticipantListItem' is from 'package:fluffychat/pages/chat_details/participant_list_item.dart' ('lib/pages/chat_details/participant_list_item.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: ? L10n.of(context).moderator +ERROR: ^^^^ +ERROR: lib/widgets/mxc_image_viewer.dart:30:22: Error: The getter 'L10n' isn't defined for the class 'MxcImageViewer'. +ERROR: - 'MxcImageViewer' is from 'package:fluffychat/widgets/mxc_image_viewer.dart' ('lib/widgets/mxc_image_viewer.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: tooltip: L10n.of(context).close, +ERROR: ^^^^ +ERROR: lib/widgets/qr_code_viewer.dart:70:20: Error: The getter 'L10n' isn't defined for the class 'QrCodeViewer'. +ERROR: - 'QrCodeViewer' is from 'package:fluffychat/widgets/qr_code_viewer.dart' ('lib/widgets/qr_code_viewer.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: tooltip: L10n.of(context).close, +ERROR: ^^^^ +ERROR: lib/widgets/qr_code_viewer.dart:84:22: Error: The getter 'L10n' isn't defined for the class 'QrCodeViewer'. +ERROR: - 'QrCodeViewer' is from 'package:fluffychat/widgets/qr_code_viewer.dart' ('lib/widgets/qr_code_viewer.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: tooltip: L10n.of(context).share, +ERROR: ^^^^ +ERROR: lib/widgets/qr_code_viewer.dart:94:22: Error: The getter 'L10n' isn't defined for the class 'QrCodeViewer'. +ERROR: - 'QrCodeViewer' is from 'package:fluffychat/widgets/qr_code_viewer.dart' ('lib/widgets/qr_code_viewer.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: tooltip: L10n.of(context).downloadFile, +ERROR: ^^^^ +ERROR: lib/widgets/navigation_rail.dart:75:34: Error: The getter 'L10n' isn't defined for the class 'SpacesNavigationRail'. +ERROR: - 'SpacesNavigationRail' is from 'package:fluffychat/widgets/navigation_rail.dart' ('lib/widgets/navigation_rail.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: toolTip: L10n.of(context).chats, +ERROR: ^^^^ +ERROR: lib/widgets/navigation_rail.dart:88:34: Error: The getter 'L10n' isn't defined for the class 'SpacesNavigationRail'. +ERROR: - 'SpacesNavigationRail' is from 'package:fluffychat/widgets/navigation_rail.dart' ('lib/widgets/navigation_rail.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: toolTip: L10n.of(context).createNewSpace, +ERROR: ^^^^ +ERROR: lib/widgets/navigation_rail.dart:93:36: Error: The getter 'L10n' isn't defined for the class 'SpacesNavigationRail'. +ERROR: - 'SpacesNavigationRail' is from 'package:fluffychat/widgets/navigation_rail.dart' ('lib/widgets/navigation_rail.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: MatrixLocals(L10n.of(context)), +ERROR: ^^^^ +ERROR: lib/widgets/navigation_rail.dart:129:26: Error: The getter 'L10n' isn't defined for the class 'SpacesNavigationRail'. +ERROR: - 'SpacesNavigationRail' is from 'package:fluffychat/widgets/navigation_rail.dart' ('lib/widgets/navigation_rail.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: toolTip: L10n.of(context).settings, +ERROR: ^^^^ +ERROR: lib/pages/chat_list/chat_list_body.dart:84:32: Error: The getter 'L10n' isn't defined for the class 'ChatListViewBody'. +ERROR: - 'ChatListViewBody' is from 'package:fluffychat/pages/chat_list/chat_list_body.dart' ('lib/pages/chat_list/chat_list_body.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).publicRooms, +ERROR: ^^^^ +ERROR: lib/pages/chat_list/chat_list_body.dart:89:32: Error: The getter 'L10n' isn't defined for the class 'ChatListViewBody'. +ERROR: - 'ChatListViewBody' is from 'package:fluffychat/pages/chat_list/chat_list_body.dart' ('lib/pages/chat_list/chat_list_body.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).publicSpaces, +ERROR: ^^^^ +ERROR: lib/pages/chat_list/chat_list_body.dart:94:32: Error: The getter 'L10n' isn't defined for the class 'ChatListViewBody'. +ERROR: - 'ChatListViewBody' is from 'package:fluffychat/pages/chat_list/chat_list_body.dart' ('lib/pages/chat_list/chat_list_body.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).users, +ERROR: ^^^^ +ERROR: lib/pages/chat_list/chat_list_body.dart:116:43: Error: The getter 'L10n' isn't defined for the class 'ChatListViewBody'. +ERROR: - 'ChatListViewBody' is from 'package:fluffychat/pages/chat_list/chat_list_body.dart' ('lib/pages/chat_list/chat_list_body.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).unknownDevice, +ERROR: ^^^^ +ERROR: lib/pages/chat_list/chat_list_body.dart:143:39: Error: The getter 'L10n' isn't defined for the class 'ChatListViewBody'. +ERROR: - 'ChatListViewBody' is from 'package:fluffychat/pages/chat_list/chat_list_body.dart' ('lib/pages/chat_list/chat_list_body.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: Text(L10n.of(context).dehydrateTor), +ERROR: ^^^^ +ERROR: lib/pages/chat_list/chat_list_body.dart:144:42: Error: The getter 'L10n' isn't defined for the class 'ChatListViewBody'. +ERROR: - 'ChatListViewBody' is from 'package:fluffychat/pages/chat_list/chat_list_body.dart' ('lib/pages/chat_list/chat_list_body.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: subtitle: Text(L10n.of(context).dehydrateTorLong), +ERROR: ^^^^ +ERROR: lib/pages/chat_list/chat_list_body.dart:190:32: Error: The getter 'L10n' isn't defined for the class 'ChatListViewBody'. +ERROR: - 'ChatListViewBody' is from 'package:fluffychat/pages/chat_list/chat_list_body.dart' ('lib/pages/chat_list/chat_list_body.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).chats, +ERROR: ^^^^ +ERROR: lib/pages/chat_list/chat_list_body.dart:226:37: Error: The getter 'L10n' isn't defined for the class 'ChatListViewBody'. +ERROR: - 'ChatListViewBody' is from 'package:fluffychat/pages/chat_list/chat_list_body.dart' ('lib/pages/chat_list/chat_list_body.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: ? L10n.of(context).noChatsFoundHere +ERROR: ^^^^ +ERROR: lib/pages/chat_list/chat_list_body.dart:227:37: Error: The getter 'L10n' isn't defined for the class 'ChatListViewBody'. +ERROR: - 'ChatListViewBody' is from 'package:fluffychat/pages/chat_list/chat_list_body.dart' ('lib/pages/chat_list/chat_list_body.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: : L10n.of(context).noMoreChatsFound, +ERROR: ^^^^ +ERROR: lib/pages/chat_list/chat_list_body.dart:302:21: Error: The getter 'L10n' isn't defined for the class 'PublicRoomsHorizontalList'. +ERROR: - 'PublicRoomsHorizontalList' is from 'package:fluffychat/pages/chat_list/chat_list_body.dart' ('lib/pages/chat_list/chat_list_body.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).group, +ERROR: ^^^^ +ERROR: lib/pages/chat_permissions_settings/permission_list_tile.dart:28:18: Error: The getter 'L10n' isn't defined for the class 'PermissionsListTile'. +ERROR: - 'PermissionsListTile' is from 'package:fluffychat/pages/chat_permissions_settings/permission_list_tile.dart' ('lib/pages/chat_permissions_settings/permission_list_tile.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: return L10n.of(context).defaultPermissionLevel; +ERROR: ^^^^ +ERROR: lib/pages/chat_permissions_settings/permission_list_tile.dart:30:18: Error: The getter 'L10n' isn't defined for the class 'PermissionsListTile'. +ERROR: - 'PermissionsListTile' is from 'package:fluffychat/pages/chat_permissions_settings/permission_list_tile.dart' ('lib/pages/chat_permissions_settings/permission_list_tile.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: return L10n.of(context).sendMessages; +ERROR: ^^^^ +ERROR: lib/pages/chat_permissions_settings/permission_list_tile.dart:32:18: Error: The getter 'L10n' isn't defined for the class 'PermissionsListTile'. +ERROR: - 'PermissionsListTile' is from 'package:fluffychat/pages/chat_permissions_settings/permission_list_tile.dart' ('lib/pages/chat_permissions_settings/permission_list_tile.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: return L10n.of(context).changeGeneralChatSettings; +ERROR: ^^^^ +ERROR: lib/pages/chat_permissions_settings/permission_list_tile.dart:34:18: Error: The getter 'L10n' isn't defined for the class 'PermissionsListTile'. +ERROR: - 'PermissionsListTile' is from 'package:fluffychat/pages/chat_permissions_settings/permission_list_tile.dart' ('lib/pages/chat_permissions_settings/permission_list_tile.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: return L10n.of(context).banFromChat; +ERROR: ^^^^ +ERROR: lib/pages/chat_permissions_settings/permission_list_tile.dart:36:18: Error: The getter 'L10n' isn't defined for the class 'PermissionsListTile'. +ERROR: - 'PermissionsListTile' is from 'package:fluffychat/pages/chat_permissions_settings/permission_list_tile.dart' ('lib/pages/chat_permissions_settings/permission_list_tile.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: return L10n.of(context).kickFromChat; +ERROR: ^^^^ +ERROR: lib/pages/chat_permissions_settings/permission_list_tile.dart:38:18: Error: The getter 'L10n' isn't defined for the class 'PermissionsListTile'. +ERROR: - 'PermissionsListTile' is from 'package:fluffychat/pages/chat_permissions_settings/permission_list_tile.dart' ('lib/pages/chat_permissions_settings/permission_list_tile.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: return L10n.of(context).deleteMessage; +ERROR: ^^^^ +ERROR: lib/pages/chat_permissions_settings/permission_list_tile.dart:40:18: Error: The getter 'L10n' isn't defined for the class 'PermissionsListTile'. +ERROR: - 'PermissionsListTile' is from 'package:fluffychat/pages/chat_permissions_settings/permission_list_tile.dart' ('lib/pages/chat_permissions_settings/permission_list_tile.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: return L10n.of(context).inviteOtherUsers; +ERROR: ^^^^ +ERROR: lib/pages/chat_permissions_settings/permission_list_tile.dart:45:18: Error: The getter 'L10n' isn't defined for the class 'PermissionsListTile'. +ERROR: - 'PermissionsListTile' is from 'package:fluffychat/pages/chat_permissions_settings/permission_list_tile.dart' ('lib/pages/chat_permissions_settings/permission_list_tile.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: return L10n.of(context).sendRoomNotifications; +ERROR: ^^^^ +ERROR: lib/pages/chat_permissions_settings/permission_list_tile.dart:50:18: Error: The getter 'L10n' isn't defined for the class 'PermissionsListTile'. +ERROR: - 'PermissionsListTile' is from 'package:fluffychat/pages/chat_permissions_settings/permission_list_tile.dart' ('lib/pages/chat_permissions_settings/permission_list_tile.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: return L10n.of(context).changeTheNameOfTheGroup; +ERROR: ^^^^ +ERROR: lib/pages/chat_permissions_settings/permission_list_tile.dart:52:18: Error: The getter 'L10n' isn't defined for the class 'PermissionsListTile'. +ERROR: - 'PermissionsListTile' is from 'package:fluffychat/pages/chat_permissions_settings/permission_list_tile.dart' ('lib/pages/chat_permissions_settings/permission_list_tile.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: return L10n.of(context).changeTheDescriptionOfTheGroup; +ERROR: ^^^^ +ERROR: lib/pages/chat_permissions_settings/permission_list_tile.dart:54:18: Error: The getter 'L10n' isn't defined for the class 'PermissionsListTile'. +ERROR: - 'PermissionsListTile' is from 'package:fluffychat/pages/chat_permissions_settings/permission_list_tile.dart' ('lib/pages/chat_permissions_settings/permission_list_tile.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: return L10n.of(context).changeTheChatPermissions; +ERROR: ^^^^ +ERROR: lib/pages/chat_permissions_settings/permission_list_tile.dart:56:18: Error: The getter 'L10n' isn't defined for the class 'PermissionsListTile'. +ERROR: - 'PermissionsListTile' is from 'package:fluffychat/pages/chat_permissions_settings/permission_list_tile.dart' ('lib/pages/chat_permissions_settings/permission_list_tile.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: return L10n.of(context).changeTheVisibilityOfChatHistory; +ERROR: ^^^^ +ERROR: lib/pages/chat_permissions_settings/permission_list_tile.dart:58:18: Error: The getter 'L10n' isn't defined for the class 'PermissionsListTile'. +ERROR: - 'PermissionsListTile' is from 'package:fluffychat/pages/chat_permissions_settings/permission_list_tile.dart' ('lib/pages/chat_permissions_settings/permission_list_tile.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: return L10n.of(context).changeTheCanonicalRoomAlias; +ERROR: ^^^^ +ERROR: lib/pages/chat_permissions_settings/permission_list_tile.dart:60:18: Error: The getter 'L10n' isn't defined for the class 'PermissionsListTile'. +ERROR: - 'PermissionsListTile' is from 'package:fluffychat/pages/chat_permissions_settings/permission_list_tile.dart' ('lib/pages/chat_permissions_settings/permission_list_tile.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: return L10n.of(context).editRoomAvatar; +ERROR: ^^^^ +ERROR: lib/pages/chat_permissions_settings/permission_list_tile.dart:62:18: Error: The getter 'L10n' isn't defined for the class 'PermissionsListTile'. +ERROR: - 'PermissionsListTile' is from 'package:fluffychat/pages/chat_permissions_settings/permission_list_tile.dart' ('lib/pages/chat_permissions_settings/permission_list_tile.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: return L10n.of(context).replaceRoomWithNewerVersion; +ERROR: ^^^^ +ERROR: lib/pages/chat_permissions_settings/permission_list_tile.dart:64:18: Error: The getter 'L10n' isn't defined for the class 'PermissionsListTile'. +ERROR: - 'PermissionsListTile' is from 'package:fluffychat/pages/chat_permissions_settings/permission_list_tile.dart' ('lib/pages/chat_permissions_settings/permission_list_tile.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: return L10n.of(context).enableEncryption; +ERROR: ^^^^ +ERROR: lib/pages/chat_permissions_settings/permission_list_tile.dart:66:18: Error: The getter 'L10n' isn't defined for the class 'PermissionsListTile'. +ERROR: - 'PermissionsListTile' is from 'package:fluffychat/pages/chat_permissions_settings/permission_list_tile.dart' ('lib/pages/chat_permissions_settings/permission_list_tile.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: return L10n.of(context).editBlockedServers; +ERROR: ^^^^ +ERROR: lib/pages/chat_permissions_settings/permission_list_tile.dart:99:17: Error: The getter 'L10n' isn't defined for the class 'PermissionsListTile'. +ERROR: - 'PermissionsListTile' is from 'package:fluffychat/pages/chat_permissions_settings/permission_list_tile.dart' ('lib/pages/chat_permissions_settings/permission_list_tile.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).userLevel(permission < 50 ? permission : 0), +ERROR: ^^^^ +ERROR: lib/pages/chat_permissions_settings/permission_list_tile.dart:105:17: Error: The getter 'L10n' isn't defined for the class 'PermissionsListTile'. +ERROR: - 'PermissionsListTile' is from 'package:fluffychat/pages/chat_permissions_settings/permission_list_tile.dart' ('lib/pages/chat_permissions_settings/permission_list_tile.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).moderatorLevel( +ERROR: ^^^^ +ERROR: lib/pages/chat_permissions_settings/permission_list_tile.dart:113:17: Error: The getter 'L10n' isn't defined for the class 'PermissionsListTile'. +ERROR: - 'PermissionsListTile' is from 'package:fluffychat/pages/chat_permissions_settings/permission_list_tile.dart' ('lib/pages/chat_permissions_settings/permission_list_tile.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context) +ERROR: ^^^^ +ERROR: lib/pages/chat_permissions_settings/permission_list_tile.dart:119:27: Error: The getter 'L10n' isn't defined for the class 'PermissionsListTile'. +ERROR: - 'PermissionsListTile' is from 'package:fluffychat/pages/chat_permissions_settings/permission_list_tile.dart' ('lib/pages/chat_permissions_settings/permission_list_tile.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: child: Text(L10n.of(context).custom), +ERROR: ^^^^ +ERROR: lib/pages/chat_search/chat_search_files_tab.dart:40:17: Error: The getter 'L10n' isn't defined for the class 'ChatSearchFilesTab'. +ERROR: - 'ChatSearchFilesTab' is from 'package:fluffychat/pages/chat_search/chat_search_files_tab.dart' ('lib/pages/chat_search/chat_search_files_tab.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).searchIn( +ERROR: ^^^^ +ERROR: lib/pages/chat_search/chat_search_files_tab.dart:42:34: Error: The getter 'L10n' isn't defined for the class 'ChatSearchFilesTab'. +ERROR: - 'ChatSearchFilesTab' is from 'package:fluffychat/pages/chat_search/chat_search_files_tab.dart' ('lib/pages/chat_search/chat_search_files_tab.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: MatrixLocals(L10n.of(context)), +ERROR: ^^^^ +ERROR: lib/pages/chat_search/chat_search_files_tab.dart:56:20: Error: The getter 'L10n' isn't defined for the class 'ChatSearchFilesTab'. +ERROR: - 'ChatSearchFilesTab' is from 'package:fluffychat/pages/chat_search/chat_search_files_tab.dart' ('lib/pages/chat_search/chat_search_files_tab.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: Text(L10n.of(context).nothingFound), +ERROR: ^^^^ +ERROR: lib/pages/chat_search/chat_search_files_tab.dart:96:35: Error: The getter 'L10n' isn't defined for the class 'ChatSearchFilesTab'. +ERROR: - 'ChatSearchFilesTab' is from 'package:fluffychat/pages/chat_search/chat_search_files_tab.dart' ('lib/pages/chat_search/chat_search_files_tab.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: label: Text(L10n.of(context).searchMore), +ERROR: ^^^^ +ERROR: lib/pages/chat_search/chat_search_files_tab.dart:104:19: Error: The getter 'L10n' isn't defined for the class 'ChatSearchFilesTab'. +ERROR: - 'ChatSearchFilesTab' is from 'package:fluffychat/pages/chat_search/chat_search_files_tab.dart' ('lib/pages/chat_search/chat_search_files_tab.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).unknownEvent('File'); +ERROR: ^^^^ +ERROR: lib/pages/chat_search/chat_search_images_tab.dart:44:17: Error: The getter 'L10n' isn't defined for the class 'ChatSearchImagesTab'. +ERROR: - 'ChatSearchImagesTab' is from 'package:fluffychat/pages/chat_search/chat_search_images_tab.dart' ('lib/pages/chat_search/chat_search_images_tab.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).searchIn( +ERROR: ^^^^ +ERROR: lib/pages/chat_search/chat_search_images_tab.dart:46:34: Error: The getter 'L10n' isn't defined for the class 'ChatSearchImagesTab'. +ERROR: - 'ChatSearchImagesTab' is from 'package:fluffychat/pages/chat_search/chat_search_images_tab.dart' ('lib/pages/chat_search/chat_search_images_tab.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: MatrixLocals(L10n.of(context)), +ERROR: ^^^^ +ERROR: lib/pages/chat_search/chat_search_images_tab.dart:59:20: Error: The getter 'L10n' isn't defined for the class 'ChatSearchImagesTab'. +ERROR: - 'ChatSearchImagesTab' is from 'package:fluffychat/pages/chat_search/chat_search_images_tab.dart' ('lib/pages/chat_search/chat_search_images_tab.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: Text(L10n.of(context).nothingFound), +ERROR: ^^^^ +ERROR: lib/pages/chat_search/chat_search_images_tab.dart:109:33: Error: The getter 'L10n' isn't defined for the class 'ChatSearchImagesTab'. +ERROR: - 'ChatSearchImagesTab' is from 'package:fluffychat/pages/chat_search/chat_search_images_tab.dart' ('lib/pages/chat_search/chat_search_images_tab.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: label: Text(L10n.of(context).searchMore), +ERROR: ^^^^ +ERROR: lib/pages/chat_search/chat_search_message_tab.dart:44:17: Error: The getter 'L10n' isn't defined for the class 'ChatSearchMessageTab'. +ERROR: - 'ChatSearchMessageTab' is from 'package:fluffychat/pages/chat_search/chat_search_message_tab.dart' ('lib/pages/chat_search/chat_search_message_tab.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).searchIn( +ERROR: ^^^^ +ERROR: lib/pages/chat_search/chat_search_message_tab.dart:46:34: Error: The getter 'L10n' isn't defined for the class 'ChatSearchMessageTab'. +ERROR: - 'ChatSearchMessageTab' is from 'package:fluffychat/pages/chat_search/chat_search_message_tab.dart' ('lib/pages/chat_search/chat_search_message_tab.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: MatrixLocals(L10n.of(context)), +ERROR: ^^^^ +ERROR: lib/pages/chat_search/chat_search_message_tab.dart:93:35: Error: The getter 'L10n' isn't defined for the class 'ChatSearchMessageTab'. +ERROR: - 'ChatSearchMessageTab' is from 'package:fluffychat/pages/chat_search/chat_search_message_tab.dart' ('lib/pages/chat_search/chat_search_message_tab.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: label: Text(L10n.of(context).searchMore), +ERROR: ^^^^ +ERROR: lib/pages/chat_search/chat_search_message_tab.dart:101:36: Error: The getter 'L10n' isn't defined for the class 'ChatSearchMessageTab'. +ERROR: - 'ChatSearchMessageTab' is from 'package:fluffychat/pages/chat_search/chat_search_message_tab.dart' ('lib/pages/chat_search/chat_search_message_tab.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: i18n: MatrixLocals(L10n.of(context)), +ERROR: ^^^^ +ERROR: lib/pages/chat_search/chat_search_message_tab.dart:168:17: Error: The getter 'L10n' isn't defined for the class '_MessageSearchResultListTile'. +ERROR: - '_MessageSearchResultListTile' is from 'package:fluffychat/pages/chat_search/chat_search_message_tab.dart' ('lib/pages/chat_search/chat_search_message_tab.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context), +ERROR: ^^^^ +ERROR: lib/pages/device_settings/user_device_list_item.dart:128:13: Error: The getter 'L10n' isn't defined for the class 'UserDeviceListItem'. +ERROR: - 'UserDeviceListItem' is from 'package:fluffychat/pages/device_settings/user_device_list_item.dart' ('lib/pages/device_settings/user_device_list_item.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).lastActiveAgo( +ERROR: ^^^^ +ERROR: lib/pages/device_settings/user_device_list_item.dart:138:25: Error: The getter 'L10n' isn't defined for the class 'UserDeviceListItem'. +ERROR: - 'UserDeviceListItem' is from 'package:fluffychat/pages/device_settings/user_device_list_item.dart' ('lib/pages/device_settings/user_device_list_item.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: ? L10n.of(context).blocked +ERROR: ^^^^ +ERROR: lib/pages/device_settings/user_device_list_item.dart:140:29: Error: The getter 'L10n' isn't defined for the class 'UserDeviceListItem'. +ERROR: - 'UserDeviceListItem' is from 'package:fluffychat/pages/device_settings/user_device_list_item.dart' ('lib/pages/device_settings/user_device_list_item.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: ? L10n.of(context).verified +ERROR: ^^^^ +ERROR: lib/pages/device_settings/user_device_list_item.dart:141:29: Error: The getter 'L10n' isn't defined for the class 'UserDeviceListItem'. +ERROR: - 'UserDeviceListItem' is from 'package:fluffychat/pages/device_settings/user_device_list_item.dart' ('lib/pages/device_settings/user_device_list_item.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: : L10n.of(context).unverified, +ERROR: ^^^^ +ERROR: lib/pages/device_settings/user_device_list_item.dart:55:28: Error: The getter 'L10n' isn't defined for the class 'UserDeviceListItem'. +ERROR: - 'UserDeviceListItem' is from 'package:fluffychat/pages/device_settings/user_device_list_item.dart' ('lib/pages/device_settings/user_device_list_item.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: cancelLabel: L10n.of(context).cancel, +ERROR: ^^^^ +ERROR: lib/pages/device_settings/user_device_list_item.dart:60:26: Error: The getter 'L10n' isn't defined for the class 'UserDeviceListItem'. +ERROR: - 'UserDeviceListItem' is from 'package:fluffychat/pages/device_settings/user_device_list_item.dart' ('lib/pages/device_settings/user_device_list_item.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: label: L10n.of(context).changeDeviceName, +ERROR: ^^^^ +ERROR: lib/pages/device_settings/user_device_list_item.dart:66:28: Error: The getter 'L10n' isn't defined for the class 'UserDeviceListItem'. +ERROR: - 'UserDeviceListItem' is from 'package:fluffychat/pages/device_settings/user_device_list_item.dart' ('lib/pages/device_settings/user_device_list_item.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: label: L10n.of(context).verifyStart, +ERROR: ^^^^ +ERROR: lib/pages/device_settings/user_device_list_item.dart:72:30: Error: The getter 'L10n' isn't defined for the class 'UserDeviceListItem'. +ERROR: - 'UserDeviceListItem' is from 'package:fluffychat/pages/device_settings/user_device_list_item.dart' ('lib/pages/device_settings/user_device_list_item.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: label: L10n.of(context).blockDevice, +ERROR: ^^^^ +ERROR: lib/pages/device_settings/user_device_list_item.dart:79:30: Error: The getter 'L10n' isn't defined for the class 'UserDeviceListItem'. +ERROR: - 'UserDeviceListItem' is from 'package:fluffychat/pages/device_settings/user_device_list_item.dart' ('lib/pages/device_settings/user_device_list_item.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: label: L10n.of(context).unblockDevice, +ERROR: ^^^^ +ERROR: lib/pages/device_settings/user_device_list_item.dart:87:28: Error: The getter 'L10n' isn't defined for the class 'UserDeviceListItem'. +ERROR: - 'UserDeviceListItem' is from 'package:fluffychat/pages/device_settings/user_device_list_item.dart' ('lib/pages/device_settings/user_device_list_item.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: label: L10n.of(context).delete, +ERROR: ^^^^ +ERROR: lib/widgets/layouts/login_scaffold.dart:98:17: Error: The getter 'L10n' isn't defined for the class '_PrivacyButtons'. +ERROR: - '_PrivacyButtons' is from 'package:fluffychat/widgets/layouts/login_scaffold.dart' ('lib/widgets/layouts/login_scaffold.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).website, +ERROR: ^^^^ +ERROR: lib/widgets/layouts/login_scaffold.dart:105:17: Error: The getter 'L10n' isn't defined for the class '_PrivacyButtons'. +ERROR: - '_PrivacyButtons' is from 'package:fluffychat/widgets/layouts/login_scaffold.dart' ('lib/widgets/layouts/login_scaffold.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).help, +ERROR: ^^^^ +ERROR: lib/widgets/layouts/login_scaffold.dart:112:17: Error: The getter 'L10n' isn't defined for the class '_PrivacyButtons'. +ERROR: - '_PrivacyButtons' is from 'package:fluffychat/widgets/layouts/login_scaffold.dart' ('lib/widgets/layouts/login_scaffold.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).privacy, +ERROR: ^^^^ +ERROR: lib/widgets/layouts/login_scaffold.dart:119:17: Error: The getter 'L10n' isn't defined for the class '_PrivacyButtons'. +ERROR: - '_PrivacyButtons' is from 'package:fluffychat/widgets/layouts/login_scaffold.dart' ('lib/widgets/layouts/login_scaffold.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).about, +ERROR: ^^^^ +ERROR: lib/pages/chat/events/state_message.dart:29:32: Error: The getter 'L10n' isn't defined for the class 'StateMessage'. +ERROR: - 'StateMessage' is from 'package:fluffychat/pages/chat/events/state_message.dart' ('lib/pages/chat/events/state_message.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: MatrixLocals(L10n.of(context)), +ERROR: ^^^^ +ERROR: lib/utils/room_status_extension.dart:15:20: Error: The getter 'L10n' isn't defined for the class 'Room'. +ERROR: - 'Room' is from 'package:matrix/src/room.dart' ('../../.pub-cache/hosted/pub.dev/matrix-0.40.0/lib/src/room.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: typingText = L10n.of(context).isTyping; +ERROR: ^^^^ +ERROR: lib/utils/room_status_extension.dart:17:22: Error: The getter 'L10n' isn't defined for the class 'Room'. +ERROR: - 'Room' is from 'package:matrix/src/room.dart' ('../../.pub-cache/hosted/pub.dev/matrix-0.40.0/lib/src/room.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: typingText = L10n.of(context).numUsersTyping(typingUsers.length); +ERROR: ^^^^ +ERROR: lib/utils/room_status_extension.dart:20:20: Error: The getter 'L10n' isn't defined for the class 'Room'. +ERROR: - 'Room' is from 'package:matrix/src/room.dart' ('../../.pub-cache/hosted/pub.dev/matrix-0.40.0/lib/src/room.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: typingText = L10n.of(context).isTyping; +ERROR: ^^^^ +ERROR: lib/utils/room_status_extension.dart:23:13: Error: The getter 'L10n' isn't defined for the class 'Room'. +ERROR: - 'Room' is from 'package:matrix/src/room.dart' ('../../.pub-cache/hosted/pub.dev/matrix-0.40.0/lib/src/room.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).userIsTyping(typingUsers.first.calcDisplayname()); +ERROR: ^^^^ +ERROR: lib/utils/room_status_extension.dart:26:20: Error: The getter 'L10n' isn't defined for the class 'Room'. +ERROR: - 'Room' is from 'package:matrix/src/room.dart' ('../../.pub-cache/hosted/pub.dev/matrix-0.40.0/lib/src/room.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: typingText = L10n.of(context).userAndUserAreTyping( +ERROR: ^^^^ +ERROR: lib/utils/room_status_extension.dart:31:20: Error: The getter 'L10n' isn't defined for the class 'Room'. +ERROR: - 'Room' is from 'package:matrix/src/room.dart' ('../../.pub-cache/hosted/pub.dev/matrix-0.40.0/lib/src/room.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: typingText = L10n.of(context).userAndOthersAreTyping( +ERROR: ^^^^ +ERROR: lib/pages/chat/events/room_creation_state_event.dart:18:18: Error: The getter 'L10n' isn't defined for the class 'RoomCreationStateEvent'. +ERROR: - 'RoomCreationStateEvent' is from 'package:fluffychat/pages/chat/events/room_creation_state_event.dart' ('lib/pages/chat/events/room_creation_state_event.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: final l10n = L10n.of(context); +ERROR: ^^^^ +ERROR: lib/widgets/member_actions_popup_menu_button.dart:83:20: Error: Undefined name 'L10n'. +ERROR: Text(L10n.of(context).mention), +ERROR: ^^^^ +ERROR: lib/widgets/member_actions_popup_menu_button.dart:94:20: Error: Undefined name 'L10n'. +ERROR: Text(L10n.of(context).approve), +ERROR: ^^^^ +ERROR: lib/widgets/member_actions_popup_menu_button.dart:109:22: Error: Undefined name 'L10n'. +ERROR: Text(L10n.of(context).chatPermissions), +ERROR: ^^^^ +ERROR: lib/widgets/member_actions_popup_menu_button.dart:112:25: Error: Undefined name 'L10n'. +ERROR: ? L10n.of(context).userLevel(user.powerLevel) +ERROR: ^^^^ +ERROR: lib/widgets/member_actions_popup_menu_button.dart:114:29: Error: Undefined name 'L10n'. +ERROR: ? L10n.of(context).moderatorLevel(user.powerLevel) +ERROR: ^^^^ +ERROR: lib/widgets/member_actions_popup_menu_button.dart:115:29: Error: Undefined name 'L10n'. +ERROR: : L10n.of(context).adminLevel(user.powerLevel), +ERROR: ^^^^ +ERROR: lib/widgets/member_actions_popup_menu_button.dart:134:17: Error: Undefined name 'L10n'. +ERROR: L10n.of(context).kickFromChat, +ERROR: ^^^^ +ERROR: lib/widgets/member_actions_popup_menu_button.dart:151:17: Error: Undefined name 'L10n'. +ERROR: L10n.of(context).banFromChat, +ERROR: ^^^^ +ERROR: lib/widgets/member_actions_popup_menu_button.dart:164:20: Error: Undefined name 'L10n'. +ERROR: Text(L10n.of(context).unbanFromChat), +ERROR: ^^^^ +ERROR: lib/widgets/member_actions_popup_menu_button.dart:179:17: Error: Undefined name 'L10n'. +ERROR: L10n.of(context).reportUser, +ERROR: ^^^^ +ERROR: lib/widgets/member_actions_popup_menu_button.dart:205:18: Error: Undefined name 'L10n'. +ERROR: title: L10n.of(context).areYouSure, +ERROR: ^^^^ +ERROR: lib/widgets/member_actions_popup_menu_button.dart:206:20: Error: Undefined name 'L10n'. +ERROR: message: L10n.of(context).makeAdminDescription, +ERROR: ^^^^ +ERROR: lib/widgets/member_actions_popup_menu_button.dart:225:20: Error: Undefined name 'L10n'. +ERROR: title: L10n.of(context).areYouSure, +ERROR: ^^^^ +ERROR: lib/widgets/member_actions_popup_menu_button.dart:226:22: Error: Undefined name 'L10n'. +ERROR: okLabel: L10n.of(context).yes, +ERROR: ^^^^ +ERROR: lib/widgets/member_actions_popup_menu_button.dart:227:26: Error: Undefined name 'L10n'. +ERROR: cancelLabel: L10n.of(context).no, +ERROR: ^^^^ +ERROR: lib/widgets/member_actions_popup_menu_button.dart:228:22: Error: Undefined name 'L10n'. +ERROR: message: L10n.of(context).kickUserDescription, +ERROR: ^^^^ +ERROR: lib/widgets/member_actions_popup_menu_button.dart:240:20: Error: Undefined name 'L10n'. +ERROR: title: L10n.of(context).areYouSure, +ERROR: ^^^^ +ERROR: lib/widgets/member_actions_popup_menu_button.dart:241:22: Error: Undefined name 'L10n'. +ERROR: okLabel: L10n.of(context).yes, +ERROR: ^^^^ +ERROR: lib/widgets/member_actions_popup_menu_button.dart:242:26: Error: Undefined name 'L10n'. +ERROR: cancelLabel: L10n.of(context).no, +ERROR: ^^^^ +ERROR: lib/widgets/member_actions_popup_menu_button.dart:243:22: Error: Undefined name 'L10n'. +ERROR: message: L10n.of(context).banUserDescription, +ERROR: ^^^^ +ERROR: lib/widgets/member_actions_popup_menu_button.dart:255:16: Error: Undefined name 'L10n'. +ERROR: title: L10n.of(context).whyDoYouWantToReportThis, +ERROR: ^^^^ +ERROR: lib/widgets/member_actions_popup_menu_button.dart:256:18: Error: Undefined name 'L10n'. +ERROR: okLabel: L10n.of(context).report, +ERROR: ^^^^ +ERROR: lib/widgets/member_actions_popup_menu_button.dart:257:22: Error: Undefined name 'L10n'. +ERROR: cancelLabel: L10n.of(context).cancel, +ERROR: ^^^^ +ERROR: lib/widgets/member_actions_popup_menu_button.dart:258:19: Error: Undefined name 'L10n'. +ERROR: hintText: L10n.of(context).reason, +ERROR: ^^^^ +ERROR: lib/widgets/member_actions_popup_menu_button.dart:271:32: Error: Undefined name 'L10n'. +ERROR: SnackBar(content: Text(L10n.of(context).contentHasBeenReported)), +ERROR: ^^^^ +ERROR: lib/widgets/member_actions_popup_menu_button.dart:287:20: Error: Undefined name 'L10n'. +ERROR: title: L10n.of(context).areYouSure, +ERROR: ^^^^ +ERROR: lib/widgets/member_actions_popup_menu_button.dart:288:22: Error: Undefined name 'L10n'. +ERROR: okLabel: L10n.of(context).yes, +ERROR: ^^^^ +ERROR: lib/widgets/member_actions_popup_menu_button.dart:289:26: Error: Undefined name 'L10n'. +ERROR: cancelLabel: L10n.of(context).no, +ERROR: ^^^^ +ERROR: lib/widgets/member_actions_popup_menu_button.dart:290:22: Error: Undefined name 'L10n'. +ERROR: message: L10n.of(context).unbanUserDescription, +ERROR: ^^^^ +ERROR: lib/pages/chat/events/message_content.dart:45:18: Error: The getter 'L10n' isn't defined for the class 'MessageContent'. +ERROR: - 'MessageContent' is from 'package:fluffychat/pages/chat/events/message_content.dart' ('lib/pages/chat/events/message_content.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: final l10n = L10n.of(context); +ERROR: ^^^^ +ERROR: lib/pages/chat/events/message_content.dart:218:22: Error: The getter 'L10n' isn't defined for the class 'MessageContent'. +ERROR: - 'MessageContent' is from 'package:fluffychat/pages/chat/events/message_content.dart' ('lib/pages/chat/events/message_content.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: label: L10n.of(context).encrypted, +ERROR: ^^^^ +ERROR: lib/pages/chat/events/message_content.dart:247:25: Error: The getter 'L10n' isn't defined for the class 'MessageContent'. +ERROR: - 'MessageContent' is from 'package:fluffychat/pages/chat/events/message_content.dart' ('lib/pages/chat/events/message_content.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).openInMaps, +ERROR: ^^^^ +ERROR: lib/pages/chat/events/message_content.dart:267:23: Error: The getter 'L10n' isn't defined for the class 'MessageContent'. +ERROR: - 'MessageContent' is from 'package:fluffychat/pages/chat/events/message_content.dart' ('lib/pages/chat/events/message_content.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).user; +ERROR: ^^^^ +ERROR: lib/pages/chat/events/message_content.dart:270:27: Error: The getter 'L10n' isn't defined for the class 'MessageContent'. +ERROR: - 'MessageContent' is from 'package:fluffychat/pages/chat/events/message_content.dart' ('lib/pages/chat/events/message_content.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: ? L10n.of(context).redactedBy(redactedBy) +ERROR: ^^^^ +ERROR: lib/pages/chat/events/message_content.dart:271:27: Error: The getter 'L10n' isn't defined for the class 'MessageContent'. +ERROR: - 'MessageContent' is from 'package:fluffychat/pages/chat/events/message_content.dart' ('lib/pages/chat/events/message_content.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: : L10n.of(context).redactedByBecause( +ERROR: ^^^^ +ERROR: lib/pages/chat/events/message_content.dart:293:32: Error: The getter 'L10n' isn't defined for the class 'MessageContent'. +ERROR: - 'MessageContent' is from 'package:fluffychat/pages/chat/events/message_content.dart' ('lib/pages/chat/events/message_content.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: MatrixLocals(L10n.of(context)), +ERROR: ^^^^ +ERROR: lib/pages/chat/events/message_content.dart:319:22: Error: The getter 'L10n' isn't defined for the class 'MessageContent'. +ERROR: - 'MessageContent' is from 'package:fluffychat/pages/chat/events/message_content.dart' ('lib/pages/chat/events/message_content.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: label: L10n.of(context).startedACall( +ERROR: ^^^^ +ERROR: lib/pages/chat/events/message_content.dart:335:22: Error: The getter 'L10n' isn't defined for the class 'MessageContent'. +ERROR: - 'MessageContent' is from 'package:fluffychat/pages/chat/events/message_content.dart' ('lib/pages/chat/events/message_content.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: label: L10n.of(context).userSentUnknownEvent( +ERROR: ^^^^ +ERROR: lib/pages/chat/events/reply_content.dart:78:34: Error: The getter 'L10n' isn't defined for the class 'ReplyContent'. +ERROR: - 'ReplyContent' is from 'package:fluffychat/pages/chat/events/reply_content.dart' ('lib/pages/chat/events/reply_content.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: MatrixLocals(L10n.of(context)), +ERROR: ^^^^ +ERROR: lib/utils/sync_status_localization.dart:13:16: Error: The getter 'L10n' isn't defined for the class 'SyncStatusUpdate'. +ERROR: - 'SyncStatusUpdate' is from 'package:matrix/src/client.dart' ('../../.pub-cache/hosted/pub.dev/matrix-0.40.0/lib/src/client.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: return L10n.of(context).waitingForServer; +ERROR: ^^^^ +ERROR: lib/utils/sync_status_localization.dart:21:15: Error: The getter 'L10n' isn't defined for the class 'SyncStatusUpdate'. +ERROR: - 'SyncStatusUpdate' is from 'package:matrix/src/client.dart' ('../../.pub-cache/hosted/pub.dev/matrix-0.40.0/lib/src/client.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: ? L10n.of(context).synchronizingPleaseWait +ERROR: ^^^^ +ERROR: lib/utils/sync_status_localization.dart:22:15: Error: The getter 'L10n' isn't defined for the class 'SyncStatusUpdate'. +ERROR: - 'SyncStatusUpdate' is from 'package:matrix/src/client.dart' ('../../.pub-cache/hosted/pub.dev/matrix-0.40.0/lib/src/client.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: : L10n.of(context).synchronizingPleaseWaitCounter( +ERROR: ^^^^ +ERROR: lib/pages/chat/sticker_picker_dialog.dart:121:31: Error: The getter 'L10n' isn't defined for the class 'StickerPickerDialogState'. +ERROR: - 'StickerPickerDialogState' is from 'package:fluffychat/pages/chat/sticker_picker_dialog.dart' ('lib/pages/chat/sticker_picker_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: hintText: L10n.of(context).search, +ERROR: ^^^^ +ERROR: lib/pages/chat/sticker_picker_dialog.dart:135:28: Error: The getter 'L10n' isn't defined for the class 'StickerPickerDialogState'. +ERROR: - 'StickerPickerDialogState' is from 'package:fluffychat/pages/chat/sticker_picker_dialog.dart' ('lib/pages/chat/sticker_picker_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: Text(L10n.of(context).noEmotesFound), +ERROR: ^^^^ +ERROR: lib/pages/chat/sticker_picker_dialog.dart:143:37: Error: The getter 'L10n' isn't defined for the class 'StickerPickerDialogState'. +ERROR: - 'StickerPickerDialogState' is from 'package:fluffychat/pages/chat/sticker_picker_dialog.dart' ('lib/pages/chat/sticker_picker_dialog.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: label: Text(L10n.of(context).discover), +ERROR: ^^^^ +ERROR: lib/pages/chat/input_bar.dart:227:32: Error: The getter 'L10n' isn't defined for the class 'InputBar'. +ERROR: - 'InputBar' is from 'package:fluffychat/pages/chat/input_bar.dart' ('lib/pages/chat/input_bar.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: final hint = commandHint(L10n.of(context), command); +ERROR: ^^^^ +ERROR: lib/pages/chat_list/space_view.dart:135:18: Error: The getter 'L10n' isn't defined for the class '_SpaceViewState'. +ERROR: - '_SpaceViewState' is from 'package:fluffychat/pages/chat_list/space_view.dart' ('lib/pages/chat_list/space_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).areYouSure, +ERROR: ^^^^ +ERROR: lib/pages/chat_list/space_view.dart:136:20: Error: The getter 'L10n' isn't defined for the class '_SpaceViewState'. +ERROR: - '_SpaceViewState' is from 'package:fluffychat/pages/chat_list/space_view.dart' ('lib/pages/chat_list/space_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: message: L10n.of(context).archiveRoomDescription, +ERROR: ^^^^ +ERROR: lib/pages/chat_list/space_view.dart:137:20: Error: The getter 'L10n' isn't defined for the class '_SpaceViewState'. +ERROR: - '_SpaceViewState' is from 'package:fluffychat/pages/chat_list/space_view.dart' ('lib/pages/chat_list/space_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: okLabel: L10n.of(context).leave, +ERROR: ^^^^ +ERROR: lib/pages/chat_list/space_view.dart:138:24: Error: The getter 'L10n' isn't defined for the class '_SpaceViewState'. +ERROR: - '_SpaceViewState' is from 'package:fluffychat/pages/chat_list/space_view.dart' ('lib/pages/chat_list/space_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: cancelLabel: L10n.of(context).cancel, +ERROR: ^^^^ +ERROR: lib/pages/chat_list/space_view.dart:157:14: Error: The getter 'L10n' isn't defined for the class '_SpaceViewState'. +ERROR: - '_SpaceViewState' is from 'package:fluffychat/pages/chat_list/space_view.dart' ('lib/pages/chat_list/space_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).addChatOrSubSpace, +ERROR: ^^^^ +ERROR: lib/pages/chat_list/space_view.dart:161:18: Error: The getter 'L10n' isn't defined for the class '_SpaceViewState'. +ERROR: - '_SpaceViewState' is from 'package:fluffychat/pages/chat_list/space_view.dart' ('lib/pages/chat_list/space_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: label: L10n.of(context).createNewSpace, +ERROR: ^^^^ +ERROR: lib/pages/chat_list/space_view.dart:165:18: Error: The getter 'L10n' isn't defined for the class '_SpaceViewState'. +ERROR: - '_SpaceViewState' is from 'package:fluffychat/pages/chat_list/space_view.dart' ('lib/pages/chat_list/space_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: label: L10n.of(context).createGroup, +ERROR: ^^^^ +ERROR: lib/pages/chat_list/space_view.dart:174:13: Error: The getter 'L10n' isn't defined for the class '_SpaceViewState'. +ERROR: - '_SpaceViewState' is from 'package:fluffychat/pages/chat_list/space_view.dart' ('lib/pages/chat_list/space_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: ? L10n.of(context).createNewSpace +ERROR: ^^^^ +ERROR: lib/pages/chat_list/space_view.dart:175:13: Error: The getter 'L10n' isn't defined for the class '_SpaceViewState'. +ERROR: - '_SpaceViewState' is from 'package:fluffychat/pages/chat_list/space_view.dart' ('lib/pages/chat_list/space_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: : L10n.of(context).createGroup, +ERROR: ^^^^ +ERROR: lib/pages/chat_list/space_view.dart:177:13: Error: The getter 'L10n' isn't defined for the class '_SpaceViewState'. +ERROR: - '_SpaceViewState' is from 'package:fluffychat/pages/chat_list/space_view.dart' ('lib/pages/chat_list/space_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: ? L10n.of(context).spaceName +ERROR: ^^^^ +ERROR: lib/pages/chat_list/space_view.dart:178:13: Error: The getter 'L10n' isn't defined for the class '_SpaceViewState'. +ERROR: - '_SpaceViewState' is from 'package:fluffychat/pages/chat_list/space_view.dart' ('lib/pages/chat_list/space_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: : L10n.of(context).groupName, +ERROR: ^^^^ +ERROR: lib/pages/chat_list/space_view.dart:188:16: Error: The getter 'L10n' isn't defined for the class '_SpaceViewState'. +ERROR: - '_SpaceViewState' is from 'package:fluffychat/pages/chat_list/space_view.dart' ('lib/pages/chat_list/space_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: okLabel: L10n.of(context).create, +ERROR: ^^^^ +ERROR: lib/pages/chat_list/space_view.dart:189:20: Error: The getter 'L10n' isn't defined for the class '_SpaceViewState'. +ERROR: - '_SpaceViewState' is from 'package:fluffychat/pages/chat_list/space_view.dart' ('lib/pages/chat_list/space_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: cancelLabel: L10n.of(context).cancel, +ERROR: ^^^^ +ERROR: lib/pages/chat_list/space_view.dart:184:18: Error: The getter 'L10n' isn't defined for the class '_SpaceViewState'. +ERROR: - '_SpaceViewState' is from 'package:fluffychat/pages/chat_list/space_view.dart' ('lib/pages/chat_list/space_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: return L10n.of(context).pleaseChoose; +ERROR: ^^^^ +ERROR: lib/pages/chat_list/space_view.dart:230:44: Error: The getter 'L10n' isn't defined for the class '_SpaceViewState'. +ERROR: - '_SpaceViewState' is from 'package:fluffychat/pages/chat_list/space_view.dart' ('lib/pages/chat_list/space_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: room?.getLocalizedDisplayname() ?? L10n.of(context).nothingFound; +ERROR: ^^^^ +ERROR: lib/pages/chat_list/space_view.dart:258:19: Error: The getter 'L10n' isn't defined for the class '_SpaceViewState'. +ERROR: - '_SpaceViewState' is from 'package:fluffychat/pages/chat_list/space_view.dart' ('lib/pages/chat_list/space_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).countChatsAndCountParticipants( +ERROR: ^^^^ +ERROR: lib/pages/chat_list/space_view.dart:277:26: Error: The getter 'L10n' isn't defined for the class '_SpaceViewState'. +ERROR: - '_SpaceViewState' is from 'package:fluffychat/pages/chat_list/space_view.dart' ('lib/pages/chat_list/space_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: Text(L10n.of(context).settings), +ERROR: ^^^^ +ERROR: lib/pages/chat_list/space_view.dart:288:26: Error: The getter 'L10n' isn't defined for the class '_SpaceViewState'. +ERROR: - '_SpaceViewState' is from 'package:fluffychat/pages/chat_list/space_view.dart' ('lib/pages/chat_list/space_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: Text(L10n.of(context).invite), +ERROR: ^^^^ +ERROR: lib/pages/chat_list/space_view.dart:299:26: Error: The getter 'L10n' isn't defined for the class '_SpaceViewState'. +ERROR: - '_SpaceViewState' is from 'package:fluffychat/pages/chat_list/space_view.dart' ('lib/pages/chat_list/space_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: Text(L10n.of(context).leave), +ERROR: ^^^^ +ERROR: lib/pages/chat_list/space_view.dart:313:27: Error: The getter 'L10n' isn't defined for the class '_SpaceViewState'. +ERROR: - '_SpaceViewState' is from 'package:fluffychat/pages/chat_list/space_view.dart' ('lib/pages/chat_list/space_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: label: Text(L10n.of(context).group), +ERROR: ^^^^ +ERROR: lib/pages/chat_list/space_view.dart:367:37: Error: The getter 'L10n' isn't defined for the class '_SpaceViewState'. +ERROR: - '_SpaceViewState' is from 'package:fluffychat/pages/chat_list/space_view.dart' ('lib/pages/chat_list/space_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: hintText: L10n.of(context).search, +ERROR: ^^^^ +ERROR: lib/pages/chat_list/space_view.dart:445:36: Error: The getter 'L10n' isn't defined for the class '_SpaceViewState'. +ERROR: - '_SpaceViewState' is from 'package:fluffychat/pages/chat_list/space_view.dart' ('lib/pages/chat_list/space_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).discover, +ERROR: ^^^^ +ERROR: lib/pages/chat_list/space_view.dart:456:35: Error: The getter 'L10n' isn't defined for the class '_SpaceViewState'. +ERROR: - '_SpaceViewState' is from 'package:fluffychat/pages/chat_list/space_view.dart' ('lib/pages/chat_list/space_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).noMoreChatsFound, +ERROR: ^^^^ +ERROR: lib/pages/chat_list/space_view.dart:475:42: Error: The getter 'L10n' isn't defined for the class '_SpaceViewState'. +ERROR: - '_SpaceViewState' is from 'package:fluffychat/pages/chat_list/space_view.dart' ('lib/pages/chat_list/space_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: : Text(L10n.of(context).loadMore), +ERROR: ^^^^ +ERROR: lib/pages/chat_list/space_view.dart:482:29: Error: The getter 'L10n' isn't defined for the class '_SpaceViewState'. +ERROR: - '_SpaceViewState' is from 'package:fluffychat/pages/chat_list/space_view.dart' ('lib/pages/chat_list/space_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).emptyChat; +ERROR: ^^^^ +ERROR: lib/pages/chat_list/space_view.dart:535:37: Error: The getter 'L10n' isn't defined for the class '_SpaceViewState'. +ERROR: - '_SpaceViewState' is from 'package:fluffychat/pages/chat_list/space_view.dart' ('lib/pages/chat_list/space_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: L10n.of(context).countParticipants( +ERROR: ^^^^ +ERROR: lib/pages/chat_list/chat_list_header.dart:59:21: Error: The getter 'L10n' isn't defined for the class 'ChatListHeader'. +ERROR: - 'ChatListHeader' is from 'package:fluffychat/pages/chat_list/chat_list_header.dart' ('lib/pages/chat_list/chat_list_header.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: ? L10n.of(context).searchChatsRooms +ERROR: ^^^^ +ERROR: lib/pages/chat_list/chat_list_header.dart:70:36: Error: The getter 'L10n' isn't defined for the class 'ChatListHeader'. +ERROR: - 'ChatListHeader' is from 'package:fluffychat/pages/chat_list/chat_list_header.dart' ('lib/pages/chat_list/chat_list_header.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: tooltip: L10n.of(context).cancel, +ERROR: ^^^^ +ERROR: lib/pages/chat/events/cute_events.dart:75:16: Error: The getter 'L10n' isn't defined for the class '_CuteContentState'. +ERROR: - '_CuteContentState' is from 'package:fluffychat/pages/chat/events/cute_events.dart' ('lib/pages/chat/events/cute_events.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: return L10n.of(context).googlyEyesContent( +ERROR: ^^^^ +ERROR: lib/pages/chat/events/cute_events.dart:81:16: Error: The getter 'L10n' isn't defined for the class '_CuteContentState'. +ERROR: - '_CuteContentState' is from 'package:fluffychat/pages/chat/events/cute_events.dart' ('lib/pages/chat/events/cute_events.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: return L10n.of(context).cuddleContent( +ERROR: ^^^^ +ERROR: lib/pages/chat/events/cute_events.dart:87:16: Error: The getter 'L10n' isn't defined for the class '_CuteContentState'. +ERROR: - '_CuteContentState' is from 'package:fluffychat/pages/chat/events/cute_events.dart' ('lib/pages/chat/events/cute_events.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: return L10n.of(context).hugContent( +ERROR: ^^^^ +ERROR: lib/utils/markdown_context_builder.dart:15:16: Error: Undefined name 'L10n'. +ERROR: final l10n = L10n.of(context); +ERROR: ^^^^ +ERROR: lib/pages/chat/command_hints.dart:27:20: Error: 'L10n' isn't a type. +ERROR: String commandHint(L10n l10n, String command) { +ERROR: ^^^^ +ERROR: lib/pages/chat_list/client_chooser_button.dart:35:18: Error: The getter 'L10n' isn't defined for the class 'ClientChooserButton'. +ERROR: - 'ClientChooserButton' is from 'package:fluffychat/pages/chat_list/client_chooser_button.dart' ('lib/pages/chat_list/client_chooser_button.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: Text(L10n.of(context).createGroup), +ERROR: ^^^^ +ERROR: lib/pages/chat_list/client_chooser_button.dart:45:18: Error: The getter 'L10n' isn't defined for the class 'ClientChooserButton'. +ERROR: - 'ClientChooserButton' is from 'package:fluffychat/pages/chat_list/client_chooser_button.dart' ('lib/pages/chat_list/client_chooser_button.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: Text(L10n.of(context).setStatus), +ERROR: ^^^^ +ERROR: lib/pages/chat_list/client_chooser_button.dart:55:18: Error: The getter 'L10n' isn't defined for the class 'ClientChooserButton'. +ERROR: - 'ClientChooserButton' is from 'package:fluffychat/pages/chat_list/client_chooser_button.dart' ('lib/pages/chat_list/client_chooser_button.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: Text(L10n.of(context).inviteContact), +ERROR: ^^^^ +ERROR: lib/pages/chat_list/client_chooser_button.dart:65:18: Error: The getter 'L10n' isn't defined for the class 'ClientChooserButton'. +ERROR: - 'ClientChooserButton' is from 'package:fluffychat/pages/chat_list/client_chooser_button.dart' ('lib/pages/chat_list/client_chooser_button.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: Text(L10n.of(context).archive), +ERROR: ^^^^ +ERROR: lib/pages/chat_list/client_chooser_button.dart:75:18: Error: The getter 'L10n' isn't defined for the class 'ClientChooserButton'. +ERROR: - 'ClientChooserButton' is from 'package:fluffychat/pages/chat_list/client_chooser_button.dart' ('lib/pages/chat_list/client_chooser_button.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: Text(L10n.of(context).settings), +ERROR: ^^^^ +ERROR: lib/pages/chat_list/client_chooser_button.dart:144:18: Error: The getter 'L10n' isn't defined for the class 'ClientChooserButton'. +ERROR: - 'ClientChooserButton' is from 'package:fluffychat/pages/chat_list/client_chooser_button.dart' ('lib/pages/chat_list/client_chooser_button.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: Text(L10n.of(context).addAccount), +ERROR: ^^^^ +ERROR: lib/pages/chat_list/client_chooser_button.dart:200:20: Error: The getter 'L10n' isn't defined for the class 'ClientChooserButton'. +ERROR: - 'ClientChooserButton' is from 'package:fluffychat/pages/chat_list/client_chooser_button.dart' ('lib/pages/chat_list/client_chooser_button.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: title: L10n.of(context).addAccount, +ERROR: ^^^^ +ERROR: lib/pages/chat_list/client_chooser_button.dart:201:22: Error: The getter 'L10n' isn't defined for the class 'ClientChooserButton'. +ERROR: - 'ClientChooserButton' is from 'package:fluffychat/pages/chat_list/client_chooser_button.dart' ('lib/pages/chat_list/client_chooser_button.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: message: L10n.of(context).enableMultiAccounts, +ERROR: ^^^^ +ERROR: lib/pages/chat_list/client_chooser_button.dart:202:22: Error: The getter 'L10n' isn't defined for the class 'ClientChooserButton'. +ERROR: - 'ClientChooserButton' is from 'package:fluffychat/pages/chat_list/client_chooser_button.dart' ('lib/pages/chat_list/client_chooser_button.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: okLabel: L10n.of(context).next, +ERROR: ^^^^ +ERROR: lib/pages/chat_list/client_chooser_button.dart:203:26: Error: The getter 'L10n' isn't defined for the class 'ClientChooserButton'. +ERROR: - 'ClientChooserButton' is from 'package:fluffychat/pages/chat_list/client_chooser_button.dart' ('lib/pages/chat_list/client_chooser_button.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: cancelLabel: L10n.of(context).cancel, +ERROR: ^^^^ +ERROR: lib/pages/image_viewer/image_viewer_view.dart:35:22: Error: The getter 'L10n' isn't defined for the class 'ImageViewerView'. +ERROR: - 'ImageViewerView' is from 'package:fluffychat/pages/image_viewer/image_viewer_view.dart' ('lib/pages/image_viewer/image_viewer_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: tooltip: L10n.of(context).close, +ERROR: ^^^^ +ERROR: lib/pages/image_viewer/image_viewer_view.dart:44:24: Error: The getter 'L10n' isn't defined for the class 'ImageViewerView'. +ERROR: - 'ImageViewerView' is from 'package:fluffychat/pages/image_viewer/image_viewer_view.dart' ('lib/pages/image_viewer/image_viewer_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: tooltip: L10n.of(context).share, +ERROR: ^^^^ +ERROR: lib/pages/image_viewer/image_viewer_view.dart:52:24: Error: The getter 'L10n' isn't defined for the class 'ImageViewerView'. +ERROR: - 'ImageViewerView' is from 'package:fluffychat/pages/image_viewer/image_viewer_view.dart' ('lib/pages/image_viewer/image_viewer_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: tooltip: L10n.of(context).downloadFile, +ERROR: ^^^^ +ERROR: lib/pages/image_viewer/image_viewer_view.dart:63:30: Error: The getter 'L10n' isn't defined for the class 'ImageViewerView'. +ERROR: - 'ImageViewerView' is from 'package:fluffychat/pages/image_viewer/image_viewer_view.dart' ('lib/pages/image_viewer/image_viewer_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: tooltip: L10n.of(context).share, +ERROR: ^^^^ +ERROR: lib/pages/image_viewer/image_viewer_view.dart:129:32: Error: The getter 'L10n' isn't defined for the class 'ImageViewerView'. +ERROR: - 'ImageViewerView' is from 'package:fluffychat/pages/image_viewer/image_viewer_view.dart' ('lib/pages/image_viewer/image_viewer_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: tooltip: L10n.of(context).previous, +ERROR: ^^^^ +ERROR: lib/pages/image_viewer/image_viewer_view.dart:142:32: Error: The getter 'L10n' isn't defined for the class 'ImageViewerView'. +ERROR: - 'ImageViewerView' is from 'package:fluffychat/pages/image_viewer/image_viewer_view.dart' ('lib/pages/image_viewer/image_viewer_view.dart'). +ERROR: Try correcting the name to the name of an existing getter, or defining a getter or field named 'L10n'. +ERROR: tooltip: L10n.of(context).next, +ERROR: ^^^^ +ERROR: Target kernel_snapshot_program failed: Exception +Error: Build process failed diff --git a/fastlane b/fastlane new file mode 100755 index 0000000..94746b0 --- /dev/null +++ b/fastlane @@ -0,0 +1 @@ +./android/fastlane \ No newline at end of file diff --git a/fdroid/.gitignore b/fdroid/.gitignore new file mode 100644 index 0000000..5b807a9 --- /dev/null +++ b/fdroid/.gitignore @@ -0,0 +1,4 @@ +repo +srclibs +tmp +chat.fluffy.fluffychat \ No newline at end of file diff --git a/fdroid/config.nightly.py b/fdroid/config.nightly.py new file mode 100644 index 0000000..86fe493 --- /dev/null +++ b/fdroid/config.nightly.py @@ -0,0 +1,13 @@ +repo_url = "https://fluffychat.im/repo/nightly/repo" +repo_name = "FluffyChat nightly repo" +repo_icon = "fdroid-icon.png" +repo_description = """ +FluffyChat nightly repo +""" + +archive_older = 0 + +local_copy_dir = "/fdroid" + +keystore = "key.nightly.jks" +repo_keyalias = "vmd66783.contaboserver.net" diff --git a/fdroid/config.stable.py b/fdroid/config.stable.py new file mode 100644 index 0000000..d0a3e2e --- /dev/null +++ b/fdroid/config.stable.py @@ -0,0 +1,13 @@ +repo_url = "https://fluffychat.im/repo/stable/repo" +repo_name = "FluffyChat repo" +repo_icon = "fdroid-icon.png" +repo_description = """ +FluffyChat repo +""" + +archive_older = 0 + +local_copy_dir = "/fdroid" + +keystore = "key.jks" +repo_keyalias = "key" diff --git a/fdroid/fdroid-icon.png b/fdroid/fdroid-icon.png new file mode 100644 index 0000000..0c0d417 Binary files /dev/null and b/fdroid/fdroid-icon.png differ diff --git a/fdroid/metadata/chat.fluffy.fluffychat.yml b/fdroid/metadata/chat.fluffy.fluffychat.yml new file mode 100644 index 0000000..32ffd4a --- /dev/null +++ b/fdroid/metadata/chat.fluffy.fluffychat.yml @@ -0,0 +1,53 @@ +Categories: + - Internet + - Phone & SMS +License: AGPL-3.0-only +AuthorName: Famedly +SourceCode: https://github.com/krille-chan/fluffychat +IssueTracker: https://github.com/krille-chan/fluffychat/-/issues +Translation: https://hosted.weblate.org/projects/fluffychat/ +Changelog: https://gitlab.com/ChristianPauly/fluffychat-flutter/-/blob/main/CHANGELOG.md + +AutoName: FluffyChat +Summary: "Chat with your friends with FluffyChat.\n" +Description: | + FluffyChat is an open, nonprofit and cute matrix messenger app for Ubuntu Touch, Android and iOS. + + Open + Opensource and open development where everyone can join. + + Nonprofit + FluffyChat is donation funded. + + Cute ♥ + Cute design and many theme settings including a dark mode. + + One-to-one and groupchats + Unlimited groups and direct chats. + + Easy + FluffyChat is made as simple to use as possible. + + Free + Free to use for everyone without ads. + + Decentralized + There is no "FluffyChat server" you are forced to use. Use the server you find trustworthy or host + your own. + + Compatible + Compatible with Riot, Fractal, Nekho and all matrix messengers. + + + FluffyChat comes with a dream + + Imagine a world where everyone can choose the messenger they like and is still able to chat with + all of their friends. + A world where there are no companies spying on you when you send selfies to friends and lovers. + And a world where apps are made for fluffyness and not for profit. ♥ + +RepoType: git +Repo: https://github.com/krille-chan/fluffychat.git + +AutoUpdateMode: None +UpdateCheckMode: None diff --git a/find.js b/find.js new file mode 100644 index 0000000..695558b --- /dev/null +++ b/find.js @@ -0,0 +1,23 @@ +import fs from 'fs'; + +const files = fs.readdirSync('lib/', { + recursive: true +}); + +const q = process.argv[2]; + +var total = 0; + +for (const f of files) { + try { + const b = fs.readFileSync(`lib/${f}`, 'utf-8'); + if (b.includes(q) || f.includes(q)) { + total ++; + console.log(f); + } + } catch (error) { + + } +} + +console.log(`${total} files in total`); \ No newline at end of file diff --git a/find2.js b/find2.js new file mode 100644 index 0000000..6ff6f5c --- /dev/null +++ b/find2.js @@ -0,0 +1,23 @@ +import fs from 'fs'; + +const files = fs.readdirSync('assets/l10n/', { + recursive: true +}); + +const q = process.argv[2]; + +var total = 0; + +for (const f of files) { + try { + const b = fs.readFileSync(`assets/l10n/${f}`, 'utf-8'); + if (b.includes(q) || f.includes(q)) { + total ++; + console.log(f); + } + } catch (error) { + + } +} + +console.log(`${total} files in total`); \ No newline at end of file diff --git a/integration_test/.gitignore b/integration_test/.gitignore new file mode 100644 index 0000000..3284fe0 --- /dev/null +++ b/integration_test/.gitignore @@ -0,0 +1,6 @@ +synapse/data/homeserver.db +dendrite/data/server.* +dendrite/data/matrix_key.pem +dendrite/data/logs +dendrite/data/jetstream +dendrite/data/*.db \ No newline at end of file diff --git a/integration_test/app_test.dart b/integration_test/app_test.dart new file mode 100644 index 0000000..90f4230 --- /dev/null +++ b/integration_test/app_test.dart @@ -0,0 +1,193 @@ +import 'package:fluffychat/config/setting_keys.dart'; +import 'package:fluffychat/pages/chat/chat_view.dart'; +import 'package:fluffychat/pages/chat_list/chat_list_body.dart'; +import 'package:fluffychat/pages/chat_list/search_title.dart'; +import 'package:fluffychat/pages/invitation_selection/invitation_selection_view.dart'; + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:hive_flutter/hive_flutter.dart'; +import 'package:integration_test/integration_test.dart'; + +import 'package:fluffychat/main.dart' as app; +import 'package:shared_preferences/shared_preferences.dart'; + +import 'extensions/default_flows.dart'; +import 'extensions/wait_for.dart'; +import 'users.dart'; + +void main() { + IntegrationTestWidgetsFlutterBinding.ensureInitialized(); + + group( + 'Integration Test', + () { + setUpAll( + () async { + // this random dialog popping up is super hard to cover in tests + SharedPreferences.setMockInitialValues({ + SettingKeys.showNoGoogle: false, + }); + try { + Hive.deleteFromDisk(); + Hive.initFlutter(); + } catch (_) {} + }, + ); + + testWidgets( + 'Start app, login and logout', + (WidgetTester tester) async { + app.main(); + await tester.ensureAppStartedHomescreen(); + await tester.ensureLoggedOut(); + }, + ); + + testWidgets( + 'Login again', + (WidgetTester tester) async { + app.main(); + await tester.ensureAppStartedHomescreen(); + }, + ); + + testWidgets( + 'Start chat and send message', + (WidgetTester tester) async { + app.main(); + await tester.ensureAppStartedHomescreen(); + await tester.waitFor(find.byType(TextField)); + await tester.enterText(find.byType(TextField), Users.user2.name); + await tester.pumpAndSettle(); + + await tester.scrollUntilVisible( + find.text('Chats').first, + 500, + scrollable: find + .descendant( + of: find.byType(ChatListViewBody), + matching: find.byType(Scrollable), + ) + .first, + ); + await tester.pumpAndSettle(); + await tester.tap(find.text('Chats')); + await tester.pumpAndSettle(); + await tester.waitFor(find.byType(SearchTitle)); + await tester.pumpAndSettle(); + + await tester.scrollUntilVisible( + find.text(Users.user2.name).first, + 500, + scrollable: find + .descendant( + of: find.byType(ChatListViewBody), + matching: find.byType(Scrollable), + ) + .first, + ); + await tester.pumpAndSettle(); + await tester.tap(find.text(Users.user2.name).first); + + try { + await tester.waitFor( + find.byType(ChatView), + timeout: const Duration(seconds: 5), + ); + } catch (_) { + // in case the homeserver sends the username as search result + if (find.byIcon(Icons.send_outlined).evaluate().isNotEmpty) { + await tester.tap(find.byIcon(Icons.send_outlined)); + await tester.pumpAndSettle(); + } + } + + await tester.waitFor(find.byType(ChatView)); + await tester.enterText(find.byType(TextField).last, 'Test'); + await tester.pumpAndSettle(); + try { + await tester.waitFor(find.byIcon(Icons.send_outlined)); + await tester.tap(find.byIcon(Icons.send_outlined)); + } catch (_) { + await tester.testTextInput.receiveAction(TextInputAction.done); + } + await tester.pumpAndSettle(); + await tester.waitFor(find.text('Test')); + await tester.pumpAndSettle(); + }, + ); + + testWidgets('Spaces', (tester) async { + app.main(); + await tester.ensureAppStartedHomescreen(); + + await tester.waitFor(find.byTooltip('Show menu')); + await tester.tap(find.byTooltip('Show menu')); + await tester.pumpAndSettle(); + + await tester.waitFor(find.byIcon(Icons.workspaces_outlined)); + await tester.tap(find.byIcon(Icons.workspaces_outlined)); + await tester.pumpAndSettle(); + + await tester.waitFor(find.byType(TextField)); + await tester.enterText(find.byType(TextField).last, 'Test Space'); + await tester.pumpAndSettle(); + + await tester.testTextInput.receiveAction(TextInputAction.done); + await tester.pumpAndSettle(); + + await tester.waitFor(find.text('Invite contact')); + + await tester.tap(find.text('Invite contact')); + await tester.pumpAndSettle(); + + await tester.waitFor( + find.descendant( + of: find.byType(InvitationSelectionView), + matching: find.byType(TextField), + ), + ); + await tester.enterText( + find.descendant( + of: find.byType(InvitationSelectionView), + matching: find.byType(TextField), + ), + Users.user2.name, + ); + + await Future.delayed(const Duration(milliseconds: 250)); + await tester.testTextInput.receiveAction(TextInputAction.done); + + await Future.delayed(const Duration(milliseconds: 1000)); + await tester.pumpAndSettle(); + + await tester.tap( + find + .descendant( + of: find.descendant( + of: find.byType(InvitationSelectionView), + matching: find.byType(ListTile), + ), + matching: find.text(Users.user2.name), + ) + .last, + ); + await tester.pumpAndSettle(); + + await tester.waitFor(find.maybeUppercaseText('Yes')); + await tester.tap(find.maybeUppercaseText('Yes')); + await tester.pumpAndSettle(); + + await tester.tap(find.byTooltip('Back')); + await tester.pumpAndSettle(); + + await tester.waitFor(find.text('Load 2 more participants')); + await tester.tap(find.text('Load 2 more participants')); + await tester.pumpAndSettle(); + + expect(find.text(Users.user2.name), findsOneWidget); + }); + }, + ); +} diff --git a/integration_test/dendrite/data/dendrite.yaml b/integration_test/dendrite/data/dendrite.yaml new file mode 100644 index 0000000..f1e95fd --- /dev/null +++ b/integration_test/dendrite/data/dendrite.yaml @@ -0,0 +1,327 @@ +# This is the Dendrite configuration file. +# +# The configuration is split up into sections - each Dendrite component has a +# configuration section, in addition to the "global" section which applies to +# all components. + +# The version of the configuration file. +version: 2 + +# Global Matrix configuration. This configuration applies to all components. +global: + # The domain name of this homeserver. + server_name: localhost + + # The path to the signing private key file, used to sign requests and events. + # Note that this is NOT the same private key as used for TLS! To generate a + # signing key, use "./bin/generate-keys --private-key matrix_key.pem". + private_key: matrix_key.pem + + # The paths and expiry timestamps (as a UNIX timestamp in millisecond precision) + # to old signing private keys that were formerly in use on this domain. These + # keys will not be used for federation request or event signing, but will be + # provided to any other homeserver that asks when trying to verify old events. + old_private_keys: + # - private_key: old_matrix_key.pem + # expired_at: 1601024554498 + + # How long a remote server can cache our server signing key before requesting it + # again. Increasing this number will reduce the number of requests made by other + # servers for our key but increases the period that a compromised key will be + # considered valid by other homeservers. + key_validity_period: 168h0m0s + + # Global database connection pool, for PostgreSQL monolith deployments only. If + # this section is populated then you can omit the "database" blocks in all other + # sections. For polylith deployments, or monolith deployments using SQLite databases, + # you must configure the "database" block for each component instead. + database: + connection_string: + max_open_conns: + max_idle_conns: + conn_max_lifetime: + + # Configuration for in-memory caches. Caches can often improve performance by + # keeping frequently accessed items (like events, identifiers etc.) in memory + # rather than having to read them from the database. + cache: + # The estimated maximum size for the global cache in bytes, or in terabytes, + # gigabytes, megabytes or kilobytes when the appropriate 'tb', 'gb', 'mb' or + # 'kb' suffix is specified. Note that this is not a hard limit, nor is it a + # memory limit for the entire process. A cache that is too small may ultimately + # provide little or no benefit. + max_size_estimated: 1gb + + # The maximum amount of time that a cache entry can live for in memory before + # it will be evicted and/or refreshed from the database. Lower values result in + # easier admission of new cache entries but may also increase database load in + # comparison to higher values, so adjust conservatively. Higher values may make + # it harder for new items to make it into the cache, e.g. if new rooms suddenly + # become popular. + max_age: 1h + + # The server name to delegate server-server communications to, with optional port + # e.g. localhost:443 + well_known_server_name: "" + + # Lists of domains that the server will trust as identity servers to verify third + # party identifiers such as phone numbers and email addresses. + trusted_third_party_id_servers: + - matrix.org + - vector.im + + # Disables federation. Dendrite will not be able to communicate with other servers + # in the Matrix federation and the federation API will not be exposed. + disable_federation: false + + # Configures the handling of presence events. Inbound controls whether we receive + # presence events from other servers, outbound controls whether we send presence + # events for our local users to other servers. + presence: + enable_inbound: false + enable_outbound: false + + # Configures phone-home statistics reporting. These statistics contain the server + # name, number of active users and some information on your deployment config. + # We use this information to understand how Dendrite is being used in the wild. + report_stats: + enabled: false + endpoint: https://matrix.org/report-usage-stats/push + + # Server notices allows server admins to send messages to all users on the server. + server_notices: + enabled: false + # The local part, display name and avatar URL (as a mxc:// URL) for the user that + # will send the server notices. These are visible to all users on the deployment. + local_part: "_server" + display_name: "Server Alerts" + avatar_url: "" + # The room name to be used when sending server notices. This room name will + # appear in user clients. + room_name: "Server Alerts" + + # Configuration for NATS JetStream + jetstream: + # A list of NATS Server addresses to connect to. If none are specified, an + # internal NATS server will be started automatically when running Dendrite in + # monolith mode. For polylith deployments, it is required to specify the address + # of at least one NATS Server node. + addresses: + # - localhost:4222 + + # Persistent directory to store JetStream streams in. This directory should be + # preserved across Dendrite restarts. + storage_path: ./ + + # The prefix to use for stream names for this homeserver - really only useful + # if you are running more than one Dendrite server on the same NATS deployment. + topic_prefix: Dendrite + + # Configuration for Prometheus metric collection. + metrics: + enabled: false + basic_auth: + username: metrics + password: metrics + + # Optional DNS cache. The DNS cache may reduce the load on DNS servers if there + # is no local caching resolver available for use. + dns_cache: + enabled: false + cache_size: 256 + cache_lifetime: "5m" # 5 minutes; https://pkg.go.dev/time@master#ParseDuration + +# Configuration for the Appservice API. +app_service_api: + database: + connection_string: file:app_service_api.db + + # Disable the validation of TLS certificates of appservices. This is + # not recommended in production since it may allow appservice traffic + # to be sent to an insecure endpoint. + disable_tls_validation: true + + # Appservice configuration files to load into this homeserver. + config_files: + # - /path/to/appservice_registration.yaml + +# Configuration for the Client API. +client_api: + # Prevents new users from being able to register on this homeserver, except when + # using the registration shared secret below. + registration_disabled: false + + # Prevents new guest accounts from being created. Guest registration is also + # disabled implicitly by setting 'registration_disabled' above. + guests_disabled: true + + # If set, allows registration by anyone who knows the shared secret, regardless + # of whether registration is otherwise disabled. + registration_shared_secret: "" + + # Whether to require reCAPTCHA for registration. If you have enabled registration + # then this is HIGHLY RECOMMENDED to reduce the risk of your homeserver being used + # for coordinated spam attacks. + enable_registration_captcha: false + + # Settings for ReCAPTCHA. + recaptcha_public_key: "" + recaptcha_private_key: "" + recaptcha_bypass_secret: "" + recaptcha_siteverify_api: "" + + # TURN server information that this homeserver should send to clients. + turn: + turn_user_lifetime: "" + turn_uris: + # - turn:turn.server.org?transport=udp + # - turn:turn.server.org?transport=tcp + turn_shared_secret: "" + turn_username: "" + turn_password: "" + + # Settings for rate-limited endpoints. Rate limiting kicks in after the threshold + # number of "slots" have been taken by requests from a specific host. Each "slot" + # will be released after the cooloff time in milliseconds. Server administrators + # and appservice users are exempt from rate limiting by default. + rate_limiting: + enabled: true + threshold: 5 + cooloff_ms: 500 + exempt_user_ids: + # - "@user:domain.com" + +# Configuration for the Federation API. +federation_api: + database: + connection_string: file:federation_api.db + + # How many times we will try to resend a failed transaction to a specific server. The + # backoff is 2**x seconds, so 1 = 2 seconds, 2 = 4 seconds, 3 = 8 seconds etc. Once + # the max retries are exceeded, Dendrite will no longer try to send transactions to + # that server until it comes back to life and connects to us again. + send_max_retries: 16 + + # Disable the validation of TLS certificates of remote federated homeservers. Do not + # enable this option in production as it presents a security risk! + disable_tls_validation: false + + # Perspective keyservers to use as a backup when direct key fetches fail. This may + # be required to satisfy key requests for servers that are no longer online when + # joining some rooms. + key_perspectives: + - server_name: matrix.org + keys: + - key_id: ed25519:auto + public_key: Noi6WqcDj0QmPxCNQqgezwTlBKrfqehY1u2FyWP9uYw + - key_id: ed25519:a_RXGa + public_key: l8Hft5qXKn1vfHrg3p4+W8gELQVo8N13JkluMfmn2sQ + + # This option will control whether Dendrite will prefer to look up keys directly + # or whether it should try perspective servers first, using direct fetches as a + # last resort. + prefer_direct_fetch: false + +# Configuration for the Media API. +media_api: + database: + connection_string: file:media_api.db + + # Storage path for uploaded media. May be relative or absolute. + base_path: ./media_store + + # The maximum allowed file size (in bytes) for media uploads to this homeserver + # (0 = unlimited). If using a reverse proxy, ensure it allows requests at least + #this large (e.g. the client_max_body_size setting in nginx). + max_file_size_bytes: 10485760 + + # Whether to dynamically generate thumbnails if needed. + dynamic_thumbnails: false + + # The maximum number of simultaneous thumbnail generators to run. + max_thumbnail_generators: 10 + + # A list of thumbnail sizes to be generated for media content. + thumbnail_sizes: + - width: 32 + height: 32 + method: crop + - width: 96 + height: 96 + method: crop + - width: 640 + height: 480 + method: scale + +# Configuration for enabling experimental MSCs on this homeserver. +mscs: + database: + connection_string: file:mscs.db + mscs: + # - msc2836 # (Threading, see https://github.com/matrix-org/matrix-doc/pull/2836) + # - msc2946 # (Spaces Summary, see https://github.com/matrix-org/matrix-doc/pull/2946) + +# Configuration for the Sync API. +sync_api: + # This option controls which HTTP header to inspect to find the real remote IP + # address of the client. This is likely required if Dendrite is running behind + # a reverse proxy server. + # real_ip_header: X-Real-IP + database: + connection_string: file:sync_api.db + +key_server: + database: + connection_string: file:key_server.db + +room_server: + database: + connection_string: file:room_server.db + + +# Configuration for the User API. +user_api: + account_database: + connection_string: file:user_api.db + + # The cost when hashing passwords on registration/login. Default: 10. Min: 4, Max: 31 + # See https://pkg.go.dev/golang.org/x/crypto/bcrypt for more information. + # Setting this lower makes registration/login consume less CPU resources at the cost + # of security should the database be compromised. Setting this higher makes registration/login + # consume more CPU resources but makes it harder to brute force password hashes. This value + # can be lowered if performing tests or on embedded Dendrite instances (e.g WASM builds). + bcrypt_cost: 10 + + # The length of time that a token issued for a relying party from + # /_matrix/client/r0/user/{userId}/openid/request_token endpoint + # is considered to be valid in milliseconds. + # The default lifetime is 3600000ms (60 minutes). + # openid_token_lifetime_ms: 3600000 + +# Configuration for Opentracing. +# See https://github.com/matrix-org/dendrite/tree/master/docs/tracing for information on +# how this works and how to set it up. +tracing: + enabled: false + jaeger: + serviceName: "" + disabled: false + rpc_metrics: false + tags: [] + sampler: null + reporter: null + headers: null + baggage_restrictions: null + throttler: null + +# Logging configuration. The "std" logging type controls the logs being sent to +# stdout. The "file" logging type controls logs being written to a log folder on +# the disk. Supported log levels are "debug", "info", "warn", "error". +logging: + - type: std + level: info + - type: file + level: info + params: + path: ./logs + diff --git a/integration_test/extensions/default_flows.dart b/integration_test/extensions/default_flows.dart new file mode 100644 index 0000000..6609969 --- /dev/null +++ b/integration_test/extensions/default_flows.dart @@ -0,0 +1,171 @@ +import 'dart:developer'; + +import 'package:fluffychat/pages/chat_list/chat_list_body.dart'; +import 'package:fluffychat/pages/homeserver_picker/homeserver_picker.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import '../users.dart'; +import 'wait_for.dart'; + +extension DefaultFlowExtensions on WidgetTester { + Future login() async { + final tester = this; + + await tester.pumpAndSettle(); + + await tester.waitFor(find.text('Let\'s start')); + + expect(find.text('Let\'s start'), findsOneWidget); + + final input = find.byType(TextField); + + expect(input, findsOneWidget); + + // getting the placeholder in place + await tester.tap(find.byIcon(Icons.search)); + await tester.pumpAndSettle(); + await tester.enterText(input, homeserver); + await tester.pumpAndSettle(); + await tester.testTextInput.receiveAction(TextInputAction.done); + await tester.pumpAndSettle(); + + // in case registration is allowed + // try { + await Future.delayed(const Duration(milliseconds: 50)); + + await tester.scrollUntilVisible( + find.text('Login'), + 500, + scrollable: find.descendant( + of: find.byKey(const Key('ConnectPageListView')), + matching: find.byType(Scrollable).first, + ), + ); + await tester.pumpAndSettle(); + + await tester.tap(find.text('Login')); + await tester.pumpAndSettle(); + /*} catch (e) { + log('Registration is not allowed. Proceeding with login...'); + }*/ + await tester.pumpAndSettle(); + + await Future.delayed(const Duration(milliseconds: 50)); + + final inputs = find.byType(TextField); + + await tester.enterText(inputs.first, Users.user1.name); + await tester.enterText(inputs.last, Users.user1.password); + await tester.pumpAndSettle(); + await tester.testTextInput.receiveAction(TextInputAction.done); + + try { + // pumpAndSettle does not work in here as setState is called + // asynchronously + await tester.waitFor( + find.byType(LinearProgressIndicator), + timeout: const Duration(milliseconds: 1500), + skipPumpAndSettle: true, + ); + } catch (_) { + // in case the input action does not work on the desired platform + if (find.text('Login').evaluate().isNotEmpty) { + await tester.tap(find.text('Login')); + } + } + + try { + await tester.pumpAndSettle(); + } catch (_) { + // may fail because of ongoing animation below dialog + } + + await tester.waitFor( + find.byType(ChatListViewBody), + skipPumpAndSettle: true, + ); + } + + /// ensure PushProvider check passes + Future acceptPushWarning() async { + final tester = this; + + final matcher = find.maybeUppercaseText('Do not show again'); + + try { + await tester.waitFor(matcher, timeout: const Duration(seconds: 5)); + + // the FCM push error dialog to be handled... + await tester.tap(matcher); + await tester.pumpAndSettle(); + } catch (_) {} + } + + Future ensureLoggedOut() async { + final tester = this; + await tester.pumpAndSettle(); + if (find.byType(ChatListViewBody).evaluate().isNotEmpty) { + await tester.tap(find.byTooltip('Show menu')); + await tester.pumpAndSettle(); + await tester.tap(find.text('Settings')); + await tester.pumpAndSettle(); + await tester.scrollUntilVisible( + find.text('Account'), + 500, + scrollable: find.descendant( + of: find.byKey(const Key('SettingsListViewContent')), + matching: find.byType(Scrollable), + ), + ); + await tester.pumpAndSettle(); + await tester.tap(find.text('Logout')); + await tester.pumpAndSettle(); + await tester.tap(find.maybeUppercaseText('Yes')); + await tester.pumpAndSettle(); + } + } + + Future ensureAppStartedHomescreen({ + Duration timeout = const Duration(seconds: 20), + }) async { + final tester = this; + await tester.pumpAndSettle(); + + final homeserverPickerFinder = find.byType(HomeserverPicker); + final chatListFinder = find.byType(ChatListViewBody); + + final end = DateTime.now().add(timeout); + + log( + 'Waiting for HomeserverPicker or ChatListViewBody...', + name: 'Test Runner', + ); + do { + if (DateTime.now().isAfter(end)) { + throw Exception( + 'Timed out waiting for HomeserverPicker or ChatListViewBody', + ); + } + + await pumpAndSettle(); + await Future.delayed(const Duration(milliseconds: 100)); + } while (homeserverPickerFinder.evaluate().isEmpty && + chatListFinder.evaluate().isEmpty); + + if (homeserverPickerFinder.evaluate().isNotEmpty) { + log( + 'Found HomeserverPicker, performing login.', + name: 'Test Runner', + ); + await tester.login(); + } else { + log( + 'Found ChatListViewBody, skipping login.', + name: 'Test Runner', + ); + } + + await tester.acceptPushWarning(); + } +} diff --git a/integration_test/extensions/wait_for.dart b/integration_test/extensions/wait_for.dart new file mode 100644 index 0000000..cfd9d64 --- /dev/null +++ b/integration_test/extensions/wait_for.dart @@ -0,0 +1,49 @@ +import 'package:flutter_test/flutter_test.dart'; + +/// Workaround for https://github.com/flutter/flutter/issues/88765 +extension WaitForExtension on WidgetTester { + Future waitFor( + Finder finder, { + Duration timeout = const Duration(seconds: 20), + bool skipPumpAndSettle = false, + }) async { + final end = DateTime.now().add(timeout); + + do { + if (DateTime.now().isAfter(end)) { + throw Exception('Timed out waiting for $finder'); + } + + if (!skipPumpAndSettle) { + await pumpAndSettle(); + } + await Future.delayed(const Duration(milliseconds: 100)); + } while (finder.evaluate().isEmpty); + } +} + +extension MaybeUppercaseFinder on CommonFinders { + /// On Android some button labels are in uppercase while on iOS they + /// are not. This method tries both. + Finder maybeUppercaseText( + String text, { + bool findRichText = false, + bool skipOffstage = true, + }) { + try { + final finder = find.text( + text.toUpperCase(), + findRichText: findRichText, + skipOffstage: skipOffstage, + ); + expect(finder, findsOneWidget); + return finder; + } catch (_) { + return find.text( + text, + findRichText: findRichText, + skipOffstage: skipOffstage, + ); + } + } +} diff --git a/integration_test/synapse/data/homeserver.yaml b/integration_test/synapse/data/homeserver.yaml new file mode 100644 index 0000000..b6963fd --- /dev/null +++ b/integration_test/synapse/data/homeserver.yaml @@ -0,0 +1,2781 @@ +# Configuration file for Synapse. +# +# This is a YAML file: see [1] for a quick introduction. Note in particular +# that *indentation is important*: all the elements of a list or dictionary +# should have the same indentation. +# +# [1] https://docs.ansible.com/ansible/latest/reference_appendices/YAMLSyntax.html + + +## Modules ## + +# Server admins can expand Synapse's functionality with external modules. +# +# See https://matrix-org.github.io/synapse/latest/modules/index.html for more +# documentation on how to configure or create custom modules for Synapse. +# +modules: + #- module: my_super_module.MySuperClass + # config: + # do_thing: true + #- module: my_other_super_module.SomeClass + # config: {} + + +## Server ## + +# The public-facing domain of the server +# +# The server_name name will appear at the end of usernames and room addresses +# created on this server. For example if the server_name was example.com, +# usernames on this server would be in the format @user:example.com +# +# In most cases you should avoid using a matrix specific subdomain such as +# matrix.example.com or synapse.example.com as the server_name for the same +# reasons you wouldn't use user@email.example.com as your email address. +# See https://matrix-org.github.io/synapse/latest/delegate.html +# for information on how to host Synapse on a subdomain while preserving +# a clean server_name. +# +# The server_name cannot be changed later so it is important to +# configure this correctly before you start Synapse. It should be all +# lowercase and may contain an explicit port. +# Examples: matrix.org, localhost:8080 +# +server_name: "localhost" + +# When running as a daemon, the file to store the pid in +# +pid_file: /data/homeserver.pid + +# The absolute URL to the web client which / will redirect to. +# +#web_client_location: https://riot.example.com/ + +# The public-facing base URL that clients use to access this Homeserver (not +# including _matrix/...). This is the same URL a user might enter into the +# 'Custom Homeserver URL' field on their client. If you use Synapse with a +# reverse proxy, this should be the URL to reach Synapse via the proxy. +# Otherwise, it should be the URL to reach Synapse's client HTTP listener (see +# 'listeners' below). +# +# Defaults to 'https:///'. +# +#public_baseurl: https://example.com/ + +# Uncomment the following to tell other servers to send federation traffic on +# port 443. +# +# By default, other servers will try to reach our server on port 8448, which can +# be inconvenient in some environments. +# +# Provided 'https:///' on port 443 is routed to Synapse, this +# option configures Synapse to serve a file at +# 'https:///.well-known/matrix/server'. This will tell other +# servers to send traffic to port 443 instead. +# +# See https://matrix-org.github.io/synapse/latest/delegate.html for more +# information. +# +# Defaults to 'false'. +# +#serve_server_wellknown: true + +# Set the soft limit on the number of file descriptors synapse can use +# Zero is used to indicate synapse should set the soft limit to the +# hard limit. +# +#soft_file_limit: 0 + +# Presence tracking allows users to see the state (e.g online/offline) +# of other local and remote users. +# +presence: + # Uncomment to disable presence tracking on this homeserver. This option + # replaces the previous top-level 'use_presence' option. + # + #enabled: false + +# Whether to require authentication to retrieve profile data (avatars, +# display names) of other users through the client API. Defaults to +# 'false'. Note that profile data is also available via the federation +# API, unless allow_profile_lookup_over_federation is set to false. +# +#require_auth_for_profile_requests: true + +# Uncomment to require a user to share a room with another user in order +# to retrieve their profile information. Only checked on Client-Server +# requests. Profile requests from other servers should be checked by the +# requesting server. Defaults to 'false'. +# +#limit_profile_requests_to_users_who_share_rooms: true + +# Uncomment to prevent a user's profile data from being retrieved and +# displayed in a room until they have joined it. By default, a user's +# profile data is included in an invite event, regardless of the values +# of the above two settings, and whether or not the users share a server. +# Defaults to 'true'. +# +#include_profile_data_on_invite: false + +# If set to 'true', removes the need for authentication to access the server's +# public rooms directory through the client API, meaning that anyone can +# query the room directory. Defaults to 'false'. +# +#allow_public_rooms_without_auth: true + +# If set to 'true', allows any other homeserver to fetch the server's public +# rooms directory via federation. Defaults to 'false'. +# +#allow_public_rooms_over_federation: true + +# The default room version for newly created rooms. +# +# Known room versions are listed here: +# https://spec.matrix.org/latest/rooms/#complete-list-of-room-versions +# +# For example, for room version 1, default_room_version should be set +# to "1". +# +#default_room_version: "9" + +# The GC threshold parameters to pass to `gc.set_threshold`, if defined +# +#gc_thresholds: [700, 10, 10] + +# The minimum time in seconds between each GC for a generation, regardless of +# the GC thresholds. This ensures that we don't do GC too frequently. +# +# A value of `[1s, 10s, 30s]` indicates that a second must pass between consecutive +# generation 0 GCs, etc. +# +# Defaults to `[1s, 10s, 30s]`. +# +#gc_min_interval: [0.5s, 30s, 1m] + +# Set the limit on the returned events in the timeline in the get +# and sync operations. The default value is 100. -1 means no upper limit. +# +# Uncomment the following to increase the limit to 5000. +# +#filter_timeline_limit: 5000 + +# Whether room invites to users on this server should be blocked +# (except those sent by local server admins). The default is False. +# +#block_non_admin_invites: true + +# Room searching +# +# If disabled, new messages will not be indexed for searching and users +# will receive errors when searching for messages. Defaults to enabled. +# +#enable_search: false + +# Prevent outgoing requests from being sent to the following blacklisted IP address +# CIDR ranges. If this option is not specified then it defaults to private IP +# address ranges (see the example below). +# +# The blacklist applies to the outbound requests for federation, identity servers, +# push servers, and for checking key validity for third-party invite events. +# +# (0.0.0.0 and :: are always blacklisted, whether or not they are explicitly +# listed here, since they correspond to unroutable addresses.) +# +# This option replaces federation_ip_range_blacklist in Synapse v1.25.0. +# +# Note: The value is ignored when an HTTP proxy is in use +# +#ip_range_blacklist: +# - '127.0.0.0/8' +# - '10.0.0.0/8' +# - '172.16.0.0/12' +# - '192.168.0.0/16' +# - '100.64.0.0/10' +# - '192.0.0.0/24' +# - '169.254.0.0/16' +# - '192.88.99.0/24' +# - '198.18.0.0/15' +# - '192.0.2.0/24' +# - '198.51.100.0/24' +# - '203.0.113.0/24' +# - '224.0.0.0/4' +# - '::1/128' +# - 'fe80::/10' +# - 'fc00::/7' +# - '2001:db8::/32' +# - 'ff00::/8' +# - 'fec0::/10' + +# List of IP address CIDR ranges that should be allowed for federation, +# identity servers, push servers, and for checking key validity for +# third-party invite events. This is useful for specifying exceptions to +# wide-ranging blacklisted target IP ranges - e.g. for communication with +# a push server only visible in your network. +# +# This whitelist overrides ip_range_blacklist and defaults to an empty +# list. +# +#ip_range_whitelist: +# - '192.168.1.1' + +# List of ports that Synapse should listen on, their purpose and their +# configuration. +# +# Options for each listener include: +# +# port: the TCP port to bind to +# +# bind_addresses: a list of local addresses to listen on. The default is +# 'all local interfaces'. +# +# type: the type of listener. Normally 'http', but other valid options are: +# 'manhole' (see https://matrix-org.github.io/synapse/latest/manhole.html), +# 'metrics' (see https://matrix-org.github.io/synapse/latest/metrics-howto.html), +# 'replication' (see https://matrix-org.github.io/synapse/latest/workers.html). +# +# tls: set to true to enable TLS for this listener. Will use the TLS +# key/cert specified in tls_private_key_path / tls_certificate_path. +# +# x_forwarded: Only valid for an 'http' listener. Set to true to use the +# X-Forwarded-For header as the client IP. Useful when Synapse is +# behind a reverse-proxy. +# +# resources: Only valid for an 'http' listener. A list of resources to host +# on this port. Options for each resource are: +# +# names: a list of names of HTTP resources. See below for a list of +# valid resource names. +# +# compress: set to true to enable HTTP compression for this resource. +# +# additional_resources: Only valid for an 'http' listener. A map of +# additional endpoints which should be loaded via dynamic modules. +# +# Valid resource names are: +# +# client: the client-server API (/_matrix/client), and the synapse admin +# API (/_synapse/admin). Also implies 'media' and 'static'. +# +# consent: user consent forms (/_matrix/consent). +# See https://matrix-org.github.io/synapse/latest/consent_tracking.html. +# +# federation: the server-server API (/_matrix/federation). Also implies +# 'media', 'keys', 'openid' +# +# keys: the key discovery API (/_matrix/keys). +# +# media: the media API (/_matrix/media). +# +# metrics: the metrics interface. +# See https://matrix-org.github.io/synapse/latest/metrics-howto.html. +# +# openid: OpenID authentication. +# +# replication: the HTTP replication API (/_synapse/replication). +# See https://matrix-org.github.io/synapse/latest/workers.html. +# +# static: static resources under synapse/static (/_matrix/static). (Mostly +# useful for 'fallback authentication'.) +# +listeners: + # TLS-enabled listener: for when matrix traffic is sent directly to synapse. + # + # Disabled by default. To enable it, uncomment the following. (Note that you + # will also need to give Synapse a TLS key and certificate: see the TLS section + # below.) + # + #- port: 8448 + # type: http + # tls: true + # resources: + # - names: [client, federation] + + # Unsecure HTTP listener: for when matrix traffic passes through a reverse proxy + # that unwraps TLS. + # + # If you plan to use a reverse proxy, please see + # https://matrix-org.github.io/synapse/latest/reverse_proxy.html. + # + - port: 80 + tls: false + type: http + x_forwarded: false + + resources: + - names: [client, federation] + compress: false + + # example additional_resources: + # + #additional_resources: + # "/_matrix/my/custom/endpoint": + # module: my_module.CustomRequestHandler + # config: {} + + # Turn on the twisted ssh manhole service on localhost on the given + # port. + # + #- port: 9000 + # bind_addresses: ['::1', '127.0.0.1'] + # type: manhole + +# Connection settings for the manhole +# +manhole_settings: + # The username for the manhole. This defaults to 'matrix'. + # + #username: manhole + + # The password for the manhole. This defaults to 'rabbithole'. + # + #password: mypassword + + # The private and public SSH key pair used to encrypt the manhole traffic. + # If these are left unset, then hardcoded and non-secret keys are used, + # which could allow traffic to be intercepted if sent over a public network. + # + #ssh_priv_key_path: /data/id_rsa + #ssh_pub_key_path: /data/id_rsa.pub + +# Forward extremities can build up in a room due to networking delays between +# homeservers. Once this happens in a large room, calculation of the state of +# that room can become quite expensive. To mitigate this, once the number of +# forward extremities reaches a given threshold, Synapse will send an +# org.matrix.dummy_event event, which will reduce the forward extremities +# in the room. +# +# This setting defines the threshold (i.e. number of forward extremities in the +# room) at which dummy events are sent. The default value is 10. +# +#dummy_events_threshold: 5 + + +## Homeserver blocking ## + +# How to reach the server admin, used in ResourceLimitError +# +#admin_contact: 'mailto:admin@server.com' + +# Global blocking +# +#hs_disabled: false +#hs_disabled_message: 'Human readable reason for why the HS is blocked' + +# Monthly Active User Blocking +# +# Used in cases where the admin or server owner wants to limit to the +# number of monthly active users. +# +# 'limit_usage_by_mau' disables/enables monthly active user blocking. When +# enabled and a limit is reached the server returns a 'ResourceLimitError' +# with error type Codes.RESOURCE_LIMIT_EXCEEDED +# +# 'max_mau_value' is the hard limit of monthly active users above which +# the server will start blocking user actions. +# +# 'mau_trial_days' is a means to add a grace period for active users. It +# means that users must be active for this number of days before they +# can be considered active and guards against the case where lots of users +# sign up in a short space of time never to return after their initial +# session. +# +# The option `mau_appservice_trial_days` is similar to `mau_trial_days`, but +# applies a different trial number if the user was registered by an appservice. +# A value of 0 means no trial days are applied. Appservices not listed in this +# dictionary use the value of `mau_trial_days` instead. +# +# 'mau_limit_alerting' is a means of limiting client side alerting +# should the mau limit be reached. This is useful for small instances +# where the admin has 5 mau seats (say) for 5 specific people and no +# interest increasing the mau limit further. Defaults to True, which +# means that alerting is enabled +# +#limit_usage_by_mau: false +#max_mau_value: 50 +#mau_trial_days: 2 +#mau_limit_alerting: false +#mau_appservice_trial_days: +# "appservice-id": 1 + +# If enabled, the metrics for the number of monthly active users will +# be populated, however no one will be limited. If limit_usage_by_mau +# is true, this is implied to be true. +# +#mau_stats_only: false + +# Sometimes the server admin will want to ensure certain accounts are +# never blocked by mau checking. These accounts are specified here. +# +#mau_limit_reserved_threepids: +# - medium: 'email' +# address: 'reserved_user@example.com' + +# Used by phonehome stats to group together related servers. +#server_context: context + +# Resource-constrained homeserver settings +# +# When this is enabled, the room "complexity" will be checked before a user +# joins a new remote room. If it is above the complexity limit, the server will +# disallow joining, or will instantly leave. +# +# Room complexity is an arbitrary measure based on factors such as the number of +# users in the room. +# +limit_remote_rooms: + # Uncomment to enable room complexity checking. + # + #enabled: true + + # the limit above which rooms cannot be joined. The default is 1.0. + # + #complexity: 0.5 + + # override the error which is returned when the room is too complex. + # + #complexity_error: "This room is too complex." + + # allow server admins to join complex rooms. Default is false. + # + #admins_can_join: true + +# Whether to require a user to be in the room to add an alias to it. +# Defaults to 'true'. +# +#require_membership_for_aliases: false + +# Whether to allow per-room membership profiles through the send of membership +# events with profile information that differ from the target's global profile. +# Defaults to 'true'. +# +#allow_per_room_profiles: false + +# The largest allowed file size for a user avatar. Defaults to no restriction. +# +# Note that user avatar changes will not work if this is set without +# using Synapse's media repository. +# +#max_avatar_size: 10M + +# The MIME types allowed for user avatars. Defaults to no restriction. +# +# Note that user avatar changes will not work if this is set without +# using Synapse's media repository. +# +#allowed_avatar_mimetypes: ["image/png", "image/jpeg", "image/gif"] + +# How long to keep redacted events in unredacted form in the database. After +# this period redacted events get replaced with their redacted form in the DB. +# +# Defaults to `7d`. Set to `null` to disable. +# +#redaction_retention_period: 28d + +# How long to track users' last seen time and IPs in the database. +# +# Defaults to `28d`. Set to `null` to disable clearing out of old rows. +# +#user_ips_max_age: 14d + +# Inhibits the /requestToken endpoints from returning an error that might leak +# information about whether an e-mail address is in use or not on this +# homeserver. +# Note that for some endpoints the error situation is the e-mail already being +# used, and for others the error is entering the e-mail being unused. +# If this option is enabled, instead of returning an error, these endpoints will +# act as if no error happened and return a fake session ID ('sid') to clients. +# +#request_token_inhibit_3pid_errors: true + +# A list of domains that the domain portion of 'next_link' parameters +# must match. +# +# This parameter is optionally provided by clients while requesting +# validation of an email or phone number, and maps to a link that +# users will be automatically redirected to after validation +# succeeds. Clients can make use this parameter to aid the validation +# process. +# +# The whitelist is applied whether the homeserver or an +# identity server is handling validation. +# +# The default value is no whitelist functionality; all domains are +# allowed. Setting this value to an empty list will instead disallow +# all domains. +# +#next_link_domain_whitelist: ["matrix.org"] + +# Templates to use when generating email or HTML page contents. +# +templates: + # Directory in which Synapse will try to find template files to use to generate + # email or HTML page contents. + # If not set, or a file is not found within the template directory, a default + # template from within the Synapse package will be used. + # + # See https://matrix-org.github.io/synapse/latest/templates.html for more + # information about using custom templates. + # + #custom_template_directory: /path/to/custom/templates/ + +# List of rooms to exclude from sync responses. This is useful for server +# administrators wishing to group users into a room without these users being able +# to see it from their client. +# +# By default, no room is excluded. +# +#exclude_rooms_from_sync: +# - !foo:example.com + + +# Message retention policy at the server level. +# +# Room admins and mods can define a retention period for their rooms using the +# 'm.room.retention' state event, and server admins can cap this period by setting +# the 'allowed_lifetime_min' and 'allowed_lifetime_max' config options. +# +# If this feature is enabled, Synapse will regularly look for and purge events +# which are older than the room's maximum retention period. Synapse will also +# filter events received over federation so that events that should have been +# purged are ignored and not stored again. +# +retention: + # The message retention policies feature is disabled by default. Uncomment the + # following line to enable it. + # + #enabled: true + + # Default retention policy. If set, Synapse will apply it to rooms that lack the + # 'm.room.retention' state event. Currently, the value of 'min_lifetime' doesn't + # matter much because Synapse doesn't take it into account yet. + # + #default_policy: + # min_lifetime: 1d + # max_lifetime: 1y + + # Retention policy limits. If set, and the state of a room contains a + # 'm.room.retention' event in its state which contains a 'min_lifetime' or a + # 'max_lifetime' that's out of these bounds, Synapse will cap the room's policy + # to these limits when running purge jobs. + # + #allowed_lifetime_min: 1d + #allowed_lifetime_max: 1y + + # Server admins can define the settings of the background jobs purging the + # events which lifetime has expired under the 'purge_jobs' section. + # + # If no configuration is provided, a single job will be set up to delete expired + # events in every room daily. + # + # Each job's configuration defines which range of message lifetimes the job + # takes care of. For example, if 'shortest_max_lifetime' is '2d' and + # 'longest_max_lifetime' is '3d', the job will handle purging expired events in + # rooms whose state defines a 'max_lifetime' that's both higher than 2 days, and + # lower than or equal to 3 days. Both the minimum and the maximum value of a + # range are optional, e.g. a job with no 'shortest_max_lifetime' and a + # 'longest_max_lifetime' of '3d' will handle every room with a retention policy + # which 'max_lifetime' is lower than or equal to three days. + # + # The rationale for this per-job configuration is that some rooms might have a + # retention policy with a low 'max_lifetime', where history needs to be purged + # of outdated messages on a more frequent basis than for the rest of the rooms + # (e.g. every 12h), but not want that purge to be performed by a job that's + # iterating over every room it knows, which could be heavy on the server. + # + # If any purge job is configured, it is strongly recommended to have at least + # a single job with neither 'shortest_max_lifetime' nor 'longest_max_lifetime' + # set, or one job without 'shortest_max_lifetime' and one job without + # 'longest_max_lifetime' set. Otherwise some rooms might be ignored, even if + # 'allowed_lifetime_min' and 'allowed_lifetime_max' are set, because capping a + # room's policy to these values is done after the policies are retrieved from + # Synapse's database (which is done using the range specified in a purge job's + # configuration). + # + #purge_jobs: + # - longest_max_lifetime: 3d + # interval: 12h + # - shortest_max_lifetime: 3d + # interval: 1d + + +## TLS ## + +# PEM-encoded X509 certificate for TLS. +# This certificate, as of Synapse 1.0, will need to be a valid and verifiable +# certificate, signed by a recognised Certificate Authority. +# +# Be sure to use a `.pem` file that includes the full certificate chain including +# any intermediate certificates (for instance, if using certbot, use +# `fullchain.pem` as your certificate, not `cert.pem`). +# +#tls_certificate_path: "/data/localhost.tls.crt" + +# PEM-encoded private key for TLS +# +#tls_private_key_path: "/data/localhost.tls.key" + +# Whether to verify TLS server certificates for outbound federation requests. +# +# Defaults to `true`. To disable certificate verification, uncomment the +# following line. +# +#federation_verify_certificates: false + +# The minimum TLS version that will be used for outbound federation requests. +# +# Defaults to `1`. Configurable to `1`, `1.1`, `1.2`, or `1.3`. Note +# that setting this value higher than `1.2` will prevent federation to most +# of the public Matrix network: only configure it to `1.3` if you have an +# entirely private federation setup and you can ensure TLS 1.3 support. +# +#federation_client_minimum_tls_version: 1.2 + +# Skip federation certificate verification on the following whitelist +# of domains. +# +# This setting should only be used in very specific cases, such as +# federation over Tor hidden services and similar. For private networks +# of homeservers, you likely want to use a private CA instead. +# +# Only effective if federation_verify_certicates is `true`. +# +#federation_certificate_verification_whitelist: +# - lon.example.com +# - "*.domain.com" +# - "*.onion" + +# List of custom certificate authorities for federation traffic. +# +# This setting should only normally be used within a private network of +# homeservers. +# +# Note that this list will replace those that are provided by your +# operating environment. Certificates must be in PEM format. +# +#federation_custom_ca_list: +# - myCA1.pem +# - myCA2.pem +# - myCA3.pem + + +## Federation ## + +# Restrict federation to the following whitelist of domains. +# N.B. we recommend also firewalling your federation listener to limit +# inbound federation traffic as early as possible, rather than relying +# purely on this application-layer restriction. If not specified, the +# default is to whitelist everything. +# +#federation_domain_whitelist: +# - lon.example.com +# - nyc.example.com +# - syd.example.com + +# Report prometheus metrics on the age of PDUs being sent to and received from +# the following domains. This can be used to give an idea of "delay" on inbound +# and outbound federation, though be aware that any delay can be due to problems +# at either end or with the intermediate network. +# +# By default, no domains are monitored in this way. +# +#federation_metrics_domains: +# - matrix.org +# - example.com + +# Uncomment to disable profile lookup over federation. By default, the +# Federation API allows other homeservers to obtain profile data of any user +# on this homeserver. Defaults to 'true'. +# +#allow_profile_lookup_over_federation: false + +# Uncomment to allow device display name lookup over federation. By default, the +# Federation API prevents other homeservers from obtaining the display names of +# user devices on this homeserver. Defaults to 'false'. +# +#allow_device_name_lookup_over_federation: true + + +## Caching ## + +# Caching can be configured through the following options. +# +# A cache 'factor' is a multiplier that can be applied to each of +# Synapse's caches in order to increase or decrease the maximum +# number of entries that can be stored. + +# The number of events to cache in memory. Not affected by +# caches.global_factor. +# +#event_cache_size: 10K + +caches: + # Controls the global cache factor, which is the default cache factor + # for all caches if a specific factor for that cache is not otherwise + # set. + # + # This can also be set by the "SYNAPSE_CACHE_FACTOR" environment + # variable. Setting by environment variable takes priority over + # setting through the config file. + # + # Defaults to 0.5, which will half the size of all caches. + # + #global_factor: 1.0 + + # A dictionary of cache name to cache factor for that individual + # cache. Overrides the global cache factor for a given cache. + # + # These can also be set through environment variables comprised + # of "SYNAPSE_CACHE_FACTOR_" + the name of the cache in capital + # letters and underscores. Setting by environment variable + # takes priority over setting through the config file. + # Ex. SYNAPSE_CACHE_FACTOR_GET_USERS_WHO_SHARE_ROOM_WITH_USER=2.0 + # + # Some caches have '*' and other characters that are not + # alphanumeric or underscores. These caches can be named with or + # without the special characters stripped. For example, to specify + # the cache factor for `*stateGroupCache*` via an environment + # variable would be `SYNAPSE_CACHE_FACTOR_STATEGROUPCACHE=2.0`. + # + per_cache_factors: + #get_users_who_share_room_with_user: 2.0 + + # Controls whether cache entries are evicted after a specified time + # period. Defaults to true. Uncomment to disable this feature. + # + #expire_caches: false + + # If expire_caches is enabled, this flag controls how long an entry can + # be in a cache without having been accessed before being evicted. + # Defaults to 30m. Uncomment to set a different time to live for cache entries. + # + #cache_entry_ttl: 30m + + # Controls how long the results of a /sync request are cached for after + # a successful response is returned. A higher duration can help clients with + # intermittent connections, at the cost of higher memory usage. + # + # By default, this is zero, which means that sync responses are not cached + # at all. + # + #sync_response_cache_duration: 2m + + +## Database ## + +# The 'database' setting defines the database that synapse uses to store all of +# its data. +# +# 'name' gives the database engine to use: either 'sqlite3' (for SQLite) or +# 'psycopg2' (for PostgreSQL). +# +# 'txn_limit' gives the maximum number of transactions to run per connection +# before reconnecting. Defaults to 0, which means no limit. +# +# 'allow_unsafe_locale' is an option specific to Postgres. Under the default behavior, Synapse will refuse to +# start if the postgres db is set to a non-C locale. You can override this behavior (which is *not* recommended) +# by setting 'allow_unsafe_locale' to true. Note that doing so may corrupt your database. You can find more information +# here: https://matrix-org.github.io/synapse/latest/postgres.html#fixing-incorrect-collate-or-ctype and here: +# https://wiki.postgresql.org/wiki/Locale_data_changes +# +# 'args' gives options which are passed through to the database engine, +# except for options starting 'cp_', which are used to configure the Twisted +# connection pool. For a reference to valid arguments, see: +# * for sqlite: https://docs.python.org/3/library/sqlite3.html#sqlite3.connect +# * for postgres: https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-PARAMKEYWORDS +# * for the connection pool: https://twistedmatrix.com/documents/current/api/twisted.enterprise.adbapi.ConnectionPool.html#__init__ +# +# +# Example SQLite configuration: +# +#database: +# name: sqlite3 +# args: +# database: /path/to/homeserver.db +# +# +# Example Postgres configuration: +# +#database: +# name: psycopg2 +# txn_limit: 10000 +# args: +# user: synapse_user +# password: secretpassword +# database: synapse +# host: localhost +# port: 5432 +# cp_min: 5 +# cp_max: 10 +# +# For more information on using Synapse with Postgres, +# see https://matrix-org.github.io/synapse/latest/postgres.html. +# +database: + name: sqlite3 + args: + database: /data/homeserver.db + + +## Logging ## + +# A yaml python logging config file as described by +# https://docs.python.org/3.7/library/logging.config.html#configuration-dictionary-schema +# +log_config: "/data/localhost.log.config" + + +## Ratelimiting ## + +# Ratelimiting settings for client actions (registration, login, messaging). +# +# Each ratelimiting configuration is made of two parameters: +# - per_second: number of requests a client can send per second. +# - burst_count: number of requests a client can send before being throttled. +# +# Synapse currently uses the following configurations: +# - one for messages that ratelimits sending based on the account the client +# is using +# - one for registration that ratelimits registration requests based on the +# client's IP address. +# - one for checking the validity of registration tokens that ratelimits +# requests based on the client's IP address. +# - one for login that ratelimits login requests based on the client's IP +# address. +# - one for login that ratelimits login requests based on the account the +# client is attempting to log into. +# - one for login that ratelimits login requests based on the account the +# client is attempting to log into, based on the amount of failed login +# attempts for this account. +# - one for ratelimiting redactions by room admins. If this is not explicitly +# set then it uses the same ratelimiting as per rc_message. This is useful +# to allow room admins to deal with abuse quickly. +# - two for ratelimiting number of rooms a user can join, "local" for when +# users are joining rooms the server is already in (this is cheap) vs +# "remote" for when users are trying to join rooms not on the server (which +# can be more expensive) +# - one for ratelimiting how often a user or IP can attempt to validate a 3PID. +# - two for ratelimiting how often invites can be sent in a room or to a +# specific user. +# - one for ratelimiting 3PID invites (i.e. invites sent to a third-party ID +# such as an email address or a phone number) based on the account that's +# sending the invite. +# +# The defaults are as shown below. +# +#rc_message: +# per_second: 0.2 +# burst_count: 10 +# +#rc_registration: +# per_second: 0.17 +# burst_count: 3 +# +#rc_registration_token_validity: +# per_second: 0.1 +# burst_count: 5 +# +#rc_login: +# address: +# per_second: 0.17 +# burst_count: 3 +# account: +# per_second: 0.17 +# burst_count: 3 +# failed_attempts: +# per_second: 0.17 +# burst_count: 3 +# +#rc_admin_redaction: +# per_second: 1 +# burst_count: 50 +# +#rc_joins: +# local: +# per_second: 0.1 +# burst_count: 10 +# remote: +# per_second: 0.01 +# burst_count: 10 +# +#rc_3pid_validation: +# per_second: 0.003 +# burst_count: 5 +# +#rc_invites: +# per_room: +# per_second: 0.3 +# burst_count: 10 +# per_user: +# per_second: 0.003 +# burst_count: 5 +# +#rc_third_party_invite: +# per_second: 0.2 +# burst_count: 10 + +# Ratelimiting settings for incoming federation +# +# The rc_federation configuration is made up of the following settings: +# - window_size: window size in milliseconds +# - sleep_limit: number of federation requests from a single server in +# a window before the server will delay processing the request. +# - sleep_delay: duration in milliseconds to delay processing events +# from remote servers by if they go over the sleep limit. +# - reject_limit: maximum number of concurrent federation requests +# allowed from a single server +# - concurrent: number of federation requests to concurrently process +# from a single server +# +# The defaults are as shown below. +# +#rc_federation: +# window_size: 1000 +# sleep_limit: 10 +# sleep_delay: 500 +# reject_limit: 50 +# concurrent: 3 + +# Target outgoing federation transaction frequency for sending read-receipts, +# per-room. +# +# If we end up trying to send out more read-receipts, they will get buffered up +# into fewer transactions. +# +#federation_rr_transactions_per_room_per_second: 50 + + + +## Media Store ## + +# Enable the media store service in the Synapse master. Uncomment the +# following if you are using a separate media store worker. +# +#enable_media_repo: false + +# Directory where uploaded images and attachments are stored. +# +media_store_path: "/data/media_store" + +# Media storage providers allow media to be stored in different +# locations. +# +#media_storage_providers: +# - module: file_system +# # Whether to store newly uploaded local files +# store_local: false +# # Whether to store newly downloaded remote files +# store_remote: false +# # Whether to wait for successful storage for local uploads +# store_synchronous: false +# config: +# directory: /mnt/some/other/directory + +# The largest allowed upload size in bytes +# +# If you are using a reverse proxy you may also need to set this value in +# your reverse proxy's config. Notably Nginx has a small max body size by default. +# See https://matrix-org.github.io/synapse/latest/reverse_proxy.html. +# +#max_upload_size: 50M + +# Maximum number of pixels that will be thumbnailed +# +#max_image_pixels: 32M + +# Whether to generate new thumbnails on the fly to precisely match +# the resolution requested by the client. If true then whenever +# a new resolution is requested by the client the server will +# generate a new thumbnail. If false the server will pick a thumbnail +# from a precalculated list. +# +#dynamic_thumbnails: false + +# List of thumbnails to precalculate when an image is uploaded. +# +#thumbnail_sizes: +# - width: 32 +# height: 32 +# method: crop +# - width: 96 +# height: 96 +# method: crop +# - width: 320 +# height: 240 +# method: scale +# - width: 640 +# height: 480 +# method: scale +# - width: 800 +# height: 600 +# method: scale + +# Is the preview URL API enabled? +# +# 'false' by default: uncomment the following to enable it (and specify a +# url_preview_ip_range_blacklist blacklist). +# +#url_preview_enabled: true + +# List of IP address CIDR ranges that the URL preview spider is denied +# from accessing. There are no defaults: you must explicitly +# specify a list for URL previewing to work. You should specify any +# internal services in your network that you do not want synapse to try +# to connect to, otherwise anyone in any Matrix room could cause your +# synapse to issue arbitrary GET requests to your internal services, +# causing serious security issues. +# +# (0.0.0.0 and :: are always blacklisted, whether or not they are explicitly +# listed here, since they correspond to unroutable addresses.) +# +# This must be specified if url_preview_enabled is set. It is recommended that +# you uncomment the following list as a starting point. +# +# Note: The value is ignored when an HTTP proxy is in use +# +#url_preview_ip_range_blacklist: +# - '127.0.0.0/8' +# - '10.0.0.0/8' +# - '172.16.0.0/12' +# - '192.168.0.0/16' +# - '100.64.0.0/10' +# - '192.0.0.0/24' +# - '169.254.0.0/16' +# - '192.88.99.0/24' +# - '198.18.0.0/15' +# - '192.0.2.0/24' +# - '198.51.100.0/24' +# - '203.0.113.0/24' +# - '224.0.0.0/4' +# - '::1/128' +# - 'fe80::/10' +# - 'fc00::/7' +# - '2001:db8::/32' +# - 'ff00::/8' +# - 'fec0::/10' + +# List of IP address CIDR ranges that the URL preview spider is allowed +# to access even if they are specified in url_preview_ip_range_blacklist. +# This is useful for specifying exceptions to wide-ranging blacklisted +# target IP ranges - e.g. for enabling URL previews for a specific private +# website only visible in your network. +# +#url_preview_ip_range_whitelist: +# - '192.168.1.1' + +# Optional list of URL matches that the URL preview spider is +# denied from accessing. You should use url_preview_ip_range_blacklist +# in preference to this, otherwise someone could define a public DNS +# entry that points to a private IP address and circumvent the blacklist. +# This is more useful if you know there is an entire shape of URL that +# you know that will never want synapse to try to spider. +# +# Each list entry is a dictionary of url component attributes as returned +# by urlparse.urlsplit as applied to the absolute form of the URL. See +# https://docs.python.org/2/library/urlparse.html#urlparse.urlsplit +# The values of the dictionary are treated as an filename match pattern +# applied to that component of URLs, unless they start with a ^ in which +# case they are treated as a regular expression match. If all the +# specified component matches for a given list item succeed, the URL is +# blacklisted. +# +#url_preview_url_blacklist: +# # blacklist any URL with a username in its URI +# - username: '*' +# +# # blacklist all *.google.com URLs +# - netloc: 'google.com' +# - netloc: '*.google.com' +# +# # blacklist all plain HTTP URLs +# - scheme: 'http' +# +# # blacklist http(s)://www.acme.com/foo +# - netloc: 'www.acme.com' +# path: '/foo' +# +# # blacklist any URL with a literal IPv4 address +# - netloc: '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$' + +# The largest allowed URL preview spidering size in bytes +# +#max_spider_size: 10M + +# A list of values for the Accept-Language HTTP header used when +# downloading webpages during URL preview generation. This allows +# Synapse to specify the preferred languages that URL previews should +# be in when communicating with remote servers. +# +# Each value is a IETF language tag; a 2-3 letter identifier for a +# language, optionally followed by subtags separated by '-', specifying +# a country or region variant. +# +# Multiple values can be provided, and a weight can be added to each by +# using quality value syntax (;q=). '*' translates to any language. +# +# Defaults to "en". +# +# Example: +# +# url_preview_accept_language: +# - en-UK +# - en-US;q=0.9 +# - fr;q=0.8 +# - *;q=0.7 +# +url_preview_accept_language: +# - en + + +# oEmbed allows for easier embedding content from a website. It can be +# used for generating URLs previews of services which support it. +# +oembed: + # A default list of oEmbed providers is included with Synapse. + # + # Uncomment the following to disable using these default oEmbed URLs. + # Defaults to 'false'. + # + #disable_default_providers: true + + # Additional files with oEmbed configuration (each should be in the + # form of providers.json). + # + # By default, this list is empty (so only the default providers.json + # is used). + # + #additional_providers: + # - oembed/my_providers.json + + +## Captcha ## +# See docs/CAPTCHA_SETUP.md for full details of configuring this. + +# This homeserver's ReCAPTCHA public key. Must be specified if +# enable_registration_captcha is enabled. +# +#recaptcha_public_key: "YOUR_PUBLIC_KEY" + +# This homeserver's ReCAPTCHA private key. Must be specified if +# enable_registration_captcha is enabled. +# +#recaptcha_private_key: "YOUR_PRIVATE_KEY" + +# Uncomment to enable ReCaptcha checks when registering, preventing signup +# unless a captcha is answered. Requires a valid ReCaptcha +# public/private key. Defaults to 'false'. +# +#enable_registration_captcha: true + +# The API endpoint to use for verifying m.login.recaptcha responses. +# Defaults to "https://www.recaptcha.net/recaptcha/api/siteverify". +# +#recaptcha_siteverify_api: "https://my.recaptcha.site" + + +## TURN ## + +# The public URIs of the TURN server to give to clients +# +#turn_uris: [] + +# The shared secret used to compute passwords for the TURN server +# +#turn_shared_secret: "YOUR_SHARED_SECRET" + +# The Username and password if the TURN server needs them and +# does not use a token +# +#turn_username: "TURNSERVER_USERNAME" +#turn_password: "TURNSERVER_PASSWORD" + +# How long generated TURN credentials last +# +#turn_user_lifetime: 1h + +# Whether guests should be allowed to use the TURN server. +# This defaults to True, otherwise VoIP will be unreliable for guests. +# However, it does introduce a slight security risk as it allows users to +# connect to arbitrary endpoints without having first signed up for a +# valid account (e.g. by passing a CAPTCHA). +# +#turn_allow_guests: true + + +## Registration ## +# +# Registration can be rate-limited using the parameters in the "Ratelimiting" +# section of this file. + +# Enable registration for new users. Defaults to 'false'. It is highly recommended that if you enable registration, +# you use either captcha, email, or token-based verification to verify that new users are not bots. In order to enable registration +# without any verification, you must also set `enable_registration_without_verification`, found below. +# +enable_registration: true + +# Enable registration without email or captcha verification. Note: this option is *not* recommended, +# as registration without verification is a known vector for spam and abuse. Defaults to false. Has no effect +# unless `enable_registration` is also enabled. +# +enable_registration_without_verification: true + +# Time that a user's session remains valid for, after they log in. +# +# Note that this is not currently compatible with guest logins. +# +# Note also that this is calculated at login time: changes are not applied +# retrospectively to users who have already logged in. +# +# By default, this is infinite. +# +#session_lifetime: 24h + +# Time that an access token remains valid for, if the session is +# using refresh tokens. +# For more information about refresh tokens, please see the manual. +# Note that this only applies to clients which advertise support for +# refresh tokens. +# +# Note also that this is calculated at login time and refresh time: +# changes are not applied to existing sessions until they are refreshed. +# +# By default, this is 5 minutes. +# +#refreshable_access_token_lifetime: 5m + +# Time that a refresh token remains valid for (provided that it is not +# exchanged for another one first). +# This option can be used to automatically log-out inactive sessions. +# Please see the manual for more information. +# +# Note also that this is calculated at login time and refresh time: +# changes are not applied to existing sessions until they are refreshed. +# +# By default, this is infinite. +# +#refresh_token_lifetime: 24h + +# Time that an access token remains valid for, if the session is NOT +# using refresh tokens. +# Please note that not all clients support refresh tokens, so setting +# this to a short value may be inconvenient for some users who will +# then be logged out frequently. +# +# Note also that this is calculated at login time: changes are not applied +# retrospectively to existing sessions for users that have already logged in. +# +# By default, this is infinite. +# +#nonrefreshable_access_token_lifetime: 24h + +# The user must provide all of the below types of 3PID when registering. +# +#registrations_require_3pid: +# - email +# - msisdn + +# Explicitly disable asking for MSISDNs from the registration +# flow (overrides registrations_require_3pid if MSISDNs are set as required) +# +#disable_msisdn_registration: true + +# Mandate that users are only allowed to associate certain formats of +# 3PIDs with accounts on this server. +# +#allowed_local_3pids: +# - medium: email +# pattern: '^[^@]+@matrix\.org$' +# - medium: email +# pattern: '^[^@]+@vector\.im$' +# - medium: msisdn +# pattern: '\+44' + +# Enable 3PIDs lookup requests to identity servers from this server. +# +#enable_3pid_lookup: true + +# Require users to submit a token during registration. +# Tokens can be managed using the admin API: +# https://matrix-org.github.io/synapse/latest/usage/administration/admin_api/registration_tokens.html +# Note that `enable_registration` must be set to `true`. +# Disabling this option will not delete any tokens previously generated. +# Defaults to false. Uncomment the following to require tokens: +# +#registration_requires_token: true + +# Allow users to submit a token during registration to bypass any required 3pid +# steps configured in `registrations_require_3pid`. +# Defaults to false, requiring that registration tokens (if enabled) complete a 3pid flow. +# +#enable_registration_token_3pid_bypass: false + +# If set, allows registration of standard or admin accounts by anyone who +# has the shared secret, even if registration is otherwise disabled. +# +registration_shared_secret: "*_854H=YMj.QsE;~~3S,+785vsc#f9f=~nw8aa0Da&~Ye=24=l" + +# Set the number of bcrypt rounds used to generate password hash. +# Larger numbers increase the work factor needed to generate the hash. +# The default number is 12 (which equates to 2^12 rounds). +# N.B. that increasing this will exponentially increase the time required +# to register or login - e.g. 24 => 2^24 rounds which will take >20 mins. +# +#bcrypt_rounds: 12 + +# Allows users to register as guests without a password/email/etc, and +# participate in rooms hosted on this server which have been made +# accessible to anonymous users. +# +#allow_guest_access: false + +# The identity server which we suggest that clients should use when users log +# in on this server. +# +# (By default, no suggestion is made, so it is left up to the client. +# This setting is ignored unless public_baseurl is also explicitly set.) +# +#default_identity_server: https://matrix.org + +# Handle threepid (email/phone etc) registration and password resets through a set of +# *trusted* identity servers. Note that this allows the configured identity server to +# reset passwords for accounts! +# +# Be aware that if `email` is not set, and SMTP options have not been +# configured in the email config block, registration and user password resets via +# email will be globally disabled. +# +# Additionally, if `msisdn` is not set, registration and password resets via msisdn +# will be disabled regardless, and users will not be able to associate an msisdn +# identifier to their account. This is due to Synapse currently not supporting +# any method of sending SMS messages on its own. +# +# To enable using an identity server for operations regarding a particular third-party +# identifier type, set the value to the URL of that identity server as shown in the +# examples below. +# +# Servers handling the these requests must answer the `/requestToken` endpoints defined +# by the Matrix Identity Service API specification: +# https://matrix.org/docs/spec/identity_service/latest +# +account_threepid_delegates: + #email: https://example.com # Delegate email sending to example.com + #msisdn: http://localhost:8090 # Delegate SMS sending to this local process + +# Whether users are allowed to change their displayname after it has +# been initially set. Useful when provisioning users based on the +# contents of a third-party directory. +# +# Does not apply to server administrators. Defaults to 'true' +# +#enable_set_displayname: false + +# Whether users are allowed to change their avatar after it has been +# initially set. Useful when provisioning users based on the contents +# of a third-party directory. +# +# Does not apply to server administrators. Defaults to 'true' +# +#enable_set_avatar_url: false + +# Whether users can change the 3PIDs associated with their accounts +# (email address and msisdn). +# +# Defaults to 'true' +# +#enable_3pid_changes: false + +# Users who register on this homeserver will automatically be joined +# to these rooms. +# +# By default, any room aliases included in this list will be created +# as a publicly joinable room when the first user registers for the +# homeserver. This behaviour can be customised with the settings below. +# If the room already exists, make certain it is a publicly joinable +# room. The join rule of the room must be set to 'public'. +# +#auto_join_rooms: +# - "#example:example.com" + +# Where auto_join_rooms are specified, setting this flag ensures that the +# the rooms exist by creating them when the first user on the +# homeserver registers. +# +# By default the auto-created rooms are publicly joinable from any federated +# server. Use the autocreate_auto_join_rooms_federated and +# autocreate_auto_join_room_preset settings below to customise this behaviour. +# +# Setting to false means that if the rooms are not manually created, +# users cannot be auto-joined since they do not exist. +# +# Defaults to true. Uncomment the following line to disable automatically +# creating auto-join rooms. +# +#autocreate_auto_join_rooms: false + +# Whether the auto_join_rooms that are auto-created are available via +# federation. Only has an effect if autocreate_auto_join_rooms is true. +# +# Note that whether a room is federated cannot be modified after +# creation. +# +# Defaults to true: the room will be joinable from other servers. +# Uncomment the following to prevent users from other homeservers from +# joining these rooms. +# +#autocreate_auto_join_rooms_federated: false + +# The room preset to use when auto-creating one of auto_join_rooms. Only has an +# effect if autocreate_auto_join_rooms is true. +# +# This can be one of "public_chat", "private_chat", or "trusted_private_chat". +# If a value of "private_chat" or "trusted_private_chat" is used then +# auto_join_mxid_localpart must also be configured. +# +# Defaults to "public_chat", meaning that the room is joinable by anyone, including +# federated servers if autocreate_auto_join_rooms_federated is true (the default). +# Uncomment the following to require an invitation to join these rooms. +# +#autocreate_auto_join_room_preset: private_chat + +# The local part of the user id which is used to create auto_join_rooms if +# autocreate_auto_join_rooms is true. If this is not provided then the +# initial user account that registers will be used to create the rooms. +# +# The user id is also used to invite new users to any auto-join rooms which +# are set to invite-only. +# +# It *must* be configured if autocreate_auto_join_room_preset is set to +# "private_chat" or "trusted_private_chat". +# +# Note that this must be specified in order for new users to be correctly +# invited to any auto-join rooms which have been set to invite-only (either +# at the time of creation or subsequently). +# +# Note that, if the room already exists, this user must be joined and +# have the appropriate permissions to invite new members. +# +#auto_join_mxid_localpart: system + +# When auto_join_rooms is specified, setting this flag to false prevents +# guest accounts from being automatically joined to the rooms. +# +# Defaults to true. +# +#auto_join_rooms_for_guests: false + +# Whether to inhibit errors raised when registering a new account if the user ID +# already exists. If turned on, that requests to /register/available will always +# show a user ID as available, and Synapse won't raise an error when starting +# a registration with a user ID that already exists. However, Synapse will still +# raise an error if the registration completes and the username conflicts. +# +# Defaults to false. +# +#inhibit_user_in_use_error: true + + +## Metrics ### + +# Enable collection and rendering of performance metrics +# +#enable_metrics: false + +# Enable sentry integration +# NOTE: While attempts are made to ensure that the logs don't contain +# any sensitive information, this cannot be guaranteed. By enabling +# this option the sentry server may therefore receive sensitive +# information, and it in turn may then diseminate sensitive information +# through insecure notification channels if so configured. +# +#sentry: +# dsn: "..." + +# Flags to enable Prometheus metrics which are not suitable to be +# enabled by default, either for performance reasons or limited use. +# +metrics_flags: + # Publish synapse_federation_known_servers, a gauge of the number of + # servers this homeserver knows about, including itself. May cause + # performance problems on large homeservers. + # + #known_servers: true + +# Whether or not to report anonymized homeserver usage statistics. +# +report_stats: false + +# The endpoint to report the anonymized homeserver usage statistics to. +# Defaults to https://matrix.org/report-usage-stats/push +# +#report_stats_endpoint: https://example.com/report-usage-stats/push + + +## API Configuration ## + +# Controls for the state that is shared with users who receive an invite +# to a room +# +room_prejoin_state: + # By default, the following state event types are shared with users who + # receive invites to the room: + # + # - m.room.join_rules + # - m.room.canonical_alias + # - m.room.avatar + # - m.room.encryption + # - m.room.name + # - m.room.create + # - m.room.topic + # + # Uncomment the following to disable these defaults (so that only the event + # types listed in 'additional_event_types' are shared). Defaults to 'false'. + # + #disable_default_event_types: true + + # Additional state event types to share with users when they are invited + # to a room. + # + # By default, this list is empty (so only the default event types are shared). + # + #additional_event_types: + # - org.example.custom.event.type + +# We record the IP address of clients used to access the API for various +# reasons, including displaying it to the user in the "Where you're signed in" +# dialog. +# +# By default, when puppeting another user via the admin API, the client IP +# address is recorded against the user who created the access token (ie, the +# admin user), and *not* the puppeted user. +# +# Uncomment the following to also record the IP address against the puppeted +# user. (This also means that the puppeted user will count as an "active" user +# for the purpose of monthly active user tracking - see 'limit_usage_by_mau' etc +# above.) +# +#track_puppeted_user_ips: true + + +# A list of application service config files to use +# +#app_service_config_files: +# - app_service_1.yaml +# - app_service_2.yaml + +# Uncomment to enable tracking of application service IP addresses. Implicitly +# enables MAU tracking for application service users. +# +#track_appservice_user_ips: true + + +# a secret which is used to sign access tokens. If none is specified, +# the registration_shared_secret is used, if one is given; otherwise, +# a secret key is derived from the signing key. +# +macaroon_secret_key: "V^82zhIr=:JrekhnYrePOdvLCAut:9Va,AU@-7NTU3EKXipo*4" + +# a secret which is used to calculate HMACs for form values, to stop +# falsification of values. Must be specified for the User Consent +# forms to work. +# +form_secret: "&fZC5o5Co@cX5xeBMIv1wkxR5SKOdg=p19F#lB^PE^qSJftzc&" + +## Signing Keys ## + +# Path to the signing key to sign messages with +# +signing_key_path: "/data/localhost.signing.key" + +# The keys that the server used to sign messages with but won't use +# to sign new messages. +# +old_signing_keys: + # For each key, `key` should be the base64-encoded public key, and + # `expired_ts`should be the time (in milliseconds since the unix epoch) that + # it was last used. + # + # It is possible to build an entry from an old signing.key file using the + # `export_signing_key` script which is provided with synapse. + # + # For example: + # + #"ed25519:id": { key: "base64string", expired_ts: 123456789123 } + +# How long key response published by this server is valid for. +# Used to set the valid_until_ts in /key/v2 APIs. +# Determines how quickly servers will query to check which keys +# are still valid. +# +#key_refresh_interval: 1d + +# The trusted servers to download signing keys from. +# +# When we need to fetch a signing key, each server is tried in parallel. +# +# Normally, the connection to the key server is validated via TLS certificates. +# Additional security can be provided by configuring a `verify key`, which +# will make synapse check that the response is signed by that key. +# +# This setting supercedes an older setting named `perspectives`. The old format +# is still supported for backwards-compatibility, but it is deprecated. +# +# 'trusted_key_servers' defaults to matrix.org, but using it will generate a +# warning on start-up. To suppress this warning, set +# 'suppress_key_server_warning' to true. +# +# Options for each entry in the list include: +# +# server_name: the name of the server. required. +# +# verify_keys: an optional map from key id to base64-encoded public key. +# If specified, we will check that the response is signed by at least +# one of the given keys. +# +# accept_keys_insecurely: a boolean. Normally, if `verify_keys` is unset, +# and federation_verify_certificates is not `true`, synapse will refuse +# to start, because this would allow anyone who can spoof DNS responses +# to masquerade as the trusted key server. If you know what you are doing +# and are sure that your network environment provides a secure connection +# to the key server, you can set this to `true` to override this +# behaviour. +# +# An example configuration might look like: +# +#trusted_key_servers: +# - server_name: "my_trusted_server.example.com" +# verify_keys: +# "ed25519:auto": "abcdefghijklmnopqrstuvwxyzabcdefghijklmopqr" +# - server_name: "my_other_trusted_server.example.com" +# +trusted_key_servers: + - server_name: "matrix.org" + +# Uncomment the following to disable the warning that is emitted when the +# trusted_key_servers include 'matrix.org'. See above. +# +#suppress_key_server_warning: true + +# The signing keys to use when acting as a trusted key server. If not specified +# defaults to the server signing key. +# +# Can contain multiple keys, one per line. +# +#key_server_signing_keys_path: "key_server_signing_keys.key" + + +## Single sign-on integration ## + +# The following settings can be used to make Synapse use a single sign-on +# provider for authentication, instead of its internal password database. +# +# You will probably also want to set the following options to `false` to +# disable the regular login/registration flows: +# * enable_registration +# * password_config.enabled +# +# You will also want to investigate the settings under the "sso" configuration +# section below. + +# Enable SAML2 for registration and login. Uses pysaml2. +# +# At least one of `sp_config` or `config_path` must be set in this section to +# enable SAML login. +# +# Once SAML support is enabled, a metadata file will be exposed at +# https://:/_synapse/client/saml2/metadata.xml, which you may be able to +# use to configure your SAML IdP with. Alternatively, you can manually configure +# the IdP to use an ACS location of +# https://:/_synapse/client/saml2/authn_response. +# +saml2_config: + # `sp_config` is the configuration for the pysaml2 Service Provider. + # See pysaml2 docs for format of config. + # + # Default values will be used for the 'entityid' and 'service' settings, + # so it is not normally necessary to specify them unless you need to + # override them. + # + sp_config: + # Point this to the IdP's metadata. You must provide either a local + # file via the `local` attribute or (preferably) a URL via the + # `remote` attribute. + # + #metadata: + # local: ["saml2/idp.xml"] + # remote: + # - url: https://our_idp/metadata.xml + + # Allowed clock difference in seconds between the homeserver and IdP. + # + # Uncomment the below to increase the accepted time difference from 0 to 3 seconds. + # + #accepted_time_diff: 3 + + # By default, the user has to go to our login page first. If you'd like + # to allow IdP-initiated login, set 'allow_unsolicited: true' in a + # 'service.sp' section: + # + #service: + # sp: + # allow_unsolicited: true + + # The examples below are just used to generate our metadata xml, and you + # may well not need them, depending on your setup. Alternatively you + # may need a whole lot more detail - see the pysaml2 docs! + + #description: ["My awesome SP", "en"] + #name: ["Test SP", "en"] + + #ui_info: + # display_name: + # - lang: en + # text: "Display Name is the descriptive name of your service." + # description: + # - lang: en + # text: "Description should be a short paragraph explaining the purpose of the service." + # information_url: + # - lang: en + # text: "https://example.com/terms-of-service" + # privacy_statement_url: + # - lang: en + # text: "https://example.com/privacy-policy" + # keywords: + # - lang: en + # text: ["Matrix", "Element"] + # logo: + # - lang: en + # text: "https://example.com/logo.svg" + # width: "200" + # height: "80" + + #organization: + # name: Example com + # display_name: + # - ["Example co", "en"] + # url: "http://example.com" + + #contact_person: + # - given_name: Bob + # sur_name: "the Sysadmin" + # email_address": ["admin@example.com"] + # contact_type": technical + + # Instead of putting the config inline as above, you can specify a + # separate pysaml2 configuration file: + # + #config_path: "/data/sp_conf.py" + + # The lifetime of a SAML session. This defines how long a user has to + # complete the authentication process, if allow_unsolicited is unset. + # The default is 15 minutes. + # + #saml_session_lifetime: 5m + + # An external module can be provided here as a custom solution to + # mapping attributes returned from a saml provider onto a matrix user. + # + user_mapping_provider: + # The custom module's class. Uncomment to use a custom module. + # + #module: mapping_provider.SamlMappingProvider + + # Custom configuration values for the module. Below options are + # intended for the built-in provider, they should be changed if + # using a custom module. This section will be passed as a Python + # dictionary to the module's `parse_config` method. + # + config: + # The SAML attribute (after mapping via the attribute maps) to use + # to derive the Matrix ID from. 'uid' by default. + # + # Note: This used to be configured by the + # saml2_config.mxid_source_attribute option. If that is still + # defined, its value will be used instead. + # + #mxid_source_attribute: displayName + + # The mapping system to use for mapping the saml attribute onto a + # matrix ID. + # + # Options include: + # * 'hexencode' (which maps unpermitted characters to '=xx') + # * 'dotreplace' (which replaces unpermitted characters with + # '.'). + # The default is 'hexencode'. + # + # Note: This used to be configured by the + # saml2_config.mxid_mapping option. If that is still defined, its + # value will be used instead. + # + #mxid_mapping: dotreplace + + # In previous versions of synapse, the mapping from SAML attribute to + # MXID was always calculated dynamically rather than stored in a + # table. For backwards- compatibility, we will look for user_ids + # matching such a pattern before creating a new account. + # + # This setting controls the SAML attribute which will be used for this + # backwards-compatibility lookup. Typically it should be 'uid', but if + # the attribute maps are changed, it may be necessary to change it. + # + # The default is 'uid'. + # + #grandfathered_mxid_source_attribute: upn + + # It is possible to configure Synapse to only allow logins if SAML attributes + # match particular values. The requirements can be listed under + # `attribute_requirements` as shown below. All of the listed attributes must + # match for the login to be permitted. + # + #attribute_requirements: + # - attribute: userGroup + # value: "staff" + # - attribute: department + # value: "sales" + + # If the metadata XML contains multiple IdP entities then the `idp_entityid` + # option must be set to the entity to redirect users to. + # + # Most deployments only have a single IdP entity and so should omit this + # option. + # + #idp_entityid: 'https://our_idp/entityid' + + +# List of OpenID Connect (OIDC) / OAuth 2.0 identity providers, for registration +# and login. +# +# Options for each entry include: +# +# idp_id: a unique identifier for this identity provider. Used internally +# by Synapse; should be a single word such as 'github'. +# +# Note that, if this is changed, users authenticating via that provider +# will no longer be recognised as the same user! +# +# (Use "oidc" here if you are migrating from an old "oidc_config" +# configuration.) +# +# idp_name: A user-facing name for this identity provider, which is used to +# offer the user a choice of login mechanisms. +# +# idp_icon: An optional icon for this identity provider, which is presented +# by clients and Synapse's own IdP picker page. If given, must be an +# MXC URI of the format mxc:///. (An easy way to +# obtain such an MXC URI is to upload an image to an (unencrypted) room +# and then copy the "url" from the source of the event.) +# +# idp_brand: An optional brand for this identity provider, allowing clients +# to style the login flow according to the identity provider in question. +# See the spec for possible options here. +# +# discover: set to 'false' to disable the use of the OIDC discovery mechanism +# to discover endpoints. Defaults to true. +# +# issuer: Required. The OIDC issuer. Used to validate tokens and (if discovery +# is enabled) to discover the provider's endpoints. +# +# client_id: Required. oauth2 client id to use. +# +# client_secret: oauth2 client secret to use. May be omitted if +# client_secret_jwt_key is given, or if client_auth_method is 'none'. +# +# client_secret_jwt_key: Alternative to client_secret: details of a key used +# to create a JSON Web Token to be used as an OAuth2 client secret. If +# given, must be a dictionary with the following properties: +# +# key: a pem-encoded signing key. Must be a suitable key for the +# algorithm specified. Required unless 'key_file' is given. +# +# key_file: the path to file containing a pem-encoded signing key file. +# Required unless 'key' is given. +# +# jwt_header: a dictionary giving properties to include in the JWT +# header. Must include the key 'alg', giving the algorithm used to +# sign the JWT, such as "ES256", using the JWA identifiers in +# RFC7518. +# +# jwt_payload: an optional dictionary giving properties to include in +# the JWT payload. Normally this should include an 'iss' key. +# +# client_auth_method: auth method to use when exchanging the token. Valid +# values are 'client_secret_basic' (default), 'client_secret_post' and +# 'none'. +# +# scopes: list of scopes to request. This should normally include the "openid" +# scope. Defaults to ["openid"]. +# +# authorization_endpoint: the oauth2 authorization endpoint. Required if +# provider discovery is disabled. +# +# token_endpoint: the oauth2 token endpoint. Required if provider discovery is +# disabled. +# +# userinfo_endpoint: the OIDC userinfo endpoint. Required if discovery is +# disabled and the 'openid' scope is not requested. +# +# jwks_uri: URI where to fetch the JWKS. Required if discovery is disabled and +# the 'openid' scope is used. +# +# skip_verification: set to 'true' to skip metadata verification. Use this if +# you are connecting to a provider that is not OpenID Connect compliant. +# Defaults to false. Avoid this in production. +# +# user_profile_method: Whether to fetch the user profile from the userinfo +# endpoint, or to rely on the data returned in the id_token from the +# token_endpoint. +# +# Valid values are: 'auto' or 'userinfo_endpoint'. +# +# Defaults to 'auto', which uses the userinfo endpoint if 'openid' is +# not included in 'scopes'. Set to 'userinfo_endpoint' to always use the +# userinfo endpoint. +# +# allow_existing_users: set to 'true' to allow a user logging in via OIDC to +# match a pre-existing account instead of failing. This could be used if +# switching from password logins to OIDC. Defaults to false. +# +# user_mapping_provider: Configuration for how attributes returned from a OIDC +# provider are mapped onto a matrix user. This setting has the following +# sub-properties: +# +# module: The class name of a custom mapping module. Default is +# 'synapse.handlers.oidc.JinjaOidcMappingProvider'. +# See https://matrix-org.github.io/synapse/latest/sso_mapping_providers.html#openid-mapping-providers +# for information on implementing a custom mapping provider. +# +# config: Configuration for the mapping provider module. This section will +# be passed as a Python dictionary to the user mapping provider +# module's `parse_config` method. +# +# For the default provider, the following settings are available: +# +# subject_claim: name of the claim containing a unique identifier +# for the user. Defaults to 'sub', which OpenID Connect +# compliant providers should provide. +# +# localpart_template: Jinja2 template for the localpart of the MXID. +# If this is not set, the user will be prompted to choose their +# own username (see the documentation for the +# 'sso_auth_account_details.html' template). This template can +# use the 'localpart_from_email' filter. +# +# confirm_localpart: Whether to prompt the user to validate (or +# change) the generated localpart (see the documentation for the +# 'sso_auth_account_details.html' template), instead of +# registering the account right away. +# +# display_name_template: Jinja2 template for the display name to set +# on first login. If unset, no displayname will be set. +# +# email_template: Jinja2 template for the email address of the user. +# If unset, no email address will be added to the account. +# +# extra_attributes: a map of Jinja2 templates for extra attributes +# to send back to the client during login. +# Note that these are non-standard and clients will ignore them +# without modifications. +# +# When rendering, the Jinja2 templates are given a 'user' variable, +# which is set to the claims returned by the UserInfo Endpoint and/or +# in the ID Token. +# +# It is possible to configure Synapse to only allow logins if certain attributes +# match particular values in the OIDC userinfo. The requirements can be listed under +# `attribute_requirements` as shown below. All of the listed attributes must +# match for the login to be permitted. Additional attributes can be added to +# userinfo by expanding the `scopes` section of the OIDC config to retrieve +# additional information from the OIDC provider. +# +# If the OIDC claim is a list, then the attribute must match any value in the list. +# Otherwise, it must exactly match the value of the claim. Using the example +# below, the `family_name` claim MUST be "Stephensson", but the `groups` +# claim MUST contain "admin". +# +# attribute_requirements: +# - attribute: family_name +# value: "Stephensson" +# - attribute: groups +# value: "admin" +# +# See https://matrix-org.github.io/synapse/latest/openid.html +# for information on how to configure these options. +# +# For backwards compatibility, it is also possible to configure a single OIDC +# provider via an 'oidc_config' setting. This is now deprecated and admins are +# advised to migrate to the 'oidc_providers' format. (When doing that migration, +# use 'oidc' for the idp_id to ensure that existing users continue to be +# recognised.) +# +oidc_providers: + # Generic example + # + #- idp_id: my_idp + # idp_name: "My OpenID provider" + # idp_icon: "mxc://example.com/mediaid" + # discover: false + # issuer: "https://accounts.example.com/" + # client_id: "provided-by-your-issuer" + # client_secret: "provided-by-your-issuer" + # client_auth_method: client_secret_post + # scopes: ["openid", "profile"] + # authorization_endpoint: "https://accounts.example.com/oauth2/auth" + # token_endpoint: "https://accounts.example.com/oauth2/token" + # userinfo_endpoint: "https://accounts.example.com/userinfo" + # jwks_uri: "https://accounts.example.com/.well-known/jwks.json" + # skip_verification: true + # user_mapping_provider: + # config: + # subject_claim: "id" + # localpart_template: "{{ user.login }}" + # display_name_template: "{{ user.name }}" + # email_template: "{{ user.email }}" + # attribute_requirements: + # - attribute: userGroup + # value: "synapseUsers" + + +# Enable Central Authentication Service (CAS) for registration and login. +# +cas_config: + # Uncomment the following to enable authorization against a CAS server. + # Defaults to false. + # + #enabled: true + + # The URL of the CAS authorization endpoint. + # + #server_url: "https://cas-server.com" + + # The attribute of the CAS response to use as the display name. + # + # If unset, no displayname will be set. + # + #displayname_attribute: name + + # It is possible to configure Synapse to only allow logins if CAS attributes + # match particular values. All of the keys in the mapping below must exist + # and the values must match the given value. Alternately if the given value + # is None then any value is allowed (the attribute just must exist). + # All of the listed attributes must match for the login to be permitted. + # + #required_attributes: + # userGroup: "staff" + # department: None + + +# Additional settings to use with single-sign on systems such as OpenID Connect, +# SAML2 and CAS. +# +# Server admins can configure custom templates for pages related to SSO. See +# https://matrix-org.github.io/synapse/latest/templates.html for more information. +# +sso: + # A list of client URLs which are whitelisted so that the user does not + # have to confirm giving access to their account to the URL. Any client + # whose URL starts with an entry in the following list will not be subject + # to an additional confirmation step after the SSO login is completed. + # + # WARNING: An entry such as "https://my.client" is insecure, because it + # will also match "https://my.client.evil.site", exposing your users to + # phishing attacks from evil.site. To avoid this, include a slash after the + # hostname: "https://my.client/". + # + # The login fallback page (used by clients that don't natively support the + # required login flows) is whitelisted in addition to any URLs in this list. + # + # By default, this list contains only the login fallback page. + # + #client_whitelist: + # - https://riot.im/develop + # - https://my.custom.client/ + + # Uncomment to keep a user's profile fields in sync with information from + # the identity provider. Currently only syncing the displayname is + # supported. Fields are checked on every SSO login, and are updated + # if necessary. + # + # Note that enabling this option will override user profile information, + # regardless of whether users have opted-out of syncing that + # information when first signing in. Defaults to false. + # + #update_profile_information: true + + +# JSON web token integration. The following settings can be used to make +# Synapse JSON web tokens for authentication, instead of its internal +# password database. +# +# Each JSON Web Token needs to contain a "sub" (subject) claim, which is +# used as the localpart of the mxid. +# +# Additionally, the expiration time ("exp"), not before time ("nbf"), +# and issued at ("iat") claims are validated if present. +# +# Note that this is a non-standard login type and client support is +# expected to be non-existent. +# +# See https://matrix-org.github.io/synapse/latest/jwt.html. +# +#jwt_config: + # Uncomment the following to enable authorization using JSON web + # tokens. Defaults to false. + # + #enabled: true + + # This is either the private shared secret or the public key used to + # decode the contents of the JSON web token. + # + # Required if 'enabled' is true. + # + #secret: "provided-by-your-issuer" + + # The algorithm used to sign the JSON web token. + # + # Supported algorithms are listed at + # https://pyjwt.readthedocs.io/en/latest/algorithms.html + # + # Required if 'enabled' is true. + # + #algorithm: "provided-by-your-issuer" + + # Name of the claim containing a unique identifier for the user. + # + # Optional, defaults to `sub`. + # + #subject_claim: "sub" + + # The issuer to validate the "iss" claim against. + # + # Optional, if provided the "iss" claim will be required and + # validated for all JSON web tokens. + # + #issuer: "provided-by-your-issuer" + + # A list of audiences to validate the "aud" claim against. + # + # Optional, if provided the "aud" claim will be required and + # validated for all JSON web tokens. + # + # Note that if the "aud" claim is included in a JSON web token then + # validation will fail without configuring audiences. + # + #audiences: + # - "provided-by-your-issuer" + + +password_config: + # Uncomment to disable password login + # + #enabled: false + + # Uncomment to disable authentication against the local password + # database. This is ignored if `enabled` is false, and is only useful + # if you have other password_providers. + # + #localdb_enabled: false + + # Uncomment and change to a secret random string for extra security. + # DO NOT CHANGE THIS AFTER INITIAL SETUP! + # + #pepper: "EVEN_MORE_SECRET" + + # Define and enforce a password policy. Each parameter is optional. + # This is an implementation of MSC2000. + # + policy: + # Whether to enforce the password policy. + # Defaults to 'false'. + # + #enabled: true + + # Minimum accepted length for a password. + # Defaults to 0. + # + #minimum_length: 15 + + # Whether a password must contain at least one digit. + # Defaults to 'false'. + # + #require_digit: true + + # Whether a password must contain at least one symbol. + # A symbol is any character that's not a number or a letter. + # Defaults to 'false'. + # + #require_symbol: true + + # Whether a password must contain at least one lowercase letter. + # Defaults to 'false'. + # + #require_lowercase: true + + # Whether a password must contain at least one uppercase letter. + # Defaults to 'false'. + # + #require_uppercase: true + +ui_auth: + # The amount of time to allow a user-interactive authentication session + # to be active. + # + # This defaults to 0, meaning the user is queried for their credentials + # before every action, but this can be overridden to allow a single + # validation to be re-used. This weakens the protections afforded by + # the user-interactive authentication process, by allowing for multiple + # (and potentially different) operations to use the same validation session. + # + # This is ignored for potentially "dangerous" operations (including + # deactivating an account, modifying an account password, and + # adding a 3PID). + # + # Uncomment below to allow for credential validation to last for 15 + # seconds. + # + #session_timeout: "15s" + + +# Configuration for sending emails from Synapse. +# +# Server admins can configure custom templates for email content. See +# https://matrix-org.github.io/synapse/latest/templates.html for more information. +# +email: + # The hostname of the outgoing SMTP server to use. Defaults to 'localhost'. + # + #smtp_host: mail.server + + # The port on the mail server for outgoing SMTP. Defaults to 25. + # + #smtp_port: 587 + + # Username/password for authentication to the SMTP server. By default, no + # authentication is attempted. + # + #smtp_user: "exampleusername" + #smtp_pass: "examplepassword" + + # Uncomment the following to require TLS transport security for SMTP. + # By default, Synapse will connect over plain text, and will then switch to + # TLS via STARTTLS *if the SMTP server supports it*. If this option is set, + # Synapse will refuse to connect unless the server supports STARTTLS. + # + #require_transport_security: true + + # Uncomment the following to disable TLS for SMTP. + # + # By default, if the server supports TLS, it will be used, and the server + # must present a certificate that is valid for 'smtp_host'. If this option + # is set to false, TLS will not be used. + # + #enable_tls: false + + # notif_from defines the "From" address to use when sending emails. + # It must be set if email sending is enabled. + # + # The placeholder '%(app)s' will be replaced by the application name, + # which is normally 'app_name' (below), but may be overridden by the + # Matrix client application. + # + # Note that the placeholder must be written '%(app)s', including the + # trailing 's'. + # + #notif_from: "Your Friendly %(app)s homeserver " + + # app_name defines the default value for '%(app)s' in notif_from and email + # subjects. It defaults to 'Matrix'. + # + #app_name: my_branded_matrix_server + + # Uncomment the following to enable sending emails for messages that the user + # has missed. Disabled by default. + # + #enable_notifs: true + + # Uncomment the following to disable automatic subscription to email + # notifications for new users. Enabled by default. + # + #notif_for_new_users: false + + # Custom URL for client links within the email notifications. By default + # links will be based on "https://matrix.to". + # + # (This setting used to be called riot_base_url; the old name is still + # supported for backwards-compatibility but is now deprecated.) + # + #client_base_url: "http://localhost/riot" + + # Configure the time that a validation email will expire after sending. + # Defaults to 1h. + # + #validation_token_lifetime: 15m + + # The web client location to direct users to during an invite. This is passed + # to the identity server as the org.matrix.web_client_location key. Defaults + # to unset, giving no guidance to the identity server. + # + #invite_client_location: https://app.element.io + + # Subjects to use when sending emails from Synapse. + # + # The placeholder '%(app)s' will be replaced with the value of the 'app_name' + # setting above, or by a value dictated by the Matrix client application. + # + # If a subject isn't overridden in this configuration file, the value used as + # its example will be used. + # + #subjects: + + # Subjects for notification emails. + # + # On top of the '%(app)s' placeholder, these can use the following + # placeholders: + # + # * '%(person)s', which will be replaced by the display name of the user(s) + # that sent the message(s), e.g. "Alice and Bob". + # * '%(room)s', which will be replaced by the name of the room the + # message(s) have been sent to, e.g. "My super room". + # + # See the example provided for each setting to see which placeholder can be + # used and how to use them. + # + # Subject to use to notify about one message from one or more user(s) in a + # room which has a name. + #message_from_person_in_room: "[%(app)s] You have a message on %(app)s from %(person)s in the %(room)s room..." + # + # Subject to use to notify about one message from one or more user(s) in a + # room which doesn't have a name. + #message_from_person: "[%(app)s] You have a message on %(app)s from %(person)s..." + # + # Subject to use to notify about multiple messages from one or more users in + # a room which doesn't have a name. + #messages_from_person: "[%(app)s] You have messages on %(app)s from %(person)s..." + # + # Subject to use to notify about multiple messages in a room which has a + # name. + #messages_in_room: "[%(app)s] You have messages on %(app)s in the %(room)s room..." + # + # Subject to use to notify about multiple messages in multiple rooms. + #messages_in_room_and_others: "[%(app)s] You have messages on %(app)s in the %(room)s room and others..." + # + # Subject to use to notify about multiple messages from multiple persons in + # multiple rooms. This is similar to the setting above except it's used when + # the room in which the notification was triggered has no name. + #messages_from_person_and_others: "[%(app)s] You have messages on %(app)s from %(person)s and others..." + # + # Subject to use to notify about an invite to a room which has a name. + #invite_from_person_to_room: "[%(app)s] %(person)s has invited you to join the %(room)s room on %(app)s..." + # + # Subject to use to notify about an invite to a room which doesn't have a + # name. + #invite_from_person: "[%(app)s] %(person)s has invited you to chat on %(app)s..." + + # Subject for emails related to account administration. + # + # On top of the '%(app)s' placeholder, these one can use the + # '%(server_name)s' placeholder, which will be replaced by the value of the + # 'server_name' setting in your Synapse configuration. + # + # Subject to use when sending a password reset email. + #password_reset: "[%(server_name)s] Password reset" + # + # Subject to use when sending a verification email to assert an address's + # ownership. + #email_validation: "[%(server_name)s] Validate your email" + + + +## Push ## + +push: + # Clients requesting push notifications can either have the body of + # the message sent in the notification poke along with other details + # like the sender, or just the event ID and room ID (`event_id_only`). + # If clients choose the former, this option controls whether the + # notification request includes the content of the event (other details + # like the sender are still included). For `event_id_only` push, it + # has no effect. + # + # For modern android devices the notification content will still appear + # because it is loaded by the app. iPhone, however will send a + # notification saying only that a message arrived and who it came from. + # + # The default value is "true" to include message details. Uncomment to only + # include the event ID and room ID in push notification payloads. + # + #include_content: false + + # When a push notification is received, an unread count is also sent. + # This number can either be calculated as the number of unread messages + # for the user, or the number of *rooms* the user has unread messages in. + # + # The default value is "true", meaning push clients will see the number of + # rooms with unread messages in them. Uncomment to instead send the number + # of unread messages. + # + #group_unread_count_by_room: false + + +## Rooms ## + +# Controls whether locally-created rooms should be end-to-end encrypted by +# default. +# +# Possible options are "all", "invite", and "off". They are defined as: +# +# * "all": any locally-created room +# * "invite": any room created with the "private_chat" or "trusted_private_chat" +# room creation presets +# * "off": this option will take no effect +# +# The default value is "off". +# +# Note that this option will only affect rooms created after it is set. It +# will also not affect rooms created by other servers. +# +#encryption_enabled_by_default_for_room_type: invite + + +# Uncomment to allow non-server-admin users to create groups on this server +# +#enable_group_creation: true + +# If enabled, non server admins can only create groups with local parts +# starting with this prefix +# +#group_creation_prefix: "unofficial_" + + + +# User Directory configuration +# +user_directory: + # Defines whether users can search the user directory. If false then + # empty responses are returned to all queries. Defaults to true. + # + # Uncomment to disable the user directory. + # + #enabled: false + + # Defines whether to search all users visible to your HS when searching + # the user directory. If false, search results will only contain users + # visible in public rooms and users sharing a room with the requester. + # Defaults to false. + # + # NB. If you set this to true, and the last time the user_directory search + # indexes were (re)built was before Synapse 1.44, you'll have to + # rebuild the indexes in order to search through all known users. + # These indexes are built the first time Synapse starts; admins can + # manually trigger a rebuild via API following the instructions at + # https://matrix-org.github.io/synapse/latest/usage/administration/admin_api/background_updates.html#run + # + # Uncomment to return search results containing all known users, even if that + # user does not share a room with the requester. + # + #search_all_users: true + + # Defines whether to prefer local users in search query results. + # If True, local users are more likely to appear above remote users + # when searching the user directory. Defaults to false. + # + # Uncomment to prefer local over remote users in user directory search + # results. + # + #prefer_local_users: true + + +# User Consent configuration +# +# for detailed instructions, see +# https://matrix-org.github.io/synapse/latest/consent_tracking.html +# +# Parts of this section are required if enabling the 'consent' resource under +# 'listeners', in particular 'template_dir' and 'version'. +# +# 'template_dir' gives the location of the templates for the HTML forms. +# This directory should contain one subdirectory per language (eg, 'en', 'fr'), +# and each language directory should contain the policy document (named as +# '.html') and a success page (success.html). +# +# 'version' specifies the 'current' version of the policy document. It defines +# the version to be served by the consent resource if there is no 'v' +# parameter. +# +# 'server_notice_content', if enabled, will send a user a "Server Notice" +# asking them to consent to the privacy policy. The 'server_notices' section +# must also be configured for this to work. Notices will *not* be sent to +# guest users unless 'send_server_notice_to_guests' is set to true. +# +# 'block_events_error', if set, will block any attempts to send events +# until the user consents to the privacy policy. The value of the setting is +# used as the text of the error. +# +# 'require_at_registration', if enabled, will add a step to the registration +# process, similar to how captcha works. Users will be required to accept the +# policy before their account is created. +# +# 'policy_name' is the display name of the policy users will see when registering +# for an account. Has no effect unless `require_at_registration` is enabled. +# Defaults to "Privacy Policy". +# +#user_consent: +# template_dir: res/templates/privacy +# version: 1.0 +# server_notice_content: +# msgtype: m.text +# body: >- +# To continue using this homeserver you must review and agree to the +# terms and conditions at %(consent_uri)s +# send_server_notice_to_guests: true +# block_events_error: >- +# To continue using this homeserver you must review and agree to the +# terms and conditions at %(consent_uri)s +# require_at_registration: false +# policy_name: Privacy Policy +# + + + +# Settings for local room and user statistics collection. See +# https://matrix-org.github.io/synapse/latest/room_and_user_statistics.html. +# +stats: + # Uncomment the following to disable room and user statistics. Note that doing + # so may cause certain features (such as the room directory) not to work + # correctly. + # + #enabled: false + + +# Server Notices room configuration +# +# Uncomment this section to enable a room which can be used to send notices +# from the server to users. It is a special room which cannot be left; notices +# come from a special "notices" user id. +# +# If you uncomment this section, you *must* define the system_mxid_localpart +# setting, which defines the id of the user which will be used to send the +# notices. +# +# It's also possible to override the room name, the display name of the +# "notices" user, and the avatar for the user. +# +#server_notices: +# system_mxid_localpart: notices +# system_mxid_display_name: "Server Notices" +# system_mxid_avatar_url: "mxc://server.com/oumMVlgDnLYFaPVkExemNVVZ" +# room_name: "Server Notices" + + + +# Uncomment to disable searching the public room list. When disabled +# blocks searching local and remote room lists for local and remote +# users by always returning an empty list for all queries. +# +#enable_room_list_search: false + +# The `alias_creation` option controls who's allowed to create aliases +# on this server. +# +# The format of this option is a list of rules that contain globs that +# match against user_id, room_id and the new alias (fully qualified with +# server name). The action in the first rule that matches is taken, +# which can currently either be "allow" or "deny". +# +# Missing user_id/room_id/alias fields default to "*". +# +# If no rules match the request is denied. An empty list means no one +# can create aliases. +# +# Options for the rules include: +# +# user_id: Matches against the creator of the alias +# alias: Matches against the alias being created +# room_id: Matches against the room ID the alias is being pointed at +# action: Whether to "allow" or "deny" the request if the rule matches +# +# The default is: +# +#alias_creation_rules: +# - user_id: "*" +# alias: "*" +# room_id: "*" +# action: allow + +# The `room_list_publication_rules` option controls who can publish and +# which rooms can be published in the public room list. +# +# The format of this option is the same as that for +# `alias_creation_rules`. +# +# If the room has one or more aliases associated with it, only one of +# the aliases needs to match the alias rule. If there are no aliases +# then only rules with `alias: *` match. +# +# If no rules match the request is denied. An empty list means no one +# can publish rooms. +# +# Options for the rules include: +# +# user_id: Matches against the creator of the alias +# room_id: Matches against the room ID being published +# alias: Matches against any current local or canonical aliases +# associated with the room +# action: Whether to "allow" or "deny" the request if the rule matches +# +# The default is: +# +#room_list_publication_rules: +# - user_id: "*" +# alias: "*" +# room_id: "*" +# action: allow + + +## Opentracing ## + +# These settings enable opentracing, which implements distributed tracing. +# This allows you to observe the causal chains of events across servers +# including requests, key lookups etc., across any server running +# synapse or any other other services which supports opentracing +# (specifically those implemented with Jaeger). +# +opentracing: + # tracing is disabled by default. Uncomment the following line to enable it. + # + #enabled: true + + # The list of homeservers we wish to send and receive span contexts and span baggage. + # See https://matrix-org.github.io/synapse/latest/opentracing.html. + # + # This is a list of regexes which are matched against the server_name of the + # homeserver. + # + # By default, it is empty, so no servers are matched. + # + #homeserver_whitelist: + # - ".*" + + # A list of the matrix IDs of users whose requests will always be traced, + # even if the tracing system would otherwise drop the traces due to + # probabilistic sampling. + # + # By default, the list is empty. + # + #force_tracing_for_users: + # - "@user1:server_name" + # - "@user2:server_name" + + # Jaeger can be configured to sample traces at different rates. + # All configuration options provided by Jaeger can be set here. + # Jaeger's configuration is mostly related to trace sampling which + # is documented here: + # https://www.jaegertracing.io/docs/latest/sampling/. + # + #jaeger_config: + # sampler: + # type: const + # param: 1 + # logging: + # false + + +## Workers ## + +# Disables sending of outbound federation transactions on the main process. +# Uncomment if using a federation sender worker. +# +#send_federation: false + +# It is possible to run multiple federation sender workers, in which case the +# work is balanced across them. +# +# This configuration must be shared between all federation sender workers, and if +# changed all federation sender workers must be stopped at the same time and then +# started, to ensure that all instances are running with the same config (otherwise +# events may be dropped). +# +#federation_sender_instances: +# - federation_sender1 + +# When using workers this should be a map from `worker_name` to the +# HTTP replication listener of the worker, if configured. +# +#instance_map: +# worker1: +# host: localhost +# port: 8034 + +# Experimental: When using workers you can define which workers should +# handle event persistence and typing notifications. Any worker +# specified here must also be in the `instance_map`. +# +#stream_writers: +# events: worker1 +# typing: worker1 + +# The worker that is used to run background tasks (e.g. cleaning up expired +# data). If not provided this defaults to the main process. +# +#run_background_tasks_on: worker1 + +# A shared secret used by the replication APIs to authenticate HTTP requests +# from workers. +# +# By default this is unused and traffic is not authenticated. +# +#worker_replication_secret: "" + + +# Configuration for Redis when using workers. This *must* be enabled when +# using workers (unless using old style direct TCP configuration). +# +redis: + # Uncomment the below to enable Redis support. + # + #enabled: true + + # Optional host and port to use to connect to redis. Defaults to + # localhost and 6379 + # + #host: localhost + #port: 6379 + + # Optional password if configured on the Redis instance + # + #password: + + +## Background Updates ## + +# Background updates are database updates that are run in the background in batches. +# The duration, minimum batch size, default batch size, whether to sleep between batches and if so, how long to +# sleep can all be configured. This is helpful to speed up or slow down the updates. +# +background_updates: + # How long in milliseconds to run a batch of background updates for. Defaults to 100. Uncomment and set + # a time to change the default. + # + #background_update_duration_ms: 500 + + # Whether to sleep between updates. Defaults to True. Uncomment to change the default. + # + #sleep_enabled: false + + # If sleeping between updates, how long in milliseconds to sleep for. Defaults to 1000. Uncomment + # and set a duration to change the default. + # + #sleep_duration_ms: 300 + + # Minimum size a batch of background updates can be. Must be greater than 0. Defaults to 1. Uncomment and + # set a size to change the default. + # + #min_batch_size: 10 + + # The batch size to use for the first iteration of a new background update. The default is 100. + # Uncomment and set a size to change the default. + # + #default_batch_size: 50 + + +# vim:ft=yaml diff --git a/integration_test/synapse/data/localhost.log.config b/integration_test/synapse/data/localhost.log.config new file mode 100644 index 0000000..eeec5ed --- /dev/null +++ b/integration_test/synapse/data/localhost.log.config @@ -0,0 +1,27 @@ +version: 1 + +formatters: + precise: + format: '%(asctime)s - %(name)s - %(lineno)d - %(levelname)s - %(request)s - %(message)s' + +handlers: + + + console: + class: logging.StreamHandler + formatter: precise + +loggers: + synapse.storage.SQL: + # beware: increasing this to DEBUG will make synapse log sensitive + # information such as access tokens. + level: INFO + +root: + level: INFO + + + handlers: [console] + + +disable_existing_loggers: false \ No newline at end of file diff --git a/integration_test/synapse/data/localhost.signing.key b/integration_test/synapse/data/localhost.signing.key new file mode 100644 index 0000000..bba0e02 --- /dev/null +++ b/integration_test/synapse/data/localhost.signing.key @@ -0,0 +1 @@ +ed25519 a_SLrz 0Ho/81rZZve88zdRxhaXWHUT6K3OqzmP35rNMZBUr6I diff --git a/integration_test/users.dart b/integration_test/users.dart new file mode 100644 index 0000000..8af999e --- /dev/null +++ b/integration_test/users.dart @@ -0,0 +1,36 @@ +abstract class Users { + const Users._(); + + static const user1 = User( + String.fromEnvironment( + 'USER1_NAME', + defaultValue: 'alice', + ), + String.fromEnvironment( + 'USER1_PW', + defaultValue: 'AliceInWonderland', + ), + ); + static const user2 = User( + String.fromEnvironment( + 'USER2_NAME', + defaultValue: 'bob', + ), + String.fromEnvironment( + 'USER2_PW', + defaultValue: 'JoWirSchaffenDas', + ), + ); +} + +class User { + final String name; + final String password; + + const User(this.name, this.password); +} + +const homeserver = 'http://${const String.fromEnvironment( + 'HOMESERVER', + defaultValue: 'localhost', +)}'; diff --git a/ios/.gitignore b/ios/.gitignore new file mode 100644 index 0000000..9a29ebd --- /dev/null +++ b/ios/.gitignore @@ -0,0 +1,33 @@ +*.mode1v3 +*.mode2v3 +*.moved-aside +*.pbxuser +*.perspectivev3 +**/*sync/ +.sconsign.dblite +.tags* +**/.vagrant/ +**/DerivedData/ +Icon? +**/Pods/ +**/.symlinks/ +profile +xcuserdata +**/.generated/ +Flutter/App.framework +Flutter/Flutter.framework +Flutter/Flutter.podspec +Flutter/Generated.xcconfig +Flutter/app.flx +Flutter/app.zip +Flutter/flutter_assets/ +Flutter/flutter_export_environment.sh +ServiceDefinitions.json +Runner/GeneratedPluginRegistrant.* +build/ + +# Exceptions to above rules. +!default.mode1v3 +!default.mode2v3 +!default.pbxuser +!default.perspectivev3 diff --git a/ios/FluffyChat Share/Base.lproj/MainInterface.storyboard b/ios/FluffyChat Share/Base.lproj/MainInterface.storyboard new file mode 100644 index 0000000..286a508 --- /dev/null +++ b/ios/FluffyChat Share/Base.lproj/MainInterface.storyboard @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/FluffyChat Share/FluffyChat Share.entitlements b/ios/FluffyChat Share/FluffyChat Share.entitlements new file mode 100644 index 0000000..932f3e0 --- /dev/null +++ b/ios/FluffyChat Share/FluffyChat Share.entitlements @@ -0,0 +1,10 @@ + + + + + com.apple.security.application-groups + + group.im.fluffychat.app + + + diff --git a/ios/FluffyChat Share/Info.plist b/ios/FluffyChat Share/Info.plist new file mode 100644 index 0000000..876e559 --- /dev/null +++ b/ios/FluffyChat Share/Info.plist @@ -0,0 +1,52 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + FluffyChat Share + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + $(MARKETING_VERSION) + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + NSExtension + + NSExtensionAttributes + + NSExtensionActivationRule + + NSExtensionActivationSupportsFileWithMaxCount + 10 + NSExtensionActivationSupportsImageWithMaxCount + 10 + NSExtensionActivationSupportsMovieWithMaxCount + 10 + NSExtensionActivationSupportsText + + NSExtensionActivationSupportsWebURLWithMaxCount + 1 + + PHSupportedMediaTypes + + Video + Image + + + NSExtensionMainStoryboard + MainInterface + NSExtensionPointIdentifier + com.apple.share-services + + + diff --git a/ios/FluffyChat Share/ShareViewController.swift b/ios/FluffyChat Share/ShareViewController.swift new file mode 100644 index 0000000..4d10e6b --- /dev/null +++ b/ios/FluffyChat Share/ShareViewController.swift @@ -0,0 +1,14 @@ +// If you get no such module 'receive_sharing_intent' error. +// Go to Build Phases of your Runner target and +// move `Embed Foundation Extension` to the top of `Thin Binary`. +import receive_sharing_intent + +class ShareViewController: RSIShareViewController { + + // Use this method to return false if you don't want to redirect to host app automatically. + // Default is true + override func shouldAutoRedirect() -> Bool { + return false + } + +} diff --git a/ios/Flutter/AppFrameworkInfo.plist b/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 0000000..8c6e561 --- /dev/null +++ b/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + MinimumOSVersion + 12.0 + + diff --git a/ios/Flutter/Debug.xcconfig b/ios/Flutter/Debug.xcconfig new file mode 100644 index 0000000..e8efba1 --- /dev/null +++ b/ios/Flutter/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" +#include "Generated.xcconfig" diff --git a/ios/Flutter/Release.xcconfig b/ios/Flutter/Release.xcconfig new file mode 100644 index 0000000..399e934 --- /dev/null +++ b/ios/Flutter/Release.xcconfig @@ -0,0 +1,2 @@ +#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" +#include "Generated.xcconfig" diff --git a/ios/Flutter/ephemeral/flutter_lldb_helper.py b/ios/Flutter/ephemeral/flutter_lldb_helper.py new file mode 100644 index 0000000..a88caf9 --- /dev/null +++ b/ios/Flutter/ephemeral/flutter_lldb_helper.py @@ -0,0 +1,32 @@ +# +# Generated file, do not edit. +# + +import lldb + +def handle_new_rx_page(frame: lldb.SBFrame, bp_loc, extra_args, intern_dict): + """Intercept NOTIFY_DEBUGGER_ABOUT_RX_PAGES and touch the pages.""" + base = frame.register["x0"].GetValueAsAddress() + page_len = frame.register["x1"].GetValueAsUnsigned() + + # Note: NOTIFY_DEBUGGER_ABOUT_RX_PAGES will check contents of the + # first page to see if handled it correctly. This makes diagnosing + # misconfiguration (e.g. missing breakpoint) easier. + data = bytearray(page_len) + data[0:8] = b'IHELPED!' + + error = lldb.SBError() + frame.GetThread().GetProcess().WriteMemory(base, data, error) + if not error.Success(): + print(f'Failed to write into {base}[+{page_len}]', error) + return + +def __lldb_init_module(debugger: lldb.SBDebugger, _): + target = debugger.GetDummyTarget() + # Caveat: must use BreakpointCreateByRegEx here and not + # BreakpointCreateByName. For some reasons callback function does not + # get carried over from dummy target for the later. + bp = target.BreakpointCreateByRegex("^NOTIFY_DEBUGGER_ABOUT_RX_PAGES$") + bp.SetScriptCallbackFunction('{}.handle_new_rx_page'.format(__name__)) + bp.SetAutoContinue(True) + print("-- LLDB integration loaded --") diff --git a/ios/Flutter/ephemeral/flutter_lldbinit b/ios/Flutter/ephemeral/flutter_lldbinit new file mode 100644 index 0000000..e3ba6fb --- /dev/null +++ b/ios/Flutter/ephemeral/flutter_lldbinit @@ -0,0 +1,5 @@ +# +# Generated file, do not edit. +# + +command script import --relative-to-command-file flutter_lldb_helper.py diff --git a/ios/Gemfile b/ios/Gemfile new file mode 100644 index 0000000..7a118b4 --- /dev/null +++ b/ios/Gemfile @@ -0,0 +1,3 @@ +source "https://rubygems.org" + +gem "fastlane" diff --git a/ios/Gemfile.lock b/ios/Gemfile.lock new file mode 100644 index 0000000..75fbd4b --- /dev/null +++ b/ios/Gemfile.lock @@ -0,0 +1,205 @@ +GEM + remote: https://rubygems.org/ + specs: + CFPropertyList (3.0.3) + addressable (2.8.4) + public_suffix (>= 2.0.2, < 6.0) + artifactory (3.0.15) + atomos (0.1.3) + aws-eventstream (1.1.1) + aws-partitions (1.469.0) + aws-sdk-core (3.114.3) + aws-eventstream (~> 1, >= 1.0.2) + aws-partitions (~> 1, >= 1.239.0) + aws-sigv4 (~> 1.1) + jmespath (~> 1.0) + aws-sdk-kms (1.44.0) + aws-sdk-core (~> 3, >= 3.112.0) + aws-sigv4 (~> 1.1) + aws-sdk-s3 (1.96.1) + aws-sdk-core (~> 3, >= 3.112.0) + aws-sdk-kms (~> 1) + aws-sigv4 (~> 1.1) + aws-sigv4 (1.2.3) + aws-eventstream (~> 1, >= 1.0.2) + babosa (1.0.4) + claide (1.0.3) + colored (1.2) + colored2 (3.1.2) + commander (4.6.0) + highline (~> 2.0.0) + declarative (0.0.20) + digest-crc (0.6.3) + rake (>= 12.0.0, < 14.0.0) + domain_name (0.5.20190701) + unf (>= 0.0.5, < 1.0.0) + dotenv (2.7.6) + emoji_regex (3.2.2) + excon (0.82.0) + faraday (1.4.2) + faraday-em_http (~> 1.0) + faraday-em_synchrony (~> 1.0) + faraday-excon (~> 1.1) + faraday-net_http (~> 1.0) + faraday-net_http_persistent (~> 1.1) + multipart-post (>= 1.2, < 3) + ruby2_keywords (>= 0.0.4) + faraday-cookie_jar (0.0.7) + faraday (>= 0.8.0) + http-cookie (~> 1.0.0) + faraday-em_http (1.0.0) + faraday-em_synchrony (1.0.0) + faraday-excon (1.1.0) + faraday-net_http (1.0.1) + faraday-net_http_persistent (1.1.0) + faraday_middleware (1.0.0) + faraday (~> 1.0) + fastimage (2.2.4) + fastlane (2.185.1) + CFPropertyList (>= 2.3, < 4.0.0) + addressable (>= 2.3, < 3.0.0) + artifactory (~> 3.0) + aws-sdk-s3 (~> 1.0) + babosa (>= 1.0.3, < 2.0.0) + bundler (>= 1.12.0, < 3.0.0) + colored + commander (~> 4.6) + dotenv (>= 2.1.1, < 3.0.0) + emoji_regex (>= 0.1, < 4.0) + excon (>= 0.71.0, < 1.0.0) + faraday (~> 1.0) + faraday-cookie_jar (~> 0.0.6) + faraday_middleware (~> 1.0) + fastimage (>= 2.1.0, < 3.0.0) + gh_inspector (>= 1.1.2, < 2.0.0) + google-apis-androidpublisher_v3 (~> 0.1) + google-apis-playcustomapp_v1 (~> 0.1) + google-cloud-storage (~> 1.31) + highline (~> 2.0) + json (< 3.0.0) + jwt (>= 2.1.0, < 3) + mini_magick (>= 4.9.4, < 5.0.0) + multipart-post (~> 2.0.0) + naturally (~> 2.2) + plist (>= 3.1.0, < 4.0.0) + rubyzip (>= 2.0.0, < 3.0.0) + security (= 0.1.3) + simctl (~> 1.6.3) + terminal-notifier (>= 2.0.0, < 3.0.0) + terminal-table (>= 1.4.5, < 2.0.0) + tty-screen (>= 0.6.3, < 1.0.0) + tty-spinner (>= 0.8.0, < 1.0.0) + word_wrap (~> 1.0.0) + xcodeproj (>= 1.13.0, < 2.0.0) + xcpretty (~> 0.3.0) + xcpretty-travis-formatter (>= 0.0.3) + gh_inspector (1.1.3) + google-apis-androidpublisher_v3 (0.6.0) + google-apis-core (~> 0.1) + google-apis-core (0.3.0) + addressable (~> 2.5, >= 2.5.1) + googleauth (~> 0.14) + httpclient (>= 2.8.1, < 3.0) + mini_mime (~> 1.0) + representable (~> 3.0) + retriable (>= 2.0, < 4.0) + rexml + signet (~> 0.14) + webrick + google-apis-iamcredentials_v1 (0.4.0) + google-apis-core (~> 0.1) + google-apis-playcustomapp_v1 (0.3.0) + google-apis-core (~> 0.1) + google-apis-storage_v1 (0.4.0) + google-apis-core (~> 0.1) + google-cloud-core (1.6.0) + google-cloud-env (~> 1.0) + google-cloud-errors (~> 1.0) + google-cloud-env (1.5.0) + faraday (>= 0.17.3, < 2.0) + google-cloud-errors (1.1.0) + google-cloud-storage (1.31.1) + addressable (~> 2.5) + digest-crc (~> 0.4) + google-apis-iamcredentials_v1 (~> 0.1) + google-apis-storage_v1 (~> 0.1) + google-cloud-core (~> 1.2) + googleauth (~> 0.9) + mini_mime (~> 1.0) + googleauth (0.16.2) + faraday (>= 0.17.3, < 2.0) + jwt (>= 1.4, < 3.0) + memoist (~> 0.16) + multi_json (~> 1.11) + os (>= 0.9, < 2.0) + signet (~> 0.14) + highline (2.0.3) + http-cookie (1.0.4) + domain_name (~> 0.5) + httpclient (2.8.3) + jmespath (1.6.2) + json (2.5.1) + jwt (2.2.3) + memoist (0.16.2) + mini_magick (4.11.0) + mini_mime (1.1.0) + multi_json (1.15.0) + multipart-post (2.0.0) + nanaimo (0.3.0) + naturally (2.2.1) + os (1.1.1) + plist (3.6.0) + public_suffix (5.0.3) + rake (13.0.3) + representable (3.1.1) + declarative (< 0.1.0) + trailblazer-option (>= 0.1.1, < 0.2.0) + uber (< 0.2.0) + retriable (3.1.2) + rexml (3.3.9) + rouge (2.0.7) + ruby2_keywords (0.0.4) + rubyzip (2.3.0) + security (0.1.3) + signet (0.15.0) + addressable (~> 2.3) + faraday (>= 0.17.3, < 2.0) + jwt (>= 1.5, < 3.0) + multi_json (~> 1.10) + simctl (1.6.8) + CFPropertyList + naturally + terminal-notifier (2.0.0) + terminal-table (1.8.0) + unicode-display_width (~> 1.1, >= 1.1.1) + trailblazer-option (0.1.1) + tty-cursor (0.7.1) + tty-screen (0.8.1) + tty-spinner (0.9.3) + tty-cursor (~> 0.7) + uber (0.1.0) + unf (0.1.4) + unf_ext + unf_ext (0.0.7.7) + unicode-display_width (1.7.0) + webrick (1.8.2) + word_wrap (1.0.0) + xcodeproj (1.19.0) + CFPropertyList (>= 2.3.3, < 4.0) + atomos (~> 0.1.3) + claide (>= 1.0.2, < 2.0) + colored2 (~> 3.1) + nanaimo (~> 0.3.0) + xcpretty (0.3.0) + rouge (~> 2.0.7) + xcpretty-travis-formatter (1.0.1) + xcpretty (~> 0.2, >= 0.0.7) + +PLATFORMS + ruby + +DEPENDENCIES + fastlane + +BUNDLED WITH + 2.1.4 diff --git a/ios/Podfile b/ios/Podfile new file mode 100644 index 0000000..4c88a11 --- /dev/null +++ b/ios/Podfile @@ -0,0 +1,66 @@ +# Uncomment this line to define a global platform for your project +platform :ios, '13.0' + +# CocoaPods analytics sends network stats synchronously affecting flutter build latency. +ENV['COCOAPODS_DISABLE_STATS'] = 'true' + +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" + end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches + end + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" +end + +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_ios_podfile_setup + +target 'Runner' do + use_frameworks! + use_modular_headers! + + flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) + + # From package https://pub.dev/packages/receive_sharing_intent + target 'FluffyChat Share' do + inherit! :search_paths + end +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + flutter_additional_ios_build_settings(target) + target.build_configurations.each do |config| + # ensure all dependencies are using SQLCipher instead of SQLite + xcconfig_path = config.base_configuration_reference.real_path + xcconfig = File.read(xcconfig_path) + new_xcconfig = xcconfig.sub(' -l"sqlite3"', '') + File.open(xcconfig_path, "w") { |file| file << new_xcconfig } + + config.build_settings['ENABLE_BITCODE'] = 'NO' + + # see https://github.com/flutter-webrtc/flutter-webrtc/issues/1054 + config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '11.0' + config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = 'arm64 i386' + + config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [ + '$(inherited)', + # dart: PermissionGroup.microphone + 'PERMISSION_MICROPHONE=1', + ] + end + end + flutter_post_install(installer) if defined?(flutter_post_install) +end diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 0000000..27e9bef --- /dev/null +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,862 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXBuildFile section */ + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 609046320A2D7D2B0D36583B /* Pods_FluffyChat_Share.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C9EB6E6475A19949A37A2634 /* Pods_FluffyChat_Share.framework */; }; + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; + AB0F2865DE230DE37373E0E0 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 50DEFC207B70632D9C56ED78 /* Pods_Runner.framework */; }; + C1005C45261071B5002F4F32 /* ShareViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1005C44261071B5002F4F32 /* ShareViewController.swift */; }; + C1005C48261071B5002F4F32 /* MainInterface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C1005C46261071B5002F4F32 /* MainInterface.storyboard */; }; + C1005C4C261071B5002F4F32 /* FluffyChat Share.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = C1005C42261071B5002F4F32 /* FluffyChat Share.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + C137635E2AD1446100A8F905 /* notification.caf in Resources */ = {isa = PBXBuildFile; fileRef = C137635D2AD1446100A8F905 /* notification.caf */; }; + C149567C25C7274F00A16396 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = C149567B25C7274F00A16396 /* GoogleService-Info.plist */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + C1005C4A261071B5002F4F32 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 97C146E61CF9000F007C117D /* Project object */; + proxyType = 1; + remoteGlobalIDString = C1005C41261071B5002F4F32; + remoteInfo = "FluffyChat Share"; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 9705A1C41CF9048500538489 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; + C1005C4D261071B5002F4F32 /* Embed App Extensions */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 13; + files = ( + C1005C4C261071B5002F4F32 /* FluffyChat Share.appex in Embed App Extensions */, + ); + name = "Embed App Extensions"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 09545B0C8C397F94966EA956 /* Pods-FluffyChat Share.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-FluffyChat Share.debug.xcconfig"; path = "Target Support Files/Pods-FluffyChat Share/Pods-FluffyChat Share.debug.xcconfig"; sourceTree = ""; }; + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 50DEFC207B70632D9C56ED78 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 58F7B95D036AD8E67B27588D /* Pods-FluffyChat Share.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-FluffyChat Share.profile.xcconfig"; path = "Target Support Files/Pods-FluffyChat Share/Pods-FluffyChat Share.profile.xcconfig"; sourceTree = ""; }; + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 76737C9A857D5FD6D2634A3F /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; + 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; + 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 9DB2F3524376810E74C799A8 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + C1005C42261071B5002F4F32 /* FluffyChat Share.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "FluffyChat Share.appex"; sourceTree = BUILT_PRODUCTS_DIR; }; + C1005C44261071B5002F4F32 /* ShareViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShareViewController.swift; sourceTree = ""; }; + C1005C47261071B5002F4F32 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/MainInterface.storyboard; sourceTree = ""; }; + C1005C49261071B5002F4F32 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + C1005C53261072D4002F4F32 /* FluffyChat Share.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "FluffyChat Share.entitlements"; sourceTree = ""; }; + C137635D2AD1446100A8F905 /* notification.caf */ = {isa = PBXFileReference; lastKnownFileType = file; path = notification.caf; sourceTree = ""; }; + C149567B25C7274F00A16396 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; + C149567D25C7276200A16396 /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = ""; }; + C9EB6E6475A19949A37A2634 /* Pods_FluffyChat_Share.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_FluffyChat_Share.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + EA246783222E02DD03959891 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + F3778959E67CDA0CDB0D97BC /* Pods-FluffyChat Share.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-FluffyChat Share.release.xcconfig"; path = "Target Support Files/Pods-FluffyChat Share/Pods-FluffyChat Share.release.xcconfig"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 97C146EB1CF9000F007C117D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + AB0F2865DE230DE37373E0E0 /* Pods_Runner.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + C1005C3F261071B5002F4F32 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 609046320A2D7D2B0D36583B /* Pods_FluffyChat_Share.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 075EE1BE25359E34308E0B78 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 50DEFC207B70632D9C56ED78 /* Pods_Runner.framework */, + C9EB6E6475A19949A37A2634 /* Pods_FluffyChat_Share.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 9740EEB11CF90186004384FC /* Flutter */ = { + isa = PBXGroup; + children = ( + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 9740EEB31CF90195004384FC /* Generated.xcconfig */, + ); + name = Flutter; + sourceTree = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + C1005C43261071B5002F4F32 /* FluffyChat Share */, + 97C146EF1CF9000F007C117D /* Products */, + E89DCAC000D371640E94E65B /* Pods */, + 075EE1BE25359E34308E0B78 /* Frameworks */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + C1005C42261071B5002F4F32 /* FluffyChat Share.appex */, + ); + name = Products; + sourceTree = ""; + }; + 97C146F01CF9000F007C117D /* Runner */ = { + isa = PBXGroup; + children = ( + C149567D25C7276200A16396 /* Runner.entitlements */, + 97C146FA1CF9000F007C117D /* Main.storyboard */, + 97C146FD1CF9000F007C117D /* Assets.xcassets */, + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, + 97C147021CF9000F007C117D /* Info.plist */, + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, + C149567B25C7274F00A16396 /* GoogleService-Info.plist */, + C137635D2AD1446100A8F905 /* notification.caf */, + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, + ); + path = Runner; + sourceTree = ""; + }; + C1005C43261071B5002F4F32 /* FluffyChat Share */ = { + isa = PBXGroup; + children = ( + C1005C53261072D4002F4F32 /* FluffyChat Share.entitlements */, + C1005C44261071B5002F4F32 /* ShareViewController.swift */, + C1005C46261071B5002F4F32 /* MainInterface.storyboard */, + C1005C49261071B5002F4F32 /* Info.plist */, + ); + path = "FluffyChat Share"; + sourceTree = ""; + }; + E89DCAC000D371640E94E65B /* Pods */ = { + isa = PBXGroup; + children = ( + 76737C9A857D5FD6D2634A3F /* Pods-Runner.debug.xcconfig */, + EA246783222E02DD03959891 /* Pods-Runner.release.xcconfig */, + 9DB2F3524376810E74C799A8 /* Pods-Runner.profile.xcconfig */, + 09545B0C8C397F94966EA956 /* Pods-FluffyChat Share.debug.xcconfig */, + F3778959E67CDA0CDB0D97BC /* Pods-FluffyChat Share.release.xcconfig */, + 58F7B95D036AD8E67B27588D /* Pods-FluffyChat Share.profile.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 97C146ED1CF9000F007C117D /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 8C9CCA7C5C45651F90C7BFDD /* [CP] Check Pods Manifest.lock */, + 9740EEB61CF901F6004384FC /* Run Script */, + 97C146EA1CF9000F007C117D /* Sources */, + 97C146EB1CF9000F007C117D /* Frameworks */, + 97C146EC1CF9000F007C117D /* Resources */, + C1005C4D261071B5002F4F32 /* Embed App Extensions */, + 9705A1C41CF9048500538489 /* Embed Frameworks */, + F9C8EE392B9AB471149C306E /* [CP] Embed Pods Frameworks */, + 064CBD7CE0D4CD6850C6880A /* [CP] Copy Pods Resources */, + 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + ); + buildRules = ( + ); + dependencies = ( + C1005C4B261071B5002F4F32 /* PBXTargetDependency */, + ); + name = Runner; + productName = Runner; + productReference = 97C146EE1CF9000F007C117D /* Runner.app */; + productType = "com.apple.product-type.application"; + }; + C1005C41261071B5002F4F32 /* FluffyChat Share */ = { + isa = PBXNativeTarget; + buildConfigurationList = C1005C51261071B5002F4F32 /* Build configuration list for PBXNativeTarget "FluffyChat Share" */; + buildPhases = ( + 67579C1EA0B5C7B918473158 /* [CP] Check Pods Manifest.lock */, + C1005C3E261071B5002F4F32 /* Sources */, + C1005C3F261071B5002F4F32 /* Frameworks */, + C1005C40261071B5002F4F32 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "FluffyChat Share"; + productName = "FluffyChat Share"; + productReference = C1005C42261071B5002F4F32 /* FluffyChat Share.appex */; + productType = "com.apple.product-type.app-extension"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 97C146E61CF9000F007C117D /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 1240; + LastUpgradeCheck = 1510; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 97C146ED1CF9000F007C117D = { + CreatedOnToolsVersion = 7.3.1; + LastSwiftMigration = 1100; + }; + C1005C41261071B5002F4F32 = { + CreatedOnToolsVersion = 12.4; + }; + }; + }; + buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 97C146E51CF9000F007C117D; + productRefGroup = 97C146EF1CF9000F007C117D /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 97C146ED1CF9000F007C117D /* Runner */, + C1005C41261071B5002F4F32 /* FluffyChat Share */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 97C146EC1CF9000F007C117D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + C149567C25C7274F00A16396 /* GoogleService-Info.plist in Resources */, + C137635E2AD1446100A8F905 /* notification.caf in Resources */, + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + C1005C40261071B5002F4F32 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + C1005C48261071B5002F4F32 /* MainInterface.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 064CBD7CE0D4CD6850C6880A /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Copy Pods Resources"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", + ); + name = "Thin Binary"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin\n"; + }; + 67579C1EA0B5C7B918473158 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-FluffyChat Share-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + 8C9CCA7C5C45651F90C7BFDD /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + 9740EEB61CF901F6004384FC /* Run Script */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Run Script"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build\n"; + }; + F9C8EE392B9AB471149C306E /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + C1005C3E261071B5002F4F32 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + C1005C45261071B5002F4F32 /* ShareViewController.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + C1005C4B261071B5002F4F32 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = C1005C41261071B5002F4F32 /* FluffyChat Share */; + targetProxy = C1005C4A261071B5002F4F32 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 97C146FA1CF9000F007C117D /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C146FB1CF9000F007C117D /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C147001CF9000F007C117D /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; + C1005C46261071B5002F4F32 /* MainInterface.storyboard */ = { + isa = PBXVariantGroup; + children = ( + C1005C47261071B5002F4F32 /* Base */, + ); + name = MainInterface.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 249021D3217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.1; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Profile; + }; + 249021D4217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 4NXF6Z997G; + ENABLE_BITCODE = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + MARKETING_VERSION = 0.32.1; + PRODUCT_BUNDLE_IDENTIFIER = im.fluffychat.app; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Profile; + }; + 97C147031CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.1; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 97C147041CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.1; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 97C147061CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 4NXF6Z997G; + ENABLE_BITCODE = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + MARKETING_VERSION = 0.32.1; + PRODUCT_BUNDLE_IDENTIFIER = im.fluffychat.app; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 97C147071CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 4NXF6Z997G; + ENABLE_BITCODE = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + MARKETING_VERSION = 0.32.1; + PRODUCT_BUNDLE_IDENTIFIER = im.fluffychat.app; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; + C1005C4E261071B5002F4F32 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 09545B0C8C397F94966EA956 /* Pods-FluffyChat Share.debug.xcconfig */; + buildSettings = { + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_ENTITLEMENTS = "FluffyChat Share/FluffyChat Share.entitlements"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 4NXF6Z997G; + GCC_C_LANGUAGE_STANDARD = gnu11; + INFOPLIST_FILE = "FluffyChat Share/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 14.4; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); + MARKETING_VERSION = 1.0.0; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = "im.fluffychat.app.FluffyChat-Share"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + C1005C4F261071B5002F4F32 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = F3778959E67CDA0CDB0D97BC /* Pods-FluffyChat Share.release.xcconfig */; + buildSettings = { + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_ENTITLEMENTS = "FluffyChat Share/FluffyChat Share.entitlements"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 4NXF6Z997G; + GCC_C_LANGUAGE_STANDARD = gnu11; + INFOPLIST_FILE = "FluffyChat Share/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 14.4; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); + MARKETING_VERSION = 1.0.0; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = "im.fluffychat.app.FluffyChat-Share"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; + C1005C50261071B5002F4F32 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 58F7B95D036AD8E67B27588D /* Pods-FluffyChat Share.profile.xcconfig */; + buildSettings = { + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_ENTITLEMENTS = "FluffyChat Share/FluffyChat Share.entitlements"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 4NXF6Z997G; + GCC_C_LANGUAGE_STANDARD = gnu11; + INFOPLIST_FILE = "FluffyChat Share/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 14.4; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); + MARKETING_VERSION = 1.0.0; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = "im.fluffychat.app.FluffyChat-Share"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Profile; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147031CF9000F007C117D /* Debug */, + 97C147041CF9000F007C117D /* Release */, + 249021D3217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147061CF9000F007C117D /* Debug */, + 97C147071CF9000F007C117D /* Release */, + 249021D4217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + C1005C51261071B5002F4F32 /* Build configuration list for PBXNativeTarget "FluffyChat Share" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C1005C4E261071B5002F4F32 /* Debug */, + C1005C4F261071B5002F4F32 /* Release */, + C1005C50261071B5002F4F32 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 97C146E61CF9000F007C117D /* Project object */; +} diff --git a/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..f9b0d7c --- /dev/null +++ b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 0000000..4f74653 --- /dev/null +++ b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/Runner.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..21a3cc1 --- /dev/null +++ b/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..f9b0d7c --- /dev/null +++ b/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/ios/Runner/AppDelegate.swift b/ios/Runner/AppDelegate.swift new file mode 100644 index 0000000..7f38bb2 --- /dev/null +++ b/ios/Runner/AppDelegate.swift @@ -0,0 +1,16 @@ +import UIKit +import Flutter + +@main +@objc class AppDelegate: FlutterAppDelegate { + override func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? + ) -> Bool { + GeneratedPluginRegistrant.register(with: self) + if #available(iOS 10.0, *) { + UNUserNotificationCenter.current().delegate = self as? UNUserNotificationCenterDelegate + } + return super.application(application, didFinishLaunchingWithOptions: launchOptions) + } +} diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..d36b1fa --- /dev/null +++ b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,122 @@ +{ + "images" : [ + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@3x.png", + "scale" : "3x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@3x.png", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@3x.png", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@2x.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@3x.png", + "scale" : "3x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@1x.png", + "scale" : "1x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@1x.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@1x.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@2x.png", + "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "Icon-App-83.5x83.5@2x.png", + "scale" : "2x" + }, + { + "size" : "1024x1024", + "idiom" : "ios-marketing", + "filename" : "Icon-App-1024x1024@1x.png", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png new file mode 100644 index 0000000..fb1434b Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png new file mode 100644 index 0000000..c1316a0 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png new file mode 100644 index 0000000..614e86e Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000..6470c4a Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png new file mode 100644 index 0000000..67e8718 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000..82f590c Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png new file mode 100644 index 0000000..82e6445 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png new file mode 100644 index 0000000..614e86e Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000..4cea61d Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 0000000..a526a33 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png new file mode 100644 index 0000000..bbf7645 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png new file mode 100644 index 0000000..cd69065 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png new file mode 100644 index 0000000..f3dd408 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png new file mode 100644 index 0000000..37766e7 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 0000000..a526a33 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000..a21531a Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png new file mode 100644 index 0000000..477aa97 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png new file mode 100644 index 0000000..9d3aaf7 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png new file mode 100644 index 0000000..f02c1af Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png new file mode 100644 index 0000000..ba0bc94 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png new file mode 100644 index 0000000..93bc652 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png differ diff --git a/ios/Runner/Assets.xcassets/LaunchBackground.imageset/Contents.json b/ios/Runner/Assets.xcassets/LaunchBackground.imageset/Contents.json new file mode 100644 index 0000000..fa31327 --- /dev/null +++ b/ios/Runner/Assets.xcassets/LaunchBackground.imageset/Contents.json @@ -0,0 +1,52 @@ +{ + "images" : [ + { + "filename" : "background.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "darkbackground.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ios/Runner/Assets.xcassets/LaunchBackground.imageset/background.png b/ios/Runner/Assets.xcassets/LaunchBackground.imageset/background.png new file mode 100644 index 0000000..e29b3b5 Binary files /dev/null and b/ios/Runner/Assets.xcassets/LaunchBackground.imageset/background.png differ diff --git a/ios/Runner/Assets.xcassets/LaunchBackground.imageset/darkbackground.png b/ios/Runner/Assets.xcassets/LaunchBackground.imageset/darkbackground.png new file mode 100644 index 0000000..1b5df34 Binary files /dev/null and b/ios/Runner/Assets.xcassets/LaunchBackground.imageset/darkbackground.png differ diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json new file mode 100644 index 0000000..00cabce --- /dev/null +++ b/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "LaunchImage.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "LaunchImage@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "LaunchImage@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png new file mode 100644 index 0000000..f4c0bdb Binary files /dev/null and b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png differ diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png new file mode 100644 index 0000000..dafa3b7 Binary files /dev/null and b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png differ diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png new file mode 100644 index 0000000..b627f52 Binary files /dev/null and b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png differ diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 0000000..89c2725 --- /dev/null +++ b/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md @@ -0,0 +1,5 @@ +# Launch Screen Assets + +You can customize the launch screen with your own desired assets by replacing the image files in this directory. + +You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. \ No newline at end of file diff --git a/ios/Runner/Base.lproj/LaunchScreen.storyboard b/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..fdc5a5e --- /dev/null +++ b/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ios/Runner/Base.lproj/Main.storyboard b/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 0000000..f3c2851 --- /dev/null +++ b/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/Runner/GoogleService-Info.plist b/ios/Runner/GoogleService-Info.plist new file mode 100644 index 0000000..917ea3b --- /dev/null +++ b/ios/Runner/GoogleService-Info.plist @@ -0,0 +1,34 @@ + + + + + CLIENT_ID + 865731724731-ofdr7e6m04murgb1bvchlj9oaos0q5i3.apps.googleusercontent.com + REVERSED_CLIENT_ID + com.googleusercontent.apps.865731724731-ofdr7e6m04murgb1bvchlj9oaos0q5i3 + API_KEY + AIzaSyA8ZUBcuny0HjPwF2Q2fvDyQTC5dG2VHlE + GCM_SENDER_ID + 865731724731 + PLIST_VERSION + 1 + BUNDLE_ID + im.fluffychat.app + PROJECT_ID + fluffychat-ef3e8 + STORAGE_BUCKET + fluffychat-ef3e8.appspot.com + IS_ADS_ENABLED + + IS_ANALYTICS_ENABLED + + IS_APPINVITE_ENABLED + + IS_GCM_ENABLED + + IS_SIGNIN_ENABLED + + GOOGLE_APP_ID + 1:865731724731:ios:79fd983ce46cb40c64309e + + \ No newline at end of file diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist new file mode 100644 index 0000000..c94401f --- /dev/null +++ b/ios/Runner/Info.plist @@ -0,0 +1,116 @@ + + + + + BGTaskSchedulerPermittedIdentifiers + + im.fluffychat.app + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + FluffyChat + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + fluffychat + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleSignature + ???? + CFBundleURLTypes + + + CFBundleTypeRole + Editor + CFBundleURLName + im.fluffychat.app.uris + CFBundleURLSchemes + + ShareMedia-$(PRODUCT_BUNDLE_IDENTIFIER) + im.fluffychat + matrix + + + + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + ITSAppUsesNonExemptEncryption + + LSRequiresIPhoneOS + + NSAppleMusicUsageDescription + Play audio and voice messages in the app. + NSBluetoothAlwaysUsageDescription + Play audio and voice messages via bluetooth devices. + NSBluetoothPeripheralUsageDescription + Play audio and voice messages on bluetooth devices + NSCalendarsUsageDescription + Share calendar dates with your contacts in FluffyChat. + NSCameraUsageDescription + Open the camera and take a picture to share them with your contacts on FluffyChat. + NSContactsUsageDescription + Share contacts with your contacts in FluffyChat. + NSFaceIDUsageDescription + FluffyChat uses an app lock for an additional security level + NSLocationAlwaysUsageDescription + Share your location with your contacts in FluffyChat. + NSLocationWhenInUseUsageDescription + Share your location with your contacts in FluffyChat. + NSLocationAlwaysAndWhenInUseUsageDescription + Share your location with your contacts in FluffyChat. + NSMicrophoneUsageDescription + Record voice message and share them with your contacts on FluffyChat. + NSMotionUsageDescription + Share motions with your contacts in FluffyChat. + NSPhotoLibraryUsageDescription + Open photos from your gallery and share them with your contacts on FluffyChat. + NSSpeechRecognitionUsageDescription + Share data with your contacts in FluffyChat. + UIBackgroundModes + + audio + fetch + processing + remote-notification + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIStatusBarHidden + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIViewControllerBasedStatusBarAppearance + + io.flutter.embedded_views_preview + + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + + CADisableMinimumFrameDurationOnPhone + + UIApplicationSupportsIndirectInputEvents + + + diff --git a/ios/Runner/Runner-Bridging-Header.h b/ios/Runner/Runner-Bridging-Header.h new file mode 100644 index 0000000..7335fdf --- /dev/null +++ b/ios/Runner/Runner-Bridging-Header.h @@ -0,0 +1 @@ +#import "GeneratedPluginRegistrant.h" \ No newline at end of file diff --git a/ios/Runner/Runner.entitlements b/ios/Runner/Runner.entitlements new file mode 100644 index 0000000..8407112 --- /dev/null +++ b/ios/Runner/Runner.entitlements @@ -0,0 +1,16 @@ + + + + + aps-environment + development + com.apple.developer.associated-domains + + applinks:example.com + + com.apple.security.application-groups + + group.im.fluffychat.app + + + diff --git a/ios/Runner/ar.lproj/LaunchScreen.strings b/ios/Runner/ar.lproj/LaunchScreen.strings new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ios/Runner/ar.lproj/LaunchScreen.strings @@ -0,0 +1 @@ + diff --git a/ios/Runner/ar.lproj/Main.strings b/ios/Runner/ar.lproj/Main.strings new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ios/Runner/ar.lproj/Main.strings @@ -0,0 +1 @@ + diff --git a/ios/Runner/ca.lproj/LaunchScreen.strings b/ios/Runner/ca.lproj/LaunchScreen.strings new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ios/Runner/ca.lproj/LaunchScreen.strings @@ -0,0 +1 @@ + diff --git a/ios/Runner/ca.lproj/Main.strings b/ios/Runner/ca.lproj/Main.strings new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ios/Runner/ca.lproj/Main.strings @@ -0,0 +1 @@ + diff --git a/ios/Runner/cs.lproj/LaunchScreen.strings b/ios/Runner/cs.lproj/LaunchScreen.strings new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ios/Runner/cs.lproj/LaunchScreen.strings @@ -0,0 +1 @@ + diff --git a/ios/Runner/cs.lproj/Main.strings b/ios/Runner/cs.lproj/Main.strings new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ios/Runner/cs.lproj/Main.strings @@ -0,0 +1 @@ + diff --git a/ios/Runner/de.lproj/LaunchScreen.strings b/ios/Runner/de.lproj/LaunchScreen.strings new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ios/Runner/de.lproj/LaunchScreen.strings @@ -0,0 +1 @@ + diff --git a/ios/Runner/de.lproj/Main.strings b/ios/Runner/de.lproj/Main.strings new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ios/Runner/de.lproj/Main.strings @@ -0,0 +1 @@ + diff --git a/ios/Runner/eo.lproj/LaunchScreen.strings b/ios/Runner/eo.lproj/LaunchScreen.strings new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ios/Runner/eo.lproj/LaunchScreen.strings @@ -0,0 +1 @@ + diff --git a/ios/Runner/eo.lproj/Main.strings b/ios/Runner/eo.lproj/Main.strings new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ios/Runner/eo.lproj/Main.strings @@ -0,0 +1 @@ + diff --git a/ios/Runner/es.lproj/LaunchScreen.strings b/ios/Runner/es.lproj/LaunchScreen.strings new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ios/Runner/es.lproj/LaunchScreen.strings @@ -0,0 +1 @@ + diff --git a/ios/Runner/es.lproj/Main.strings b/ios/Runner/es.lproj/Main.strings new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ios/Runner/es.lproj/Main.strings @@ -0,0 +1 @@ + diff --git a/ios/Runner/et.lproj/LaunchScreen.strings b/ios/Runner/et.lproj/LaunchScreen.strings new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ios/Runner/et.lproj/LaunchScreen.strings @@ -0,0 +1 @@ + diff --git a/ios/Runner/et.lproj/Main.strings b/ios/Runner/et.lproj/Main.strings new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ios/Runner/et.lproj/Main.strings @@ -0,0 +1 @@ + diff --git a/ios/Runner/eu.lproj/LaunchScreen.strings b/ios/Runner/eu.lproj/LaunchScreen.strings new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ios/Runner/eu.lproj/LaunchScreen.strings @@ -0,0 +1 @@ + diff --git a/ios/Runner/eu.lproj/Main.strings b/ios/Runner/eu.lproj/Main.strings new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ios/Runner/eu.lproj/Main.strings @@ -0,0 +1 @@ + diff --git a/ios/Runner/fr.lproj/LaunchScreen.strings b/ios/Runner/fr.lproj/LaunchScreen.strings new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ios/Runner/fr.lproj/LaunchScreen.strings @@ -0,0 +1 @@ + diff --git a/ios/Runner/fr.lproj/Main.strings b/ios/Runner/fr.lproj/Main.strings new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ios/Runner/fr.lproj/Main.strings @@ -0,0 +1 @@ + diff --git a/ios/Runner/gl.lproj/LaunchScreen.strings b/ios/Runner/gl.lproj/LaunchScreen.strings new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ios/Runner/gl.lproj/LaunchScreen.strings @@ -0,0 +1 @@ + diff --git a/ios/Runner/gl.lproj/Main.strings b/ios/Runner/gl.lproj/Main.strings new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ios/Runner/gl.lproj/Main.strings @@ -0,0 +1 @@ + diff --git a/ios/Runner/hr-HR.lproj/LaunchScreen.strings b/ios/Runner/hr-HR.lproj/LaunchScreen.strings new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ios/Runner/hr-HR.lproj/LaunchScreen.strings @@ -0,0 +1 @@ + diff --git a/ios/Runner/hr-HR.lproj/Main.strings b/ios/Runner/hr-HR.lproj/Main.strings new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ios/Runner/hr-HR.lproj/Main.strings @@ -0,0 +1 @@ + diff --git a/ios/Runner/hu-HU.lproj/LaunchScreen.strings b/ios/Runner/hu-HU.lproj/LaunchScreen.strings new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ios/Runner/hu-HU.lproj/LaunchScreen.strings @@ -0,0 +1 @@ + diff --git a/ios/Runner/hu-HU.lproj/Main.strings b/ios/Runner/hu-HU.lproj/Main.strings new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ios/Runner/hu-HU.lproj/Main.strings @@ -0,0 +1 @@ + diff --git a/ios/Runner/hu.lproj/LaunchScreen.strings b/ios/Runner/hu.lproj/LaunchScreen.strings new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ios/Runner/hu.lproj/LaunchScreen.strings @@ -0,0 +1 @@ + diff --git a/ios/Runner/hu.lproj/Main.strings b/ios/Runner/hu.lproj/Main.strings new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ios/Runner/hu.lproj/Main.strings @@ -0,0 +1 @@ + diff --git a/ios/Runner/hy.lproj/LaunchScreen.strings b/ios/Runner/hy.lproj/LaunchScreen.strings new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ios/Runner/hy.lproj/LaunchScreen.strings @@ -0,0 +1 @@ + diff --git a/ios/Runner/hy.lproj/Main.strings b/ios/Runner/hy.lproj/Main.strings new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ios/Runner/hy.lproj/Main.strings @@ -0,0 +1 @@ + diff --git a/ios/Runner/it.lproj/LaunchScreen.strings b/ios/Runner/it.lproj/LaunchScreen.strings new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ios/Runner/it.lproj/LaunchScreen.strings @@ -0,0 +1 @@ + diff --git a/ios/Runner/it.lproj/Main.strings b/ios/Runner/it.lproj/Main.strings new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ios/Runner/it.lproj/Main.strings @@ -0,0 +1 @@ + diff --git a/ios/Runner/ja.lproj/LaunchScreen.strings b/ios/Runner/ja.lproj/LaunchScreen.strings new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ios/Runner/ja.lproj/LaunchScreen.strings @@ -0,0 +1 @@ + diff --git a/ios/Runner/ja.lproj/Main.strings b/ios/Runner/ja.lproj/Main.strings new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ios/Runner/ja.lproj/Main.strings @@ -0,0 +1 @@ + diff --git a/ios/Runner/nb-NO.lproj/LaunchScreen.strings b/ios/Runner/nb-NO.lproj/LaunchScreen.strings new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ios/Runner/nb-NO.lproj/LaunchScreen.strings @@ -0,0 +1 @@ + diff --git a/ios/Runner/nb-NO.lproj/Main.strings b/ios/Runner/nb-NO.lproj/Main.strings new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ios/Runner/nb-NO.lproj/Main.strings @@ -0,0 +1 @@ + diff --git a/ios/Runner/notification.caf b/ios/Runner/notification.caf new file mode 100644 index 0000000..20fa944 Binary files /dev/null and b/ios/Runner/notification.caf differ diff --git a/ios/Runner/pl.lproj/LaunchScreen.strings b/ios/Runner/pl.lproj/LaunchScreen.strings new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ios/Runner/pl.lproj/LaunchScreen.strings @@ -0,0 +1 @@ + diff --git a/ios/Runner/pl.lproj/Main.strings b/ios/Runner/pl.lproj/Main.strings new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ios/Runner/pl.lproj/Main.strings @@ -0,0 +1 @@ + diff --git a/ios/Runner/pt.lproj/LaunchScreen.strings b/ios/Runner/pt.lproj/LaunchScreen.strings new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ios/Runner/pt.lproj/LaunchScreen.strings @@ -0,0 +1 @@ + diff --git a/ios/Runner/pt.lproj/Main.strings b/ios/Runner/pt.lproj/Main.strings new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ios/Runner/pt.lproj/Main.strings @@ -0,0 +1 @@ + diff --git a/ios/Runner/ru-RU.lproj/LaunchScreen.strings b/ios/Runner/ru-RU.lproj/LaunchScreen.strings new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ios/Runner/ru-RU.lproj/LaunchScreen.strings @@ -0,0 +1 @@ + diff --git a/ios/Runner/ru-RU.lproj/Main.strings b/ios/Runner/ru-RU.lproj/Main.strings new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ios/Runner/ru-RU.lproj/Main.strings @@ -0,0 +1 @@ + diff --git a/ios/Runner/sk-SK.lproj/LaunchScreen.strings b/ios/Runner/sk-SK.lproj/LaunchScreen.strings new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ios/Runner/sk-SK.lproj/LaunchScreen.strings @@ -0,0 +1 @@ + diff --git a/ios/Runner/sk-SK.lproj/Main.strings b/ios/Runner/sk-SK.lproj/Main.strings new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ios/Runner/sk-SK.lproj/Main.strings @@ -0,0 +1 @@ + diff --git a/ios/Runner/sv-SE.lproj/LaunchScreen.strings b/ios/Runner/sv-SE.lproj/LaunchScreen.strings new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ios/Runner/sv-SE.lproj/LaunchScreen.strings @@ -0,0 +1 @@ + diff --git a/ios/Runner/sv-SE.lproj/Main.strings b/ios/Runner/sv-SE.lproj/Main.strings new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ios/Runner/sv-SE.lproj/Main.strings @@ -0,0 +1 @@ + diff --git a/ios/Runner/tr.lproj/LaunchScreen.strings b/ios/Runner/tr.lproj/LaunchScreen.strings new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ios/Runner/tr.lproj/LaunchScreen.strings @@ -0,0 +1 @@ + diff --git a/ios/Runner/tr.lproj/Main.strings b/ios/Runner/tr.lproj/Main.strings new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ios/Runner/tr.lproj/Main.strings @@ -0,0 +1 @@ + diff --git a/ios/Runner/uk.lproj/LaunchScreen.strings b/ios/Runner/uk.lproj/LaunchScreen.strings new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ios/Runner/uk.lproj/LaunchScreen.strings @@ -0,0 +1 @@ + diff --git a/ios/Runner/uk.lproj/Main.strings b/ios/Runner/uk.lproj/Main.strings new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ios/Runner/uk.lproj/Main.strings @@ -0,0 +1 @@ + diff --git a/ios/Runner/vi-VN.lproj/LaunchScreen.strings b/ios/Runner/vi-VN.lproj/LaunchScreen.strings new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ios/Runner/vi-VN.lproj/LaunchScreen.strings @@ -0,0 +1 @@ + diff --git a/ios/Runner/vi-VN.lproj/Main.strings b/ios/Runner/vi-VN.lproj/Main.strings new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ios/Runner/vi-VN.lproj/Main.strings @@ -0,0 +1 @@ + diff --git a/ios/Runner/zh-Hans.lproj/LaunchScreen.strings b/ios/Runner/zh-Hans.lproj/LaunchScreen.strings new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ios/Runner/zh-Hans.lproj/LaunchScreen.strings @@ -0,0 +1 @@ + diff --git a/ios/Runner/zh-Hans.lproj/Main.strings b/ios/Runner/zh-Hans.lproj/Main.strings new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ios/Runner/zh-Hans.lproj/Main.strings @@ -0,0 +1 @@ + diff --git a/ios/fastlane/Appfile b/ios/fastlane/Appfile new file mode 100644 index 0000000..86dcebf --- /dev/null +++ b/ios/fastlane/Appfile @@ -0,0 +1,8 @@ +app_identifier("im.fluffychat.app") # The bundle identifier of your app +apple_id("christian-kussowski@posteo.de") # Your Apple email address + +itc_team_id("122628977") # App Store Connect Team ID +team_id("4NXF6Z997G") # Developer Portal Team ID + +# For more information about the Appfile, see: +# https://docs.fastlane.tools/advanced/#appfile diff --git a/ios/fastlane/Fastfile b/ios/fastlane/Fastfile new file mode 100644 index 0000000..6078ad5 --- /dev/null +++ b/ios/fastlane/Fastfile @@ -0,0 +1,44 @@ +# This file contains the fastlane.tools configuration +# You can find the documentation at https://docs.fastlane.tools +# +# For a list of all available actions, check out +# +# https://docs.fastlane.tools/actions +# +# For a list of all available plugins, check out +# +# https://docs.fastlane.tools/plugins/available-plugins +# + +# Uncomment the line if you want fastlane to automatically update itself +# update_fastlane + +default_platform(:ios) + +platform :ios do + desc "Push a new beta build to TestFlight" + lane :beta do + increment_build_number( + xcodeproj: "Runner.xcodeproj", + build_number: latest_testflight_build_number + 1 + ) + re = /version:\s([0-9]*\.[0-9]*\.[0-9]*)\+[0-9]*/i + config = File.read("../../pubspec.yaml") + version_name = config.match(re).captures[0] + increment_version_number(version_number: version_name) + build_app(workspace: "Runner.xcworkspace", scheme: "Runner") + upload_to_testflight( + distribute_external: true, + groups: "FluffyChat Betatest", + changelog: "This is a release candidate for FluffyChat. Please test if the app is overall in a good condition before we push this to production.", + ) + end +end + +lane :release do + capture_screenshots # generate new screenshots for the App Store + sync_code_signing(type: "appstore") # see code signing guide for more information + build_app(scheme: "Runner") + upload_to_app_store # upload your app to App Store Connect + slack(message: "Successfully uploaded a new App Store build") +end diff --git a/ios/fastlane/README.md b/ios/fastlane/README.md new file mode 100644 index 0000000..c7d6f91 --- /dev/null +++ b/ios/fastlane/README.md @@ -0,0 +1,37 @@ +fastlane documentation +================ +# Installation + +Make sure you have the latest version of the Xcode command line tools installed: + +``` +xcode-select --install +``` + +Install _fastlane_ using +``` +[sudo] gem install fastlane -NV +``` +or alternatively using `brew install fastlane` + +# Available Actions +### release +``` +fastlane release +``` + + +---- + +## iOS +### ios beta +``` +fastlane ios beta +``` +Push a new beta build to TestFlight + +---- + +This README.md is auto-generated and will be re-generated every time [fastlane](https://fastlane.tools) is run. +More information about fastlane can be found on [fastlane.tools](https://fastlane.tools). +The documentation of fastlane can be found on [docs.fastlane.tools](https://docs.fastlane.tools). diff --git a/ios/fastlane/report.xml b/ios/fastlane/report.xml new file mode 100644 index 0000000..aa3917b --- /dev/null +++ b/ios/fastlane/report.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/l10n.yaml b/l10n.yaml new file mode 100644 index 0000000..8cba8e1 --- /dev/null +++ b/l10n.yaml @@ -0,0 +1,9 @@ +arb-dir: assets/l10n +template-arb-file: intl_en.arb +output-localization-file: l10n.dart +output-class: L10n +preferred-supported-locales: ["en"] +use-deferred-loading: true +nullable-getter: false +synthetic-package: false +output-dir: lib/generated/l10n \ No newline at end of file diff --git a/lib/config/app_config.dart b/lib/config/app_config.dart new file mode 100644 index 0000000..501b5e2 --- /dev/null +++ b/lib/config/app_config.dart @@ -0,0 +1,115 @@ +import 'dart:ui'; + +import 'package:matrix/matrix.dart'; + +abstract class AppConfig { + static String _applicationName = 'Extera'; + + static String get applicationName => _applicationName; + static String? _applicationWelcomeMessage; + + static String? get applicationWelcomeMessage => _applicationWelcomeMessage; + static String _defaultHomeserver = 'extera.xyz'; + + static String get defaultHomeserver => _defaultHomeserver; + static double fontSizeFactor = 1; + static const Color chatColor = primaryColor; + static Color? colorSchemeSeed = primaryColor; + static const double messageFontSize = 16.0; + static const bool allowOtherHomeservers = true; + static const bool enableRegistration = true; + static const Color primaryColor = Color(0xFF5625BA); + static const Color primaryColorLight = Color(0xFFCCBDEA); + static const Color secondaryColor = Color(0xFF41a2bc); + static String _privacyUrl = + 'https://github.com/krille-chan/fluffychat/blob/main/PRIVACY.md'; + + static String get privacyUrl => _privacyUrl; + static const String website = 'https://extera.xyz'; + static const String enablePushTutorial = + 'https://github.com/krille-chan/fluffychat/wiki/Push-Notifications-without-Google-Services'; + static const String encryptionTutorial = + 'https://github.com/krille-chan/fluffychat/wiki/How-to-use-end-to-end-encryption-in-FluffyChat'; + static const String startChatTutorial = + 'https://github.com/krille-chan/fluffychat/wiki/How-to-Find-Users-in-FluffyChat'; + static const String appId = 'xyz.extera.next'; + static const String appOpenUrlScheme = 'xyz.extera.next'; + static String _webBaseUrl = 'https://fluffychat.im/web'; + + static String get webBaseUrl => _webBaseUrl; + static const String sourceCodeUrl = + 'https://github.com/krille-chan/fluffychat'; + static const String supportUrl = + 'https://github.com/krille-chan/fluffychat/issues'; + static const String changelogUrl = + 'https://github.com/krille-chan/fluffychat/blob/main/CHANGELOG.md'; + static final Uri newIssueUrl = Uri( + scheme: 'https', + host: 'github.com', + path: '/krille-chan/fluffychat/issues/new', + ); + static bool renderHtml = true; + static bool hideRedactedEvents = false; + static bool hideUnknownEvents = true; + static bool hideUnimportantStateEvents = true; + static bool separateChatTypes = false; + static bool autoplayImages = true; + static bool sendTypingNotifications = true; + static bool sendPublicReadReceipts = true; + static bool swipeRightToLeftToReply = true; + static bool hideAvatarsInInvites = true; + static bool? sendOnEnter; + static bool showPresences = true; + static bool experimentalVoip = false; + static const bool hideTypingUsernames = false; + static const bool hideAllStateEvents = false; + static const String inviteLinkPrefix = 'https://matrix.to/#/'; + static const String deepLinkPrefix = 'xyz.extera.next://chat/'; + static const String schemePrefix = 'matrix:'; + static const String pushNotificationsChannelId = 'exteranext_push'; + static const String pushNotificationsAppId = 'xyz.extera.next'; + static const double borderRadius = 18.0; + static const double columnWidth = 360.0; + static final Uri homeserverList = Uri( + scheme: 'https', + host: 'servers.joinmatrix.org', + path: 'servers.json', + ); + + static void loadFromJson(Map json) { + if (json['chat_color'] != null) { + try { + colorSchemeSeed = Color(json['chat_color']); + } catch (e) { + Logs().w( + 'Invalid color in config.json! Please make sure to define the color in this format: "0xffdd0000"', + e, + ); + } + } + if (json['application_name'] is String) { + _applicationName = json['application_name']; + } + if (json['application_welcome_message'] is String) { + _applicationWelcomeMessage = json['application_welcome_message']; + } + if (json['default_homeserver'] is String) { + _defaultHomeserver = json['default_homeserver']; + } + if (json['privacy_url'] is String) { + _privacyUrl = json['privacy_url']; + } + if (json['web_base_url'] is String) { + _webBaseUrl = json['web_base_url']; + } + if (json['render_html'] is bool) { + renderHtml = json['render_html']; + } + if (json['hide_redacted_events'] is bool) { + hideRedactedEvents = json['hide_redacted_events']; + } + if (json['hide_unknown_events'] is bool) { + hideUnknownEvents = json['hide_unknown_events']; + } + } +} diff --git a/lib/config/app_emojis.dart b/lib/config/app_emojis.dart new file mode 100644 index 0000000..3c38e2f --- /dev/null +++ b/lib/config/app_emojis.dart @@ -0,0 +1,30 @@ +abstract class AppEmojis { + static const List emojis = [ + '👍', + '😊', + '😀', + '❤️', + '😍', + '😘', + '😇', + '😅', + '😭', + '😜', + '😱', + '😆', + '😉', + '😡', + '👋', + '🤔', + '🙁', + '🥳', + '😟', + '😄', + '😁', + '🙄', + '😂', + '🤣', + '😌', + '😬', + ]; +} diff --git a/lib/config/isrg_x1.dart b/lib/config/isrg_x1.dart new file mode 100644 index 0000000..6a6d0ac --- /dev/null +++ b/lib/config/isrg_x1.dart @@ -0,0 +1,32 @@ +// ignore: constant_identifier_names +const String ISRG_X1 = """-----BEGIN CERTIFICATE----- +MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw +TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh +cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4 +WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu +ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY +MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc +h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+ +0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U +A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW +T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH +B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC +B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv +KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn +OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn +jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw +qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI +rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq +hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL +ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ +3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK +NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5 +ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur +TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC +jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc +oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq +4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA +mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d +emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc= +-----END CERTIFICATE-----"""; diff --git a/lib/config/routes.dart b/lib/config/routes.dart new file mode 100644 index 0000000..644fb08 --- /dev/null +++ b/lib/config/routes.dart @@ -0,0 +1,496 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; + +import 'package:go_router/go_router.dart'; + +import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/pages/archive/archive.dart'; +import 'package:fluffychat/pages/chat/chat.dart'; +import 'package:fluffychat/pages/chat_access_settings/chat_access_settings_controller.dart'; +import 'package:fluffychat/pages/chat_details/chat_details.dart'; +import 'package:fluffychat/pages/chat_encryption_settings/chat_encryption_settings.dart'; +import 'package:fluffychat/pages/chat_list/chat_list.dart'; +import 'package:fluffychat/pages/chat_members/chat_members.dart'; +import 'package:fluffychat/pages/chat_permissions_settings/chat_permissions_settings.dart'; +import 'package:fluffychat/pages/chat_search/chat_search_page.dart'; +import 'package:fluffychat/pages/device_settings/device_settings.dart'; +import 'package:fluffychat/pages/homeserver_picker/homeserver_picker.dart'; +import 'package:fluffychat/pages/invitation_selection/invitation_selection.dart'; +import 'package:fluffychat/pages/login/login.dart'; +import 'package:fluffychat/pages/new_group/new_group.dart'; +import 'package:fluffychat/pages/new_private_chat/new_private_chat.dart'; +import 'package:fluffychat/pages/settings/settings.dart'; +import 'package:fluffychat/pages/settings_3pid/settings_3pid.dart'; +import 'package:fluffychat/pages/settings_chat/settings_chat.dart'; +import 'package:fluffychat/pages/settings_emotes/settings_emotes.dart'; +import 'package:fluffychat/pages/settings_homeserver/settings_homeserver.dart'; +import 'package:fluffychat/pages/settings_ignore_list/settings_ignore_list.dart'; +import 'package:fluffychat/pages/settings_multiple_emotes/settings_multiple_emotes.dart'; +import 'package:fluffychat/pages/settings_notifications/settings_notifications.dart'; +import 'package:fluffychat/pages/settings_password/settings_password.dart'; +import 'package:fluffychat/pages/settings_security/settings_security.dart'; +import 'package:fluffychat/pages/settings_style/settings_style.dart'; +import 'package:fluffychat/widgets/config_viewer.dart'; +import 'package:fluffychat/widgets/layouts/empty_page.dart'; +import 'package:fluffychat/widgets/layouts/two_column_layout.dart'; +import 'package:fluffychat/widgets/log_view.dart'; +import 'package:fluffychat/widgets/matrix.dart'; +import 'package:fluffychat/widgets/share_scaffold_dialog.dart'; + +abstract class AppRoutes { + static FutureOr loggedInRedirect( + BuildContext context, + GoRouterState state, + ) => + Matrix.of(context).client.isLogged() ? '/rooms' : null; + + static FutureOr loggedOutRedirect( + BuildContext context, + GoRouterState state, + ) => + Matrix.of(context).client.isLogged() ? null : '/home'; + + AppRoutes(); + + static final List routes = [ + GoRoute( + path: '/', + redirect: (context, state) => + Matrix.of(context).client.isLogged() ? '/rooms' : '/home', + ), + GoRoute( + path: '/home', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + const HomeserverPicker(addMultiAccount: false), + ), + redirect: loggedInRedirect, + routes: [ + GoRoute( + path: 'login', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + const Login(), + ), + redirect: loggedInRedirect, + ), + ], + ), + GoRoute( + path: '/logs', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + const LogViewer(), + ), + ), + GoRoute( + path: '/configs', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + const ConfigViewer(), + ), + ), + ShellRoute( + // Never use a transition on the shell route. Changing the PageBuilder + // here based on a MediaQuery causes the child to briefly be rendered + // twice with the same GlobalKey, blowing up the rendering. + pageBuilder: (context, state, child) => noTransitionPageBuilder( + context, + state, + FluffyThemes.isColumnMode(context) && + state.fullPath?.startsWith('/rooms/settings') == false + ? TwoColumnLayout( + mainView: ChatList( + activeChat: state.pathParameters['roomid'], + displayNavigationRail: + state.path?.startsWith('/rooms/settings') != true, + ), + sideView: child, + ) + : child, + ), + routes: [ + GoRoute( + path: '/rooms', + redirect: loggedOutRedirect, + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + FluffyThemes.isColumnMode(context) + ? const EmptyPage() + : ChatList( + activeChat: state.pathParameters['roomid'], + ), + ), + routes: [ + GoRoute( + path: 'archive', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + const Archive(), + ), + routes: [ + GoRoute( + path: ':roomid', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + ChatPage( + roomId: state.pathParameters['roomid']!, + eventId: state.uri.queryParameters['event'], + ), + ), + redirect: loggedOutRedirect, + ), + ], + redirect: loggedOutRedirect, + ), + GoRoute( + path: 'newprivatechat', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + const NewPrivateChat(), + ), + redirect: loggedOutRedirect, + ), + GoRoute( + path: 'newgroup', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + const NewGroup(), + ), + redirect: loggedOutRedirect, + ), + GoRoute( + path: 'newspace', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + const NewGroup(createGroupType: CreateGroupType.space), + ), + redirect: loggedOutRedirect, + ), + ShellRoute( + pageBuilder: (context, state, child) => defaultPageBuilder( + context, + state, + FluffyThemes.isColumnMode(context) + ? TwoColumnLayout( + mainView: Settings(key: state.pageKey), + sideView: child, + ) + : child, + ), + routes: [ + GoRoute( + path: 'settings', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + FluffyThemes.isColumnMode(context) + ? const EmptyPage() + : const Settings(), + ), + routes: [ + GoRoute( + path: 'notifications', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + const SettingsNotifications(), + ), + redirect: loggedOutRedirect, + ), + GoRoute( + path: 'style', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + const SettingsStyle(), + ), + redirect: loggedOutRedirect, + ), + GoRoute( + path: 'devices', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + const DevicesSettings(), + ), + redirect: loggedOutRedirect, + ), + GoRoute( + path: 'chat', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + const SettingsChat(), + ), + routes: [ + GoRoute( + path: 'emotes', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + const EmotesSettings(), + ), + ), + ], + redirect: loggedOutRedirect, + ), + GoRoute( + path: 'addaccount', + redirect: loggedOutRedirect, + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + const HomeserverPicker(addMultiAccount: true), + ), + routes: [ + GoRoute( + path: 'login', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + const Login(), + ), + redirect: loggedOutRedirect, + ), + ], + ), + GoRoute( + path: 'homeserver', + pageBuilder: (context, state) { + return defaultPageBuilder( + context, + state, + const SettingsHomeserver(), + ); + }, + redirect: loggedOutRedirect, + ), + GoRoute( + path: 'security', + redirect: loggedOutRedirect, + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + const SettingsSecurity(), + ), + routes: [ + GoRoute( + path: 'password', + pageBuilder: (context, state) { + return defaultPageBuilder( + context, + state, + const SettingsPassword(), + ); + }, + redirect: loggedOutRedirect, + ), + GoRoute( + path: 'ignorelist', + pageBuilder: (context, state) { + return defaultPageBuilder( + context, + state, + SettingsIgnoreList( + initialUserId: state.extra?.toString(), + ), + ); + }, + redirect: loggedOutRedirect, + ), + GoRoute( + path: '3pid', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + const Settings3Pid(), + ), + redirect: loggedOutRedirect, + ), + ], + ), + ], + redirect: loggedOutRedirect, + ), + ], + ), + GoRoute( + path: ':roomid', + pageBuilder: (context, state) { + final body = state.uri.queryParameters['body']; + var shareItems = state.extra is List + ? state.extra as List + : null; + if (body != null && body.isNotEmpty) { + shareItems ??= []; + shareItems.add(TextShareItem(body)); + } + return defaultPageBuilder( + context, + state, + ChatPage( + roomId: state.pathParameters['roomid']!, + shareItems: shareItems, + eventId: state.uri.queryParameters['event'], + ), + ); + }, + redirect: loggedOutRedirect, + routes: [ + GoRoute( + path: 'search', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + ChatSearchPage( + roomId: state.pathParameters['roomid']!, + ), + ), + redirect: loggedOutRedirect, + ), + GoRoute( + path: 'encryption', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + const ChatEncryptionSettings(), + ), + redirect: loggedOutRedirect, + ), + GoRoute( + path: 'invite', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + InvitationSelection( + roomId: state.pathParameters['roomid']!, + ), + ), + redirect: loggedOutRedirect, + ), + GoRoute( + path: 'details', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + ChatDetails( + roomId: state.pathParameters['roomid']!, + ), + ), + routes: [ + GoRoute( + path: 'access', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + ChatAccessSettings( + roomId: state.pathParameters['roomid']!, + ), + ), + redirect: loggedOutRedirect, + ), + GoRoute( + path: 'members', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + ChatMembersPage( + roomId: state.pathParameters['roomid']!, + ), + ), + redirect: loggedOutRedirect, + ), + GoRoute( + path: 'permissions', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + const ChatPermissionsSettings(), + ), + redirect: loggedOutRedirect, + ), + GoRoute( + path: 'invite', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + InvitationSelection( + roomId: state.pathParameters['roomid']!, + ), + ), + redirect: loggedOutRedirect, + ), + GoRoute( + path: 'multiple_emotes', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + const MultipleEmotesSettings(), + ), + redirect: loggedOutRedirect, + ), + GoRoute( + path: 'emotes', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + const EmotesSettings(), + ), + redirect: loggedOutRedirect, + ), + GoRoute( + path: 'emotes/:state_key', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + const EmotesSettings(), + ), + redirect: loggedOutRedirect, + ), + ], + redirect: loggedOutRedirect, + ), + ], + ), + ], + ), + ], + ), + ]; + + static Page noTransitionPageBuilder( + BuildContext context, + GoRouterState state, + Widget child, + ) => + NoTransitionPage( + key: state.pageKey, + restorationId: state.pageKey.value, + child: child, + ); + + static Page defaultPageBuilder( + BuildContext context, + GoRouterState state, + Widget child, + ) => + FluffyThemes.isColumnMode(context) + ? noTransitionPageBuilder(context, state, child) + : MaterialPage( + key: state.pageKey, + restorationId: state.pageKey.value, + child: child, + ); +} diff --git a/lib/config/setting_keys.dart b/lib/config/setting_keys.dart new file mode 100644 index 0000000..817c3f0 --- /dev/null +++ b/lib/config/setting_keys.dart @@ -0,0 +1,98 @@ +import 'package:shared_preferences/shared_preferences.dart'; + +abstract class SettingKeys { + static const String hideAvatarsInInvites = 'xyz.extera.next.hideAvatarsInInvites'; + static const String pureBlack = 'xyz.extera.next.pureBlack'; + static const String renderHtml = 'chat.fluffy.renderHtml'; + static const String hideRedactedEvents = 'chat.fluffy.hideRedactedEvents'; + static const String hideUnknownEvents = 'chat.fluffy.hideUnknownEvents'; + static const String hideUnimportantStateEvents = + 'chat.fluffy.hideUnimportantStateEvents'; + static const String separateChatTypes = 'chat.fluffy.separateChatTypes'; + static const String sentry = 'sentry'; + static const String theme = 'theme'; + static const String amoledEnabled = 'amoled_enabled'; + static const String codeLanguage = 'code_language'; + static const String showNoGoogle = 'chat.fluffy.show_no_google'; + static const String fontSizeFactor = 'chat.fluffy.font_size_factor'; + static const String showNoPid = 'chat.fluffy.show_no_pid'; + static const String databasePassword = 'database-password'; + static const String appLockKey = 'chat.fluffy.app_lock'; + static const String unifiedPushRegistered = + 'chat.fluffy.unifiedpush.registered'; + static const String unifiedPushEndpoint = 'chat.fluffy.unifiedpush.endpoint'; + static const String ownStatusMessage = 'chat.fluffy.status_msg'; + static const String dontAskForBootstrapKey = + 'chat.fluffychat.dont_ask_bootstrap'; + static const String autoplayImages = 'chat.fluffy.autoplay_images'; + static const String sendTypingNotifications = + 'chat.fluffy.send_typing_notifications'; + static const String sendPublicReadReceipts = + 'chat.fluffy.send_public_read_receipts'; + static const String sendOnEnter = 'chat.fluffy.send_on_enter'; + static const String swipeRightToLeftToReply = + 'chat.fluffy.swipeRightToLeftToReply'; + static const String experimentalVoip = 'chat.fluffy.experimental_voip'; + static const String showPresences = 'chat.fluffy.show_presences'; +} + +enum AppSettings { + audioRecordingNumChannels('audioRecordingNumChannels', 1), + audioRecordingAutoGain('audioRecordingAutoGain', true), + audioRecordingEchoCancel('audioRecordingEchoCancel', false), + audioRecordingNoiseSuppress('audioRecordingNoiseSuppress', true), + audioRecordingBitRate('audioRecordingBitRate', 64000), + audioRecordingSamplingRate('audioRecordingSamplingRate', 44100), + pushNotificationsGatewayUrl( + 'pushNotificationsGatewayUrl', + 'https://push.fluffychat.im/_matrix/push/v1/notify', + ), + pushNotificationsPusherFormat( + 'pushNotificationsPusherFormat', + 'event_id_only', + ), + shareKeysWith('chat.fluffy.share_keys_with_2', 'all'), + noEncryptionWarningShown( + 'chat.fluffy.no_encryption_warning_shown', + false, + ), + displayChatDetailsColumn( + 'chat.fluffy.display_chat_details_column', + false, + ); + + final String key; + final T defaultValue; + + const AppSettings(this.key, this.defaultValue); +} + +extension AppSettingsBoolExtension on AppSettings { + bool getItem(SharedPreferences store) => store.getBool(key) ?? defaultValue; + + Future setItem(SharedPreferences store, bool value) => + store.setBool(key, value); +} + +extension AppSettingsStringExtension on AppSettings { + String getItem(SharedPreferences store) => + store.getString(key) ?? defaultValue; + + Future setItem(SharedPreferences store, String value) => + store.setString(key, value); +} + +extension AppSettingsIntExtension on AppSettings { + int getItem(SharedPreferences store) => store.getInt(key) ?? defaultValue; + + Future setItem(SharedPreferences store, int value) => + store.setInt(key, value); +} + +extension AppSettingsDoubleExtension on AppSettings { + double getItem(SharedPreferences store) => + store.getDouble(key) ?? defaultValue; + + Future setItem(SharedPreferences store, double value) => + store.setDouble(key, value); +} diff --git a/lib/config/themes.dart b/lib/config/themes.dart new file mode 100644 index 0000000..87b383b --- /dev/null +++ b/lib/config/themes.dart @@ -0,0 +1,178 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +import 'app_config.dart'; + +abstract class FluffyThemes { + static const double columnWidth = 380.0; + + static const double navRailWidth = 80.0; + + static bool isColumnModeByWidth(double width) => + width > columnWidth * 2 + navRailWidth; + + static bool isColumnMode(BuildContext context) => + isColumnModeByWidth(MediaQuery.of(context).size.width); + + static bool isThreeColumnMode(BuildContext context) => + MediaQuery.of(context).size.width > FluffyThemes.columnWidth * 3.5; + + static LinearGradient backgroundGradient( + BuildContext context, + int alpha, + ) { + final colorScheme = Theme.of(context).colorScheme; + return LinearGradient( + begin: Alignment.topCenter, + colors: [ + colorScheme.primaryContainer.withAlpha(alpha), + colorScheme.secondaryContainer.withAlpha(alpha), + colorScheme.tertiaryContainer.withAlpha(alpha), + colorScheme.primaryContainer.withAlpha(alpha), + ], + ); + } + + static const Duration animationDuration = Duration(milliseconds: 250); + static const Curve animationCurve = Curves.easeInOut; + + static ThemeData buildTheme( + BuildContext context, + Brightness brightness, [ + Color? seed, + bool? pureBlack, + ]) { + final extraDarkColors = (brightness == Brightness.dark && pureBlack == true) + ? { + 'surface': const Color.fromARGB(255, 0, 0, 0), + 'surfaceBright': const Color.fromARGB(255, 0, 0, 0), + 'surfaceContainer': const Color.fromARGB(255, 22, 22, 22), + 'surfaceContainerHigh': const Color.fromARGB(255, 33, 33, 33), + 'surfaceContainerHighest': const Color.fromARGB(255, 33, 33, 33), + 'surfaceContainerLow': const Color.fromARGB(255, 22, 22, 22), + 'surfaceContainerLowest': const Color.fromARGB(255, 22, 22, 22), + 'surfaceDim': const Color.fromARGB(255, 0, 0, 0), + 'surfaceTint': const Color.fromARGB(255, 11, 11, 11), + 'surfaceVariant': const Color.fromARGB(255, 0, 0, 0), + 'background': const Color.fromARGB(255, 0, 0, 0), + } + : {}; + + final colorScheme = ColorScheme.fromSeed( + brightness: brightness, + seedColor: seed ?? AppConfig.colorSchemeSeed ?? AppConfig.primaryColor, + surface: extraDarkColors['surface'], + surfaceBright: extraDarkColors['surfaceBright'], + surfaceContainer: extraDarkColors['surfaceContainer'], + surfaceContainerHigh: extraDarkColors['surfaceContainerHigh'], + surfaceContainerHighest: extraDarkColors['surfaceContainerHighest'], + surfaceContainerLow: extraDarkColors['surfaceContainerLow'], + surfaceContainerLowest: extraDarkColors['surfaceContainerLowest'], + surfaceDim: extraDarkColors['surfaceDim'], + surfaceTint: extraDarkColors['surfaceTint'], + surfaceVariant: extraDarkColors['surfaceVariant'], + background: extraDarkColors['background'], + ); + final isColumnMode = FluffyThemes.isColumnMode(context); + return ThemeData( + visualDensity: VisualDensity.standard, + useMaterial3: true, + brightness: brightness, + colorScheme: colorScheme, + dividerColor: brightness == Brightness.dark + ? colorScheme.surfaceContainerHighest + : colorScheme.surfaceContainer, + popupMenuTheme: PopupMenuThemeData( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(AppConfig.borderRadius), + ), + ), + segmentedButtonTheme: SegmentedButtonThemeData( + style: SegmentedButton.styleFrom( + iconColor: colorScheme.onSurface, + disabledIconColor: colorScheme.onSurface, + ), + ), + textSelectionTheme: TextSelectionThemeData( + selectionColor: colorScheme.onSurface.withAlpha(128), + selectionHandleColor: colorScheme.secondary, + ), + inputDecorationTheme: InputDecorationTheme( + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(AppConfig.borderRadius), + ), + contentPadding: const EdgeInsets.all(12), + ), + chipTheme: ChipThemeData( + showCheckmark: false, + backgroundColor: colorScheme.surfaceContainer, + side: BorderSide.none, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(AppConfig.borderRadius), + ), + ), + appBarTheme: AppBarTheme( + toolbarHeight: isColumnMode ? 72 : 56, + shadowColor: + isColumnMode ? colorScheme.surfaceContainer.withAlpha(128) : null, + surfaceTintColor: isColumnMode ? colorScheme.surface : null, + backgroundColor: isColumnMode ? colorScheme.surface : null, + systemOverlayStyle: SystemUiOverlayStyle( + statusBarColor: Colors.transparent, + statusBarIconBrightness: brightness.reversed, + statusBarBrightness: brightness, + systemNavigationBarIconBrightness: brightness.reversed, + systemNavigationBarColor: colorScheme.surface, + ), + ), + outlinedButtonTheme: OutlinedButtonThemeData( + style: OutlinedButton.styleFrom( + side: BorderSide( + width: 1, + color: colorScheme.primary, + ), + shape: RoundedRectangleBorder( + side: BorderSide(color: colorScheme.primary), + borderRadius: BorderRadius.circular(AppConfig.borderRadius / 2), + ), + ), + ), + snackBarTheme: isColumnMode + ? const SnackBarThemeData( + behavior: SnackBarBehavior.floating, + width: FluffyThemes.columnWidth * 1.5, + ) + : const SnackBarThemeData(behavior: SnackBarBehavior.floating), + elevatedButtonTheme: ElevatedButtonThemeData( + style: ElevatedButton.styleFrom( + backgroundColor: colorScheme.secondaryContainer, + foregroundColor: colorScheme.onSecondaryContainer, + elevation: 0, + padding: const EdgeInsets.all(16), + textStyle: const TextStyle(fontSize: 16), + ), + ), + ); + } +} + +extension on Brightness { + Brightness get reversed => + this == Brightness.dark ? Brightness.light : Brightness.dark; +} + +extension BubbleColorTheme on ThemeData { + Color get bubbleColor => brightness == Brightness.light + ? colorScheme.primary + : colorScheme.primaryContainer; + + Color get onBubbleColor => brightness == Brightness.light + ? colorScheme.onPrimary + : colorScheme.onPrimaryContainer; + + Color get secondaryBubbleColor => HSLColor.fromColor( + brightness == Brightness.light + ? colorScheme.tertiary + : colorScheme.tertiaryContainer, + ).withSaturation(0.5).toColor(); +} diff --git a/lib/generated/l10n/l10n.dart b/lib/generated/l10n/l10n.dart new file mode 100644 index 0000000..9df3b9f --- /dev/null +++ b/lib/generated/l10n/l10n.dart @@ -0,0 +1,5108 @@ +import 'dart:async'; + +import 'package:flutter/widgets.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:intl/intl.dart' as intl; + +import 'l10n_ar.dart' deferred as l10n_ar; +import 'l10n_be.dart' deferred as l10n_be; +import 'l10n_bn.dart' deferred as l10n_bn; +import 'l10n_bo.dart' deferred as l10n_bo; +import 'l10n_ca.dart' deferred as l10n_ca; +import 'l10n_cs.dart' deferred as l10n_cs; +import 'l10n_de.dart' deferred as l10n_de; +import 'l10n_el.dart' deferred as l10n_el; +import 'l10n_en.dart' deferred as l10n_en; +import 'l10n_eo.dart' deferred as l10n_eo; +import 'l10n_es.dart' deferred as l10n_es; +import 'l10n_et.dart' deferred as l10n_et; +import 'l10n_eu.dart' deferred as l10n_eu; +import 'l10n_fa.dart' deferred as l10n_fa; +import 'l10n_fi.dart' deferred as l10n_fi; +import 'l10n_fil.dart' deferred as l10n_fil; +import 'l10n_fr.dart' deferred as l10n_fr; +import 'l10n_ga.dart' deferred as l10n_ga; +import 'l10n_gl.dart' deferred as l10n_gl; +import 'l10n_he.dart' deferred as l10n_he; +import 'l10n_hi.dart' deferred as l10n_hi; +import 'l10n_hr.dart' deferred as l10n_hr; +import 'l10n_hu.dart' deferred as l10n_hu; +import 'l10n_ia.dart' deferred as l10n_ia; +import 'l10n_id.dart' deferred as l10n_id; +import 'l10n_ie.dart' deferred as l10n_ie; +import 'l10n_it.dart' deferred as l10n_it; +import 'l10n_ja.dart' deferred as l10n_ja; +import 'l10n_ka.dart' deferred as l10n_ka; +import 'l10n_ko.dart' deferred as l10n_ko; +import 'l10n_lt.dart' deferred as l10n_lt; +import 'l10n_lv.dart' deferred as l10n_lv; +import 'l10n_nb.dart' deferred as l10n_nb; +import 'l10n_nl.dart' deferred as l10n_nl; +import 'l10n_pl.dart' deferred as l10n_pl; +import 'l10n_pt.dart' deferred as l10n_pt; +import 'l10n_ro.dart' deferred as l10n_ro; +import 'l10n_ru.dart' deferred as l10n_ru; +import 'l10n_sk.dart' deferred as l10n_sk; +import 'l10n_sl.dart' deferred as l10n_sl; +import 'l10n_sr.dart' deferred as l10n_sr; +import 'l10n_sv.dart' deferred as l10n_sv; +import 'l10n_ta.dart' deferred as l10n_ta; +import 'l10n_te.dart' deferred as l10n_te; +import 'l10n_th.dart' deferred as l10n_th; +import 'l10n_tr.dart' deferred as l10n_tr; +import 'l10n_uk.dart' deferred as l10n_uk; +import 'l10n_vi.dart' deferred as l10n_vi; +import 'l10n_zh.dart' deferred as l10n_zh; + +// ignore_for_file: type=lint + +/// Callers can lookup localized strings with an instance of L10n +/// returned by `L10n.of(context)`. +/// +/// Applications need to include `L10n.delegate()` in their app's +/// `localizationDelegates` list, and the locales they support in the app's +/// `supportedLocales` list. For example: +/// +/// ```dart +/// import 'l10n/l10n.dart'; +/// +/// return MaterialApp( +/// localizationsDelegates: L10n.localizationsDelegates, +/// supportedLocales: L10n.supportedLocales, +/// home: MyApplicationHome(), +/// ); +/// ``` +/// +/// ## Update pubspec.yaml +/// +/// Please make sure to update your pubspec.yaml to include the following +/// packages: +/// +/// ```yaml +/// dependencies: +/// # Internationalization support. +/// flutter_localizations: +/// sdk: flutter +/// intl: any # Use the pinned version from flutter_localizations +/// +/// # Rest of dependencies +/// ``` +/// +/// ## iOS Applications +/// +/// iOS applications define key application metadata, including supported +/// locales, in an Info.plist file that is built into the application bundle. +/// To configure the locales supported by your app, you’ll need to edit this +/// file. +/// +/// First, open your project’s ios/Runner.xcworkspace Xcode workspace file. +/// Then, in the Project Navigator, open the Info.plist file under the Runner +/// project’s Runner folder. +/// +/// Next, select the Information Property List item, select Add Item from the +/// Editor menu, then select Localizations from the pop-up menu. +/// +/// Select and expand the newly-created Localizations item then, for each +/// locale your application supports, add a new item and select the locale +/// you wish to add from the pop-up menu in the Value field. This list should +/// be consistent with the languages listed in the L10n.supportedLocales +/// property. +abstract class L10n { + L10n(String locale) + : localeName = intl.Intl.canonicalizedLocale(locale.toString()); + + final String localeName; + + static L10n of(BuildContext context) { + return Localizations.of(context, L10n)!; + } + + static const LocalizationsDelegate delegate = _L10nDelegate(); + + /// A list of this localizations delegate along with the default localizations + /// delegates. + /// + /// Returns a list of localizations delegates containing this delegate along with + /// GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate, + /// and GlobalWidgetsLocalizations.delegate. + /// + /// Additional delegates can be added by appending to this list in + /// MaterialApp. This list does not have to be used at all if a custom list + /// of delegates is preferred or required. + static const List> localizationsDelegates = + >[ + delegate, + GlobalMaterialLocalizations.delegate, + GlobalCupertinoLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ]; + + /// A list of this localizations delegate's supported locales. + static const List supportedLocales = [ + Locale('en'), + Locale('ar'), + Locale('be'), + Locale('bn'), + Locale('bo'), + Locale('ca'), + Locale('cs'), + Locale('de'), + Locale('el'), + Locale('eo'), + Locale('es'), + Locale('et'), + Locale('eu'), + Locale('fa'), + Locale('fi'), + Locale('fil'), + Locale('fr'), + Locale('ga'), + Locale('gl'), + Locale('he'), + Locale('hi'), + Locale('hr'), + Locale('hu'), + Locale('ia'), + Locale('id'), + Locale('ie'), + Locale('it'), + Locale('ja'), + Locale('ka'), + Locale('ko'), + Locale('lt'), + Locale('lv'), + Locale('nb'), + Locale('nl'), + Locale('pl'), + Locale('pt'), + Locale('pt', 'BR'), + Locale('pt', 'PT'), + Locale('ro'), + Locale('ru'), + Locale('sk'), + Locale('sl'), + Locale('sr'), + Locale('sv'), + Locale('ta'), + Locale('te'), + Locale('th'), + Locale('tr'), + Locale('uk'), + Locale('vi'), + Locale('zh'), + Locale.fromSubtags(languageCode: 'zh', scriptCode: 'Hant') + ]; + + /// No description provided for @noSendPermission. + /// + /// In en, this message translates to: + /// **'You can\'t send messages here'** + String get noSendPermission; + + /// Set to true to always display time of day in 24 hour format. + /// + /// In en, this message translates to: + /// **'false'** + String get alwaysUse24HourFormat; + + /// No description provided for @repeatPassword. + /// + /// In en, this message translates to: + /// **'Repeat password'** + String get repeatPassword; + + /// No description provided for @notAnImage. + /// + /// In en, this message translates to: + /// **'Not an image file.'** + String get notAnImage; + + /// No description provided for @setCustomPermissionLevel. + /// + /// In en, this message translates to: + /// **'Set custom permission level'** + String get setCustomPermissionLevel; + + /// No description provided for @setPermissionsLevelDescription. + /// + /// In en, this message translates to: + /// **'Please choose a predefined role below or enter a custom permission level between 0 and 100.'** + String get setPermissionsLevelDescription; + + /// No description provided for @ignoreUser. + /// + /// In en, this message translates to: + /// **'Ignore user'** + String get ignoreUser; + + /// No description provided for @normalUser. + /// + /// In en, this message translates to: + /// **'Normal user'** + String get normalUser; + + /// No description provided for @remove. + /// + /// In en, this message translates to: + /// **'Remove'** + String get remove; + + /// No description provided for @importNow. + /// + /// In en, this message translates to: + /// **'Import now'** + String get importNow; + + /// No description provided for @importEmojis. + /// + /// In en, this message translates to: + /// **'Import Emojis'** + String get importEmojis; + + /// No description provided for @importFromZipFile. + /// + /// In en, this message translates to: + /// **'Import from .zip file'** + String get importFromZipFile; + + /// No description provided for @exportEmotePack. + /// + /// In en, this message translates to: + /// **'Export Emote pack as .zip'** + String get exportEmotePack; + + /// No description provided for @replace. + /// + /// In en, this message translates to: + /// **'Replace'** + String get replace; + + /// No description provided for @about. + /// + /// In en, this message translates to: + /// **'About'** + String get about; + + /// No description provided for @aboutHomeserver. + /// + /// In en, this message translates to: + /// **'About {homeserver}'** + String aboutHomeserver(String homeserver); + + /// No description provided for @accept. + /// + /// In en, this message translates to: + /// **'Accept'** + String get accept; + + /// No description provided for @acceptedTheInvitation. + /// + /// In en, this message translates to: + /// **'👍 {username} accepted the invitation'** + String acceptedTheInvitation(String username); + + /// No description provided for @account. + /// + /// In en, this message translates to: + /// **'Account'** + String get account; + + /// No description provided for @activatedEndToEndEncryption. + /// + /// In en, this message translates to: + /// **'🔐 {username} activated end to end encryption'** + String activatedEndToEndEncryption(String username); + + /// No description provided for @addEmail. + /// + /// In en, this message translates to: + /// **'Add email'** + String get addEmail; + + /// No description provided for @confirmMatrixId. + /// + /// In en, this message translates to: + /// **'Please confirm your Matrix ID in order to delete your account.'** + String get confirmMatrixId; + + /// No description provided for @supposedMxid. + /// + /// In en, this message translates to: + /// **'This should be {mxid}'** + String supposedMxid(String mxid); + + /// No description provided for @addChatDescription. + /// + /// In en, this message translates to: + /// **'Add a chat description...'** + String get addChatDescription; + + /// No description provided for @addToSpace. + /// + /// In en, this message translates to: + /// **'Add to space'** + String get addToSpace; + + /// No description provided for @admin. + /// + /// In en, this message translates to: + /// **'Admin'** + String get admin; + + /// No description provided for @alias. + /// + /// In en, this message translates to: + /// **'alias'** + String get alias; + + /// No description provided for @all. + /// + /// In en, this message translates to: + /// **'All'** + String get all; + + /// No description provided for @allChats. + /// + /// In en, this message translates to: + /// **'All chats'** + String get allChats; + + /// No description provided for @commandHint_roomupgrade. + /// + /// In en, this message translates to: + /// **'Upgrade this room to the given room version'** + String get commandHint_roomupgrade; + + /// No description provided for @commandHint_googly. + /// + /// In en, this message translates to: + /// **'Send some googly eyes'** + String get commandHint_googly; + + /// No description provided for @commandHint_cuddle. + /// + /// In en, this message translates to: + /// **'Send a cuddle'** + String get commandHint_cuddle; + + /// No description provided for @commandHint_hug. + /// + /// In en, this message translates to: + /// **'Send a hug'** + String get commandHint_hug; + + /// No description provided for @googlyEyesContent. + /// + /// In en, this message translates to: + /// **'{senderName} sends you googly eyes'** + String googlyEyesContent(String senderName); + + /// No description provided for @cuddleContent. + /// + /// In en, this message translates to: + /// **'{senderName} cuddles you'** + String cuddleContent(String senderName); + + /// No description provided for @hugContent. + /// + /// In en, this message translates to: + /// **'{senderName} hugs you'** + String hugContent(String senderName); + + /// No description provided for @answeredTheCall. + /// + /// In en, this message translates to: + /// **'{senderName} answered the call'** + String answeredTheCall(String senderName); + + /// No description provided for @anyoneCanJoin. + /// + /// In en, this message translates to: + /// **'Anyone can join'** + String get anyoneCanJoin; + + /// No description provided for @appLock. + /// + /// In en, this message translates to: + /// **'App lock'** + String get appLock; + + /// No description provided for @appLockDescription. + /// + /// In en, this message translates to: + /// **'Lock the app when not using with a pin code'** + String get appLockDescription; + + /// No description provided for @archive. + /// + /// In en, this message translates to: + /// **'Archive'** + String get archive; + + /// No description provided for @areGuestsAllowedToJoin. + /// + /// In en, this message translates to: + /// **'Are guest users allowed to join'** + String get areGuestsAllowedToJoin; + + /// No description provided for @areYouSure. + /// + /// In en, this message translates to: + /// **'Are you sure?'** + String get areYouSure; + + /// No description provided for @areYouSureYouWantToLogout. + /// + /// In en, this message translates to: + /// **'Are you sure you want to log out?'** + String get areYouSureYouWantToLogout; + + /// No description provided for @askSSSSSign. + /// + /// In en, this message translates to: + /// **'To be able to sign the other person, please enter your secure store passphrase or recovery key.'** + String get askSSSSSign; + + /// No description provided for @askVerificationRequest. + /// + /// In en, this message translates to: + /// **'Accept this verification request from {username}?'** + String askVerificationRequest(String username); + + /// No description provided for @autoplayImages. + /// + /// In en, this message translates to: + /// **'Automatically play animated stickers and emotes'** + String get autoplayImages; + + /// No description provided for @badServerLoginTypesException. + /// + /// In en, this message translates to: + /// **'The homeserver supports the login types:\n{serverVersions}\nBut this app supports only:\n{supportedVersions}'** + String badServerLoginTypesException( + String serverVersions, String supportedVersions, Object suportedVersions); + + /// No description provided for @sendTypingNotifications. + /// + /// In en, this message translates to: + /// **'Send typing notifications'** + String get sendTypingNotifications; + + /// No description provided for @swipeRightToLeftToReply. + /// + /// In en, this message translates to: + /// **'Swipe right to left to reply'** + String get swipeRightToLeftToReply; + + /// No description provided for @sendOnEnter. + /// + /// In en, this message translates to: + /// **'Send on enter'** + String get sendOnEnter; + + /// No description provided for @badServerVersionsException. + /// + /// In en, this message translates to: + /// **'The homeserver supports the Spec versions:\n{serverVersions}\nBut this app supports only {supportedVersions}'** + String badServerVersionsException(String serverVersions, + String supportedVersions, Object serverVerions, Object suportedVersions); + + /// No description provided for @countChatsAndCountParticipants. + /// + /// In en, this message translates to: + /// **'{chats} chats and {participants} participants'** + String countChatsAndCountParticipants(int chats, int participants); + + /// No description provided for @noMoreChatsFound. + /// + /// In en, this message translates to: + /// **'No more chats found...'** + String get noMoreChatsFound; + + /// No description provided for @noChatsFoundHere. + /// + /// In en, this message translates to: + /// **'No chats found here yet. Start a new chat with someone by using the button below. ⤵️'** + String get noChatsFoundHere; + + /// No description provided for @joinedChats. + /// + /// In en, this message translates to: + /// **'Joined chats'** + String get joinedChats; + + /// No description provided for @unread. + /// + /// In en, this message translates to: + /// **'Unread'** + String get unread; + + /// No description provided for @space. + /// + /// In en, this message translates to: + /// **'Space'** + String get space; + + /// No description provided for @spaces. + /// + /// In en, this message translates to: + /// **'Spaces'** + String get spaces; + + /// No description provided for @banFromChat. + /// + /// In en, this message translates to: + /// **'Ban from chat'** + String get banFromChat; + + /// No description provided for @banned. + /// + /// In en, this message translates to: + /// **'Banned'** + String get banned; + + /// No description provided for @bannedUser. + /// + /// In en, this message translates to: + /// **'{username} banned {targetName}'** + String bannedUser(String username, String targetName); + + /// No description provided for @blockDevice. + /// + /// In en, this message translates to: + /// **'Block Device'** + String get blockDevice; + + /// No description provided for @blocked. + /// + /// In en, this message translates to: + /// **'Blocked'** + String get blocked; + + /// No description provided for @botMessages. + /// + /// In en, this message translates to: + /// **'Bot messages'** + String get botMessages; + + /// No description provided for @cancel. + /// + /// In en, this message translates to: + /// **'Cancel'** + String get cancel; + + /// No description provided for @cantOpenUri. + /// + /// In en, this message translates to: + /// **'Can\'t open the URI {uri}'** + String cantOpenUri(String uri); + + /// No description provided for @changeDeviceName. + /// + /// In en, this message translates to: + /// **'Change device name'** + String get changeDeviceName; + + /// No description provided for @changedTheChatAvatar. + /// + /// In en, this message translates to: + /// **'{username} changed the chat avatar'** + String changedTheChatAvatar(String username); + + /// No description provided for @changedTheChatDescriptionTo. + /// + /// In en, this message translates to: + /// **'{username} changed the chat description to: \'{description}\''** + String changedTheChatDescriptionTo(String username, String description); + + /// No description provided for @changedTheChatNameTo. + /// + /// In en, this message translates to: + /// **'{username} changed the chat name to: \'{chatname}\''** + String changedTheChatNameTo(String username, String chatname); + + /// No description provided for @changedTheChatPermissions. + /// + /// In en, this message translates to: + /// **'{username} changed the chat permissions'** + String changedTheChatPermissions(String username); + + /// No description provided for @changedTheDisplaynameTo. + /// + /// In en, this message translates to: + /// **'{username} changed their displayname to: \'{displayname}\''** + String changedTheDisplaynameTo(String username, String displayname); + + /// No description provided for @changedTheGuestAccessRules. + /// + /// In en, this message translates to: + /// **'{username} changed the guest access rules'** + String changedTheGuestAccessRules(String username); + + /// No description provided for @changedTheGuestAccessRulesTo. + /// + /// In en, this message translates to: + /// **'{username} changed the guest access rules to: {rules}'** + String changedTheGuestAccessRulesTo(String username, String rules); + + /// No description provided for @changedTheHistoryVisibility. + /// + /// In en, this message translates to: + /// **'{username} changed the history visibility'** + String changedTheHistoryVisibility(String username); + + /// No description provided for @changedTheHistoryVisibilityTo. + /// + /// In en, this message translates to: + /// **'{username} changed the history visibility to: {rules}'** + String changedTheHistoryVisibilityTo(String username, String rules); + + /// No description provided for @changedTheJoinRules. + /// + /// In en, this message translates to: + /// **'{username} changed the join rules'** + String changedTheJoinRules(String username); + + /// No description provided for @changedTheJoinRulesTo. + /// + /// In en, this message translates to: + /// **'{username} changed the join rules to: {joinRules}'** + String changedTheJoinRulesTo(String username, String joinRules); + + /// No description provided for @changedTheProfileAvatar. + /// + /// In en, this message translates to: + /// **'{username} changed their avatar'** + String changedTheProfileAvatar(String username); + + /// No description provided for @changedTheRoomAliases. + /// + /// In en, this message translates to: + /// **'{username} changed the room aliases'** + String changedTheRoomAliases(String username); + + /// No description provided for @changedTheRoomInvitationLink. + /// + /// In en, this message translates to: + /// **'{username} changed the invitation link'** + String changedTheRoomInvitationLink(String username); + + /// No description provided for @changePassword. + /// + /// In en, this message translates to: + /// **'Change password'** + String get changePassword; + + /// No description provided for @changeTheHomeserver. + /// + /// In en, this message translates to: + /// **'Change the homeserver'** + String get changeTheHomeserver; + + /// No description provided for @changeTheme. + /// + /// In en, this message translates to: + /// **'Change your style'** + String get changeTheme; + + /// No description provided for @changeTheNameOfTheGroup. + /// + /// In en, this message translates to: + /// **'Change the name of the group'** + String get changeTheNameOfTheGroup; + + /// No description provided for @changeYourAvatar. + /// + /// In en, this message translates to: + /// **'Change your avatar'** + String get changeYourAvatar; + + /// No description provided for @channelCorruptedDecryptError. + /// + /// In en, this message translates to: + /// **'The encryption has been corrupted'** + String get channelCorruptedDecryptError; + + /// No description provided for @chat. + /// + /// In en, this message translates to: + /// **'Chat'** + String get chat; + + /// No description provided for @yourChatBackupHasBeenSetUp. + /// + /// In en, this message translates to: + /// **'Your chat backup has been set up.'** + String get yourChatBackupHasBeenSetUp; + + /// No description provided for @chatBackup. + /// + /// In en, this message translates to: + /// **'Chat backup'** + String get chatBackup; + + /// No description provided for @chatBackupDescription. + /// + /// In en, this message translates to: + /// **'Your old messages are secured with a recovery key. Please make sure you don\'t lose it.'** + String get chatBackupDescription; + + /// No description provided for @chatDetails. + /// + /// In en, this message translates to: + /// **'Chat details'** + String get chatDetails; + + /// No description provided for @chatHasBeenAddedToThisSpace. + /// + /// In en, this message translates to: + /// **'Chat has been added to this space'** + String get chatHasBeenAddedToThisSpace; + + /// No description provided for @chats. + /// + /// In en, this message translates to: + /// **'Chats'** + String get chats; + + /// No description provided for @chooseAStrongPassword. + /// + /// In en, this message translates to: + /// **'Choose a strong password'** + String get chooseAStrongPassword; + + /// No description provided for @clearArchive. + /// + /// In en, this message translates to: + /// **'Clear archive'** + String get clearArchive; + + /// No description provided for @close. + /// + /// In en, this message translates to: + /// **'Close'** + String get close; + + /// No description provided for @commandHint_markasdm. + /// + /// In en, this message translates to: + /// **'Mark as direct message room for the giving Matrix ID'** + String get commandHint_markasdm; + + /// No description provided for @commandHint_markasgroup. + /// + /// In en, this message translates to: + /// **'Mark as group'** + String get commandHint_markasgroup; + + /// Usage hint for the command /ban + /// + /// In en, this message translates to: + /// **'Ban the given user from this room'** + String get commandHint_ban; + + /// Usage hint for the command /clearcache + /// + /// In en, this message translates to: + /// **'Clear cache'** + String get commandHint_clearcache; + + /// Usage hint for the command /create + /// + /// In en, this message translates to: + /// **'Create an empty group chat\nUse --no-encryption to disable encryption'** + String get commandHint_create; + + /// Usage hint for the command /discardsession + /// + /// In en, this message translates to: + /// **'Discard session'** + String get commandHint_discardsession; + + /// Usage hint for the command /dm + /// + /// In en, this message translates to: + /// **'Start a direct chat\nUse --no-encryption to disable encryption'** + String get commandHint_dm; + + /// Usage hint for the command /html + /// + /// In en, this message translates to: + /// **'Send HTML-formatted text'** + String get commandHint_html; + + /// Usage hint for the command /invite + /// + /// In en, this message translates to: + /// **'Invite the given user to this room'** + String get commandHint_invite; + + /// Usage hint for the command /join + /// + /// In en, this message translates to: + /// **'Join the given room'** + String get commandHint_join; + + /// Usage hint for the command /kick + /// + /// In en, this message translates to: + /// **'Remove the given user from this room'** + String get commandHint_kick; + + /// Usage hint for the command /leave + /// + /// In en, this message translates to: + /// **'Leave this room'** + String get commandHint_leave; + + /// Usage hint for the command /me + /// + /// In en, this message translates to: + /// **'Describe yourself'** + String get commandHint_me; + + /// Usage hint for the command /myroomavatar + /// + /// In en, this message translates to: + /// **'Set your picture for this room (by mxc-uri)'** + String get commandHint_myroomavatar; + + /// Usage hint for the command /myroomnick + /// + /// In en, this message translates to: + /// **'Set your display name for this room'** + String get commandHint_myroomnick; + + /// Usage hint for the command /op + /// + /// In en, this message translates to: + /// **'Set the given user\'s power level (default: 50)'** + String get commandHint_op; + + /// Usage hint for the command /plain + /// + /// In en, this message translates to: + /// **'Send unformatted text'** + String get commandHint_plain; + + /// Usage hint for the command /react + /// + /// In en, this message translates to: + /// **'Send reply as a reaction'** + String get commandHint_react; + + /// Usage hint for the command /send + /// + /// In en, this message translates to: + /// **'Send text'** + String get commandHint_send; + + /// Usage hint for the command /unban + /// + /// In en, this message translates to: + /// **'Unban the given user from this room'** + String get commandHint_unban; + + /// No description provided for @commandInvalid. + /// + /// In en, this message translates to: + /// **'Command invalid'** + String get commandInvalid; + + /// State that {command} is not a valid /command. + /// + /// In en, this message translates to: + /// **'{command} is not a command.'** + String commandMissing(String command); + + /// No description provided for @compareEmojiMatch. + /// + /// In en, this message translates to: + /// **'Please compare the emojis'** + String get compareEmojiMatch; + + /// No description provided for @compareNumbersMatch. + /// + /// In en, this message translates to: + /// **'Please compare the numbers'** + String get compareNumbersMatch; + + /// No description provided for @configureChat. + /// + /// In en, this message translates to: + /// **'Configure chat'** + String get configureChat; + + /// No description provided for @confirm. + /// + /// In en, this message translates to: + /// **'Confirm'** + String get confirm; + + /// No description provided for @connect. + /// + /// In en, this message translates to: + /// **'Connect'** + String get connect; + + /// No description provided for @contactHasBeenInvitedToTheGroup. + /// + /// In en, this message translates to: + /// **'Contact has been invited to the group'** + String get contactHasBeenInvitedToTheGroup; + + /// No description provided for @containsDisplayName. + /// + /// In en, this message translates to: + /// **'Contains display name'** + String get containsDisplayName; + + /// No description provided for @containsUserName. + /// + /// In en, this message translates to: + /// **'Contains username'** + String get containsUserName; + + /// No description provided for @contentHasBeenReported. + /// + /// In en, this message translates to: + /// **'The content has been reported to the server admins'** + String get contentHasBeenReported; + + /// No description provided for @copiedToClipboard. + /// + /// In en, this message translates to: + /// **'Copied to clipboard'** + String get copiedToClipboard; + + /// No description provided for @copy. + /// + /// In en, this message translates to: + /// **'Copy'** + String get copy; + + /// No description provided for @copyToClipboard. + /// + /// In en, this message translates to: + /// **'Copy to clipboard'** + String get copyToClipboard; + + /// No description provided for @couldNotDecryptMessage. + /// + /// In en, this message translates to: + /// **'Could not decrypt message: {error}'** + String couldNotDecryptMessage(String error); + + /// No description provided for @countParticipants. + /// + /// In en, this message translates to: + /// **'{count} participants'** + String countParticipants(int count); + + /// No description provided for @create. + /// + /// In en, this message translates to: + /// **'Create'** + String get create; + + /// No description provided for @createdTheChat. + /// + /// In en, this message translates to: + /// **'💬 {username} created the chat'** + String createdTheChat(String username); + + /// No description provided for @createGroup. + /// + /// In en, this message translates to: + /// **'Create group'** + String get createGroup; + + /// No description provided for @createNewSpace. + /// + /// In en, this message translates to: + /// **'New space'** + String get createNewSpace; + + /// No description provided for @currentlyActive. + /// + /// In en, this message translates to: + /// **'Currently active'** + String get currentlyActive; + + /// No description provided for @darkTheme. + /// + /// In en, this message translates to: + /// **'Dark'** + String get darkTheme; + + /// No description provided for @dateAndTimeOfDay. + /// + /// In en, this message translates to: + /// **'{date}, {timeOfDay}'** + String dateAndTimeOfDay(String date, String timeOfDay); + + /// No description provided for @dateWithoutYear. + /// + /// In en, this message translates to: + /// **'{month}-{day}'** + String dateWithoutYear(String month, String day); + + /// No description provided for @dateWithYear. + /// + /// In en, this message translates to: + /// **'{year}-{month}-{day}'** + String dateWithYear(String year, String month, String day); + + /// No description provided for @deactivateAccountWarning. + /// + /// In en, this message translates to: + /// **'This will deactivate your user account. This can not be undone! Are you sure?'** + String get deactivateAccountWarning; + + /// No description provided for @defaultPermissionLevel. + /// + /// In en, this message translates to: + /// **'Default permission level for new users'** + String get defaultPermissionLevel; + + /// No description provided for @delete. + /// + /// In en, this message translates to: + /// **'Delete'** + String get delete; + + /// No description provided for @deleteAccount. + /// + /// In en, this message translates to: + /// **'Delete account'** + String get deleteAccount; + + /// No description provided for @deleteMessage. + /// + /// In en, this message translates to: + /// **'Delete message'** + String get deleteMessage; + + /// No description provided for @device. + /// + /// In en, this message translates to: + /// **'Device'** + String get device; + + /// No description provided for @deviceId. + /// + /// In en, this message translates to: + /// **'Device ID'** + String get deviceId; + + /// No description provided for @devices. + /// + /// In en, this message translates to: + /// **'Devices'** + String get devices; + + /// No description provided for @directChats. + /// + /// In en, this message translates to: + /// **'Direct Chats'** + String get directChats; + + /// No description provided for @allRooms. + /// + /// In en, this message translates to: + /// **'All Group Chats'** + String get allRooms; + + /// No description provided for @displaynameHasBeenChanged. + /// + /// In en, this message translates to: + /// **'Displayname has been changed'** + String get displaynameHasBeenChanged; + + /// No description provided for @downloadFile. + /// + /// In en, this message translates to: + /// **'Download file'** + String get downloadFile; + + /// No description provided for @edit. + /// + /// In en, this message translates to: + /// **'Edit'** + String get edit; + + /// No description provided for @editBlockedServers. + /// + /// In en, this message translates to: + /// **'Edit blocked servers'** + String get editBlockedServers; + + /// No description provided for @chatPermissions. + /// + /// In en, this message translates to: + /// **'Chat permissions'** + String get chatPermissions; + + /// No description provided for @editDisplayname. + /// + /// In en, this message translates to: + /// **'Edit displayname'** + String get editDisplayname; + + /// No description provided for @editRoomAliases. + /// + /// In en, this message translates to: + /// **'Edit room aliases'** + String get editRoomAliases; + + /// No description provided for @editRoomAvatar. + /// + /// In en, this message translates to: + /// **'Edit room avatar'** + String get editRoomAvatar; + + /// No description provided for @emoteExists. + /// + /// In en, this message translates to: + /// **'Emote already exists!'** + String get emoteExists; + + /// No description provided for @emoteInvalid. + /// + /// In en, this message translates to: + /// **'Invalid emote shortcode!'** + String get emoteInvalid; + + /// No description provided for @emoteKeyboardNoRecents. + /// + /// In en, this message translates to: + /// **'Recently-used emotes will appear here...'** + String get emoteKeyboardNoRecents; + + /// No description provided for @emotePacks. + /// + /// In en, this message translates to: + /// **'Emote packs for room'** + String get emotePacks; + + /// No description provided for @emoteSettings. + /// + /// In en, this message translates to: + /// **'Emote Settings'** + String get emoteSettings; + + /// No description provided for @globalChatId. + /// + /// In en, this message translates to: + /// **'Global chat ID'** + String get globalChatId; + + /// No description provided for @accessAndVisibility. + /// + /// In en, this message translates to: + /// **'Access and visibility'** + String get accessAndVisibility; + + /// No description provided for @accessAndVisibilityDescription. + /// + /// In en, this message translates to: + /// **'Who is allowed to join this chat and how the chat can be discovered.'** + String get accessAndVisibilityDescription; + + /// No description provided for @calls. + /// + /// In en, this message translates to: + /// **'Calls'** + String get calls; + + /// No description provided for @customEmojisAndStickers. + /// + /// In en, this message translates to: + /// **'Custom emojis and stickers'** + String get customEmojisAndStickers; + + /// No description provided for @customEmojisAndStickersBody. + /// + /// In en, this message translates to: + /// **'Add or share custom emojis or stickers which can be used in any chat.'** + String get customEmojisAndStickersBody; + + /// No description provided for @emoteShortcode. + /// + /// In en, this message translates to: + /// **'Emote shortcode'** + String get emoteShortcode; + + /// No description provided for @emoteWarnNeedToPick. + /// + /// In en, this message translates to: + /// **'You need to pick an emote shortcode and an image!'** + String get emoteWarnNeedToPick; + + /// No description provided for @emptyChat. + /// + /// In en, this message translates to: + /// **'Empty chat'** + String get emptyChat; + + /// No description provided for @enableEmotesGlobally. + /// + /// In en, this message translates to: + /// **'Enable emote pack globally'** + String get enableEmotesGlobally; + + /// No description provided for @enableEncryption. + /// + /// In en, this message translates to: + /// **'Enable encryption'** + String get enableEncryption; + + /// No description provided for @enableEncryptionWarning. + /// + /// In en, this message translates to: + /// **'You won\'t be able to disable the encryption anymore. Are you sure?'** + String get enableEncryptionWarning; + + /// No description provided for @encrypted. + /// + /// In en, this message translates to: + /// **'Encrypted'** + String get encrypted; + + /// No description provided for @encryption. + /// + /// In en, this message translates to: + /// **'Encryption'** + String get encryption; + + /// No description provided for @encryptionNotEnabled. + /// + /// In en, this message translates to: + /// **'Encryption is not enabled'** + String get encryptionNotEnabled; + + /// No description provided for @endedTheCall. + /// + /// In en, this message translates to: + /// **'{senderName} ended the call'** + String endedTheCall(String senderName); + + /// No description provided for @enterAnEmailAddress. + /// + /// In en, this message translates to: + /// **'Enter an email address'** + String get enterAnEmailAddress; + + /// No description provided for @homeserver. + /// + /// In en, this message translates to: + /// **'Homeserver'** + String get homeserver; + + /// No description provided for @enterYourHomeserver. + /// + /// In en, this message translates to: + /// **'Enter your homeserver'** + String get enterYourHomeserver; + + /// No description provided for @errorObtainingLocation. + /// + /// In en, this message translates to: + /// **'Error obtaining location: {error}'** + String errorObtainingLocation(String error); + + /// No description provided for @everythingReady. + /// + /// In en, this message translates to: + /// **'Everything ready!'** + String get everythingReady; + + /// No description provided for @extremeOffensive. + /// + /// In en, this message translates to: + /// **'Extremely offensive'** + String get extremeOffensive; + + /// No description provided for @fileName. + /// + /// In en, this message translates to: + /// **'File name'** + String get fileName; + + /// No description provided for @fluffychat. + /// + /// In en, this message translates to: + /// **'Extera'** + String get fluffychat; + + /// No description provided for @fontSize. + /// + /// In en, this message translates to: + /// **'Font size'** + String get fontSize; + + /// No description provided for @forward. + /// + /// In en, this message translates to: + /// **'Forward'** + String get forward; + + /// No description provided for @fromJoining. + /// + /// In en, this message translates to: + /// **'From joining'** + String get fromJoining; + + /// No description provided for @fromTheInvitation. + /// + /// In en, this message translates to: + /// **'From the invitation'** + String get fromTheInvitation; + + /// No description provided for @goToTheNewRoom. + /// + /// In en, this message translates to: + /// **'Go to the new room'** + String get goToTheNewRoom; + + /// No description provided for @group. + /// + /// In en, this message translates to: + /// **'Group'** + String get group; + + /// No description provided for @chatDescription. + /// + /// In en, this message translates to: + /// **'Chat description'** + String get chatDescription; + + /// No description provided for @chatDescriptionHasBeenChanged. + /// + /// In en, this message translates to: + /// **'Chat description changed'** + String get chatDescriptionHasBeenChanged; + + /// No description provided for @groupIsPublic. + /// + /// In en, this message translates to: + /// **'Group is public'** + String get groupIsPublic; + + /// No description provided for @groups. + /// + /// In en, this message translates to: + /// **'Groups'** + String get groups; + + /// No description provided for @groupWith. + /// + /// In en, this message translates to: + /// **'Group with {displayname}'** + String groupWith(String displayname); + + /// No description provided for @guestsAreForbidden. + /// + /// In en, this message translates to: + /// **'Guests are forbidden'** + String get guestsAreForbidden; + + /// No description provided for @guestsCanJoin. + /// + /// In en, this message translates to: + /// **'Guests can join'** + String get guestsCanJoin; + + /// No description provided for @hasWithdrawnTheInvitationFor. + /// + /// In en, this message translates to: + /// **'{username} has withdrawn the invitation for {targetName}'** + String hasWithdrawnTheInvitationFor(String username, String targetName); + + /// No description provided for @help. + /// + /// In en, this message translates to: + /// **'Help'** + String get help; + + /// No description provided for @hideRedactedEvents. + /// + /// In en, this message translates to: + /// **'Hide redacted events'** + String get hideRedactedEvents; + + /// No description provided for @hideRedactedMessages. + /// + /// In en, this message translates to: + /// **'Hide redacted messages'** + String get hideRedactedMessages; + + /// No description provided for @hideRedactedMessagesBody. + /// + /// In en, this message translates to: + /// **'If someone redacts a message, this message won\'t be visible in the chat anymore.'** + String get hideRedactedMessagesBody; + + /// No description provided for @hideInvalidOrUnknownMessageFormats. + /// + /// In en, this message translates to: + /// **'Hide invalid or unknown message formats'** + String get hideInvalidOrUnknownMessageFormats; + + /// No description provided for @howOffensiveIsThisContent. + /// + /// In en, this message translates to: + /// **'How offensive is this content?'** + String get howOffensiveIsThisContent; + + /// No description provided for @id. + /// + /// In en, this message translates to: + /// **'ID'** + String get id; + + /// No description provided for @identity. + /// + /// In en, this message translates to: + /// **'Identity'** + String get identity; + + /// No description provided for @block. + /// + /// In en, this message translates to: + /// **'Block'** + String get block; + + /// No description provided for @blockedUsers. + /// + /// In en, this message translates to: + /// **'Blocked users'** + String get blockedUsers; + + /// No description provided for @blockListDescription. + /// + /// In en, this message translates to: + /// **'You can block users who are disturbing you. You won\'t be able to receive any messages or room invites from the users on your personal block list.'** + String get blockListDescription; + + /// No description provided for @blockUsername. + /// + /// In en, this message translates to: + /// **'Ignore username'** + String get blockUsername; + + /// No description provided for @iHaveClickedOnLink. + /// + /// In en, this message translates to: + /// **'I have clicked on the link'** + String get iHaveClickedOnLink; + + /// No description provided for @incorrectPassphraseOrKey. + /// + /// In en, this message translates to: + /// **'Incorrect passphrase or recovery key'** + String get incorrectPassphraseOrKey; + + /// No description provided for @inoffensive. + /// + /// In en, this message translates to: + /// **'Inoffensive'** + String get inoffensive; + + /// No description provided for @inviteContact. + /// + /// In en, this message translates to: + /// **'Invite contact'** + String get inviteContact; + + /// No description provided for @inviteContactToGroupQuestion. + /// + /// In en, this message translates to: + /// **'Do you want to invite {contact} to the chat \"{groupName}\"?'** + String inviteContactToGroupQuestion(Object contact, Object groupName); + + /// No description provided for @inviteContactToGroup. + /// + /// In en, this message translates to: + /// **'Invite contact to {groupName}'** + String inviteContactToGroup(String groupName); + + /// No description provided for @noChatDescriptionYet. + /// + /// In en, this message translates to: + /// **'No chat description created yet.'** + String get noChatDescriptionYet; + + /// No description provided for @tryAgain. + /// + /// In en, this message translates to: + /// **'Try again'** + String get tryAgain; + + /// No description provided for @invalidServerName. + /// + /// In en, this message translates to: + /// **'Invalid server name'** + String get invalidServerName; + + /// No description provided for @invited. + /// + /// In en, this message translates to: + /// **'Invited'** + String get invited; + + /// No description provided for @redactMessageDescription. + /// + /// In en, this message translates to: + /// **'The message will be redacted for all participants in this conversation. This cannot be undone.'** + String get redactMessageDescription; + + /// No description provided for @optionalRedactReason. + /// + /// In en, this message translates to: + /// **'(Optional) Reason for redacting this message...'** + String get optionalRedactReason; + + /// No description provided for @invitedUser. + /// + /// In en, this message translates to: + /// **'📩 {username} invited {targetName}'** + String invitedUser(String username, String targetName); + + /// No description provided for @invitedUsersOnly. + /// + /// In en, this message translates to: + /// **'Invited users only'** + String get invitedUsersOnly; + + /// No description provided for @inviteForMe. + /// + /// In en, this message translates to: + /// **'Invite for me'** + String get inviteForMe; + + /// No description provided for @inviteText. + /// + /// In en, this message translates to: + /// **'{username} invited you to Extera.\n1. Visit fluffychat.im and install the app \n2. Sign up or sign in \n3. Open the invite link: \n {link}'** + String inviteText(String username, String link); + + /// No description provided for @isTyping. + /// + /// In en, this message translates to: + /// **'is typing…'** + String get isTyping; + + /// No description provided for @joinedTheChat. + /// + /// In en, this message translates to: + /// **'👋 {username} joined the chat'** + String joinedTheChat(String username); + + /// No description provided for @joinRoom. + /// + /// In en, this message translates to: + /// **'Join room'** + String get joinRoom; + + /// No description provided for @kicked. + /// + /// In en, this message translates to: + /// **'👞 {username} kicked {targetName}'** + String kicked(String username, String targetName); + + /// No description provided for @kickedAndBanned. + /// + /// In en, this message translates to: + /// **'🙅 {username} kicked and banned {targetName}'** + String kickedAndBanned(String username, String targetName); + + /// No description provided for @kickFromChat. + /// + /// In en, this message translates to: + /// **'Kick from chat'** + String get kickFromChat; + + /// No description provided for @lastActiveAgo. + /// + /// In en, this message translates to: + /// **'Last active: {localizedTimeShort}'** + String lastActiveAgo(String localizedTimeShort); + + /// No description provided for @leave. + /// + /// In en, this message translates to: + /// **'Leave'** + String get leave; + + /// No description provided for @leftTheChat. + /// + /// In en, this message translates to: + /// **'Left the chat'** + String get leftTheChat; + + /// No description provided for @license. + /// + /// In en, this message translates to: + /// **'License'** + String get license; + + /// No description provided for @lightTheme. + /// + /// In en, this message translates to: + /// **'Light'** + String get lightTheme; + + /// No description provided for @loadCountMoreParticipants. + /// + /// In en, this message translates to: + /// **'Load {count} more participants'** + String loadCountMoreParticipants(int count); + + /// No description provided for @dehydrate. + /// + /// In en, this message translates to: + /// **'Export session and wipe device'** + String get dehydrate; + + /// No description provided for @dehydrateWarning. + /// + /// In en, this message translates to: + /// **'This action cannot be undone. Ensure you safely store the backup file.'** + String get dehydrateWarning; + + /// No description provided for @dehydrateTor. + /// + /// In en, this message translates to: + /// **'TOR Users: Export session'** + String get dehydrateTor; + + /// No description provided for @dehydrateTorLong. + /// + /// In en, this message translates to: + /// **'For TOR users, it is recommended to export the session before closing the window.'** + String get dehydrateTorLong; + + /// No description provided for @hydrateTor. + /// + /// In en, this message translates to: + /// **'TOR Users: Import session export'** + String get hydrateTor; + + /// No description provided for @hydrateTorLong. + /// + /// In en, this message translates to: + /// **'Did you export your session last time on TOR? Quickly import it and continue chatting.'** + String get hydrateTorLong; + + /// No description provided for @hydrate. + /// + /// In en, this message translates to: + /// **'Restore from backup file'** + String get hydrate; + + /// No description provided for @loadingPleaseWait. + /// + /// In en, this message translates to: + /// **'Loading… Please wait.'** + String get loadingPleaseWait; + + /// No description provided for @loadMore. + /// + /// In en, this message translates to: + /// **'Load more…'** + String get loadMore; + + /// No description provided for @locationDisabledNotice. + /// + /// In en, this message translates to: + /// **'Location services are disabled. Please enable them to be able to share your location.'** + String get locationDisabledNotice; + + /// No description provided for @locationPermissionDeniedNotice. + /// + /// In en, this message translates to: + /// **'Location permission denied. Please grant them to be able to share your location.'** + String get locationPermissionDeniedNotice; + + /// No description provided for @login. + /// + /// In en, this message translates to: + /// **'Login'** + String get login; + + /// No description provided for @logInTo. + /// + /// In en, this message translates to: + /// **'Log in to {homeserver}'** + String logInTo(String homeserver); + + /// No description provided for @logout. + /// + /// In en, this message translates to: + /// **'Logout'** + String get logout; + + /// No description provided for @memberChanges. + /// + /// In en, this message translates to: + /// **'Member changes'** + String get memberChanges; + + /// No description provided for @mention. + /// + /// In en, this message translates to: + /// **'Mention'** + String get mention; + + /// No description provided for @messages. + /// + /// In en, this message translates to: + /// **'Messages'** + String get messages; + + /// No description provided for @messagesStyle. + /// + /// In en, this message translates to: + /// **'Messages:'** + String get messagesStyle; + + /// No description provided for @moderator. + /// + /// In en, this message translates to: + /// **'Moderator'** + String get moderator; + + /// No description provided for @muteChat. + /// + /// In en, this message translates to: + /// **'Mute chat'** + String get muteChat; + + /// No description provided for @needPantalaimonWarning. + /// + /// In en, this message translates to: + /// **'Please be aware that you need Pantalaimon to use end-to-end encryption for now.'** + String get needPantalaimonWarning; + + /// No description provided for @newChat. + /// + /// In en, this message translates to: + /// **'New chat'** + String get newChat; + + /// No description provided for @newMessageInFluffyChat. + /// + /// In en, this message translates to: + /// **'💬 New message in Extera'** + String get newMessageInFluffyChat; + + /// No description provided for @newVerificationRequest. + /// + /// In en, this message translates to: + /// **'New verification request!'** + String get newVerificationRequest; + + /// No description provided for @next. + /// + /// In en, this message translates to: + /// **'Next'** + String get next; + + /// No description provided for @no. + /// + /// In en, this message translates to: + /// **'No'** + String get no; + + /// No description provided for @noConnectionToTheServer. + /// + /// In en, this message translates to: + /// **'No connection to the server'** + String get noConnectionToTheServer; + + /// No description provided for @noEmotesFound. + /// + /// In en, this message translates to: + /// **'No emotes found. 😕'** + String get noEmotesFound; + + /// No description provided for @noEncryptionForPublicRooms. + /// + /// In en, this message translates to: + /// **'You can only activate encryption as soon as the room is no longer publicly accessible.'** + String get noEncryptionForPublicRooms; + + /// No description provided for @noGoogleServicesWarning. + /// + /// In en, this message translates to: + /// **'Firebase Cloud Messaging doesn\'t appear to be available on your device. To still receive push notifications, we recommend installing ntfy. With ntfy or another Unified Push provider you can receive push notifications in a data secure way. You can download ntfy from the PlayStore or from F-Droid.'** + String get noGoogleServicesWarning; + + /// No description provided for @noMatrixServer. + /// + /// In en, this message translates to: + /// **'{server1} is no matrix server, use {server2} instead?'** + String noMatrixServer(String server1, String server2); + + /// No description provided for @shareInviteLink. + /// + /// In en, this message translates to: + /// **'Share invite link'** + String get shareInviteLink; + + /// No description provided for @scanQrCode. + /// + /// In en, this message translates to: + /// **'Scan QR code'** + String get scanQrCode; + + /// No description provided for @none. + /// + /// In en, this message translates to: + /// **'None'** + String get none; + + /// No description provided for @noPasswordRecoveryDescription. + /// + /// In en, this message translates to: + /// **'You have not added a way to recover your password yet.'** + String get noPasswordRecoveryDescription; + + /// No description provided for @noPermission. + /// + /// In en, this message translates to: + /// **'No permission'** + String get noPermission; + + /// No description provided for @noRoomsFound. + /// + /// In en, this message translates to: + /// **'No rooms found…'** + String get noRoomsFound; + + /// No description provided for @notifications. + /// + /// In en, this message translates to: + /// **'Notifications'** + String get notifications; + + /// No description provided for @notificationsEnabledForThisAccount. + /// + /// In en, this message translates to: + /// **'Notifications enabled for this account'** + String get notificationsEnabledForThisAccount; + + /// No description provided for @numUsersTyping. + /// + /// In en, this message translates to: + /// **'{count} users are typing…'** + String numUsersTyping(int count); + + /// No description provided for @obtainingLocation. + /// + /// In en, this message translates to: + /// **'Obtaining location…'** + String get obtainingLocation; + + /// No description provided for @offensive. + /// + /// In en, this message translates to: + /// **'Offensive'** + String get offensive; + + /// No description provided for @offline. + /// + /// In en, this message translates to: + /// **'Offline'** + String get offline; + + /// No description provided for @ok. + /// + /// In en, this message translates to: + /// **'Ok'** + String get ok; + + /// No description provided for @online. + /// + /// In en, this message translates to: + /// **'Online'** + String get online; + + /// No description provided for @onlineKeyBackupEnabled. + /// + /// In en, this message translates to: + /// **'Online Key Backup is enabled'** + String get onlineKeyBackupEnabled; + + /// No description provided for @oopsPushError. + /// + /// In en, this message translates to: + /// **'Oops! Unfortunately, an error occurred when setting up the push notifications.'** + String get oopsPushError; + + /// No description provided for @oopsSomethingWentWrong. + /// + /// In en, this message translates to: + /// **'Oops, something went wrong…'** + String get oopsSomethingWentWrong; + + /// No description provided for @openAppToReadMessages. + /// + /// In en, this message translates to: + /// **'Open app to read messages'** + String get openAppToReadMessages; + + /// No description provided for @openCamera. + /// + /// In en, this message translates to: + /// **'Open camera'** + String get openCamera; + + /// No description provided for @openVideoCamera. + /// + /// In en, this message translates to: + /// **'Open camera for a video'** + String get openVideoCamera; + + /// No description provided for @oneClientLoggedOut. + /// + /// In en, this message translates to: + /// **'One of your clients has been logged out'** + String get oneClientLoggedOut; + + /// No description provided for @addAccount. + /// + /// In en, this message translates to: + /// **'Add account'** + String get addAccount; + + /// No description provided for @editBundlesForAccount. + /// + /// In en, this message translates to: + /// **'Edit bundles for this account'** + String get editBundlesForAccount; + + /// No description provided for @addToBundle. + /// + /// In en, this message translates to: + /// **'Add to bundle'** + String get addToBundle; + + /// No description provided for @removeFromBundle. + /// + /// In en, this message translates to: + /// **'Remove from this bundle'** + String get removeFromBundle; + + /// No description provided for @bundleName. + /// + /// In en, this message translates to: + /// **'Bundle name'** + String get bundleName; + + /// No description provided for @enableMultiAccounts. + /// + /// In en, this message translates to: + /// **'(BETA) Enable multi accounts on this device'** + String get enableMultiAccounts; + + /// No description provided for @openInMaps. + /// + /// In en, this message translates to: + /// **'Open in maps'** + String get openInMaps; + + /// No description provided for @link. + /// + /// In en, this message translates to: + /// **'Link'** + String get link; + + /// No description provided for @serverRequiresEmail. + /// + /// In en, this message translates to: + /// **'This server needs to validate your email address for registration.'** + String get serverRequiresEmail; + + /// No description provided for @or. + /// + /// In en, this message translates to: + /// **'Or'** + String get or; + + /// No description provided for @participant. + /// + /// In en, this message translates to: + /// **'Participant'** + String get participant; + + /// No description provided for @passphraseOrKey. + /// + /// In en, this message translates to: + /// **'passphrase or recovery key'** + String get passphraseOrKey; + + /// No description provided for @password. + /// + /// In en, this message translates to: + /// **'Password'** + String get password; + + /// No description provided for @passwordForgotten. + /// + /// In en, this message translates to: + /// **'Password forgotten'** + String get passwordForgotten; + + /// No description provided for @passwordHasBeenChanged. + /// + /// In en, this message translates to: + /// **'Password has been changed'** + String get passwordHasBeenChanged; + + /// No description provided for @hideMemberChangesInPublicChats. + /// + /// In en, this message translates to: + /// **'Hide member changes in public chats'** + String get hideMemberChangesInPublicChats; + + /// No description provided for @hideMemberChangesInPublicChatsBody. + /// + /// In en, this message translates to: + /// **'Do not show in the chat timeline if someone joins or leaves a public chat to improve readability.'** + String get hideMemberChangesInPublicChatsBody; + + /// No description provided for @overview. + /// + /// In en, this message translates to: + /// **'Overview'** + String get overview; + + /// No description provided for @notifyMeFor. + /// + /// In en, this message translates to: + /// **'Notify me for'** + String get notifyMeFor; + + /// No description provided for @passwordRecoverySettings. + /// + /// In en, this message translates to: + /// **'Password recovery settings'** + String get passwordRecoverySettings; + + /// No description provided for @passwordRecovery. + /// + /// In en, this message translates to: + /// **'Password recovery'** + String get passwordRecovery; + + /// No description provided for @people. + /// + /// In en, this message translates to: + /// **'People'** + String get people; + + /// No description provided for @pickImage. + /// + /// In en, this message translates to: + /// **'Pick an image'** + String get pickImage; + + /// No description provided for @pin. + /// + /// In en, this message translates to: + /// **'Pin'** + String get pin; + + /// No description provided for @play. + /// + /// In en, this message translates to: + /// **'Play {fileName}'** + String play(String fileName); + + /// No description provided for @pleaseChoose. + /// + /// In en, this message translates to: + /// **'Please choose'** + String get pleaseChoose; + + /// No description provided for @pleaseChooseAPasscode. + /// + /// In en, this message translates to: + /// **'Please choose a pass code'** + String get pleaseChooseAPasscode; + + /// No description provided for @pleaseClickOnLink. + /// + /// In en, this message translates to: + /// **'Please click on the link in the email and then proceed.'** + String get pleaseClickOnLink; + + /// No description provided for @pleaseEnter4Digits. + /// + /// In en, this message translates to: + /// **'Please enter 4 digits or leave empty to disable app lock.'** + String get pleaseEnter4Digits; + + /// No description provided for @pleaseEnterRecoveryKey. + /// + /// In en, this message translates to: + /// **'Please enter your recovery key:'** + String get pleaseEnterRecoveryKey; + + /// No description provided for @pleaseEnterYourPassword. + /// + /// In en, this message translates to: + /// **'Please enter your password'** + String get pleaseEnterYourPassword; + + /// No description provided for @pleaseEnterYourPin. + /// + /// In en, this message translates to: + /// **'Please enter your pin'** + String get pleaseEnterYourPin; + + /// No description provided for @pleaseEnterYourUsername. + /// + /// In en, this message translates to: + /// **'Please enter your username'** + String get pleaseEnterYourUsername; + + /// No description provided for @pleaseFollowInstructionsOnWeb. + /// + /// In en, this message translates to: + /// **'Please follow the instructions on the website and tap on next.'** + String get pleaseFollowInstructionsOnWeb; + + /// No description provided for @privacy. + /// + /// In en, this message translates to: + /// **'Privacy'** + String get privacy; + + /// No description provided for @publicRooms. + /// + /// In en, this message translates to: + /// **'Public Rooms'** + String get publicRooms; + + /// No description provided for @pushRules. + /// + /// In en, this message translates to: + /// **'Push rules'** + String get pushRules; + + /// No description provided for @reason. + /// + /// In en, this message translates to: + /// **'Reason'** + String get reason; + + /// No description provided for @recording. + /// + /// In en, this message translates to: + /// **'Recording'** + String get recording; + + /// No description provided for @redactedBy. + /// + /// In en, this message translates to: + /// **'Redacted by {username}'** + String redactedBy(String username); + + /// No description provided for @directChat. + /// + /// In en, this message translates to: + /// **'Direct chat'** + String get directChat; + + /// No description provided for @redactedByBecause. + /// + /// In en, this message translates to: + /// **'Redacted by {username} because: \"{reason}\"'** + String redactedByBecause(String username, String reason); + + /// No description provided for @redactedAnEvent. + /// + /// In en, this message translates to: + /// **'{username} redacted an event'** + String redactedAnEvent(String username); + + /// No description provided for @redactMessage. + /// + /// In en, this message translates to: + /// **'Redact message'** + String get redactMessage; + + /// No description provided for @register. + /// + /// In en, this message translates to: + /// **'Register'** + String get register; + + /// No description provided for @reject. + /// + /// In en, this message translates to: + /// **'Reject'** + String get reject; + + /// No description provided for @rejectedTheInvitation. + /// + /// In en, this message translates to: + /// **'{username} rejected the invitation'** + String rejectedTheInvitation(String username); + + /// No description provided for @rejoin. + /// + /// In en, this message translates to: + /// **'Rejoin'** + String get rejoin; + + /// No description provided for @removeAllOtherDevices. + /// + /// In en, this message translates to: + /// **'Remove all other devices'** + String get removeAllOtherDevices; + + /// No description provided for @removedBy. + /// + /// In en, this message translates to: + /// **'Removed by {username}'** + String removedBy(String username); + + /// No description provided for @removeDevice. + /// + /// In en, this message translates to: + /// **'Remove device'** + String get removeDevice; + + /// No description provided for @unbanFromChat. + /// + /// In en, this message translates to: + /// **'Unban from chat'** + String get unbanFromChat; + + /// No description provided for @removeYourAvatar. + /// + /// In en, this message translates to: + /// **'Remove your avatar'** + String get removeYourAvatar; + + /// No description provided for @replaceRoomWithNewerVersion. + /// + /// In en, this message translates to: + /// **'Replace room with newer version'** + String get replaceRoomWithNewerVersion; + + /// No description provided for @reply. + /// + /// In en, this message translates to: + /// **'Reply'** + String get reply; + + /// No description provided for @reportMessage. + /// + /// In en, this message translates to: + /// **'Report message'** + String get reportMessage; + + /// No description provided for @translateMessage. + /// + /// In en, this message translates to: + /// **'Translate message'** + String get translateMessage; + + /// No description provided for @translatedMessage. + /// + /// In en, this message translates to: + /// **'Translated message'** + String get translatedMessage; + + /// No description provided for @errorTranslatingMessage. + /// + /// In en, this message translates to: + /// **'An error has occured while translating the message.'** + String get errorTranslatingMessage; + + /// No description provided for @recoverMessage. + /// + /// In en, this message translates to: + /// **'Recover message'** + String get recoverMessage; + + /// No description provided for @recoveredMessage. + /// + /// In en, this message translates to: + /// **'Recovered message'** + String get recoveredMessage; + + /// No description provided for @errorRecoveringMessage. + /// + /// In en, this message translates to: + /// **'An error has occured while recovering the message.'** + String get errorRecoveringMessage; + + /// No description provided for @errorRecoveringMessageNoAdmin. + /// + /// In en, this message translates to: + /// **'This feature is available on Synapse homeservers only for adminstrators.'** + String get errorRecoveringMessageNoAdmin; + + /// No description provided for @requestPermission. + /// + /// In en, this message translates to: + /// **'Request permission'** + String get requestPermission; + + /// No description provided for @roomHasBeenUpgraded. + /// + /// In en, this message translates to: + /// **'Room has been upgraded'** + String get roomHasBeenUpgraded; + + /// No description provided for @roomVersion. + /// + /// In en, this message translates to: + /// **'Room version'** + String get roomVersion; + + /// No description provided for @saveFile. + /// + /// In en, this message translates to: + /// **'Save file'** + String get saveFile; + + /// No description provided for @retry. + /// + /// In en, this message translates to: + /// **'Retry'** + String get retry; + + /// No description provided for @search. + /// + /// In en, this message translates to: + /// **'Search'** + String get search; + + /// No description provided for @security. + /// + /// In en, this message translates to: + /// **'Security'** + String get security; + + /// No description provided for @recoveryKey. + /// + /// In en, this message translates to: + /// **'Recovery key'** + String get recoveryKey; + + /// No description provided for @recoveryKeyLost. + /// + /// In en, this message translates to: + /// **'Recovery key lost?'** + String get recoveryKeyLost; + + /// No description provided for @seenByUser. + /// + /// In en, this message translates to: + /// **'Seen by {username}'** + String seenByUser(String username); + + /// No description provided for @send. + /// + /// In en, this message translates to: + /// **'Send'** + String get send; + + /// No description provided for @sendAMessage. + /// + /// In en, this message translates to: + /// **'Send a message'** + String get sendAMessage; + + /// No description provided for @sendAsText. + /// + /// In en, this message translates to: + /// **'Send as text'** + String get sendAsText; + + /// No description provided for @sendAudio. + /// + /// In en, this message translates to: + /// **'Send audio'** + String get sendAudio; + + /// No description provided for @sendFile. + /// + /// In en, this message translates to: + /// **'Send file'** + String get sendFile; + + /// No description provided for @sendImage. + /// + /// In en, this message translates to: + /// **'Send image'** + String get sendImage; + + /// No description provided for @sendImages. + /// + /// In en, this message translates to: + /// **'Send {count} image'** + String sendImages(int count); + + /// No description provided for @sendMessages. + /// + /// In en, this message translates to: + /// **'Send messages'** + String get sendMessages; + + /// No description provided for @sendOriginal. + /// + /// In en, this message translates to: + /// **'Send original'** + String get sendOriginal; + + /// No description provided for @sendSticker. + /// + /// In en, this message translates to: + /// **'Send sticker'** + String get sendSticker; + + /// No description provided for @sendVideo. + /// + /// In en, this message translates to: + /// **'Send video'** + String get sendVideo; + + /// No description provided for @sentAFile. + /// + /// In en, this message translates to: + /// **'📁 {username} sent a file'** + String sentAFile(String username); + + /// No description provided for @sentAnAudio. + /// + /// In en, this message translates to: + /// **'🎤 {username} sent an audio'** + String sentAnAudio(String username); + + /// No description provided for @sentAPicture. + /// + /// In en, this message translates to: + /// **'🖼️ {username} sent a picture'** + String sentAPicture(String username); + + /// No description provided for @sentASticker. + /// + /// In en, this message translates to: + /// **'😊 {username} sent a sticker'** + String sentASticker(String username); + + /// No description provided for @sentAVideo. + /// + /// In en, this message translates to: + /// **'🎥 {username} sent a video'** + String sentAVideo(String username); + + /// No description provided for @sentCallInformations. + /// + /// In en, this message translates to: + /// **'{senderName} sent call information'** + String sentCallInformations(String senderName); + + /// No description provided for @separateChatTypes. + /// + /// In en, this message translates to: + /// **'Separate Direct Chats and Groups'** + String get separateChatTypes; + + /// No description provided for @setAsCanonicalAlias. + /// + /// In en, this message translates to: + /// **'Set as main alias'** + String get setAsCanonicalAlias; + + /// No description provided for @setCustomEmotes. + /// + /// In en, this message translates to: + /// **'Set custom emotes'** + String get setCustomEmotes; + + /// No description provided for @setChatDescription. + /// + /// In en, this message translates to: + /// **'Set chat description'** + String get setChatDescription; + + /// No description provided for @setInvitationLink. + /// + /// In en, this message translates to: + /// **'Set invitation link'** + String get setInvitationLink; + + /// No description provided for @setPermissionsLevel. + /// + /// In en, this message translates to: + /// **'Set permissions level'** + String get setPermissionsLevel; + + /// No description provided for @setStatus. + /// + /// In en, this message translates to: + /// **'Set status'** + String get setStatus; + + /// No description provided for @settings. + /// + /// In en, this message translates to: + /// **'Settings'** + String get settings; + + /// No description provided for @share. + /// + /// In en, this message translates to: + /// **'Share'** + String get share; + + /// No description provided for @sharedTheLocation. + /// + /// In en, this message translates to: + /// **'{username} shared their location'** + String sharedTheLocation(String username); + + /// No description provided for @shareLocation. + /// + /// In en, this message translates to: + /// **'Share location'** + String get shareLocation; + + /// No description provided for @showPassword. + /// + /// In en, this message translates to: + /// **'Show password'** + String get showPassword; + + /// No description provided for @presenceStyle. + /// + /// In en, this message translates to: + /// **'Presence:'** + String get presenceStyle; + + /// No description provided for @hideAvatarsInInvites. + /// + /// In en, this message translates to: + /// **'Hide avatars in invites'** + String get hideAvatarsInInvites; + + /// No description provided for @hideAvatarsInInvitesDescription. + /// + /// In en, this message translates to: + /// **'Do not show room avatars in invites'** + String get hideAvatarsInInvitesDescription; + + /// No description provided for @presencesToggle. + /// + /// In en, this message translates to: + /// **'Show status messages from other users'** + String get presencesToggle; + + /// No description provided for @pureBlackToggle. + /// + /// In en, this message translates to: + /// **'Pure Black'** + String get pureBlackToggle; + + /// No description provided for @singlesignon. + /// + /// In en, this message translates to: + /// **'Single Sign on'** + String get singlesignon; + + /// No description provided for @skip. + /// + /// In en, this message translates to: + /// **'Skip'** + String get skip; + + /// No description provided for @sourceCode. + /// + /// In en, this message translates to: + /// **'Source code'** + String get sourceCode; + + /// No description provided for @spaceIsPublic. + /// + /// In en, this message translates to: + /// **'Space is public'** + String get spaceIsPublic; + + /// No description provided for @spaceName. + /// + /// In en, this message translates to: + /// **'Space name'** + String get spaceName; + + /// No description provided for @startedACall. + /// + /// In en, this message translates to: + /// **'{senderName} started a call'** + String startedACall(String senderName); + + /// No description provided for @startFirstChat. + /// + /// In en, this message translates to: + /// **'Start your first chat'** + String get startFirstChat; + + /// No description provided for @status. + /// + /// In en, this message translates to: + /// **'Status'** + String get status; + + /// No description provided for @statusExampleMessage. + /// + /// In en, this message translates to: + /// **'How are you today?'** + String get statusExampleMessage; + + /// No description provided for @submit. + /// + /// In en, this message translates to: + /// **'Submit'** + String get submit; + + /// No description provided for @synchronizingPleaseWait. + /// + /// In en, this message translates to: + /// **'Synchronizing… Please wait.'** + String get synchronizingPleaseWait; + + /// No description provided for @synchronizingPleaseWaitCounter. + /// + /// In en, this message translates to: + /// **' Synchronizing… ({percentage}%)'** + String synchronizingPleaseWaitCounter(String percentage); + + /// No description provided for @systemTheme. + /// + /// In en, this message translates to: + /// **'System'** + String get systemTheme; + + /// No description provided for @theyDontMatch. + /// + /// In en, this message translates to: + /// **'They Don\'t Match'** + String get theyDontMatch; + + /// No description provided for @theyMatch. + /// + /// In en, this message translates to: + /// **'They Match'** + String get theyMatch; + + /// Title for the application + /// + /// In en, this message translates to: + /// **'Extera'** + String get title; + + /// No description provided for @toggleFavorite. + /// + /// In en, this message translates to: + /// **'Toggle Favorite'** + String get toggleFavorite; + + /// No description provided for @toggleMuted. + /// + /// In en, this message translates to: + /// **'Toggle Muted'** + String get toggleMuted; + + /// No description provided for @toggleUnread. + /// + /// In en, this message translates to: + /// **'Mark Read/Unread'** + String get toggleUnread; + + /// No description provided for @tooManyRequestsWarning. + /// + /// In en, this message translates to: + /// **'Too many requests. Please try again later!'** + String get tooManyRequestsWarning; + + /// No description provided for @transferFromAnotherDevice. + /// + /// In en, this message translates to: + /// **'Transfer from another device'** + String get transferFromAnotherDevice; + + /// No description provided for @tryToSendAgain. + /// + /// In en, this message translates to: + /// **'Try to send again'** + String get tryToSendAgain; + + /// No description provided for @unavailable. + /// + /// In en, this message translates to: + /// **'Unavailable'** + String get unavailable; + + /// No description provided for @unbannedUser. + /// + /// In en, this message translates to: + /// **'{username} unbanned {targetName}'** + String unbannedUser(String username, String targetName); + + /// No description provided for @unblockDevice. + /// + /// In en, this message translates to: + /// **'Unblock Device'** + String get unblockDevice; + + /// No description provided for @unknownDevice. + /// + /// In en, this message translates to: + /// **'Unknown device'** + String get unknownDevice; + + /// No description provided for @unknownEncryptionAlgorithm. + /// + /// In en, this message translates to: + /// **'Unknown encryption algorithm'** + String get unknownEncryptionAlgorithm; + + /// No description provided for @unknownEvent. + /// + /// In en, this message translates to: + /// **'Unknown event \'{type}\''** + String unknownEvent(String type); + + /// No description provided for @unmuteChat. + /// + /// In en, this message translates to: + /// **'Unmute chat'** + String get unmuteChat; + + /// No description provided for @unpin. + /// + /// In en, this message translates to: + /// **'Unpin'** + String get unpin; + + /// No description provided for @unreadChats. + /// + /// In en, this message translates to: + /// **'{unreadCount, plural, =1{1 unread chat} other{{unreadCount} unread chats}}'** + String unreadChats(int unreadCount); + + /// No description provided for @userAndOthersAreTyping. + /// + /// In en, this message translates to: + /// **'{username} and {count} others are typing…'** + String userAndOthersAreTyping(String username, int count); + + /// No description provided for @userAndUserAreTyping. + /// + /// In en, this message translates to: + /// **'{username} and {username2} are typing…'** + String userAndUserAreTyping(String username, String username2); + + /// No description provided for @userIsTyping. + /// + /// In en, this message translates to: + /// **'{username} is typing…'** + String userIsTyping(String username); + + /// No description provided for @userLeftTheChat. + /// + /// In en, this message translates to: + /// **'🚪 {username} left the chat'** + String userLeftTheChat(String username); + + /// No description provided for @username. + /// + /// In en, this message translates to: + /// **'Username'** + String get username; + + /// No description provided for @userSentUnknownEvent. + /// + /// In en, this message translates to: + /// **'{username} sent a {type} event'** + String userSentUnknownEvent(String username, String type); + + /// No description provided for @unverified. + /// + /// In en, this message translates to: + /// **'Unverified'** + String get unverified; + + /// No description provided for @verified. + /// + /// In en, this message translates to: + /// **'Verified'** + String get verified; + + /// No description provided for @verify. + /// + /// In en, this message translates to: + /// **'Verify'** + String get verify; + + /// No description provided for @verifyStart. + /// + /// In en, this message translates to: + /// **'Start Verification'** + String get verifyStart; + + /// No description provided for @verifySuccess. + /// + /// In en, this message translates to: + /// **'You successfully verified!'** + String get verifySuccess; + + /// No description provided for @verifyTitle. + /// + /// In en, this message translates to: + /// **'Verifying other account'** + String get verifyTitle; + + /// No description provided for @videoCall. + /// + /// In en, this message translates to: + /// **'Video call'** + String get videoCall; + + /// No description provided for @visibilityOfTheChatHistory. + /// + /// In en, this message translates to: + /// **'Visibility of the chat history'** + String get visibilityOfTheChatHistory; + + /// No description provided for @visibleForAllParticipants. + /// + /// In en, this message translates to: + /// **'Visible for all participants'** + String get visibleForAllParticipants; + + /// No description provided for @visibleForEveryone. + /// + /// In en, this message translates to: + /// **'Visible for everyone'** + String get visibleForEveryone; + + /// No description provided for @voiceMessage. + /// + /// In en, this message translates to: + /// **'Voice message'** + String get voiceMessage; + + /// No description provided for @waitingPartnerAcceptRequest. + /// + /// In en, this message translates to: + /// **'Waiting for partner to accept the request…'** + String get waitingPartnerAcceptRequest; + + /// No description provided for @waitingPartnerEmoji. + /// + /// In en, this message translates to: + /// **'Waiting for partner to accept the emoji…'** + String get waitingPartnerEmoji; + + /// No description provided for @waitingPartnerNumbers. + /// + /// In en, this message translates to: + /// **'Waiting for partner to accept the numbers…'** + String get waitingPartnerNumbers; + + /// No description provided for @wallpaper. + /// + /// In en, this message translates to: + /// **'Wallpaper:'** + String get wallpaper; + + /// No description provided for @warning. + /// + /// In en, this message translates to: + /// **'Warning!'** + String get warning; + + /// No description provided for @weSentYouAnEmail. + /// + /// In en, this message translates to: + /// **'We sent you an email'** + String get weSentYouAnEmail; + + /// No description provided for @whoCanPerformWhichAction. + /// + /// In en, this message translates to: + /// **'Who can perform which action'** + String get whoCanPerformWhichAction; + + /// No description provided for @whoIsAllowedToJoinThisGroup. + /// + /// In en, this message translates to: + /// **'Who is allowed to join this group'** + String get whoIsAllowedToJoinThisGroup; + + /// No description provided for @whyDoYouWantToReportThis. + /// + /// In en, this message translates to: + /// **'Why do you want to report this?'** + String get whyDoYouWantToReportThis; + + /// No description provided for @wipeChatBackup. + /// + /// In en, this message translates to: + /// **'Wipe your chat backup to create a new recovery key?'** + String get wipeChatBackup; + + /// No description provided for @withTheseAddressesRecoveryDescription. + /// + /// In en, this message translates to: + /// **'With these addresses you can recover your password.'** + String get withTheseAddressesRecoveryDescription; + + /// No description provided for @writeAMessage. + /// + /// In en, this message translates to: + /// **'Write a message…'** + String get writeAMessage; + + /// No description provided for @yes. + /// + /// In en, this message translates to: + /// **'Yes'** + String get yes; + + /// No description provided for @you. + /// + /// In en, this message translates to: + /// **'You'** + String get you; + + /// No description provided for @youAreNoLongerParticipatingInThisChat. + /// + /// In en, this message translates to: + /// **'You are no longer participating in this chat'** + String get youAreNoLongerParticipatingInThisChat; + + /// No description provided for @youHaveBeenBannedFromThisChat. + /// + /// In en, this message translates to: + /// **'You have been banned from this chat'** + String get youHaveBeenBannedFromThisChat; + + /// No description provided for @yourPublicKey. + /// + /// In en, this message translates to: + /// **'Your public key'** + String get yourPublicKey; + + /// No description provided for @messageInfo. + /// + /// In en, this message translates to: + /// **'Message info'** + String get messageInfo; + + /// No description provided for @time. + /// + /// In en, this message translates to: + /// **'Time'** + String get time; + + /// No description provided for @messageType. + /// + /// In en, this message translates to: + /// **'Message Type'** + String get messageType; + + /// No description provided for @sender. + /// + /// In en, this message translates to: + /// **'Sender'** + String get sender; + + /// No description provided for @openGallery. + /// + /// In en, this message translates to: + /// **'Open gallery'** + String get openGallery; + + /// No description provided for @removeFromSpace. + /// + /// In en, this message translates to: + /// **'Remove from space'** + String get removeFromSpace; + + /// No description provided for @addToSpaceDescription. + /// + /// In en, this message translates to: + /// **'Select a space to add this chat to it.'** + String get addToSpaceDescription; + + /// No description provided for @start. + /// + /// In en, this message translates to: + /// **'Start'** + String get start; + + /// No description provided for @pleaseEnterRecoveryKeyDescription. + /// + /// In en, this message translates to: + /// **'To unlock your old messages, please enter your recovery key that has been generated in a previous session. Your recovery key is NOT your password.'** + String get pleaseEnterRecoveryKeyDescription; + + /// No description provided for @publish. + /// + /// In en, this message translates to: + /// **'Publish'** + String get publish; + + /// No description provided for @videoWithSize. + /// + /// In en, this message translates to: + /// **'Video ({size})'** + String videoWithSize(String size); + + /// No description provided for @openChat. + /// + /// In en, this message translates to: + /// **'Open Chat'** + String get openChat; + + /// No description provided for @markAsRead. + /// + /// In en, this message translates to: + /// **'Mark as read'** + String get markAsRead; + + /// No description provided for @reportUser. + /// + /// In en, this message translates to: + /// **'Report user'** + String get reportUser; + + /// No description provided for @dismiss. + /// + /// In en, this message translates to: + /// **'Dismiss'** + String get dismiss; + + /// No description provided for @reactedWith. + /// + /// In en, this message translates to: + /// **'{sender} reacted with {reaction}'** + String reactedWith(String sender, String reaction); + + /// No description provided for @pinMessage. + /// + /// In en, this message translates to: + /// **'Pin to room'** + String get pinMessage; + + /// No description provided for @confirmEventUnpin. + /// + /// In en, this message translates to: + /// **'Are you sure to permanently unpin the event?'** + String get confirmEventUnpin; + + /// No description provided for @emojis. + /// + /// In en, this message translates to: + /// **'Emojis'** + String get emojis; + + /// No description provided for @placeCall. + /// + /// In en, this message translates to: + /// **'Place call'** + String get placeCall; + + /// No description provided for @voiceCall. + /// + /// In en, this message translates to: + /// **'Voice call'** + String get voiceCall; + + /// No description provided for @unsupportedAndroidVersion. + /// + /// In en, this message translates to: + /// **'Unsupported Android version'** + String get unsupportedAndroidVersion; + + /// No description provided for @unsupportedAndroidVersionLong. + /// + /// In en, this message translates to: + /// **'This feature requires a newer Android version. Please check for updates or Lineage OS support.'** + String get unsupportedAndroidVersionLong; + + /// No description provided for @videoCallsBetaWarning. + /// + /// In en, this message translates to: + /// **'Please note that video calls are currently in beta. They might not work as expected or work at all on all platforms.'** + String get videoCallsBetaWarning; + + /// No description provided for @experimentalVideoCalls. + /// + /// In en, this message translates to: + /// **'Experimental video calls'** + String get experimentalVideoCalls; + + /// No description provided for @emailOrUsername. + /// + /// In en, this message translates to: + /// **'Email or username'** + String get emailOrUsername; + + /// No description provided for @indexedDbErrorTitle. + /// + /// In en, this message translates to: + /// **'Private mode issues'** + String get indexedDbErrorTitle; + + /// No description provided for @indexedDbErrorLong. + /// + /// In en, this message translates to: + /// **'The message storage is unfortunately not enabled in private mode by default.\nPlease visit\n - about:config\n - set dom.indexedDB.privateBrowsing.enabled to true\nOtherwise, it is not possible to run Extera.'** + String get indexedDbErrorLong; + + /// No description provided for @switchToAccount. + /// + /// In en, this message translates to: + /// **'Switch to account {number}'** + String switchToAccount(String number); + + /// No description provided for @nextAccount. + /// + /// In en, this message translates to: + /// **'Next account'** + String get nextAccount; + + /// No description provided for @previousAccount. + /// + /// In en, this message translates to: + /// **'Previous account'** + String get previousAccount; + + /// No description provided for @addWidget. + /// + /// In en, this message translates to: + /// **'Add widget'** + String get addWidget; + + /// No description provided for @widgetVideo. + /// + /// In en, this message translates to: + /// **'Video'** + String get widgetVideo; + + /// No description provided for @widgetEtherpad. + /// + /// In en, this message translates to: + /// **'Text note'** + String get widgetEtherpad; + + /// No description provided for @widgetJitsi. + /// + /// In en, this message translates to: + /// **'Jitsi Meet'** + String get widgetJitsi; + + /// No description provided for @widgetCustom. + /// + /// In en, this message translates to: + /// **'Custom'** + String get widgetCustom; + + /// No description provided for @widgetName. + /// + /// In en, this message translates to: + /// **'Name'** + String get widgetName; + + /// No description provided for @widgetUrlError. + /// + /// In en, this message translates to: + /// **'This is not a valid URL.'** + String get widgetUrlError; + + /// No description provided for @widgetNameError. + /// + /// In en, this message translates to: + /// **'Please provide a display name.'** + String get widgetNameError; + + /// No description provided for @errorAddingWidget. + /// + /// In en, this message translates to: + /// **'Error adding the widget.'** + String get errorAddingWidget; + + /// No description provided for @youRejectedTheInvitation. + /// + /// In en, this message translates to: + /// **'You rejected the invitation'** + String get youRejectedTheInvitation; + + /// No description provided for @youJoinedTheChat. + /// + /// In en, this message translates to: + /// **'You joined the chat'** + String get youJoinedTheChat; + + /// No description provided for @youAcceptedTheInvitation. + /// + /// In en, this message translates to: + /// **'👍 You accepted the invitation'** + String get youAcceptedTheInvitation; + + /// No description provided for @youBannedUser. + /// + /// In en, this message translates to: + /// **'You banned {user}'** + String youBannedUser(String user); + + /// No description provided for @youHaveWithdrawnTheInvitationFor. + /// + /// In en, this message translates to: + /// **'You have withdrawn the invitation for {user}'** + String youHaveWithdrawnTheInvitationFor(String user); + + /// No description provided for @youInvitedToBy. + /// + /// In en, this message translates to: + /// **'📩 You have been invited via link to:\n{alias}'** + String youInvitedToBy(String alias); + + /// No description provided for @youInvitedBy. + /// + /// In en, this message translates to: + /// **'📩 You have been invited by {user}'** + String youInvitedBy(String user); + + /// No description provided for @invitedBy. + /// + /// In en, this message translates to: + /// **'📩 Invited by {user}'** + String invitedBy(String user); + + /// No description provided for @youInvitedUser. + /// + /// In en, this message translates to: + /// **'📩 You invited {user}'** + String youInvitedUser(String user); + + /// No description provided for @youKicked. + /// + /// In en, this message translates to: + /// **'👞 You kicked {user}'** + String youKicked(String user); + + /// No description provided for @youKickedAndBanned. + /// + /// In en, this message translates to: + /// **'🙅 You kicked and banned {user}'** + String youKickedAndBanned(String user); + + /// No description provided for @youUnbannedUser. + /// + /// In en, this message translates to: + /// **'You unbanned {user}'** + String youUnbannedUser(String user); + + /// No description provided for @hasKnocked. + /// + /// In en, this message translates to: + /// **'🚪 {user} has knocked'** + String hasKnocked(String user); + + /// No description provided for @usersMustKnock. + /// + /// In en, this message translates to: + /// **'Users must knock'** + String get usersMustKnock; + + /// No description provided for @noOneCanJoin. + /// + /// In en, this message translates to: + /// **'No one can join'** + String get noOneCanJoin; + + /// No description provided for @userWouldLikeToChangeTheChat. + /// + /// In en, this message translates to: + /// **'{user} would like to join the chat.'** + String userWouldLikeToChangeTheChat(String user); + + /// No description provided for @noPublicLinkHasBeenCreatedYet. + /// + /// In en, this message translates to: + /// **'No public link has been created yet'** + String get noPublicLinkHasBeenCreatedYet; + + /// No description provided for @knock. + /// + /// In en, this message translates to: + /// **'Knock'** + String get knock; + + /// No description provided for @users. + /// + /// In en, this message translates to: + /// **'Users'** + String get users; + + /// No description provided for @unlockOldMessages. + /// + /// In en, this message translates to: + /// **'Unlock old messages'** + String get unlockOldMessages; + + /// No description provided for @storeInSecureStorageDescription. + /// + /// In en, this message translates to: + /// **'Store the recovery key in the secure storage of this device.'** + String get storeInSecureStorageDescription; + + /// No description provided for @saveKeyManuallyDescription. + /// + /// In en, this message translates to: + /// **'Save this key manually by triggering the system share dialog or clipboard.'** + String get saveKeyManuallyDescription; + + /// No description provided for @storeInAndroidKeystore. + /// + /// In en, this message translates to: + /// **'Store in Android KeyStore'** + String get storeInAndroidKeystore; + + /// No description provided for @storeInAppleKeyChain. + /// + /// In en, this message translates to: + /// **'Store in Apple KeyChain'** + String get storeInAppleKeyChain; + + /// No description provided for @storeSecurlyOnThisDevice. + /// + /// In en, this message translates to: + /// **'Store securely on this device'** + String get storeSecurlyOnThisDevice; + + /// No description provided for @countFiles. + /// + /// In en, this message translates to: + /// **'{count} files'** + String countFiles(int count); + + /// No description provided for @user. + /// + /// In en, this message translates to: + /// **'User'** + String get user; + + /// No description provided for @custom. + /// + /// In en, this message translates to: + /// **'Custom'** + String get custom; + + /// No description provided for @foregroundServiceRunning. + /// + /// In en, this message translates to: + /// **'This notification appears when the foreground service is running.'** + String get foregroundServiceRunning; + + /// No description provided for @screenSharingTitle. + /// + /// In en, this message translates to: + /// **'screen sharing'** + String get screenSharingTitle; + + /// No description provided for @screenSharingDetail. + /// + /// In en, this message translates to: + /// **'You are sharing your screen in Extera'** + String get screenSharingDetail; + + /// No description provided for @callingPermissions. + /// + /// In en, this message translates to: + /// **'Calling permissions'** + String get callingPermissions; + + /// No description provided for @callingAccount. + /// + /// In en, this message translates to: + /// **'Calling account'** + String get callingAccount; + + /// No description provided for @callingAccountDetails. + /// + /// In en, this message translates to: + /// **'Allows Extera to use the native android dialer app.'** + String get callingAccountDetails; + + /// No description provided for @appearOnTop. + /// + /// In en, this message translates to: + /// **'Appear on top'** + String get appearOnTop; + + /// No description provided for @appearOnTopDetails. + /// + /// In en, this message translates to: + /// **'Allows the app to appear on top (not needed if you already have Fluffychat setup as a calling account)'** + String get appearOnTopDetails; + + /// No description provided for @otherCallingPermissions. + /// + /// In en, this message translates to: + /// **'Microphone, camera and other Extera permissions'** + String get otherCallingPermissions; + + /// No description provided for @whyIsThisMessageEncrypted. + /// + /// In en, this message translates to: + /// **'Why is this message unreadable?'** + String get whyIsThisMessageEncrypted; + + /// No description provided for @noKeyForThisMessage. + /// + /// In en, this message translates to: + /// **'This can happen if the message was sent before you have signed in to your account at this device.\n\nIt is also possible that the sender has blocked your device or something went wrong with the internet connection.\n\nAre you able to read the message on another session? Then you can transfer the message from it! Go to Settings > Devices and make sure that your devices have verified each other. When you open the room the next time and both sessions are in the foreground, the keys will be transmitted automatically.\n\nDo you not want to lose the keys when logging out or switching devices? Make sure that you have enabled the chat backup in the settings.'** + String get noKeyForThisMessage; + + /// No description provided for @newGroup. + /// + /// In en, this message translates to: + /// **'New group'** + String get newGroup; + + /// No description provided for @newSpace. + /// + /// In en, this message translates to: + /// **'New space'** + String get newSpace; + + /// No description provided for @enterSpace. + /// + /// In en, this message translates to: + /// **'Enter space'** + String get enterSpace; + + /// No description provided for @enterRoom. + /// + /// In en, this message translates to: + /// **'Enter room'** + String get enterRoom; + + /// No description provided for @allSpaces. + /// + /// In en, this message translates to: + /// **'All spaces'** + String get allSpaces; + + /// No description provided for @numChats. + /// + /// In en, this message translates to: + /// **'{number} chats'** + String numChats(String number); + + /// No description provided for @hideUnimportantStateEvents. + /// + /// In en, this message translates to: + /// **'Hide unimportant state events'** + String get hideUnimportantStateEvents; + + /// No description provided for @hidePresences. + /// + /// In en, this message translates to: + /// **'Hide Status List?'** + String get hidePresences; + + /// No description provided for @doNotShowAgain. + /// + /// In en, this message translates to: + /// **'Do not show again'** + String get doNotShowAgain; + + /// No description provided for @wasDirectChatDisplayName. + /// + /// In en, this message translates to: + /// **'Empty chat (was {oldDisplayName})'** + String wasDirectChatDisplayName(String oldDisplayName); + + /// No description provided for @newSpaceDescription. + /// + /// In en, this message translates to: + /// **'Spaces allows you to consolidate your chats and build private or public communities.'** + String get newSpaceDescription; + + /// No description provided for @encryptThisChat. + /// + /// In en, this message translates to: + /// **'Encrypt this chat'** + String get encryptThisChat; + + /// No description provided for @disableEncryptionWarning. + /// + /// In en, this message translates to: + /// **'For security reasons you can not disable encryption in a chat, where it has been enabled before.'** + String get disableEncryptionWarning; + + /// No description provided for @sorryThatsNotPossible. + /// + /// In en, this message translates to: + /// **'Sorry... that is not possible'** + String get sorryThatsNotPossible; + + /// No description provided for @deviceKeys. + /// + /// In en, this message translates to: + /// **'Device keys:'** + String get deviceKeys; + + /// No description provided for @reopenChat. + /// + /// In en, this message translates to: + /// **'Reopen chat'** + String get reopenChat; + + /// No description provided for @noBackupWarning. + /// + /// In en, this message translates to: + /// **'Warning! Without enabling chat backup, you will lose access to your encrypted messages. It is highly recommended to enable the chat backup first before logging out.'** + String get noBackupWarning; + + /// No description provided for @noOtherDevicesFound. + /// + /// In en, this message translates to: + /// **'No other devices found'** + String get noOtherDevicesFound; + + /// No description provided for @fileIsTooBigForServer. + /// + /// In en, this message translates to: + /// **'Unable to send! The server only supports attachments up to {max}.'** + String fileIsTooBigForServer(String max); + + /// No description provided for @fileHasBeenSavedAt. + /// + /// In en, this message translates to: + /// **'File has been saved at {path}'** + String fileHasBeenSavedAt(String path); + + /// No description provided for @jumpToLastReadMessage. + /// + /// In en, this message translates to: + /// **'Jump to last read message'** + String get jumpToLastReadMessage; + + /// No description provided for @readUpToHere. + /// + /// In en, this message translates to: + /// **'Read up to here'** + String get readUpToHere; + + /// No description provided for @jump. + /// + /// In en, this message translates to: + /// **'Jump'** + String get jump; + + /// No description provided for @openLinkInBrowser. + /// + /// In en, this message translates to: + /// **'Open link in browser'** + String get openLinkInBrowser; + + /// No description provided for @reportErrorDescription. + /// + /// In en, this message translates to: + /// **'😭 Oh no. Something went wrong. If you want, you can report this bug to the developers.'** + String get reportErrorDescription; + + /// No description provided for @report. + /// + /// In en, this message translates to: + /// **'Report'** + String get report; + + /// No description provided for @signInWithPassword. + /// + /// In en, this message translates to: + /// **'Sign in with password'** + String get signInWithPassword; + + /// No description provided for @pleaseTryAgainLaterOrChooseDifferentServer. + /// + /// In en, this message translates to: + /// **'Please try again later or choose a different server.'** + String get pleaseTryAgainLaterOrChooseDifferentServer; + + /// No description provided for @signInWith. + /// + /// In en, this message translates to: + /// **'Sign in with {provider}'** + String signInWith(String provider); + + /// No description provided for @profileNotFound. + /// + /// In en, this message translates to: + /// **'The user could not be found on the server. Maybe there is a connection problem or the user doesn\'t exist.'** + String get profileNotFound; + + /// No description provided for @setTheme. + /// + /// In en, this message translates to: + /// **'Set theme:'** + String get setTheme; + + /// No description provided for @setColorTheme. + /// + /// In en, this message translates to: + /// **'Set color theme:'** + String get setColorTheme; + + /// No description provided for @invite. + /// + /// In en, this message translates to: + /// **'Invite'** + String get invite; + + /// No description provided for @inviteGroupChat. + /// + /// In en, this message translates to: + /// **'📨 Invite group chat'** + String get inviteGroupChat; + + /// No description provided for @invitePrivateChat. + /// + /// In en, this message translates to: + /// **'📨 Invite private chat'** + String get invitePrivateChat; + + /// No description provided for @invalidInput. + /// + /// In en, this message translates to: + /// **'Invalid input!'** + String get invalidInput; + + /// No description provided for @wrongPinEntered. + /// + /// In en, this message translates to: + /// **'Wrong pin entered! Try again in {seconds} seconds...'** + String wrongPinEntered(int seconds); + + /// No description provided for @pleaseEnterANumber. + /// + /// In en, this message translates to: + /// **'Please enter a number greater than 0'** + String get pleaseEnterANumber; + + /// No description provided for @archiveRoomDescription. + /// + /// In en, this message translates to: + /// **'The chat will be moved to the archive. Other users will be able to see that you have left the chat.'** + String get archiveRoomDescription; + + /// No description provided for @roomUpgradeDescription. + /// + /// In en, this message translates to: + /// **'The chat will then be recreated with the new room version. All participants will be notified that they need to switch to the new chat. You can find out more about room versions at https://spec.matrix.org/latest/rooms/'** + String get roomUpgradeDescription; + + /// No description provided for @removeDevicesDescription. + /// + /// In en, this message translates to: + /// **'You will be logged out of this device and will no longer be able to receive messages.'** + String get removeDevicesDescription; + + /// No description provided for @banUserDescription. + /// + /// In en, this message translates to: + /// **'The user will be banned from the chat and will not be able to enter the chat again until they are unbanned.'** + String get banUserDescription; + + /// No description provided for @unbanUserDescription. + /// + /// In en, this message translates to: + /// **'The user will be able to enter the chat again if they try.'** + String get unbanUserDescription; + + /// No description provided for @kickUserDescription. + /// + /// In en, this message translates to: + /// **'The user is kicked out of the chat but not banned. In public chats, the user can rejoin at any time.'** + String get kickUserDescription; + + /// No description provided for @makeAdminDescription. + /// + /// In en, this message translates to: + /// **'Once you make this user admin, you may not be able to undo this as they will then have the same permissions as you.'** + String get makeAdminDescription; + + /// No description provided for @pushNotificationsNotAvailable. + /// + /// In en, this message translates to: + /// **'Push notifications not available'** + String get pushNotificationsNotAvailable; + + /// No description provided for @learnMore. + /// + /// In en, this message translates to: + /// **'Learn more'** + String get learnMore; + + /// No description provided for @yourGlobalUserIdIs. + /// + /// In en, this message translates to: + /// **'Your global user-ID is: '** + String get yourGlobalUserIdIs; + + /// No description provided for @noUsersFoundWithQuery. + /// + /// In en, this message translates to: + /// **'Unfortunately no user could be found with \"{query}\". Please check whether you made a typo.'** + String noUsersFoundWithQuery(String query); + + /// No description provided for @knocking. + /// + /// In en, this message translates to: + /// **'Knocking'** + String get knocking; + + /// No description provided for @chatCanBeDiscoveredViaSearchOnServer. + /// + /// In en, this message translates to: + /// **'Chat can be discovered via the search on {server}'** + String chatCanBeDiscoveredViaSearchOnServer(String server); + + /// No description provided for @searchChatsRooms. + /// + /// In en, this message translates to: + /// **'Search for #chats, @users...'** + String get searchChatsRooms; + + /// No description provided for @nothingFound. + /// + /// In en, this message translates to: + /// **'Nothing found...'** + String get nothingFound; + + /// No description provided for @groupName. + /// + /// In en, this message translates to: + /// **'Group name'** + String get groupName; + + /// No description provided for @createGroupAndInviteUsers. + /// + /// In en, this message translates to: + /// **'Create a group and invite users'** + String get createGroupAndInviteUsers; + + /// No description provided for @groupCanBeFoundViaSearch. + /// + /// In en, this message translates to: + /// **'Group can be found via search'** + String get groupCanBeFoundViaSearch; + + /// No description provided for @wrongRecoveryKey. + /// + /// In en, this message translates to: + /// **'Sorry... this does not seem to be the correct recovery key.'** + String get wrongRecoveryKey; + + /// No description provided for @startConversation. + /// + /// In en, this message translates to: + /// **'Start conversation'** + String get startConversation; + + /// No description provided for @commandHint_sendraw. + /// + /// In en, this message translates to: + /// **'Send raw json'** + String get commandHint_sendraw; + + /// No description provided for @databaseMigrationTitle. + /// + /// In en, this message translates to: + /// **'Database is optimized'** + String get databaseMigrationTitle; + + /// No description provided for @databaseMigrationBody. + /// + /// In en, this message translates to: + /// **'Please wait. This may take a moment.'** + String get databaseMigrationBody; + + /// No description provided for @leaveEmptyToClearStatus. + /// + /// In en, this message translates to: + /// **'Leave empty to clear your status.'** + String get leaveEmptyToClearStatus; + + /// No description provided for @select. + /// + /// In en, this message translates to: + /// **'Select'** + String get select; + + /// No description provided for @searchForUsers. + /// + /// In en, this message translates to: + /// **'Search for @users...'** + String get searchForUsers; + + /// No description provided for @pleaseEnterYourCurrentPassword. + /// + /// In en, this message translates to: + /// **'Please enter your current password'** + String get pleaseEnterYourCurrentPassword; + + /// No description provided for @newPassword. + /// + /// In en, this message translates to: + /// **'New password'** + String get newPassword; + + /// No description provided for @pleaseChooseAStrongPassword. + /// + /// In en, this message translates to: + /// **'Please choose a strong password'** + String get pleaseChooseAStrongPassword; + + /// No description provided for @passwordsDoNotMatch. + /// + /// In en, this message translates to: + /// **'Passwords do not match'** + String get passwordsDoNotMatch; + + /// No description provided for @passwordIsWrong. + /// + /// In en, this message translates to: + /// **'Your entered password is wrong'** + String get passwordIsWrong; + + /// No description provided for @publicLink. + /// + /// In en, this message translates to: + /// **'Public link'** + String get publicLink; + + /// No description provided for @publicChatAddresses. + /// + /// In en, this message translates to: + /// **'Public chat addresses'** + String get publicChatAddresses; + + /// No description provided for @createNewAddress. + /// + /// In en, this message translates to: + /// **'Create new address'** + String get createNewAddress; + + /// No description provided for @joinSpace. + /// + /// In en, this message translates to: + /// **'Join space'** + String get joinSpace; + + /// No description provided for @publicSpaces. + /// + /// In en, this message translates to: + /// **'Public spaces'** + String get publicSpaces; + + /// No description provided for @addChatOrSubSpace. + /// + /// In en, this message translates to: + /// **'Add chat or sub space'** + String get addChatOrSubSpace; + + /// No description provided for @subspace. + /// + /// In en, this message translates to: + /// **'Subspace'** + String get subspace; + + /// No description provided for @decline. + /// + /// In en, this message translates to: + /// **'Decline'** + String get decline; + + /// No description provided for @thisDevice. + /// + /// In en, this message translates to: + /// **'This device:'** + String get thisDevice; + + /// No description provided for @initAppError. + /// + /// In en, this message translates to: + /// **'An error occured while init the app'** + String get initAppError; + + /// No description provided for @userRole. + /// + /// In en, this message translates to: + /// **'User role'** + String get userRole; + + /// No description provided for @minimumPowerLevel. + /// + /// In en, this message translates to: + /// **'{level} is the minimum power level.'** + String minimumPowerLevel(String level); + + /// No description provided for @searchIn. + /// + /// In en, this message translates to: + /// **'Search in chat \"{chat}\"...'** + String searchIn(String chat); + + /// No description provided for @searchMore. + /// + /// In en, this message translates to: + /// **'Search more...'** + String get searchMore; + + /// No description provided for @gallery. + /// + /// In en, this message translates to: + /// **'Gallery'** + String get gallery; + + /// No description provided for @files. + /// + /// In en, this message translates to: + /// **'Files'** + String get files; + + /// No description provided for @databaseBuildErrorBody. + /// + /// In en, this message translates to: + /// **'Unable to build the SQlite database. The app tries to use the legacy database for now. Please report this error to the developers at {url}. The error message is: {error}'** + String databaseBuildErrorBody(String url, String error); + + /// No description provided for @sessionLostBody. + /// + /// In en, this message translates to: + /// **'Your session is lost. Please report this error to the developers at {url}. The error message is: {error}'** + String sessionLostBody(String url, String error); + + /// No description provided for @restoreSessionBody. + /// + /// In en, this message translates to: + /// **'The app now tries to restore your session from the backup. Please report this error to the developers at {url}. The error message is: {error}'** + String restoreSessionBody(String url, String error); + + /// No description provided for @forwardMessageTo. + /// + /// In en, this message translates to: + /// **'Forward message to {roomName}?'** + String forwardMessageTo(String roomName); + + /// No description provided for @sendReadReceipts. + /// + /// In en, this message translates to: + /// **'Send read receipts'** + String get sendReadReceipts; + + /// No description provided for @sendTypingNotificationsDescription. + /// + /// In en, this message translates to: + /// **'Other participants in a chat can see when you are typing a new message.'** + String get sendTypingNotificationsDescription; + + /// No description provided for @sendReadReceiptsDescription. + /// + /// In en, this message translates to: + /// **'Other participants in a chat can see when you have read a message.'** + String get sendReadReceiptsDescription; + + /// No description provided for @formattedMessages. + /// + /// In en, this message translates to: + /// **'Formatted messages'** + String get formattedMessages; + + /// No description provided for @formattedMessagesDescription. + /// + /// In en, this message translates to: + /// **'Display rich message content like bold text using markdown.'** + String get formattedMessagesDescription; + + /// No description provided for @verifyOtherUser. + /// + /// In en, this message translates to: + /// **'🔐 Verify other user'** + String get verifyOtherUser; + + /// No description provided for @verifyOtherUserDescription. + /// + /// In en, this message translates to: + /// **'If you verify another user, you can be sure that you know who you are really writing to. 💪\n\nWhen you start a verification, you and the other user will see a popup in the app. There you will then see a series of emojis or numbers that you have to compare with each other.\n\nThe best way to do this is to meet up or start a video call. 👭'** + String get verifyOtherUserDescription; + + /// No description provided for @verifyOtherDevice. + /// + /// In en, this message translates to: + /// **'🔐 Verify other device'** + String get verifyOtherDevice; + + /// No description provided for @verifyOtherDeviceDescription. + /// + /// In en, this message translates to: + /// **'When you verify another device, those devices can exchange keys, increasing your overall security. 💪 When you start a verification, a popup will appear in the app on both devices. There you will then see a series of emojis or numbers that you have to compare with each other. It\'s best to have both devices handy before you start the verification. 🤳'** + String get verifyOtherDeviceDescription; + + /// No description provided for @acceptedKeyVerification. + /// + /// In en, this message translates to: + /// **'{sender} accepted key verification'** + String acceptedKeyVerification(String sender); + + /// No description provided for @canceledKeyVerification. + /// + /// In en, this message translates to: + /// **'{sender} canceled key verification'** + String canceledKeyVerification(String sender); + + /// No description provided for @completedKeyVerification. + /// + /// In en, this message translates to: + /// **'{sender} completed key verification'** + String completedKeyVerification(String sender); + + /// No description provided for @isReadyForKeyVerification. + /// + /// In en, this message translates to: + /// **'{sender} is ready for key verification'** + String isReadyForKeyVerification(String sender); + + /// No description provided for @requestedKeyVerification. + /// + /// In en, this message translates to: + /// **'{sender} requested key verification'** + String requestedKeyVerification(String sender); + + /// No description provided for @startedKeyVerification. + /// + /// In en, this message translates to: + /// **'{sender} started key verification'** + String startedKeyVerification(String sender); + + /// No description provided for @transparent. + /// + /// In en, this message translates to: + /// **'Transparent'** + String get transparent; + + /// No description provided for @incomingMessages. + /// + /// In en, this message translates to: + /// **'Incoming messages'** + String get incomingMessages; + + /// No description provided for @stickers. + /// + /// In en, this message translates to: + /// **'Stickers'** + String get stickers; + + /// No description provided for @discover. + /// + /// In en, this message translates to: + /// **'Discover'** + String get discover; + + /// No description provided for @commandHint_ignore. + /// + /// In en, this message translates to: + /// **'Ignore the given matrix ID'** + String get commandHint_ignore; + + /// No description provided for @commandHint_unignore. + /// + /// In en, this message translates to: + /// **'Unignore the given matrix ID'** + String get commandHint_unignore; + + /// No description provided for @unreadChatsInApp. + /// + /// In en, this message translates to: + /// **'{appname}: {unread} unread chats'** + String unreadChatsInApp(String appname, String unread); + + /// No description provided for @noDatabaseEncryption. + /// + /// In en, this message translates to: + /// **'Database encryption is not supported on this platform'** + String get noDatabaseEncryption; + + /// No description provided for @thereAreCountUsersBlocked. + /// + /// In en, this message translates to: + /// **'Right now there are {count} users blocked.'** + String thereAreCountUsersBlocked(Object count); + + /// No description provided for @restricted. + /// + /// In en, this message translates to: + /// **'Restricted'** + String get restricted; + + /// No description provided for @knockRestricted. + /// + /// In en, this message translates to: + /// **'Knock restricted'** + String get knockRestricted; + + /// No description provided for @goToSpace. + /// + /// In en, this message translates to: + /// **'Go to space: {space}'** + String goToSpace(Object space); + + /// No description provided for @markAsUnread. + /// + /// In en, this message translates to: + /// **'Mark as unread'** + String get markAsUnread; + + /// No description provided for @userLevel. + /// + /// In en, this message translates to: + /// **'{level} - User'** + String userLevel(int level); + + /// No description provided for @moderatorLevel. + /// + /// In en, this message translates to: + /// **'{level} - Moderator'** + String moderatorLevel(int level); + + /// No description provided for @adminLevel. + /// + /// In en, this message translates to: + /// **'{level} - Admin'** + String adminLevel(int level); + + /// No description provided for @changeGeneralChatSettings. + /// + /// In en, this message translates to: + /// **'Change general chat settings'** + String get changeGeneralChatSettings; + + /// No description provided for @inviteOtherUsers. + /// + /// In en, this message translates to: + /// **'Invite other users to this chat'** + String get inviteOtherUsers; + + /// No description provided for @changeTheChatPermissions. + /// + /// In en, this message translates to: + /// **'Change the chat permissions'** + String get changeTheChatPermissions; + + /// No description provided for @changeTheVisibilityOfChatHistory. + /// + /// In en, this message translates to: + /// **'Change the visibility of the chat history'** + String get changeTheVisibilityOfChatHistory; + + /// No description provided for @changeTheCanonicalRoomAlias. + /// + /// In en, this message translates to: + /// **'Change the main public chat address'** + String get changeTheCanonicalRoomAlias; + + /// No description provided for @sendRoomNotifications. + /// + /// In en, this message translates to: + /// **'Send a @room notifications'** + String get sendRoomNotifications; + + /// No description provided for @changeTheDescriptionOfTheGroup. + /// + /// In en, this message translates to: + /// **'Change the description of the chat'** + String get changeTheDescriptionOfTheGroup; + + /// No description provided for @chatPermissionsDescription. + /// + /// In en, this message translates to: + /// **'Define which power level is necessary for certain actions in this chat. The power levels 0, 50 and 100 are usually representing users, moderators and admins, but any gradation is possible.'** + String get chatPermissionsDescription; + + /// No description provided for @updateInstalled. + /// + /// In en, this message translates to: + /// **'🎉 Update {version} installed!'** + String updateInstalled(String version); + + /// No description provided for @changelog. + /// + /// In en, this message translates to: + /// **'Changelog'** + String get changelog; + + /// No description provided for @sendCanceled. + /// + /// In en, this message translates to: + /// **'Sending canceled'** + String get sendCanceled; + + /// No description provided for @loginWithMatrixId. + /// + /// In en, this message translates to: + /// **'Login with Matrix-ID'** + String get loginWithMatrixId; + + /// No description provided for @discoverHomeservers. + /// + /// In en, this message translates to: + /// **'Discover homeservers'** + String get discoverHomeservers; + + /// No description provided for @whatIsAHomeserver. + /// + /// In en, this message translates to: + /// **'What is a homeserver?'** + String get whatIsAHomeserver; + + /// No description provided for @homeserverDescription. + /// + /// In en, this message translates to: + /// **'All your data is stored on the homeserver, just like an email provider. You can choose which homeserver you want to use, while you can still communicate with everyone. Learn more at at https://matrix.org.'** + String get homeserverDescription; + + /// No description provided for @doesNotSeemToBeAValidHomeserver. + /// + /// In en, this message translates to: + /// **'Doesn\'t seem to be a compatible homeserver. Wrong URL?'** + String get doesNotSeemToBeAValidHomeserver; + + /// No description provided for @calculatingFileSize. + /// + /// In en, this message translates to: + /// **'Calculating file size...'** + String get calculatingFileSize; + + /// No description provided for @prepareSendingAttachment. + /// + /// In en, this message translates to: + /// **'Prepare sending attachment...'** + String get prepareSendingAttachment; + + /// No description provided for @sendingAttachment. + /// + /// In en, this message translates to: + /// **'Sending attachment...'** + String get sendingAttachment; + + /// No description provided for @generatingVideoThumbnail. + /// + /// In en, this message translates to: + /// **'Generating video thumbnail...'** + String get generatingVideoThumbnail; + + /// No description provided for @compressVideo. + /// + /// In en, this message translates to: + /// **'Compressing video...'** + String get compressVideo; + + /// No description provided for @sendingAttachmentCountOfCount. + /// + /// In en, this message translates to: + /// **'Sending attachment {index} of {length}...'** + String sendingAttachmentCountOfCount(int index, int length); + + /// No description provided for @serverLimitReached. + /// + /// In en, this message translates to: + /// **'Server limit reached! Waiting {seconds} seconds...'** + String serverLimitReached(int seconds); + + /// No description provided for @oneOfYourDevicesIsNotVerified. + /// + /// In en, this message translates to: + /// **'One of your devices is not verified'** + String get oneOfYourDevicesIsNotVerified; + + /// No description provided for @noticeChatBackupDeviceVerification. + /// + /// In en, this message translates to: + /// **'Note: When you connect all your devices to the chat backup, they are automatically verified.'** + String get noticeChatBackupDeviceVerification; + + /// No description provided for @continueText. + /// + /// In en, this message translates to: + /// **'Continue'** + String get continueText; + + /// No description provided for @welcomeText. + /// + /// In en, this message translates to: + /// **'Hey Hey 👋 This is Extera. You can sign in to any homeserver, which is compatible with https://matrix.org. And then chat with anyone. It\'s a huge decentralized messaging network!'** + String get welcomeText; + + /// No description provided for @blur. + /// + /// In en, this message translates to: + /// **'Blur:'** + String get blur; + + /// No description provided for @opacity. + /// + /// In en, this message translates to: + /// **'Opacity:'** + String get opacity; + + /// No description provided for @setWallpaper. + /// + /// In en, this message translates to: + /// **'Set wallpaper'** + String get setWallpaper; + + /// No description provided for @manageAccount. + /// + /// In en, this message translates to: + /// **'Manage account'** + String get manageAccount; + + /// No description provided for @noContactInformationProvided. + /// + /// In en, this message translates to: + /// **'Server does not provide any valid contact information'** + String get noContactInformationProvided; + + /// No description provided for @contactServerAdmin. + /// + /// In en, this message translates to: + /// **'Contact server admin'** + String get contactServerAdmin; + + /// No description provided for @contactServerSecurity. + /// + /// In en, this message translates to: + /// **'Contact server security'** + String get contactServerSecurity; + + /// No description provided for @supportPage. + /// + /// In en, this message translates to: + /// **'Support page'** + String get supportPage; + + /// No description provided for @serverInformation. + /// + /// In en, this message translates to: + /// **'Server information:'** + String get serverInformation; + + /// No description provided for @name. + /// + /// In en, this message translates to: + /// **'Name'** + String get name; + + /// No description provided for @version. + /// + /// In en, this message translates to: + /// **'Version'** + String get version; + + /// No description provided for @website. + /// + /// In en, this message translates to: + /// **'Website'** + String get website; + + /// No description provided for @compress. + /// + /// In en, this message translates to: + /// **'Compress'** + String get compress; + + /// No description provided for @boldText. + /// + /// In en, this message translates to: + /// **'Bold text'** + String get boldText; + + /// No description provided for @italicText. + /// + /// In en, this message translates to: + /// **'Italic text'** + String get italicText; + + /// No description provided for @strikeThrough. + /// + /// In en, this message translates to: + /// **'Strikethrough'** + String get strikeThrough; + + /// No description provided for @pleaseFillOut. + /// + /// In en, this message translates to: + /// **'Please fill out'** + String get pleaseFillOut; + + /// No description provided for @invalidUrl. + /// + /// In en, this message translates to: + /// **'Invalid url'** + String get invalidUrl; + + /// No description provided for @addLink. + /// + /// In en, this message translates to: + /// **'Add link'** + String get addLink; + + /// No description provided for @unableToJoinChat. + /// + /// In en, this message translates to: + /// **'Unable to join chat. Maybe the other party has already closed the conversation.'** + String get unableToJoinChat; + + /// No description provided for @previous. + /// + /// In en, this message translates to: + /// **'Previous'** + String get previous; + + /// No description provided for @otherPartyNotLoggedIn. + /// + /// In en, this message translates to: + /// **'The other party is currently not logged in and therefore cannot receive messages!'** + String get otherPartyNotLoggedIn; + + /// No description provided for @appWantsToUseForLogin. + /// + /// In en, this message translates to: + /// **'Use \'{server}\' to log in'** + String appWantsToUseForLogin(String server); + + /// No description provided for @appWantsToUseForLoginDescription. + /// + /// In en, this message translates to: + /// **'You hereby allow the app and website to share information about you.'** + String get appWantsToUseForLoginDescription; + + /// No description provided for @open. + /// + /// In en, this message translates to: + /// **'Open'** + String get open; + + /// No description provided for @waitingForServer. + /// + /// In en, this message translates to: + /// **'Waiting for server...'** + String get waitingForServer; + + /// No description provided for @appIntroduction. + /// + /// In en, this message translates to: + /// **'Extera lets you chat with your friends across different messengers. Learn more at https://matrix.org or just tap *Continue*.'** + String get appIntroduction; + + /// No description provided for @newChatRequest. + /// + /// In en, this message translates to: + /// **'📩 New chat request'** + String get newChatRequest; + + /// No description provided for @contentNotificationSettings. + /// + /// In en, this message translates to: + /// **'Content notification settings'** + String get contentNotificationSettings; + + /// No description provided for @generalNotificationSettings. + /// + /// In en, this message translates to: + /// **'General notification settings'** + String get generalNotificationSettings; + + /// No description provided for @roomNotificationSettings. + /// + /// In en, this message translates to: + /// **'Room notification settings'** + String get roomNotificationSettings; + + /// No description provided for @userSpecificNotificationSettings. + /// + /// In en, this message translates to: + /// **'User specific notification settings'** + String get userSpecificNotificationSettings; + + /// No description provided for @otherNotificationSettings. + /// + /// In en, this message translates to: + /// **'Other notification settings'** + String get otherNotificationSettings; + + /// No description provided for @notificationRuleContainsUserName. + /// + /// In en, this message translates to: + /// **'Contains User Name'** + String get notificationRuleContainsUserName; + + /// No description provided for @notificationRuleContainsUserNameDescription. + /// + /// In en, this message translates to: + /// **'Notifies the user when a message contains their username.'** + String get notificationRuleContainsUserNameDescription; + + /// No description provided for @notificationRuleMaster. + /// + /// In en, this message translates to: + /// **'Mute all notifications'** + String get notificationRuleMaster; + + /// No description provided for @notificationRuleMasterDescription. + /// + /// In en, this message translates to: + /// **'Overrides all other rules and disables all notifications.'** + String get notificationRuleMasterDescription; + + /// No description provided for @notificationRuleSuppressNotices. + /// + /// In en, this message translates to: + /// **'Suppress Automated Messages'** + String get notificationRuleSuppressNotices; + + /// No description provided for @notificationRuleSuppressNoticesDescription. + /// + /// In en, this message translates to: + /// **'Suppresses notifications from automated clients like bots.'** + String get notificationRuleSuppressNoticesDescription; + + /// No description provided for @notificationRuleInviteForMe. + /// + /// In en, this message translates to: + /// **'Invite for Me'** + String get notificationRuleInviteForMe; + + /// No description provided for @notificationRuleInviteForMeDescription. + /// + /// In en, this message translates to: + /// **'Notifies the user when they are invited to a room.'** + String get notificationRuleInviteForMeDescription; + + /// No description provided for @notificationRuleMemberEvent. + /// + /// In en, this message translates to: + /// **'Member Event'** + String get notificationRuleMemberEvent; + + /// No description provided for @notificationRuleMemberEventDescription. + /// + /// In en, this message translates to: + /// **'Suppresses notifications for membership events.'** + String get notificationRuleMemberEventDescription; + + /// No description provided for @notificationRuleIsUserMention. + /// + /// In en, this message translates to: + /// **'User Mention'** + String get notificationRuleIsUserMention; + + /// No description provided for @notificationRuleIsUserMentionDescription. + /// + /// In en, this message translates to: + /// **'Notifies the user when they are directly mentioned in a message.'** + String get notificationRuleIsUserMentionDescription; + + /// No description provided for @notificationRuleContainsDisplayName. + /// + /// In en, this message translates to: + /// **'Contains Display Name'** + String get notificationRuleContainsDisplayName; + + /// No description provided for @notificationRuleContainsDisplayNameDescription. + /// + /// In en, this message translates to: + /// **'Notifies the user when a message contains their display name.'** + String get notificationRuleContainsDisplayNameDescription; + + /// No description provided for @notificationRuleIsRoomMention. + /// + /// In en, this message translates to: + /// **'Room Mention'** + String get notificationRuleIsRoomMention; + + /// No description provided for @notificationRuleIsRoomMentionDescription. + /// + /// In en, this message translates to: + /// **'Notifies the user when there is a room mention.'** + String get notificationRuleIsRoomMentionDescription; + + /// No description provided for @notificationRuleRoomnotif. + /// + /// In en, this message translates to: + /// **'Room Notification'** + String get notificationRuleRoomnotif; + + /// No description provided for @notificationRuleRoomnotifDescription. + /// + /// In en, this message translates to: + /// **'Notifies the user when a message contains \'@room\'.'** + String get notificationRuleRoomnotifDescription; + + /// No description provided for @notificationRuleTombstone. + /// + /// In en, this message translates to: + /// **'Tombstone'** + String get notificationRuleTombstone; + + /// No description provided for @notificationRuleTombstoneDescription. + /// + /// In en, this message translates to: + /// **'Notifies the user about room deactivation messages.'** + String get notificationRuleTombstoneDescription; + + /// No description provided for @notificationRuleReaction. + /// + /// In en, this message translates to: + /// **'Reaction'** + String get notificationRuleReaction; + + /// No description provided for @notificationRuleReactionDescription. + /// + /// In en, this message translates to: + /// **'Suppresses notifications for reactions.'** + String get notificationRuleReactionDescription; + + /// No description provided for @notificationRuleRoomServerAcl. + /// + /// In en, this message translates to: + /// **'Room Server ACL'** + String get notificationRuleRoomServerAcl; + + /// No description provided for @notificationRuleRoomServerAclDescription. + /// + /// In en, this message translates to: + /// **'Suppresses notifications for room server access control lists (ACL).'** + String get notificationRuleRoomServerAclDescription; + + /// No description provided for @notificationRuleSuppressEdits. + /// + /// In en, this message translates to: + /// **'Suppress Edits'** + String get notificationRuleSuppressEdits; + + /// No description provided for @notificationRuleSuppressEditsDescription. + /// + /// In en, this message translates to: + /// **'Suppresses notifications for edited messages.'** + String get notificationRuleSuppressEditsDescription; + + /// No description provided for @notificationRuleCall. + /// + /// In en, this message translates to: + /// **'Call'** + String get notificationRuleCall; + + /// No description provided for @notificationRuleCallDescription. + /// + /// In en, this message translates to: + /// **'Notifies the user about calls.'** + String get notificationRuleCallDescription; + + /// No description provided for @notificationRuleEncryptedRoomOneToOne. + /// + /// In en, this message translates to: + /// **'Encrypted Room One-to-One'** + String get notificationRuleEncryptedRoomOneToOne; + + /// No description provided for @notificationRuleEncryptedRoomOneToOneDescription. + /// + /// In en, this message translates to: + /// **'Notifies the user about messages in encrypted one-to-one rooms.'** + String get notificationRuleEncryptedRoomOneToOneDescription; + + /// No description provided for @notificationRuleRoomOneToOne. + /// + /// In en, this message translates to: + /// **'Room One-to-One'** + String get notificationRuleRoomOneToOne; + + /// No description provided for @notificationRuleRoomOneToOneDescription. + /// + /// In en, this message translates to: + /// **'Notifies the user about messages in one-to-one rooms.'** + String get notificationRuleRoomOneToOneDescription; + + /// No description provided for @notificationRuleMessage. + /// + /// In en, this message translates to: + /// **'Message'** + String get notificationRuleMessage; + + /// No description provided for @notificationRuleMessageDescription. + /// + /// In en, this message translates to: + /// **'Notifies the user about general messages.'** + String get notificationRuleMessageDescription; + + /// No description provided for @notificationRuleEncrypted. + /// + /// In en, this message translates to: + /// **'Encrypted'** + String get notificationRuleEncrypted; + + /// No description provided for @notificationRuleEncryptedDescription. + /// + /// In en, this message translates to: + /// **'Notifies the user about messages in encrypted rooms.'** + String get notificationRuleEncryptedDescription; + + /// No description provided for @notificationRuleJitsi. + /// + /// In en, this message translates to: + /// **'Jitsi'** + String get notificationRuleJitsi; + + /// No description provided for @notificationRuleJitsiDescription. + /// + /// In en, this message translates to: + /// **'Notifies the user about Jitsi widget events.'** + String get notificationRuleJitsiDescription; + + /// No description provided for @notificationRuleServerAcl. + /// + /// In en, this message translates to: + /// **'Suppress Server ACL Events'** + String get notificationRuleServerAcl; + + /// No description provided for @notificationRuleServerAclDescription. + /// + /// In en, this message translates to: + /// **'Suppresses notifications for Server ACL events.'** + String get notificationRuleServerAclDescription; + + /// No description provided for @unknownPushRule. + /// + /// In en, this message translates to: + /// **'Unknown push rule \'{rule}\''** + String unknownPushRule(String rule); + + /// No description provided for @deletePushRuleCanNotBeUndone. + /// + /// In en, this message translates to: + /// **'If you delete this notification setting, this can not be undone.'** + String get deletePushRuleCanNotBeUndone; + + /// No description provided for @more. + /// + /// In en, this message translates to: + /// **'More'** + String get more; + + /// No description provided for @shareKeysWith. + /// + /// In en, this message translates to: + /// **'Share keys with...'** + String get shareKeysWith; + + /// No description provided for @shareKeysWithDescription. + /// + /// In en, this message translates to: + /// **'Which devices should be trusted so that they can read along your messages in encrypted chats?'** + String get shareKeysWithDescription; + + /// No description provided for @allDevices. + /// + /// In en, this message translates to: + /// **'All devices'** + String get allDevices; + + /// No description provided for @crossVerifiedDevicesIfEnabled. + /// + /// In en, this message translates to: + /// **'Cross verified devices if enabled'** + String get crossVerifiedDevicesIfEnabled; + + /// No description provided for @crossVerifiedDevices. + /// + /// In en, this message translates to: + /// **'Cross verified devices'** + String get crossVerifiedDevices; + + /// No description provided for @verifiedDevicesOnly. + /// + /// In en, this message translates to: + /// **'Verified devices only'** + String get verifiedDevicesOnly; + + /// No description provided for @takeAPhoto. + /// + /// In en, this message translates to: + /// **'Take a photo'** + String get takeAPhoto; + + /// No description provided for @recordAVideo. + /// + /// In en, this message translates to: + /// **'Record a video'** + String get recordAVideo; + + /// No description provided for @optionalMessage. + /// + /// In en, this message translates to: + /// **'(Optional) message...'** + String get optionalMessage; + + /// No description provided for @notSupportedOnThisDevice. + /// + /// In en, this message translates to: + /// **'Not supported on this device'** + String get notSupportedOnThisDevice; + + /// No description provided for @enterNewChat. + /// + /// In en, this message translates to: + /// **'Enter new chat'** + String get enterNewChat; + + /// No description provided for @approve. + /// + /// In en, this message translates to: + /// **'Approve'** + String get approve; + + /// No description provided for @youHaveKnocked. + /// + /// In en, this message translates to: + /// **'You have knocked'** + String get youHaveKnocked; + + /// No description provided for @pleaseWaitUntilInvited. + /// + /// In en, this message translates to: + /// **'Please wait now, until someone from the room invites you.'** + String get pleaseWaitUntilInvited; +} + +class _L10nDelegate extends LocalizationsDelegate { + const _L10nDelegate(); + + @override + Future load(Locale locale) { + return lookupL10n(locale); + } + + @override + bool isSupported(Locale locale) => [ + 'ar', + 'be', + 'bn', + 'bo', + 'ca', + 'cs', + 'de', + 'el', + 'en', + 'eo', + 'es', + 'et', + 'eu', + 'fa', + 'fi', + 'fil', + 'fr', + 'ga', + 'gl', + 'he', + 'hi', + 'hr', + 'hu', + 'ia', + 'id', + 'ie', + 'it', + 'ja', + 'ka', + 'ko', + 'lt', + 'lv', + 'nb', + 'nl', + 'pl', + 'pt', + 'ro', + 'ru', + 'sk', + 'sl', + 'sr', + 'sv', + 'ta', + 'te', + 'th', + 'tr', + 'uk', + 'vi', + 'zh' + ].contains(locale.languageCode); + + @override + bool shouldReload(_L10nDelegate old) => false; +} + +Future lookupL10n(Locale locale) { + // Lookup logic when language+script codes are specified. + switch (locale.languageCode) { + case 'zh': + { + switch (locale.scriptCode) { + case 'Hant': + return l10n_zh + .loadLibrary() + .then((dynamic _) => l10n_zh.L10nZhHant()); + } + break; + } + } + + // Lookup logic when language+country codes are specified. + switch (locale.languageCode) { + case 'pt': + { + switch (locale.countryCode) { + case 'BR': + return l10n_pt + .loadLibrary() + .then((dynamic _) => l10n_pt.L10nPtBr()); + case 'PT': + return l10n_pt + .loadLibrary() + .then((dynamic _) => l10n_pt.L10nPtPt()); + } + break; + } + } + + // Lookup logic when only language code is specified. + switch (locale.languageCode) { + case 'ar': + return l10n_ar.loadLibrary().then((dynamic _) => l10n_ar.L10nAr()); + case 'be': + return l10n_be.loadLibrary().then((dynamic _) => l10n_be.L10nBe()); + case 'bn': + return l10n_bn.loadLibrary().then((dynamic _) => l10n_bn.L10nBn()); + case 'bo': + return l10n_bo.loadLibrary().then((dynamic _) => l10n_bo.L10nBo()); + case 'ca': + return l10n_ca.loadLibrary().then((dynamic _) => l10n_ca.L10nCa()); + case 'cs': + return l10n_cs.loadLibrary().then((dynamic _) => l10n_cs.L10nCs()); + case 'de': + return l10n_de.loadLibrary().then((dynamic _) => l10n_de.L10nDe()); + case 'el': + return l10n_el.loadLibrary().then((dynamic _) => l10n_el.L10nEl()); + case 'en': + return l10n_en.loadLibrary().then((dynamic _) => l10n_en.L10nEn()); + case 'eo': + return l10n_eo.loadLibrary().then((dynamic _) => l10n_eo.L10nEo()); + case 'es': + return l10n_es.loadLibrary().then((dynamic _) => l10n_es.L10nEs()); + case 'et': + return l10n_et.loadLibrary().then((dynamic _) => l10n_et.L10nEt()); + case 'eu': + return l10n_eu.loadLibrary().then((dynamic _) => l10n_eu.L10nEu()); + case 'fa': + return l10n_fa.loadLibrary().then((dynamic _) => l10n_fa.L10nFa()); + case 'fi': + return l10n_fi.loadLibrary().then((dynamic _) => l10n_fi.L10nFi()); + case 'fil': + return l10n_fil.loadLibrary().then((dynamic _) => l10n_fil.L10nFil()); + case 'fr': + return l10n_fr.loadLibrary().then((dynamic _) => l10n_fr.L10nFr()); + case 'ga': + return l10n_ga.loadLibrary().then((dynamic _) => l10n_ga.L10nGa()); + case 'gl': + return l10n_gl.loadLibrary().then((dynamic _) => l10n_gl.L10nGl()); + case 'he': + return l10n_he.loadLibrary().then((dynamic _) => l10n_he.L10nHe()); + case 'hi': + return l10n_hi.loadLibrary().then((dynamic _) => l10n_hi.L10nHi()); + case 'hr': + return l10n_hr.loadLibrary().then((dynamic _) => l10n_hr.L10nHr()); + case 'hu': + return l10n_hu.loadLibrary().then((dynamic _) => l10n_hu.L10nHu()); + case 'ia': + return l10n_ia.loadLibrary().then((dynamic _) => l10n_ia.L10nIa()); + case 'id': + return l10n_id.loadLibrary().then((dynamic _) => l10n_id.L10nId()); + case 'ie': + return l10n_ie.loadLibrary().then((dynamic _) => l10n_ie.L10nIe()); + case 'it': + return l10n_it.loadLibrary().then((dynamic _) => l10n_it.L10nIt()); + case 'ja': + return l10n_ja.loadLibrary().then((dynamic _) => l10n_ja.L10nJa()); + case 'ka': + return l10n_ka.loadLibrary().then((dynamic _) => l10n_ka.L10nKa()); + case 'ko': + return l10n_ko.loadLibrary().then((dynamic _) => l10n_ko.L10nKo()); + case 'lt': + return l10n_lt.loadLibrary().then((dynamic _) => l10n_lt.L10nLt()); + case 'lv': + return l10n_lv.loadLibrary().then((dynamic _) => l10n_lv.L10nLv()); + case 'nb': + return l10n_nb.loadLibrary().then((dynamic _) => l10n_nb.L10nNb()); + case 'nl': + return l10n_nl.loadLibrary().then((dynamic _) => l10n_nl.L10nNl()); + case 'pl': + return l10n_pl.loadLibrary().then((dynamic _) => l10n_pl.L10nPl()); + case 'pt': + return l10n_pt.loadLibrary().then((dynamic _) => l10n_pt.L10nPt()); + case 'ro': + return l10n_ro.loadLibrary().then((dynamic _) => l10n_ro.L10nRo()); + case 'ru': + return l10n_ru.loadLibrary().then((dynamic _) => l10n_ru.L10nRu()); + case 'sk': + return l10n_sk.loadLibrary().then((dynamic _) => l10n_sk.L10nSk()); + case 'sl': + return l10n_sl.loadLibrary().then((dynamic _) => l10n_sl.L10nSl()); + case 'sr': + return l10n_sr.loadLibrary().then((dynamic _) => l10n_sr.L10nSr()); + case 'sv': + return l10n_sv.loadLibrary().then((dynamic _) => l10n_sv.L10nSv()); + case 'ta': + return l10n_ta.loadLibrary().then((dynamic _) => l10n_ta.L10nTa()); + case 'te': + return l10n_te.loadLibrary().then((dynamic _) => l10n_te.L10nTe()); + case 'th': + return l10n_th.loadLibrary().then((dynamic _) => l10n_th.L10nTh()); + case 'tr': + return l10n_tr.loadLibrary().then((dynamic _) => l10n_tr.L10nTr()); + case 'uk': + return l10n_uk.loadLibrary().then((dynamic _) => l10n_uk.L10nUk()); + case 'vi': + return l10n_vi.loadLibrary().then((dynamic _) => l10n_vi.L10nVi()); + case 'zh': + return l10n_zh.loadLibrary().then((dynamic _) => l10n_zh.L10nZh()); + } + + throw FlutterError( + 'L10n.delegate failed to load unsupported locale "$locale". This is likely ' + 'an issue with the localizations generation tool. Please file an issue ' + 'on GitHub with a reproducible sample app and the gen-l10n configuration ' + 'that was used.'); +} diff --git a/lib/generated/l10n/l10n_ar.dart b/lib/generated/l10n/l10n_ar.dart new file mode 100644 index 0000000..12b957c --- /dev/null +++ b/lib/generated/l10n/l10n_ar.dart @@ -0,0 +1,2727 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'l10n.dart'; + +// ignore_for_file: type=lint + +/// The translations for Arabic (`ar`). +class L10nAr extends L10n { + L10nAr([String locale = 'ar']) : super(locale); + + @override + String get noSendPermission => 'You can\'t send messages here'; + + @override + String get alwaysUse24HourFormat => 'false'; + + @override + String get repeatPassword => 'كرّر كلمة السر'; + + @override + String get notAnImage => 'ليس ملف صورة.'; + + @override + String get setCustomPermissionLevel => 'Set custom permission level'; + + @override + String get setPermissionsLevelDescription => + 'Please choose a predefined role below or enter a custom permission level between 0 and 100.'; + + @override + String get ignoreUser => 'Ignore user'; + + @override + String get normalUser => 'Normal user'; + + @override + String get remove => 'أزِل'; + + @override + String get importNow => 'استيراد الآن'; + + @override + String get importEmojis => 'استيراد الرموز التعبيرية'; + + @override + String get importFromZipFile => 'الاستيراد من ملف .zip'; + + @override + String get exportEmotePack => 'تصدير حزمة الرموز التعبيرية بتنسيق zip'; + + @override + String get replace => 'استبدال'; + + @override + String get about => 'حول'; + + @override + String aboutHomeserver(String homeserver) { + return 'حول $homeserver'; + } + + @override + String get accept => 'أقبل'; + + @override + String acceptedTheInvitation(String username) { + return '👍 $username قبل الدعوة'; + } + + @override + String get account => 'الحساب'; + + @override + String activatedEndToEndEncryption(String username) { + return '🔐 تم تنشيط $username التشفير من طرف إلى طرف'; + } + + @override + String get addEmail => 'أضف بريدًا إلكترونيًا'; + + @override + String get confirmMatrixId => + 'يرجى تأكيد معرف Matrix الخاص بك من أجل حذف حسابك.'; + + @override + String supposedMxid(String mxid) { + return 'يجب أن يكون هذا $mxid'; + } + + @override + String get addChatDescription => 'أضف وصفًا للدردشة...'; + + @override + String get addToSpace => 'أضف إلى المساحة'; + + @override + String get admin => 'المدير'; + + @override + String get alias => 'اللقب'; + + @override + String get all => 'الكل'; + + @override + String get allChats => 'كل المحادثات'; + + @override + String get commandHint_roomupgrade => + 'Upgrade this room to the given room version'; + + @override + String get commandHint_googly => 'أرسل بعض عيون googly'; + + @override + String get commandHint_cuddle => 'أرسل عناق'; + + @override + String get commandHint_hug => 'إرسال حضن'; + + @override + String googlyEyesContent(String senderName) { + return '$senderName يرسل لك عيون googly'; + } + + @override + String cuddleContent(String senderName) { + return '$senderName يحتضنك'; + } + + @override + String hugContent(String senderName) { + return '$senderName يعانقك'; + } + + @override + String answeredTheCall(String senderName) { + return '$senderName أجاب على المكالمة'; + } + + @override + String get anyoneCanJoin => 'يمكن لأي أحد الدخول'; + + @override + String get appLock => 'قفل التطبيق'; + + @override + String get appLockDescription => 'قفل التطبيق عند عدم استخدامه بالرمز السري'; + + @override + String get archive => 'الأرشيف'; + + @override + String get areGuestsAllowedToJoin => 'هل يُسمح للزوار الدخول'; + + @override + String get areYouSure => 'أمتأكد؟'; + + @override + String get areYouSureYouWantToLogout => 'أمتأكد من الخروج؟'; + + @override + String get askSSSSSign => + 'لتتمكن من التأكد من الشخص الآخر، يرجى إدخال عبارة المرور أو مفتاح الاسترداد.'; + + @override + String askVerificationRequest(String username) { + return 'أتقبل طلب تحقق $username؟'; + } + + @override + String get autoplayImages => 'شغِّل الملصقات والوجوه المتحركة تلقائيا'; + + @override + String badServerLoginTypesException(String serverVersions, + String supportedVersions, Object suportedVersions) { + return 'يدعم الخادم المستخدم أنواع تسجيل الدخول التالية:\n$serverVersions\nلكن هذا التطبيق يدعم فقط:\n$supportedVersions'; + } + + @override + String get sendTypingNotifications => 'إرسال إشعارات الكتابة'; + + @override + String get swipeRightToLeftToReply => 'اسحب من اليمين إلى اليسار للرد'; + + @override + String get sendOnEnter => 'أرسل عند الدخول'; + + @override + String badServerVersionsException(String serverVersions, + String supportedVersions, Object serverVerions, Object suportedVersions) { + return 'يدعم الخادم الرئيسي المستخدم إصدارات المواصفات:\n$serverVersions\nلكن هذا التطبيق يدعم فقط:\n$supportedVersions'; + } + + @override + String countChatsAndCountParticipants(int chats, int participants) { + return '$chats دردشات و $participants مشاركين'; + } + + @override + String get noMoreChatsFound => 'لم يتم العثور على دردشات...'; + + @override + String get noChatsFoundHere => + 'لم يتم العثور على دردشات هنا حتى الآن. ابدأ محادثة جديدة مع شخص ما باستخدام الزر أدناه. ⤵️'; + + @override + String get joinedChats => 'انضم إلى الدردشة'; + + @override + String get unread => 'غير المقروءة'; + + @override + String get space => 'المساحة'; + + @override + String get spaces => 'المساحات'; + + @override + String get banFromChat => 'حظر من المحادثة'; + + @override + String get banned => 'محظور'; + + @override + String bannedUser(String username, String targetName) { + return '$username حظر $targetName'; + } + + @override + String get blockDevice => 'أُحظر الجهاز'; + + @override + String get blocked => 'محجوب'; + + @override + String get botMessages => 'رسائل البوت'; + + @override + String get cancel => 'ألغِ'; + + @override + String cantOpenUri(String uri) { + return 'تعذر فتح المسار $uri'; + } + + @override + String get changeDeviceName => 'غيّر اسم الجهاز'; + + @override + String changedTheChatAvatar(String username) { + return 'غيَّر $username صورة المحادثة'; + } + + @override + String changedTheChatDescriptionTo(String username, String description) { + return 'غيَّر $username وصف المحادثة الى: \'$description\''; + } + + @override + String changedTheChatNameTo(String username, String chatname) { + return 'غيَّر $username اسم المحادثة الى: \'$chatname\''; + } + + @override + String changedTheChatPermissions(String username) { + return 'غيَّر $username أذون المحادثة'; + } + + @override + String changedTheDisplaynameTo(String username, String displayname) { + return '$username غير إسمه العلني إلى: \'$displayname\''; + } + + @override + String changedTheGuestAccessRules(String username) { + return 'غيّر $username قواعد وصول الزوار'; + } + + @override + String changedTheGuestAccessRulesTo(String username, String rules) { + return 'غيّر $username قواعد وصول الزوار الى: $rules'; + } + + @override + String changedTheHistoryVisibility(String username) { + return 'غيَّر $username مرئية التأريخ'; + } + + @override + String changedTheHistoryVisibilityTo(String username, String rules) { + return 'غيَّر $username مرئية التأريخ الى: $rules'; + } + + @override + String changedTheJoinRules(String username) { + return 'غيَّر $username قواعد الانضمام'; + } + + @override + String changedTheJoinRulesTo(String username, String joinRules) { + return 'غيَّر $username قواعد الانضمام الى: $joinRules'; + } + + @override + String changedTheProfileAvatar(String username) { + return 'غيّر $username صورته الشخصية'; + } + + @override + String changedTheRoomAliases(String username) { + return 'غيّر $username ألقاب الغرف'; + } + + @override + String changedTheRoomInvitationLink(String username) { + return 'غيّر $username رابط الدعوة'; + } + + @override + String get changePassword => 'غيّر كلمة السر'; + + @override + String get changeTheHomeserver => 'غيّر الخادم'; + + @override + String get changeTheme => 'غيّر أسلوبك'; + + @override + String get changeTheNameOfTheGroup => 'غيِّر اسم المجموعة'; + + @override + String get changeYourAvatar => 'غيّر الصورة الرمزية'; + + @override + String get channelCorruptedDecryptError => 'فسُد التشفير'; + + @override + String get chat => 'محادثة'; + + @override + String get yourChatBackupHasBeenSetUp => + 'تم إعداد النسخ الاحتياطي لمحادثاتك.'; + + @override + String get chatBackup => 'النسخ الاحتياطي للمحادثات'; + + @override + String get chatBackupDescription => + 'يتم تأمين رسائلك القديمة باستخدام مفتاح الاسترداد. يرجى التأكد من أنك لا تضيعه.'; + + @override + String get chatDetails => 'تفاصيل المحادثة'; + + @override + String get chatHasBeenAddedToThisSpace => 'أُضيفت المحادثة الى هذا المساحة'; + + @override + String get chats => 'المحادثات'; + + @override + String get chooseAStrongPassword => 'اختر كلمة سر قوية'; + + @override + String get clearArchive => 'امسح الأرشيف'; + + @override + String get close => 'اغلق'; + + @override + String get commandHint_markasdm => + 'وضع علامة على أنها غرفة رسائل مباشرة لمعرف المصفوفة'; + + @override + String get commandHint_markasgroup => 'وضع علامة كمجموعة'; + + @override + String get commandHint_ban => 'يحظر المستخدم المذكور من هذه الغرفة'; + + @override + String get commandHint_clearcache => 'مسح الذاكرة المؤقتة'; + + @override + String get commandHint_create => + 'أنشأ محادثة جماعية فارغة\nاستخدم --لا-تشفير لتعطيل التشفير'; + + @override + String get commandHint_discardsession => 'إنهاء الجلسة'; + + @override + String get commandHint_dm => + 'إبدأ محادثة مباشرة\nاستخدم --لا-تشفير لتعطيل التشفير'; + + @override + String get commandHint_html => 'أرسل نصًا بتنسيق HTML'; + + @override + String get commandHint_invite => 'يدعو المستخدم المذكور الى الغرفة'; + + @override + String get commandHint_join => 'تنضم الى الغرفة المذكورة'; + + @override + String get commandHint_kick => 'يزيل المستخدم المذكور من الغرفة'; + + @override + String get commandHint_leave => 'تغادر هذه الغرفة'; + + @override + String get commandHint_me => 'صف نفسك'; + + @override + String get commandHint_myroomavatar => + 'حدد صورتك لهذه الغرفة (عن طريق mxc-uri)'; + + @override + String get commandHint_myroomnick => 'عين اسمًا لك مخصص لهذه الغرفة'; + + @override + String get commandHint_op => + 'عين مستوى نفوذ المستخدم في هذه الغرفة (الافتراضي: 50)'; + + @override + String get commandHint_plain => 'أرسل نصًا غير منسق'; + + @override + String get commandHint_react => 'أرسل ردًا كتفاعل'; + + @override + String get commandHint_send => 'أرسل نصًا'; + + @override + String get commandHint_unban => 'فك الحظر عن المستخدم المذكور في هذه الغرفة'; + + @override + String get commandInvalid => 'أمر غير صالح'; + + @override + String commandMissing(String command) { + return '$command ليس بأمر.'; + } + + @override + String get compareEmojiMatch => 'يرجى مقارنة الرموز التعبيرية'; + + @override + String get compareNumbersMatch => 'الرجاء مقارنة الأرقام'; + + @override + String get configureChat => 'ضبط المحادثة'; + + @override + String get confirm => 'أكّد'; + + @override + String get connect => 'اتصل'; + + @override + String get contactHasBeenInvitedToTheGroup => 'دعيَ المراسل للمجموعة'; + + @override + String get containsDisplayName => 'يحوي الاسم العلني'; + + @override + String get containsUserName => 'يحوي اسم المستخدم'; + + @override + String get contentHasBeenReported => 'أّرسل الابلاغ الى مدير الخادم'; + + @override + String get copiedToClipboard => 'نُسخ للحافظة'; + + @override + String get copy => 'انسخ'; + + @override + String get copyToClipboard => 'انسخ الى الحافظة'; + + @override + String couldNotDecryptMessage(String error) { + return 'تعذر فك تشفير الرسالة: $error'; + } + + @override + String countParticipants(int count) { + return '$count منتسبا'; + } + + @override + String get create => 'أنشئ'; + + @override + String createdTheChat(String username) { + return '💬 أنشأ $username المحادثة'; + } + + @override + String get createGroup => 'إنشاء مجموعة'; + + @override + String get createNewSpace => 'مساحة جديدة'; + + @override + String get currentlyActive => 'نشطٌ حاليا'; + + @override + String get darkTheme => 'داكن'; + + @override + String dateAndTimeOfDay(String date, String timeOfDay) { + return '$date, $timeOfDay'; + } + + @override + String dateWithoutYear(String month, String day) { + return '$month-$day'; + } + + @override + String dateWithYear(String year, String month, String day) { + return '$day/$month/$year'; + } + + @override + String get deactivateAccountWarning => 'لا مجال للعودة، أتأكد تعطيل حسابك؟'; + + @override + String get defaultPermissionLevel => + 'مستوى الأذونات الافتراضية للمستخدمين الجدد'; + + @override + String get delete => 'احذف'; + + @override + String get deleteAccount => 'احذف الحساب'; + + @override + String get deleteMessage => 'حذف الرسالة'; + + @override + String get device => 'جهاز'; + + @override + String get deviceId => 'معرّف الجهاز'; + + @override + String get devices => 'الأجهزة'; + + @override + String get directChats => 'محادثات مباشرة'; + + @override + String get allRooms => 'جميع الدردشات الجماعية'; + + @override + String get displaynameHasBeenChanged => 'غُيِّر الاسم العلني'; + + @override + String get downloadFile => 'نزِّل الملف'; + + @override + String get edit => 'عدّل'; + + @override + String get editBlockedServers => 'عدّل الخوادم المحجوبة'; + + @override + String get chatPermissions => 'صلاحيات المحادثة'; + + @override + String get editDisplayname => 'حرر الاسم العلني'; + + @override + String get editRoomAliases => 'عدّل الاسم المميز للغرفة'; + + @override + String get editRoomAvatar => 'عدّل الصورة الرمزية للغرفة'; + + @override + String get emoteExists => 'الانفعالة موجودة مسبقا!'; + + @override + String get emoteInvalid => 'رمز الانفعالة غير صالح!'; + + @override + String get emoteKeyboardNoRecents => + 'التعبيرات المستخدمة مؤخرًا ستظهر هنا ...'; + + @override + String get emotePacks => 'حزمة الوجوه التعبيرية للغرفة'; + + @override + String get emoteSettings => 'اعدادات الانفعالات'; + + @override + String get globalChatId => 'معرف المحادثة العامة'; + + @override + String get accessAndVisibility => 'الوصول والرؤية'; + + @override + String get accessAndVisibilityDescription => + 'من المسموح له بالانضمام إلى هذه المحادثة وكيف يمكن اكتشاف المحادثة.'; + + @override + String get calls => 'المكالمات'; + + @override + String get customEmojisAndStickers => 'الرموز التعبيرية والملصقات المخصصة'; + + @override + String get customEmojisAndStickersBody => + 'قم بإضافة أو مشاركة الرموز التعبيرية أو الملصقات المخصصة التي يمكن استخدامها في أي دردشة.'; + + @override + String get emoteShortcode => 'رمز الانفعالة'; + + @override + String get emoteWarnNeedToPick => 'اختر صورة ورمزا للانفعالة!'; + + @override + String get emptyChat => 'محادثة فارغة'; + + @override + String get enableEmotesGlobally => 'تفعيل حزمة التعبيرات بشكل عام'; + + @override + String get enableEncryption => 'فعّل التشفير'; + + @override + String get enableEncryptionWarning => 'لن يمكنك تعطيل التشفير أبدا، أمتأكد؟'; + + @override + String get encrypted => 'مشفر'; + + @override + String get encryption => 'التشفير'; + + @override + String get encryptionNotEnabled => 'التشفير معطل'; + + @override + String endedTheCall(String senderName) { + return 'أنهى $senderName المكالمة'; + } + + @override + String get enterAnEmailAddress => 'أدخل عنوان بريد إلكتروني'; + + @override + String get homeserver => 'الخادم'; + + @override + String get enterYourHomeserver => 'أدخل الخادم'; + + @override + String errorObtainingLocation(String error) { + return 'خطأ أثناء الحصول على الموقع: $error'; + } + + @override + String get everythingReady => 'كل شيء جاهز!'; + + @override + String get extremeOffensive => 'مسيئة للغاية'; + + @override + String get fileName => 'اسم الملف'; + + @override + String get fluffychat => 'فلافي-شات'; + + @override + String get fontSize => 'حجم الخط'; + + @override + String get forward => 'أعد التوجيه'; + + @override + String get fromJoining => 'من بعد الانضمام'; + + @override + String get fromTheInvitation => 'من بعد الدعوة'; + + @override + String get goToTheNewRoom => 'انتقل للغرفة الجديدة'; + + @override + String get group => 'المجموعة'; + + @override + String get chatDescription => 'وصف المحادثة'; + + @override + String get chatDescriptionHasBeenChanged => 'تغير وصف المجموعة'; + + @override + String get groupIsPublic => 'المجموعة عامة'; + + @override + String get groups => 'المجموعات'; + + @override + String groupWith(String displayname) { + return 'في مجموعة مع $displayname'; + } + + @override + String get guestsAreForbidden => 'يمنع الزوار'; + + @override + String get guestsCanJoin => 'يمكن للزوار الانضمام'; + + @override + String hasWithdrawnTheInvitationFor(String username, String targetName) { + return 'سحب $username دعوة $targetName'; + } + + @override + String get help => 'المساعدة'; + + @override + String get hideRedactedEvents => 'إخفاء الأحداث المنقحة'; + + @override + String get hideRedactedMessages => 'إخفاء الرسائل المكررة'; + + @override + String get hideRedactedMessagesBody => + 'إذا قام شخص ما بتنقيح رسالة، فلن تكون هذه الرسالة مرئية في المحادثة بعد الآن.'; + + @override + String get hideInvalidOrUnknownMessageFormats => + 'إخفاء تنسيقات الرسائل غير الصالحة أو غير المعروفة'; + + @override + String get howOffensiveIsThisContent => 'ما مدى سوء هذا المحتوى؟'; + + @override + String get id => 'المعرّف'; + + @override + String get identity => 'المُعرّف'; + + @override + String get block => 'حظر'; + + @override + String get blockedUsers => 'المستخدمون المحظورون'; + + @override + String get blockListDescription => + 'يمكنك حظر المستخدمين الذين يزعجونك. لن تتمكن من تلقي أي رسائل أو دعوات للغرفة من المستخدمين الموجودين في قائمة الحظر الشخصية الخاصة بك.'; + + @override + String get blockUsername => 'تجاهل اسم المستخدم'; + + @override + String get iHaveClickedOnLink => 'نقرت على الرابط'; + + @override + String get incorrectPassphraseOrKey => 'عبارة مرور أو مفتاح استرداد خطأ'; + + @override + String get inoffensive => 'غير مسيء'; + + @override + String get inviteContact => 'دعوة مراسل'; + + @override + String inviteContactToGroupQuestion(Object contact, Object groupName) { + return 'هل تريد دعوة $contact إلى المحادثة \"$groupName\"؟?'; + } + + @override + String inviteContactToGroup(String groupName) { + return 'أدعو مراسلا الى $groupName'; + } + + @override + String get noChatDescriptionYet => 'لم يتم إنشاء وصف للمحادثة حتى الآن.'; + + @override + String get tryAgain => 'أعد المحاولة'; + + @override + String get invalidServerName => 'اسم الخادم غير متاح'; + + @override + String get invited => 'دُعيَ'; + + @override + String get redactMessageDescription => + 'سيتم تنقيح الرسالة لجميع المشاركين في هذه المحادثة. هذا لا يمكن التراجع عنها.'; + + @override + String get optionalRedactReason => '(اختياري) سبب تنقيح هذه الرسالة ...'; + + @override + String invitedUser(String username, String targetName) { + return '📩 $username دعا $targetName'; + } + + @override + String get invitedUsersOnly => 'المستخدمون المدعوون فقط'; + + @override + String get inviteForMe => 'دعوات لي'; + + @override + String inviteText(String username, String link) { + return 'دعاك $username إلى Extera.\n1. قم بزيارة موقع fluffychat.im وقم بتثبيت التطبيق\n2. قم بإنشاءحساب أو تسجيل الدخول\n3. افتح رابط الدعوة:\n $link'; + } + + @override + String get isTyping => 'يكتب…'; + + @override + String joinedTheChat(String username) { + return '👋 انضم $username إلى المحادثة'; + } + + @override + String get joinRoom => 'انضم للمحادثة'; + + @override + String kicked(String username, String targetName) { + return '👞 $username ركل $targetName'; + } + + @override + String kickedAndBanned(String username, String targetName) { + return '🙅 $username ركل وحظر $targetName'; + } + + @override + String get kickFromChat => 'طرد من المحادثة'; + + @override + String lastActiveAgo(String localizedTimeShort) { + return 'آخر نشاط: $localizedTimeShort'; + } + + @override + String get leave => 'غادر'; + + @override + String get leftTheChat => 'غادر المحادثة'; + + @override + String get license => 'الرخصة'; + + @override + String get lightTheme => 'فاتح'; + + @override + String loadCountMoreParticipants(int count) { + return 'حمِّل $count منتسبًا إضافيًا'; + } + + @override + String get dehydrate => 'تصدير الجلسة ومسح الجهاز'; + + @override + String get dehydrateWarning => + 'لا يمكن التراجع عن هذا الإجراء. تأكد من تخزين ملف النسخ الاحتياطي بأمان.'; + + @override + String get dehydrateTor => 'مستخدمو تور: تصدير الجلسة'; + + @override + String get dehydrateTorLong => + 'بالنسبة لمستخدمي تور ، يوصى بتصدير الجلسة قبل إغلاق النافذة.'; + + @override + String get hydrateTor => 'مستخدمو تور: استيراد تصدير الجلسة'; + + @override + String get hydrateTorLong => + 'هل قمت بتصدير جلستك الأخيرة على تور؟ قم باستيرادها بسرعة واستمر في المحادثة.'; + + @override + String get hydrate => 'استعادة من ملف النسخ الاحتياطي'; + + @override + String get loadingPleaseWait => 'يحمّل… يرجى الانتظار.'; + + @override + String get loadMore => 'حمِّل المزيد…'; + + @override + String get locationDisabledNotice => + 'خدمات الموقع معطلة. مكنها لتتمكن من مشاركة موقعك.'; + + @override + String get locationPermissionDeniedNotice => + 'تم رفض إذن الموقع. الرجاء منح الإذن للقدرة على مشاركة موقعك.'; + + @override + String get login => 'لِج'; + + @override + String logInTo(String homeserver) { + return 'لِج ل $homeserver'; + } + + @override + String get logout => 'اخرج'; + + @override + String get memberChanges => 'تغييرات تخص الأعضاء'; + + @override + String get mention => 'اذكر'; + + @override + String get messages => 'الرسائل'; + + @override + String get messagesStyle => 'الرسائل:'; + + @override + String get moderator => 'مشرف'; + + @override + String get muteChat => 'أكتم الماحدثة'; + + @override + String get needPantalaimonWarning => + 'اعلم أننا نستخدم بانتاليمون للتشفير طرفا لطرف.'; + + @override + String get newChat => 'محادثة جديدة'; + + @override + String get newMessageInFluffyChat => '💬 رسالة جديدة في Extera'; + + @override + String get newVerificationRequest => 'طلب تحقق جديد!'; + + @override + String get next => 'التالي'; + + @override + String get no => 'لا'; + + @override + String get noConnectionToTheServer => 'انقطع الاتصال بالخادم'; + + @override + String get noEmotesFound => 'لم يُعثر على انفعالة. 😕'; + + @override + String get noEncryptionForPublicRooms => + 'يمكنك فقط تفعيل التشفير عندما تصبح الغرفة غير متاحة للعامة.'; + + @override + String get noGoogleServicesWarning => + 'يبدو أن خدمة Firebase Cloud Messaging غير متاحة على جهازك. لمواصلة تلقي الإشعارات، نوصي بتثبيت ntfy. باستخدام ntfy أو أي مزود خدمة Unified Push آخر، يمكنك تلقي إشعارات الدفع بطريقة آمنة للبيانات. يمكنك تنزيل ntfy من PlayStore أو من F-Droid.'; + + @override + String noMatrixServer(String server1, String server2) { + return '$server1 ليس خادم ماتريكس، بدلًا منه أتريد استخدام $server2؟'; + } + + @override + String get shareInviteLink => 'شارك رابط الدعوة'; + + @override + String get scanQrCode => 'امسح رمز الاستجابة السريعة'; + + @override + String get none => 'بدون'; + + @override + String get noPasswordRecoveryDescription => + 'لم تضف أي طريقة لاستعادة كلمة السر.'; + + @override + String get noPermission => 'بدون اذن'; + + @override + String get noRoomsFound => 'لم يُعثر على غرف…'; + + @override + String get notifications => 'الإشعارات'; + + @override + String get notificationsEnabledForThisAccount => + 'الإشعارات مفعلة لهذا الحساب'; + + @override + String numUsersTyping(int count) { + return '$count يكتبون…'; + } + + @override + String get obtainingLocation => 'يحصل على الموقع…'; + + @override + String get offensive => 'عدواني'; + + @override + String get offline => 'غير متصل'; + + @override + String get ok => 'موافق'; + + @override + String get online => 'متصل'; + + @override + String get onlineKeyBackupEnabled => + 'تم تفعيل النسخ الاحتياطي للمفاتيح عبر الإنترنت'; + + @override + String get oopsPushError => 'عذراً! للأسف، حدث خطأ أثناء إعداد الإشعارات.'; + + @override + String get oopsSomethingWentWrong => 'عفوًا، حدث خطأ ما…'; + + @override + String get openAppToReadMessages => 'افتح التطبيق لقراءة الرسائل'; + + @override + String get openCamera => 'افتح الكميرا'; + + @override + String get openVideoCamera => 'افتح الكاميرا لمقطع فيديو'; + + @override + String get oneClientLoggedOut => 'أُ خرج أحد العملاء الذي تسختدمها'; + + @override + String get addAccount => 'أضف حسابًا'; + + @override + String get editBundlesForAccount => 'عدّل حزم هذا الحساب'; + + @override + String get addToBundle => 'أضفه الى حزمة'; + + @override + String get removeFromBundle => 'أزله من الحزمة'; + + @override + String get bundleName => 'اسم الحزمة'; + + @override + String get enableMultiAccounts => '(ميزة تجربية) فعّل تعدد الحسابات'; + + @override + String get openInMaps => 'افتح في الخريطة'; + + @override + String get link => 'رابط'; + + @override + String get serverRequiresEmail => + 'يتطلب هذا الخادم التحقق من بريدك الإلكتروني.'; + + @override + String get or => 'أو'; + + @override + String get participant => 'منتسب'; + + @override + String get passphraseOrKey => 'عبارة المرور أو مفتاح الاستعادة'; + + @override + String get password => 'كلمة السر'; + + @override + String get passwordForgotten => 'نسيتَ كلمة السر'; + + @override + String get passwordHasBeenChanged => 'غُيّرت كلمة السر'; + + @override + String get hideMemberChangesInPublicChats => + 'إخفاء تغييرات الأعضاء في الدردشات العامة'; + + @override + String get hideMemberChangesInPublicChatsBody => + 'لا تظهر في المخطط الزمني للدردشة إذا انضم شخص ما إلى محادثة عامة أو غادرها لتحسين إمكانية القراءة.'; + + @override + String get overview => 'نظرة عامة'; + + @override + String get notifyMeFor => 'أعلمني بـ'; + + @override + String get passwordRecoverySettings => 'إعدادات استعادة كلمة المرور'; + + @override + String get passwordRecovery => 'استعادة كلمة السر'; + + @override + String get people => 'أشخاص'; + + @override + String get pickImage => 'اختر صورة'; + + @override + String get pin => 'ثبِّت'; + + @override + String play(String fileName) { + return 'شغّل $fileName'; + } + + @override + String get pleaseChoose => 'اختر رجاء'; + + @override + String get pleaseChooseAPasscode => 'اختر رمز المرور'; + + @override + String get pleaseClickOnLink => + 'يرجى النقر على الرابط الموجود في البريد الإلكتروني ثم المتابعة.'; + + @override + String get pleaseEnter4Digits => 'أدخل 4 أرقام أو أتركه فارغ لتعطيل القفل.'; + + @override + String get pleaseEnterRecoveryKey => 'الرجاء إدخال مفتاح الاسترداد:'; + + @override + String get pleaseEnterYourPassword => 'أدخل كلمة السر'; + + @override + String get pleaseEnterYourPin => 'الرجاء إدخال رقم التعريف الشخصي الخاص بك'; + + @override + String get pleaseEnterYourUsername => 'أدخل اسم المستخدم'; + + @override + String get pleaseFollowInstructionsOnWeb => + 'يرجى اتباع التعليمات الموجودة على الموقع والنقر على التالي.'; + + @override + String get privacy => 'الخصوصية'; + + @override + String get publicRooms => 'الغرف العامة'; + + @override + String get pushRules => 'قواعد الإشعارات'; + + @override + String get reason => 'السبب'; + + @override + String get recording => 'يسجل'; + + @override + String redactedBy(String username) { + return 'منقح بواسطة $username'; + } + + @override + String get directChat => 'محادثة مباشرة'; + + @override + String redactedByBecause(String username, String reason) { + return 'تم حجبه بواسطة $username بسبب: \"$reason\"'; + } + + @override + String redactedAnEvent(String username) { + return 'حذف $username حدثًا'; + } + + @override + String get redactMessage => 'احذف رسالة'; + + @override + String get register => 'سجّل'; + + @override + String get reject => 'رفض'; + + @override + String rejectedTheInvitation(String username) { + return 'رفض $username الدعوة'; + } + + @override + String get rejoin => 'أعد الانضمام'; + + @override + String get removeAllOtherDevices => 'أزِل كل الأجهزة الأخرى'; + + @override + String removedBy(String username) { + return 'أزاله $username'; + } + + @override + String get removeDevice => 'أزل جهازا'; + + @override + String get unbanFromChat => 'فك حجبه من المحادثة'; + + @override + String get removeYourAvatar => 'أزل الصورة الرمزية'; + + @override + String get replaceRoomWithNewerVersion => 'استبدل الغرفة باصدار أحدث'; + + @override + String get reply => 'ردّ'; + + @override + String get reportMessage => 'أبلغ عن الرسالة'; + + @override + String get translateMessage => 'Translate message'; + + @override + String get translatedMessage => 'Translated message'; + + @override + String get errorTranslatingMessage => + 'An error has occured while translating the message.'; + + @override + String get recoverMessage => 'Recover message'; + + @override + String get recoveredMessage => 'Recovered message'; + + @override + String get errorRecoveringMessage => + 'An error has occured while recovering the message.'; + + @override + String get errorRecoveringMessageNoAdmin => + 'This feature is available on Synapse homeservers only for adminstrators.'; + + @override + String get requestPermission => 'أطلب إذنا'; + + @override + String get roomHasBeenUpgraded => 'رُقيّت الغرفة'; + + @override + String get roomVersion => 'إصدار الغرفة'; + + @override + String get saveFile => 'احفظ الملف'; + + @override + String get retry => 'Retry'; + + @override + String get search => 'ابحث'; + + @override + String get security => 'الأمان'; + + @override + String get recoveryKey => 'مفتاح الاسترداد'; + + @override + String get recoveryKeyLost => 'هل فقدت مفتاح الاسترداد؟'; + + @override + String seenByUser(String username) { + return 'رآه $username'; + } + + @override + String get send => 'أرسل'; + + @override + String get sendAMessage => 'أرسل رسالة'; + + @override + String get sendAsText => 'أرسل نصًا'; + + @override + String get sendAudio => 'أرسل ملفًا صوتيًا'; + + @override + String get sendFile => 'أرسل ملف'; + + @override + String get sendImage => 'أرسل صورة'; + + @override + String sendImages(int count) { + return 'إرسال $count صورة'; + } + + @override + String get sendMessages => 'إرسال رسائل'; + + @override + String get sendOriginal => 'أرسل الملف الأصلي'; + + @override + String get sendSticker => 'أرسل ملصقًا'; + + @override + String get sendVideo => 'أرسل فيديو'; + + @override + String sentAFile(String username) { + return '📁 أرسل $username ملفا'; + } + + @override + String sentAnAudio(String username) { + return '🎤 أرسل $username ملفا صوتيا'; + } + + @override + String sentAPicture(String username) { + return '🖼️ $username أرسل صورة'; + } + + @override + String sentASticker(String username) { + return '😊 أرسل $username ملصقا'; + } + + @override + String sentAVideo(String username) { + return '🎥 أرسل $username مقطع فيديو'; + } + + @override + String sentCallInformations(String senderName) { + return 'أرسل $senderName معلومات مكالمة'; + } + + @override + String get separateChatTypes => 'الدردشات المباشرة والمجموعات المنفصلة'; + + @override + String get setAsCanonicalAlias => 'تعيين كاسم مستعار رئيسي'; + + @override + String get setCustomEmotes => 'عيّن وجوهًا تعبيرية مخصصة'; + + @override + String get setChatDescription => 'تعيين وصفًا للدردشة'; + + @override + String get setInvitationLink => 'عيّن رابط الدعوة'; + + @override + String get setPermissionsLevel => 'تعيين مستوى الأذونات'; + + @override + String get setStatus => 'عيّن الحالة'; + + @override + String get settings => 'الإعدادات'; + + @override + String get share => 'شارك'; + + @override + String sharedTheLocation(String username) { + return 'شارك $username موقعه'; + } + + @override + String get shareLocation => 'شارك الموقع'; + + @override + String get showPassword => 'أظهر كلمة السر'; + + @override + String get presenceStyle => 'الحضور:'; + + @override + String get hideAvatarsInInvites => 'Hide avatars in invites'; + + @override + String get hideAvatarsInInvitesDescription => + 'Do not show room avatars in invites'; + + @override + String get presencesToggle => 'إظهار رسائل الحالة من المستخدمين الآخرين'; + + @override + String get pureBlackToggle => 'Pure Black'; + + @override + String get singlesignon => 'تسجيل دخول أحادي'; + + @override + String get skip => 'تخط'; + + @override + String get sourceCode => 'الشفرة المصدرية'; + + @override + String get spaceIsPublic => 'عام في المساحة'; + + @override + String get spaceName => 'اسم المساحة'; + + @override + String startedACall(String senderName) { + return 'بدأ $senderName مكالمة'; + } + + @override + String get startFirstChat => 'ابدأ محادثتك الأولى'; + + @override + String get status => 'الحالة'; + + @override + String get statusExampleMessage => 'ماهو وضعك؟'; + + @override + String get submit => 'أرسل'; + + @override + String get synchronizingPleaseWait => 'يُزامن… يرجى الانتظار.'; + + @override + String synchronizingPleaseWaitCounter(String percentage) { + return ' Synchronizing… ($percentage%)'; + } + + @override + String get systemTheme => 'النظام'; + + @override + String get theyDontMatch => 'لا يتطبقان'; + + @override + String get theyMatch => 'متطبقان'; + + @override + String get title => 'فلافي-شات'; + + @override + String get toggleFavorite => 'بدّل حالة التفضيل'; + + @override + String get toggleMuted => 'بدّل حالة الكتم'; + + @override + String get toggleUnread => 'علّمه كمقروء/غير مقروء'; + + @override + String get tooManyRequestsWarning => 'طابات كثيرة. حاول مجددًا لاحقًا!'; + + @override + String get transferFromAnotherDevice => 'أنقله من جهاز آخر'; + + @override + String get tryToSendAgain => 'حاول إعادة الارسال'; + + @override + String get unavailable => 'غير متوفر'; + + @override + String unbannedUser(String username, String targetName) { + return 'ألغى $username حظر $targetName'; + } + + @override + String get unblockDevice => 'ألغ حظر الجهاز'; + + @override + String get unknownDevice => 'جهز مجهول'; + + @override + String get unknownEncryptionAlgorithm => 'خوارزمية تشفير مجهولة'; + + @override + String unknownEvent(String type) { + return 'حدث مجهول \'$type\''; + } + + @override + String get unmuteChat => 'ألغِ كتم المحادثة'; + + @override + String get unpin => 'ألغِ التثبيت'; + + @override + String unreadChats(int unreadCount) { + String _temp0 = intl.Intl.pluralLogic( + unreadCount, + locale: localeName, + other: '$unreadCount محادثات غير مقروءة', + one: '1 محادثة غير مقروءة', + ); + return '$_temp0'; + } + + @override + String userAndOthersAreTyping(String username, int count) { + return '$username و $count أخرون يكتبون…'; + } + + @override + String userAndUserAreTyping(String username, String username2) { + return '$username و $username2 يكتبان…'; + } + + @override + String userIsTyping(String username) { + return '$username يكتب…'; + } + + @override + String userLeftTheChat(String username) { + return '🚪 $username غادر المحادثة'; + } + + @override + String get username => 'اسم المستخدم'; + + @override + String userSentUnknownEvent(String username, String type) { + return 'أرسل $username حدث $type'; + } + + @override + String get unverified => 'غير مؤكد'; + + @override + String get verified => 'موثّق'; + + @override + String get verify => 'تحقق'; + + @override + String get verifyStart => 'ابدأ التحقق'; + + @override + String get verifySuccess => 'تُحقق منك بنجاح!'; + + @override + String get verifyTitle => 'يتحقق من الحساب الآخر'; + + @override + String get videoCall => 'مكالمة فيديو'; + + @override + String get visibilityOfTheChatHistory => 'مرئية تأريخ المحادثة'; + + @override + String get visibleForAllParticipants => 'مرئي لكل المنتسبين'; + + @override + String get visibleForEveryone => 'مرئي للجميع'; + + @override + String get voiceMessage => 'رسالة صوتية'; + + @override + String get waitingPartnerAcceptRequest => 'ينتظر قبول الشريك للطلب…'; + + @override + String get waitingPartnerEmoji => 'ينتظر قبول الشريك لإيموجي…'; + + @override + String get waitingPartnerNumbers => 'ينتظر قبول الشريك للأرقام…'; + + @override + String get wallpaper => 'الخلفية:'; + + @override + String get warning => 'تحذير!'; + + @override + String get weSentYouAnEmail => 'أرسلنا لك رسالة بالبريد الإلكتروني'; + + @override + String get whoCanPerformWhichAction => 'من يستطيع القيام بأي عمل'; + + @override + String get whoIsAllowedToJoinThisGroup => 'من يسمح له الانضمام للمجموعة'; + + @override + String get whyDoYouWantToReportThis => 'لماذا تريد الإبلاغ عنه؟'; + + @override + String get wipeChatBackup => + 'مسح نسخة المحادثة الاحتياطية لإنشاء مفتاح استرداد جديد؟'; + + @override + String get withTheseAddressesRecoveryDescription => + 'يمكنك استعادة كلمة السر بهذه العناوين.'; + + @override + String get writeAMessage => 'اكتب رسالة…'; + + @override + String get yes => 'نعم'; + + @override + String get you => 'انت'; + + @override + String get youAreNoLongerParticipatingInThisChat => + 'لم تعد منتسبا لهذه المحادثة'; + + @override + String get youHaveBeenBannedFromThisChat => 'حُظرت من هذه المحادثة'; + + @override + String get yourPublicKey => 'مفتاحك العمومي'; + + @override + String get messageInfo => 'معلومات الرسالة'; + + @override + String get time => 'الوقت'; + + @override + String get messageType => 'نوع الرسالة'; + + @override + String get sender => 'المرسل'; + + @override + String get openGallery => 'افتخ المعرض'; + + @override + String get removeFromSpace => 'أزل من المساحة'; + + @override + String get addToSpaceDescription => 'إختر مساحة لإضافة هذه المحادثة إليها.'; + + @override + String get start => 'إبدأ'; + + @override + String get pleaseEnterRecoveryKeyDescription => + 'لإلغاء قفل رسائلك القديمة ، يرجى إدخال مفتاح الاسترداد الذي تم إنشاؤه في جلسة سابقة. مفتاح الاسترداد ليس كلمة المرور الخاصة بك.'; + + @override + String get publish => 'انشر'; + + @override + String videoWithSize(String size) { + return 'فيديو ($size)'; + } + + @override + String get openChat => 'فتح المحادثة'; + + @override + String get markAsRead => 'حدد كمقروء'; + + @override + String get reportUser => 'التبيلغ عن المستخدم'; + + @override + String get dismiss => 'رفض'; + + @override + String reactedWith(String sender, String reaction) { + return '$sender تفاعل ب $reaction'; + } + + @override + String get pinMessage => 'تثبيت في الغرفة'; + + @override + String get confirmEventUnpin => + 'هل أنت متأكد من إلغاء تثبيت الحدث بشكل دائم؟'; + + @override + String get emojis => 'إيموجي'; + + @override + String get placeCall => 'إجراء مكالمة'; + + @override + String get voiceCall => 'مكالمة صوتية'; + + @override + String get unsupportedAndroidVersion => 'نسخة أندرويد غير مدعومة'; + + @override + String get unsupportedAndroidVersionLong => + 'تتطلب هذه الميزة إصدار Android أحدث. يرجى التحقق من وجود تحديثات أو دعم Lineage OS.'; + + @override + String get videoCallsBetaWarning => + 'يرجى ملاحظة أن مكالمات الفيديو حالياً في مرحلة تجريبية. قد لا تعمل كما هو متوقع أو تعمل على الإطلاق على جميع المنصات.'; + + @override + String get experimentalVideoCalls => 'مكالمات الفيديو التجريبية'; + + @override + String get emailOrUsername => 'البريد الإلكتروني أو اسم المستخدم'; + + @override + String get indexedDbErrorTitle => 'مشاكل الوضع الخاص'; + + @override + String get indexedDbErrorLong => + 'للأسف ، لم يتم تمكين تخزين الرسائل في الوضع الخاص افتراضيا.\nيرجى زيارة\n - حول:التكوين\n - تعيين dom.indexedDB.privateBrowsing.enabled إلى true\nخلاف ذلك ، لا يمكن تشغيل Extera.'; + + @override + String switchToAccount(String number) { + return 'التبديل إلى الحساب $number'; + } + + @override + String get nextAccount => 'الحساب التالي'; + + @override + String get previousAccount => 'الحساب السابق'; + + @override + String get addWidget => 'إضافة اداة'; + + @override + String get widgetVideo => 'فيديو'; + + @override + String get widgetEtherpad => 'ملاحظة نصية'; + + @override + String get widgetJitsi => 'اجتماعات جيتسي'; + + @override + String get widgetCustom => 'مُخصّص'; + + @override + String get widgetName => 'الاسم'; + + @override + String get widgetUrlError => 'هذا ليس عنوان URL صالحًا.'; + + @override + String get widgetNameError => 'يرجى تقديم اسم العرض.'; + + @override + String get errorAddingWidget => 'خطأ في إضافة الأداة.'; + + @override + String get youRejectedTheInvitation => 'لقد رفضت الدعوة'; + + @override + String get youJoinedTheChat => 'لقد انضممت إلى المحادثة'; + + @override + String get youAcceptedTheInvitation => '👍 لقد قبلت الدعوة'; + + @override + String youBannedUser(String user) { + return 'لقد حظرت $user'; + } + + @override + String youHaveWithdrawnTheInvitationFor(String user) { + return 'لقد سحبت الدعوة لـ $user'; + } + + @override + String youInvitedToBy(String alias) { + return '📩 تمت دعوتك عبر الرابط إلى:\n$alias'; + } + + @override + String youInvitedBy(String user) { + return '📩 لقد تمت دعوتك من قبل $user'; + } + + @override + String invitedBy(String user) { + return '📩 تمت دعوته من قبل $user'; + } + + @override + String youInvitedUser(String user) { + return '📩 قمت بدعوة $user'; + } + + @override + String youKicked(String user) { + return '👞 لقد ركلت $user'; + } + + @override + String youKickedAndBanned(String user) { + return '🙅 لقد ركلت وحظرت $user'; + } + + @override + String youUnbannedUser(String user) { + return 'قمت بإلغاء الحظر $user'; + } + + @override + String hasKnocked(String user) { + return '🚪 لقد طرق $user'; + } + + @override + String get usersMustKnock => 'المستخدم يجب أن يطرق الباب'; + + @override + String get noOneCanJoin => 'لا أحد يستطيع الانضمام'; + + @override + String userWouldLikeToChangeTheChat(String user) { + return '$user يرغب في الانضمام إلى المحادثة.'; + } + + @override + String get noPublicLinkHasBeenCreatedYet => 'لم يتم بعد إنشاء أي رابط عام'; + + @override + String get knock => 'دق'; + + @override + String get users => 'المستخدمون'; + + @override + String get unlockOldMessages => 'إلغاء قفل الرسائل القديمة'; + + @override + String get storeInSecureStorageDescription => + 'قم بتخزين مفتاح الاسترداد في التخزين الآمن لهذا الجهاز.'; + + @override + String get saveKeyManuallyDescription => + 'احفظ هذا المفتاح يدويا عن طريق تشغيل مربع حوار مشاركة النظام أو الحافظة.'; + + @override + String get storeInAndroidKeystore => 'تخزين في سجل مفاتيح اندرويد'; + + @override + String get storeInAppleKeyChain => 'تخزين في سلسلة مفاتيح ابل'; + + @override + String get storeSecurlyOnThisDevice => 'احفظه بأمان على هذا الجهاز'; + + @override + String countFiles(int count) { + return 'ملفات $count'; + } + + @override + String get user => 'مستخدم'; + + @override + String get custom => 'مُخصّص'; + + @override + String get foregroundServiceRunning => + 'يظهر هذا الإشعار عند تشغيل الخدمة الأمامية.'; + + @override + String get screenSharingTitle => 'مشاركة الشاشة'; + + @override + String get screenSharingDetail => 'أنت تشارك شاشتك في FuffyChat'; + + @override + String get callingPermissions => 'أذونات الاتصال'; + + @override + String get callingAccount => 'الاتصال بالحساب'; + + @override + String get callingAccountDetails => + 'يسمح لـ Extera باستخدام تطبيق android Dialer الأصلي.'; + + @override + String get appearOnTop => 'يظهر في الأعلى'; + + @override + String get appearOnTopDetails => + 'يسمح للتطبيق بالظهور في الأعلى (ليست هناك حاجة إذا قمت بالفعل بإعداد Fluffychat كحساب اتصال)'; + + @override + String get otherCallingPermissions => + 'الميكروفون والكاميرا وأذونات Extera الأخرى'; + + @override + String get whyIsThisMessageEncrypted => + 'لماذا هذه الرسالة غير قابلة للقراءة؟'; + + @override + String get noKeyForThisMessage => + 'يمكن أن يحدث هذا إذا تم إرسال الرسالة قبل تسجيل الدخول إلى حسابك على هذا الجهاز.\n\nمن الممكن أيضا أن يكون المرسل قد حظر جهازك أو حدث خطأ ما في الاتصال بالإنترنت.\n\nهل يمكنك قراءة الرسالة في جلسة أخرى؟ ثم يمكنك نقل الرسالة منه! انتقل إلى الإعدادات > الأجهزة وتأكد من أن أجهزتك قد تحققت من بعضها البعض. عندما تفتح الغرفة في المرة التالية وتكون كلتا الجلستين في المقدمة ، سيتم إرسال المفاتيح تلقائيا.\n\nألا تريد أن تفقد المفاتيح عند تسجيل الخروج أو تبديل الأجهزة؟ تأكد من تمكين النسخ الاحتياطي للدردشة في الإعدادات.'; + + @override + String get newGroup => 'مجموعة جديدة'; + + @override + String get newSpace => 'مساحة جديدة'; + + @override + String get enterSpace => 'أدخل المساحة'; + + @override + String get enterRoom => 'أدخل الغرفة'; + + @override + String get allSpaces => 'كل المساحات'; + + @override + String numChats(String number) { + return '$number الدردشات'; + } + + @override + String get hideUnimportantStateEvents => 'إخفاء أحداث الحالة غير المهمة'; + + @override + String get hidePresences => 'إخفاء قائمة الحالة؟'; + + @override + String get doNotShowAgain => 'لا تظهر مرة أخرى'; + + @override + String wasDirectChatDisplayName(String oldDisplayName) { + return 'محادثة فارغة (كانت $oldDisplayName)'; + } + + @override + String get newSpaceDescription => + 'يسمح لك تطبيق المساحات بتوحيد دردشاتك وبناء مجتمعات خاصة أو عامة.'; + + @override + String get encryptThisChat => 'تشفير هذه المحادثة'; + + @override + String get disableEncryptionWarning => + 'لأسباب أمنية ، لا يمكنك تعطيل التشفير في المحادثة ، حيث تم تمكينه من قبل.'; + + @override + String get sorryThatsNotPossible => 'معذرة... هذا غير ممكن'; + + @override + String get deviceKeys => 'مفاتيح الجهاز:'; + + @override + String get reopenChat => 'إعادة فتح المحادثة'; + + @override + String get noBackupWarning => + 'تحذير! بدون تمكين النسخ الاحتياطي للدردشة ، ستفقد الوصول إلى رسائلك المشفرة. يوصى بشدة بتمكين النسخ الاحتياطي للدردشة أولاً قبل تسجيل الخروج.'; + + @override + String get noOtherDevicesFound => 'لم يتم العثور على أجهزة أخرى'; + + @override + String fileIsTooBigForServer(String max) { + return 'تعذر الإرسال! لا يدعم الخادم سوى المرفقات التي تصل إلى $max.'; + } + + @override + String fileHasBeenSavedAt(String path) { + return 'تم حفظ الملف في $path'; + } + + @override + String get jumpToLastReadMessage => 'الانتقال إلى آخر رسالة مقروءة'; + + @override + String get readUpToHere => 'اقرأ حتى هنا'; + + @override + String get jump => 'قفز'; + + @override + String get openLinkInBrowser => 'فتح الرابط في المتصفح'; + + @override + String get reportErrorDescription => + '😭 أوه لا. هناك خطأ ما. إذا كنت تريد، يمكنك الإبلاغ عن هذا الخطأ إلى المطورين.'; + + @override + String get report => 'تقرير'; + + @override + String get signInWithPassword => 'سجل الدخول بكلمة السر'; + + @override + String get pleaseTryAgainLaterOrChooseDifferentServer => + 'رجاء حاول مجددا أو اختر خادما مختلفا.'; + + @override + String signInWith(String provider) { + return 'تسجيل الدخول باستخدام $provider'; + } + + @override + String get profileNotFound => + 'لا يمكن العثور على المستخدم على الخادم. ربما هناك مشكلة في الاتصال أو المستخدم غير موجود.'; + + @override + String get setTheme => 'تعيين السمة:'; + + @override + String get setColorTheme => 'تعيين لون السمة:'; + + @override + String get invite => 'دعوة'; + + @override + String get inviteGroupChat => '📨 دعوة للمحادثة الجماعية'; + + @override + String get invitePrivateChat => '📨 دعوة دردشة خاصة'; + + @override + String get invalidInput => 'مدخل غير صالح!'; + + @override + String wrongPinEntered(int seconds) { + return 'تم إدخال رمز خاطئ! حاول مرة أخرى خلال $seconds ثانية...'; + } + + @override + String get pleaseEnterANumber => 'الرجاء إدخال رقم أكبر من 0'; + + @override + String get archiveRoomDescription => + 'سيتم نقل المحادثة إلى الأرشيف. سيتمكن المستخدمون الآخرون من رؤية أنك غادرت المحادثة.'; + + @override + String get roomUpgradeDescription => + 'سيتم بعد ذلك إعادة إنشاء المحادثة باستخدام إصدار الغرفة الجديد. سيتم إخطار جميع المشاركين بأنهم بحاجة إلى التبديل إلى المحادثة الجديدة. يمكنك معرفة المزيد حول إصدارات الغرف على https://spec.matrix.org/latest/rooms/'; + + @override + String get removeDevicesDescription => + 'سيتم تسجيل خروجك من هذا الجهاز ولن تتمكن بعد ذلك من تلقي الرسائل.'; + + @override + String get banUserDescription => + 'سيتم حظر المستخدم من المحادثة ولن يتمكن من الدخول إلى المحادثة مرة أخرى حتى يتم رفع الحظر عنه.'; + + @override + String get unbanUserDescription => + 'سيتمكن المستخدم من الدخول إلى المحادثة مرة أخرى إذا حاول.'; + + @override + String get kickUserDescription => + 'يتم طرد المستخدم من المحادثة ولكن لا يتم حظره. في المحادثات العامة، يمكن للمستخدم الانضمام مرة أخرى في أي وقت.'; + + @override + String get makeAdminDescription => + 'بمجرد تعيين هذا المستخدم كمسؤول، قد لا تتمكن من التراجع عن هذا لأنه سيكون لديه نفس الأذونات التي تتمتع بها.'; + + @override + String get pushNotificationsNotAvailable => 'دفع الإخطارات غير متوفرة'; + + @override + String get learnMore => 'تعلم المزيد'; + + @override + String get yourGlobalUserIdIs => 'معرف المستخدم العمومي الخاص بك هو: '; + + @override + String noUsersFoundWithQuery(String query) { + return 'لسوء الحظ، لا يمكن العثور على مستخدم لديه \"$query\". يرجى التحقق مما إذا كنت قد ارتكبت خطأ كتابي.'; + } + + @override + String get knocking => 'طرق'; + + @override + String chatCanBeDiscoveredViaSearchOnServer(String server) { + return 'يمكن اكتشاف الشات عن طريق البحث في $server'; + } + + @override + String get searchChatsRooms => 'ابحث عن #الدردشات، @المستخدمين...'; + + @override + String get nothingFound => 'لم نجد شيئاً.'; + + @override + String get groupName => 'أسم المجموعة'; + + @override + String get createGroupAndInviteUsers => 'إنشاء مجموعة ودعوة المستخدمين'; + + @override + String get groupCanBeFoundViaSearch => 'يمكن العثور على المجموعة عبر البحث'; + + @override + String get wrongRecoveryKey => + 'عذرًا... لا يبدو أن هذا هو مفتاح الاسترداد الصحيح.'; + + @override + String get startConversation => 'بدء محادثة'; + + @override + String get commandHint_sendraw => 'إرسال جيسون الخام'; + + @override + String get databaseMigrationTitle => 'تم تحسين قاعدة البيانات'; + + @override + String get databaseMigrationBody => 'انتظر من فضلك. قد يستغرق ذلك بعض الوقت.'; + + @override + String get leaveEmptyToClearStatus => 'اتركه فارغًا لمسح حالتك.'; + + @override + String get select => 'اختر'; + + @override + String get searchForUsers => 'ابحث عن @users...'; + + @override + String get pleaseEnterYourCurrentPassword => 'من فضلك أدخل كلمة السر الحالية'; + + @override + String get newPassword => 'كلمة المرور الجديدة'; + + @override + String get pleaseChooseAStrongPassword => 'الرجاء اختيار كلمة مرور قوية'; + + @override + String get passwordsDoNotMatch => 'كلمات المرور لا تتطابق'; + + @override + String get passwordIsWrong => 'كلمة السر للدخول خاطئة'; + + @override + String get publicLink => 'رابط عام'; + + @override + String get publicChatAddresses => 'عناوين المحادثة العامة'; + + @override + String get createNewAddress => 'إنشاء عنوان جديد'; + + @override + String get joinSpace => 'انضم إلى المساحة'; + + @override + String get publicSpaces => 'مساحة عامة'; + + @override + String get addChatOrSubSpace => 'إضافة دردشة أو مساحة فرعية'; + + @override + String get subspace => 'مساحة فرعية'; + + @override + String get decline => 'رفض'; + + @override + String get thisDevice => 'هذا الجهاز:'; + + @override + String get initAppError => 'حدث خطأ بداخل التطبيق'; + + @override + String get userRole => 'دور المستخدم'; + + @override + String minimumPowerLevel(String level) { + return '$level هو الحد الأدنى من مستوى الطاقة.'; + } + + @override + String searchIn(String chat) { + return 'بحث في $chat...'; + } + + @override + String get searchMore => 'ابحث أكثر...'; + + @override + String get gallery => 'المعرض'; + + @override + String get files => 'الملفات'; + + @override + String databaseBuildErrorBody(String url, String error) { + return 'غير قادر على بناء قاعدة بيانات SQlite. يحاول التطبيق استخدام قاعدة بيانات قديمة في الوقت الحالي. الرجاء الإبلاغ عن هذا الخطأ للمطورين على $url. رسالة الخطأ هي: $error'; + } + + @override + String sessionLostBody(String url, String error) { + return 'جلستك مفقودة يرجى إبلاغ المطورين بهذا الخطأ في $url. رسالة الخطأ هي: $error'; + } + + @override + String restoreSessionBody(String url, String error) { + return 'يحاول التطبيق الآن استعادة جلستك من النسخة الاحتياطية. الرجاء الإبلاغ عن هذا الخطأ للمطورين على $url. رسالة الخطأ هي:$error'; + } + + @override + String forwardMessageTo(String roomName) { + return 'هل تريد إعادة توجيه الرسالة إلى $roomName؟'; + } + + @override + String get sendReadReceipts => 'إرسال بالقراءة'; + + @override + String get sendTypingNotificationsDescription => + 'يستطيع المشاركون الآخرون في المحادثة رؤيتك عند كتابة رسالة جديدة.'; + + @override + String get sendReadReceiptsDescription => + 'يمكن للمشاركين الآخرين في المحادثة معرفة متى قرأت الرسالة.'; + + @override + String get formattedMessages => 'رسائل منسقة'; + + @override + String get formattedMessagesDescription => + 'عرض محتوى الرسالة الغنية مثل النص الغامق باستخدام الماركداون.'; + + @override + String get verifyOtherUser => '🔐 التحقق من المستخدم الآخر'; + + @override + String get verifyOtherUserDescription => + 'إذا قمت بالتحقق من مستخدم آخر، فيمكنك التأكد من أنك تعرف من تكتب إليه حقًا. 💪\n\nعند بدء عملية التحقق، سترى أنت والمستخدم الآخر نافذة منبثقة في التطبيق. هناك سترى بعد ذلك سلسلة من الرموز التعبيرية أو الأرقام التي يتعين عليك مقارنتها مع بعضها البعض.\n\nأفضل طريقة للقيام بذلك هي الالتقاء أو بدء مكالمة فيديو. 👭'; + + @override + String get verifyOtherDevice => '🔐 التحقق من الجهاز الآخر'; + + @override + String get verifyOtherDeviceDescription => + 'عند التحقق من جهاز آخر، يمكن لهذه الأجهزة تبادل المفاتيح، مما يزيد من أمانك بشكل عام. 💪 عند بدء عملية التحقق، ستظهر نافذة منبثقة في التطبيق على كلا الجهازين. هناك سترى بعد ذلك سلسلة من الرموز التعبيرية أو الأرقام التي يتعين عليك مقارنتها مع بعضها البعض. من الأفضل أن يكون كلا الجهازين في متناول يديك قبل بدء عملية التحقق. 🤳'; + + @override + String acceptedKeyVerification(String sender) { + return 'وافق $sender على التحقق من المفتاح'; + } + + @override + String canceledKeyVerification(String sender) { + return 'قام $sender بإلغاء التحقق من المفتاح'; + } + + @override + String completedKeyVerification(String sender) { + return 'أكمل $sender عملية التحقق من المفتاح'; + } + + @override + String isReadyForKeyVerification(String sender) { + return '$sender جاهز للتحقق من المفتاح'; + } + + @override + String requestedKeyVerification(String sender) { + return 'طلب $sender التحقق من المفتاح'; + } + + @override + String startedKeyVerification(String sender) { + return 'بدأ $sender عملية التحقق من المفتاح'; + } + + @override + String get transparent => 'شفّاف'; + + @override + String get incomingMessages => 'الرسائل الواردة'; + + @override + String get stickers => 'الملصقات'; + + @override + String get discover => 'استكشف'; + + @override + String get commandHint_ignore => 'تجاهل معرف المصفوفة المعطى'; + + @override + String get commandHint_unignore => 'إلغاء تجاهل معرف المصفوفة المحدد'; + + @override + String unreadChatsInApp(String appname, String unread) { + return '$appname: $unread الدردشات غير المقروءة'; + } + + @override + String get noDatabaseEncryption => + 'تشفير قاعدة البيانات غير مدعوم على هذا النظام الأساسي'; + + @override + String thereAreCountUsersBlocked(Object count) { + return 'يوجد حاليًا $count من المستخدمين المحظورين.'; + } + + @override + String get restricted => 'مقيد'; + + @override + String get knockRestricted => 'قيود النقر'; + + @override + String goToSpace(Object space) { + return 'انتقل إلى المساحة: $space'; + } + + @override + String get markAsUnread => 'تحديد كغير مقروء'; + + @override + String userLevel(int level) { + return '$level - مستخدم'; + } + + @override + String moderatorLevel(int level) { + return '$level - مشرف'; + } + + @override + String adminLevel(int level) { + return '$level - مدير'; + } + + @override + String get changeGeneralChatSettings => 'تغيير إعدادات الدردشة العامة'; + + @override + String get inviteOtherUsers => 'دعوة مستخدمين آخرين إلى هذه الدردشة'; + + @override + String get changeTheChatPermissions => 'تغيير أذونات الدردشة'; + + @override + String get changeTheVisibilityOfChatHistory => 'تغيير رؤية سجل الدردشة'; + + @override + String get changeTheCanonicalRoomAlias => + 'تغيير عنوان الدردشة العامة الرئيسي'; + + @override + String get sendRoomNotifications => 'إرسال إشعارات @room'; + + @override + String get changeTheDescriptionOfTheGroup => 'تغيير وصف الدردشة'; + + @override + String get chatPermissionsDescription => + '‪حدد مستوى الصلاحية الضروري لإجراءات معينة في هذه الدردشة. عادة ما تمثل مستويات الصلاحية 0 و 50 و 100 المستخدمين والمشرفين ولكن أي تدرج ممكن.'; + + @override + String updateInstalled(String version) { + return 'تم تثبيت🎉 تحديث $version!'; + } + + @override + String get changelog => 'سجل التغييرات'; + + @override + String get sendCanceled => 'تم إلغاء الإرسال'; + + @override + String get loginWithMatrixId => 'تسجيل الدخول باستخدام معرف ماتريكس'; + + @override + String get discoverHomeservers => 'اكتشف الخوادم المنزلية'; + + @override + String get whatIsAHomeserver => 'ما هو خادم المنزل ؟'; + + @override + String get homeserverDescription => + 'يتم تخزين جميع بياناتك على خادم المنزل، تمامًا مثل مزود خدمة البريد الإلكتروني. يمكنك اختيار خادم البيت الذي تريد استخدامه، بينما لا يزال بإمكانك التواصل مع الجميع. اعرف المزيد على https://matrix.org.'; + + @override + String get doesNotSeemToBeAValidHomeserver => + 'لا يبدو أنه خادم منزلي متوافق. عنوان URL غير صحيح ؟'; + + @override + String get calculatingFileSize => 'جارٍ حساب حجم الملف...'; + + @override + String get prepareSendingAttachment => 'إعداد مرفق الإرسال...'; + + @override + String get sendingAttachment => 'جارٍ إرسال المرفق...'; + + @override + String get generatingVideoThumbnail => 'جارٍ إنشاء صورة مصغرة للفيديو...'; + + @override + String get compressVideo => 'جارٍ ضغط الفيديو...'; + + @override + String sendingAttachmentCountOfCount(int index, int length) { + return 'جارٍ إرسال المرفق $index من $length...'; + } + + @override + String serverLimitReached(int seconds) { + return 'تم الوصول إلى حد الخادم! انتظر $seconds ثانية...'; + } + + @override + String get oneOfYourDevicesIsNotVerified => 'لم يتم التحقق من أحد أجهزتك'; + + @override + String get noticeChatBackupDeviceVerification => + 'ملاحظة: عند توصيل جميع أجهزتك بنسخة احتياطية للدردشة، يتم التحقق منها تلقائيًا.'; + + @override + String get continueText => 'استمرار'; + + @override + String get welcomeText => + 'مرحبًا، 👋 معك Extera. يمكنك تسجيل الدخول إلى أي خادم منزلي، وهو متوافق مع https://matrix.org. ثم دردش مع أي شخص. إنها شبكة مراسلة لا مركزية ضخمة!'; + + @override + String get blur => 'الضبابية:'; + + @override + String get opacity => 'التعتيم:'; + + @override + String get setWallpaper => 'تعيين الخلفية'; + + @override + String get manageAccount => '‫إدارة الحساب‬'; + + @override + String get noContactInformationProvided => + 'لا يقدم السيرفر أي معلومات اتصال صحيحة'; + + @override + String get contactServerAdmin => 'اتصل بمسؤول الخادم'; + + @override + String get contactServerSecurity => 'الاتصال بمسؤول أمان ااخادم'; + + @override + String get supportPage => 'صفحة الدعم'; + + @override + String get serverInformation => 'معلومات الخادم:'; + + @override + String get name => 'الإسم'; + + @override + String get version => 'اﻹصدار'; + + @override + String get website => 'الموقع اﻹلكتروني'; + + @override + String get compress => 'ضغط'; + + @override + String get boldText => 'خط غامق'; + + @override + String get italicText => 'خط مائل'; + + @override + String get strikeThrough => 'يتوسطه خط'; + + @override + String get pleaseFillOut => 'من فضلك قم بتعبئته'; + + @override + String get invalidUrl => 'رابط غير صحيح'; + + @override + String get addLink => 'إضافة رابط'; + + @override + String get unableToJoinChat => + 'يتعذر الانضمام إلى الدردشة. ربما يكون الطرف الآخر قد أغلق المحادثة بالفعل.'; + + @override + String get previous => 'السابق'; + + @override + String get otherPartyNotLoggedIn => + 'لم يقم الطرف الآخر بتسجيل الدخول حالياً وبالتالي لا يمكنه تلقي الرسائل!'; + + @override + String appWantsToUseForLogin(String server) { + return 'Use \'$server\' to log in'; + } + + @override + String get appWantsToUseForLoginDescription => + 'You hereby allow the app and website to share information about you.'; + + @override + String get open => 'Open'; + + @override + String get waitingForServer => 'Waiting for server...'; + + @override + String get appIntroduction => + 'Extera lets you chat with your friends across different messengers. Learn more at https://matrix.org or just tap *Continue*.'; + + @override + String get newChatRequest => '📩 New chat request'; + + @override + String get contentNotificationSettings => 'Content notification settings'; + + @override + String get generalNotificationSettings => 'General notification settings'; + + @override + String get roomNotificationSettings => 'Room notification settings'; + + @override + String get userSpecificNotificationSettings => + 'User specific notification settings'; + + @override + String get otherNotificationSettings => 'Other notification settings'; + + @override + String get notificationRuleContainsUserName => 'Contains User Name'; + + @override + String get notificationRuleContainsUserNameDescription => + 'Notifies the user when a message contains their username.'; + + @override + String get notificationRuleMaster => 'Mute all notifications'; + + @override + String get notificationRuleMasterDescription => + 'Overrides all other rules and disables all notifications.'; + + @override + String get notificationRuleSuppressNotices => 'Suppress Automated Messages'; + + @override + String get notificationRuleSuppressNoticesDescription => + 'Suppresses notifications from automated clients like bots.'; + + @override + String get notificationRuleInviteForMe => 'Invite for Me'; + + @override + String get notificationRuleInviteForMeDescription => + 'Notifies the user when they are invited to a room.'; + + @override + String get notificationRuleMemberEvent => 'Member Event'; + + @override + String get notificationRuleMemberEventDescription => + 'Suppresses notifications for membership events.'; + + @override + String get notificationRuleIsUserMention => 'User Mention'; + + @override + String get notificationRuleIsUserMentionDescription => + 'Notifies the user when they are directly mentioned in a message.'; + + @override + String get notificationRuleContainsDisplayName => 'Contains Display Name'; + + @override + String get notificationRuleContainsDisplayNameDescription => + 'Notifies the user when a message contains their display name.'; + + @override + String get notificationRuleIsRoomMention => 'Room Mention'; + + @override + String get notificationRuleIsRoomMentionDescription => + 'Notifies the user when there is a room mention.'; + + @override + String get notificationRuleRoomnotif => 'Room Notification'; + + @override + String get notificationRuleRoomnotifDescription => + 'Notifies the user when a message contains \'@room\'.'; + + @override + String get notificationRuleTombstone => 'Tombstone'; + + @override + String get notificationRuleTombstoneDescription => + 'Notifies the user about room deactivation messages.'; + + @override + String get notificationRuleReaction => 'Reaction'; + + @override + String get notificationRuleReactionDescription => + 'Suppresses notifications for reactions.'; + + @override + String get notificationRuleRoomServerAcl => 'Room Server ACL'; + + @override + String get notificationRuleRoomServerAclDescription => + 'Suppresses notifications for room server access control lists (ACL).'; + + @override + String get notificationRuleSuppressEdits => 'Suppress Edits'; + + @override + String get notificationRuleSuppressEditsDescription => + 'Suppresses notifications for edited messages.'; + + @override + String get notificationRuleCall => 'Call'; + + @override + String get notificationRuleCallDescription => + 'Notifies the user about calls.'; + + @override + String get notificationRuleEncryptedRoomOneToOne => + 'Encrypted Room One-to-One'; + + @override + String get notificationRuleEncryptedRoomOneToOneDescription => + 'Notifies the user about messages in encrypted one-to-one rooms.'; + + @override + String get notificationRuleRoomOneToOne => 'Room One-to-One'; + + @override + String get notificationRuleRoomOneToOneDescription => + 'Notifies the user about messages in one-to-one rooms.'; + + @override + String get notificationRuleMessage => 'Message'; + + @override + String get notificationRuleMessageDescription => + 'Notifies the user about general messages.'; + + @override + String get notificationRuleEncrypted => 'Encrypted'; + + @override + String get notificationRuleEncryptedDescription => + 'Notifies the user about messages in encrypted rooms.'; + + @override + String get notificationRuleJitsi => 'Jitsi'; + + @override + String get notificationRuleJitsiDescription => + 'Notifies the user about Jitsi widget events.'; + + @override + String get notificationRuleServerAcl => 'Suppress Server ACL Events'; + + @override + String get notificationRuleServerAclDescription => + 'Suppresses notifications for Server ACL events.'; + + @override + String unknownPushRule(String rule) { + return 'Unknown push rule \'$rule\''; + } + + @override + String get deletePushRuleCanNotBeUndone => + 'If you delete this notification setting, this can not be undone.'; + + @override + String get more => 'More'; + + @override + String get shareKeysWith => 'Share keys with...'; + + @override + String get shareKeysWithDescription => + 'Which devices should be trusted so that they can read along your messages in encrypted chats?'; + + @override + String get allDevices => 'All devices'; + + @override + String get crossVerifiedDevicesIfEnabled => + 'Cross verified devices if enabled'; + + @override + String get crossVerifiedDevices => 'Cross verified devices'; + + @override + String get verifiedDevicesOnly => 'Verified devices only'; + + @override + String get takeAPhoto => 'Take a photo'; + + @override + String get recordAVideo => 'Record a video'; + + @override + String get optionalMessage => '(Optional) message...'; + + @override + String get notSupportedOnThisDevice => 'Not supported on this device'; + + @override + String get enterNewChat => 'Enter new chat'; + + @override + String get approve => 'Approve'; + + @override + String get youHaveKnocked => 'You have knocked'; + + @override + String get pleaseWaitUntilInvited => + 'Please wait now, until someone from the room invites you.'; +} diff --git a/lib/generated/l10n/l10n_be.dart b/lib/generated/l10n/l10n_be.dart new file mode 100644 index 0000000..c2717b7 --- /dev/null +++ b/lib/generated/l10n/l10n_be.dart @@ -0,0 +1,2745 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'l10n.dart'; + +// ignore_for_file: type=lint + +/// The translations for Belarusian (`be`). +class L10nBe extends L10n { + L10nBe([String locale = 'be']) : super(locale); + + @override + String get noSendPermission => 'You can\'t send messages here'; + + @override + String get alwaysUse24HourFormat => 'false'; + + @override + String get repeatPassword => 'Repeat password'; + + @override + String get notAnImage => 'Not an image file.'; + + @override + String get setCustomPermissionLevel => 'Set custom permission level'; + + @override + String get setPermissionsLevelDescription => + 'Please choose a predefined role below or enter a custom permission level between 0 and 100.'; + + @override + String get ignoreUser => 'Ignore user'; + + @override + String get normalUser => 'Normal user'; + + @override + String get remove => 'Remove'; + + @override + String get importNow => 'Import now'; + + @override + String get importEmojis => 'Import Emojis'; + + @override + String get importFromZipFile => 'Import from .zip file'; + + @override + String get exportEmotePack => 'Export Emote pack as .zip'; + + @override + String get replace => 'Replace'; + + @override + String get about => 'About'; + + @override + String aboutHomeserver(String homeserver) { + return 'About $homeserver'; + } + + @override + String get accept => 'Accept'; + + @override + String acceptedTheInvitation(String username) { + return '👍 $username accepted the invitation'; + } + + @override + String get account => 'Account'; + + @override + String activatedEndToEndEncryption(String username) { + return '🔐 $username activated end to end encryption'; + } + + @override + String get addEmail => 'Add email'; + + @override + String get confirmMatrixId => + 'Please confirm your Matrix ID in order to delete your account.'; + + @override + String supposedMxid(String mxid) { + return 'This should be $mxid'; + } + + @override + String get addChatDescription => 'Add a chat description...'; + + @override + String get addToSpace => 'Add to space'; + + @override + String get admin => 'Admin'; + + @override + String get alias => 'alias'; + + @override + String get all => 'All'; + + @override + String get allChats => 'All chats'; + + @override + String get commandHint_roomupgrade => + 'Upgrade this room to the given room version'; + + @override + String get commandHint_googly => 'Send some googly eyes'; + + @override + String get commandHint_cuddle => 'Send a cuddle'; + + @override + String get commandHint_hug => 'Send a hug'; + + @override + String googlyEyesContent(String senderName) { + return '$senderName sends you googly eyes'; + } + + @override + String cuddleContent(String senderName) { + return '$senderName cuddles you'; + } + + @override + String hugContent(String senderName) { + return '$senderName hugs you'; + } + + @override + String answeredTheCall(String senderName) { + return '$senderName answered the call'; + } + + @override + String get anyoneCanJoin => 'Anyone can join'; + + @override + String get appLock => 'App lock'; + + @override + String get appLockDescription => + 'Lock the app when not using with a pin code'; + + @override + String get archive => 'Archive'; + + @override + String get areGuestsAllowedToJoin => 'Are guest users allowed to join'; + + @override + String get areYouSure => 'Are you sure?'; + + @override + String get areYouSureYouWantToLogout => 'Are you sure you want to log out?'; + + @override + String get askSSSSSign => + 'To be able to sign the other person, please enter your secure store passphrase or recovery key.'; + + @override + String askVerificationRequest(String username) { + return 'Accept this verification request from $username?'; + } + + @override + String get autoplayImages => + 'Automatically play animated stickers and emotes'; + + @override + String badServerLoginTypesException(String serverVersions, + String supportedVersions, Object suportedVersions) { + return 'The homeserver supports the login types:\n$serverVersions\nBut this app supports only:\n$supportedVersions'; + } + + @override + String get sendTypingNotifications => 'Send typing notifications'; + + @override + String get swipeRightToLeftToReply => 'Swipe right to left to reply'; + + @override + String get sendOnEnter => 'Send on enter'; + + @override + String badServerVersionsException(String serverVersions, + String supportedVersions, Object serverVerions, Object suportedVersions) { + return 'The homeserver supports the Spec versions:\n$serverVersions\nBut this app supports only $supportedVersions'; + } + + @override + String countChatsAndCountParticipants(int chats, int participants) { + return '$chats chats and $participants participants'; + } + + @override + String get noMoreChatsFound => 'No more chats found...'; + + @override + String get noChatsFoundHere => + 'No chats found here yet. Start a new chat with someone by using the button below. ⤵️'; + + @override + String get joinedChats => 'Joined chats'; + + @override + String get unread => 'Unread'; + + @override + String get space => 'Space'; + + @override + String get spaces => 'Spaces'; + + @override + String get banFromChat => 'Ban from chat'; + + @override + String get banned => 'Banned'; + + @override + String bannedUser(String username, String targetName) { + return '$username banned $targetName'; + } + + @override + String get blockDevice => 'Block Device'; + + @override + String get blocked => 'Blocked'; + + @override + String get botMessages => 'Bot messages'; + + @override + String get cancel => 'Cancel'; + + @override + String cantOpenUri(String uri) { + return 'Can\'t open the URI $uri'; + } + + @override + String get changeDeviceName => 'Change device name'; + + @override + String changedTheChatAvatar(String username) { + return '$username changed the chat avatar'; + } + + @override + String changedTheChatDescriptionTo(String username, String description) { + return '$username changed the chat description to: \'$description\''; + } + + @override + String changedTheChatNameTo(String username, String chatname) { + return '$username changed the chat name to: \'$chatname\''; + } + + @override + String changedTheChatPermissions(String username) { + return '$username changed the chat permissions'; + } + + @override + String changedTheDisplaynameTo(String username, String displayname) { + return '$username changed their displayname to: \'$displayname\''; + } + + @override + String changedTheGuestAccessRules(String username) { + return '$username changed the guest access rules'; + } + + @override + String changedTheGuestAccessRulesTo(String username, String rules) { + return '$username changed the guest access rules to: $rules'; + } + + @override + String changedTheHistoryVisibility(String username) { + return '$username changed the history visibility'; + } + + @override + String changedTheHistoryVisibilityTo(String username, String rules) { + return '$username changed the history visibility to: $rules'; + } + + @override + String changedTheJoinRules(String username) { + return '$username changed the join rules'; + } + + @override + String changedTheJoinRulesTo(String username, String joinRules) { + return '$username changed the join rules to: $joinRules'; + } + + @override + String changedTheProfileAvatar(String username) { + return '$username changed their avatar'; + } + + @override + String changedTheRoomAliases(String username) { + return '$username changed the room aliases'; + } + + @override + String changedTheRoomInvitationLink(String username) { + return '$username changed the invitation link'; + } + + @override + String get changePassword => 'Change password'; + + @override + String get changeTheHomeserver => 'Change the homeserver'; + + @override + String get changeTheme => 'Change your style'; + + @override + String get changeTheNameOfTheGroup => 'Change the name of the group'; + + @override + String get changeYourAvatar => 'Change your avatar'; + + @override + String get channelCorruptedDecryptError => + 'The encryption has been corrupted'; + + @override + String get chat => 'Chat'; + + @override + String get yourChatBackupHasBeenSetUp => 'Your chat backup has been set up.'; + + @override + String get chatBackup => 'Chat backup'; + + @override + String get chatBackupDescription => + 'Your old messages are secured with a recovery key. Please make sure you don\'t lose it.'; + + @override + String get chatDetails => 'Chat details'; + + @override + String get chatHasBeenAddedToThisSpace => 'Chat has been added to this space'; + + @override + String get chats => 'Chats'; + + @override + String get chooseAStrongPassword => 'Choose a strong password'; + + @override + String get clearArchive => 'Clear archive'; + + @override + String get close => 'Close'; + + @override + String get commandHint_markasdm => + 'Mark as direct message room for the giving Matrix ID'; + + @override + String get commandHint_markasgroup => 'Mark as group'; + + @override + String get commandHint_ban => 'Ban the given user from this room'; + + @override + String get commandHint_clearcache => 'Clear cache'; + + @override + String get commandHint_create => + 'Create an empty group chat\nUse --no-encryption to disable encryption'; + + @override + String get commandHint_discardsession => 'Discard session'; + + @override + String get commandHint_dm => + 'Start a direct chat\nUse --no-encryption to disable encryption'; + + @override + String get commandHint_html => 'Send HTML-formatted text'; + + @override + String get commandHint_invite => 'Invite the given user to this room'; + + @override + String get commandHint_join => 'Join the given room'; + + @override + String get commandHint_kick => 'Remove the given user from this room'; + + @override + String get commandHint_leave => 'Leave this room'; + + @override + String get commandHint_me => 'Describe yourself'; + + @override + String get commandHint_myroomavatar => + 'Set your picture for this room (by mxc-uri)'; + + @override + String get commandHint_myroomnick => 'Set your display name for this room'; + + @override + String get commandHint_op => + 'Set the given user\'s power level (default: 50)'; + + @override + String get commandHint_plain => 'Send unformatted text'; + + @override + String get commandHint_react => 'Send reply as a reaction'; + + @override + String get commandHint_send => 'Send text'; + + @override + String get commandHint_unban => 'Unban the given user from this room'; + + @override + String get commandInvalid => 'Command invalid'; + + @override + String commandMissing(String command) { + return '$command is not a command.'; + } + + @override + String get compareEmojiMatch => 'Please compare the emojis'; + + @override + String get compareNumbersMatch => 'Please compare the numbers'; + + @override + String get configureChat => 'Configure chat'; + + @override + String get confirm => 'Confirm'; + + @override + String get connect => 'Connect'; + + @override + String get contactHasBeenInvitedToTheGroup => + 'Contact has been invited to the group'; + + @override + String get containsDisplayName => 'Contains display name'; + + @override + String get containsUserName => 'Contains username'; + + @override + String get contentHasBeenReported => + 'The content has been reported to the server admins'; + + @override + String get copiedToClipboard => 'Copied to clipboard'; + + @override + String get copy => 'Copy'; + + @override + String get copyToClipboard => 'Copy to clipboard'; + + @override + String couldNotDecryptMessage(String error) { + return 'Could not decrypt message: $error'; + } + + @override + String countParticipants(int count) { + return '$count participants'; + } + + @override + String get create => 'Create'; + + @override + String createdTheChat(String username) { + return '💬 $username created the chat'; + } + + @override + String get createGroup => 'Create group'; + + @override + String get createNewSpace => 'New space'; + + @override + String get currentlyActive => 'Currently active'; + + @override + String get darkTheme => 'Dark'; + + @override + String dateAndTimeOfDay(String date, String timeOfDay) { + return '$date, $timeOfDay'; + } + + @override + String dateWithoutYear(String month, String day) { + return '$month-$day'; + } + + @override + String dateWithYear(String year, String month, String day) { + return '$year-$month-$day'; + } + + @override + String get deactivateAccountWarning => + 'This will deactivate your user account. This can not be undone! Are you sure?'; + + @override + String get defaultPermissionLevel => 'Default permission level for new users'; + + @override + String get delete => 'Delete'; + + @override + String get deleteAccount => 'Delete account'; + + @override + String get deleteMessage => 'Delete message'; + + @override + String get device => 'Device'; + + @override + String get deviceId => 'Device ID'; + + @override + String get devices => 'Devices'; + + @override + String get directChats => 'Direct Chats'; + + @override + String get allRooms => 'All Group Chats'; + + @override + String get displaynameHasBeenChanged => 'Displayname has been changed'; + + @override + String get downloadFile => 'Download file'; + + @override + String get edit => 'Edit'; + + @override + String get editBlockedServers => 'Edit blocked servers'; + + @override + String get chatPermissions => 'Chat permissions'; + + @override + String get editDisplayname => 'Edit displayname'; + + @override + String get editRoomAliases => 'Edit room aliases'; + + @override + String get editRoomAvatar => 'Edit room avatar'; + + @override + String get emoteExists => 'Emote already exists!'; + + @override + String get emoteInvalid => 'Invalid emote shortcode!'; + + @override + String get emoteKeyboardNoRecents => + 'Recently-used emotes will appear here...'; + + @override + String get emotePacks => 'Emote packs for room'; + + @override + String get emoteSettings => 'Emote Settings'; + + @override + String get globalChatId => 'Global chat ID'; + + @override + String get accessAndVisibility => 'Access and visibility'; + + @override + String get accessAndVisibilityDescription => + 'Who is allowed to join this chat and how the chat can be discovered.'; + + @override + String get calls => 'Calls'; + + @override + String get customEmojisAndStickers => 'Custom emojis and stickers'; + + @override + String get customEmojisAndStickersBody => + 'Add or share custom emojis or stickers which can be used in any chat.'; + + @override + String get emoteShortcode => 'Emote shortcode'; + + @override + String get emoteWarnNeedToPick => + 'You need to pick an emote shortcode and an image!'; + + @override + String get emptyChat => 'Empty chat'; + + @override + String get enableEmotesGlobally => 'Enable emote pack globally'; + + @override + String get enableEncryption => 'Enable encryption'; + + @override + String get enableEncryptionWarning => + 'You won\'t be able to disable the encryption anymore. Are you sure?'; + + @override + String get encrypted => 'Encrypted'; + + @override + String get encryption => 'Encryption'; + + @override + String get encryptionNotEnabled => 'Encryption is not enabled'; + + @override + String endedTheCall(String senderName) { + return '$senderName ended the call'; + } + + @override + String get enterAnEmailAddress => 'Enter an email address'; + + @override + String get homeserver => 'Homeserver'; + + @override + String get enterYourHomeserver => 'Enter your homeserver'; + + @override + String errorObtainingLocation(String error) { + return 'Error obtaining location: $error'; + } + + @override + String get everythingReady => 'Everything ready!'; + + @override + String get extremeOffensive => 'Extremely offensive'; + + @override + String get fileName => 'File name'; + + @override + String get fluffychat => 'Extera'; + + @override + String get fontSize => 'Font size'; + + @override + String get forward => 'Forward'; + + @override + String get fromJoining => 'From joining'; + + @override + String get fromTheInvitation => 'From the invitation'; + + @override + String get goToTheNewRoom => 'Go to the new room'; + + @override + String get group => 'Group'; + + @override + String get chatDescription => 'Chat description'; + + @override + String get chatDescriptionHasBeenChanged => 'Chat description changed'; + + @override + String get groupIsPublic => 'Group is public'; + + @override + String get groups => 'Groups'; + + @override + String groupWith(String displayname) { + return 'Group with $displayname'; + } + + @override + String get guestsAreForbidden => 'Guests are forbidden'; + + @override + String get guestsCanJoin => 'Guests can join'; + + @override + String hasWithdrawnTheInvitationFor(String username, String targetName) { + return '$username has withdrawn the invitation for $targetName'; + } + + @override + String get help => 'Help'; + + @override + String get hideRedactedEvents => 'Hide redacted events'; + + @override + String get hideRedactedMessages => 'Hide redacted messages'; + + @override + String get hideRedactedMessagesBody => + 'If someone redacts a message, this message won\'t be visible in the chat anymore.'; + + @override + String get hideInvalidOrUnknownMessageFormats => + 'Hide invalid or unknown message formats'; + + @override + String get howOffensiveIsThisContent => 'How offensive is this content?'; + + @override + String get id => 'ID'; + + @override + String get identity => 'Identity'; + + @override + String get block => 'Block'; + + @override + String get blockedUsers => 'Blocked users'; + + @override + String get blockListDescription => + 'You can block users who are disturbing you. You won\'t be able to receive any messages or room invites from the users on your personal block list.'; + + @override + String get blockUsername => 'Ignore username'; + + @override + String get iHaveClickedOnLink => 'I have clicked on the link'; + + @override + String get incorrectPassphraseOrKey => 'Incorrect passphrase or recovery key'; + + @override + String get inoffensive => 'Inoffensive'; + + @override + String get inviteContact => 'Invite contact'; + + @override + String inviteContactToGroupQuestion(Object contact, Object groupName) { + return 'Do you want to invite $contact to the chat \"$groupName\"?'; + } + + @override + String inviteContactToGroup(String groupName) { + return 'Invite contact to $groupName'; + } + + @override + String get noChatDescriptionYet => 'No chat description created yet.'; + + @override + String get tryAgain => 'Try again'; + + @override + String get invalidServerName => 'Invalid server name'; + + @override + String get invited => 'Invited'; + + @override + String get redactMessageDescription => + 'The message will be redacted for all participants in this conversation. This cannot be undone.'; + + @override + String get optionalRedactReason => + '(Optional) Reason for redacting this message...'; + + @override + String invitedUser(String username, String targetName) { + return '📩 $username invited $targetName'; + } + + @override + String get invitedUsersOnly => 'Invited users only'; + + @override + String get inviteForMe => 'Invite for me'; + + @override + String inviteText(String username, String link) { + return '$username invited you to Extera.\n1. Visit fluffychat.im and install the app \n2. Sign up or sign in \n3. Open the invite link: \n $link'; + } + + @override + String get isTyping => 'is typing…'; + + @override + String joinedTheChat(String username) { + return '👋 $username joined the chat'; + } + + @override + String get joinRoom => 'Join room'; + + @override + String kicked(String username, String targetName) { + return '👞 $username kicked $targetName'; + } + + @override + String kickedAndBanned(String username, String targetName) { + return '🙅 $username kicked and banned $targetName'; + } + + @override + String get kickFromChat => 'Kick from chat'; + + @override + String lastActiveAgo(String localizedTimeShort) { + return 'Last active: $localizedTimeShort'; + } + + @override + String get leave => 'Leave'; + + @override + String get leftTheChat => 'Left the chat'; + + @override + String get license => 'License'; + + @override + String get lightTheme => 'Light'; + + @override + String loadCountMoreParticipants(int count) { + return 'Load $count more participants'; + } + + @override + String get dehydrate => 'Export session and wipe device'; + + @override + String get dehydrateWarning => + 'This action cannot be undone. Ensure you safely store the backup file.'; + + @override + String get dehydrateTor => 'TOR Users: Export session'; + + @override + String get dehydrateTorLong => + 'For TOR users, it is recommended to export the session before closing the window.'; + + @override + String get hydrateTor => 'TOR Users: Import session export'; + + @override + String get hydrateTorLong => + 'Did you export your session last time on TOR? Quickly import it and continue chatting.'; + + @override + String get hydrate => 'Restore from backup file'; + + @override + String get loadingPleaseWait => 'Loading… Please wait.'; + + @override + String get loadMore => 'Load more…'; + + @override + String get locationDisabledNotice => + 'Location services are disabled. Please enable them to be able to share your location.'; + + @override + String get locationPermissionDeniedNotice => + 'Location permission denied. Please grant them to be able to share your location.'; + + @override + String get login => 'Login'; + + @override + String logInTo(String homeserver) { + return 'Log in to $homeserver'; + } + + @override + String get logout => 'Logout'; + + @override + String get memberChanges => 'Member changes'; + + @override + String get mention => 'Mention'; + + @override + String get messages => 'Messages'; + + @override + String get messagesStyle => 'Messages:'; + + @override + String get moderator => 'Moderator'; + + @override + String get muteChat => 'Mute chat'; + + @override + String get needPantalaimonWarning => + 'Please be aware that you need Pantalaimon to use end-to-end encryption for now.'; + + @override + String get newChat => 'New chat'; + + @override + String get newMessageInFluffyChat => '💬 New message in Extera'; + + @override + String get newVerificationRequest => 'New verification request!'; + + @override + String get next => 'Next'; + + @override + String get no => 'No'; + + @override + String get noConnectionToTheServer => 'No connection to the server'; + + @override + String get noEmotesFound => 'No emotes found. 😕'; + + @override + String get noEncryptionForPublicRooms => + 'You can only activate encryption as soon as the room is no longer publicly accessible.'; + + @override + String get noGoogleServicesWarning => + 'Firebase Cloud Messaging doesn\'t appear to be available on your device. To still receive push notifications, we recommend installing ntfy. With ntfy or another Unified Push provider you can receive push notifications in a data secure way. You can download ntfy from the PlayStore or from F-Droid.'; + + @override + String noMatrixServer(String server1, String server2) { + return '$server1 is no matrix server, use $server2 instead?'; + } + + @override + String get shareInviteLink => 'Share invite link'; + + @override + String get scanQrCode => 'Scan QR code'; + + @override + String get none => 'None'; + + @override + String get noPasswordRecoveryDescription => + 'You have not added a way to recover your password yet.'; + + @override + String get noPermission => 'No permission'; + + @override + String get noRoomsFound => 'No rooms found…'; + + @override + String get notifications => 'Notifications'; + + @override + String get notificationsEnabledForThisAccount => + 'Notifications enabled for this account'; + + @override + String numUsersTyping(int count) { + return '$count users are typing…'; + } + + @override + String get obtainingLocation => 'Obtaining location…'; + + @override + String get offensive => 'Offensive'; + + @override + String get offline => 'Offline'; + + @override + String get ok => 'Ok'; + + @override + String get online => 'Online'; + + @override + String get onlineKeyBackupEnabled => 'Online Key Backup is enabled'; + + @override + String get oopsPushError => + 'Oops! Unfortunately, an error occurred when setting up the push notifications.'; + + @override + String get oopsSomethingWentWrong => 'Oops, something went wrong…'; + + @override + String get openAppToReadMessages => 'Open app to read messages'; + + @override + String get openCamera => 'Open camera'; + + @override + String get openVideoCamera => 'Open camera for a video'; + + @override + String get oneClientLoggedOut => 'One of your clients has been logged out'; + + @override + String get addAccount => 'Add account'; + + @override + String get editBundlesForAccount => 'Edit bundles for this account'; + + @override + String get addToBundle => 'Add to bundle'; + + @override + String get removeFromBundle => 'Remove from this bundle'; + + @override + String get bundleName => 'Bundle name'; + + @override + String get enableMultiAccounts => + '(BETA) Enable multi accounts on this device'; + + @override + String get openInMaps => 'Open in maps'; + + @override + String get link => 'Link'; + + @override + String get serverRequiresEmail => + 'This server needs to validate your email address for registration.'; + + @override + String get or => 'Or'; + + @override + String get participant => 'Participant'; + + @override + String get passphraseOrKey => 'passphrase or recovery key'; + + @override + String get password => 'Password'; + + @override + String get passwordForgotten => 'Password forgotten'; + + @override + String get passwordHasBeenChanged => 'Password has been changed'; + + @override + String get hideMemberChangesInPublicChats => + 'Hide member changes in public chats'; + + @override + String get hideMemberChangesInPublicChatsBody => + 'Do not show in the chat timeline if someone joins or leaves a public chat to improve readability.'; + + @override + String get overview => 'Overview'; + + @override + String get notifyMeFor => 'Notify me for'; + + @override + String get passwordRecoverySettings => 'Password recovery settings'; + + @override + String get passwordRecovery => 'Password recovery'; + + @override + String get people => 'People'; + + @override + String get pickImage => 'Pick an image'; + + @override + String get pin => 'Pin'; + + @override + String play(String fileName) { + return 'Play $fileName'; + } + + @override + String get pleaseChoose => 'Please choose'; + + @override + String get pleaseChooseAPasscode => 'Please choose a pass code'; + + @override + String get pleaseClickOnLink => + 'Please click on the link in the email and then proceed.'; + + @override + String get pleaseEnter4Digits => + 'Please enter 4 digits or leave empty to disable app lock.'; + + @override + String get pleaseEnterRecoveryKey => 'Please enter your recovery key:'; + + @override + String get pleaseEnterYourPassword => 'Please enter your password'; + + @override + String get pleaseEnterYourPin => 'Please enter your pin'; + + @override + String get pleaseEnterYourUsername => 'Please enter your username'; + + @override + String get pleaseFollowInstructionsOnWeb => + 'Please follow the instructions on the website and tap on next.'; + + @override + String get privacy => 'Privacy'; + + @override + String get publicRooms => 'Public Rooms'; + + @override + String get pushRules => 'Push rules'; + + @override + String get reason => 'Reason'; + + @override + String get recording => 'Recording'; + + @override + String redactedBy(String username) { + return 'Redacted by $username'; + } + + @override + String get directChat => 'Direct chat'; + + @override + String redactedByBecause(String username, String reason) { + return 'Redacted by $username because: \"$reason\"'; + } + + @override + String redactedAnEvent(String username) { + return '$username redacted an event'; + } + + @override + String get redactMessage => 'Redact message'; + + @override + String get register => 'Register'; + + @override + String get reject => 'Reject'; + + @override + String rejectedTheInvitation(String username) { + return '$username rejected the invitation'; + } + + @override + String get rejoin => 'Rejoin'; + + @override + String get removeAllOtherDevices => 'Remove all other devices'; + + @override + String removedBy(String username) { + return 'Removed by $username'; + } + + @override + String get removeDevice => 'Remove device'; + + @override + String get unbanFromChat => 'Unban from chat'; + + @override + String get removeYourAvatar => 'Remove your avatar'; + + @override + String get replaceRoomWithNewerVersion => 'Replace room with newer version'; + + @override + String get reply => 'Reply'; + + @override + String get reportMessage => 'Report message'; + + @override + String get translateMessage => 'Translate message'; + + @override + String get translatedMessage => 'Translated message'; + + @override + String get errorTranslatingMessage => + 'An error has occured while translating the message.'; + + @override + String get recoverMessage => 'Recover message'; + + @override + String get recoveredMessage => 'Recovered message'; + + @override + String get errorRecoveringMessage => + 'An error has occured while recovering the message.'; + + @override + String get errorRecoveringMessageNoAdmin => + 'This feature is available on Synapse homeservers only for adminstrators.'; + + @override + String get requestPermission => 'Request permission'; + + @override + String get roomHasBeenUpgraded => 'Room has been upgraded'; + + @override + String get roomVersion => 'Room version'; + + @override + String get saveFile => 'Save file'; + + @override + String get retry => 'Retry'; + + @override + String get search => 'Search'; + + @override + String get security => 'Security'; + + @override + String get recoveryKey => 'Recovery key'; + + @override + String get recoveryKeyLost => 'Recovery key lost?'; + + @override + String seenByUser(String username) { + return 'Seen by $username'; + } + + @override + String get send => 'Send'; + + @override + String get sendAMessage => 'Send a message'; + + @override + String get sendAsText => 'Send as text'; + + @override + String get sendAudio => 'Send audio'; + + @override + String get sendFile => 'Send file'; + + @override + String get sendImage => 'Send image'; + + @override + String sendImages(int count) { + return 'Send $count image'; + } + + @override + String get sendMessages => 'Send messages'; + + @override + String get sendOriginal => 'Send original'; + + @override + String get sendSticker => 'Send sticker'; + + @override + String get sendVideo => 'Send video'; + + @override + String sentAFile(String username) { + return '📁 $username sent a file'; + } + + @override + String sentAnAudio(String username) { + return '🎤 $username sent an audio'; + } + + @override + String sentAPicture(String username) { + return '🖼️ $username sent a picture'; + } + + @override + String sentASticker(String username) { + return '😊 $username sent a sticker'; + } + + @override + String sentAVideo(String username) { + return '🎥 $username sent a video'; + } + + @override + String sentCallInformations(String senderName) { + return '$senderName sent call information'; + } + + @override + String get separateChatTypes => 'Separate Direct Chats and Groups'; + + @override + String get setAsCanonicalAlias => 'Set as main alias'; + + @override + String get setCustomEmotes => 'Set custom emotes'; + + @override + String get setChatDescription => 'Set chat description'; + + @override + String get setInvitationLink => 'Set invitation link'; + + @override + String get setPermissionsLevel => 'Set permissions level'; + + @override + String get setStatus => 'Set status'; + + @override + String get settings => 'Settings'; + + @override + String get share => 'Share'; + + @override + String sharedTheLocation(String username) { + return '$username shared their location'; + } + + @override + String get shareLocation => 'Share location'; + + @override + String get showPassword => 'Show password'; + + @override + String get presenceStyle => 'Presence:'; + + @override + String get hideAvatarsInInvites => 'Hide avatars in invites'; + + @override + String get hideAvatarsInInvitesDescription => + 'Do not show room avatars in invites'; + + @override + String get presencesToggle => 'Show status messages from other users'; + + @override + String get pureBlackToggle => 'Pure Black'; + + @override + String get singlesignon => 'Single Sign on'; + + @override + String get skip => 'Skip'; + + @override + String get sourceCode => 'Source code'; + + @override + String get spaceIsPublic => 'Space is public'; + + @override + String get spaceName => 'Space name'; + + @override + String startedACall(String senderName) { + return '$senderName started a call'; + } + + @override + String get startFirstChat => 'Start your first chat'; + + @override + String get status => 'Status'; + + @override + String get statusExampleMessage => 'How are you today?'; + + @override + String get submit => 'Submit'; + + @override + String get synchronizingPleaseWait => 'Synchronizing… Please wait.'; + + @override + String synchronizingPleaseWaitCounter(String percentage) { + return ' Synchronizing… ($percentage%)'; + } + + @override + String get systemTheme => 'System'; + + @override + String get theyDontMatch => 'They Don\'t Match'; + + @override + String get theyMatch => 'They Match'; + + @override + String get title => 'Extera'; + + @override + String get toggleFavorite => 'Toggle Favorite'; + + @override + String get toggleMuted => 'Toggle Muted'; + + @override + String get toggleUnread => 'Mark Read/Unread'; + + @override + String get tooManyRequestsWarning => + 'Too many requests. Please try again later!'; + + @override + String get transferFromAnotherDevice => 'Transfer from another device'; + + @override + String get tryToSendAgain => 'Try to send again'; + + @override + String get unavailable => 'Unavailable'; + + @override + String unbannedUser(String username, String targetName) { + return '$username unbanned $targetName'; + } + + @override + String get unblockDevice => 'Unblock Device'; + + @override + String get unknownDevice => 'Unknown device'; + + @override + String get unknownEncryptionAlgorithm => 'Unknown encryption algorithm'; + + @override + String unknownEvent(String type) { + return 'Unknown event \'$type\''; + } + + @override + String get unmuteChat => 'Unmute chat'; + + @override + String get unpin => 'Unpin'; + + @override + String unreadChats(int unreadCount) { + String _temp0 = intl.Intl.pluralLogic( + unreadCount, + locale: localeName, + other: '$unreadCount unread chats', + one: '1 unread chat', + ); + return '$_temp0'; + } + + @override + String userAndOthersAreTyping(String username, int count) { + return '$username and $count others are typing…'; + } + + @override + String userAndUserAreTyping(String username, String username2) { + return '$username and $username2 are typing…'; + } + + @override + String userIsTyping(String username) { + return '$username is typing…'; + } + + @override + String userLeftTheChat(String username) { + return '🚪 $username left the chat'; + } + + @override + String get username => 'Username'; + + @override + String userSentUnknownEvent(String username, String type) { + return '$username sent a $type event'; + } + + @override + String get unverified => 'Unverified'; + + @override + String get verified => 'Verified'; + + @override + String get verify => 'Verify'; + + @override + String get verifyStart => 'Start Verification'; + + @override + String get verifySuccess => 'You successfully verified!'; + + @override + String get verifyTitle => 'Verifying other account'; + + @override + String get videoCall => 'Video call'; + + @override + String get visibilityOfTheChatHistory => 'Visibility of the chat history'; + + @override + String get visibleForAllParticipants => 'Visible for all participants'; + + @override + String get visibleForEveryone => 'Visible for everyone'; + + @override + String get voiceMessage => 'Voice message'; + + @override + String get waitingPartnerAcceptRequest => + 'Waiting for partner to accept the request…'; + + @override + String get waitingPartnerEmoji => 'Waiting for partner to accept the emoji…'; + + @override + String get waitingPartnerNumbers => + 'Waiting for partner to accept the numbers…'; + + @override + String get wallpaper => 'Wallpaper:'; + + @override + String get warning => 'Warning!'; + + @override + String get weSentYouAnEmail => 'We sent you an email'; + + @override + String get whoCanPerformWhichAction => 'Who can perform which action'; + + @override + String get whoIsAllowedToJoinThisGroup => 'Who is allowed to join this group'; + + @override + String get whyDoYouWantToReportThis => 'Why do you want to report this?'; + + @override + String get wipeChatBackup => + 'Wipe your chat backup to create a new recovery key?'; + + @override + String get withTheseAddressesRecoveryDescription => + 'With these addresses you can recover your password.'; + + @override + String get writeAMessage => 'Write a message…'; + + @override + String get yes => 'Yes'; + + @override + String get you => 'You'; + + @override + String get youAreNoLongerParticipatingInThisChat => + 'You are no longer participating in this chat'; + + @override + String get youHaveBeenBannedFromThisChat => + 'You have been banned from this chat'; + + @override + String get yourPublicKey => 'Your public key'; + + @override + String get messageInfo => 'Message info'; + + @override + String get time => 'Time'; + + @override + String get messageType => 'Message Type'; + + @override + String get sender => 'Sender'; + + @override + String get openGallery => 'Open gallery'; + + @override + String get removeFromSpace => 'Remove from space'; + + @override + String get addToSpaceDescription => 'Select a space to add this chat to it.'; + + @override + String get start => 'Start'; + + @override + String get pleaseEnterRecoveryKeyDescription => + 'To unlock your old messages, please enter your recovery key that has been generated in a previous session. Your recovery key is NOT your password.'; + + @override + String get publish => 'Publish'; + + @override + String videoWithSize(String size) { + return 'Video ($size)'; + } + + @override + String get openChat => 'Open Chat'; + + @override + String get markAsRead => 'Mark as read'; + + @override + String get reportUser => 'Report user'; + + @override + String get dismiss => 'Dismiss'; + + @override + String reactedWith(String sender, String reaction) { + return '$sender reacted with $reaction'; + } + + @override + String get pinMessage => 'Pin to room'; + + @override + String get confirmEventUnpin => + 'Are you sure to permanently unpin the event?'; + + @override + String get emojis => 'Emojis'; + + @override + String get placeCall => 'Place call'; + + @override + String get voiceCall => 'Voice call'; + + @override + String get unsupportedAndroidVersion => 'Unsupported Android version'; + + @override + String get unsupportedAndroidVersionLong => + 'This feature requires a newer Android version. Please check for updates or Lineage OS support.'; + + @override + String get videoCallsBetaWarning => + 'Please note that video calls are currently in beta. They might not work as expected or work at all on all platforms.'; + + @override + String get experimentalVideoCalls => 'Experimental video calls'; + + @override + String get emailOrUsername => 'Email or username'; + + @override + String get indexedDbErrorTitle => 'Private mode issues'; + + @override + String get indexedDbErrorLong => + 'The message storage is unfortunately not enabled in private mode by default.\nPlease visit\n - about:config\n - set dom.indexedDB.privateBrowsing.enabled to true\nOtherwise, it is not possible to run Extera.'; + + @override + String switchToAccount(String number) { + return 'Switch to account $number'; + } + + @override + String get nextAccount => 'Next account'; + + @override + String get previousAccount => 'Previous account'; + + @override + String get addWidget => 'Add widget'; + + @override + String get widgetVideo => 'Video'; + + @override + String get widgetEtherpad => 'Text note'; + + @override + String get widgetJitsi => 'Jitsi Meet'; + + @override + String get widgetCustom => 'Custom'; + + @override + String get widgetName => 'Name'; + + @override + String get widgetUrlError => 'This is not a valid URL.'; + + @override + String get widgetNameError => 'Please provide a display name.'; + + @override + String get errorAddingWidget => 'Error adding the widget.'; + + @override + String get youRejectedTheInvitation => 'You rejected the invitation'; + + @override + String get youJoinedTheChat => 'You joined the chat'; + + @override + String get youAcceptedTheInvitation => '👍 You accepted the invitation'; + + @override + String youBannedUser(String user) { + return 'You banned $user'; + } + + @override + String youHaveWithdrawnTheInvitationFor(String user) { + return 'You have withdrawn the invitation for $user'; + } + + @override + String youInvitedToBy(String alias) { + return '📩 You have been invited via link to:\n$alias'; + } + + @override + String youInvitedBy(String user) { + return '📩 You have been invited by $user'; + } + + @override + String invitedBy(String user) { + return '📩 Invited by $user'; + } + + @override + String youInvitedUser(String user) { + return '📩 You invited $user'; + } + + @override + String youKicked(String user) { + return '👞 You kicked $user'; + } + + @override + String youKickedAndBanned(String user) { + return '🙅 You kicked and banned $user'; + } + + @override + String youUnbannedUser(String user) { + return 'You unbanned $user'; + } + + @override + String hasKnocked(String user) { + return '🚪 $user has knocked'; + } + + @override + String get usersMustKnock => 'Users must knock'; + + @override + String get noOneCanJoin => 'No one can join'; + + @override + String userWouldLikeToChangeTheChat(String user) { + return '$user would like to join the chat.'; + } + + @override + String get noPublicLinkHasBeenCreatedYet => + 'No public link has been created yet'; + + @override + String get knock => 'Knock'; + + @override + String get users => 'Users'; + + @override + String get unlockOldMessages => 'Unlock old messages'; + + @override + String get storeInSecureStorageDescription => + 'Store the recovery key in the secure storage of this device.'; + + @override + String get saveKeyManuallyDescription => + 'Save this key manually by triggering the system share dialog or clipboard.'; + + @override + String get storeInAndroidKeystore => 'Store in Android KeyStore'; + + @override + String get storeInAppleKeyChain => 'Store in Apple KeyChain'; + + @override + String get storeSecurlyOnThisDevice => 'Store securely on this device'; + + @override + String countFiles(int count) { + return '$count files'; + } + + @override + String get user => 'User'; + + @override + String get custom => 'Custom'; + + @override + String get foregroundServiceRunning => + 'This notification appears when the foreground service is running.'; + + @override + String get screenSharingTitle => 'screen sharing'; + + @override + String get screenSharingDetail => 'You are sharing your screen in Extera'; + + @override + String get callingPermissions => 'Calling permissions'; + + @override + String get callingAccount => 'Calling account'; + + @override + String get callingAccountDetails => + 'Allows Extera to use the native android dialer app.'; + + @override + String get appearOnTop => 'Appear on top'; + + @override + String get appearOnTopDetails => + 'Allows the app to appear on top (not needed if you already have Fluffychat setup as a calling account)'; + + @override + String get otherCallingPermissions => + 'Microphone, camera and other Extera permissions'; + + @override + String get whyIsThisMessageEncrypted => 'Why is this message unreadable?'; + + @override + String get noKeyForThisMessage => + 'This can happen if the message was sent before you have signed in to your account at this device.\n\nIt is also possible that the sender has blocked your device or something went wrong with the internet connection.\n\nAre you able to read the message on another session? Then you can transfer the message from it! Go to Settings > Devices and make sure that your devices have verified each other. When you open the room the next time and both sessions are in the foreground, the keys will be transmitted automatically.\n\nDo you not want to lose the keys when logging out or switching devices? Make sure that you have enabled the chat backup in the settings.'; + + @override + String get newGroup => 'New group'; + + @override + String get newSpace => 'New space'; + + @override + String get enterSpace => 'Enter space'; + + @override + String get enterRoom => 'Enter room'; + + @override + String get allSpaces => 'All spaces'; + + @override + String numChats(String number) { + return '$number chats'; + } + + @override + String get hideUnimportantStateEvents => 'Hide unimportant state events'; + + @override + String get hidePresences => 'Hide Status List?'; + + @override + String get doNotShowAgain => 'Do not show again'; + + @override + String wasDirectChatDisplayName(String oldDisplayName) { + return 'Empty chat (was $oldDisplayName)'; + } + + @override + String get newSpaceDescription => + 'Spaces allows you to consolidate your chats and build private or public communities.'; + + @override + String get encryptThisChat => 'Encrypt this chat'; + + @override + String get disableEncryptionWarning => + 'For security reasons you can not disable encryption in a chat, where it has been enabled before.'; + + @override + String get sorryThatsNotPossible => 'Sorry... that is not possible'; + + @override + String get deviceKeys => 'Device keys:'; + + @override + String get reopenChat => 'Reopen chat'; + + @override + String get noBackupWarning => + 'Warning! Without enabling chat backup, you will lose access to your encrypted messages. It is highly recommended to enable the chat backup first before logging out.'; + + @override + String get noOtherDevicesFound => 'No other devices found'; + + @override + String fileIsTooBigForServer(String max) { + return 'Unable to send! The server only supports attachments up to $max.'; + } + + @override + String fileHasBeenSavedAt(String path) { + return 'File has been saved at $path'; + } + + @override + String get jumpToLastReadMessage => 'Jump to last read message'; + + @override + String get readUpToHere => 'Read up to here'; + + @override + String get jump => 'Jump'; + + @override + String get openLinkInBrowser => 'Open link in browser'; + + @override + String get reportErrorDescription => + '😭 Oh no. Something went wrong. If you want, you can report this bug to the developers.'; + + @override + String get report => 'Report'; + + @override + String get signInWithPassword => 'Sign in with password'; + + @override + String get pleaseTryAgainLaterOrChooseDifferentServer => + 'Please try again later or choose a different server.'; + + @override + String signInWith(String provider) { + return 'Sign in with $provider'; + } + + @override + String get profileNotFound => + 'The user could not be found on the server. Maybe there is a connection problem or the user doesn\'t exist.'; + + @override + String get setTheme => 'Set theme:'; + + @override + String get setColorTheme => 'Set color theme:'; + + @override + String get invite => 'Invite'; + + @override + String get inviteGroupChat => '📨 Invite group chat'; + + @override + String get invitePrivateChat => '📨 Invite private chat'; + + @override + String get invalidInput => 'Invalid input!'; + + @override + String wrongPinEntered(int seconds) { + return 'Wrong pin entered! Try again in $seconds seconds...'; + } + + @override + String get pleaseEnterANumber => 'Please enter a number greater than 0'; + + @override + String get archiveRoomDescription => + 'The chat will be moved to the archive. Other users will be able to see that you have left the chat.'; + + @override + String get roomUpgradeDescription => + 'The chat will then be recreated with the new room version. All participants will be notified that they need to switch to the new chat. You can find out more about room versions at https://spec.matrix.org/latest/rooms/'; + + @override + String get removeDevicesDescription => + 'You will be logged out of this device and will no longer be able to receive messages.'; + + @override + String get banUserDescription => + 'The user will be banned from the chat and will not be able to enter the chat again until they are unbanned.'; + + @override + String get unbanUserDescription => + 'The user will be able to enter the chat again if they try.'; + + @override + String get kickUserDescription => + 'The user is kicked out of the chat but not banned. In public chats, the user can rejoin at any time.'; + + @override + String get makeAdminDescription => + 'Once you make this user admin, you may not be able to undo this as they will then have the same permissions as you.'; + + @override + String get pushNotificationsNotAvailable => + 'Push notifications not available'; + + @override + String get learnMore => 'Learn more'; + + @override + String get yourGlobalUserIdIs => 'Your global user-ID is: '; + + @override + String noUsersFoundWithQuery(String query) { + return 'Unfortunately no user could be found with \"$query\". Please check whether you made a typo.'; + } + + @override + String get knocking => 'Knocking'; + + @override + String chatCanBeDiscoveredViaSearchOnServer(String server) { + return 'Chat can be discovered via the search on $server'; + } + + @override + String get searchChatsRooms => 'Search for #chats, @users...'; + + @override + String get nothingFound => 'Nothing found...'; + + @override + String get groupName => 'Group name'; + + @override + String get createGroupAndInviteUsers => 'Create a group and invite users'; + + @override + String get groupCanBeFoundViaSearch => 'Group can be found via search'; + + @override + String get wrongRecoveryKey => + 'Sorry... this does not seem to be the correct recovery key.'; + + @override + String get startConversation => 'Start conversation'; + + @override + String get commandHint_sendraw => 'Send raw json'; + + @override + String get databaseMigrationTitle => 'Database is optimized'; + + @override + String get databaseMigrationBody => 'Please wait. This may take a moment.'; + + @override + String get leaveEmptyToClearStatus => 'Leave empty to clear your status.'; + + @override + String get select => 'Select'; + + @override + String get searchForUsers => 'Search for @users...'; + + @override + String get pleaseEnterYourCurrentPassword => + 'Please enter your current password'; + + @override + String get newPassword => 'New password'; + + @override + String get pleaseChooseAStrongPassword => 'Please choose a strong password'; + + @override + String get passwordsDoNotMatch => 'Passwords do not match'; + + @override + String get passwordIsWrong => 'Your entered password is wrong'; + + @override + String get publicLink => 'Public link'; + + @override + String get publicChatAddresses => 'Public chat addresses'; + + @override + String get createNewAddress => 'Create new address'; + + @override + String get joinSpace => 'Join space'; + + @override + String get publicSpaces => 'Public spaces'; + + @override + String get addChatOrSubSpace => 'Add chat or sub space'; + + @override + String get subspace => 'Subspace'; + + @override + String get decline => 'Decline'; + + @override + String get thisDevice => 'This device:'; + + @override + String get initAppError => 'An error occured while init the app'; + + @override + String get userRole => 'User role'; + + @override + String minimumPowerLevel(String level) { + return '$level is the minimum power level.'; + } + + @override + String searchIn(String chat) { + return 'Search in chat \"$chat\"...'; + } + + @override + String get searchMore => 'Search more...'; + + @override + String get gallery => 'Gallery'; + + @override + String get files => 'Files'; + + @override + String databaseBuildErrorBody(String url, String error) { + return 'Unable to build the SQlite database. The app tries to use the legacy database for now. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String sessionLostBody(String url, String error) { + return 'Your session is lost. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String restoreSessionBody(String url, String error) { + return 'The app now tries to restore your session from the backup. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String forwardMessageTo(String roomName) { + return 'Forward message to $roomName?'; + } + + @override + String get sendReadReceipts => 'Send read receipts'; + + @override + String get sendTypingNotificationsDescription => + 'Other participants in a chat can see when you are typing a new message.'; + + @override + String get sendReadReceiptsDescription => + 'Other participants in a chat can see when you have read a message.'; + + @override + String get formattedMessages => 'Formatted messages'; + + @override + String get formattedMessagesDescription => + 'Display rich message content like bold text using markdown.'; + + @override + String get verifyOtherUser => '🔐 Verify other user'; + + @override + String get verifyOtherUserDescription => + 'If you verify another user, you can be sure that you know who you are really writing to. 💪\n\nWhen you start a verification, you and the other user will see a popup in the app. There you will then see a series of emojis or numbers that you have to compare with each other.\n\nThe best way to do this is to meet up or start a video call. 👭'; + + @override + String get verifyOtherDevice => '🔐 Verify other device'; + + @override + String get verifyOtherDeviceDescription => + 'When you verify another device, those devices can exchange keys, increasing your overall security. 💪 When you start a verification, a popup will appear in the app on both devices. There you will then see a series of emojis or numbers that you have to compare with each other. It\'s best to have both devices handy before you start the verification. 🤳'; + + @override + String acceptedKeyVerification(String sender) { + return '$sender accepted key verification'; + } + + @override + String canceledKeyVerification(String sender) { + return '$sender canceled key verification'; + } + + @override + String completedKeyVerification(String sender) { + return '$sender completed key verification'; + } + + @override + String isReadyForKeyVerification(String sender) { + return '$sender is ready for key verification'; + } + + @override + String requestedKeyVerification(String sender) { + return '$sender requested key verification'; + } + + @override + String startedKeyVerification(String sender) { + return '$sender started key verification'; + } + + @override + String get transparent => 'Transparent'; + + @override + String get incomingMessages => 'Incoming messages'; + + @override + String get stickers => 'Stickers'; + + @override + String get discover => 'Discover'; + + @override + String get commandHint_ignore => 'Ignore the given matrix ID'; + + @override + String get commandHint_unignore => 'Unignore the given matrix ID'; + + @override + String unreadChatsInApp(String appname, String unread) { + return '$appname: $unread unread chats'; + } + + @override + String get noDatabaseEncryption => + 'Database encryption is not supported on this platform'; + + @override + String thereAreCountUsersBlocked(Object count) { + return 'Right now there are $count users blocked.'; + } + + @override + String get restricted => 'Restricted'; + + @override + String get knockRestricted => 'Knock restricted'; + + @override + String goToSpace(Object space) { + return 'Go to space: $space'; + } + + @override + String get markAsUnread => 'Mark as unread'; + + @override + String userLevel(int level) { + return '$level - User'; + } + + @override + String moderatorLevel(int level) { + return '$level - Moderator'; + } + + @override + String adminLevel(int level) { + return '$level - Admin'; + } + + @override + String get changeGeneralChatSettings => 'Change general chat settings'; + + @override + String get inviteOtherUsers => 'Invite other users to this chat'; + + @override + String get changeTheChatPermissions => 'Change the chat permissions'; + + @override + String get changeTheVisibilityOfChatHistory => + 'Change the visibility of the chat history'; + + @override + String get changeTheCanonicalRoomAlias => + 'Change the main public chat address'; + + @override + String get sendRoomNotifications => 'Send a @room notifications'; + + @override + String get changeTheDescriptionOfTheGroup => + 'Change the description of the chat'; + + @override + String get chatPermissionsDescription => + 'Define which power level is necessary for certain actions in this chat. The power levels 0, 50 and 100 are usually representing users, moderators and admins, but any gradation is possible.'; + + @override + String updateInstalled(String version) { + return '🎉 Update $version installed!'; + } + + @override + String get changelog => 'Changelog'; + + @override + String get sendCanceled => 'Sending canceled'; + + @override + String get loginWithMatrixId => 'Login with Matrix-ID'; + + @override + String get discoverHomeservers => 'Discover homeservers'; + + @override + String get whatIsAHomeserver => 'What is a homeserver?'; + + @override + String get homeserverDescription => + 'All your data is stored on the homeserver, just like an email provider. You can choose which homeserver you want to use, while you can still communicate with everyone. Learn more at at https://matrix.org.'; + + @override + String get doesNotSeemToBeAValidHomeserver => + 'Doesn\'t seem to be a compatible homeserver. Wrong URL?'; + + @override + String get calculatingFileSize => 'Calculating file size...'; + + @override + String get prepareSendingAttachment => 'Prepare sending attachment...'; + + @override + String get sendingAttachment => 'Sending attachment...'; + + @override + String get generatingVideoThumbnail => 'Generating video thumbnail...'; + + @override + String get compressVideo => 'Compressing video...'; + + @override + String sendingAttachmentCountOfCount(int index, int length) { + return 'Sending attachment $index of $length...'; + } + + @override + String serverLimitReached(int seconds) { + return 'Server limit reached! Waiting $seconds seconds...'; + } + + @override + String get oneOfYourDevicesIsNotVerified => + 'One of your devices is not verified'; + + @override + String get noticeChatBackupDeviceVerification => + 'Note: When you connect all your devices to the chat backup, they are automatically verified.'; + + @override + String get continueText => 'Continue'; + + @override + String get welcomeText => + 'Hey Hey 👋 This is Extera. You can sign in to any homeserver, which is compatible with https://matrix.org. And then chat with anyone. It\'s a huge decentralized messaging network!'; + + @override + String get blur => 'Blur:'; + + @override + String get opacity => 'Opacity:'; + + @override + String get setWallpaper => 'Set wallpaper'; + + @override + String get manageAccount => 'Manage account'; + + @override + String get noContactInformationProvided => + 'Server does not provide any valid contact information'; + + @override + String get contactServerAdmin => 'Contact server admin'; + + @override + String get contactServerSecurity => 'Contact server security'; + + @override + String get supportPage => 'Support page'; + + @override + String get serverInformation => 'Server information:'; + + @override + String get name => 'Name'; + + @override + String get version => 'Version'; + + @override + String get website => 'Website'; + + @override + String get compress => 'Compress'; + + @override + String get boldText => 'Bold text'; + + @override + String get italicText => 'Italic text'; + + @override + String get strikeThrough => 'Strikethrough'; + + @override + String get pleaseFillOut => 'Please fill out'; + + @override + String get invalidUrl => 'Invalid url'; + + @override + String get addLink => 'Add link'; + + @override + String get unableToJoinChat => + 'Unable to join chat. Maybe the other party has already closed the conversation.'; + + @override + String get previous => 'Previous'; + + @override + String get otherPartyNotLoggedIn => + 'The other party is currently not logged in and therefore cannot receive messages!'; + + @override + String appWantsToUseForLogin(String server) { + return 'Use \'$server\' to log in'; + } + + @override + String get appWantsToUseForLoginDescription => + 'You hereby allow the app and website to share information about you.'; + + @override + String get open => 'Open'; + + @override + String get waitingForServer => 'Waiting for server...'; + + @override + String get appIntroduction => + 'Extera lets you chat with your friends across different messengers. Learn more at https://matrix.org or just tap *Continue*.'; + + @override + String get newChatRequest => '📩 New chat request'; + + @override + String get contentNotificationSettings => 'Content notification settings'; + + @override + String get generalNotificationSettings => 'General notification settings'; + + @override + String get roomNotificationSettings => 'Room notification settings'; + + @override + String get userSpecificNotificationSettings => + 'User specific notification settings'; + + @override + String get otherNotificationSettings => 'Other notification settings'; + + @override + String get notificationRuleContainsUserName => 'Contains User Name'; + + @override + String get notificationRuleContainsUserNameDescription => + 'Notifies the user when a message contains their username.'; + + @override + String get notificationRuleMaster => 'Mute all notifications'; + + @override + String get notificationRuleMasterDescription => + 'Overrides all other rules and disables all notifications.'; + + @override + String get notificationRuleSuppressNotices => 'Suppress Automated Messages'; + + @override + String get notificationRuleSuppressNoticesDescription => + 'Suppresses notifications from automated clients like bots.'; + + @override + String get notificationRuleInviteForMe => 'Invite for Me'; + + @override + String get notificationRuleInviteForMeDescription => + 'Notifies the user when they are invited to a room.'; + + @override + String get notificationRuleMemberEvent => 'Member Event'; + + @override + String get notificationRuleMemberEventDescription => + 'Suppresses notifications for membership events.'; + + @override + String get notificationRuleIsUserMention => 'User Mention'; + + @override + String get notificationRuleIsUserMentionDescription => + 'Notifies the user when they are directly mentioned in a message.'; + + @override + String get notificationRuleContainsDisplayName => 'Contains Display Name'; + + @override + String get notificationRuleContainsDisplayNameDescription => + 'Notifies the user when a message contains their display name.'; + + @override + String get notificationRuleIsRoomMention => 'Room Mention'; + + @override + String get notificationRuleIsRoomMentionDescription => + 'Notifies the user when there is a room mention.'; + + @override + String get notificationRuleRoomnotif => 'Room Notification'; + + @override + String get notificationRuleRoomnotifDescription => + 'Notifies the user when a message contains \'@room\'.'; + + @override + String get notificationRuleTombstone => 'Tombstone'; + + @override + String get notificationRuleTombstoneDescription => + 'Notifies the user about room deactivation messages.'; + + @override + String get notificationRuleReaction => 'Reaction'; + + @override + String get notificationRuleReactionDescription => + 'Suppresses notifications for reactions.'; + + @override + String get notificationRuleRoomServerAcl => 'Room Server ACL'; + + @override + String get notificationRuleRoomServerAclDescription => + 'Suppresses notifications for room server access control lists (ACL).'; + + @override + String get notificationRuleSuppressEdits => 'Suppress Edits'; + + @override + String get notificationRuleSuppressEditsDescription => + 'Suppresses notifications for edited messages.'; + + @override + String get notificationRuleCall => 'Call'; + + @override + String get notificationRuleCallDescription => + 'Notifies the user about calls.'; + + @override + String get notificationRuleEncryptedRoomOneToOne => + 'Encrypted Room One-to-One'; + + @override + String get notificationRuleEncryptedRoomOneToOneDescription => + 'Notifies the user about messages in encrypted one-to-one rooms.'; + + @override + String get notificationRuleRoomOneToOne => 'Room One-to-One'; + + @override + String get notificationRuleRoomOneToOneDescription => + 'Notifies the user about messages in one-to-one rooms.'; + + @override + String get notificationRuleMessage => 'Message'; + + @override + String get notificationRuleMessageDescription => + 'Notifies the user about general messages.'; + + @override + String get notificationRuleEncrypted => 'Encrypted'; + + @override + String get notificationRuleEncryptedDescription => + 'Notifies the user about messages in encrypted rooms.'; + + @override + String get notificationRuleJitsi => 'Jitsi'; + + @override + String get notificationRuleJitsiDescription => + 'Notifies the user about Jitsi widget events.'; + + @override + String get notificationRuleServerAcl => 'Suppress Server ACL Events'; + + @override + String get notificationRuleServerAclDescription => + 'Suppresses notifications for Server ACL events.'; + + @override + String unknownPushRule(String rule) { + return 'Unknown push rule \'$rule\''; + } + + @override + String get deletePushRuleCanNotBeUndone => + 'If you delete this notification setting, this can not be undone.'; + + @override + String get more => 'More'; + + @override + String get shareKeysWith => 'Share keys with...'; + + @override + String get shareKeysWithDescription => + 'Which devices should be trusted so that they can read along your messages in encrypted chats?'; + + @override + String get allDevices => 'All devices'; + + @override + String get crossVerifiedDevicesIfEnabled => + 'Cross verified devices if enabled'; + + @override + String get crossVerifiedDevices => 'Cross verified devices'; + + @override + String get verifiedDevicesOnly => 'Verified devices only'; + + @override + String get takeAPhoto => 'Take a photo'; + + @override + String get recordAVideo => 'Record a video'; + + @override + String get optionalMessage => '(Optional) message...'; + + @override + String get notSupportedOnThisDevice => 'Not supported on this device'; + + @override + String get enterNewChat => 'Enter new chat'; + + @override + String get approve => 'Approve'; + + @override + String get youHaveKnocked => 'You have knocked'; + + @override + String get pleaseWaitUntilInvited => + 'Please wait now, until someone from the room invites you.'; +} diff --git a/lib/generated/l10n/l10n_bn.dart b/lib/generated/l10n/l10n_bn.dart new file mode 100644 index 0000000..db1acde --- /dev/null +++ b/lib/generated/l10n/l10n_bn.dart @@ -0,0 +1,2745 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'l10n.dart'; + +// ignore_for_file: type=lint + +/// The translations for Bengali Bangla (`bn`). +class L10nBn extends L10n { + L10nBn([String locale = 'bn']) : super(locale); + + @override + String get noSendPermission => 'You can\'t send messages here'; + + @override + String get alwaysUse24HourFormat => 'false'; + + @override + String get repeatPassword => 'Repeat password'; + + @override + String get notAnImage => 'Not an image file.'; + + @override + String get setCustomPermissionLevel => 'Set custom permission level'; + + @override + String get setPermissionsLevelDescription => + 'Please choose a predefined role below or enter a custom permission level between 0 and 100.'; + + @override + String get ignoreUser => 'Ignore user'; + + @override + String get normalUser => 'Normal user'; + + @override + String get remove => 'Remove'; + + @override + String get importNow => 'Import now'; + + @override + String get importEmojis => 'Import Emojis'; + + @override + String get importFromZipFile => 'Import from .zip file'; + + @override + String get exportEmotePack => 'Export Emote pack as .zip'; + + @override + String get replace => 'Replace'; + + @override + String get about => 'সম্পর্কে'; + + @override + String aboutHomeserver(String homeserver) { + return 'About $homeserver'; + } + + @override + String get accept => 'স্বীকার করি'; + + @override + String acceptedTheInvitation(String username) { + return '$username আমন্ত্রণ গ্রহণ করেছে'; + } + + @override + String get account => 'অ্যাকাউন্ট'; + + @override + String activatedEndToEndEncryption(String username) { + return '🔐 $username activated end to end encryption'; + } + + @override + String get addEmail => 'Add email'; + + @override + String get confirmMatrixId => + 'Please confirm your Matrix ID in order to delete your account.'; + + @override + String supposedMxid(String mxid) { + return 'This should be $mxid'; + } + + @override + String get addChatDescription => 'Add a chat description...'; + + @override + String get addToSpace => 'Add to space'; + + @override + String get admin => 'Admin'; + + @override + String get alias => 'alias'; + + @override + String get all => 'All'; + + @override + String get allChats => 'All chats'; + + @override + String get commandHint_roomupgrade => + 'Upgrade this room to the given room version'; + + @override + String get commandHint_googly => 'Send some googly eyes'; + + @override + String get commandHint_cuddle => 'Send a cuddle'; + + @override + String get commandHint_hug => 'Send a hug'; + + @override + String googlyEyesContent(String senderName) { + return '$senderName sends you googly eyes'; + } + + @override + String cuddleContent(String senderName) { + return '$senderName cuddles you'; + } + + @override + String hugContent(String senderName) { + return '$senderName hugs you'; + } + + @override + String answeredTheCall(String senderName) { + return '$senderName answered the call'; + } + + @override + String get anyoneCanJoin => 'Anyone can join'; + + @override + String get appLock => 'App lock'; + + @override + String get appLockDescription => + 'Lock the app when not using with a pin code'; + + @override + String get archive => 'Archive'; + + @override + String get areGuestsAllowedToJoin => 'Are guest users allowed to join'; + + @override + String get areYouSure => 'Are you sure?'; + + @override + String get areYouSureYouWantToLogout => 'Are you sure you want to log out?'; + + @override + String get askSSSSSign => + 'To be able to sign the other person, please enter your secure store passphrase or recovery key.'; + + @override + String askVerificationRequest(String username) { + return 'Accept this verification request from $username?'; + } + + @override + String get autoplayImages => + 'Automatically play animated stickers and emotes'; + + @override + String badServerLoginTypesException(String serverVersions, + String supportedVersions, Object suportedVersions) { + return 'The homeserver supports the login types:\n$serverVersions\nBut this app supports only:\n$supportedVersions'; + } + + @override + String get sendTypingNotifications => 'Send typing notifications'; + + @override + String get swipeRightToLeftToReply => 'Swipe right to left to reply'; + + @override + String get sendOnEnter => 'Send on enter'; + + @override + String badServerVersionsException(String serverVersions, + String supportedVersions, Object serverVerions, Object suportedVersions) { + return 'The homeserver supports the Spec versions:\n$serverVersions\nBut this app supports only $supportedVersions'; + } + + @override + String countChatsAndCountParticipants(int chats, int participants) { + return '$chats chats and $participants participants'; + } + + @override + String get noMoreChatsFound => 'No more chats found...'; + + @override + String get noChatsFoundHere => + 'No chats found here yet. Start a new chat with someone by using the button below. ⤵️'; + + @override + String get joinedChats => 'Joined chats'; + + @override + String get unread => 'Unread'; + + @override + String get space => 'Space'; + + @override + String get spaces => 'Spaces'; + + @override + String get banFromChat => 'Ban from chat'; + + @override + String get banned => 'Banned'; + + @override + String bannedUser(String username, String targetName) { + return '$username banned $targetName'; + } + + @override + String get blockDevice => 'Block Device'; + + @override + String get blocked => 'Blocked'; + + @override + String get botMessages => 'Bot messages'; + + @override + String get cancel => 'Cancel'; + + @override + String cantOpenUri(String uri) { + return 'Can\'t open the URI $uri'; + } + + @override + String get changeDeviceName => 'Change device name'; + + @override + String changedTheChatAvatar(String username) { + return '$username changed the chat avatar'; + } + + @override + String changedTheChatDescriptionTo(String username, String description) { + return '$username changed the chat description to: \'$description\''; + } + + @override + String changedTheChatNameTo(String username, String chatname) { + return '$username changed the chat name to: \'$chatname\''; + } + + @override + String changedTheChatPermissions(String username) { + return '$username changed the chat permissions'; + } + + @override + String changedTheDisplaynameTo(String username, String displayname) { + return '$username changed their displayname to: \'$displayname\''; + } + + @override + String changedTheGuestAccessRules(String username) { + return '$username changed the guest access rules'; + } + + @override + String changedTheGuestAccessRulesTo(String username, String rules) { + return '$username changed the guest access rules to: $rules'; + } + + @override + String changedTheHistoryVisibility(String username) { + return '$username changed the history visibility'; + } + + @override + String changedTheHistoryVisibilityTo(String username, String rules) { + return '$username changed the history visibility to: $rules'; + } + + @override + String changedTheJoinRules(String username) { + return '$username changed the join rules'; + } + + @override + String changedTheJoinRulesTo(String username, String joinRules) { + return '$username changed the join rules to: $joinRules'; + } + + @override + String changedTheProfileAvatar(String username) { + return '$username changed their avatar'; + } + + @override + String changedTheRoomAliases(String username) { + return '$username changed the room aliases'; + } + + @override + String changedTheRoomInvitationLink(String username) { + return '$username changed the invitation link'; + } + + @override + String get changePassword => 'Change password'; + + @override + String get changeTheHomeserver => 'Change the homeserver'; + + @override + String get changeTheme => 'Change your style'; + + @override + String get changeTheNameOfTheGroup => 'Change the name of the group'; + + @override + String get changeYourAvatar => 'Change your avatar'; + + @override + String get channelCorruptedDecryptError => + 'The encryption has been corrupted'; + + @override + String get chat => 'Chat'; + + @override + String get yourChatBackupHasBeenSetUp => 'Your chat backup has been set up.'; + + @override + String get chatBackup => 'Chat backup'; + + @override + String get chatBackupDescription => + 'Your old messages are secured with a recovery key. Please make sure you don\'t lose it.'; + + @override + String get chatDetails => 'Chat details'; + + @override + String get chatHasBeenAddedToThisSpace => 'Chat has been added to this space'; + + @override + String get chats => 'Chats'; + + @override + String get chooseAStrongPassword => 'Choose a strong password'; + + @override + String get clearArchive => 'Clear archive'; + + @override + String get close => 'Close'; + + @override + String get commandHint_markasdm => + 'Mark as direct message room for the giving Matrix ID'; + + @override + String get commandHint_markasgroup => 'Mark as group'; + + @override + String get commandHint_ban => 'Ban the given user from this room'; + + @override + String get commandHint_clearcache => 'Clear cache'; + + @override + String get commandHint_create => + 'Create an empty group chat\nUse --no-encryption to disable encryption'; + + @override + String get commandHint_discardsession => 'Discard session'; + + @override + String get commandHint_dm => + 'Start a direct chat\nUse --no-encryption to disable encryption'; + + @override + String get commandHint_html => 'Send HTML-formatted text'; + + @override + String get commandHint_invite => 'Invite the given user to this room'; + + @override + String get commandHint_join => 'Join the given room'; + + @override + String get commandHint_kick => 'Remove the given user from this room'; + + @override + String get commandHint_leave => 'Leave this room'; + + @override + String get commandHint_me => 'Describe yourself'; + + @override + String get commandHint_myroomavatar => + 'Set your picture for this room (by mxc-uri)'; + + @override + String get commandHint_myroomnick => 'Set your display name for this room'; + + @override + String get commandHint_op => + 'Set the given user\'s power level (default: 50)'; + + @override + String get commandHint_plain => 'Send unformatted text'; + + @override + String get commandHint_react => 'Send reply as a reaction'; + + @override + String get commandHint_send => 'Send text'; + + @override + String get commandHint_unban => 'Unban the given user from this room'; + + @override + String get commandInvalid => 'Command invalid'; + + @override + String commandMissing(String command) { + return '$command is not a command.'; + } + + @override + String get compareEmojiMatch => 'Please compare the emojis'; + + @override + String get compareNumbersMatch => 'Please compare the numbers'; + + @override + String get configureChat => 'Configure chat'; + + @override + String get confirm => 'Confirm'; + + @override + String get connect => 'Connect'; + + @override + String get contactHasBeenInvitedToTheGroup => + 'Contact has been invited to the group'; + + @override + String get containsDisplayName => 'Contains display name'; + + @override + String get containsUserName => 'Contains username'; + + @override + String get contentHasBeenReported => + 'The content has been reported to the server admins'; + + @override + String get copiedToClipboard => 'Copied to clipboard'; + + @override + String get copy => 'Copy'; + + @override + String get copyToClipboard => 'Copy to clipboard'; + + @override + String couldNotDecryptMessage(String error) { + return 'Could not decrypt message: $error'; + } + + @override + String countParticipants(int count) { + return '$count participants'; + } + + @override + String get create => 'Create'; + + @override + String createdTheChat(String username) { + return '💬 $username created the chat'; + } + + @override + String get createGroup => 'Create group'; + + @override + String get createNewSpace => 'New space'; + + @override + String get currentlyActive => 'Currently active'; + + @override + String get darkTheme => 'Dark'; + + @override + String dateAndTimeOfDay(String date, String timeOfDay) { + return '$date, $timeOfDay'; + } + + @override + String dateWithoutYear(String month, String day) { + return '$month-$day'; + } + + @override + String dateWithYear(String year, String month, String day) { + return '$year-$month-$day'; + } + + @override + String get deactivateAccountWarning => + 'This will deactivate your user account. This can not be undone! Are you sure?'; + + @override + String get defaultPermissionLevel => 'Default permission level for new users'; + + @override + String get delete => 'Delete'; + + @override + String get deleteAccount => 'Delete account'; + + @override + String get deleteMessage => 'Delete message'; + + @override + String get device => 'Device'; + + @override + String get deviceId => 'Device ID'; + + @override + String get devices => 'Devices'; + + @override + String get directChats => 'Direct Chats'; + + @override + String get allRooms => 'All Group Chats'; + + @override + String get displaynameHasBeenChanged => 'Displayname has been changed'; + + @override + String get downloadFile => 'Download file'; + + @override + String get edit => 'Edit'; + + @override + String get editBlockedServers => 'Edit blocked servers'; + + @override + String get chatPermissions => 'Chat permissions'; + + @override + String get editDisplayname => 'Edit displayname'; + + @override + String get editRoomAliases => 'Edit room aliases'; + + @override + String get editRoomAvatar => 'Edit room avatar'; + + @override + String get emoteExists => 'Emote already exists!'; + + @override + String get emoteInvalid => 'Invalid emote shortcode!'; + + @override + String get emoteKeyboardNoRecents => + 'Recently-used emotes will appear here...'; + + @override + String get emotePacks => 'Emote packs for room'; + + @override + String get emoteSettings => 'Emote Settings'; + + @override + String get globalChatId => 'Global chat ID'; + + @override + String get accessAndVisibility => 'Access and visibility'; + + @override + String get accessAndVisibilityDescription => + 'Who is allowed to join this chat and how the chat can be discovered.'; + + @override + String get calls => 'Calls'; + + @override + String get customEmojisAndStickers => 'Custom emojis and stickers'; + + @override + String get customEmojisAndStickersBody => + 'Add or share custom emojis or stickers which can be used in any chat.'; + + @override + String get emoteShortcode => 'Emote shortcode'; + + @override + String get emoteWarnNeedToPick => + 'You need to pick an emote shortcode and an image!'; + + @override + String get emptyChat => 'Empty chat'; + + @override + String get enableEmotesGlobally => 'Enable emote pack globally'; + + @override + String get enableEncryption => 'Enable encryption'; + + @override + String get enableEncryptionWarning => + 'You won\'t be able to disable the encryption anymore. Are you sure?'; + + @override + String get encrypted => 'Encrypted'; + + @override + String get encryption => 'Encryption'; + + @override + String get encryptionNotEnabled => 'Encryption is not enabled'; + + @override + String endedTheCall(String senderName) { + return '$senderName ended the call'; + } + + @override + String get enterAnEmailAddress => 'Enter an email address'; + + @override + String get homeserver => 'Homeserver'; + + @override + String get enterYourHomeserver => 'Enter your homeserver'; + + @override + String errorObtainingLocation(String error) { + return 'Error obtaining location: $error'; + } + + @override + String get everythingReady => 'Everything ready!'; + + @override + String get extremeOffensive => 'Extremely offensive'; + + @override + String get fileName => 'File name'; + + @override + String get fluffychat => 'Extera'; + + @override + String get fontSize => 'Font size'; + + @override + String get forward => 'Forward'; + + @override + String get fromJoining => 'From joining'; + + @override + String get fromTheInvitation => 'From the invitation'; + + @override + String get goToTheNewRoom => 'Go to the new room'; + + @override + String get group => 'Group'; + + @override + String get chatDescription => 'Chat description'; + + @override + String get chatDescriptionHasBeenChanged => 'Chat description changed'; + + @override + String get groupIsPublic => 'Group is public'; + + @override + String get groups => 'Groups'; + + @override + String groupWith(String displayname) { + return 'Group with $displayname'; + } + + @override + String get guestsAreForbidden => 'Guests are forbidden'; + + @override + String get guestsCanJoin => 'Guests can join'; + + @override + String hasWithdrawnTheInvitationFor(String username, String targetName) { + return '$username has withdrawn the invitation for $targetName'; + } + + @override + String get help => 'Help'; + + @override + String get hideRedactedEvents => 'Hide redacted events'; + + @override + String get hideRedactedMessages => 'Hide redacted messages'; + + @override + String get hideRedactedMessagesBody => + 'If someone redacts a message, this message won\'t be visible in the chat anymore.'; + + @override + String get hideInvalidOrUnknownMessageFormats => + 'Hide invalid or unknown message formats'; + + @override + String get howOffensiveIsThisContent => 'How offensive is this content?'; + + @override + String get id => 'ID'; + + @override + String get identity => 'Identity'; + + @override + String get block => 'Block'; + + @override + String get blockedUsers => 'Blocked users'; + + @override + String get blockListDescription => + 'You can block users who are disturbing you. You won\'t be able to receive any messages or room invites from the users on your personal block list.'; + + @override + String get blockUsername => 'Ignore username'; + + @override + String get iHaveClickedOnLink => 'I have clicked on the link'; + + @override + String get incorrectPassphraseOrKey => 'Incorrect passphrase or recovery key'; + + @override + String get inoffensive => 'Inoffensive'; + + @override + String get inviteContact => 'Invite contact'; + + @override + String inviteContactToGroupQuestion(Object contact, Object groupName) { + return 'Do you want to invite $contact to the chat \"$groupName\"?'; + } + + @override + String inviteContactToGroup(String groupName) { + return 'Invite contact to $groupName'; + } + + @override + String get noChatDescriptionYet => 'No chat description created yet.'; + + @override + String get tryAgain => 'Try again'; + + @override + String get invalidServerName => 'Invalid server name'; + + @override + String get invited => 'Invited'; + + @override + String get redactMessageDescription => + 'The message will be redacted for all participants in this conversation. This cannot be undone.'; + + @override + String get optionalRedactReason => + '(Optional) Reason for redacting this message...'; + + @override + String invitedUser(String username, String targetName) { + return '📩 $username invited $targetName'; + } + + @override + String get invitedUsersOnly => 'Invited users only'; + + @override + String get inviteForMe => 'Invite for me'; + + @override + String inviteText(String username, String link) { + return '$username invited you to Extera.\n1. Visit fluffychat.im and install the app \n2. Sign up or sign in \n3. Open the invite link: \n $link'; + } + + @override + String get isTyping => 'is typing…'; + + @override + String joinedTheChat(String username) { + return '👋 $username joined the chat'; + } + + @override + String get joinRoom => 'Join room'; + + @override + String kicked(String username, String targetName) { + return '👞 $username kicked $targetName'; + } + + @override + String kickedAndBanned(String username, String targetName) { + return '🙅 $username kicked and banned $targetName'; + } + + @override + String get kickFromChat => 'Kick from chat'; + + @override + String lastActiveAgo(String localizedTimeShort) { + return 'Last active: $localizedTimeShort'; + } + + @override + String get leave => 'Leave'; + + @override + String get leftTheChat => 'Left the chat'; + + @override + String get license => 'License'; + + @override + String get lightTheme => 'Light'; + + @override + String loadCountMoreParticipants(int count) { + return 'Load $count more participants'; + } + + @override + String get dehydrate => 'Export session and wipe device'; + + @override + String get dehydrateWarning => + 'This action cannot be undone. Ensure you safely store the backup file.'; + + @override + String get dehydrateTor => 'TOR Users: Export session'; + + @override + String get dehydrateTorLong => + 'For TOR users, it is recommended to export the session before closing the window.'; + + @override + String get hydrateTor => 'TOR Users: Import session export'; + + @override + String get hydrateTorLong => + 'Did you export your session last time on TOR? Quickly import it and continue chatting.'; + + @override + String get hydrate => 'Restore from backup file'; + + @override + String get loadingPleaseWait => 'Loading… Please wait.'; + + @override + String get loadMore => 'Load more…'; + + @override + String get locationDisabledNotice => + 'Location services are disabled. Please enable them to be able to share your location.'; + + @override + String get locationPermissionDeniedNotice => + 'Location permission denied. Please grant them to be able to share your location.'; + + @override + String get login => 'Login'; + + @override + String logInTo(String homeserver) { + return 'Log in to $homeserver'; + } + + @override + String get logout => 'Logout'; + + @override + String get memberChanges => 'Member changes'; + + @override + String get mention => 'Mention'; + + @override + String get messages => 'Messages'; + + @override + String get messagesStyle => 'Messages:'; + + @override + String get moderator => 'Moderator'; + + @override + String get muteChat => 'Mute chat'; + + @override + String get needPantalaimonWarning => + 'Please be aware that you need Pantalaimon to use end-to-end encryption for now.'; + + @override + String get newChat => 'New chat'; + + @override + String get newMessageInFluffyChat => '💬 New message in Extera'; + + @override + String get newVerificationRequest => 'New verification request!'; + + @override + String get next => 'Next'; + + @override + String get no => 'No'; + + @override + String get noConnectionToTheServer => 'No connection to the server'; + + @override + String get noEmotesFound => 'No emotes found. 😕'; + + @override + String get noEncryptionForPublicRooms => + 'You can only activate encryption as soon as the room is no longer publicly accessible.'; + + @override + String get noGoogleServicesWarning => + 'Firebase Cloud Messaging doesn\'t appear to be available on your device. To still receive push notifications, we recommend installing ntfy. With ntfy or another Unified Push provider you can receive push notifications in a data secure way. You can download ntfy from the PlayStore or from F-Droid.'; + + @override + String noMatrixServer(String server1, String server2) { + return '$server1 is no matrix server, use $server2 instead?'; + } + + @override + String get shareInviteLink => 'Share invite link'; + + @override + String get scanQrCode => 'Scan QR code'; + + @override + String get none => 'None'; + + @override + String get noPasswordRecoveryDescription => + 'You have not added a way to recover your password yet.'; + + @override + String get noPermission => 'No permission'; + + @override + String get noRoomsFound => 'No rooms found…'; + + @override + String get notifications => 'Notifications'; + + @override + String get notificationsEnabledForThisAccount => + 'Notifications enabled for this account'; + + @override + String numUsersTyping(int count) { + return '$count users are typing…'; + } + + @override + String get obtainingLocation => 'Obtaining location…'; + + @override + String get offensive => 'Offensive'; + + @override + String get offline => 'Offline'; + + @override + String get ok => 'Ok'; + + @override + String get online => 'Online'; + + @override + String get onlineKeyBackupEnabled => 'Online Key Backup is enabled'; + + @override + String get oopsPushError => + 'Oops! Unfortunately, an error occurred when setting up the push notifications.'; + + @override + String get oopsSomethingWentWrong => 'Oops, something went wrong…'; + + @override + String get openAppToReadMessages => 'Open app to read messages'; + + @override + String get openCamera => 'Open camera'; + + @override + String get openVideoCamera => 'Open camera for a video'; + + @override + String get oneClientLoggedOut => 'One of your clients has been logged out'; + + @override + String get addAccount => 'Add account'; + + @override + String get editBundlesForAccount => 'Edit bundles for this account'; + + @override + String get addToBundle => 'Add to bundle'; + + @override + String get removeFromBundle => 'Remove from this bundle'; + + @override + String get bundleName => 'Bundle name'; + + @override + String get enableMultiAccounts => + '(BETA) Enable multi accounts on this device'; + + @override + String get openInMaps => 'Open in maps'; + + @override + String get link => 'Link'; + + @override + String get serverRequiresEmail => + 'This server needs to validate your email address for registration.'; + + @override + String get or => 'Or'; + + @override + String get participant => 'Participant'; + + @override + String get passphraseOrKey => 'passphrase or recovery key'; + + @override + String get password => 'Password'; + + @override + String get passwordForgotten => 'Password forgotten'; + + @override + String get passwordHasBeenChanged => 'Password has been changed'; + + @override + String get hideMemberChangesInPublicChats => + 'Hide member changes in public chats'; + + @override + String get hideMemberChangesInPublicChatsBody => + 'Do not show in the chat timeline if someone joins or leaves a public chat to improve readability.'; + + @override + String get overview => 'Overview'; + + @override + String get notifyMeFor => 'Notify me for'; + + @override + String get passwordRecoverySettings => 'Password recovery settings'; + + @override + String get passwordRecovery => 'Password recovery'; + + @override + String get people => 'People'; + + @override + String get pickImage => 'Pick an image'; + + @override + String get pin => 'Pin'; + + @override + String play(String fileName) { + return 'Play $fileName'; + } + + @override + String get pleaseChoose => 'Please choose'; + + @override + String get pleaseChooseAPasscode => 'Please choose a pass code'; + + @override + String get pleaseClickOnLink => + 'Please click on the link in the email and then proceed.'; + + @override + String get pleaseEnter4Digits => + 'Please enter 4 digits or leave empty to disable app lock.'; + + @override + String get pleaseEnterRecoveryKey => 'Please enter your recovery key:'; + + @override + String get pleaseEnterYourPassword => 'Please enter your password'; + + @override + String get pleaseEnterYourPin => 'Please enter your pin'; + + @override + String get pleaseEnterYourUsername => 'Please enter your username'; + + @override + String get pleaseFollowInstructionsOnWeb => + 'Please follow the instructions on the website and tap on next.'; + + @override + String get privacy => 'Privacy'; + + @override + String get publicRooms => 'Public Rooms'; + + @override + String get pushRules => 'Push rules'; + + @override + String get reason => 'Reason'; + + @override + String get recording => 'Recording'; + + @override + String redactedBy(String username) { + return 'Redacted by $username'; + } + + @override + String get directChat => 'Direct chat'; + + @override + String redactedByBecause(String username, String reason) { + return 'Redacted by $username because: \"$reason\"'; + } + + @override + String redactedAnEvent(String username) { + return '$username redacted an event'; + } + + @override + String get redactMessage => 'Redact message'; + + @override + String get register => 'Register'; + + @override + String get reject => 'Reject'; + + @override + String rejectedTheInvitation(String username) { + return '$username rejected the invitation'; + } + + @override + String get rejoin => 'Rejoin'; + + @override + String get removeAllOtherDevices => 'Remove all other devices'; + + @override + String removedBy(String username) { + return 'Removed by $username'; + } + + @override + String get removeDevice => 'Remove device'; + + @override + String get unbanFromChat => 'Unban from chat'; + + @override + String get removeYourAvatar => 'Remove your avatar'; + + @override + String get replaceRoomWithNewerVersion => 'Replace room with newer version'; + + @override + String get reply => 'Reply'; + + @override + String get reportMessage => 'Report message'; + + @override + String get translateMessage => 'Translate message'; + + @override + String get translatedMessage => 'Translated message'; + + @override + String get errorTranslatingMessage => + 'An error has occured while translating the message.'; + + @override + String get recoverMessage => 'Recover message'; + + @override + String get recoveredMessage => 'Recovered message'; + + @override + String get errorRecoveringMessage => + 'An error has occured while recovering the message.'; + + @override + String get errorRecoveringMessageNoAdmin => + 'This feature is available on Synapse homeservers only for adminstrators.'; + + @override + String get requestPermission => 'Request permission'; + + @override + String get roomHasBeenUpgraded => 'Room has been upgraded'; + + @override + String get roomVersion => 'Room version'; + + @override + String get saveFile => 'Save file'; + + @override + String get retry => 'Retry'; + + @override + String get search => 'Search'; + + @override + String get security => 'Security'; + + @override + String get recoveryKey => 'Recovery key'; + + @override + String get recoveryKeyLost => 'Recovery key lost?'; + + @override + String seenByUser(String username) { + return 'Seen by $username'; + } + + @override + String get send => 'Send'; + + @override + String get sendAMessage => 'Send a message'; + + @override + String get sendAsText => 'Send as text'; + + @override + String get sendAudio => 'Send audio'; + + @override + String get sendFile => 'Send file'; + + @override + String get sendImage => 'Send image'; + + @override + String sendImages(int count) { + return 'Send $count image'; + } + + @override + String get sendMessages => 'Send messages'; + + @override + String get sendOriginal => 'Send original'; + + @override + String get sendSticker => 'Send sticker'; + + @override + String get sendVideo => 'Send video'; + + @override + String sentAFile(String username) { + return '📁 $username sent a file'; + } + + @override + String sentAnAudio(String username) { + return '🎤 $username sent an audio'; + } + + @override + String sentAPicture(String username) { + return '🖼️ $username sent a picture'; + } + + @override + String sentASticker(String username) { + return '😊 $username sent a sticker'; + } + + @override + String sentAVideo(String username) { + return '🎥 $username sent a video'; + } + + @override + String sentCallInformations(String senderName) { + return '$senderName sent call information'; + } + + @override + String get separateChatTypes => 'Separate Direct Chats and Groups'; + + @override + String get setAsCanonicalAlias => 'Set as main alias'; + + @override + String get setCustomEmotes => 'Set custom emotes'; + + @override + String get setChatDescription => 'Set chat description'; + + @override + String get setInvitationLink => 'Set invitation link'; + + @override + String get setPermissionsLevel => 'Set permissions level'; + + @override + String get setStatus => 'Set status'; + + @override + String get settings => 'Settings'; + + @override + String get share => 'Share'; + + @override + String sharedTheLocation(String username) { + return '$username shared their location'; + } + + @override + String get shareLocation => 'Share location'; + + @override + String get showPassword => 'Show password'; + + @override + String get presenceStyle => 'Presence:'; + + @override + String get hideAvatarsInInvites => 'Hide avatars in invites'; + + @override + String get hideAvatarsInInvitesDescription => + 'Do not show room avatars in invites'; + + @override + String get presencesToggle => 'Show status messages from other users'; + + @override + String get pureBlackToggle => 'Pure Black'; + + @override + String get singlesignon => 'Single Sign on'; + + @override + String get skip => 'Skip'; + + @override + String get sourceCode => 'Source code'; + + @override + String get spaceIsPublic => 'Space is public'; + + @override + String get spaceName => 'Space name'; + + @override + String startedACall(String senderName) { + return '$senderName started a call'; + } + + @override + String get startFirstChat => 'Start your first chat'; + + @override + String get status => 'Status'; + + @override + String get statusExampleMessage => 'How are you today?'; + + @override + String get submit => 'Submit'; + + @override + String get synchronizingPleaseWait => 'Synchronizing… Please wait.'; + + @override + String synchronizingPleaseWaitCounter(String percentage) { + return ' Synchronizing… ($percentage%)'; + } + + @override + String get systemTheme => 'System'; + + @override + String get theyDontMatch => 'They Don\'t Match'; + + @override + String get theyMatch => 'They Match'; + + @override + String get title => 'Extera'; + + @override + String get toggleFavorite => 'Toggle Favorite'; + + @override + String get toggleMuted => 'Toggle Muted'; + + @override + String get toggleUnread => 'Mark Read/Unread'; + + @override + String get tooManyRequestsWarning => + 'Too many requests. Please try again later!'; + + @override + String get transferFromAnotherDevice => 'Transfer from another device'; + + @override + String get tryToSendAgain => 'Try to send again'; + + @override + String get unavailable => 'Unavailable'; + + @override + String unbannedUser(String username, String targetName) { + return '$username unbanned $targetName'; + } + + @override + String get unblockDevice => 'Unblock Device'; + + @override + String get unknownDevice => 'Unknown device'; + + @override + String get unknownEncryptionAlgorithm => 'Unknown encryption algorithm'; + + @override + String unknownEvent(String type) { + return 'Unknown event \'$type\''; + } + + @override + String get unmuteChat => 'Unmute chat'; + + @override + String get unpin => 'Unpin'; + + @override + String unreadChats(int unreadCount) { + String _temp0 = intl.Intl.pluralLogic( + unreadCount, + locale: localeName, + other: '$unreadCount unread chats', + one: '1 unread chat', + ); + return '$_temp0'; + } + + @override + String userAndOthersAreTyping(String username, int count) { + return '$username and $count others are typing…'; + } + + @override + String userAndUserAreTyping(String username, String username2) { + return '$username and $username2 are typing…'; + } + + @override + String userIsTyping(String username) { + return '$username is typing…'; + } + + @override + String userLeftTheChat(String username) { + return '🚪 $username left the chat'; + } + + @override + String get username => 'Username'; + + @override + String userSentUnknownEvent(String username, String type) { + return '$username sent a $type event'; + } + + @override + String get unverified => 'Unverified'; + + @override + String get verified => 'Verified'; + + @override + String get verify => 'Verify'; + + @override + String get verifyStart => 'Start Verification'; + + @override + String get verifySuccess => 'You successfully verified!'; + + @override + String get verifyTitle => 'Verifying other account'; + + @override + String get videoCall => 'Video call'; + + @override + String get visibilityOfTheChatHistory => 'Visibility of the chat history'; + + @override + String get visibleForAllParticipants => 'Visible for all participants'; + + @override + String get visibleForEveryone => 'Visible for everyone'; + + @override + String get voiceMessage => 'Voice message'; + + @override + String get waitingPartnerAcceptRequest => + 'Waiting for partner to accept the request…'; + + @override + String get waitingPartnerEmoji => 'Waiting for partner to accept the emoji…'; + + @override + String get waitingPartnerNumbers => + 'Waiting for partner to accept the numbers…'; + + @override + String get wallpaper => 'Wallpaper:'; + + @override + String get warning => 'Warning!'; + + @override + String get weSentYouAnEmail => 'We sent you an email'; + + @override + String get whoCanPerformWhichAction => 'Who can perform which action'; + + @override + String get whoIsAllowedToJoinThisGroup => 'Who is allowed to join this group'; + + @override + String get whyDoYouWantToReportThis => 'Why do you want to report this?'; + + @override + String get wipeChatBackup => + 'Wipe your chat backup to create a new recovery key?'; + + @override + String get withTheseAddressesRecoveryDescription => + 'With these addresses you can recover your password.'; + + @override + String get writeAMessage => 'Write a message…'; + + @override + String get yes => 'Yes'; + + @override + String get you => 'You'; + + @override + String get youAreNoLongerParticipatingInThisChat => + 'You are no longer participating in this chat'; + + @override + String get youHaveBeenBannedFromThisChat => + 'You have been banned from this chat'; + + @override + String get yourPublicKey => 'Your public key'; + + @override + String get messageInfo => 'Message info'; + + @override + String get time => 'Time'; + + @override + String get messageType => 'Message Type'; + + @override + String get sender => 'Sender'; + + @override + String get openGallery => 'Open gallery'; + + @override + String get removeFromSpace => 'Remove from space'; + + @override + String get addToSpaceDescription => 'Select a space to add this chat to it.'; + + @override + String get start => 'Start'; + + @override + String get pleaseEnterRecoveryKeyDescription => + 'To unlock your old messages, please enter your recovery key that has been generated in a previous session. Your recovery key is NOT your password.'; + + @override + String get publish => 'Publish'; + + @override + String videoWithSize(String size) { + return 'Video ($size)'; + } + + @override + String get openChat => 'Open Chat'; + + @override + String get markAsRead => 'Mark as read'; + + @override + String get reportUser => 'Report user'; + + @override + String get dismiss => 'Dismiss'; + + @override + String reactedWith(String sender, String reaction) { + return '$sender reacted with $reaction'; + } + + @override + String get pinMessage => 'Pin to room'; + + @override + String get confirmEventUnpin => + 'Are you sure to permanently unpin the event?'; + + @override + String get emojis => 'Emojis'; + + @override + String get placeCall => 'Place call'; + + @override + String get voiceCall => 'Voice call'; + + @override + String get unsupportedAndroidVersion => 'Unsupported Android version'; + + @override + String get unsupportedAndroidVersionLong => + 'This feature requires a newer Android version. Please check for updates or Lineage OS support.'; + + @override + String get videoCallsBetaWarning => + 'Please note that video calls are currently in beta. They might not work as expected or work at all on all platforms.'; + + @override + String get experimentalVideoCalls => 'Experimental video calls'; + + @override + String get emailOrUsername => 'Email or username'; + + @override + String get indexedDbErrorTitle => 'Private mode issues'; + + @override + String get indexedDbErrorLong => + 'The message storage is unfortunately not enabled in private mode by default.\nPlease visit\n - about:config\n - set dom.indexedDB.privateBrowsing.enabled to true\nOtherwise, it is not possible to run Extera.'; + + @override + String switchToAccount(String number) { + return 'Switch to account $number'; + } + + @override + String get nextAccount => 'Next account'; + + @override + String get previousAccount => 'Previous account'; + + @override + String get addWidget => 'Add widget'; + + @override + String get widgetVideo => 'Video'; + + @override + String get widgetEtherpad => 'Text note'; + + @override + String get widgetJitsi => 'Jitsi Meet'; + + @override + String get widgetCustom => 'Custom'; + + @override + String get widgetName => 'Name'; + + @override + String get widgetUrlError => 'This is not a valid URL.'; + + @override + String get widgetNameError => 'Please provide a display name.'; + + @override + String get errorAddingWidget => 'Error adding the widget.'; + + @override + String get youRejectedTheInvitation => 'You rejected the invitation'; + + @override + String get youJoinedTheChat => 'You joined the chat'; + + @override + String get youAcceptedTheInvitation => '👍 You accepted the invitation'; + + @override + String youBannedUser(String user) { + return 'You banned $user'; + } + + @override + String youHaveWithdrawnTheInvitationFor(String user) { + return 'You have withdrawn the invitation for $user'; + } + + @override + String youInvitedToBy(String alias) { + return '📩 You have been invited via link to:\n$alias'; + } + + @override + String youInvitedBy(String user) { + return '📩 You have been invited by $user'; + } + + @override + String invitedBy(String user) { + return '📩 Invited by $user'; + } + + @override + String youInvitedUser(String user) { + return '📩 You invited $user'; + } + + @override + String youKicked(String user) { + return '👞 You kicked $user'; + } + + @override + String youKickedAndBanned(String user) { + return '🙅 You kicked and banned $user'; + } + + @override + String youUnbannedUser(String user) { + return 'You unbanned $user'; + } + + @override + String hasKnocked(String user) { + return '🚪 $user has knocked'; + } + + @override + String get usersMustKnock => 'Users must knock'; + + @override + String get noOneCanJoin => 'No one can join'; + + @override + String userWouldLikeToChangeTheChat(String user) { + return '$user would like to join the chat.'; + } + + @override + String get noPublicLinkHasBeenCreatedYet => + 'No public link has been created yet'; + + @override + String get knock => 'Knock'; + + @override + String get users => 'Users'; + + @override + String get unlockOldMessages => 'Unlock old messages'; + + @override + String get storeInSecureStorageDescription => + 'Store the recovery key in the secure storage of this device.'; + + @override + String get saveKeyManuallyDescription => + 'Save this key manually by triggering the system share dialog or clipboard.'; + + @override + String get storeInAndroidKeystore => 'Store in Android KeyStore'; + + @override + String get storeInAppleKeyChain => 'Store in Apple KeyChain'; + + @override + String get storeSecurlyOnThisDevice => 'Store securely on this device'; + + @override + String countFiles(int count) { + return '$count files'; + } + + @override + String get user => 'User'; + + @override + String get custom => 'Custom'; + + @override + String get foregroundServiceRunning => + 'This notification appears when the foreground service is running.'; + + @override + String get screenSharingTitle => 'screen sharing'; + + @override + String get screenSharingDetail => 'You are sharing your screen in Extera'; + + @override + String get callingPermissions => 'Calling permissions'; + + @override + String get callingAccount => 'Calling account'; + + @override + String get callingAccountDetails => + 'Allows Extera to use the native android dialer app.'; + + @override + String get appearOnTop => 'Appear on top'; + + @override + String get appearOnTopDetails => + 'Allows the app to appear on top (not needed if you already have Fluffychat setup as a calling account)'; + + @override + String get otherCallingPermissions => + 'Microphone, camera and other Extera permissions'; + + @override + String get whyIsThisMessageEncrypted => 'Why is this message unreadable?'; + + @override + String get noKeyForThisMessage => + 'This can happen if the message was sent before you have signed in to your account at this device.\n\nIt is also possible that the sender has blocked your device or something went wrong with the internet connection.\n\nAre you able to read the message on another session? Then you can transfer the message from it! Go to Settings > Devices and make sure that your devices have verified each other. When you open the room the next time and both sessions are in the foreground, the keys will be transmitted automatically.\n\nDo you not want to lose the keys when logging out or switching devices? Make sure that you have enabled the chat backup in the settings.'; + + @override + String get newGroup => 'New group'; + + @override + String get newSpace => 'New space'; + + @override + String get enterSpace => 'Enter space'; + + @override + String get enterRoom => 'Enter room'; + + @override + String get allSpaces => 'All spaces'; + + @override + String numChats(String number) { + return '$number chats'; + } + + @override + String get hideUnimportantStateEvents => 'Hide unimportant state events'; + + @override + String get hidePresences => 'Hide Status List?'; + + @override + String get doNotShowAgain => 'Do not show again'; + + @override + String wasDirectChatDisplayName(String oldDisplayName) { + return 'Empty chat (was $oldDisplayName)'; + } + + @override + String get newSpaceDescription => + 'Spaces allows you to consolidate your chats and build private or public communities.'; + + @override + String get encryptThisChat => 'Encrypt this chat'; + + @override + String get disableEncryptionWarning => + 'For security reasons you can not disable encryption in a chat, where it has been enabled before.'; + + @override + String get sorryThatsNotPossible => 'Sorry... that is not possible'; + + @override + String get deviceKeys => 'Device keys:'; + + @override + String get reopenChat => 'Reopen chat'; + + @override + String get noBackupWarning => + 'Warning! Without enabling chat backup, you will lose access to your encrypted messages. It is highly recommended to enable the chat backup first before logging out.'; + + @override + String get noOtherDevicesFound => 'No other devices found'; + + @override + String fileIsTooBigForServer(String max) { + return 'Unable to send! The server only supports attachments up to $max.'; + } + + @override + String fileHasBeenSavedAt(String path) { + return 'File has been saved at $path'; + } + + @override + String get jumpToLastReadMessage => 'Jump to last read message'; + + @override + String get readUpToHere => 'Read up to here'; + + @override + String get jump => 'Jump'; + + @override + String get openLinkInBrowser => 'Open link in browser'; + + @override + String get reportErrorDescription => + '😭 Oh no. Something went wrong. If you want, you can report this bug to the developers.'; + + @override + String get report => 'Report'; + + @override + String get signInWithPassword => 'Sign in with password'; + + @override + String get pleaseTryAgainLaterOrChooseDifferentServer => + 'Please try again later or choose a different server.'; + + @override + String signInWith(String provider) { + return 'Sign in with $provider'; + } + + @override + String get profileNotFound => + 'The user could not be found on the server. Maybe there is a connection problem or the user doesn\'t exist.'; + + @override + String get setTheme => 'Set theme:'; + + @override + String get setColorTheme => 'Set color theme:'; + + @override + String get invite => 'Invite'; + + @override + String get inviteGroupChat => '📨 Invite group chat'; + + @override + String get invitePrivateChat => '📨 Invite private chat'; + + @override + String get invalidInput => 'Invalid input!'; + + @override + String wrongPinEntered(int seconds) { + return 'Wrong pin entered! Try again in $seconds seconds...'; + } + + @override + String get pleaseEnterANumber => 'Please enter a number greater than 0'; + + @override + String get archiveRoomDescription => + 'The chat will be moved to the archive. Other users will be able to see that you have left the chat.'; + + @override + String get roomUpgradeDescription => + 'The chat will then be recreated with the new room version. All participants will be notified that they need to switch to the new chat. You can find out more about room versions at https://spec.matrix.org/latest/rooms/'; + + @override + String get removeDevicesDescription => + 'You will be logged out of this device and will no longer be able to receive messages.'; + + @override + String get banUserDescription => + 'The user will be banned from the chat and will not be able to enter the chat again until they are unbanned.'; + + @override + String get unbanUserDescription => + 'The user will be able to enter the chat again if they try.'; + + @override + String get kickUserDescription => + 'The user is kicked out of the chat but not banned. In public chats, the user can rejoin at any time.'; + + @override + String get makeAdminDescription => + 'Once you make this user admin, you may not be able to undo this as they will then have the same permissions as you.'; + + @override + String get pushNotificationsNotAvailable => + 'Push notifications not available'; + + @override + String get learnMore => 'Learn more'; + + @override + String get yourGlobalUserIdIs => 'Your global user-ID is: '; + + @override + String noUsersFoundWithQuery(String query) { + return 'Unfortunately no user could be found with \"$query\". Please check whether you made a typo.'; + } + + @override + String get knocking => 'Knocking'; + + @override + String chatCanBeDiscoveredViaSearchOnServer(String server) { + return 'Chat can be discovered via the search on $server'; + } + + @override + String get searchChatsRooms => 'Search for #chats, @users...'; + + @override + String get nothingFound => 'Nothing found...'; + + @override + String get groupName => 'Group name'; + + @override + String get createGroupAndInviteUsers => 'Create a group and invite users'; + + @override + String get groupCanBeFoundViaSearch => 'Group can be found via search'; + + @override + String get wrongRecoveryKey => + 'Sorry... this does not seem to be the correct recovery key.'; + + @override + String get startConversation => 'Start conversation'; + + @override + String get commandHint_sendraw => 'Send raw json'; + + @override + String get databaseMigrationTitle => 'Database is optimized'; + + @override + String get databaseMigrationBody => 'Please wait. This may take a moment.'; + + @override + String get leaveEmptyToClearStatus => 'Leave empty to clear your status.'; + + @override + String get select => 'Select'; + + @override + String get searchForUsers => 'Search for @users...'; + + @override + String get pleaseEnterYourCurrentPassword => + 'Please enter your current password'; + + @override + String get newPassword => 'New password'; + + @override + String get pleaseChooseAStrongPassword => 'Please choose a strong password'; + + @override + String get passwordsDoNotMatch => 'Passwords do not match'; + + @override + String get passwordIsWrong => 'Your entered password is wrong'; + + @override + String get publicLink => 'Public link'; + + @override + String get publicChatAddresses => 'Public chat addresses'; + + @override + String get createNewAddress => 'Create new address'; + + @override + String get joinSpace => 'Join space'; + + @override + String get publicSpaces => 'Public spaces'; + + @override + String get addChatOrSubSpace => 'Add chat or sub space'; + + @override + String get subspace => 'Subspace'; + + @override + String get decline => 'Decline'; + + @override + String get thisDevice => 'This device:'; + + @override + String get initAppError => 'An error occured while init the app'; + + @override + String get userRole => 'User role'; + + @override + String minimumPowerLevel(String level) { + return '$level is the minimum power level.'; + } + + @override + String searchIn(String chat) { + return 'Search in chat \"$chat\"...'; + } + + @override + String get searchMore => 'Search more...'; + + @override + String get gallery => 'Gallery'; + + @override + String get files => 'Files'; + + @override + String databaseBuildErrorBody(String url, String error) { + return 'Unable to build the SQlite database. The app tries to use the legacy database for now. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String sessionLostBody(String url, String error) { + return 'Your session is lost. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String restoreSessionBody(String url, String error) { + return 'The app now tries to restore your session from the backup. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String forwardMessageTo(String roomName) { + return 'Forward message to $roomName?'; + } + + @override + String get sendReadReceipts => 'Send read receipts'; + + @override + String get sendTypingNotificationsDescription => + 'Other participants in a chat can see when you are typing a new message.'; + + @override + String get sendReadReceiptsDescription => + 'Other participants in a chat can see when you have read a message.'; + + @override + String get formattedMessages => 'Formatted messages'; + + @override + String get formattedMessagesDescription => + 'Display rich message content like bold text using markdown.'; + + @override + String get verifyOtherUser => '🔐 Verify other user'; + + @override + String get verifyOtherUserDescription => + 'If you verify another user, you can be sure that you know who you are really writing to. 💪\n\nWhen you start a verification, you and the other user will see a popup in the app. There you will then see a series of emojis or numbers that you have to compare with each other.\n\nThe best way to do this is to meet up or start a video call. 👭'; + + @override + String get verifyOtherDevice => '🔐 Verify other device'; + + @override + String get verifyOtherDeviceDescription => + 'When you verify another device, those devices can exchange keys, increasing your overall security. 💪 When you start a verification, a popup will appear in the app on both devices. There you will then see a series of emojis or numbers that you have to compare with each other. It\'s best to have both devices handy before you start the verification. 🤳'; + + @override + String acceptedKeyVerification(String sender) { + return '$sender accepted key verification'; + } + + @override + String canceledKeyVerification(String sender) { + return '$sender canceled key verification'; + } + + @override + String completedKeyVerification(String sender) { + return '$sender completed key verification'; + } + + @override + String isReadyForKeyVerification(String sender) { + return '$sender is ready for key verification'; + } + + @override + String requestedKeyVerification(String sender) { + return '$sender requested key verification'; + } + + @override + String startedKeyVerification(String sender) { + return '$sender started key verification'; + } + + @override + String get transparent => 'Transparent'; + + @override + String get incomingMessages => 'Incoming messages'; + + @override + String get stickers => 'Stickers'; + + @override + String get discover => 'Discover'; + + @override + String get commandHint_ignore => 'Ignore the given matrix ID'; + + @override + String get commandHint_unignore => 'Unignore the given matrix ID'; + + @override + String unreadChatsInApp(String appname, String unread) { + return '$appname: $unread unread chats'; + } + + @override + String get noDatabaseEncryption => + 'Database encryption is not supported on this platform'; + + @override + String thereAreCountUsersBlocked(Object count) { + return 'Right now there are $count users blocked.'; + } + + @override + String get restricted => 'Restricted'; + + @override + String get knockRestricted => 'Knock restricted'; + + @override + String goToSpace(Object space) { + return 'Go to space: $space'; + } + + @override + String get markAsUnread => 'Mark as unread'; + + @override + String userLevel(int level) { + return '$level - User'; + } + + @override + String moderatorLevel(int level) { + return '$level - Moderator'; + } + + @override + String adminLevel(int level) { + return '$level - Admin'; + } + + @override + String get changeGeneralChatSettings => 'Change general chat settings'; + + @override + String get inviteOtherUsers => 'Invite other users to this chat'; + + @override + String get changeTheChatPermissions => 'Change the chat permissions'; + + @override + String get changeTheVisibilityOfChatHistory => + 'Change the visibility of the chat history'; + + @override + String get changeTheCanonicalRoomAlias => + 'Change the main public chat address'; + + @override + String get sendRoomNotifications => 'Send a @room notifications'; + + @override + String get changeTheDescriptionOfTheGroup => + 'Change the description of the chat'; + + @override + String get chatPermissionsDescription => + 'Define which power level is necessary for certain actions in this chat. The power levels 0, 50 and 100 are usually representing users, moderators and admins, but any gradation is possible.'; + + @override + String updateInstalled(String version) { + return '🎉 Update $version installed!'; + } + + @override + String get changelog => 'Changelog'; + + @override + String get sendCanceled => 'Sending canceled'; + + @override + String get loginWithMatrixId => 'Login with Matrix-ID'; + + @override + String get discoverHomeservers => 'Discover homeservers'; + + @override + String get whatIsAHomeserver => 'What is a homeserver?'; + + @override + String get homeserverDescription => + 'All your data is stored on the homeserver, just like an email provider. You can choose which homeserver you want to use, while you can still communicate with everyone. Learn more at at https://matrix.org.'; + + @override + String get doesNotSeemToBeAValidHomeserver => + 'Doesn\'t seem to be a compatible homeserver. Wrong URL?'; + + @override + String get calculatingFileSize => 'Calculating file size...'; + + @override + String get prepareSendingAttachment => 'Prepare sending attachment...'; + + @override + String get sendingAttachment => 'Sending attachment...'; + + @override + String get generatingVideoThumbnail => 'Generating video thumbnail...'; + + @override + String get compressVideo => 'Compressing video...'; + + @override + String sendingAttachmentCountOfCount(int index, int length) { + return 'Sending attachment $index of $length...'; + } + + @override + String serverLimitReached(int seconds) { + return 'Server limit reached! Waiting $seconds seconds...'; + } + + @override + String get oneOfYourDevicesIsNotVerified => + 'One of your devices is not verified'; + + @override + String get noticeChatBackupDeviceVerification => + 'Note: When you connect all your devices to the chat backup, they are automatically verified.'; + + @override + String get continueText => 'Continue'; + + @override + String get welcomeText => + 'Hey Hey 👋 This is Extera. You can sign in to any homeserver, which is compatible with https://matrix.org. And then chat with anyone. It\'s a huge decentralized messaging network!'; + + @override + String get blur => 'Blur:'; + + @override + String get opacity => 'Opacity:'; + + @override + String get setWallpaper => 'Set wallpaper'; + + @override + String get manageAccount => 'Manage account'; + + @override + String get noContactInformationProvided => + 'Server does not provide any valid contact information'; + + @override + String get contactServerAdmin => 'Contact server admin'; + + @override + String get contactServerSecurity => 'Contact server security'; + + @override + String get supportPage => 'Support page'; + + @override + String get serverInformation => 'Server information:'; + + @override + String get name => 'Name'; + + @override + String get version => 'Version'; + + @override + String get website => 'Website'; + + @override + String get compress => 'Compress'; + + @override + String get boldText => 'Bold text'; + + @override + String get italicText => 'Italic text'; + + @override + String get strikeThrough => 'Strikethrough'; + + @override + String get pleaseFillOut => 'Please fill out'; + + @override + String get invalidUrl => 'Invalid url'; + + @override + String get addLink => 'Add link'; + + @override + String get unableToJoinChat => + 'Unable to join chat. Maybe the other party has already closed the conversation.'; + + @override + String get previous => 'Previous'; + + @override + String get otherPartyNotLoggedIn => + 'The other party is currently not logged in and therefore cannot receive messages!'; + + @override + String appWantsToUseForLogin(String server) { + return 'Use \'$server\' to log in'; + } + + @override + String get appWantsToUseForLoginDescription => + 'You hereby allow the app and website to share information about you.'; + + @override + String get open => 'Open'; + + @override + String get waitingForServer => 'Waiting for server...'; + + @override + String get appIntroduction => + 'Extera lets you chat with your friends across different messengers. Learn more at https://matrix.org or just tap *Continue*.'; + + @override + String get newChatRequest => '📩 New chat request'; + + @override + String get contentNotificationSettings => 'Content notification settings'; + + @override + String get generalNotificationSettings => 'General notification settings'; + + @override + String get roomNotificationSettings => 'Room notification settings'; + + @override + String get userSpecificNotificationSettings => + 'User specific notification settings'; + + @override + String get otherNotificationSettings => 'Other notification settings'; + + @override + String get notificationRuleContainsUserName => 'Contains User Name'; + + @override + String get notificationRuleContainsUserNameDescription => + 'Notifies the user when a message contains their username.'; + + @override + String get notificationRuleMaster => 'Mute all notifications'; + + @override + String get notificationRuleMasterDescription => + 'Overrides all other rules and disables all notifications.'; + + @override + String get notificationRuleSuppressNotices => 'Suppress Automated Messages'; + + @override + String get notificationRuleSuppressNoticesDescription => + 'Suppresses notifications from automated clients like bots.'; + + @override + String get notificationRuleInviteForMe => 'Invite for Me'; + + @override + String get notificationRuleInviteForMeDescription => + 'Notifies the user when they are invited to a room.'; + + @override + String get notificationRuleMemberEvent => 'Member Event'; + + @override + String get notificationRuleMemberEventDescription => + 'Suppresses notifications for membership events.'; + + @override + String get notificationRuleIsUserMention => 'User Mention'; + + @override + String get notificationRuleIsUserMentionDescription => + 'Notifies the user when they are directly mentioned in a message.'; + + @override + String get notificationRuleContainsDisplayName => 'Contains Display Name'; + + @override + String get notificationRuleContainsDisplayNameDescription => + 'Notifies the user when a message contains their display name.'; + + @override + String get notificationRuleIsRoomMention => 'Room Mention'; + + @override + String get notificationRuleIsRoomMentionDescription => + 'Notifies the user when there is a room mention.'; + + @override + String get notificationRuleRoomnotif => 'Room Notification'; + + @override + String get notificationRuleRoomnotifDescription => + 'Notifies the user when a message contains \'@room\'.'; + + @override + String get notificationRuleTombstone => 'Tombstone'; + + @override + String get notificationRuleTombstoneDescription => + 'Notifies the user about room deactivation messages.'; + + @override + String get notificationRuleReaction => 'Reaction'; + + @override + String get notificationRuleReactionDescription => + 'Suppresses notifications for reactions.'; + + @override + String get notificationRuleRoomServerAcl => 'Room Server ACL'; + + @override + String get notificationRuleRoomServerAclDescription => + 'Suppresses notifications for room server access control lists (ACL).'; + + @override + String get notificationRuleSuppressEdits => 'Suppress Edits'; + + @override + String get notificationRuleSuppressEditsDescription => + 'Suppresses notifications for edited messages.'; + + @override + String get notificationRuleCall => 'Call'; + + @override + String get notificationRuleCallDescription => + 'Notifies the user about calls.'; + + @override + String get notificationRuleEncryptedRoomOneToOne => + 'Encrypted Room One-to-One'; + + @override + String get notificationRuleEncryptedRoomOneToOneDescription => + 'Notifies the user about messages in encrypted one-to-one rooms.'; + + @override + String get notificationRuleRoomOneToOne => 'Room One-to-One'; + + @override + String get notificationRuleRoomOneToOneDescription => + 'Notifies the user about messages in one-to-one rooms.'; + + @override + String get notificationRuleMessage => 'Message'; + + @override + String get notificationRuleMessageDescription => + 'Notifies the user about general messages.'; + + @override + String get notificationRuleEncrypted => 'Encrypted'; + + @override + String get notificationRuleEncryptedDescription => + 'Notifies the user about messages in encrypted rooms.'; + + @override + String get notificationRuleJitsi => 'Jitsi'; + + @override + String get notificationRuleJitsiDescription => + 'Notifies the user about Jitsi widget events.'; + + @override + String get notificationRuleServerAcl => 'Suppress Server ACL Events'; + + @override + String get notificationRuleServerAclDescription => + 'Suppresses notifications for Server ACL events.'; + + @override + String unknownPushRule(String rule) { + return 'Unknown push rule \'$rule\''; + } + + @override + String get deletePushRuleCanNotBeUndone => + 'If you delete this notification setting, this can not be undone.'; + + @override + String get more => 'More'; + + @override + String get shareKeysWith => 'Share keys with...'; + + @override + String get shareKeysWithDescription => + 'Which devices should be trusted so that they can read along your messages in encrypted chats?'; + + @override + String get allDevices => 'All devices'; + + @override + String get crossVerifiedDevicesIfEnabled => + 'Cross verified devices if enabled'; + + @override + String get crossVerifiedDevices => 'Cross verified devices'; + + @override + String get verifiedDevicesOnly => 'Verified devices only'; + + @override + String get takeAPhoto => 'Take a photo'; + + @override + String get recordAVideo => 'Record a video'; + + @override + String get optionalMessage => '(Optional) message...'; + + @override + String get notSupportedOnThisDevice => 'Not supported on this device'; + + @override + String get enterNewChat => 'Enter new chat'; + + @override + String get approve => 'Approve'; + + @override + String get youHaveKnocked => 'You have knocked'; + + @override + String get pleaseWaitUntilInvited => + 'Please wait now, until someone from the room invites you.'; +} diff --git a/lib/generated/l10n/l10n_bo.dart b/lib/generated/l10n/l10n_bo.dart new file mode 100644 index 0000000..1496a32 --- /dev/null +++ b/lib/generated/l10n/l10n_bo.dart @@ -0,0 +1,2745 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'l10n.dart'; + +// ignore_for_file: type=lint + +/// The translations for Tibetan (`bo`). +class L10nBo extends L10n { + L10nBo([String locale = 'bo']) : super(locale); + + @override + String get noSendPermission => 'You can\'t send messages here'; + + @override + String get alwaysUse24HourFormat => 'false'; + + @override + String get repeatPassword => 'Repeat password'; + + @override + String get notAnImage => 'Not an image file.'; + + @override + String get setCustomPermissionLevel => 'Set custom permission level'; + + @override + String get setPermissionsLevelDescription => + 'Please choose a predefined role below or enter a custom permission level between 0 and 100.'; + + @override + String get ignoreUser => 'Ignore user'; + + @override + String get normalUser => 'Normal user'; + + @override + String get remove => 'Remove'; + + @override + String get importNow => 'Import now'; + + @override + String get importEmojis => 'Import Emojis'; + + @override + String get importFromZipFile => 'Import from .zip file'; + + @override + String get exportEmotePack => 'Export Emote pack as .zip'; + + @override + String get replace => 'Replace'; + + @override + String get about => 'About'; + + @override + String aboutHomeserver(String homeserver) { + return 'About $homeserver'; + } + + @override + String get accept => 'Accept'; + + @override + String acceptedTheInvitation(String username) { + return '👍 $username accepted the invitation'; + } + + @override + String get account => 'Account'; + + @override + String activatedEndToEndEncryption(String username) { + return '🔐 $username activated end to end encryption'; + } + + @override + String get addEmail => 'Add email'; + + @override + String get confirmMatrixId => + 'Please confirm your Matrix ID in order to delete your account.'; + + @override + String supposedMxid(String mxid) { + return 'This should be $mxid'; + } + + @override + String get addChatDescription => 'Add a chat description...'; + + @override + String get addToSpace => 'Add to space'; + + @override + String get admin => 'Admin'; + + @override + String get alias => 'alias'; + + @override + String get all => 'All'; + + @override + String get allChats => 'All chats'; + + @override + String get commandHint_roomupgrade => + 'Upgrade this room to the given room version'; + + @override + String get commandHint_googly => 'Send some googly eyes'; + + @override + String get commandHint_cuddle => 'Send a cuddle'; + + @override + String get commandHint_hug => 'Send a hug'; + + @override + String googlyEyesContent(String senderName) { + return '$senderName sends you googly eyes'; + } + + @override + String cuddleContent(String senderName) { + return '$senderName cuddles you'; + } + + @override + String hugContent(String senderName) { + return '$senderName hugs you'; + } + + @override + String answeredTheCall(String senderName) { + return '$senderName answered the call'; + } + + @override + String get anyoneCanJoin => 'Anyone can join'; + + @override + String get appLock => 'App lock'; + + @override + String get appLockDescription => + 'Lock the app when not using with a pin code'; + + @override + String get archive => 'Archive'; + + @override + String get areGuestsAllowedToJoin => 'Are guest users allowed to join'; + + @override + String get areYouSure => 'Are you sure?'; + + @override + String get areYouSureYouWantToLogout => 'Are you sure you want to log out?'; + + @override + String get askSSSSSign => + 'To be able to sign the other person, please enter your secure store passphrase or recovery key.'; + + @override + String askVerificationRequest(String username) { + return 'Accept this verification request from $username?'; + } + + @override + String get autoplayImages => + 'Automatically play animated stickers and emotes'; + + @override + String badServerLoginTypesException(String serverVersions, + String supportedVersions, Object suportedVersions) { + return 'The homeserver supports the login types:\n$serverVersions\nBut this app supports only:\n$supportedVersions'; + } + + @override + String get sendTypingNotifications => 'Send typing notifications'; + + @override + String get swipeRightToLeftToReply => 'Swipe right to left to reply'; + + @override + String get sendOnEnter => 'Send on enter'; + + @override + String badServerVersionsException(String serverVersions, + String supportedVersions, Object serverVerions, Object suportedVersions) { + return 'The homeserver supports the Spec versions:\n$serverVersions\nBut this app supports only $supportedVersions'; + } + + @override + String countChatsAndCountParticipants(int chats, int participants) { + return '$chats chats and $participants participants'; + } + + @override + String get noMoreChatsFound => 'No more chats found...'; + + @override + String get noChatsFoundHere => + 'No chats found here yet. Start a new chat with someone by using the button below. ⤵️'; + + @override + String get joinedChats => 'Joined chats'; + + @override + String get unread => 'Unread'; + + @override + String get space => 'Space'; + + @override + String get spaces => 'Spaces'; + + @override + String get banFromChat => 'Ban from chat'; + + @override + String get banned => 'Banned'; + + @override + String bannedUser(String username, String targetName) { + return '$username banned $targetName'; + } + + @override + String get blockDevice => 'Block Device'; + + @override + String get blocked => 'Blocked'; + + @override + String get botMessages => 'Bot messages'; + + @override + String get cancel => 'Cancel'; + + @override + String cantOpenUri(String uri) { + return 'Can\'t open the URI $uri'; + } + + @override + String get changeDeviceName => 'Change device name'; + + @override + String changedTheChatAvatar(String username) { + return '$username changed the chat avatar'; + } + + @override + String changedTheChatDescriptionTo(String username, String description) { + return '$username changed the chat description to: \'$description\''; + } + + @override + String changedTheChatNameTo(String username, String chatname) { + return '$username changed the chat name to: \'$chatname\''; + } + + @override + String changedTheChatPermissions(String username) { + return '$username changed the chat permissions'; + } + + @override + String changedTheDisplaynameTo(String username, String displayname) { + return '$username changed their displayname to: \'$displayname\''; + } + + @override + String changedTheGuestAccessRules(String username) { + return '$username changed the guest access rules'; + } + + @override + String changedTheGuestAccessRulesTo(String username, String rules) { + return '$username changed the guest access rules to: $rules'; + } + + @override + String changedTheHistoryVisibility(String username) { + return '$username changed the history visibility'; + } + + @override + String changedTheHistoryVisibilityTo(String username, String rules) { + return '$username changed the history visibility to: $rules'; + } + + @override + String changedTheJoinRules(String username) { + return '$username changed the join rules'; + } + + @override + String changedTheJoinRulesTo(String username, String joinRules) { + return '$username changed the join rules to: $joinRules'; + } + + @override + String changedTheProfileAvatar(String username) { + return '$username changed their avatar'; + } + + @override + String changedTheRoomAliases(String username) { + return '$username changed the room aliases'; + } + + @override + String changedTheRoomInvitationLink(String username) { + return '$username changed the invitation link'; + } + + @override + String get changePassword => 'Change password'; + + @override + String get changeTheHomeserver => 'Change the homeserver'; + + @override + String get changeTheme => 'Change your style'; + + @override + String get changeTheNameOfTheGroup => 'Change the name of the group'; + + @override + String get changeYourAvatar => 'Change your avatar'; + + @override + String get channelCorruptedDecryptError => + 'The encryption has been corrupted'; + + @override + String get chat => 'Chat'; + + @override + String get yourChatBackupHasBeenSetUp => 'Your chat backup has been set up.'; + + @override + String get chatBackup => 'Chat backup'; + + @override + String get chatBackupDescription => + 'Your old messages are secured with a recovery key. Please make sure you don\'t lose it.'; + + @override + String get chatDetails => 'Chat details'; + + @override + String get chatHasBeenAddedToThisSpace => 'Chat has been added to this space'; + + @override + String get chats => 'Chats'; + + @override + String get chooseAStrongPassword => 'Choose a strong password'; + + @override + String get clearArchive => 'Clear archive'; + + @override + String get close => 'Close'; + + @override + String get commandHint_markasdm => + 'Mark as direct message room for the giving Matrix ID'; + + @override + String get commandHint_markasgroup => 'Mark as group'; + + @override + String get commandHint_ban => 'Ban the given user from this room'; + + @override + String get commandHint_clearcache => 'Clear cache'; + + @override + String get commandHint_create => + 'Create an empty group chat\nUse --no-encryption to disable encryption'; + + @override + String get commandHint_discardsession => 'Discard session'; + + @override + String get commandHint_dm => + 'Start a direct chat\nUse --no-encryption to disable encryption'; + + @override + String get commandHint_html => 'Send HTML-formatted text'; + + @override + String get commandHint_invite => 'Invite the given user to this room'; + + @override + String get commandHint_join => 'Join the given room'; + + @override + String get commandHint_kick => 'Remove the given user from this room'; + + @override + String get commandHint_leave => 'Leave this room'; + + @override + String get commandHint_me => 'Describe yourself'; + + @override + String get commandHint_myroomavatar => + 'Set your picture for this room (by mxc-uri)'; + + @override + String get commandHint_myroomnick => 'Set your display name for this room'; + + @override + String get commandHint_op => + 'Set the given user\'s power level (default: 50)'; + + @override + String get commandHint_plain => 'Send unformatted text'; + + @override + String get commandHint_react => 'Send reply as a reaction'; + + @override + String get commandHint_send => 'Send text'; + + @override + String get commandHint_unban => 'Unban the given user from this room'; + + @override + String get commandInvalid => 'Command invalid'; + + @override + String commandMissing(String command) { + return '$command is not a command.'; + } + + @override + String get compareEmojiMatch => 'Please compare the emojis'; + + @override + String get compareNumbersMatch => 'Please compare the numbers'; + + @override + String get configureChat => 'Configure chat'; + + @override + String get confirm => 'Confirm'; + + @override + String get connect => 'Connect'; + + @override + String get contactHasBeenInvitedToTheGroup => + 'Contact has been invited to the group'; + + @override + String get containsDisplayName => 'Contains display name'; + + @override + String get containsUserName => 'Contains username'; + + @override + String get contentHasBeenReported => + 'The content has been reported to the server admins'; + + @override + String get copiedToClipboard => 'Copied to clipboard'; + + @override + String get copy => 'Copy'; + + @override + String get copyToClipboard => 'Copy to clipboard'; + + @override + String couldNotDecryptMessage(String error) { + return 'Could not decrypt message: $error'; + } + + @override + String countParticipants(int count) { + return '$count participants'; + } + + @override + String get create => 'Create'; + + @override + String createdTheChat(String username) { + return '💬 $username created the chat'; + } + + @override + String get createGroup => 'Create group'; + + @override + String get createNewSpace => 'New space'; + + @override + String get currentlyActive => 'Currently active'; + + @override + String get darkTheme => 'Dark'; + + @override + String dateAndTimeOfDay(String date, String timeOfDay) { + return '$date, $timeOfDay'; + } + + @override + String dateWithoutYear(String month, String day) { + return '$month-$day'; + } + + @override + String dateWithYear(String year, String month, String day) { + return '$year-$month-$day'; + } + + @override + String get deactivateAccountWarning => + 'This will deactivate your user account. This can not be undone! Are you sure?'; + + @override + String get defaultPermissionLevel => 'Default permission level for new users'; + + @override + String get delete => 'Delete'; + + @override + String get deleteAccount => 'Delete account'; + + @override + String get deleteMessage => 'Delete message'; + + @override + String get device => 'Device'; + + @override + String get deviceId => 'Device ID'; + + @override + String get devices => 'Devices'; + + @override + String get directChats => 'Direct Chats'; + + @override + String get allRooms => 'All Group Chats'; + + @override + String get displaynameHasBeenChanged => 'Displayname has been changed'; + + @override + String get downloadFile => 'Download file'; + + @override + String get edit => 'Edit'; + + @override + String get editBlockedServers => 'Edit blocked servers'; + + @override + String get chatPermissions => 'Chat permissions'; + + @override + String get editDisplayname => 'Edit displayname'; + + @override + String get editRoomAliases => 'Edit room aliases'; + + @override + String get editRoomAvatar => 'Edit room avatar'; + + @override + String get emoteExists => 'Emote already exists!'; + + @override + String get emoteInvalid => 'Invalid emote shortcode!'; + + @override + String get emoteKeyboardNoRecents => + 'Recently-used emotes will appear here...'; + + @override + String get emotePacks => 'Emote packs for room'; + + @override + String get emoteSettings => 'Emote Settings'; + + @override + String get globalChatId => 'Global chat ID'; + + @override + String get accessAndVisibility => 'Access and visibility'; + + @override + String get accessAndVisibilityDescription => + 'Who is allowed to join this chat and how the chat can be discovered.'; + + @override + String get calls => 'Calls'; + + @override + String get customEmojisAndStickers => 'Custom emojis and stickers'; + + @override + String get customEmojisAndStickersBody => + 'Add or share custom emojis or stickers which can be used in any chat.'; + + @override + String get emoteShortcode => 'Emote shortcode'; + + @override + String get emoteWarnNeedToPick => + 'You need to pick an emote shortcode and an image!'; + + @override + String get emptyChat => 'Empty chat'; + + @override + String get enableEmotesGlobally => 'Enable emote pack globally'; + + @override + String get enableEncryption => 'Enable encryption'; + + @override + String get enableEncryptionWarning => + 'You won\'t be able to disable the encryption anymore. Are you sure?'; + + @override + String get encrypted => 'Encrypted'; + + @override + String get encryption => 'Encryption'; + + @override + String get encryptionNotEnabled => 'Encryption is not enabled'; + + @override + String endedTheCall(String senderName) { + return '$senderName ended the call'; + } + + @override + String get enterAnEmailAddress => 'Enter an email address'; + + @override + String get homeserver => 'Homeserver'; + + @override + String get enterYourHomeserver => 'Enter your homeserver'; + + @override + String errorObtainingLocation(String error) { + return 'Error obtaining location: $error'; + } + + @override + String get everythingReady => 'Everything ready!'; + + @override + String get extremeOffensive => 'Extremely offensive'; + + @override + String get fileName => 'File name'; + + @override + String get fluffychat => 'Extera'; + + @override + String get fontSize => 'Font size'; + + @override + String get forward => 'Forward'; + + @override + String get fromJoining => 'From joining'; + + @override + String get fromTheInvitation => 'From the invitation'; + + @override + String get goToTheNewRoom => 'Go to the new room'; + + @override + String get group => 'Group'; + + @override + String get chatDescription => 'Chat description'; + + @override + String get chatDescriptionHasBeenChanged => 'Chat description changed'; + + @override + String get groupIsPublic => 'Group is public'; + + @override + String get groups => 'Groups'; + + @override + String groupWith(String displayname) { + return 'Group with $displayname'; + } + + @override + String get guestsAreForbidden => 'Guests are forbidden'; + + @override + String get guestsCanJoin => 'Guests can join'; + + @override + String hasWithdrawnTheInvitationFor(String username, String targetName) { + return '$username has withdrawn the invitation for $targetName'; + } + + @override + String get help => 'Help'; + + @override + String get hideRedactedEvents => 'Hide redacted events'; + + @override + String get hideRedactedMessages => 'Hide redacted messages'; + + @override + String get hideRedactedMessagesBody => + 'If someone redacts a message, this message won\'t be visible in the chat anymore.'; + + @override + String get hideInvalidOrUnknownMessageFormats => + 'Hide invalid or unknown message formats'; + + @override + String get howOffensiveIsThisContent => 'How offensive is this content?'; + + @override + String get id => 'ID'; + + @override + String get identity => 'Identity'; + + @override + String get block => 'Block'; + + @override + String get blockedUsers => 'Blocked users'; + + @override + String get blockListDescription => + 'You can block users who are disturbing you. You won\'t be able to receive any messages or room invites from the users on your personal block list.'; + + @override + String get blockUsername => 'Ignore username'; + + @override + String get iHaveClickedOnLink => 'I have clicked on the link'; + + @override + String get incorrectPassphraseOrKey => 'Incorrect passphrase or recovery key'; + + @override + String get inoffensive => 'Inoffensive'; + + @override + String get inviteContact => 'Invite contact'; + + @override + String inviteContactToGroupQuestion(Object contact, Object groupName) { + return 'Do you want to invite $contact to the chat \"$groupName\"?'; + } + + @override + String inviteContactToGroup(String groupName) { + return 'Invite contact to $groupName'; + } + + @override + String get noChatDescriptionYet => 'No chat description created yet.'; + + @override + String get tryAgain => 'Try again'; + + @override + String get invalidServerName => 'Invalid server name'; + + @override + String get invited => 'Invited'; + + @override + String get redactMessageDescription => + 'The message will be redacted for all participants in this conversation. This cannot be undone.'; + + @override + String get optionalRedactReason => + '(Optional) Reason for redacting this message...'; + + @override + String invitedUser(String username, String targetName) { + return '📩 $username invited $targetName'; + } + + @override + String get invitedUsersOnly => 'Invited users only'; + + @override + String get inviteForMe => 'Invite for me'; + + @override + String inviteText(String username, String link) { + return '$username invited you to Extera.\n1. Visit fluffychat.im and install the app \n2. Sign up or sign in \n3. Open the invite link: \n $link'; + } + + @override + String get isTyping => 'is typing…'; + + @override + String joinedTheChat(String username) { + return '👋 $username joined the chat'; + } + + @override + String get joinRoom => 'Join room'; + + @override + String kicked(String username, String targetName) { + return '👞 $username kicked $targetName'; + } + + @override + String kickedAndBanned(String username, String targetName) { + return '🙅 $username kicked and banned $targetName'; + } + + @override + String get kickFromChat => 'Kick from chat'; + + @override + String lastActiveAgo(String localizedTimeShort) { + return 'Last active: $localizedTimeShort'; + } + + @override + String get leave => 'Leave'; + + @override + String get leftTheChat => 'Left the chat'; + + @override + String get license => 'License'; + + @override + String get lightTheme => 'Light'; + + @override + String loadCountMoreParticipants(int count) { + return 'Load $count more participants'; + } + + @override + String get dehydrate => 'Export session and wipe device'; + + @override + String get dehydrateWarning => + 'This action cannot be undone. Ensure you safely store the backup file.'; + + @override + String get dehydrateTor => 'TOR Users: Export session'; + + @override + String get dehydrateTorLong => + 'For TOR users, it is recommended to export the session before closing the window.'; + + @override + String get hydrateTor => 'TOR Users: Import session export'; + + @override + String get hydrateTorLong => + 'Did you export your session last time on TOR? Quickly import it and continue chatting.'; + + @override + String get hydrate => 'Restore from backup file'; + + @override + String get loadingPleaseWait => 'Loading… Please wait.'; + + @override + String get loadMore => 'Load more…'; + + @override + String get locationDisabledNotice => + 'Location services are disabled. Please enable them to be able to share your location.'; + + @override + String get locationPermissionDeniedNotice => + 'Location permission denied. Please grant them to be able to share your location.'; + + @override + String get login => 'Login'; + + @override + String logInTo(String homeserver) { + return 'Log in to $homeserver'; + } + + @override + String get logout => 'Logout'; + + @override + String get memberChanges => 'Member changes'; + + @override + String get mention => 'Mention'; + + @override + String get messages => 'Messages'; + + @override + String get messagesStyle => 'Messages:'; + + @override + String get moderator => 'Moderator'; + + @override + String get muteChat => 'Mute chat'; + + @override + String get needPantalaimonWarning => + 'Please be aware that you need Pantalaimon to use end-to-end encryption for now.'; + + @override + String get newChat => 'New chat'; + + @override + String get newMessageInFluffyChat => '💬 New message in Extera'; + + @override + String get newVerificationRequest => 'New verification request!'; + + @override + String get next => 'Next'; + + @override + String get no => 'No'; + + @override + String get noConnectionToTheServer => 'No connection to the server'; + + @override + String get noEmotesFound => 'No emotes found. 😕'; + + @override + String get noEncryptionForPublicRooms => + 'You can only activate encryption as soon as the room is no longer publicly accessible.'; + + @override + String get noGoogleServicesWarning => + 'Firebase Cloud Messaging doesn\'t appear to be available on your device. To still receive push notifications, we recommend installing ntfy. With ntfy or another Unified Push provider you can receive push notifications in a data secure way. You can download ntfy from the PlayStore or from F-Droid.'; + + @override + String noMatrixServer(String server1, String server2) { + return '$server1 is no matrix server, use $server2 instead?'; + } + + @override + String get shareInviteLink => 'Share invite link'; + + @override + String get scanQrCode => 'Scan QR code'; + + @override + String get none => 'None'; + + @override + String get noPasswordRecoveryDescription => + 'You have not added a way to recover your password yet.'; + + @override + String get noPermission => 'No permission'; + + @override + String get noRoomsFound => 'No rooms found…'; + + @override + String get notifications => 'Notifications'; + + @override + String get notificationsEnabledForThisAccount => + 'Notifications enabled for this account'; + + @override + String numUsersTyping(int count) { + return '$count users are typing…'; + } + + @override + String get obtainingLocation => 'Obtaining location…'; + + @override + String get offensive => 'Offensive'; + + @override + String get offline => 'Offline'; + + @override + String get ok => 'Ok'; + + @override + String get online => 'Online'; + + @override + String get onlineKeyBackupEnabled => 'Online Key Backup is enabled'; + + @override + String get oopsPushError => + 'Oops! Unfortunately, an error occurred when setting up the push notifications.'; + + @override + String get oopsSomethingWentWrong => 'Oops, something went wrong…'; + + @override + String get openAppToReadMessages => 'Open app to read messages'; + + @override + String get openCamera => 'Open camera'; + + @override + String get openVideoCamera => 'Open camera for a video'; + + @override + String get oneClientLoggedOut => 'One of your clients has been logged out'; + + @override + String get addAccount => 'Add account'; + + @override + String get editBundlesForAccount => 'Edit bundles for this account'; + + @override + String get addToBundle => 'Add to bundle'; + + @override + String get removeFromBundle => 'Remove from this bundle'; + + @override + String get bundleName => 'Bundle name'; + + @override + String get enableMultiAccounts => + '(BETA) Enable multi accounts on this device'; + + @override + String get openInMaps => 'Open in maps'; + + @override + String get link => 'Link'; + + @override + String get serverRequiresEmail => + 'This server needs to validate your email address for registration.'; + + @override + String get or => 'Or'; + + @override + String get participant => 'Participant'; + + @override + String get passphraseOrKey => 'passphrase or recovery key'; + + @override + String get password => 'Password'; + + @override + String get passwordForgotten => 'Password forgotten'; + + @override + String get passwordHasBeenChanged => 'Password has been changed'; + + @override + String get hideMemberChangesInPublicChats => + 'Hide member changes in public chats'; + + @override + String get hideMemberChangesInPublicChatsBody => + 'Do not show in the chat timeline if someone joins or leaves a public chat to improve readability.'; + + @override + String get overview => 'Overview'; + + @override + String get notifyMeFor => 'Notify me for'; + + @override + String get passwordRecoverySettings => 'Password recovery settings'; + + @override + String get passwordRecovery => 'Password recovery'; + + @override + String get people => 'People'; + + @override + String get pickImage => 'Pick an image'; + + @override + String get pin => 'Pin'; + + @override + String play(String fileName) { + return 'Play $fileName'; + } + + @override + String get pleaseChoose => 'Please choose'; + + @override + String get pleaseChooseAPasscode => 'Please choose a pass code'; + + @override + String get pleaseClickOnLink => + 'Please click on the link in the email and then proceed.'; + + @override + String get pleaseEnter4Digits => + 'Please enter 4 digits or leave empty to disable app lock.'; + + @override + String get pleaseEnterRecoveryKey => 'Please enter your recovery key:'; + + @override + String get pleaseEnterYourPassword => 'Please enter your password'; + + @override + String get pleaseEnterYourPin => 'Please enter your pin'; + + @override + String get pleaseEnterYourUsername => 'Please enter your username'; + + @override + String get pleaseFollowInstructionsOnWeb => + 'Please follow the instructions on the website and tap on next.'; + + @override + String get privacy => 'Privacy'; + + @override + String get publicRooms => 'Public Rooms'; + + @override + String get pushRules => 'Push rules'; + + @override + String get reason => 'Reason'; + + @override + String get recording => 'Recording'; + + @override + String redactedBy(String username) { + return 'Redacted by $username'; + } + + @override + String get directChat => 'Direct chat'; + + @override + String redactedByBecause(String username, String reason) { + return 'Redacted by $username because: \"$reason\"'; + } + + @override + String redactedAnEvent(String username) { + return '$username redacted an event'; + } + + @override + String get redactMessage => 'Redact message'; + + @override + String get register => 'Register'; + + @override + String get reject => 'Reject'; + + @override + String rejectedTheInvitation(String username) { + return '$username rejected the invitation'; + } + + @override + String get rejoin => 'Rejoin'; + + @override + String get removeAllOtherDevices => 'Remove all other devices'; + + @override + String removedBy(String username) { + return 'Removed by $username'; + } + + @override + String get removeDevice => 'Remove device'; + + @override + String get unbanFromChat => 'Unban from chat'; + + @override + String get removeYourAvatar => 'Remove your avatar'; + + @override + String get replaceRoomWithNewerVersion => 'Replace room with newer version'; + + @override + String get reply => 'Reply'; + + @override + String get reportMessage => 'Report message'; + + @override + String get translateMessage => 'Translate message'; + + @override + String get translatedMessage => 'Translated message'; + + @override + String get errorTranslatingMessage => + 'An error has occured while translating the message.'; + + @override + String get recoverMessage => 'Recover message'; + + @override + String get recoveredMessage => 'Recovered message'; + + @override + String get errorRecoveringMessage => + 'An error has occured while recovering the message.'; + + @override + String get errorRecoveringMessageNoAdmin => + 'This feature is available on Synapse homeservers only for adminstrators.'; + + @override + String get requestPermission => 'Request permission'; + + @override + String get roomHasBeenUpgraded => 'Room has been upgraded'; + + @override + String get roomVersion => 'Room version'; + + @override + String get saveFile => 'Save file'; + + @override + String get retry => 'Retry'; + + @override + String get search => 'Search'; + + @override + String get security => 'Security'; + + @override + String get recoveryKey => 'Recovery key'; + + @override + String get recoveryKeyLost => 'Recovery key lost?'; + + @override + String seenByUser(String username) { + return 'Seen by $username'; + } + + @override + String get send => 'Send'; + + @override + String get sendAMessage => 'Send a message'; + + @override + String get sendAsText => 'Send as text'; + + @override + String get sendAudio => 'Send audio'; + + @override + String get sendFile => 'Send file'; + + @override + String get sendImage => 'Send image'; + + @override + String sendImages(int count) { + return 'Send $count image'; + } + + @override + String get sendMessages => 'Send messages'; + + @override + String get sendOriginal => 'Send original'; + + @override + String get sendSticker => 'Send sticker'; + + @override + String get sendVideo => 'Send video'; + + @override + String sentAFile(String username) { + return '📁 $username sent a file'; + } + + @override + String sentAnAudio(String username) { + return '🎤 $username sent an audio'; + } + + @override + String sentAPicture(String username) { + return '🖼️ $username sent a picture'; + } + + @override + String sentASticker(String username) { + return '😊 $username sent a sticker'; + } + + @override + String sentAVideo(String username) { + return '🎥 $username sent a video'; + } + + @override + String sentCallInformations(String senderName) { + return '$senderName sent call information'; + } + + @override + String get separateChatTypes => 'Separate Direct Chats and Groups'; + + @override + String get setAsCanonicalAlias => 'Set as main alias'; + + @override + String get setCustomEmotes => 'Set custom emotes'; + + @override + String get setChatDescription => 'Set chat description'; + + @override + String get setInvitationLink => 'Set invitation link'; + + @override + String get setPermissionsLevel => 'Set permissions level'; + + @override + String get setStatus => 'Set status'; + + @override + String get settings => 'Settings'; + + @override + String get share => 'Share'; + + @override + String sharedTheLocation(String username) { + return '$username shared their location'; + } + + @override + String get shareLocation => 'Share location'; + + @override + String get showPassword => 'Show password'; + + @override + String get presenceStyle => 'Presence:'; + + @override + String get hideAvatarsInInvites => 'Hide avatars in invites'; + + @override + String get hideAvatarsInInvitesDescription => + 'Do not show room avatars in invites'; + + @override + String get presencesToggle => 'Show status messages from other users'; + + @override + String get pureBlackToggle => 'Pure Black'; + + @override + String get singlesignon => 'Single Sign on'; + + @override + String get skip => 'Skip'; + + @override + String get sourceCode => 'Source code'; + + @override + String get spaceIsPublic => 'Space is public'; + + @override + String get spaceName => 'Space name'; + + @override + String startedACall(String senderName) { + return '$senderName started a call'; + } + + @override + String get startFirstChat => 'Start your first chat'; + + @override + String get status => 'Status'; + + @override + String get statusExampleMessage => 'How are you today?'; + + @override + String get submit => 'Submit'; + + @override + String get synchronizingPleaseWait => 'Synchronizing… Please wait.'; + + @override + String synchronizingPleaseWaitCounter(String percentage) { + return ' Synchronizing… ($percentage%)'; + } + + @override + String get systemTheme => 'System'; + + @override + String get theyDontMatch => 'They Don\'t Match'; + + @override + String get theyMatch => 'They Match'; + + @override + String get title => 'Extera'; + + @override + String get toggleFavorite => 'Toggle Favorite'; + + @override + String get toggleMuted => 'Toggle Muted'; + + @override + String get toggleUnread => 'Mark Read/Unread'; + + @override + String get tooManyRequestsWarning => + 'Too many requests. Please try again later!'; + + @override + String get transferFromAnotherDevice => 'Transfer from another device'; + + @override + String get tryToSendAgain => 'Try to send again'; + + @override + String get unavailable => 'Unavailable'; + + @override + String unbannedUser(String username, String targetName) { + return '$username unbanned $targetName'; + } + + @override + String get unblockDevice => 'Unblock Device'; + + @override + String get unknownDevice => 'Unknown device'; + + @override + String get unknownEncryptionAlgorithm => 'Unknown encryption algorithm'; + + @override + String unknownEvent(String type) { + return 'Unknown event \'$type\''; + } + + @override + String get unmuteChat => 'Unmute chat'; + + @override + String get unpin => 'Unpin'; + + @override + String unreadChats(int unreadCount) { + String _temp0 = intl.Intl.pluralLogic( + unreadCount, + locale: localeName, + other: '$unreadCount unread chats', + one: '1 unread chat', + ); + return '$_temp0'; + } + + @override + String userAndOthersAreTyping(String username, int count) { + return '$username and $count others are typing…'; + } + + @override + String userAndUserAreTyping(String username, String username2) { + return '$username and $username2 are typing…'; + } + + @override + String userIsTyping(String username) { + return '$username is typing…'; + } + + @override + String userLeftTheChat(String username) { + return '🚪 $username left the chat'; + } + + @override + String get username => 'Username'; + + @override + String userSentUnknownEvent(String username, String type) { + return '$username sent a $type event'; + } + + @override + String get unverified => 'Unverified'; + + @override + String get verified => 'Verified'; + + @override + String get verify => 'Verify'; + + @override + String get verifyStart => 'Start Verification'; + + @override + String get verifySuccess => 'You successfully verified!'; + + @override + String get verifyTitle => 'Verifying other account'; + + @override + String get videoCall => 'Video call'; + + @override + String get visibilityOfTheChatHistory => 'Visibility of the chat history'; + + @override + String get visibleForAllParticipants => 'Visible for all participants'; + + @override + String get visibleForEveryone => 'Visible for everyone'; + + @override + String get voiceMessage => 'Voice message'; + + @override + String get waitingPartnerAcceptRequest => + 'Waiting for partner to accept the request…'; + + @override + String get waitingPartnerEmoji => 'Waiting for partner to accept the emoji…'; + + @override + String get waitingPartnerNumbers => + 'Waiting for partner to accept the numbers…'; + + @override + String get wallpaper => 'Wallpaper:'; + + @override + String get warning => 'Warning!'; + + @override + String get weSentYouAnEmail => 'We sent you an email'; + + @override + String get whoCanPerformWhichAction => 'Who can perform which action'; + + @override + String get whoIsAllowedToJoinThisGroup => 'Who is allowed to join this group'; + + @override + String get whyDoYouWantToReportThis => 'Why do you want to report this?'; + + @override + String get wipeChatBackup => + 'Wipe your chat backup to create a new recovery key?'; + + @override + String get withTheseAddressesRecoveryDescription => + 'With these addresses you can recover your password.'; + + @override + String get writeAMessage => 'Write a message…'; + + @override + String get yes => 'Yes'; + + @override + String get you => 'You'; + + @override + String get youAreNoLongerParticipatingInThisChat => + 'You are no longer participating in this chat'; + + @override + String get youHaveBeenBannedFromThisChat => + 'You have been banned from this chat'; + + @override + String get yourPublicKey => 'Your public key'; + + @override + String get messageInfo => 'Message info'; + + @override + String get time => 'Time'; + + @override + String get messageType => 'Message Type'; + + @override + String get sender => 'Sender'; + + @override + String get openGallery => 'Open gallery'; + + @override + String get removeFromSpace => 'Remove from space'; + + @override + String get addToSpaceDescription => 'Select a space to add this chat to it.'; + + @override + String get start => 'Start'; + + @override + String get pleaseEnterRecoveryKeyDescription => + 'To unlock your old messages, please enter your recovery key that has been generated in a previous session. Your recovery key is NOT your password.'; + + @override + String get publish => 'Publish'; + + @override + String videoWithSize(String size) { + return 'Video ($size)'; + } + + @override + String get openChat => 'Open Chat'; + + @override + String get markAsRead => 'Mark as read'; + + @override + String get reportUser => 'Report user'; + + @override + String get dismiss => 'Dismiss'; + + @override + String reactedWith(String sender, String reaction) { + return '$sender reacted with $reaction'; + } + + @override + String get pinMessage => 'Pin to room'; + + @override + String get confirmEventUnpin => + 'Are you sure to permanently unpin the event?'; + + @override + String get emojis => 'Emojis'; + + @override + String get placeCall => 'Place call'; + + @override + String get voiceCall => 'Voice call'; + + @override + String get unsupportedAndroidVersion => 'Unsupported Android version'; + + @override + String get unsupportedAndroidVersionLong => + 'This feature requires a newer Android version. Please check for updates or Lineage OS support.'; + + @override + String get videoCallsBetaWarning => + 'Please note that video calls are currently in beta. They might not work as expected or work at all on all platforms.'; + + @override + String get experimentalVideoCalls => 'Experimental video calls'; + + @override + String get emailOrUsername => 'Email or username'; + + @override + String get indexedDbErrorTitle => 'Private mode issues'; + + @override + String get indexedDbErrorLong => + 'The message storage is unfortunately not enabled in private mode by default.\nPlease visit\n - about:config\n - set dom.indexedDB.privateBrowsing.enabled to true\nOtherwise, it is not possible to run Extera.'; + + @override + String switchToAccount(String number) { + return 'Switch to account $number'; + } + + @override + String get nextAccount => 'Next account'; + + @override + String get previousAccount => 'Previous account'; + + @override + String get addWidget => 'Add widget'; + + @override + String get widgetVideo => 'Video'; + + @override + String get widgetEtherpad => 'Text note'; + + @override + String get widgetJitsi => 'Jitsi Meet'; + + @override + String get widgetCustom => 'Custom'; + + @override + String get widgetName => 'Name'; + + @override + String get widgetUrlError => 'This is not a valid URL.'; + + @override + String get widgetNameError => 'Please provide a display name.'; + + @override + String get errorAddingWidget => 'Error adding the widget.'; + + @override + String get youRejectedTheInvitation => 'You rejected the invitation'; + + @override + String get youJoinedTheChat => 'You joined the chat'; + + @override + String get youAcceptedTheInvitation => '👍 You accepted the invitation'; + + @override + String youBannedUser(String user) { + return 'You banned $user'; + } + + @override + String youHaveWithdrawnTheInvitationFor(String user) { + return 'You have withdrawn the invitation for $user'; + } + + @override + String youInvitedToBy(String alias) { + return '📩 You have been invited via link to:\n$alias'; + } + + @override + String youInvitedBy(String user) { + return '📩 You have been invited by $user'; + } + + @override + String invitedBy(String user) { + return '📩 Invited by $user'; + } + + @override + String youInvitedUser(String user) { + return '📩 You invited $user'; + } + + @override + String youKicked(String user) { + return '👞 You kicked $user'; + } + + @override + String youKickedAndBanned(String user) { + return '🙅 You kicked and banned $user'; + } + + @override + String youUnbannedUser(String user) { + return 'You unbanned $user'; + } + + @override + String hasKnocked(String user) { + return '🚪 $user has knocked'; + } + + @override + String get usersMustKnock => 'Users must knock'; + + @override + String get noOneCanJoin => 'No one can join'; + + @override + String userWouldLikeToChangeTheChat(String user) { + return '$user would like to join the chat.'; + } + + @override + String get noPublicLinkHasBeenCreatedYet => + 'No public link has been created yet'; + + @override + String get knock => 'Knock'; + + @override + String get users => 'Users'; + + @override + String get unlockOldMessages => 'Unlock old messages'; + + @override + String get storeInSecureStorageDescription => + 'Store the recovery key in the secure storage of this device.'; + + @override + String get saveKeyManuallyDescription => + 'Save this key manually by triggering the system share dialog or clipboard.'; + + @override + String get storeInAndroidKeystore => 'Store in Android KeyStore'; + + @override + String get storeInAppleKeyChain => 'Store in Apple KeyChain'; + + @override + String get storeSecurlyOnThisDevice => 'Store securely on this device'; + + @override + String countFiles(int count) { + return '$count files'; + } + + @override + String get user => 'User'; + + @override + String get custom => 'Custom'; + + @override + String get foregroundServiceRunning => + 'This notification appears when the foreground service is running.'; + + @override + String get screenSharingTitle => 'screen sharing'; + + @override + String get screenSharingDetail => 'You are sharing your screen in Extera'; + + @override + String get callingPermissions => 'Calling permissions'; + + @override + String get callingAccount => 'Calling account'; + + @override + String get callingAccountDetails => + 'Allows Extera to use the native android dialer app.'; + + @override + String get appearOnTop => 'Appear on top'; + + @override + String get appearOnTopDetails => + 'Allows the app to appear on top (not needed if you already have Fluffychat setup as a calling account)'; + + @override + String get otherCallingPermissions => + 'Microphone, camera and other Extera permissions'; + + @override + String get whyIsThisMessageEncrypted => 'Why is this message unreadable?'; + + @override + String get noKeyForThisMessage => + 'This can happen if the message was sent before you have signed in to your account at this device.\n\nIt is also possible that the sender has blocked your device or something went wrong with the internet connection.\n\nAre you able to read the message on another session? Then you can transfer the message from it! Go to Settings > Devices and make sure that your devices have verified each other. When you open the room the next time and both sessions are in the foreground, the keys will be transmitted automatically.\n\nDo you not want to lose the keys when logging out or switching devices? Make sure that you have enabled the chat backup in the settings.'; + + @override + String get newGroup => 'New group'; + + @override + String get newSpace => 'New space'; + + @override + String get enterSpace => 'Enter space'; + + @override + String get enterRoom => 'Enter room'; + + @override + String get allSpaces => 'All spaces'; + + @override + String numChats(String number) { + return '$number chats'; + } + + @override + String get hideUnimportantStateEvents => 'Hide unimportant state events'; + + @override + String get hidePresences => 'Hide Status List?'; + + @override + String get doNotShowAgain => 'Do not show again'; + + @override + String wasDirectChatDisplayName(String oldDisplayName) { + return 'Empty chat (was $oldDisplayName)'; + } + + @override + String get newSpaceDescription => + 'Spaces allows you to consolidate your chats and build private or public communities.'; + + @override + String get encryptThisChat => 'Encrypt this chat'; + + @override + String get disableEncryptionWarning => + 'For security reasons you can not disable encryption in a chat, where it has been enabled before.'; + + @override + String get sorryThatsNotPossible => 'Sorry... that is not possible'; + + @override + String get deviceKeys => 'Device keys:'; + + @override + String get reopenChat => 'Reopen chat'; + + @override + String get noBackupWarning => + 'Warning! Without enabling chat backup, you will lose access to your encrypted messages. It is highly recommended to enable the chat backup first before logging out.'; + + @override + String get noOtherDevicesFound => 'No other devices found'; + + @override + String fileIsTooBigForServer(String max) { + return 'Unable to send! The server only supports attachments up to $max.'; + } + + @override + String fileHasBeenSavedAt(String path) { + return 'File has been saved at $path'; + } + + @override + String get jumpToLastReadMessage => 'Jump to last read message'; + + @override + String get readUpToHere => 'Read up to here'; + + @override + String get jump => 'Jump'; + + @override + String get openLinkInBrowser => 'Open link in browser'; + + @override + String get reportErrorDescription => + '😭 Oh no. Something went wrong. If you want, you can report this bug to the developers.'; + + @override + String get report => 'Report'; + + @override + String get signInWithPassword => 'Sign in with password'; + + @override + String get pleaseTryAgainLaterOrChooseDifferentServer => + 'Please try again later or choose a different server.'; + + @override + String signInWith(String provider) { + return 'Sign in with $provider'; + } + + @override + String get profileNotFound => + 'The user could not be found on the server. Maybe there is a connection problem or the user doesn\'t exist.'; + + @override + String get setTheme => 'Set theme:'; + + @override + String get setColorTheme => 'Set color theme:'; + + @override + String get invite => 'Invite'; + + @override + String get inviteGroupChat => '📨 Invite group chat'; + + @override + String get invitePrivateChat => '📨 Invite private chat'; + + @override + String get invalidInput => 'Invalid input!'; + + @override + String wrongPinEntered(int seconds) { + return 'Wrong pin entered! Try again in $seconds seconds...'; + } + + @override + String get pleaseEnterANumber => 'Please enter a number greater than 0'; + + @override + String get archiveRoomDescription => + 'The chat will be moved to the archive. Other users will be able to see that you have left the chat.'; + + @override + String get roomUpgradeDescription => + 'The chat will then be recreated with the new room version. All participants will be notified that they need to switch to the new chat. You can find out more about room versions at https://spec.matrix.org/latest/rooms/'; + + @override + String get removeDevicesDescription => + 'You will be logged out of this device and will no longer be able to receive messages.'; + + @override + String get banUserDescription => + 'The user will be banned from the chat and will not be able to enter the chat again until they are unbanned.'; + + @override + String get unbanUserDescription => + 'The user will be able to enter the chat again if they try.'; + + @override + String get kickUserDescription => + 'The user is kicked out of the chat but not banned. In public chats, the user can rejoin at any time.'; + + @override + String get makeAdminDescription => + 'Once you make this user admin, you may not be able to undo this as they will then have the same permissions as you.'; + + @override + String get pushNotificationsNotAvailable => + 'Push notifications not available'; + + @override + String get learnMore => 'Learn more'; + + @override + String get yourGlobalUserIdIs => 'Your global user-ID is: '; + + @override + String noUsersFoundWithQuery(String query) { + return 'Unfortunately no user could be found with \"$query\". Please check whether you made a typo.'; + } + + @override + String get knocking => 'Knocking'; + + @override + String chatCanBeDiscoveredViaSearchOnServer(String server) { + return 'Chat can be discovered via the search on $server'; + } + + @override + String get searchChatsRooms => 'Search for #chats, @users...'; + + @override + String get nothingFound => 'Nothing found...'; + + @override + String get groupName => 'Group name'; + + @override + String get createGroupAndInviteUsers => 'Create a group and invite users'; + + @override + String get groupCanBeFoundViaSearch => 'Group can be found via search'; + + @override + String get wrongRecoveryKey => + 'Sorry... this does not seem to be the correct recovery key.'; + + @override + String get startConversation => 'Start conversation'; + + @override + String get commandHint_sendraw => 'Send raw json'; + + @override + String get databaseMigrationTitle => 'Database is optimized'; + + @override + String get databaseMigrationBody => 'Please wait. This may take a moment.'; + + @override + String get leaveEmptyToClearStatus => 'Leave empty to clear your status.'; + + @override + String get select => 'Select'; + + @override + String get searchForUsers => 'Search for @users...'; + + @override + String get pleaseEnterYourCurrentPassword => + 'Please enter your current password'; + + @override + String get newPassword => 'New password'; + + @override + String get pleaseChooseAStrongPassword => 'Please choose a strong password'; + + @override + String get passwordsDoNotMatch => 'Passwords do not match'; + + @override + String get passwordIsWrong => 'Your entered password is wrong'; + + @override + String get publicLink => 'Public link'; + + @override + String get publicChatAddresses => 'Public chat addresses'; + + @override + String get createNewAddress => 'Create new address'; + + @override + String get joinSpace => 'Join space'; + + @override + String get publicSpaces => 'Public spaces'; + + @override + String get addChatOrSubSpace => 'Add chat or sub space'; + + @override + String get subspace => 'Subspace'; + + @override + String get decline => 'Decline'; + + @override + String get thisDevice => 'This device:'; + + @override + String get initAppError => 'An error occured while init the app'; + + @override + String get userRole => 'User role'; + + @override + String minimumPowerLevel(String level) { + return '$level is the minimum power level.'; + } + + @override + String searchIn(String chat) { + return 'Search in chat \"$chat\"...'; + } + + @override + String get searchMore => 'Search more...'; + + @override + String get gallery => 'Gallery'; + + @override + String get files => 'Files'; + + @override + String databaseBuildErrorBody(String url, String error) { + return 'Unable to build the SQlite database. The app tries to use the legacy database for now. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String sessionLostBody(String url, String error) { + return 'Your session is lost. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String restoreSessionBody(String url, String error) { + return 'The app now tries to restore your session from the backup. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String forwardMessageTo(String roomName) { + return 'Forward message to $roomName?'; + } + + @override + String get sendReadReceipts => 'Send read receipts'; + + @override + String get sendTypingNotificationsDescription => + 'Other participants in a chat can see when you are typing a new message.'; + + @override + String get sendReadReceiptsDescription => + 'Other participants in a chat can see when you have read a message.'; + + @override + String get formattedMessages => 'Formatted messages'; + + @override + String get formattedMessagesDescription => + 'Display rich message content like bold text using markdown.'; + + @override + String get verifyOtherUser => '🔐 Verify other user'; + + @override + String get verifyOtherUserDescription => + 'If you verify another user, you can be sure that you know who you are really writing to. 💪\n\nWhen you start a verification, you and the other user will see a popup in the app. There you will then see a series of emojis or numbers that you have to compare with each other.\n\nThe best way to do this is to meet up or start a video call. 👭'; + + @override + String get verifyOtherDevice => '🔐 Verify other device'; + + @override + String get verifyOtherDeviceDescription => + 'When you verify another device, those devices can exchange keys, increasing your overall security. 💪 When you start a verification, a popup will appear in the app on both devices. There you will then see a series of emojis or numbers that you have to compare with each other. It\'s best to have both devices handy before you start the verification. 🤳'; + + @override + String acceptedKeyVerification(String sender) { + return '$sender accepted key verification'; + } + + @override + String canceledKeyVerification(String sender) { + return '$sender canceled key verification'; + } + + @override + String completedKeyVerification(String sender) { + return '$sender completed key verification'; + } + + @override + String isReadyForKeyVerification(String sender) { + return '$sender is ready for key verification'; + } + + @override + String requestedKeyVerification(String sender) { + return '$sender requested key verification'; + } + + @override + String startedKeyVerification(String sender) { + return '$sender started key verification'; + } + + @override + String get transparent => 'Transparent'; + + @override + String get incomingMessages => 'Incoming messages'; + + @override + String get stickers => 'Stickers'; + + @override + String get discover => 'Discover'; + + @override + String get commandHint_ignore => 'Ignore the given matrix ID'; + + @override + String get commandHint_unignore => 'Unignore the given matrix ID'; + + @override + String unreadChatsInApp(String appname, String unread) { + return '$appname: $unread unread chats'; + } + + @override + String get noDatabaseEncryption => + 'Database encryption is not supported on this platform'; + + @override + String thereAreCountUsersBlocked(Object count) { + return 'Right now there are $count users blocked.'; + } + + @override + String get restricted => 'Restricted'; + + @override + String get knockRestricted => 'Knock restricted'; + + @override + String goToSpace(Object space) { + return 'Go to space: $space'; + } + + @override + String get markAsUnread => 'Mark as unread'; + + @override + String userLevel(int level) { + return '$level - User'; + } + + @override + String moderatorLevel(int level) { + return '$level - Moderator'; + } + + @override + String adminLevel(int level) { + return '$level - Admin'; + } + + @override + String get changeGeneralChatSettings => 'Change general chat settings'; + + @override + String get inviteOtherUsers => 'Invite other users to this chat'; + + @override + String get changeTheChatPermissions => 'Change the chat permissions'; + + @override + String get changeTheVisibilityOfChatHistory => + 'Change the visibility of the chat history'; + + @override + String get changeTheCanonicalRoomAlias => + 'Change the main public chat address'; + + @override + String get sendRoomNotifications => 'Send a @room notifications'; + + @override + String get changeTheDescriptionOfTheGroup => + 'Change the description of the chat'; + + @override + String get chatPermissionsDescription => + 'Define which power level is necessary for certain actions in this chat. The power levels 0, 50 and 100 are usually representing users, moderators and admins, but any gradation is possible.'; + + @override + String updateInstalled(String version) { + return '🎉 Update $version installed!'; + } + + @override + String get changelog => 'Changelog'; + + @override + String get sendCanceled => 'Sending canceled'; + + @override + String get loginWithMatrixId => 'Login with Matrix-ID'; + + @override + String get discoverHomeservers => 'Discover homeservers'; + + @override + String get whatIsAHomeserver => 'What is a homeserver?'; + + @override + String get homeserverDescription => + 'All your data is stored on the homeserver, just like an email provider. You can choose which homeserver you want to use, while you can still communicate with everyone. Learn more at at https://matrix.org.'; + + @override + String get doesNotSeemToBeAValidHomeserver => + 'Doesn\'t seem to be a compatible homeserver. Wrong URL?'; + + @override + String get calculatingFileSize => 'Calculating file size...'; + + @override + String get prepareSendingAttachment => 'Prepare sending attachment...'; + + @override + String get sendingAttachment => 'Sending attachment...'; + + @override + String get generatingVideoThumbnail => 'Generating video thumbnail...'; + + @override + String get compressVideo => 'Compressing video...'; + + @override + String sendingAttachmentCountOfCount(int index, int length) { + return 'Sending attachment $index of $length...'; + } + + @override + String serverLimitReached(int seconds) { + return 'Server limit reached! Waiting $seconds seconds...'; + } + + @override + String get oneOfYourDevicesIsNotVerified => + 'One of your devices is not verified'; + + @override + String get noticeChatBackupDeviceVerification => + 'Note: When you connect all your devices to the chat backup, they are automatically verified.'; + + @override + String get continueText => 'Continue'; + + @override + String get welcomeText => + 'Hey Hey 👋 This is Extera. You can sign in to any homeserver, which is compatible with https://matrix.org. And then chat with anyone. It\'s a huge decentralized messaging network!'; + + @override + String get blur => 'Blur:'; + + @override + String get opacity => 'Opacity:'; + + @override + String get setWallpaper => 'Set wallpaper'; + + @override + String get manageAccount => 'Manage account'; + + @override + String get noContactInformationProvided => + 'Server does not provide any valid contact information'; + + @override + String get contactServerAdmin => 'Contact server admin'; + + @override + String get contactServerSecurity => 'Contact server security'; + + @override + String get supportPage => 'Support page'; + + @override + String get serverInformation => 'Server information:'; + + @override + String get name => 'Name'; + + @override + String get version => 'Version'; + + @override + String get website => 'Website'; + + @override + String get compress => 'Compress'; + + @override + String get boldText => 'Bold text'; + + @override + String get italicText => 'Italic text'; + + @override + String get strikeThrough => 'Strikethrough'; + + @override + String get pleaseFillOut => 'Please fill out'; + + @override + String get invalidUrl => 'Invalid url'; + + @override + String get addLink => 'Add link'; + + @override + String get unableToJoinChat => + 'Unable to join chat. Maybe the other party has already closed the conversation.'; + + @override + String get previous => 'Previous'; + + @override + String get otherPartyNotLoggedIn => + 'The other party is currently not logged in and therefore cannot receive messages!'; + + @override + String appWantsToUseForLogin(String server) { + return 'Use \'$server\' to log in'; + } + + @override + String get appWantsToUseForLoginDescription => + 'You hereby allow the app and website to share information about you.'; + + @override + String get open => 'Open'; + + @override + String get waitingForServer => 'Waiting for server...'; + + @override + String get appIntroduction => + 'Extera lets you chat with your friends across different messengers. Learn more at https://matrix.org or just tap *Continue*.'; + + @override + String get newChatRequest => '📩 New chat request'; + + @override + String get contentNotificationSettings => 'Content notification settings'; + + @override + String get generalNotificationSettings => 'General notification settings'; + + @override + String get roomNotificationSettings => 'Room notification settings'; + + @override + String get userSpecificNotificationSettings => + 'User specific notification settings'; + + @override + String get otherNotificationSettings => 'Other notification settings'; + + @override + String get notificationRuleContainsUserName => 'Contains User Name'; + + @override + String get notificationRuleContainsUserNameDescription => + 'Notifies the user when a message contains their username.'; + + @override + String get notificationRuleMaster => 'Mute all notifications'; + + @override + String get notificationRuleMasterDescription => + 'Overrides all other rules and disables all notifications.'; + + @override + String get notificationRuleSuppressNotices => 'Suppress Automated Messages'; + + @override + String get notificationRuleSuppressNoticesDescription => + 'Suppresses notifications from automated clients like bots.'; + + @override + String get notificationRuleInviteForMe => 'Invite for Me'; + + @override + String get notificationRuleInviteForMeDescription => + 'Notifies the user when they are invited to a room.'; + + @override + String get notificationRuleMemberEvent => 'Member Event'; + + @override + String get notificationRuleMemberEventDescription => + 'Suppresses notifications for membership events.'; + + @override + String get notificationRuleIsUserMention => 'User Mention'; + + @override + String get notificationRuleIsUserMentionDescription => + 'Notifies the user when they are directly mentioned in a message.'; + + @override + String get notificationRuleContainsDisplayName => 'Contains Display Name'; + + @override + String get notificationRuleContainsDisplayNameDescription => + 'Notifies the user when a message contains their display name.'; + + @override + String get notificationRuleIsRoomMention => 'Room Mention'; + + @override + String get notificationRuleIsRoomMentionDescription => + 'Notifies the user when there is a room mention.'; + + @override + String get notificationRuleRoomnotif => 'Room Notification'; + + @override + String get notificationRuleRoomnotifDescription => + 'Notifies the user when a message contains \'@room\'.'; + + @override + String get notificationRuleTombstone => 'Tombstone'; + + @override + String get notificationRuleTombstoneDescription => + 'Notifies the user about room deactivation messages.'; + + @override + String get notificationRuleReaction => 'Reaction'; + + @override + String get notificationRuleReactionDescription => + 'Suppresses notifications for reactions.'; + + @override + String get notificationRuleRoomServerAcl => 'Room Server ACL'; + + @override + String get notificationRuleRoomServerAclDescription => + 'Suppresses notifications for room server access control lists (ACL).'; + + @override + String get notificationRuleSuppressEdits => 'Suppress Edits'; + + @override + String get notificationRuleSuppressEditsDescription => + 'Suppresses notifications for edited messages.'; + + @override + String get notificationRuleCall => 'Call'; + + @override + String get notificationRuleCallDescription => + 'Notifies the user about calls.'; + + @override + String get notificationRuleEncryptedRoomOneToOne => + 'Encrypted Room One-to-One'; + + @override + String get notificationRuleEncryptedRoomOneToOneDescription => + 'Notifies the user about messages in encrypted one-to-one rooms.'; + + @override + String get notificationRuleRoomOneToOne => 'Room One-to-One'; + + @override + String get notificationRuleRoomOneToOneDescription => + 'Notifies the user about messages in one-to-one rooms.'; + + @override + String get notificationRuleMessage => 'Message'; + + @override + String get notificationRuleMessageDescription => + 'Notifies the user about general messages.'; + + @override + String get notificationRuleEncrypted => 'Encrypted'; + + @override + String get notificationRuleEncryptedDescription => + 'Notifies the user about messages in encrypted rooms.'; + + @override + String get notificationRuleJitsi => 'Jitsi'; + + @override + String get notificationRuleJitsiDescription => + 'Notifies the user about Jitsi widget events.'; + + @override + String get notificationRuleServerAcl => 'Suppress Server ACL Events'; + + @override + String get notificationRuleServerAclDescription => + 'Suppresses notifications for Server ACL events.'; + + @override + String unknownPushRule(String rule) { + return 'Unknown push rule \'$rule\''; + } + + @override + String get deletePushRuleCanNotBeUndone => + 'If you delete this notification setting, this can not be undone.'; + + @override + String get more => 'More'; + + @override + String get shareKeysWith => 'Share keys with...'; + + @override + String get shareKeysWithDescription => + 'Which devices should be trusted so that they can read along your messages in encrypted chats?'; + + @override + String get allDevices => 'All devices'; + + @override + String get crossVerifiedDevicesIfEnabled => + 'Cross verified devices if enabled'; + + @override + String get crossVerifiedDevices => 'Cross verified devices'; + + @override + String get verifiedDevicesOnly => 'Verified devices only'; + + @override + String get takeAPhoto => 'Take a photo'; + + @override + String get recordAVideo => 'Record a video'; + + @override + String get optionalMessage => '(Optional) message...'; + + @override + String get notSupportedOnThisDevice => 'Not supported on this device'; + + @override + String get enterNewChat => 'Enter new chat'; + + @override + String get approve => 'Approve'; + + @override + String get youHaveKnocked => 'You have knocked'; + + @override + String get pleaseWaitUntilInvited => + 'Please wait now, until someone from the room invites you.'; +} diff --git a/lib/generated/l10n/l10n_ca.dart b/lib/generated/l10n/l10n_ca.dart new file mode 100644 index 0000000..a1bd311 --- /dev/null +++ b/lib/generated/l10n/l10n_ca.dart @@ -0,0 +1,2773 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'l10n.dart'; + +// ignore_for_file: type=lint + +/// The translations for Catalan Valencian (`ca`). +class L10nCa extends L10n { + L10nCa([String locale = 'ca']) : super(locale); + + @override + String get noSendPermission => 'You can\'t send messages here'; + + @override + String get alwaysUse24HourFormat => 'true'; + + @override + String get repeatPassword => 'Repetiu la contrasenya'; + + @override + String get notAnImage => 'No és un arxiu d\'image.'; + + @override + String get setCustomPermissionLevel => 'Set custom permission level'; + + @override + String get setPermissionsLevelDescription => + 'Please choose a predefined role below or enter a custom permission level between 0 and 100.'; + + @override + String get ignoreUser => 'Ignore user'; + + @override + String get normalUser => 'Normal user'; + + @override + String get remove => 'Elimina'; + + @override + String get importNow => 'Importa-ho ara'; + + @override + String get importEmojis => 'Importa emojis'; + + @override + String get importFromZipFile => 'Importa des d\'un arxiu zip'; + + @override + String get exportEmotePack => 'Exporta com un pack Emote en .zip'; + + @override + String get replace => 'Reemplaça'; + + @override + String get about => 'Quant a'; + + @override + String aboutHomeserver(String homeserver) { + return 'Quant a $homeserver'; + } + + @override + String get accept => 'Accepta'; + + @override + String acceptedTheInvitation(String username) { + return '👍 $username ha acceptat la invitació'; + } + + @override + String get account => 'Compte'; + + @override + String activatedEndToEndEncryption(String username) { + return '🔐 $username ha activat el xifratge d’extrem a extrem'; + } + + @override + String get addEmail => 'Afegeix una adreça electrònica'; + + @override + String get confirmMatrixId => + 'Confirma la teva ID de Matrix per poder esborrar el compte.'; + + @override + String supposedMxid(String mxid) { + return 'Això hauria de ser $mxid'; + } + + @override + String get addChatDescription => 'Afegeix una descripció al xat...'; + + @override + String get addToSpace => 'Afegeix a un espai'; + + @override + String get admin => 'Administració'; + + @override + String get alias => 'àlies'; + + @override + String get all => 'Tot'; + + @override + String get allChats => 'Tots els xats'; + + @override + String get commandHint_roomupgrade => + 'Upgrade this room to the given room version'; + + @override + String get commandHint_googly => 'Envia uns ulls curiosos'; + + @override + String get commandHint_cuddle => 'Envia una carícia'; + + @override + String get commandHint_hug => 'Envia una abraçada'; + + @override + String googlyEyesContent(String senderName) { + return '$senderName t\'ha enviat un parell d\'ulls'; + } + + @override + String cuddleContent(String senderName) { + return '$senderName et fa una carícia'; + } + + @override + String hugContent(String senderName) { + return '$senderName t\'abraça'; + } + + @override + String answeredTheCall(String senderName) { + return '$senderName ha respost a la trucada'; + } + + @override + String get anyoneCanJoin => 'Qualsevol pot unir-se'; + + @override + String get appLock => 'Blocatge de l’aplicació'; + + @override + String get appLockDescription => + 'Bloca l\'app amb un pin quan no la facis servir'; + + @override + String get archive => 'Arxiu'; + + @override + String get areGuestsAllowedToJoin => 'Es pot entrar al xat com a convidadi'; + + @override + String get areYouSure => 'N’esteu seguri?'; + + @override + String get areYouSureYouWantToLogout => + 'Segur que voleu finalitzar la sessió?'; + + @override + String get askSSSSSign => + 'Per a poder donar accés a l’altra persona, introduïu la frase de seguretat o clau de recuperació.'; + + @override + String askVerificationRequest(String username) { + return 'Voleu acceptar aquesta sol·licitud de verificació de: $username?'; + } + + @override + String get autoplayImages => + 'Reprodueix automàticament enganxines i emoticones animades'; + + @override + String badServerLoginTypesException(String serverVersions, + String supportedVersions, Object suportedVersions) { + return 'El servidor admet els inicis de sessió:\n$serverVersions\nPerò l\'aplicació només admet:\n$supportedVersions'; + } + + @override + String get sendTypingNotifications => 'Envia notificacions d\'escriptura'; + + @override + String get swipeRightToLeftToReply => + 'Llisca de dreta esquerra per respondre'; + + @override + String get sendOnEnter => 'Envia en prémer Retorn'; + + @override + String badServerVersionsException(String serverVersions, + String supportedVersions, Object serverVerions, Object suportedVersions) { + return 'Aquest servidor suporta aquestes versions de Matrix:\n$serverVersions\nPerò aquesta aplicación només és compatible amb $supportedVersions'; + } + + @override + String countChatsAndCountParticipants(int chats, int participants) { + return '$chats xats i $participants participants'; + } + + @override + String get noMoreChatsFound => 'No hi ha més xats...'; + + @override + String get noChatsFoundHere => + 'Encara no hi ha xats. Obre una conversa amb algú picant al botó de sota. ⤵️'; + + @override + String get joinedChats => 'Xats on has entrat'; + + @override + String get unread => 'Sense llegir'; + + @override + String get space => 'Espai'; + + @override + String get spaces => 'Espais'; + + @override + String get banFromChat => 'Veta del xat'; + + @override + String get banned => 'Vetadi'; + + @override + String bannedUser(String username, String targetName) { + return '$username ha vetat a $targetName'; + } + + @override + String get blockDevice => 'Bloca el dispositiu'; + + @override + String get blocked => 'Blocat'; + + @override + String get botMessages => 'Missatges del bot'; + + @override + String get cancel => 'Cancel·la'; + + @override + String cantOpenUri(String uri) { + return 'No es pot obrir l’URI $uri'; + } + + @override + String get changeDeviceName => 'Canvia el nom del dispositiu'; + + @override + String changedTheChatAvatar(String username) { + return '$username ha canviat la imatge del xat'; + } + + @override + String changedTheChatDescriptionTo(String username, String description) { + return '$username ha canviat la descripció del xat a: \'$description\''; + } + + @override + String changedTheChatNameTo(String username, String chatname) { + return '$username ha canviat el nom del xat a: \'$chatname\''; + } + + @override + String changedTheChatPermissions(String username) { + return '$username ha canviat els permisos del xat'; + } + + @override + String changedTheDisplaynameTo(String username, String displayname) { + return '$username ha canviat el seu àlies a: \'$displayname\''; + } + + @override + String changedTheGuestAccessRules(String username) { + return '$username ha canviat les normes d’accés dels convidats'; + } + + @override + String changedTheGuestAccessRulesTo(String username, String rules) { + return '$username ha canviat les normes d’accés dels convidats a: $rules'; + } + + @override + String changedTheHistoryVisibility(String username) { + return '$username ha canviat la visibilitat de l’historial'; + } + + @override + String changedTheHistoryVisibilityTo(String username, String rules) { + return '$username ha canviat la visibilitat de l’historial a: $rules'; + } + + @override + String changedTheJoinRules(String username) { + return '$username ha canviat les normes d’unió'; + } + + @override + String changedTheJoinRulesTo(String username, String joinRules) { + return '$username ha canviat les normes d’unió a: $joinRules'; + } + + @override + String changedTheProfileAvatar(String username) { + return '$username ha canviat la seva imatge de perfil'; + } + + @override + String changedTheRoomAliases(String username) { + return '$username ha canviat l’àlies de la sala'; + } + + @override + String changedTheRoomInvitationLink(String username) { + return '$username ha canviat l’enllaç per a convidar'; + } + + @override + String get changePassword => 'Canvia la contrasenya'; + + @override + String get changeTheHomeserver => 'Canvia el servidor'; + + @override + String get changeTheme => 'Canvia l’estil'; + + @override + String get changeTheNameOfTheGroup => 'Canvia el nom del grup'; + + @override + String get changeYourAvatar => 'Canvia l’avatar'; + + @override + String get channelCorruptedDecryptError => 'El xifratge s’ha corromput'; + + @override + String get chat => 'Xat'; + + @override + String get yourChatBackupHasBeenSetUp => + 'S’ha configurat la còpia de seguretat del xat.'; + + @override + String get chatBackup => 'Còpia de seguretat del xat'; + + @override + String get chatBackupDescription => + 'Els teus xats antics estan protegits amb una clau de recuperació. Assegureu-vos de no perdre-la.'; + + @override + String get chatDetails => 'Detalls del xat'; + + @override + String get chatHasBeenAddedToThisSpace => 'El xat s’ha afegit a aquest espai'; + + @override + String get chats => 'Xats'; + + @override + String get chooseAStrongPassword => 'Trieu una contrasenya forta'; + + @override + String get clearArchive => 'Neteja l’arxiu'; + + @override + String get close => 'Tanca'; + + @override + String get commandHint_markasdm => + 'Marca com a conversa directa la sala amb aquesta ID de Matrix'; + + @override + String get commandHint_markasgroup => 'Marca com un grup'; + + @override + String get commandHint_ban => 'Veta uni usuàriï d\'aquesta sala'; + + @override + String get commandHint_clearcache => 'Neteja la memòria cau'; + + @override + String get commandHint_create => + 'Crea un xat de grup buit\nUsa --no-encryption per desactivar l\'encriptatge'; + + @override + String get commandHint_discardsession => 'Descarta la sessió'; + + @override + String get commandHint_dm => + 'Inicia un xat directe\nUsa --no-encryption per desactivar l\'encriptatge'; + + @override + String get commandHint_html => 'Envia text en format HTML'; + + @override + String get commandHint_invite => 'Convida uni usuàriï a aquesta sala'; + + @override + String get commandHint_join => 'Uneix-te a la sala'; + + @override + String get commandHint_kick => 'Expulsa uni usuàriï d\'aquesta sala'; + + @override + String get commandHint_leave => 'Abandona aquesta sala'; + + @override + String get commandHint_me => 'Descriviu-vos'; + + @override + String get commandHint_myroomavatar => + 'Establiu la imatge per a aquesta sala (per mxc-uri)'; + + @override + String get commandHint_myroomnick => + 'Estableix el teu àlies per a aquesta sala'; + + @override + String get commandHint_op => + 'Estableix el nivell d\'autoritat d\'uni usuàriï (per defecte: 50)'; + + @override + String get commandHint_plain => 'Envia text sense format'; + + @override + String get commandHint_react => 'Envia una resposta com a reacció'; + + @override + String get commandHint_send => 'Envia text'; + + @override + String get commandHint_unban => + 'Aixeca el veto a aquesti usuàriï per aquesta sala'; + + @override + String get commandInvalid => 'L’ordre no és vàlida'; + + @override + String commandMissing(String command) { + return '$command no és una ordre.'; + } + + @override + String get compareEmojiMatch => 'Compareu aquests emojis'; + + @override + String get compareNumbersMatch => 'Compareu aquests números'; + + @override + String get configureChat => 'Configura el xat'; + + @override + String get confirm => 'Confirma'; + + @override + String get connect => 'Connecta'; + + @override + String get contactHasBeenInvitedToTheGroup => + 'El contacte ha estat convidat al grup'; + + @override + String get containsDisplayName => 'Conté l\'àlies'; + + @override + String get containsUserName => 'Inclou nom d\'usuàriï'; + + @override + String get contentHasBeenReported => + 'El contingut s’ha denunciat als administradors del servidor'; + + @override + String get copiedToClipboard => 'S’ha copiat al porta-retalls'; + + @override + String get copy => 'Copia'; + + @override + String get copyToClipboard => 'Copia al porta-retalls'; + + @override + String couldNotDecryptMessage(String error) { + return 'No s\'ha pogut desxifrar el missatge: $error'; + } + + @override + String countParticipants(int count) { + return '$count participants'; + } + + @override + String get create => 'Crea'; + + @override + String createdTheChat(String username) { + return '💬 $username ha creat el xat'; + } + + @override + String get createGroup => 'Crea un grup'; + + @override + String get createNewSpace => 'Espai nou'; + + @override + String get currentlyActive => 'Actiu actualment'; + + @override + String get darkTheme => 'Fosc'; + + @override + String dateAndTimeOfDay(String date, String timeOfDay) { + return '$date, $timeOfDay'; + } + + @override + String dateWithoutYear(String month, String day) { + return '$day-$month'; + } + + @override + String dateWithYear(String year, String month, String day) { + return '$day-$month-$year'; + } + + @override + String get deactivateAccountWarning => + 'Es desactivarà el vostre compte d’usuàriï. És irreversible! Voleu fer-ho igualment?'; + + @override + String get defaultPermissionLevel => + 'Nivell de permisos per defecte per nous membres'; + + @override + String get delete => 'Suprimeix'; + + @override + String get deleteAccount => 'Suprimeix el compte'; + + @override + String get deleteMessage => 'Suprimeix el missatge'; + + @override + String get device => 'Dispositiu'; + + @override + String get deviceId => 'Id. de dispositiu'; + + @override + String get devices => 'Dispositius'; + + @override + String get directChats => 'Xats directes'; + + @override + String get allRooms => 'Tots els xats de grup'; + + @override + String get displaynameHasBeenChanged => 'Ha canviat l\'àlies'; + + @override + String get downloadFile => 'Baixa el fitxer'; + + @override + String get edit => 'Edita'; + + @override + String get editBlockedServers => 'Edita els servidors bloquejats'; + + @override + String get chatPermissions => 'Permisos del xat'; + + @override + String get editDisplayname => 'Edita l\'àlies'; + + @override + String get editRoomAliases => 'Canvia els àlies de la sala'; + + @override + String get editRoomAvatar => 'Canvia la imatge de la sala'; + + @override + String get emoteExists => 'L\'emoticona ja existeix!'; + + @override + String get emoteInvalid => 'Codi d\'emoticona invàlid!'; + + @override + String get emoteKeyboardNoRecents => + 'Els últims emotes usats apareixeran aquí...'; + + @override + String get emotePacks => 'Paquet d\'emoticones de la sala'; + + @override + String get emoteSettings => 'Paràmetres de les emoticones'; + + @override + String get globalChatId => 'Identificador global de xat'; + + @override + String get accessAndVisibility => 'Accés i visibilitat'; + + @override + String get accessAndVisibilityDescription => + 'Qui pot entrar a aquesta conversa i com pot ser descoberta.'; + + @override + String get calls => 'Trucades'; + + @override + String get customEmojisAndStickers => 'Emojis i stickers propis'; + + @override + String get customEmojisAndStickersBody => + 'Afegeix o comparteix emojis o stickers. Els podràs fer servir en qualsevol conversa.'; + + @override + String get emoteShortcode => 'Codi d\'emoticona'; + + @override + String get emoteWarnNeedToPick => + 'Has de seleccionar un codi d\'emoticona i una imatge!'; + + @override + String get emptyChat => 'Xat buit'; + + @override + String get enableEmotesGlobally => 'Activa el paquet d\'emoticones global'; + + @override + String get enableEncryption => 'Activa el xifratge'; + + @override + String get enableEncryptionWarning => + 'No podreu desactivar el xifratge mai més. N’esteu segur?'; + + @override + String get encrypted => 'Xifrat'; + + @override + String get encryption => 'Xifratge'; + + @override + String get encryptionNotEnabled => 'El xifratge no s’ha activat'; + + @override + String endedTheCall(String senderName) { + return '$senderName ha finalitzat la trucada'; + } + + @override + String get enterAnEmailAddress => 'Introduïu una adreça electrònica'; + + @override + String get homeserver => 'Servidor'; + + @override + String get enterYourHomeserver => 'Introdueix el teu servidor'; + + @override + String errorObtainingLocation(String error) { + return 'S’ha produït un error en obtenir la ubicació: $error'; + } + + @override + String get everythingReady => 'Tot és a punt!'; + + @override + String get extremeOffensive => 'Extremadament ofensiu'; + + @override + String get fileName => 'Nom del fitxer'; + + @override + String get fluffychat => 'FluffyChat'; + + @override + String get fontSize => 'Mida de la lletra'; + + @override + String get forward => 'Reenvia'; + + @override + String get fromJoining => 'Des de la unió'; + + @override + String get fromTheInvitation => 'Des de la invitació'; + + @override + String get goToTheNewRoom => 'Ves a la sala nova'; + + @override + String get group => 'Grup'; + + @override + String get chatDescription => 'Descripció del xat'; + + @override + String get chatDescriptionHasBeenChanged => + 'Ha canviat la descripció del xat'; + + @override + String get groupIsPublic => 'El grup és públic'; + + @override + String get groups => 'Grups'; + + @override + String groupWith(String displayname) { + return 'Grup amb $displayname'; + } + + @override + String get guestsAreForbidden => 'Els convidats no poden unir-se'; + + @override + String get guestsCanJoin => 'Els convidats es poden unir'; + + @override + String hasWithdrawnTheInvitationFor(String username, String targetName) { + return '$username ha retirat la invitació de $targetName'; + } + + @override + String get help => 'Ajuda'; + + @override + String get hideRedactedEvents => 'Amaga els esdeveniments estripats'; + + @override + String get hideRedactedMessages => 'Amaga els missatges estripats'; + + @override + String get hideRedactedMessagesBody => + 'Si algú estripa un missatge, ja no apareixerà a l\'historial de la conversa.'; + + @override + String get hideInvalidOrUnknownMessageFormats => + 'Amaga els missatges que tinguin un format desconegut'; + + @override + String get howOffensiveIsThisContent => 'Com d’ofensiu és aquest contingut?'; + + @override + String get id => 'Id.'; + + @override + String get identity => 'Identitat'; + + @override + String get block => 'Bloca'; + + @override + String get blockedUsers => 'Usuàrïis blocadis'; + + @override + String get blockListDescription => + 'Pots bloquejar usuàrïis que et molestin. No rebràs missatges seus ni invitacions de part seva a cap sala.'; + + @override + String get blockUsername => 'Ignora aquesti usuàrïi'; + + @override + String get iHaveClickedOnLink => 'He fet clic a l\'enllaç'; + + @override + String get incorrectPassphraseOrKey => + 'Frase de seguretat o clau de recuperació incorrecta'; + + @override + String get inoffensive => 'Inofensiu'; + + @override + String get inviteContact => 'Convida contacte'; + + @override + String inviteContactToGroupQuestion(Object contact, Object groupName) { + return 'Vols convidar $contact al xat \"$groupName\"?'; + } + + @override + String inviteContactToGroup(String groupName) { + return 'Convida contacte a $groupName'; + } + + @override + String get noChatDescriptionYet => 'No s\'ha afegit una descripció de xat.'; + + @override + String get tryAgain => 'Torna-ho a provar'; + + @override + String get invalidServerName => 'El nom del servidor és invàlid'; + + @override + String get invited => 'Convidat'; + + @override + String get redactMessageDescription => + 'S\'estriparà el missatge per a totser d\'aquesta conversa. Aquesta acció és irreversible.'; + + @override + String get optionalRedactReason => + '(Opcional) El motiu per estripar el missatge...'; + + @override + String invitedUser(String username, String targetName) { + return '📩 $username ha convidat a $targetName'; + } + + @override + String get invitedUsersOnly => 'Només usuàriïs convidadis'; + + @override + String get inviteForMe => 'Invitació per a mi'; + + @override + String inviteText(String username, String link) { + return '$username t\'ha convidat a FluffyChat.\n1. Visita fluffychat.im i instaŀla l\'app\n2. Registra\'t o inicia sessió\n3. Obre l\'enllaç d\'invitació:\n$link'; + } + + @override + String get isTyping => 'escrivint…'; + + @override + String joinedTheChat(String username) { + return '👋 $username s\'ha unit al xat'; + } + + @override + String get joinRoom => 'Uneix-te a la sala'; + + @override + String kicked(String username, String targetName) { + return '👞 $username ha expulsat a $targetName'; + } + + @override + String kickedAndBanned(String username, String targetName) { + return '🙅 $username ha expulsat i vetat a $targetName'; + } + + @override + String get kickFromChat => 'Expulsa del xat'; + + @override + String lastActiveAgo(String localizedTimeShort) { + return 'Actiu per última vegada: $localizedTimeShort'; + } + + @override + String get leave => 'Abandona'; + + @override + String get leftTheChat => 'Ha marxat del xat'; + + @override + String get license => 'Llicència'; + + @override + String get lightTheme => 'Clar'; + + @override + String loadCountMoreParticipants(int count) { + return 'Carrega $count participants més'; + } + + @override + String get dehydrate => 'Exporta la sessió i neteja el dispositiu'; + + @override + String get dehydrateWarning => + 'Aquesta acció és irreversible. Assegura\'t que deses l\'arxiu de recuperació en un lloc segur.'; + + @override + String get dehydrateTor => 'Usuàrïis de Tor: Exporta la sessió'; + + @override + String get dehydrateTorLong => + 'Per a lis usuàrïis de Tor, es recomana exportar la sessió abans de tancar la finestra.'; + + @override + String get hydrateTor => 'Usuàrïis de Tor: Importa una sessió anterior'; + + @override + String get hydrateTorLong => + 'Que vas exportar la teva última sessió a Tor? La pots importar ara i continuar xatejant.'; + + @override + String get hydrate => 'Restaura un arxiu de recuperació'; + + @override + String get loadingPleaseWait => 'S’està carregant… Espereu.'; + + @override + String get loadMore => 'Carrega’n més…'; + + @override + String get locationDisabledNotice => + 'S’han desactivat els serveis d’ubicació. Activeu-los per a compartir la vostra ubicació.'; + + @override + String get locationPermissionDeniedNotice => + 'S’ha rebutjat el permís d’ubicació. Atorgueu-lo per a poder compartir la vostra ubicació.'; + + @override + String get login => 'Inicia la sessió'; + + @override + String logInTo(String homeserver) { + return 'Inicia sessió a $homeserver'; + } + + @override + String get logout => 'Finalitza la sessió'; + + @override + String get memberChanges => 'Canvis de participants'; + + @override + String get mention => 'Menciona'; + + @override + String get messages => 'Missatges'; + + @override + String get messagesStyle => 'Missatges:'; + + @override + String get moderator => 'Moderador'; + + @override + String get muteChat => 'Silencia el xat'; + + @override + String get needPantalaimonWarning => + 'Tingueu en compte que, ara per ara, us cal el Pantalaimon per a poder utilitzar el xifratge d’extrem a extrem.'; + + @override + String get newChat => 'Xat nou'; + + @override + String get newMessageInFluffyChat => '💬 Missatge nou al FluffyChat'; + + @override + String get newVerificationRequest => 'Nova sol·licitud de verificació!'; + + @override + String get next => 'Següent'; + + @override + String get no => 'No'; + + @override + String get noConnectionToTheServer => 'Sense connexió al servidor'; + + @override + String get noEmotesFound => 'No s’ha trobat cap emoticona. 😕'; + + @override + String get noEncryptionForPublicRooms => + 'Només podreu activar el xifratge quan la sala ja no sigui accessible públicament.'; + + @override + String get noGoogleServicesWarning => + 'Sembla que no teniu els Serveis de Google al telèfon. Això és una bona decisió respecte a la vostra privadesa! Per a rebre notificacions automàtiques del FluffyChat, us recomanem instaŀlar ntfy. Amb ntfy o qualsevol altre proveïdor de Unified Push, pots rebre notificacions de forma segura i lliure. Pots instaŀlar ntfy des de la PlayStore o des de F-Droid.'; + + @override + String noMatrixServer(String server1, String server2) { + return '$server1 no és un servidor de matrix, vols fer servir $server2 ?'; + } + + @override + String get shareInviteLink => 'Comparteix un enllaç d\'invitació'; + + @override + String get scanQrCode => 'Escaneja un codi QR'; + + @override + String get none => 'Cap'; + + @override + String get noPasswordRecoveryDescription => + 'Encara no heu afegit cap mètode per a poder recuperar la contrasenya.'; + + @override + String get noPermission => 'Sense permís'; + + @override + String get noRoomsFound => 'No s’ha trobat cap sala…'; + + @override + String get notifications => 'Notificacions'; + + @override + String get notificationsEnabledForThisAccount => + 'Notificacions activades per a aquest compte'; + + @override + String numUsersTyping(int count) { + return '$count usuàriïs escrivint…'; + } + + @override + String get obtainingLocation => 'S’està obtenint la ubicació…'; + + @override + String get offensive => 'Ofensiu'; + + @override + String get offline => 'Fora de línia'; + + @override + String get ok => 'D\'acord'; + + @override + String get online => 'En línia'; + + @override + String get onlineKeyBackupEnabled => + 'La còpia de seguretat de claus en línia està activada'; + + @override + String get oopsPushError => + 'Ep! Sembla que s\'ha produït un error en configurar les notificacions.'; + + @override + String get oopsSomethingWentWrong => 'Alguna cosa ha anat malament…'; + + @override + String get openAppToReadMessages => + 'Obre l\'aplicació per llegir els missatges'; + + @override + String get openCamera => 'Obre la càmera'; + + @override + String get openVideoCamera => 'Obre la càmera per a fer un vídeo'; + + @override + String get oneClientLoggedOut => + 'Una de les teves aplicacions ha tancat la sessió'; + + @override + String get addAccount => 'Afegeix un compte'; + + @override + String get editBundlesForAccount => 'Edita paquets per aquest compte'; + + @override + String get addToBundle => 'Afegeix al pquet'; + + @override + String get removeFromBundle => 'Esborra del paquet'; + + @override + String get bundleName => 'Nom del paquet'; + + @override + String get enableMultiAccounts => + '(Beta) Activa multi-compte en aquest dispositiu'; + + @override + String get openInMaps => 'Obre als mapes'; + + @override + String get link => 'Enllaç'; + + @override + String get serverRequiresEmail => + 'Aquest servidor necessita validar la teva adreça per registrar-t\'hi.'; + + @override + String get or => 'O'; + + @override + String get participant => 'Participant'; + + @override + String get passphraseOrKey => 'contrasenya o clau de recuperació'; + + @override + String get password => 'Contrasenya'; + + @override + String get passwordForgotten => 'Contrasenya oblidada'; + + @override + String get passwordHasBeenChanged => 'La contrasenya ha canviat'; + + @override + String get hideMemberChangesInPublicChats => + 'Amaga els canvis d\'estat de lis membres a les sales públiques'; + + @override + String get hideMemberChangesInPublicChatsBody => + 'No mostres a l\'històric de conversa de les sales públiques quan algú hi entra o surt. Això facilita la lectura.'; + + @override + String get overview => 'Resum'; + + @override + String get notifyMeFor => 'Nofica\'m que'; + + @override + String get passwordRecoverySettings => 'Recuperació de contrasenya'; + + @override + String get passwordRecovery => 'Recuperació de contrassenya'; + + @override + String get people => 'Gent'; + + @override + String get pickImage => 'Selecciona una imatge'; + + @override + String get pin => 'Fixa'; + + @override + String play(String fileName) { + return 'Reproduir $fileName'; + } + + @override + String get pleaseChoose => 'Escull'; + + @override + String get pleaseChooseAPasscode => 'Tria un codi d\'accés'; + + @override + String get pleaseClickOnLink => + 'Fes clic a l\'enllaç del correu i, després, segueix.'; + + @override + String get pleaseEnter4Digits => + 'Introdueix 4 dígits o deixa-ho buit per desactivar el bloqueig.'; + + @override + String get pleaseEnterRecoveryKey => + 'Introdueix la teva clau de recuperació:'; + + @override + String get pleaseEnterYourPassword => 'Introdueix la teva contrasenya'; + + @override + String get pleaseEnterYourPin => 'Introdueix el teu pin'; + + @override + String get pleaseEnterYourUsername => 'Introdueix el teu nom d\'usuàriï'; + + @override + String get pleaseFollowInstructionsOnWeb => + 'Seguiu les instruccions al lloc web i toqueu «Següent».'; + + @override + String get privacy => 'Privadesa'; + + @override + String get publicRooms => 'Sales públiques'; + + @override + String get pushRules => 'Regles push'; + + @override + String get reason => 'Raó'; + + @override + String get recording => 'Enregistrant'; + + @override + String redactedBy(String username) { + return 'Estripat per $username'; + } + + @override + String get directChat => 'Xat directe'; + + @override + String redactedByBecause(String username, String reason) { + return 'Estripat per $username per: \"$reason\"'; + } + + @override + String redactedAnEvent(String username) { + return '$username ha estripat un esdeveniment'; + } + + @override + String get redactMessage => 'Estripa el missatge'; + + @override + String get register => 'Registra\'t'; + + @override + String get reject => 'Rebutja'; + + @override + String rejectedTheInvitation(String username) { + return '$username ha rebutjat la invitació'; + } + + @override + String get rejoin => 'Torna-t\'hi a unir'; + + @override + String get removeAllOtherDevices => 'Elimina tots els altres dispositius'; + + @override + String removedBy(String username) { + return 'Eliminat per $username'; + } + + @override + String get removeDevice => 'Elimina dispositiu'; + + @override + String get unbanFromChat => 'Aixeca el veto'; + + @override + String get removeYourAvatar => 'Esborra el teu avatar'; + + @override + String get replaceRoomWithNewerVersion => + 'Substitueix la sala amb la versió més recent'; + + @override + String get reply => 'Respon'; + + @override + String get reportMessage => 'Denuncia el missatge'; + + @override + String get translateMessage => 'Translate message'; + + @override + String get translatedMessage => 'Translated message'; + + @override + String get errorTranslatingMessage => + 'An error has occured while translating the message.'; + + @override + String get recoverMessage => 'Recover message'; + + @override + String get recoveredMessage => 'Recovered message'; + + @override + String get errorRecoveringMessage => + 'An error has occured while recovering the message.'; + + @override + String get errorRecoveringMessageNoAdmin => + 'This feature is available on Synapse homeservers only for adminstrators.'; + + @override + String get requestPermission => 'Sol·licita permís'; + + @override + String get roomHasBeenUpgraded => 'La sala s\'ha actualitzat'; + + @override + String get roomVersion => 'Versió de la sala'; + + @override + String get saveFile => 'Desa el fitxer'; + + @override + String get retry => 'Retry'; + + @override + String get search => 'Cerca'; + + @override + String get security => 'Seguretat'; + + @override + String get recoveryKey => 'Clau de recuperació'; + + @override + String get recoveryKeyLost => 'Que has perdut la clau de recuperació?'; + + @override + String seenByUser(String username) { + return 'Vist per $username'; + } + + @override + String get send => 'Envia'; + + @override + String get sendAMessage => 'Envia un missatge'; + + @override + String get sendAsText => 'Envia com a text'; + + @override + String get sendAudio => 'Envia un àudio'; + + @override + String get sendFile => 'Envia un fitxer'; + + @override + String get sendImage => 'Envia una imatge'; + + @override + String sendImages(int count) { + return 'Envia $count imatge'; + } + + @override + String get sendMessages => 'Envia missatges'; + + @override + String get sendOriginal => 'Envia l’original'; + + @override + String get sendSticker => 'Envia adhesiu'; + + @override + String get sendVideo => 'Envia un vídeo'; + + @override + String sentAFile(String username) { + return '📁 $username ha enviat un fitxer'; + } + + @override + String sentAnAudio(String username) { + return '🎤 $username ha enviat un àudio'; + } + + @override + String sentAPicture(String username) { + return '🖼️ $username ha enviat una imatge'; + } + + @override + String sentASticker(String username) { + return '😊 $username ha enviat un adhesiu'; + } + + @override + String sentAVideo(String username) { + return '🎥 $username ha enviat un vídeo'; + } + + @override + String sentCallInformations(String senderName) { + return '$senderName ha enviat informació de trucada'; + } + + @override + String get separateChatTypes => 'Separa xats directes i grups'; + + @override + String get setAsCanonicalAlias => 'Defineix com a àlies principal'; + + @override + String get setCustomEmotes => 'Defineix emoticones personalitzades'; + + @override + String get setChatDescription => 'Posa una descripció de xat'; + + @override + String get setInvitationLink => 'Defineix l’enllaç per a convidar'; + + @override + String get setPermissionsLevel => 'Defineix el nivell de permisos'; + + @override + String get setStatus => 'Defineix l’estat'; + + @override + String get settings => 'Paràmetres'; + + @override + String get share => 'Comparteix'; + + @override + String sharedTheLocation(String username) { + return '$username n’ha compartit la ubicació'; + } + + @override + String get shareLocation => 'Comparteix la ubicació'; + + @override + String get showPassword => 'Mostra la contrasenya'; + + @override + String get presenceStyle => 'Presència:'; + + @override + String get hideAvatarsInInvites => 'Hide avatars in invites'; + + @override + String get hideAvatarsInInvitesDescription => + 'Do not show room avatars in invites'; + + @override + String get presencesToggle => + 'Mostra els missatges d\'estat d\'altres usuàrïis'; + + @override + String get pureBlackToggle => 'Pure Black'; + + @override + String get singlesignon => 'Autenticació única'; + + @override + String get skip => 'Omet'; + + @override + String get sourceCode => 'Codi font'; + + @override + String get spaceIsPublic => 'L’espai és públic'; + + @override + String get spaceName => 'Nom de l’espai'; + + @override + String startedACall(String senderName) { + return '$senderName ha iniciat una trucada'; + } + + @override + String get startFirstChat => 'Comença el teu primer xat'; + + @override + String get status => 'Estat'; + + @override + String get statusExampleMessage => 'Com us sentiu avui?'; + + @override + String get submit => 'Envia'; + + @override + String get synchronizingPleaseWait => 'S’està sincronitzant… Espereu.'; + + @override + String synchronizingPleaseWaitCounter(String percentage) { + return ' S\'està sincronitzant... ($percentage%)'; + } + + @override + String get systemTheme => 'Sistema'; + + @override + String get theyDontMatch => 'No coincideixen'; + + @override + String get theyMatch => 'Coincideixen'; + + @override + String get title => 'FluffyChat'; + + @override + String get toggleFavorite => 'Commuta l’estat «preferit»'; + + @override + String get toggleMuted => 'Commuta l’estat «silenci»'; + + @override + String get toggleUnread => 'Marca com a llegit/sense llegir'; + + @override + String get tooManyRequestsWarning => + 'Massa sol·licituds. Torna-ho a provar més tard!'; + + @override + String get transferFromAnotherDevice => + 'Transfereix des d’un altre dispositiu'; + + @override + String get tryToSendAgain => 'Intenta tornar a enviar'; + + @override + String get unavailable => 'No disponible'; + + @override + String unbannedUser(String username, String targetName) { + return '$username ha aixecat el veto a $targetName'; + } + + @override + String get unblockDevice => 'Desbloqueja dispositiu'; + + @override + String get unknownDevice => 'Dispositiu desconegut'; + + @override + String get unknownEncryptionAlgorithm => + 'L’algorisme de xifratge és desconegut'; + + @override + String unknownEvent(String type) { + return 'Esdeveniment desconegut \'$type\''; + } + + @override + String get unmuteChat => 'Deixa de silenciar el xat'; + + @override + String get unpin => 'Deixa de fixar'; + + @override + String unreadChats(int unreadCount) { + String _temp0 = intl.Intl.pluralLogic( + unreadCount, + locale: localeName, + other: '$unreadCount xats no llegits', + one: '1 xat no llegit', + ); + return '$_temp0'; + } + + @override + String userAndOthersAreTyping(String username, int count) { + return '$username i $count més estan escrivint…'; + } + + @override + String userAndUserAreTyping(String username, String username2) { + return '$username i $username2 estan escrivint…'; + } + + @override + String userIsTyping(String username) { + return '$username està escrivint…'; + } + + @override + String userLeftTheChat(String username) { + return '🚪 $username ha marxat del xat'; + } + + @override + String get username => 'Nom d’usuàriï'; + + @override + String userSentUnknownEvent(String username, String type) { + return '$username ha enviat un esdeveniment $type'; + } + + @override + String get unverified => 'No verificat'; + + @override + String get verified => 'Verificat'; + + @override + String get verify => 'Verifica'; + + @override + String get verifyStart => 'Inicia la verificació'; + + @override + String get verifySuccess => 'T\'has verificat correctament!'; + + @override + String get verifyTitle => 'Verificant un altre compte'; + + @override + String get videoCall => 'Videotrucada'; + + @override + String get visibilityOfTheChatHistory => 'Visibilitat de l’historial del xat'; + + @override + String get visibleForAllParticipants => 'Visible per a tots els participants'; + + @override + String get visibleForEveryone => 'Visible per a tothom'; + + @override + String get voiceMessage => 'Missatge de veu'; + + @override + String get waitingPartnerAcceptRequest => + 'S’està esperant que l’altre accepti la sol·licitud…'; + + @override + String get waitingPartnerEmoji => + 'S’està esperant que l’altre accepti l’emoji…'; + + @override + String get waitingPartnerNumbers => + 'S’està esperant que l’altre accepti els nombres…'; + + @override + String get wallpaper => 'Fons:'; + + @override + String get warning => 'Atenció!'; + + @override + String get weSentYouAnEmail => + 'Us hem enviat un missatge de correu electrònic'; + + @override + String get whoCanPerformWhichAction => 'Qui pot efectuar quina acció'; + + @override + String get whoIsAllowedToJoinThisGroup => 'Qui pot unir-se a aquest grup'; + + @override + String get whyDoYouWantToReportThis => 'Per què voleu denunciar això?'; + + @override + String get wipeChatBackup => + 'Voleu suprimir la còpia de seguretat dels xats per a crear una clau de recuperació nova?'; + + @override + String get withTheseAddressesRecoveryDescription => + 'Amb aquestes adreces, si ho necessiteu, podeu recuperar la vostra contrasenya.'; + + @override + String get writeAMessage => 'Escriviu un missatge…'; + + @override + String get yes => 'Sí'; + + @override + String get you => 'Vós'; + + @override + String get youAreNoLongerParticipatingInThisChat => + 'Ja no participeu en aquest xat'; + + @override + String get youHaveBeenBannedFromThisChat => 'T\'han vetat en aquest xat'; + + @override + String get yourPublicKey => 'La vostra clau pública'; + + @override + String get messageInfo => 'Informació del missatge'; + + @override + String get time => 'Temps'; + + @override + String get messageType => 'Tipus de missatge'; + + @override + String get sender => 'Remitent'; + + @override + String get openGallery => 'Obre la galeria'; + + @override + String get removeFromSpace => 'Esborra de l\'espai'; + + @override + String get addToSpaceDescription => 'Tria un espai per afegir-hi el xat.'; + + @override + String get start => 'Comença'; + + @override + String get pleaseEnterRecoveryKeyDescription => + 'Per desbloquejar els missatges antics, introdueix la clau de recuperació que vas generar en una sessió anterior. La clau de recuperació NO és la teva contrasenya.'; + + @override + String get publish => 'Publica'; + + @override + String videoWithSize(String size) { + return 'Vídeo $size'; + } + + @override + String get openChat => 'Obre el xat'; + + @override + String get markAsRead => 'Marca com a llegit'; + + @override + String get reportUser => 'Denuncia l\'usuàrïi'; + + @override + String get dismiss => 'Ignora-ho'; + + @override + String reactedWith(String sender, String reaction) { + return '$sender ha reaccionat amb $reaction'; + } + + @override + String get pinMessage => 'Fixa a la sala'; + + @override + String get confirmEventUnpin => + 'Vols desfixar l\'esdeveniment permanentment?'; + + @override + String get emojis => 'Emojis'; + + @override + String get placeCall => 'Truca'; + + @override + String get voiceCall => 'Videotrucada'; + + @override + String get unsupportedAndroidVersion => + 'Aquesta versió d\'Android és incompatible'; + + @override + String get unsupportedAndroidVersionLong => + 'Aquesta funcionalitat només funciona amb versions d\'Android més noves.'; + + @override + String get videoCallsBetaWarning => + 'Tingues en compte que les trucades de vídeo estan encara en beta. Pot ser que no funcioni bé o que falli en alguna plataforma.'; + + @override + String get experimentalVideoCalls => 'Trucades de vídeo experimentals'; + + @override + String get emailOrUsername => 'Email o nom d\'usuàrïi'; + + @override + String get indexedDbErrorTitle => 'Problemes amb el mode privat'; + + @override + String get indexedDbErrorLong => + 'L\'emmagatzematge de missatges no està disponible per defecte en el mode privat.\nVisita\n - about:config\n - posa a true l\'opció dom.indexedDB.privateBrowsing.enabled\nSi no ho fas, no podràs fer servir FluffyChat en mode privat.'; + + @override + String switchToAccount(String number) { + return 'Canvia al compte $number'; + } + + @override + String get nextAccount => 'Compte següent'; + + @override + String get previousAccount => 'Compte anterior'; + + @override + String get addWidget => 'Afegeix un giny'; + + @override + String get widgetVideo => 'Vídeo'; + + @override + String get widgetEtherpad => 'Nota de text'; + + @override + String get widgetJitsi => 'Jitsi Meet'; + + @override + String get widgetCustom => 'Personalització'; + + @override + String get widgetName => 'Nom'; + + @override + String get widgetUrlError => 'La URL no és vàlida.'; + + @override + String get widgetNameError => 'Posa el nom públic.'; + + @override + String get errorAddingWidget => 'S\'ha produït un error en afegir el giny.'; + + @override + String get youRejectedTheInvitation => 'Has rebutjat la invitació'; + + @override + String get youJoinedTheChat => 'T\'has afegit al xat'; + + @override + String get youAcceptedTheInvitation => '👍 Has acceptat la invitació'; + + @override + String youBannedUser(String user) { + return 'Has vetat a $user'; + } + + @override + String youHaveWithdrawnTheInvitationFor(String user) { + return 'Has rebutjat la invitació de $user'; + } + + @override + String youInvitedToBy(String alias) { + return '📩 T\'han enviat un enllaç d\'invitació per:\n$alias'; + } + + @override + String youInvitedBy(String user) { + return '📩 $user t\'ha convidat'; + } + + @override + String invitedBy(String user) { + return '📩 Convidadi per $user'; + } + + @override + String youInvitedUser(String user) { + return '📩 Has convidat a $user'; + } + + @override + String youKicked(String user) { + return '👞 Has expulsat a $user'; + } + + @override + String youKickedAndBanned(String user) { + return '🙅 Has expulsat i vetat a $user'; + } + + @override + String youUnbannedUser(String user) { + return 'Has aixecat el veto a $user'; + } + + @override + String hasKnocked(String user) { + return '🚪 $user pica a la porta'; + } + + @override + String get usersMustKnock => 'Lis membres han de picar a la porta'; + + @override + String get noOneCanJoin => 'Ningú s\'hi pot ficar'; + + @override + String userWouldLikeToChangeTheChat(String user) { + return '$user vol entrar al xat.'; + } + + @override + String get noPublicLinkHasBeenCreatedYet => + 'No s\'ha creat cap enllaç públic'; + + @override + String get knock => 'Pica'; + + @override + String get users => 'Usuàrïis'; + + @override + String get unlockOldMessages => 'Desbloqueja els missatges antics'; + + @override + String get storeInSecureStorageDescription => + 'Desa la clau de recuperació en l\'emmagatzematge segur d\'aquest dispositiu.'; + + @override + String get saveKeyManuallyDescription => + 'Per desar aquesta clau manualment, pica l\'eina de compartir o copia-la al porta-retalls.'; + + @override + String get storeInAndroidKeystore => 'Desa en la Android KeyStore'; + + @override + String get storeInAppleKeyChain => 'Desa en la Apple KeyChain'; + + @override + String get storeSecurlyOnThisDevice => + 'Desa de forma segura en aquest dispositiu'; + + @override + String countFiles(int count) { + return '$count arxius'; + } + + @override + String get user => 'Usuàrïi'; + + @override + String get custom => 'Personalitzat'; + + @override + String get foregroundServiceRunning => + 'Aquesta notificació apareix quan el servei de primer pla està corrent.'; + + @override + String get screenSharingTitle => 'compartició de pantalla'; + + @override + String get screenSharingDetail => + 'Estàs compartint la teva pantalla a FluffyChat'; + + @override + String get callingPermissions => 'Permisos de trucada'; + + @override + String get callingAccount => 'Compte de la trucada'; + + @override + String get callingAccountDetails => + 'Permet al FluffyChat de fer servir l\'app de trucades nativa de l\'Android.'; + + @override + String get appearOnTop => 'Mostra per sobre'; + + @override + String get appearOnTopDetails => + 'Permet a l\'app que aparegui sobre d\'altres apps. No cal si ja has afegit FluffyChat com a compte de trucades'; + + @override + String get otherCallingPermissions => + 'Micròfon, càmera i altres permisos del FluffyChat'; + + @override + String get whyIsThisMessageEncrypted => + 'Per què no es pot llegir aquest missatge?'; + + @override + String get noKeyForThisMessage => + 'Això pot passar si el missatge es va enviar abans que haguessis iniciat sessió al teu compte des d\'aquest dispositiu.\n\nTambé pot ser que l\'emissor hagi bloquejat el teu dispositiu o que la connexió a internet anés malament.\n\nQue pots llegir el missatge des d\'una altra sessió? Si és així, llavors pots transferir-lo! Ves a Paràmetres → Dispositius i assegura\'t que els teus dispositius s\'ha verificat mútuament. Quan obris la sala la propera vegada i totes dues sessions estiguin executant-se, en primer pla, llavors les claus es trasnsmetran automàticament.\n\nVols evitar perdre les claus en tancar la sessió o en canviar de dispositiu? Llavors assegura\'t que has activat la còpia de seguretat del xat als paràmetres.'; + + @override + String get newGroup => 'Grup nou'; + + @override + String get newSpace => 'Espai nou'; + + @override + String get enterSpace => 'Obre l\'espai'; + + @override + String get enterRoom => 'Entra a la sala'; + + @override + String get allSpaces => 'Tots els espais'; + + @override + String numChats(String number) { + return '$number xats'; + } + + @override + String get hideUnimportantStateEvents => + 'Amaga canvis d\'estat poc importants'; + + @override + String get hidePresences => 'Amagar la llista de Status?'; + + @override + String get doNotShowAgain => 'No ho tornis a mostrar'; + + @override + String wasDirectChatDisplayName(String oldDisplayName) { + return 'Xat buit ( era $oldDisplayName)'; + } + + @override + String get newSpaceDescription => 'Els espais et permeten consolidar ls por'; + + @override + String get encryptThisChat => 'Xifra aquest xat'; + + @override + String get disableEncryptionWarning => + 'Per motius de seguretat, un cop activat, no es pot desactivar el xifratge.'; + + @override + String get sorryThatsNotPossible => 'Aquesta acció no és possible'; + + @override + String get deviceKeys => 'Claus del dispositiu:'; + + @override + String get reopenChat => 'Reobre el xat'; + + @override + String get noBackupWarning => + 'Compte! Si no actives la còpia de seguretat dels xats, perdràs accés als teus missatges xifrats. És molt recomanable activar-ho abans de tancar la sessió.'; + + @override + String get noOtherDevicesFound => 'No s\'han trobat més dispositius'; + + @override + String fileIsTooBigForServer(String max) { + return 'No s\'ha pogut enviar! El servidor només accepta adjunts de fins a $max.'; + } + + @override + String fileHasBeenSavedAt(String path) { + return 'S\'ha desat l\'arxiu a $path'; + } + + @override + String get jumpToLastReadMessage => 'Salta a l\'últim missatge llegit'; + + @override + String get readUpToHere => 'Llegit fins aquí'; + + @override + String get jump => 'Salta'; + + @override + String get openLinkInBrowser => 'Obre l\'enllaç en un navegador'; + + @override + String get reportErrorDescription => + '😭 Oh no. Hi ha hagut algun error. Si vols, pots informar d\'aquest bug a l\'equip de desenvolupament.'; + + @override + String get report => 'informa'; + + @override + String get signInWithPassword => 'Inicia sessió amb contrasenya'; + + @override + String get pleaseTryAgainLaterOrChooseDifferentServer => + 'Torna-ho a provar més tard o tria un servidor diferent.'; + + @override + String signInWith(String provider) { + return 'Inicia sessió amb $provider'; + } + + @override + String get profileNotFound => + 'No s\'ha trobat el compte en aquest servidor. Pot ser un error de connexió, o que realment no existeixi.'; + + @override + String get setTheme => 'Tria el tema:'; + + @override + String get setColorTheme => 'Tria el color del tema:'; + + @override + String get invite => 'Convida'; + + @override + String get inviteGroupChat => '📨 Convida al grup'; + + @override + String get invitePrivateChat => '📨 Convida a un xat privat'; + + @override + String get invalidInput => 'L\'entrada no és vàlida!'; + + @override + String wrongPinEntered(int seconds) { + return 'Pin incorrecte! Torna-ho a provar en $seconds segons...'; + } + + @override + String get pleaseEnterANumber => 'Introdueix un número major que 0'; + + @override + String get archiveRoomDescription => + 'Aquest xat serà arxivat. Els altres contactes del grup ho veuran com si haguessis abandonat el xat.'; + + @override + String get roomUpgradeDescription => + 'El xat serà recreat amb una versió de sala nova. Totis lis participants seran notificadis que han de canviar al nou xat. Pots llegir més sobre les versions de sala a https://spec.matrix.org/latest/rooms/'; + + @override + String get removeDevicesDescription => + 'Tancaràs la sessió d\'aquest dispositiu i no hi podràs rebre més missatges.'; + + @override + String get banUserDescription => + 'Es vetarà li usuàriï al xat i no podrà tornar-hi a entrar fins que se li aixequi el veto.'; + + @override + String get unbanUserDescription => + 'L\'usuàrïi ja pot tornar a entrar al xat.'; + + @override + String get kickUserDescription => + 'Li usuàrïi ha estat expulsadi però no vetadi. Als xats públics, pot tornar-hi a entrar en qualsevol moment.'; + + @override + String get makeAdminDescription => + 'Un cop hagis fet admin aquesta persona ja no podràs desfer-ho, ja que llavors tindrà els mateixos permisos que tu.'; + + @override + String get pushNotificationsNotAvailable => + 'Les notificacions push no estan disponibles'; + + @override + String get learnMore => 'Llegeix-ne més'; + + @override + String get yourGlobalUserIdIs => 'La teva ID global és: '; + + @override + String noUsersFoundWithQuery(String query) { + return 'No s\'ha trobat cap usuàrïi amb \"$query\". Revisa si ho has escrit malament.'; + } + + @override + String get knocking => 'S\'està picant'; + + @override + String chatCanBeDiscoveredViaSearchOnServer(String server) { + return 'El xat es pot descobrir amb la cerca de $server'; + } + + @override + String get searchChatsRooms => 'Cerca #sales, @usuariïs...'; + + @override + String get nothingFound => 'No s\'ha trobat res...'; + + @override + String get groupName => 'Nom del grup'; + + @override + String get createGroupAndInviteUsers => 'Crea un grup i convida-hi usuàrïis'; + + @override + String get groupCanBeFoundViaSearch => + 'El grup es pot trobar per la cerca general'; + + @override + String get wrongRecoveryKey => + 'Malauradament, aquesta clau de recuperació no és la correcta.'; + + @override + String get startConversation => 'Comença una conversa'; + + @override + String get commandHint_sendraw => 'Envia un json pelat'; + + @override + String get databaseMigrationTitle => 'La base de dades ha estat optimitzada'; + + @override + String get databaseMigrationBody => 'Espereu un moment, si us plau.'; + + @override + String get leaveEmptyToClearStatus => + 'Per esborrar el teu estat, deixa-ho en blanc.'; + + @override + String get select => 'Tria'; + + @override + String get searchForUsers => 'Cerca @usuariïs...'; + + @override + String get pleaseEnterYourCurrentPassword => + 'Fica la teva contrasenya actual'; + + @override + String get newPassword => 'Contrasenya nova'; + + @override + String get pleaseChooseAStrongPassword => 'Tria una contrasenya forta'; + + @override + String get passwordsDoNotMatch => 'Les contrasenyes no coincideixen'; + + @override + String get passwordIsWrong => 'La contrasenya introduïda és incorrecta'; + + @override + String get publicLink => 'Enllaç públic'; + + @override + String get publicChatAddresses => 'Adreces públiques del xat'; + + @override + String get createNewAddress => 'Crea una adreça nova'; + + @override + String get joinSpace => 'Fica\'t a l\'espai'; + + @override + String get publicSpaces => 'Espais públics'; + + @override + String get addChatOrSubSpace => 'Afegeix un xat o un subespai'; + + @override + String get subspace => 'Subespai'; + + @override + String get decline => 'Denega'; + + @override + String get thisDevice => 'Aquest dispositiu:'; + + @override + String get initAppError => + 'S\'ha produït un error mentre s\'inicialitzava l\'aplicació'; + + @override + String get userRole => 'Rol d\'usuàriï'; + + @override + String minimumPowerLevel(String level) { + return 'El nivell mínim de permisos és $level.'; + } + + @override + String searchIn(String chat) { + return 'Cerca al xat \"$chat\"...'; + } + + @override + String get searchMore => 'Cerca més...'; + + @override + String get gallery => 'Galeria'; + + @override + String get files => 'Arxius'; + + @override + String databaseBuildErrorBody(String url, String error) { + return 'No s\'ha pogut construir la base de dades SQLite. L\'aplicació provarà de fer servir un format de base de dades antiquat. Si us plau, comunica aquesta situació a la comunitat de desenvolupament a $url. El missatge d\'error és: $error'; + } + + @override + String sessionLostBody(String url, String error) { + return 'S\'ha perdut la teva sessió. Si us plau, comunica aquest error a l\'equip de desenvolupament a $url. El missatge d\'error és: $error'; + } + + @override + String restoreSessionBody(String url, String error) { + return 'L\'aplicació provarà de restaurar la teva sessió des de la còpia de seguretat. Si us plau, comunica aquest error a l\'equi pde desenvolupament a $url. El missatge d\'error és $error'; + } + + @override + String forwardMessageTo(String roomName) { + return 'Vols reenviar el missatge a $roomName?'; + } + + @override + String get sendReadReceipts => 'Envia informes de tecleig'; + + @override + String get sendTypingNotificationsDescription => + 'Lis altris participants d\'un xat poden veure quan estàs teclejant un missatge nou.'; + + @override + String get sendReadReceiptsDescription => + 'Lis altris participants d\'un xat poden veure quan has llegit un missatge.'; + + @override + String get formattedMessages => 'Missatges amb format'; + + @override + String get formattedMessagesDescription => + 'Mostra contingut amb format enriquit com text en cursiva, fent servir markdown.'; + + @override + String get verifyOtherUser => '🔐 Verifica uni altri usuàrïi'; + + @override + String get verifyOtherUserDescription => + 'Si verifiques aquesti usuàrïi, podràs estar seguri de a qui estàs escrivint. . 💪\n\nQuan inicies una verificació, l\'altra persona i tu veureu un missatge emergent a l\'app. Us sortiran un seguit d\'emojis o números a cada pantalla, que haureu de comparar.\n\nLa millor manera de fer-ho és quedar en persona o fer una vídeo-trucada. 👭'; + + @override + String get verifyOtherDevice => '🔐 Verifica un altre dispositiu'; + + @override + String get verifyOtherDeviceDescription => + 'Quan verifiques un altre dispositiu, aquests poden intercanviar claus, així que es millora la seguretat total. 💪 Quan comences una verificació, apareixerà un missatge emergent a tots dos dispositius. A cadascun hi apareixerà un seguit d\'emojis o de números que hauràs de comparar. El millor és tenir tots dos dispositius a mà abans d\'iniciar la verificació. 🤳'; + + @override + String acceptedKeyVerification(String sender) { + return '$sender ha acceptat la verificació de claus'; + } + + @override + String canceledKeyVerification(String sender) { + return '$sender ha canceŀlat la verificació de claus'; + } + + @override + String completedKeyVerification(String sender) { + return '$sender ha comletat la verificació de claus'; + } + + @override + String isReadyForKeyVerification(String sender) { + return '$sender està a punt per verificar les claus'; + } + + @override + String requestedKeyVerification(String sender) { + return '$sender ha soŀlicitat verificar claus'; + } + + @override + String startedKeyVerification(String sender) { + return '$sender ha iniciat la verificació de claus'; + } + + @override + String get transparent => 'Transparent'; + + @override + String get incomingMessages => 'Missatge d\'entrada'; + + @override + String get stickers => 'Enganxines'; + + @override + String get discover => 'Descobreix'; + + @override + String get commandHint_ignore => 'Ignora el compte de matrix especificat'; + + @override + String get commandHint_unignore => + 'Deixa d\'ignorar el compt de matrix especificat'; + + @override + String unreadChatsInApp(String appname, String unread) { + return '$appname: $unread converses pendents'; + } + + @override + String get noDatabaseEncryption => + 'No es pot xifrar la base de dades en aquesta plataforma'; + + @override + String thereAreCountUsersBlocked(Object count) { + return 'Ara mateix hi ha $count usuàriïs bloquejadis.'; + } + + @override + String get restricted => 'Restringit'; + + @override + String get knockRestricted => 'No es pot picar a la porta'; + + @override + String goToSpace(Object space) { + return 'Ves a l\'espai $space'; + } + + @override + String get markAsUnread => 'Marca com a no llegit'; + + @override + String userLevel(int level) { + return '$level - Usuàriï'; + } + + @override + String moderatorLevel(int level) { + return '$level - Moderadori'; + } + + @override + String adminLevel(int level) { + return '$level - Admin'; + } + + @override + String get changeGeneralChatSettings => 'Canvia les opcions generals de xat'; + + @override + String get inviteOtherUsers => 'Convida més gent a la conversa'; + + @override + String get changeTheChatPermissions => 'Canvia els permisos del xat'; + + @override + String get changeTheVisibilityOfChatHistory => + 'Canvia la visibilitat de l\'historial de conversa'; + + @override + String get changeTheCanonicalRoomAlias => + 'Canvia l\'adreça principal del xat'; + + @override + String get sendRoomNotifications => 'Envia notificacions @room'; + + @override + String get changeTheDescriptionOfTheGroup => 'Canvia la descripció del xat'; + + @override + String get chatPermissionsDescription => + 'Defineix quin nivell de permisos cal per cada acció en aquest xat. Els nivells 0, 50 i 100 normalment representen usuàriïs, mods i admins, però es pot canviar.'; + + @override + String updateInstalled(String version) { + return '🎉 S\'ha actualitzat a la versió $version!'; + } + + @override + String get changelog => 'Registre de canvis'; + + @override + String get sendCanceled => 'S\'ha canceŀlat l\'enviament'; + + @override + String get loginWithMatrixId => 'Entra amb l\'id de Matrix'; + + @override + String get discoverHomeservers => 'Descobreix servidors'; + + @override + String get whatIsAHomeserver => 'Què és un servidor de Matrix?'; + + @override + String get homeserverDescription => + 'Totes les teves dades s\'emmagatzemen al servidor, com passa amb el e-mail. Pots triar quin servidor vols fer servir sense témer a no poder comunicar gent d\'altres servidors. Llegeix-ne més a https://matrix.org.'; + + @override + String get doesNotSeemToBeAValidHomeserver => + 'No sembla un servidor compatible. Pot ser que la URL estigui malament?'; + + @override + String get calculatingFileSize => 'S\'està calculant la mida de l\'arxiu...'; + + @override + String get prepareSendingAttachment => + 'S\'està preparant per enviar l\'adjunt...'; + + @override + String get sendingAttachment => 'S\'està enviant l\'adjunt...'; + + @override + String get generatingVideoThumbnail => + 'S\'està generant la miniatura del vídeo...'; + + @override + String get compressVideo => 'S\'està comprimint el vídeo...'; + + @override + String sendingAttachmentCountOfCount(int index, int length) { + return 'S\'està enviant l\'adjunt $index de $length...'; + } + + @override + String serverLimitReached(int seconds) { + return 'S\'ha arribat al límit del servidor! Esperant $seconds segons...'; + } + + @override + String get oneOfYourDevicesIsNotVerified => + 'Un dels teus dispositius no està verificat'; + + @override + String get noticeChatBackupDeviceVerification => + 'Nota: quan connectes tots els dispositius al backup del xat, es verifiquen automàticament.'; + + @override + String get continueText => 'Continua'; + + @override + String get welcomeText => + 'Hola hola! 👋 Això és FluffyChat. Pots iniciar sessió en qualsevol servidor compatible amb https://matrix.org. I llavors xatejar amb qualsevol. És una xarxa enorme de missatgeria descentralitzada !'; + + @override + String get blur => 'Difumina:'; + + @override + String get opacity => 'Opacitat:'; + + @override + String get setWallpaper => 'Tria imatge de fons'; + + @override + String get manageAccount => 'Gestiona el compte'; + + @override + String get noContactInformationProvided => + 'El servidor no ofereix cap informació de contacte vàlida'; + + @override + String get contactServerAdmin => 'Contacta l\'admin del servidor'; + + @override + String get contactServerSecurity => + 'Contacta l\'equip de seguretat del servidor'; + + @override + String get supportPage => 'Pàgina de suport'; + + @override + String get serverInformation => 'Informació del servidor:'; + + @override + String get name => 'Nom'; + + @override + String get version => 'Versió'; + + @override + String get website => 'Lloc web'; + + @override + String get compress => 'Comprimeix'; + + @override + String get boldText => 'Text en negreta'; + + @override + String get italicText => 'Text en cursiva'; + + @override + String get strikeThrough => 'Text ratllat'; + + @override + String get pleaseFillOut => 'Emplena'; + + @override + String get invalidUrl => 'URL invàlida'; + + @override + String get addLink => 'Afegeix un enllaç'; + + @override + String get unableToJoinChat => + 'No s\'ha pogut entrar al xat. Pot ser que l\'altri participant hagi tancat la conversa.'; + + @override + String get previous => 'Anterior'; + + @override + String get otherPartyNotLoggedIn => + 'L\'altra persona no està en línia ara mateix i per tant no pot rebre missatges!'; + + @override + String appWantsToUseForLogin(String server) { + return 'Fes servir \'$server\' per iniciar sessió'; + } + + @override + String get appWantsToUseForLoginDescription => + 'Consenteixes que l\'app i la web comparteixen informació sobre tu.'; + + @override + String get open => 'Obre'; + + @override + String get waitingForServer => 'S\'està esperant el servidor...'; + + @override + String get appIntroduction => + 'El FluffyChat et permet xatejar amb amiguis entre diverses aplicacions. Llegeix-ne més a https://matrix.org o pica \"Continua\".'; + + @override + String get newChatRequest => '📩 Soŀlicitud de missatge'; + + @override + String get contentNotificationSettings => + 'Opcions de notificació de continguts'; + + @override + String get generalNotificationSettings => 'Opcions de notificacions generals'; + + @override + String get roomNotificationSettings => 'Opcions de notificacions de sales'; + + @override + String get userSpecificNotificationSettings => + 'Opcions de notificacions d\'usuàriï'; + + @override + String get otherNotificationSettings => 'Altres opcions de notificacions'; + + @override + String get notificationRuleContainsUserName => 'Conté el nom d\'usuàriï'; + + @override + String get notificationRuleContainsUserNameDescription => + 'Notifica l\'usuàriï quan un missatge contingui el seu nom.'; + + @override + String get notificationRuleMaster => 'Silencia totes les notificacions'; + + @override + String get notificationRuleMasterDescription => + 'Ignora totes les altres regles i deshabilita totes les notificacions.'; + + @override + String get notificationRuleSuppressNotices => + 'Elimina els missatges automàtics'; + + @override + String get notificationRuleSuppressNoticesDescription => + 'No envia notificacions relacionades amb usuàriïs automàtics com els bots.'; + + @override + String get notificationRuleInviteForMe => 'Invitació per a mi'; + + @override + String get notificationRuleInviteForMeDescription => + 'Notifica l\'usuàriï quan és convidadi a una sala.'; + + @override + String get notificationRuleMemberEvent => 'Canvis de membres'; + + @override + String get notificationRuleMemberEventDescription => + 'Ignora les notificacions quan entra o surt algú d\'una sala.'; + + @override + String get notificationRuleIsUserMention => 'Mencions'; + + @override + String get notificationRuleIsUserMentionDescription => + 'Notifica quan mencionin l\'usuàriï en un missatge.'; + + @override + String get notificationRuleContainsDisplayName => 'Conté el nom visible'; + + @override + String get notificationRuleContainsDisplayNameDescription => + 'Notifica l\'usuàriï quan un missatge contingui el seu nom per mostrar.'; + + @override + String get notificationRuleIsRoomMention => 'Menció de sala'; + + @override + String get notificationRuleIsRoomMentionDescription => + 'Notifica l\'usuàriï quan es s\'esmenti la sala.'; + + @override + String get notificationRuleRoomnotif => 'Notificació de sala'; + + @override + String get notificationRuleRoomnotifDescription => + 'Notifica l\'usuàriï quan un missatge contingui \'@room\'.'; + + @override + String get notificationRuleTombstone => 'Làpida'; + + @override + String get notificationRuleTombstoneDescription => + 'Notifica l\'usuàriï dels missatges de desactivació de sales.'; + + @override + String get notificationRuleReaction => 'Reacció'; + + @override + String get notificationRuleReactionDescription => + 'Ignora les notificacions sobre reaccions.'; + + @override + String get notificationRuleRoomServerAcl => + 'Regles ACL del servidor d\'una sala'; + + @override + String get notificationRuleRoomServerAclDescription => + 'Ignora les notificacions sobre les regles d\'accés (ACL) del servidor d\'una sala.'; + + @override + String get notificationRuleSuppressEdits => 'Elimina les edicions'; + + @override + String get notificationRuleSuppressEditsDescription => + 'Ignora les notificacions per missatges editats.'; + + @override + String get notificationRuleCall => 'Trucada'; + + @override + String get notificationRuleCallDescription => + 'Notifica l\'usuàriï de trucades.'; + + @override + String get notificationRuleEncryptedRoomOneToOne => 'Converses xifrades'; + + @override + String get notificationRuleEncryptedRoomOneToOneDescription => + 'Notifica l\'usuàriï de missatges en sales xifrades un a un, converses de dues persones.'; + + @override + String get notificationRuleRoomOneToOne => 'Converses'; + + @override + String get notificationRuleRoomOneToOneDescription => + 'Notifica l\'usuàriï de missatges en converses de dues persones, sales un a un.'; + + @override + String get notificationRuleMessage => 'Missatge'; + + @override + String get notificationRuleMessageDescription => + 'Notifica l\'usuàriï sobre missatges generals.'; + + @override + String get notificationRuleEncrypted => 'Xifrat'; + + @override + String get notificationRuleEncryptedDescription => + 'Notifica l\'usuàriï de missatges en sales xifrades.'; + + @override + String get notificationRuleJitsi => 'Jitsi'; + + @override + String get notificationRuleJitsiDescription => + 'Notifica l\'usuàriï sobre activitat del giny de Jitsi.'; + + @override + String get notificationRuleServerAcl => 'Ignora canvis en ACL de servidor'; + + @override + String get notificationRuleServerAclDescription => + 'Ignora les notificacions per canvis en les regles d\'accés (ACL) de servidor.'; + + @override + String unknownPushRule(String rule) { + return 'No es coneix la regla push \'$rule\''; + } + + @override + String get deletePushRuleCanNotBeUndone => + 'Si esborres aquesta opció de notificació no ho podràs tornar a canviar.'; + + @override + String get more => 'Més'; + + @override + String get shareKeysWith => 'Comparteix les claus amb...'; + + @override + String get shareKeysWithDescription => + 'Quins dispositius vols que puguin llegir els teus missatges xifrats?'; + + @override + String get allDevices => 'Tots els dispositius'; + + @override + String get crossVerifiedDevicesIfEnabled => + 'Els dispositius verificats mútuament, si està activat'; + + @override + String get crossVerifiedDevices => 'Els dispositius verificats mútuament'; + + @override + String get verifiedDevicesOnly => 'Només els dispositius verificats'; + + @override + String get takeAPhoto => 'Take a photo'; + + @override + String get recordAVideo => 'Record a video'; + + @override + String get optionalMessage => '(Optional) message...'; + + @override + String get notSupportedOnThisDevice => 'Not supported on this device'; + + @override + String get enterNewChat => 'Enter new chat'; + + @override + String get approve => 'Approve'; + + @override + String get youHaveKnocked => 'You have knocked'; + + @override + String get pleaseWaitUntilInvited => + 'Please wait now, until someone from the room invites you.'; +} diff --git a/lib/generated/l10n/l10n_cs.dart b/lib/generated/l10n/l10n_cs.dart new file mode 100644 index 0000000..653217e --- /dev/null +++ b/lib/generated/l10n/l10n_cs.dart @@ -0,0 +1,2749 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'l10n.dart'; + +// ignore_for_file: type=lint + +/// The translations for Czech (`cs`). +class L10nCs extends L10n { + L10nCs([String locale = 'cs']) : super(locale); + + @override + String get noSendPermission => 'You can\'t send messages here'; + + @override + String get alwaysUse24HourFormat => 'Vypnuto'; + + @override + String get repeatPassword => 'Zopakujte heslo'; + + @override + String get notAnImage => 'Není obrázek.'; + + @override + String get setCustomPermissionLevel => 'Set custom permission level'; + + @override + String get setPermissionsLevelDescription => + 'Please choose a predefined role below or enter a custom permission level between 0 and 100.'; + + @override + String get ignoreUser => 'Ignore user'; + + @override + String get normalUser => 'Normal user'; + + @override + String get remove => 'Odstranit'; + + @override + String get importNow => 'Importovat nyní'; + + @override + String get importEmojis => 'Importovat Emoji'; + + @override + String get importFromZipFile => 'Importovat ze .zip souboru'; + + @override + String get exportEmotePack => 'Exportovat Emoji jako .zip'; + + @override + String get replace => 'Nahradit'; + + @override + String get about => 'O aplikaci'; + + @override + String aboutHomeserver(String homeserver) { + return 'O $homeserver'; + } + + @override + String get accept => 'Přijmout'; + + @override + String acceptedTheInvitation(String username) { + return '👍 $username přijal/a pozvání'; + } + + @override + String get account => 'Účet'; + + @override + String activatedEndToEndEncryption(String username) { + return '🔐 $username aktivoval/a koncové šifrování'; + } + + @override + String get addEmail => 'Přidat e-mail'; + + @override + String get confirmMatrixId => + 'Prosím, potvrďte vaše Matrix ID, abyste mohli smazat váš účet.'; + + @override + String supposedMxid(String mxid) { + return 'Tady by mělo být $mxid'; + } + + @override + String get addChatDescription => 'Přidejte popis konverzace'; + + @override + String get addToSpace => 'Přidat do prostoru'; + + @override + String get admin => 'Správce'; + + @override + String get alias => 'alias'; + + @override + String get all => 'Vše'; + + @override + String get allChats => 'Všechny chaty'; + + @override + String get commandHint_roomupgrade => + 'Upgrade this room to the given room version'; + + @override + String get commandHint_googly => 'Poslat kroutící se očička'; + + @override + String get commandHint_cuddle => 'Poslat mazlení'; + + @override + String get commandHint_hug => 'Poslat obejmutí'; + + @override + String googlyEyesContent(String senderName) { + return '$senderName vám posílá kroutící se očička'; + } + + @override + String cuddleContent(String senderName) { + return '$senderName se s vámi mazlí'; + } + + @override + String hugContent(String senderName) { + return '$senderName vás objímá'; + } + + @override + String answeredTheCall(String senderName) { + return '$senderName odpověděl na hovor'; + } + + @override + String get anyoneCanJoin => 'Kdokoliv se může připojit'; + + @override + String get appLock => 'Zámek aplikace'; + + @override + String get appLockDescription => + 'Zamknout aplikaci pomocí PIN kódu když není používána'; + + @override + String get archive => 'Archivovat'; + + @override + String get areGuestsAllowedToJoin => 'Mohou se připojit hosté'; + + @override + String get areYouSure => 'Jste si jistý?'; + + @override + String get areYouSureYouWantToLogout => 'Opravdu se chcete odhlásit?'; + + @override + String get askSSSSSign => + 'Pro ověření této osoby zadejte prosím přístupovou frázi k „bezpečnému úložišti“ anebo „klíč pro obnovu“.'; + + @override + String askVerificationRequest(String username) { + return 'Přijmout žádost o ověření od $username?'; + } + + @override + String get autoplayImages => + 'Automaticky přehrajte animované nálepky a emoce'; + + @override + String badServerLoginTypesException(String serverVersions, + String supportedVersions, Object suportedVersions) { + return 'Homeserver podporuje přihlášení typu:\n$serverVersions\nAle tato aplikace podporuje pouze:\n$supportedVersions'; + } + + @override + String get sendTypingNotifications => 'Posílat oznámení o psaní'; + + @override + String get swipeRightToLeftToReply => 'Potáhněte z prava do leva pro odpověď'; + + @override + String get sendOnEnter => 'Odeslat při vstupu'; + + @override + String badServerVersionsException(String serverVersions, + String supportedVersions, Object serverVerions, Object suportedVersions) { + return 'Homeserver podporuje specifikaci verzí:\n$serverVersions\nAle tato aplikace podporuje pouze verze $supportedVersions'; + } + + @override + String countChatsAndCountParticipants(int chats, int participants) { + return '$chats konverzaci a $participants účastníci'; + } + + @override + String get noMoreChatsFound => 'Žádné další konverzace nalezeny...'; + + @override + String get noChatsFoundHere => + 'Nejsou zde žádné chaty. Začněte nový chat s někým, použitím níže uvedeného tlačítka. ⤵️'; + + @override + String get joinedChats => 'Připojené chaty'; + + @override + String get unread => 'Nepřečtené'; + + @override + String get space => 'Prostor'; + + @override + String get spaces => 'Prostory'; + + @override + String get banFromChat => 'Zakázat chat'; + + @override + String get banned => 'Zakázán'; + + @override + String bannedUser(String username, String targetName) { + return '$username zakázal $targetName'; + } + + @override + String get blockDevice => 'Blokovat zařízení'; + + @override + String get blocked => 'Zakázán'; + + @override + String get botMessages => 'Zprávy od bota'; + + @override + String get cancel => 'Zrušit'; + + @override + String cantOpenUri(String uri) { + return 'Nelze otevřít URI $uri'; + } + + @override + String get changeDeviceName => 'Změnit název zařízení'; + + @override + String changedTheChatAvatar(String username) { + return '$username změnil avatar chatu'; + } + + @override + String changedTheChatDescriptionTo(String username, String description) { + return '$username změnil popis chatu na: „$description“'; + } + + @override + String changedTheChatNameTo(String username, String chatname) { + return '$username změnil jméno chatu na: „$chatname“'; + } + + @override + String changedTheChatPermissions(String username) { + return '$username změnili nastavení oprávnění v chatu'; + } + + @override + String changedTheDisplaynameTo(String username, String displayname) { + return '$username změnili svoji přezdívku na: $displayname'; + } + + @override + String changedTheGuestAccessRules(String username) { + return '$username změnili přístupová práva pro hosty'; + } + + @override + String changedTheGuestAccessRulesTo(String username, String rules) { + return '$username změnili přístupová práva pro hosty na: $rules'; + } + + @override + String changedTheHistoryVisibility(String username) { + return '$username změnili nastavení viditelnosti historie diskuze'; + } + + @override + String changedTheHistoryVisibilityTo(String username, String rules) { + return '$username změnili nastavení viditelnosti historie diskuze na: $rules'; + } + + @override + String changedTheJoinRules(String username) { + return '$username změnili nastavení pravidel připojení'; + } + + @override + String changedTheJoinRulesTo(String username, String joinRules) { + return '$username změnili nastavení pravidel připojení na: $joinRules'; + } + + @override + String changedTheProfileAvatar(String username) { + return '$username změnili svůj avatar'; + } + + @override + String changedTheRoomAliases(String username) { + return '$username změnili nastavení aliasů místnosti'; + } + + @override + String changedTheRoomInvitationLink(String username) { + return '$username změnili odkaz k pozvání do místnosti'; + } + + @override + String get changePassword => 'Změnit heslo'; + + @override + String get changeTheHomeserver => 'Změnit domovský server'; + + @override + String get changeTheme => 'Změňte svůj styl'; + + @override + String get changeTheNameOfTheGroup => 'Změnit název skupiny'; + + @override + String get changeYourAvatar => 'Změňte svůj avatar'; + + @override + String get channelCorruptedDecryptError => 'Šifrování bylo poškozeno'; + + @override + String get chat => 'Chat'; + + @override + String get yourChatBackupHasBeenSetUp => 'Vaše záloha chatu byla nastavena.'; + + @override + String get chatBackup => 'Záloha chatu'; + + @override + String get chatBackupDescription => + 'Záloha chatu je zabezpečena bezpečnostním klíčem. Ujistěte se, prosím, že klíč neztratíte.'; + + @override + String get chatDetails => 'Bližší údaje o chatu'; + + @override + String get chatHasBeenAddedToThisSpace => + 'Do tohoto prostoru byl přidán chat'; + + @override + String get chats => 'Chaty'; + + @override + String get chooseAStrongPassword => 'Vyberte silné heslo'; + + @override + String get clearArchive => 'Vymazat archiv'; + + @override + String get close => 'Zavřít'; + + @override + String get commandHint_markasdm => + 'Označit jako místnost přímé konverzace s daným Matrix ID'; + + @override + String get commandHint_markasgroup => 'Označit jako skupinu'; + + @override + String get commandHint_ban => + 'Zakázat danému uživateli přístup do této místnosti'; + + @override + String get commandHint_clearcache => 'Vymazat mezipamět'; + + @override + String get commandHint_create => + 'Vytvořte prázdný skupinový chat\n K deaktivaci šifrování použijte --no-encryption'; + + @override + String get commandHint_discardsession => 'Zahodit relaci'; + + @override + String get commandHint_dm => + 'Zahajte přímý chat\nK deaktivaci šifrování použijte --no-encryption'; + + @override + String get commandHint_html => 'Odeslat text ve formátu HTML'; + + @override + String get commandHint_invite => 'Pozvěte daného uživatele do této místnosti'; + + @override + String get commandHint_join => 'Připojte se k dané místnosti'; + + @override + String get commandHint_kick => 'Odeberte daného uživatele z této místnosti'; + + @override + String get commandHint_leave => 'Opusťte tuto místnost'; + + @override + String get commandHint_me => 'Představ se'; + + @override + String get commandHint_myroomavatar => + 'Nastavte si obrázek pro tuto místnost (autor mxc-uri)'; + + @override + String get commandHint_myroomnick => + 'Nastavte si váš zobrazovaný název pro tuto místnost'; + + @override + String get commandHint_op => + 'Nastavit úroveň práv daného uživatele (výchozí: 50)'; + + @override + String get commandHint_plain => 'Odeslat neformátovaný text'; + + @override + String get commandHint_react => 'Odeslat odpověď jako reakci'; + + @override + String get commandHint_send => 'Poslat zprávu'; + + @override + String get commandHint_unban => + 'Zrušte zákaz přístupu daného uživatele do této místnosti'; + + @override + String get commandInvalid => 'Příkaz je neplatný'; + + @override + String commandMissing(String command) { + return '$command není příkaz.'; + } + + @override + String get compareEmojiMatch => + 'Porovnejte a přesvědčete se, že následující emotikony se shodují na obou zařízeních:'; + + @override + String get compareNumbersMatch => + 'Porovnejte a přesvědčete se, že následující čísla se shodují na obou zařízeních:'; + + @override + String get configureChat => 'Nastavení chatu'; + + @override + String get confirm => 'Potvrdit'; + + @override + String get connect => 'Připojit'; + + @override + String get contactHasBeenInvitedToTheGroup => 'Kontakt byl pozván do skupiny'; + + @override + String get containsDisplayName => 'Obsahuje zobrazovaný název'; + + @override + String get containsUserName => 'Obsahuje uživatelské jméno'; + + @override + String get contentHasBeenReported => 'Obsah byl nahlášen správcům serveru'; + + @override + String get copiedToClipboard => 'Zkopírováno do schránky'; + + @override + String get copy => 'Kopírovat'; + + @override + String get copyToClipboard => 'Zkopírovat do schránky'; + + @override + String couldNotDecryptMessage(String error) { + return 'Nebylo možné dešifrovat zprávu: $error'; + } + + @override + String countParticipants(int count) { + return '$count účastníků'; + } + + @override + String get create => 'Vytvořit'; + + @override + String createdTheChat(String username) { + return '💬 $username založil/a chat'; + } + + @override + String get createGroup => 'Vytvořit skupinu'; + + @override + String get createNewSpace => 'Nový prostor'; + + @override + String get currentlyActive => 'Aktuálně aktivní'; + + @override + String get darkTheme => 'Tmavé'; + + @override + String dateAndTimeOfDay(String date, String timeOfDay) { + return '$date, $timeOfDay'; + } + + @override + String dateWithoutYear(String month, String day) { + return '$day.$month'; + } + + @override + String dateWithYear(String year, String month, String day) { + return '$day. $month. $year'; + } + + @override + String get deactivateAccountWarning => + 'Tímto krokem se deaktivuje váš uživatelský účet. Akci nelze vrátit zpět! Jste si jistí?'; + + @override + String get defaultPermissionLevel => + 'Výchozí úroveň oprávnění nových uživatelů'; + + @override + String get delete => 'Smazat'; + + @override + String get deleteAccount => 'Smazat účet'; + + @override + String get deleteMessage => 'Smazat zprávu'; + + @override + String get device => 'Zařízení'; + + @override + String get deviceId => 'ID zařízení'; + + @override + String get devices => 'Zařízení'; + + @override + String get directChats => 'Přímé chatování'; + + @override + String get allRooms => 'Všechny skupinové konverzace'; + + @override + String get displaynameHasBeenChanged => 'Přezdívka byla změněna'; + + @override + String get downloadFile => 'Stáhnout soubor'; + + @override + String get edit => 'Upravit'; + + @override + String get editBlockedServers => 'Upravit zakázané servery'; + + @override + String get chatPermissions => 'Oprávnění konverzace'; + + @override + String get editDisplayname => 'Změnit přezdívku'; + + @override + String get editRoomAliases => 'Upravit aliasy místností'; + + @override + String get editRoomAvatar => 'Upravit avatara místnosti'; + + @override + String get emoteExists => 'Emotikona již existuje!'; + + @override + String get emoteInvalid => 'Neplatný kód emotikony!'; + + @override + String get emoteKeyboardNoRecents => + 'Naposledy použité emoce se zobrazí zde...'; + + @override + String get emotePacks => 'Balíček emotikonů pro místnost'; + + @override + String get emoteSettings => 'Nastavení emotikonů'; + + @override + String get globalChatId => 'Globální ID chatu'; + + @override + String get accessAndVisibility => 'Přístup a viditelnost'; + + @override + String get accessAndVisibilityDescription => + 'Kdo se může připojit a najít tuto konverzaci.'; + + @override + String get calls => 'Volání'; + + @override + String get customEmojisAndStickers => 'Vlastní emoji a nálepky'; + + @override + String get customEmojisAndStickersBody => + 'Přidat nebo sdílet vlastní emoji nebo nálepky, které mohou být použité v konverzaci.'; + + @override + String get emoteShortcode => 'Klávesová zkratka emotikonu'; + + @override + String get emoteWarnNeedToPick => + 'Musíte si vybrat klávesovou zkratku emotikonu a obrázek!'; + + @override + String get emptyChat => 'Prázdný chat'; + + @override + String get enableEmotesGlobally => 'Povolit balíček emotikon všude'; + + @override + String get enableEncryption => 'Povolit šifrování'; + + @override + String get enableEncryptionWarning => + 'Šifrování již nebude možné vypnout. Jste si tím jisti?'; + + @override + String get encrypted => 'Šifrováno'; + + @override + String get encryption => 'Šifrování'; + + @override + String get encryptionNotEnabled => 'Šifrování není aktivní'; + + @override + String endedTheCall(String senderName) { + return '$senderName ukončil hovor'; + } + + @override + String get enterAnEmailAddress => 'Zadejte e-mailovou adresu'; + + @override + String get homeserver => 'Domácí server'; + + @override + String get enterYourHomeserver => 'Zadejte svůj domovský server'; + + @override + String errorObtainingLocation(String error) { + return 'Chyba při získávání polohy: $error'; + } + + @override + String get everythingReady => 'Vše připraveno!'; + + @override + String get extremeOffensive => 'Extrémně urážlivé'; + + @override + String get fileName => 'Název souboru'; + + @override + String get fluffychat => 'FluffyChat'; + + @override + String get fontSize => 'Velikost písma'; + + @override + String get forward => 'Přeposlat'; + + @override + String get fromJoining => 'Od vstupu'; + + @override + String get fromTheInvitation => 'Od pozvání'; + + @override + String get goToTheNewRoom => 'Přejít do nové místnost'; + + @override + String get group => 'Skupina'; + + @override + String get chatDescription => 'Popis konverzace'; + + @override + String get chatDescriptionHasBeenChanged => 'Popis konverzace byl změněn'; + + @override + String get groupIsPublic => 'Skupina je veřejná'; + + @override + String get groups => 'Skupiny'; + + @override + String groupWith(String displayname) { + return 'Skupina s $displayname'; + } + + @override + String get guestsAreForbidden => 'Hosté jsou zakázáni'; + + @override + String get guestsCanJoin => 'Hosté se mohou připojit'; + + @override + String hasWithdrawnTheInvitationFor(String username, String targetName) { + return '$username stáhl pozvánku pro $targetName'; + } + + @override + String get help => 'Pomoc'; + + @override + String get hideRedactedEvents => 'Skrýt redigované události'; + + @override + String get hideRedactedMessages => 'Skrýt upravené zprávy'; + + @override + String get hideRedactedMessagesBody => + 'Pokud někdo zprávu zrediguje, nebude tato zpráva v chatu již viditelná.'; + + @override + String get hideInvalidOrUnknownMessageFormats => + 'Skrytí nesprávných nebo neznámých formátů zpráv'; + + @override + String get howOffensiveIsThisContent => 'Jak urážlivý je tento obsah?'; + + @override + String get id => 'ID'; + + @override + String get identity => 'Identita'; + + @override + String get block => 'Blokovat'; + + @override + String get blockedUsers => 'Zablokování uživatelé'; + + @override + String get blockListDescription => + 'Můžete blokovat uživatele, kteří vás obtěžují. Od uživatelů na vašem osobním seznamu blokovaných uživatelů nebudete moci přijímat žádné zprávy ani pozvánky do místnosti.'; + + @override + String get blockUsername => 'Ignorovat uživatelské jméno'; + + @override + String get iHaveClickedOnLink => 'Klikl jsem na odkaz'; + + @override + String get incorrectPassphraseOrKey => + 'Nesprávné přístupové heslo anebo klíč pro obnovu'; + + @override + String get inoffensive => 'Neškodný'; + + @override + String get inviteContact => 'Pozvat kontakt'; + + @override + String inviteContactToGroupQuestion(Object contact, Object groupName) { + return 'Chcete pozvat $contact do konverzace \"$groupName\"?'; + } + + @override + String inviteContactToGroup(String groupName) { + return 'Pozvat kontakt do $groupName'; + } + + @override + String get noChatDescriptionYet => + 'Zatím nebyl vytvořen žádný popis konverzace.'; + + @override + String get tryAgain => 'Zkuste to znovu'; + + @override + String get invalidServerName => 'Neplatné jméno serveru'; + + @override + String get invited => 'Pozvaný'; + + @override + String get redactMessageDescription => + 'Tato zpráva bude smazána pro všechny účastníky konverzace. Tuto akci nelze vzít zpět.'; + + @override + String get optionalRedactReason => '(Nepovinné) Důvod smazání této zprávy…'; + + @override + String invitedUser(String username, String targetName) { + return '📩 $username pozval/a $targetName'; + } + + @override + String get invitedUsersOnly => 'Pouze pozvaní uživatelé'; + + @override + String get inviteForMe => 'Pozvěte mě'; + + @override + String inviteText(String username, String link) { + return '$username vás pozvali na FluffyChat.\n1. Navštivte fluffychat.im a nainstalujte si aplikaci.\n2. Zaregistrujte se anebo se přihlašte.\n3. Otevřete pozvánku: \n $link'; + } + + @override + String get isTyping => 'píše…'; + + @override + String joinedTheChat(String username) { + return '👋 $username se připojil/a k chatu'; + } + + @override + String get joinRoom => 'Připojte se k místnosti'; + + @override + String kicked(String username, String targetName) { + return '👞 $username vyhodil/a $targetName'; + } + + @override + String kickedAndBanned(String username, String targetName) { + return '$username vyhodili a zakázali $targetName'; + } + + @override + String get kickFromChat => 'Vyhodit z chatu'; + + @override + String lastActiveAgo(String localizedTimeShort) { + return 'Naposledy aktivní: $localizedTimeShort'; + } + + @override + String get leave => 'Opustit'; + + @override + String get leftTheChat => 'Opustil chat'; + + @override + String get license => 'Licence'; + + @override + String get lightTheme => 'Světlé'; + + @override + String loadCountMoreParticipants(int count) { + return 'Načíst dalších $count účastníků'; + } + + @override + String get dehydrate => 'Exportovat sezení a promazat zařízení'; + + @override + String get dehydrateWarning => + 'Tuto akci nelze vzít zpět. Ujistěte se že záložní soubor máte bezpečně uložen.'; + + @override + String get dehydrateTor => 'TOR uživatelé: Export sezení'; + + @override + String get dehydrateTorLong => + 'Uživatelům TOR se doporučuje exportovat sezení před zavřením okna.'; + + @override + String get hydrateTor => 'TOR uživatelé: Import exportovaného sezení'; + + @override + String get hydrateTorLong => + 'Exportovali jste vaše poslední sezení na TOR? Rychle jej importujte a pokračujte v konverzaci.'; + + @override + String get hydrate => 'Obnovit ze záložního souboru'; + + @override + String get loadingPleaseWait => 'Načítání… Prosíme vyčkejte.'; + + @override + String get loadMore => 'Načíst další…'; + + @override + String get locationDisabledNotice => + 'Služby určování polohy jsou deaktivovány. Povolte jim, aby mohli sdílet vaši polohu.'; + + @override + String get locationPermissionDeniedNotice => + 'Oprávnění k poloze odepřeno. Udělte jim prosím možnost sdílet vaši polohu.'; + + @override + String get login => 'Přihlásit se'; + + @override + String logInTo(String homeserver) { + return 'Přihlášení k $homeserver'; + } + + @override + String get logout => 'Odhlásit'; + + @override + String get memberChanges => 'Změny členů'; + + @override + String get mention => 'Zmínit se'; + + @override + String get messages => 'Zprávy'; + + @override + String get messagesStyle => 'Zprávy:'; + + @override + String get moderator => 'Moderátor'; + + @override + String get muteChat => 'Ztlumit chat'; + + @override + String get needPantalaimonWarning => + 'Prosím vezměte na vědomí, že pro použití koncového šifrování je prozatím potřeba použít Pantalaimon.'; + + @override + String get newChat => 'Nový chat'; + + @override + String get newMessageInFluffyChat => 'Nová zpráva ve FluffyChatu'; + + @override + String get newVerificationRequest => 'Nová žádost o ověření!'; + + @override + String get next => 'Další'; + + @override + String get no => 'Ne'; + + @override + String get noConnectionToTheServer => 'Žádné připojení k serveru'; + + @override + String get noEmotesFound => 'Nebyly nalezeny žádné emotikony. 😕'; + + @override + String get noEncryptionForPublicRooms => + 'Můžete aktivovat šifrování jakmile místnost přestane být veřejně dostupná.'; + + @override + String get noGoogleServicesWarning => + 'Zdá se, že služba Firebase Cloud Messaging není ve vašem zařízení k dispozici. Chcete-li i nadále přijímat push oznámení, doporučujeme nainstalovat ntfy. Pomocí ntfy nebo jiného poskytovatele Unified Push můžete přijímat oznámení push zabezpečeným způsobem přenosu dat. Aplikaci ntfy si můžete stáhnout z obchodu PlayStore nebo z webu F-Droid.'; + + @override + String noMatrixServer(String server1, String server2) { + return '$server1 není matrixový server, použít místo toho server $server2?'; + } + + @override + String get shareInviteLink => 'Sdílet pozvánku'; + + @override + String get scanQrCode => 'Naskenujte QR kód'; + + @override + String get none => 'Žádný'; + + @override + String get noPasswordRecoveryDescription => + 'Dosud jste nepřidali způsob, jak obnovit své heslo.'; + + @override + String get noPermission => 'Chybí oprávnění'; + + @override + String get noRoomsFound => 'Nebyly nalezeny žádné místnosti…'; + + @override + String get notifications => 'Oznámení'; + + @override + String get notificationsEnabledForThisAccount => + 'Oznámení povolena pro tento účet'; + + @override + String numUsersTyping(int count) { + return '$count uživatelé píší…'; + } + + @override + String get obtainingLocation => 'Získávání polohy…'; + + @override + String get offensive => 'Urážlivé'; + + @override + String get offline => 'Odpojeni'; + + @override + String get ok => 'Ok'; + + @override + String get online => 'Připojeni'; + + @override + String get onlineKeyBackupEnabled => 'Online záloha kíčů je zapnuta'; + + @override + String get oopsPushError => + 'Jejda! Při nastavování oznámení push došlo bohužel k chybě.'; + + @override + String get oopsSomethingWentWrong => 'Jejda, něco se pokazilo…'; + + @override + String get openAppToReadMessages => 'Otevřete aplikaci pro přečtení zpráv'; + + @override + String get openCamera => 'Otevřít fotoaparát'; + + @override + String get openVideoCamera => 'Otevřete fotoaparát pro video'; + + @override + String get oneClientLoggedOut => 'Jeden z vašich klientů byl odhlášen'; + + @override + String get addAccount => 'Přidat účet'; + + @override + String get editBundlesForAccount => 'Upravit balíčky pro tento účet'; + + @override + String get addToBundle => 'Přidat do balíčku'; + + @override + String get removeFromBundle => 'Odstranit z tohoto balíčku'; + + @override + String get bundleName => 'Název balíčku'; + + @override + String get enableMultiAccounts => + '(BETA) Na tomto zařízení povolte více účtů'; + + @override + String get openInMaps => 'Otevřít v mapách'; + + @override + String get link => 'Odkaz'; + + @override + String get serverRequiresEmail => + 'Tento server potřebuje k registraci ověřit vaši e -mailovou adresu.'; + + @override + String get or => 'Nebo'; + + @override + String get participant => 'Účastník'; + + @override + String get passphraseOrKey => 'heslo nebo klíč pro obnovení'; + + @override + String get password => 'Heslo'; + + @override + String get passwordForgotten => 'Zapomenuté heslo'; + + @override + String get passwordHasBeenChanged => 'Heslo bylo změněno'; + + @override + String get hideMemberChangesInPublicChats => + 'Skrýt změny členů ve veřejných chatech'; + + @override + String get hideMemberChangesInPublicChatsBody => + 'Nezobrazovat na časové ose chatu, pokud se někdo připojí nebo opustí veřejný chat, aby se zlepšila čitelnost.'; + + @override + String get overview => 'Přehled'; + + @override + String get notifyMeFor => 'Upozorněte mě na'; + + @override + String get passwordRecoverySettings => 'Nastavení obnovení hesla'; + + @override + String get passwordRecovery => 'Obnova hesla'; + + @override + String get people => 'Lidé'; + + @override + String get pickImage => 'Zvolit obrázek'; + + @override + String get pin => 'Připnout zprávu'; + + @override + String play(String fileName) { + return 'Přehrát $fileName'; + } + + @override + String get pleaseChoose => 'Prosím vyberte si'; + + @override + String get pleaseChooseAPasscode => 'Vyberte přístupový kód'; + + @override + String get pleaseClickOnLink => 'Klikněte na odkaz v e-mailu a pokračujte.'; + + @override + String get pleaseEnter4Digits => + 'Chcete-li deaktivovat zámek aplikace, zadejte 4 číslice nebo nechte prázdné.'; + + @override + String get pleaseEnterRecoveryKey => 'Prosím vložte váš klíč pro obnovení:'; + + @override + String get pleaseEnterYourPassword => 'Zadejte prosím své heslo'; + + @override + String get pleaseEnterYourPin => 'Zadejte svůj PIN'; + + @override + String get pleaseEnterYourUsername => 'Zadejte prosím své uživatelské jméno'; + + @override + String get pleaseFollowInstructionsOnWeb => + 'Postupujte podle pokynů na webu a klepněte na další.'; + + @override + String get privacy => 'Soukromí'; + + @override + String get publicRooms => 'Veřejné místnosti'; + + @override + String get pushRules => 'Pravidla push'; + + @override + String get reason => 'Důvod'; + + @override + String get recording => 'Nahrávání'; + + @override + String redactedBy(String username) { + return 'Smazáno uživatelem $username'; + } + + @override + String get directChat => 'Přímá konverzace'; + + @override + String redactedByBecause(String username, String reason) { + return 'Smazáno uživatelem $username s důvodem: \"$reason\"'; + } + + @override + String redactedAnEvent(String username) { + return '$username opravili událost'; + } + + @override + String get redactMessage => 'Redigovat zprávu'; + + @override + String get register => 'Registrovat'; + + @override + String get reject => 'Zamítnout'; + + @override + String rejectedTheInvitation(String username) { + return '$username odmítli pozvání'; + } + + @override + String get rejoin => 'Znovu se připojte'; + + @override + String get removeAllOtherDevices => 'Odstranit všechna další zařízení'; + + @override + String removedBy(String username) { + return 'Odstraněno $username'; + } + + @override + String get removeDevice => 'Odstraňit zařízení'; + + @override + String get unbanFromChat => 'Zrušit zákaz chatu'; + + @override + String get removeYourAvatar => 'Odstraňte svého avatara'; + + @override + String get replaceRoomWithNewerVersion => 'Nahradit místnost novou verzí'; + + @override + String get reply => 'Odpovědět'; + + @override + String get reportMessage => 'Nahlásit zprávu'; + + @override + String get translateMessage => 'Translate message'; + + @override + String get translatedMessage => 'Translated message'; + + @override + String get errorTranslatingMessage => + 'An error has occured while translating the message.'; + + @override + String get recoverMessage => 'Recover message'; + + @override + String get recoveredMessage => 'Recovered message'; + + @override + String get errorRecoveringMessage => + 'An error has occured while recovering the message.'; + + @override + String get errorRecoveringMessageNoAdmin => + 'This feature is available on Synapse homeservers only for adminstrators.'; + + @override + String get requestPermission => 'Vyžádat oprávnění'; + + @override + String get roomHasBeenUpgraded => 'Místnost byla upgradována'; + + @override + String get roomVersion => 'Verze místnosti'; + + @override + String get saveFile => 'Uložit soubor'; + + @override + String get retry => 'Retry'; + + @override + String get search => 'Hledat'; + + @override + String get security => 'Bezpečnostní'; + + @override + String get recoveryKey => 'Klíč k obnovení'; + + @override + String get recoveryKeyLost => 'Ztracený klíč k obnovení?'; + + @override + String seenByUser(String username) { + return 'Viděno uživatelem $username'; + } + + @override + String get send => 'Odeslat'; + + @override + String get sendAMessage => 'Odeslat zprávu'; + + @override + String get sendAsText => 'Odeslat jako text'; + + @override + String get sendAudio => 'Odeslat audio'; + + @override + String get sendFile => 'Odeslat soubor'; + + @override + String get sendImage => 'Odeslat obrázek'; + + @override + String sendImages(int count) { + return 'Send $count image'; + } + + @override + String get sendMessages => 'Odeslat zprávy'; + + @override + String get sendOriginal => 'Odeslat originál'; + + @override + String get sendSticker => 'Odeslat nálepku'; + + @override + String get sendVideo => 'Odeslat video'; + + @override + String sentAFile(String username) { + return '$username poslali soubor'; + } + + @override + String sentAnAudio(String username) { + return '$username poslali zvukovou nahrávku'; + } + + @override + String sentAPicture(String username) { + return '$username poslali obrázek'; + } + + @override + String sentASticker(String username) { + return '$username poslali samolepku'; + } + + @override + String sentAVideo(String username) { + return '$username poslali video'; + } + + @override + String sentCallInformations(String senderName) { + return '$senderName odeslal informace o hovoru'; + } + + @override + String get separateChatTypes => 'Odděĺlit přímé chaty, skupiny a prostory'; + + @override + String get setAsCanonicalAlias => 'Nastavit jako hlavní alias'; + + @override + String get setCustomEmotes => 'Nastavit vlastní emotikony'; + + @override + String get setChatDescription => 'Nastavit popis konverzace'; + + @override + String get setInvitationLink => 'Nastavit zvací odkaz'; + + @override + String get setPermissionsLevel => 'Nastavit úroveň oprávnění'; + + @override + String get setStatus => 'Nastavit stav'; + + @override + String get settings => 'Nastavení'; + + @override + String get share => 'Sdílet'; + + @override + String sharedTheLocation(String username) { + return '$username sdílel jejich polohu'; + } + + @override + String get shareLocation => 'Sdílet polohu'; + + @override + String get showPassword => 'Zobrazit heslo'; + + @override + String get presenceStyle => 'Dostupnost:'; + + @override + String get hideAvatarsInInvites => 'Hide avatars in invites'; + + @override + String get hideAvatarsInInvitesDescription => + 'Do not show room avatars in invites'; + + @override + String get presencesToggle => 'Zobrazení stavových zpráv od jiných uživatelů'; + + @override + String get pureBlackToggle => 'Pure Black'; + + @override + String get singlesignon => 'Jedinečné přihlášení'; + + @override + String get skip => 'Přeskočit'; + + @override + String get sourceCode => 'Zdrojové kódy'; + + @override + String get spaceIsPublic => 'Prostor je veřejný'; + + @override + String get spaceName => 'Název prostoru'; + + @override + String startedACall(String senderName) { + return '$senderName zahájil hovor'; + } + + @override + String get startFirstChat => 'Začněte svou první konverzaci'; + + @override + String get status => 'Stav'; + + @override + String get statusExampleMessage => 'Jak se dneska máš?'; + + @override + String get submit => 'Odeslat'; + + @override + String get synchronizingPleaseWait => 'Synchronizace ... Čekejte prosím.'; + + @override + String synchronizingPleaseWaitCounter(String percentage) { + return ' Synchronizing… ($percentage%)'; + } + + @override + String get systemTheme => 'Téma systému'; + + @override + String get theyDontMatch => 'Neshodují se'; + + @override + String get theyMatch => 'Shodují se'; + + @override + String get title => 'FluffyChat'; + + @override + String get toggleFavorite => 'Přepnout Oblíbené'; + + @override + String get toggleMuted => 'Přepnout ztlumené'; + + @override + String get toggleUnread => 'Označit jako přečtené/nepřečtené'; + + @override + String get tooManyRequestsWarning => + 'Příliš mnoho požadavků. Prosím zkuste to znovu později!'; + + @override + String get transferFromAnotherDevice => 'Přenos z jiného zařízení'; + + @override + String get tryToSendAgain => 'Zkuste odeslat znovu'; + + @override + String get unavailable => 'Nedostupní'; + + @override + String unbannedUser(String username, String targetName) { + return '$username zrušili zákaz pro $targetName'; + } + + @override + String get unblockDevice => 'Odblokovat zařízení'; + + @override + String get unknownDevice => 'Neznámé zařízení'; + + @override + String get unknownEncryptionAlgorithm => 'Neznámý šifrovací algoritmus'; + + @override + String unknownEvent(String type) { + return 'Neznámá událost „$type“'; + } + + @override + String get unmuteChat => 'Zrušit ztlumení chatu'; + + @override + String get unpin => 'Odepnout zprávu'; + + @override + String unreadChats(int unreadCount) { + String _temp0 = intl.Intl.pluralLogic( + unreadCount, + locale: localeName, + other: '$unreadCount nepřečtené chaty', + one: '1 nepřečtený chat', + ); + return '$_temp0'; + } + + @override + String userAndOthersAreTyping(String username, int count) { + return '$username a $count dalších píší…'; + } + + @override + String userAndUserAreTyping(String username, String username2) { + return '$username a $username2 píší…'; + } + + @override + String userIsTyping(String username) { + return '$username píše…'; + } + + @override + String userLeftTheChat(String username) { + return '$username opustili chat'; + } + + @override + String get username => 'Uživatelské jméno'; + + @override + String userSentUnknownEvent(String username, String type) { + return '$username poslali událost $type'; + } + + @override + String get unverified => 'Neověřeno'; + + @override + String get verified => 'Ověřeno'; + + @override + String get verify => 'Ověřit'; + + @override + String get verifyStart => 'Zahájit ověření'; + + @override + String get verifySuccess => 'Ověření proběhlo úspěšně!'; + + @override + String get verifyTitle => 'Ověřuji druhý účet'; + + @override + String get videoCall => 'Video hovor'; + + @override + String get visibilityOfTheChatHistory => 'Viditelnost historie chatu'; + + @override + String get visibleForAllParticipants => 'Viditelné pro všechny účastnící se'; + + @override + String get visibleForEveryone => 'Viditelné pro všechny'; + + @override + String get voiceMessage => 'Hlasová zpráva'; + + @override + String get waitingPartnerAcceptRequest => + 'Čeká se na potvrzení žádosti partnerem…'; + + @override + String get waitingPartnerEmoji => 'Čeká se na potvrzení emoji partnerem…'; + + @override + String get waitingPartnerNumbers => 'Čekání na partnera až přijme čísla…'; + + @override + String get wallpaper => 'Pozadí:'; + + @override + String get warning => 'Varování!'; + + @override + String get weSentYouAnEmail => 'Zaslali jsme vám e-mail'; + + @override + String get whoCanPerformWhichAction => 'Kdo může provést jakou akci'; + + @override + String get whoIsAllowedToJoinThisGroup => + 'Kdo se může připojit do této skupiny'; + + @override + String get whyDoYouWantToReportThis => 'Proč to chcete nahlásit?'; + + @override + String get wipeChatBackup => + 'Chcete vymazat zálohu chatu a vytvořit nový bezpečnostní klíč?'; + + @override + String get withTheseAddressesRecoveryDescription => + 'S těmito adresami můžete obnovit své heslo.'; + + @override + String get writeAMessage => 'Napište zprávu…'; + + @override + String get yes => 'Ano'; + + @override + String get you => 'Vy'; + + @override + String get youAreNoLongerParticipatingInThisChat => + 'Tohoto chatu se nadále neúčastníte'; + + @override + String get youHaveBeenBannedFromThisChat => + 'Byl vám zablokován přístup k tomuto chatu'; + + @override + String get yourPublicKey => 'Váš veřejný klíč'; + + @override + String get messageInfo => 'Informace o zprávě'; + + @override + String get time => 'Čas'; + + @override + String get messageType => 'Typ zprávy'; + + @override + String get sender => 'Odesílatel'; + + @override + String get openGallery => 'Otevřít galerii'; + + @override + String get removeFromSpace => 'Odstranit z tohoto místa'; + + @override + String get addToSpaceDescription => + 'Vyberte umístění, do kterého chcete tento chat přidat.'; + + @override + String get start => 'Start'; + + @override + String get pleaseEnterRecoveryKeyDescription => + 'K odemknutí vašich starých zpráv prosím vložte váš klíč k obnovení vygenerovaný v předchozím sezení. Váš klíč k obnovení NENÍ vaše heslo.'; + + @override + String get publish => 'Uveřejnit'; + + @override + String videoWithSize(String size) { + return 'Video ($size)'; + } + + @override + String get openChat => 'Otevřete chat'; + + @override + String get markAsRead => 'Označit jako přečtené'; + + @override + String get reportUser => 'Nahlásit uživatele'; + + @override + String get dismiss => 'Zavrhnout'; + + @override + String reactedWith(String sender, String reaction) { + return '$sender reagoval s $reaction'; + } + + @override + String get pinMessage => 'Připnout zprávu do místnosti'; + + @override + String get confirmEventUnpin => 'Opravdu chcete událost trvale odepnout?'; + + @override + String get emojis => 'Emojis'; + + @override + String get placeCall => 'Zavolejte'; + + @override + String get voiceCall => 'Hlasový hovor'; + + @override + String get unsupportedAndroidVersion => 'Nepodporovaná verze Androidu'; + + @override + String get unsupportedAndroidVersionLong => + 'Tato funkce vyžaduje novější verzi Android. Zkontrolujte prosím aktualizace nebo podporu Lineage OS.'; + + @override + String get videoCallsBetaWarning => + 'Upozorňujeme, že videohovory jsou aktuálně ve verzi beta. Nemusí fungovat podle očekávání nebo fungovat vůbec na všech platformách.'; + + @override + String get experimentalVideoCalls => 'Experimentální videohovory'; + + @override + String get emailOrUsername => 'E-mail nebo uživatelské jméno'; + + @override + String get indexedDbErrorTitle => 'Problémy privátního prostředí'; + + @override + String get indexedDbErrorLong => + 'Ukládání zpráv bohužel není ve výchozím nastavení v soukromém režimu povoleno.\nNavštivte prosím\n - about:config\n - nastavte dom.indexedDB.privateBrowsing.enabled na true\nV opačném případě nebude možné FluffyChat spustit.'; + + @override + String switchToAccount(String number) { + return 'Přepnout na účet $number'; + } + + @override + String get nextAccount => 'Další účet'; + + @override + String get previousAccount => 'Předchozí účet'; + + @override + String get addWidget => 'Přidat widget'; + + @override + String get widgetVideo => 'Video'; + + @override + String get widgetEtherpad => 'Textová poznámka'; + + @override + String get widgetJitsi => 'Jitsi Meet'; + + @override + String get widgetCustom => 'Vlastní'; + + @override + String get widgetName => 'Jméno'; + + @override + String get widgetUrlError => 'Toto není platná adresa URL.'; + + @override + String get widgetNameError => 'Zadejte jméno pro zobrazení.'; + + @override + String get errorAddingWidget => 'Chyba při přidávání widgetu.'; + + @override + String get youRejectedTheInvitation => 'Odmítli jste pozvání'; + + @override + String get youJoinedTheChat => 'Připojili jste se k chatu'; + + @override + String get youAcceptedTheInvitation => 'Přijal jsi pozvání'; + + @override + String youBannedUser(String user) { + return 'Zakázali jste uživatele $user'; + } + + @override + String youHaveWithdrawnTheInvitationFor(String user) { + return 'Stáhli jste pozvánku pro uživatele $user'; + } + + @override + String youInvitedToBy(String alias) { + return '📩 Prostřednictvím odkazu jste byli pozváni na:\n$alias'; + } + + @override + String youInvitedBy(String user) { + return 'Byli jste pozváni uživatelem $user'; + } + + @override + String invitedBy(String user) { + return '📩 Invited by $user'; + } + + @override + String youInvitedUser(String user) { + return 'Pozvali jste uživatele $user'; + } + + @override + String youKicked(String user) { + return 'Vykopli jste uživatele $user'; + } + + @override + String youKickedAndBanned(String user) { + return 'Vykopli jste a zakázali jste uživatele $user'; + } + + @override + String youUnbannedUser(String user) { + return 'Zrušili jste zákaz uživateli $user'; + } + + @override + String hasKnocked(String user) { + return '🚪 $user has knocked'; + } + + @override + String get usersMustKnock => 'Users must knock'; + + @override + String get noOneCanJoin => 'No one can join'; + + @override + String userWouldLikeToChangeTheChat(String user) { + return '$user would like to join the chat.'; + } + + @override + String get noPublicLinkHasBeenCreatedYet => + 'No public link has been created yet'; + + @override + String get knock => 'Knock'; + + @override + String get users => 'Uživatelé'; + + @override + String get unlockOldMessages => 'Odemknout staré zprávy'; + + @override + String get storeInSecureStorageDescription => + 'Klíč k obnovení uložte v zabezpečeném úložišti tohoto zařízení.'; + + @override + String get saveKeyManuallyDescription => + 'Uložte tento klíč manuálně pomocí systémového dialogu sdílení nebo zkopírováním do schránky.'; + + @override + String get storeInAndroidKeystore => 'Uložit v Android KeyStore'; + + @override + String get storeInAppleKeyChain => 'Uložit v Apple KeyChain'; + + @override + String get storeSecurlyOnThisDevice => 'Uložit bezpečně na tomto zařízení'; + + @override + String countFiles(int count) { + return '$count souborů'; + } + + @override + String get user => 'Uživatel'; + + @override + String get custom => 'Vlastní'; + + @override + String get foregroundServiceRunning => + 'Toto oznámení se zobrazuje když běží služba na pozadí.'; + + @override + String get screenSharingTitle => 'sdílení obrazovky'; + + @override + String get screenSharingDetail => 'Sdílíte svou obrazovku přes FluffyChat'; + + @override + String get callingPermissions => 'Oprávnění volání'; + + @override + String get callingAccount => 'Calling account'; + + @override + String get callingAccountDetails => + 'Opravňuje FluffyChat používat Android systémovou aplikaci pro vytáčení.'; + + @override + String get appearOnTop => 'Zobrazovat nahoře'; + + @override + String get appearOnTopDetails => + 'Allows the app to appear on top (not needed if you already have Fluffychat setup as a calling account)'; + + @override + String get otherCallingPermissions => + 'Mikrofon, kamera a ostatní oprávnění FluffyChat'; + + @override + String get whyIsThisMessageEncrypted => 'Proč nelze přečíst tuto zprávu?'; + + @override + String get noKeyForThisMessage => + 'This can happen if the message was sent before you have signed in to your account at this device.\n\nIt is also possible that the sender has blocked your device or something went wrong with the internet connection.\n\nAre you able to read the message on another session? Then you can transfer the message from it! Go to Settings > Devices and make sure that your devices have verified each other. When you open the room the next time and both sessions are in the foreground, the keys will be transmitted automatically.\n\nDo you not want to lose the keys when logging out or switching devices? Make sure that you have enabled the chat backup in the settings.'; + + @override + String get newGroup => 'Nová skupina'; + + @override + String get newSpace => 'Nový prostor'; + + @override + String get enterSpace => 'Enter space'; + + @override + String get enterRoom => 'Enter room'; + + @override + String get allSpaces => 'Všechny prostory'; + + @override + String numChats(String number) { + return '$number konverzací'; + } + + @override + String get hideUnimportantStateEvents => 'Hide unimportant state events'; + + @override + String get hidePresences => 'Hide Status List?'; + + @override + String get doNotShowAgain => 'Nezobrazovat znovu'; + + @override + String wasDirectChatDisplayName(String oldDisplayName) { + return 'Prázdná konverzace (dříve $oldDisplayName)'; + } + + @override + String get newSpaceDescription => + 'Prostory umožňují organizovat vaše konverzace a vytvářet soukromé nebo veřejné komunity'; + + @override + String get encryptThisChat => 'Zašifrovat tuto konverzaci'; + + @override + String get disableEncryptionWarning => + 'Z bezpečnostních důvodů nemůžete vypnout šifrování v chatu, kde již bylo dříve zapnuto.'; + + @override + String get sorryThatsNotPossible => 'Omlouváme se… to není možné'; + + @override + String get deviceKeys => 'Klíče zařízení:'; + + @override + String get reopenChat => 'Znovu otevřít konverzaci'; + + @override + String get noBackupWarning => + 'Warning! Without enabling chat backup, you will lose access to your encrypted messages. It is highly recommended to enable the chat backup first before logging out.'; + + @override + String get noOtherDevicesFound => 'Žádná ostatní zařízení nebyla nalezena'; + + @override + String fileIsTooBigForServer(String max) { + return 'Server oznamuje že soubor je příliš velký na odeslání.'; + } + + @override + String fileHasBeenSavedAt(String path) { + return 'Soubor uložen do $path'; + } + + @override + String get jumpToLastReadMessage => 'Skočit na naposledy přečtenou zprávu'; + + @override + String get readUpToHere => 'Read up to here'; + + @override + String get jump => 'Skočit'; + + @override + String get openLinkInBrowser => 'Otevřít odkaz v prohlížeči'; + + @override + String get reportErrorDescription => + '😭 Oh no. Something went wrong. If you want, you can report this bug to the developers.'; + + @override + String get report => 'Report'; + + @override + String get signInWithPassword => 'Přihlásit se pomocí hesla'; + + @override + String get pleaseTryAgainLaterOrChooseDifferentServer => + 'Prosím zkuste to znovu nebo si vyberte jiný server.'; + + @override + String signInWith(String provider) { + return 'Přihlásit se pomocí $provider'; + } + + @override + String get profileNotFound => + 'Uživatel nebyl na serveru nalezen. Možná je problém s připojením nebo uživatel neexistuje.'; + + @override + String get setTheme => 'Nastavit vzhled:'; + + @override + String get setColorTheme => 'Nastavit barvy:'; + + @override + String get invite => 'Invite'; + + @override + String get inviteGroupChat => '📨 Invite group chat'; + + @override + String get invitePrivateChat => '📨 Invite private chat'; + + @override + String get invalidInput => 'Invalid input!'; + + @override + String wrongPinEntered(int seconds) { + return 'Wrong pin entered! Try again in $seconds seconds...'; + } + + @override + String get pleaseEnterANumber => 'Please enter a number greater than 0'; + + @override + String get archiveRoomDescription => + 'The chat will be moved to the archive. Other users will be able to see that you have left the chat.'; + + @override + String get roomUpgradeDescription => + 'The chat will then be recreated with the new room version. All participants will be notified that they need to switch to the new chat. You can find out more about room versions at https://spec.matrix.org/latest/rooms/'; + + @override + String get removeDevicesDescription => + 'You will be logged out of this device and will no longer be able to receive messages.'; + + @override + String get banUserDescription => + 'The user will be banned from the chat and will not be able to enter the chat again until they are unbanned.'; + + @override + String get unbanUserDescription => + 'The user will be able to enter the chat again if they try.'; + + @override + String get kickUserDescription => + 'The user is kicked out of the chat but not banned. In public chats, the user can rejoin at any time.'; + + @override + String get makeAdminDescription => + 'Once you make this user admin, you may not be able to undo this as they will then have the same permissions as you.'; + + @override + String get pushNotificationsNotAvailable => + 'Push notifications not available'; + + @override + String get learnMore => 'Learn more'; + + @override + String get yourGlobalUserIdIs => 'Your global user-ID is: '; + + @override + String noUsersFoundWithQuery(String query) { + return 'Unfortunately no user could be found with \"$query\". Please check whether you made a typo.'; + } + + @override + String get knocking => 'Knocking'; + + @override + String chatCanBeDiscoveredViaSearchOnServer(String server) { + return 'Chat can be discovered via the search on $server'; + } + + @override + String get searchChatsRooms => 'Search for #chats, @users...'; + + @override + String get nothingFound => 'Nothing found...'; + + @override + String get groupName => 'Group name'; + + @override + String get createGroupAndInviteUsers => 'Create a group and invite users'; + + @override + String get groupCanBeFoundViaSearch => 'Group can be found via search'; + + @override + String get wrongRecoveryKey => + 'Sorry... this does not seem to be the correct recovery key.'; + + @override + String get startConversation => 'Start conversation'; + + @override + String get commandHint_sendraw => 'Send raw json'; + + @override + String get databaseMigrationTitle => 'Database is optimized'; + + @override + String get databaseMigrationBody => 'Please wait. This may take a moment.'; + + @override + String get leaveEmptyToClearStatus => 'Leave empty to clear your status.'; + + @override + String get select => 'Select'; + + @override + String get searchForUsers => 'Search for @users...'; + + @override + String get pleaseEnterYourCurrentPassword => + 'Please enter your current password'; + + @override + String get newPassword => 'New password'; + + @override + String get pleaseChooseAStrongPassword => 'Please choose a strong password'; + + @override + String get passwordsDoNotMatch => 'Passwords do not match'; + + @override + String get passwordIsWrong => 'Your entered password is wrong'; + + @override + String get publicLink => 'Public link'; + + @override + String get publicChatAddresses => 'Public chat addresses'; + + @override + String get createNewAddress => 'Create new address'; + + @override + String get joinSpace => 'Join space'; + + @override + String get publicSpaces => 'Public spaces'; + + @override + String get addChatOrSubSpace => 'Add chat or sub space'; + + @override + String get subspace => 'Subspace'; + + @override + String get decline => 'Decline'; + + @override + String get thisDevice => 'This device:'; + + @override + String get initAppError => 'An error occured while init the app'; + + @override + String get userRole => 'User role'; + + @override + String minimumPowerLevel(String level) { + return '$level is the minimum power level.'; + } + + @override + String searchIn(String chat) { + return 'Search in chat \"$chat\"...'; + } + + @override + String get searchMore => 'Search more...'; + + @override + String get gallery => 'Gallery'; + + @override + String get files => 'Files'; + + @override + String databaseBuildErrorBody(String url, String error) { + return 'Unable to build the SQlite database. The app tries to use the legacy database for now. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String sessionLostBody(String url, String error) { + return 'Your session is lost. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String restoreSessionBody(String url, String error) { + return 'The app now tries to restore your session from the backup. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String forwardMessageTo(String roomName) { + return 'Forward message to $roomName?'; + } + + @override + String get sendReadReceipts => 'Send read receipts'; + + @override + String get sendTypingNotificationsDescription => + 'Other participants in a chat can see when you are typing a new message.'; + + @override + String get sendReadReceiptsDescription => + 'Other participants in a chat can see when you have read a message.'; + + @override + String get formattedMessages => 'Formatted messages'; + + @override + String get formattedMessagesDescription => + 'Display rich message content like bold text using markdown.'; + + @override + String get verifyOtherUser => '🔐 Verify other user'; + + @override + String get verifyOtherUserDescription => + 'If you verify another user, you can be sure that you know who you are really writing to. 💪\n\nWhen you start a verification, you and the other user will see a popup in the app. There you will then see a series of emojis or numbers that you have to compare with each other.\n\nThe best way to do this is to meet up or start a video call. 👭'; + + @override + String get verifyOtherDevice => '🔐 Verify other device'; + + @override + String get verifyOtherDeviceDescription => + 'When you verify another device, those devices can exchange keys, increasing your overall security. 💪 When you start a verification, a popup will appear in the app on both devices. There you will then see a series of emojis or numbers that you have to compare with each other. It\'s best to have both devices handy before you start the verification. 🤳'; + + @override + String acceptedKeyVerification(String sender) { + return '$sender accepted key verification'; + } + + @override + String canceledKeyVerification(String sender) { + return '$sender canceled key verification'; + } + + @override + String completedKeyVerification(String sender) { + return '$sender completed key verification'; + } + + @override + String isReadyForKeyVerification(String sender) { + return '$sender is ready for key verification'; + } + + @override + String requestedKeyVerification(String sender) { + return '$sender requested key verification'; + } + + @override + String startedKeyVerification(String sender) { + return '$sender started key verification'; + } + + @override + String get transparent => 'Transparent'; + + @override + String get incomingMessages => 'Incoming messages'; + + @override + String get stickers => 'Stickers'; + + @override + String get discover => 'Discover'; + + @override + String get commandHint_ignore => 'Ignore the given matrix ID'; + + @override + String get commandHint_unignore => 'Unignore the given matrix ID'; + + @override + String unreadChatsInApp(String appname, String unread) { + return '$appname: $unread unread chats'; + } + + @override + String get noDatabaseEncryption => + 'Database encryption is not supported on this platform'; + + @override + String thereAreCountUsersBlocked(Object count) { + return 'Right now there are $count users blocked.'; + } + + @override + String get restricted => 'Restricted'; + + @override + String get knockRestricted => 'Knock restricted'; + + @override + String goToSpace(Object space) { + return 'Go to space: $space'; + } + + @override + String get markAsUnread => 'Mark as unread'; + + @override + String userLevel(int level) { + return '$level - User'; + } + + @override + String moderatorLevel(int level) { + return '$level - Moderator'; + } + + @override + String adminLevel(int level) { + return '$level - Admin'; + } + + @override + String get changeGeneralChatSettings => 'Change general chat settings'; + + @override + String get inviteOtherUsers => 'Invite other users to this chat'; + + @override + String get changeTheChatPermissions => 'Change the chat permissions'; + + @override + String get changeTheVisibilityOfChatHistory => + 'Change the visibility of the chat history'; + + @override + String get changeTheCanonicalRoomAlias => + 'Change the main public chat address'; + + @override + String get sendRoomNotifications => 'Send a @room notifications'; + + @override + String get changeTheDescriptionOfTheGroup => + 'Change the description of the chat'; + + @override + String get chatPermissionsDescription => + 'Define which power level is necessary for certain actions in this chat. The power levels 0, 50 and 100 are usually representing users, moderators and admins, but any gradation is possible.'; + + @override + String updateInstalled(String version) { + return '🎉 Update $version installed!'; + } + + @override + String get changelog => 'Changelog'; + + @override + String get sendCanceled => 'Sending canceled'; + + @override + String get loginWithMatrixId => 'Login with Matrix-ID'; + + @override + String get discoverHomeservers => 'Discover homeservers'; + + @override + String get whatIsAHomeserver => 'What is a homeserver?'; + + @override + String get homeserverDescription => + 'All your data is stored on the homeserver, just like an email provider. You can choose which homeserver you want to use, while you can still communicate with everyone. Learn more at at https://matrix.org.'; + + @override + String get doesNotSeemToBeAValidHomeserver => + 'Doesn\'t seem to be a compatible homeserver. Wrong URL?'; + + @override + String get calculatingFileSize => 'Calculating file size...'; + + @override + String get prepareSendingAttachment => 'Prepare sending attachment...'; + + @override + String get sendingAttachment => 'Sending attachment...'; + + @override + String get generatingVideoThumbnail => 'Generating video thumbnail...'; + + @override + String get compressVideo => 'Compressing video...'; + + @override + String sendingAttachmentCountOfCount(int index, int length) { + return 'Sending attachment $index of $length...'; + } + + @override + String serverLimitReached(int seconds) { + return 'Server limit reached! Waiting $seconds seconds...'; + } + + @override + String get oneOfYourDevicesIsNotVerified => + 'One of your devices is not verified'; + + @override + String get noticeChatBackupDeviceVerification => + 'Note: When you connect all your devices to the chat backup, they are automatically verified.'; + + @override + String get continueText => 'Continue'; + + @override + String get welcomeText => + 'Hey Hey 👋 This is Extera. You can sign in to any homeserver, which is compatible with https://matrix.org. And then chat with anyone. It\'s a huge decentralized messaging network!'; + + @override + String get blur => 'Blur:'; + + @override + String get opacity => 'Opacity:'; + + @override + String get setWallpaper => 'Set wallpaper'; + + @override + String get manageAccount => 'Manage account'; + + @override + String get noContactInformationProvided => + 'Server does not provide any valid contact information'; + + @override + String get contactServerAdmin => 'Contact server admin'; + + @override + String get contactServerSecurity => 'Contact server security'; + + @override + String get supportPage => 'Support page'; + + @override + String get serverInformation => 'Server information:'; + + @override + String get name => 'Name'; + + @override + String get version => 'Version'; + + @override + String get website => 'Website'; + + @override + String get compress => 'Compress'; + + @override + String get boldText => 'Bold text'; + + @override + String get italicText => 'Italic text'; + + @override + String get strikeThrough => 'Strikethrough'; + + @override + String get pleaseFillOut => 'Please fill out'; + + @override + String get invalidUrl => 'Invalid url'; + + @override + String get addLink => 'Add link'; + + @override + String get unableToJoinChat => + 'Unable to join chat. Maybe the other party has already closed the conversation.'; + + @override + String get previous => 'Previous'; + + @override + String get otherPartyNotLoggedIn => + 'The other party is currently not logged in and therefore cannot receive messages!'; + + @override + String appWantsToUseForLogin(String server) { + return 'Use \'$server\' to log in'; + } + + @override + String get appWantsToUseForLoginDescription => + 'You hereby allow the app and website to share information about you.'; + + @override + String get open => 'Open'; + + @override + String get waitingForServer => 'Waiting for server...'; + + @override + String get appIntroduction => + 'Extera lets you chat with your friends across different messengers. Learn more at https://matrix.org or just tap *Continue*.'; + + @override + String get newChatRequest => '📩 New chat request'; + + @override + String get contentNotificationSettings => 'Content notification settings'; + + @override + String get generalNotificationSettings => 'General notification settings'; + + @override + String get roomNotificationSettings => 'Room notification settings'; + + @override + String get userSpecificNotificationSettings => + 'User specific notification settings'; + + @override + String get otherNotificationSettings => 'Other notification settings'; + + @override + String get notificationRuleContainsUserName => 'Contains User Name'; + + @override + String get notificationRuleContainsUserNameDescription => + 'Notifies the user when a message contains their username.'; + + @override + String get notificationRuleMaster => 'Mute all notifications'; + + @override + String get notificationRuleMasterDescription => + 'Overrides all other rules and disables all notifications.'; + + @override + String get notificationRuleSuppressNotices => 'Suppress Automated Messages'; + + @override + String get notificationRuleSuppressNoticesDescription => + 'Suppresses notifications from automated clients like bots.'; + + @override + String get notificationRuleInviteForMe => 'Invite for Me'; + + @override + String get notificationRuleInviteForMeDescription => + 'Notifies the user when they are invited to a room.'; + + @override + String get notificationRuleMemberEvent => 'Member Event'; + + @override + String get notificationRuleMemberEventDescription => + 'Suppresses notifications for membership events.'; + + @override + String get notificationRuleIsUserMention => 'User Mention'; + + @override + String get notificationRuleIsUserMentionDescription => + 'Notifies the user when they are directly mentioned in a message.'; + + @override + String get notificationRuleContainsDisplayName => 'Contains Display Name'; + + @override + String get notificationRuleContainsDisplayNameDescription => + 'Notifies the user when a message contains their display name.'; + + @override + String get notificationRuleIsRoomMention => 'Room Mention'; + + @override + String get notificationRuleIsRoomMentionDescription => + 'Notifies the user when there is a room mention.'; + + @override + String get notificationRuleRoomnotif => 'Room Notification'; + + @override + String get notificationRuleRoomnotifDescription => + 'Notifies the user when a message contains \'@room\'.'; + + @override + String get notificationRuleTombstone => 'Tombstone'; + + @override + String get notificationRuleTombstoneDescription => + 'Notifies the user about room deactivation messages.'; + + @override + String get notificationRuleReaction => 'Reaction'; + + @override + String get notificationRuleReactionDescription => + 'Suppresses notifications for reactions.'; + + @override + String get notificationRuleRoomServerAcl => 'Room Server ACL'; + + @override + String get notificationRuleRoomServerAclDescription => + 'Suppresses notifications for room server access control lists (ACL).'; + + @override + String get notificationRuleSuppressEdits => 'Suppress Edits'; + + @override + String get notificationRuleSuppressEditsDescription => + 'Suppresses notifications for edited messages.'; + + @override + String get notificationRuleCall => 'Call'; + + @override + String get notificationRuleCallDescription => + 'Notifies the user about calls.'; + + @override + String get notificationRuleEncryptedRoomOneToOne => + 'Encrypted Room One-to-One'; + + @override + String get notificationRuleEncryptedRoomOneToOneDescription => + 'Notifies the user about messages in encrypted one-to-one rooms.'; + + @override + String get notificationRuleRoomOneToOne => 'Room One-to-One'; + + @override + String get notificationRuleRoomOneToOneDescription => + 'Notifies the user about messages in one-to-one rooms.'; + + @override + String get notificationRuleMessage => 'Message'; + + @override + String get notificationRuleMessageDescription => + 'Notifies the user about general messages.'; + + @override + String get notificationRuleEncrypted => 'Encrypted'; + + @override + String get notificationRuleEncryptedDescription => + 'Notifies the user about messages in encrypted rooms.'; + + @override + String get notificationRuleJitsi => 'Jitsi'; + + @override + String get notificationRuleJitsiDescription => + 'Notifies the user about Jitsi widget events.'; + + @override + String get notificationRuleServerAcl => 'Suppress Server ACL Events'; + + @override + String get notificationRuleServerAclDescription => + 'Suppresses notifications for Server ACL events.'; + + @override + String unknownPushRule(String rule) { + return 'Unknown push rule \'$rule\''; + } + + @override + String get deletePushRuleCanNotBeUndone => + 'If you delete this notification setting, this can not be undone.'; + + @override + String get more => 'More'; + + @override + String get shareKeysWith => 'Share keys with...'; + + @override + String get shareKeysWithDescription => + 'Which devices should be trusted so that they can read along your messages in encrypted chats?'; + + @override + String get allDevices => 'All devices'; + + @override + String get crossVerifiedDevicesIfEnabled => + 'Cross verified devices if enabled'; + + @override + String get crossVerifiedDevices => 'Cross verified devices'; + + @override + String get verifiedDevicesOnly => 'Verified devices only'; + + @override + String get takeAPhoto => 'Take a photo'; + + @override + String get recordAVideo => 'Record a video'; + + @override + String get optionalMessage => '(Optional) message...'; + + @override + String get notSupportedOnThisDevice => 'Not supported on this device'; + + @override + String get enterNewChat => 'Enter new chat'; + + @override + String get approve => 'Approve'; + + @override + String get youHaveKnocked => 'You have knocked'; + + @override + String get pleaseWaitUntilInvited => + 'Please wait now, until someone from the room invites you.'; +} diff --git a/lib/generated/l10n/l10n_de.dart b/lib/generated/l10n/l10n_de.dart new file mode 100644 index 0000000..aba34ab --- /dev/null +++ b/lib/generated/l10n/l10n_de.dart @@ -0,0 +1,2769 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'l10n.dart'; + +// ignore_for_file: type=lint + +/// The translations for German (`de`). +class L10nDe extends L10n { + L10nDe([String locale = 'de']) : super(locale); + + @override + String get noSendPermission => 'You can\'t send messages here'; + + @override + String get alwaysUse24HourFormat => 'true'; + + @override + String get repeatPassword => 'Passwort wiederholen'; + + @override + String get notAnImage => 'Keine Bilddatei.'; + + @override + String get setCustomPermissionLevel => 'Set custom permission level'; + + @override + String get setPermissionsLevelDescription => + 'Please choose a predefined role below or enter a custom permission level between 0 and 100.'; + + @override + String get ignoreUser => 'Ignore user'; + + @override + String get normalUser => 'Normal user'; + + @override + String get remove => 'Entfernen'; + + @override + String get importNow => 'Jetzt importieren'; + + @override + String get importEmojis => 'Emojis importieren'; + + @override + String get importFromZipFile => 'Aus ZIP-Datei importieren'; + + @override + String get exportEmotePack => 'Emote-Paket als ZIP-Datei exportieren'; + + @override + String get replace => 'Ersetzen'; + + @override + String get about => 'Über'; + + @override + String aboutHomeserver(String homeserver) { + return 'Über $homeserver'; + } + + @override + String get accept => 'Annehmen'; + + @override + String acceptedTheInvitation(String username) { + return '👍 $username hat die Einladung angenommen'; + } + + @override + String get account => 'Konto'; + + @override + String activatedEndToEndEncryption(String username) { + return '🔐 $username hat Ende-zu-Ende Verschlüsselung aktiviert'; + } + + @override + String get addEmail => 'E-Mail hinzufügen'; + + @override + String get confirmMatrixId => + 'Bitte bestätigen deine Matrix-ID, um dein Konto zu löschen.'; + + @override + String supposedMxid(String mxid) { + return 'das sollte sein $mxid'; + } + + @override + String get addChatDescription => 'Chatbeschreibung hinzufügen ...'; + + @override + String get addToSpace => 'Zum Space hinzufügen'; + + @override + String get admin => 'Admin'; + + @override + String get alias => 'Alias'; + + @override + String get all => 'Alle'; + + @override + String get allChats => 'Alle Chats'; + + @override + String get commandHint_roomupgrade => + 'Upgrade this room to the given room version'; + + @override + String get commandHint_googly => 'Glupschaugen senden'; + + @override + String get commandHint_cuddle => 'Umarmung senden'; + + @override + String get commandHint_hug => 'Umarmung senden'; + + @override + String googlyEyesContent(String senderName) { + return '$senderName hat dir Googly Eyes gesendet'; + } + + @override + String cuddleContent(String senderName) { + return '$senderName knuddelt dich'; + } + + @override + String hugContent(String senderName) { + return '$senderName umarmt dich'; + } + + @override + String answeredTheCall(String senderName) { + return '$senderName hat den Anruf angenommen'; + } + + @override + String get anyoneCanJoin => 'Jeder darf beitreten'; + + @override + String get appLock => 'Anwendungssperre'; + + @override + String get appLockDescription => + 'App mit einer PIN sperren, wenn sie nicht verwendet wird'; + + @override + String get archive => 'Archiv'; + + @override + String get areGuestsAllowedToJoin => 'Dürfen Gäste beitreten'; + + @override + String get areYouSure => 'Bist du sicher?'; + + @override + String get areYouSureYouWantToLogout => 'Willst du dich wirklich abmelden?'; + + @override + String get askSSSSSign => + 'Bitte gib, um die andere Person signieren zu können, dein Sicherheitsschlüssel oder Wiederherstellungsschlüssel ein.'; + + @override + String askVerificationRequest(String username) { + return 'Diese Bestätigungsanfrage von $username annehmen?'; + } + + @override + String get autoplayImages => + 'Animierte Sticker und Emotes automatisch abspielen'; + + @override + String badServerLoginTypesException(String serverVersions, + String supportedVersions, Object suportedVersions) { + return 'Der Homeserver unterstützt diese Anmelde-Typen:\n$serverVersions\nAber diese App unterstützt nur:\n$supportedVersions'; + } + + @override + String get sendTypingNotifications => 'Tippbenachrichtigungen senden'; + + @override + String get swipeRightToLeftToReply => + 'Wische von rechts nach links zum Antworten'; + + @override + String get sendOnEnter => 'Senden mit Enter'; + + @override + String badServerVersionsException(String serverVersions, + String supportedVersions, Object serverVerions, Object suportedVersions) { + return 'Der Homeserver unterstützt die Spec-Versionen:\n$serverVersions\nAber diese App unterstützt nur:\n$supportedVersions'; + } + + @override + String countChatsAndCountParticipants(int chats, int participants) { + return '$chats Chats und $participants Teilnehmer'; + } + + @override + String get noMoreChatsFound => 'Keine weiteren Chats gefunden ...'; + + @override + String get noChatsFoundHere => + 'Hier wurden noch keine Chats gefunden. Starte einen neuen Chat mit jemandem, indem du die Schaltfläche unten verwenden. ⤵️'; + + @override + String get joinedChats => 'Beigetretene Chats'; + + @override + String get unread => 'Ungelesen'; + + @override + String get space => 'Space'; + + @override + String get spaces => 'Spaces'; + + @override + String get banFromChat => 'Aus dem Chat verbannen'; + + @override + String get banned => 'Verbannt'; + + @override + String bannedUser(String username, String targetName) { + return '$username hat $targetName verbannt'; + } + + @override + String get blockDevice => 'Blockiere Gerät'; + + @override + String get blocked => 'Blockiert'; + + @override + String get botMessages => 'Bot-Nachrichten'; + + @override + String get cancel => 'Abbrechen'; + + @override + String cantOpenUri(String uri) { + return 'Die URI $uri kann nicht geöffnet werden'; + } + + @override + String get changeDeviceName => 'Gerätenamen ändern'; + + @override + String changedTheChatAvatar(String username) { + return '$username hat den Chat-Avatar geändert'; + } + + @override + String changedTheChatDescriptionTo(String username, String description) { + return '$username hat die Chatbeschreibung geändert in: \'$description\''; + } + + @override + String changedTheChatNameTo(String username, String chatname) { + return '$username hat den Chatnamen geändert in: \'$chatname\''; + } + + @override + String changedTheChatPermissions(String username) { + return '$username hat die Chat-Berechtigungen geändert'; + } + + @override + String changedTheDisplaynameTo(String username, String displayname) { + return '$username hat den Spitznamen geändert in: \'$displayname\''; + } + + @override + String changedTheGuestAccessRules(String username) { + return '$username hat die Zugangsregeln für Gäste geändert'; + } + + @override + String changedTheGuestAccessRulesTo(String username, String rules) { + return '$username hat die Zugangsregeln für Gäste geändert zu: $rules'; + } + + @override + String changedTheHistoryVisibility(String username) { + return '$username hat die Sichtbarkeit des Chat-Verlaufs geändert'; + } + + @override + String changedTheHistoryVisibilityTo(String username, String rules) { + return '$username hat die Sichtbarkeit des Chat-Verlaufs geändert zu: $rules'; + } + + @override + String changedTheJoinRules(String username) { + return '$username hat die Zugangsregeln geändert'; + } + + @override + String changedTheJoinRulesTo(String username, String joinRules) { + return '$username hat die Zugangsregeln geändert zu: $joinRules'; + } + + @override + String changedTheProfileAvatar(String username) { + return '$username hat das Profilbild geändert'; + } + + @override + String changedTheRoomAliases(String username) { + return '$username hat die Raum-Aliasse geändert'; + } + + @override + String changedTheRoomInvitationLink(String username) { + return '$username hat den Einladungslink geändert'; + } + + @override + String get changePassword => 'Passwort ändern'; + + @override + String get changeTheHomeserver => 'Anderen Homeserver verwenden'; + + @override + String get changeTheme => 'Ändere Deinen Style'; + + @override + String get changeTheNameOfTheGroup => 'Gruppenname ändern'; + + @override + String get changeYourAvatar => 'Deinen Avatar ändern'; + + @override + String get channelCorruptedDecryptError => + 'Die Verschlüsselung wurde korrumpiert'; + + @override + String get chat => 'Chat'; + + @override + String get yourChatBackupHasBeenSetUp => + 'Dein Chat-Backup wurde eingerichtet.'; + + @override + String get chatBackup => 'Chat-Backup'; + + @override + String get chatBackupDescription => + 'Deine alten Nachrichten sind mit einem Wiederherstellungsschlüssel gesichert. Bitte stellen sicher, dass du ihn nicht verlierst.'; + + @override + String get chatDetails => 'Chatdetails'; + + @override + String get chatHasBeenAddedToThisSpace => 'Chat wurde zum Space hinzugefügt'; + + @override + String get chats => 'Chats'; + + @override + String get chooseAStrongPassword => 'Wähle ein sicheres Passwort'; + + @override + String get clearArchive => 'Archiv leeren'; + + @override + String get close => 'Schließen'; + + @override + String get commandHint_markasdm => + 'Als Direktnachrichtenraum für die angegebene Matrix-ID markieren'; + + @override + String get commandHint_markasgroup => 'Als Gruppe markieren'; + + @override + String get commandHint_ban => 'Banne ausgewählten Benutzer aus diesen Raum'; + + @override + String get commandHint_clearcache => 'Zwischenspeicher löschen'; + + @override + String get commandHint_create => + 'Erstelle ein leeren Gruppenchat\nBenutze --no-encryption, um die Verschlüsselung auszuschalten'; + + @override + String get commandHint_discardsession => 'Sitzung verwerfen'; + + @override + String get commandHint_dm => + 'Starte einen direkten Chat\nBenutze --no-encryption, um die Verschlüsselung auszuschalten'; + + @override + String get commandHint_html => 'Sende HTML-formatierten Text'; + + @override + String get commandHint_invite => 'Lade den Benutzer in diesen Raum ein'; + + @override + String get commandHint_join => 'Betritt den ausgewählten Raum'; + + @override + String get commandHint_kick => + 'Entferne den übergebenen Benutzer aus diesem Raum'; + + @override + String get commandHint_leave => 'Diesen Raum verlassen'; + + @override + String get commandHint_me => 'Beschreibe dich selbst'; + + @override + String get commandHint_myroomavatar => + 'Setze dein Profilbild nur für diesen Raum (MXC-Uri)'; + + @override + String get commandHint_myroomnick => + 'Setze deinen Anzeigenamen nur für diesen Raum'; + + @override + String get commandHint_op => + 'Setze den übergeben Powerlevel des Benutzers (Standard: 50)'; + + @override + String get commandHint_plain => 'Sende unformatierten Text'; + + @override + String get commandHint_react => 'Sende die Antwort als Reaction'; + + @override + String get commandHint_send => 'Text senden'; + + @override + String get commandHint_unban => + 'Hebe die Verbannung dieses Benutzers in diesem Raum auf'; + + @override + String get commandInvalid => 'Befehl ungültig'; + + @override + String commandMissing(String command) { + return '$command ist kein Befehl.'; + } + + @override + String get compareEmojiMatch => 'Bitte vergleiche die Emojis'; + + @override + String get compareNumbersMatch => 'Bitte vergleiche die Zahlen'; + + @override + String get configureChat => 'Chat konfigurieren'; + + @override + String get confirm => 'Bestätigen'; + + @override + String get connect => 'Verbinden'; + + @override + String get contactHasBeenInvitedToTheGroup => + 'Kontakt wurde in die Gruppe eingeladen'; + + @override + String get containsDisplayName => 'Enthält Anzeigenamen'; + + @override + String get containsUserName => 'Enthält Benutzernamen'; + + @override + String get contentHasBeenReported => + 'Der Inhalt wurde den Serveradministratoren gemeldet'; + + @override + String get copiedToClipboard => 'Wurde in die Zwischenablage kopiert'; + + @override + String get copy => 'Kopieren'; + + @override + String get copyToClipboard => 'In Zwischenablage kopieren'; + + @override + String couldNotDecryptMessage(String error) { + return 'Nachricht konnte nicht entschlüsselt werden: $error'; + } + + @override + String countParticipants(int count) { + return '$count Mitglieder'; + } + + @override + String get create => 'Erstellen'; + + @override + String createdTheChat(String username) { + return '💬 $username hat den Chat erstellt'; + } + + @override + String get createGroup => 'Gruppe erstellen'; + + @override + String get createNewSpace => 'Neuer Space'; + + @override + String get currentlyActive => 'Jetzt gerade online'; + + @override + String get darkTheme => 'Dunkel'; + + @override + String dateAndTimeOfDay(String date, String timeOfDay) { + return '$date, $timeOfDay'; + } + + @override + String dateWithoutYear(String month, String day) { + return '$day.$month'; + } + + @override + String dateWithYear(String year, String month, String day) { + return '$day.$month.$year'; + } + + @override + String get deactivateAccountWarning => + 'Dies deaktiviert dein Konto. Es kann nicht rückgängig gemacht werden! Bist du sicher?'; + + @override + String get defaultPermissionLevel => + 'Standardberechtigungsstufe für neue Benutzer'; + + @override + String get delete => 'Löschen'; + + @override + String get deleteAccount => 'Konto löschen'; + + @override + String get deleteMessage => 'Nachricht löschen'; + + @override + String get device => 'Gerät'; + + @override + String get deviceId => 'Geräte-ID'; + + @override + String get devices => 'Geräte'; + + @override + String get directChats => 'Direkte Chats'; + + @override + String get allRooms => 'Alle Gruppenchats'; + + @override + String get displaynameHasBeenChanged => 'Anzeigename wurde geändert'; + + @override + String get downloadFile => 'Datei herunterladen'; + + @override + String get edit => 'Bearbeiten'; + + @override + String get editBlockedServers => 'Blockierte Server einstellen'; + + @override + String get chatPermissions => 'Chatberechtigungen'; + + @override + String get editDisplayname => 'Anzeigename ändern'; + + @override + String get editRoomAliases => 'Raum-Aliase bearbeiten'; + + @override + String get editRoomAvatar => 'Raumavatar bearbeiten'; + + @override + String get emoteExists => 'Emoticon existiert bereits!'; + + @override + String get emoteInvalid => 'Ungültiges Emoticon-Kürzel!'; + + @override + String get emoteKeyboardNoRecents => + 'Kürzlich verwendete Emotes werden hier angezeigt ...'; + + @override + String get emotePacks => 'Emoticon-Bündel für Raum'; + + @override + String get emoteSettings => 'Emoticon-Einstellungen'; + + @override + String get globalChatId => 'Globale Chat-ID'; + + @override + String get accessAndVisibility => 'Zugang und Sichtbarkeit'; + + @override + String get accessAndVisibilityDescription => + 'Wer darf dem Chat beitreten und wie kann der Chat gefunden werden.'; + + @override + String get calls => 'Anrufe'; + + @override + String get customEmojisAndStickers => 'Eigene Emojis und Sticker'; + + @override + String get customEmojisAndStickersBody => + 'Eigene Emojis oder Sticker zur Nutzung im Chat hinzufügen oder teilen.'; + + @override + String get emoteShortcode => 'Emoticon-Kürzel'; + + @override + String get emoteWarnNeedToPick => 'Wähle ein Emoticon-Kürzel und ein Bild!'; + + @override + String get emptyChat => 'Leerer Chat'; + + @override + String get enableEmotesGlobally => 'Aktiviere Emoticon-Bündel global'; + + @override + String get enableEncryption => 'Verschlüsselung anschalten'; + + @override + String get enableEncryptionWarning => + 'Du wirst die Verschlüsselung nicht mehr ausstellen können. Bist Du sicher?'; + + @override + String get encrypted => 'Verschlüsselt'; + + @override + String get encryption => 'Verschlüsselung'; + + @override + String get encryptionNotEnabled => 'Verschlüsselung ist nicht aktiviert'; + + @override + String endedTheCall(String senderName) { + return '$senderName hat den Anruf beendet'; + } + + @override + String get enterAnEmailAddress => 'Gib eine E-Mail-Adresse ein'; + + @override + String get homeserver => 'Homeserver'; + + @override + String get enterYourHomeserver => 'Gib Deinen Homeserver ein'; + + @override + String errorObtainingLocation(String error) { + return 'Fehler beim Suchen des Standortes: $error'; + } + + @override + String get everythingReady => 'Alles fertig!'; + + @override + String get extremeOffensive => 'Extrem beleidigend'; + + @override + String get fileName => 'Dateiname'; + + @override + String get fluffychat => 'Extera'; + + @override + String get fontSize => 'Schriftgröße'; + + @override + String get forward => 'Weiterleiten'; + + @override + String get fromJoining => 'Ab dem Beitritt'; + + @override + String get fromTheInvitation => 'Ab der Einladung'; + + @override + String get goToTheNewRoom => 'Zum neuen Raum wechseln'; + + @override + String get group => 'Gruppe'; + + @override + String get chatDescription => 'Chatbeschreibung'; + + @override + String get chatDescriptionHasBeenChanged => 'Chatbeschreibung geändert'; + + @override + String get groupIsPublic => 'Öffentliche Gruppe'; + + @override + String get groups => 'Gruppen'; + + @override + String groupWith(String displayname) { + return 'Gruppe mit $displayname'; + } + + @override + String get guestsAreForbidden => 'Gäste sind verboten'; + + @override + String get guestsCanJoin => 'Gäste dürfen beitreten'; + + @override + String hasWithdrawnTheInvitationFor(String username, String targetName) { + return '$username hat die Einladung für $targetName zurückgezogen'; + } + + @override + String get help => 'Hilfe'; + + @override + String get hideRedactedEvents => 'Gelöschte Nachrichten ausblenden'; + + @override + String get hideRedactedMessages => 'Geschwärzte Nachrichten verstecken'; + + @override + String get hideRedactedMessagesBody => + 'Wenn jemand eine Nachricht schwärzt/löscht, dann wird diese Nachricht im Chat nicht mehr sichtbar sein.'; + + @override + String get hideInvalidOrUnknownMessageFormats => + 'Ungültige und unbekannte Nachrichten-Formate ausblenden'; + + @override + String get howOffensiveIsThisContent => 'Wie beleidigend ist dieser Inhalt?'; + + @override + String get id => 'ID'; + + @override + String get identity => 'Identität'; + + @override + String get block => 'Blockieren'; + + @override + String get blockedUsers => 'Blockierte Benutzer'; + + @override + String get blockListDescription => + 'Du kannst Benutzer blockieren, die dich stören. Von Benutzern auf deiner persönlichen Blocklierliste kannst du keine Nachrichten oder Raumeinladungen mehr erhalten.'; + + @override + String get blockUsername => 'Blockiere Benutzername'; + + @override + String get iHaveClickedOnLink => 'Ich habe den Link angeklickt'; + + @override + String get incorrectPassphraseOrKey => + 'Falsches Passwort oder Wiederherstellungsschlüssel'; + + @override + String get inoffensive => 'Harmlos'; + + @override + String get inviteContact => 'Kontakt einladen'; + + @override + String inviteContactToGroupQuestion(Object contact, Object groupName) { + return 'Willst du $contact zum Chat $groupName einladen?'; + } + + @override + String inviteContactToGroup(String groupName) { + return 'Kontakt in die Gruppe $groupName einladen'; + } + + @override + String get noChatDescriptionYet => 'Noch keine Chatbeschreibung vorhanden.'; + + @override + String get tryAgain => 'Neuer Versuch'; + + @override + String get invalidServerName => 'Ungültiger Servername'; + + @override + String get invited => 'Eingeladen'; + + @override + String get redactMessageDescription => + 'Die Nachricht wird für alle Teilnehmer dieses Gesprächs gelöscht. Dies kann nicht rückgängig gemacht werden.'; + + @override + String get optionalRedactReason => + '(Optional) Grund für die Löschung dieser Nachricht...'; + + @override + String invitedUser(String username, String targetName) { + return '📩 $username hat $targetName eingeladen'; + } + + @override + String get invitedUsersOnly => 'Nur eingeladene Mitglieder'; + + @override + String get inviteForMe => 'Einladung für mich'; + + @override + String inviteText(String username, String link) { + return '$username hat Dich zu Extera eingeladen. \n1. Gehe auf fluffychat.im und installiere die App \n2. Melde Dich in der App an \n3. Öffne den Einladungslink: \n $link'; + } + + @override + String get isTyping => 'schreibt …'; + + @override + String joinedTheChat(String username) { + return '👋 $username ist dem Chat beigetreten'; + } + + @override + String get joinRoom => 'Raum beitreten'; + + @override + String kicked(String username, String targetName) { + return '👞 $username hat $targetName hinausgeworfen'; + } + + @override + String kickedAndBanned(String username, String targetName) { + return '🙅 $username hat $targetName hinausgeworfen und verbannt'; + } + + @override + String get kickFromChat => 'Aus dem Chat hinauswerfen'; + + @override + String lastActiveAgo(String localizedTimeShort) { + return 'Zuletzt aktiv: $localizedTimeShort'; + } + + @override + String get leave => 'Verlassen'; + + @override + String get leftTheChat => 'Hat den Chat verlassen'; + + @override + String get license => 'Lizenz'; + + @override + String get lightTheme => 'Hell'; + + @override + String loadCountMoreParticipants(int count) { + return '$count weitere Mitglieder laden'; + } + + @override + String get dehydrate => 'Sitzung exportieren und Gerät löschen'; + + @override + String get dehydrateWarning => + 'Diese Aktion kann nicht rückgängig gemacht werden. Stelle sicher, dass du die Sicherungsdatei sicher aufbewahrst.'; + + @override + String get dehydrateTor => 'TOR-Benutzer: Sitzung exportieren'; + + @override + String get dehydrateTorLong => + 'Für TOR-Benutzer wird empfohlen, die Sitzung zu exportieren, bevor das Fenster geschlossen wird.'; + + @override + String get hydrateTor => 'TOR-Benutzer: Session-Export importieren'; + + @override + String get hydrateTorLong => + 'Hast du deine Sitzung das letzte Mal auf TOR exportiert? Importiere sie schnell und chatte weiter.'; + + @override + String get hydrate => 'Aus Sicherungsdatei wiederherstellen'; + + @override + String get loadingPleaseWait => 'Lade … Bitte warten.'; + + @override + String get loadMore => 'Mehr laden …'; + + @override + String get locationDisabledNotice => + 'Standort ist deaktiviert. Bitte aktivieren, um den Standort teilen zu können.'; + + @override + String get locationPermissionDeniedNotice => + 'Standort-Berechtigung wurde abgelehnt. Bitte akzeptieren, um den Standort teilen zu können.'; + + @override + String get login => 'Anmelden'; + + @override + String logInTo(String homeserver) { + return 'Bei $homeserver anmelden'; + } + + @override + String get logout => 'Abmelden'; + + @override + String get memberChanges => 'Änderungen der Mitglieder'; + + @override + String get mention => 'Erwähnen'; + + @override + String get messages => 'Nachrichten'; + + @override + String get messagesStyle => 'Nachrichten:'; + + @override + String get moderator => 'Moderator'; + + @override + String get muteChat => 'Stummschalten'; + + @override + String get needPantalaimonWarning => + 'Bitte beachte, dass du Pantalaimon brauchst, um Ende-zu-Ende-Verschlüsselung benutzen zu können.'; + + @override + String get newChat => 'Neuer Chat'; + + @override + String get newMessageInFluffyChat => '💬 Neue Nachricht in Extera'; + + @override + String get newVerificationRequest => 'Neue Verifikationsanfrage!'; + + @override + String get next => 'Weiter'; + + @override + String get no => 'Nein'; + + @override + String get noConnectionToTheServer => 'Keine Verbindung zum Server'; + + @override + String get noEmotesFound => 'Keine Emoticons gefunden. 😕'; + + @override + String get noEncryptionForPublicRooms => + 'Du kannst die Verschlüsselung erst aktivieren, sobald dieser Raum nicht mehr öffentlich zugänglich ist.'; + + @override + String get noGoogleServicesWarning => + 'Firebase Cloud Messaging scheint auf deinem Gerät nicht verfügbar zu sein. Um trotzdem Push-Benachrichtigungen zu erhalten, empfehlen wir die Installation von ntfy. Mit ntfy oder einem anderen Unified-Push-Anbieter kannst du Push-Benachrichtigungen datensicher empfangen. Du kannst ntfy im PlayStore oder bei F-Droid herunterladen.'; + + @override + String noMatrixServer(String server1, String server2) { + return '$server1 ist kein Matrix-Server, stattdessen $server2 benutzen?'; + } + + @override + String get shareInviteLink => 'Einladungslink teilen'; + + @override + String get scanQrCode => 'QR-Code scannen'; + + @override + String get none => 'Keiner'; + + @override + String get noPasswordRecoveryDescription => + 'Du hast bisher keine Möglichkeit hinzugefügt, um dein Passwort zurückzusetzen.'; + + @override + String get noPermission => 'Keine Berechtigung'; + + @override + String get noRoomsFound => 'Keine Räume gefunden …'; + + @override + String get notifications => 'Benachrichtigungen'; + + @override + String get notificationsEnabledForThisAccount => + 'Benachrichtigungen für dieses Konto aktiviert'; + + @override + String numUsersTyping(int count) { + return '$count Mitglieder schreiben …'; + } + + @override + String get obtainingLocation => 'Standort wird ermittelt …'; + + @override + String get offensive => 'Beleidigend'; + + @override + String get offline => 'Offline'; + + @override + String get ok => 'Ok'; + + @override + String get online => 'Online'; + + @override + String get onlineKeyBackupEnabled => + 'Online-Schlüsselsicherung ist aktiviert'; + + @override + String get oopsPushError => + 'Hoppla! Leider ist beim Einrichten der Push-Benachrichtigungen ein Fehler aufgetreten.'; + + @override + String get oopsSomethingWentWrong => 'Hoppla, da ist etwas schiefgelaufen…'; + + @override + String get openAppToReadMessages => 'App öffnen, um Nachrichten zu lesen'; + + @override + String get openCamera => 'Kamera öffnen'; + + @override + String get openVideoCamera => 'Video aufnehmen'; + + @override + String get oneClientLoggedOut => 'Einer deiner Clients wurde abgemeldet'; + + @override + String get addAccount => 'Konto hinzufügen'; + + @override + String get editBundlesForAccount => 'Bundles für dieses Konto bearbeiten'; + + @override + String get addToBundle => 'Zu einem Bundle hinzufügen'; + + @override + String get removeFromBundle => 'Von diesem Bundle entfernen'; + + @override + String get bundleName => 'Name des Bundles'; + + @override + String get enableMultiAccounts => + '(BETA) Aktiviere Multi-Accounts für dieses Gerät'; + + @override + String get openInMaps => 'In Maps öffnen'; + + @override + String get link => 'Link'; + + @override + String get serverRequiresEmail => + 'Dieser Server muss deine E-Mail-Adresse für die Registrierung überprüfen.'; + + @override + String get or => 'Oder'; + + @override + String get participant => 'Mitglied'; + + @override + String get passphraseOrKey => 'Passwort oder Wiederherstellungsschlüssel'; + + @override + String get password => 'Passwort'; + + @override + String get passwordForgotten => 'Passwort vergessen'; + + @override + String get passwordHasBeenChanged => 'Passwort wurde geändert'; + + @override + String get hideMemberChangesInPublicChats => + 'Mitglieder-Änderungen in öffentlichen Chats ausblenden'; + + @override + String get hideMemberChangesInPublicChatsBody => + 'Zeige keine Beitritt- oder Verlassen-Ereignisse von Mitgliedern in der Timeline an, um die Lesbarkeit in öffentlichen Chats zu verbessern.'; + + @override + String get overview => 'Übersicht'; + + @override + String get notifyMeFor => 'Benachrichtige mich für'; + + @override + String get passwordRecoverySettings => + 'Passwort-Wiederherstellungs-Einstellungen'; + + @override + String get passwordRecovery => 'Passwort wiederherstellen'; + + @override + String get people => 'Personen'; + + @override + String get pickImage => 'Bild wählen'; + + @override + String get pin => 'Anpinnen'; + + @override + String play(String fileName) { + return '$fileName abspielen'; + } + + @override + String get pleaseChoose => 'Bitte wählen'; + + @override + String get pleaseChooseAPasscode => 'Bitte einen Code festlegen'; + + @override + String get pleaseClickOnLink => + 'Bitte auf den Link in der E-Mail klicken und dann fortfahren.'; + + @override + String get pleaseEnter4Digits => + 'Bitte 4 Ziffern eingeben oder leer lassen, um die Anwendungssperre zu deaktivieren.'; + + @override + String get pleaseEnterRecoveryKey => + 'Bitte gib deinen Wiederherstellungsschlüssel ein:'; + + @override + String get pleaseEnterYourPassword => 'Bitte dein Passwort eingeben'; + + @override + String get pleaseEnterYourPin => 'Bitte gib deine Pin ein'; + + @override + String get pleaseEnterYourUsername => 'Bitte deinen Benutzernamen eingeben'; + + @override + String get pleaseFollowInstructionsOnWeb => + 'Bitte folge den Anweisungen auf der Website und tippe auf Weiter.'; + + @override + String get privacy => 'Privatsphäre'; + + @override + String get publicRooms => 'Öffentliche Räume'; + + @override + String get pushRules => 'Push-Regeln'; + + @override + String get reason => 'Grund'; + + @override + String get recording => 'Aufnahme'; + + @override + String redactedBy(String username) { + return 'Gelöscht von $username'; + } + + @override + String get directChat => 'Privater Chat'; + + @override + String redactedByBecause(String username, String reason) { + return 'Gelöscht von $username weil: \"$reason\"'; + } + + @override + String redactedAnEvent(String username) { + return '$username hat ein Ereignis gelöscht'; + } + + @override + String get redactMessage => 'Nachricht löschen'; + + @override + String get register => 'Registrieren'; + + @override + String get reject => 'Ablehnen'; + + @override + String rejectedTheInvitation(String username) { + return '$username hat die Einladung abgelehnt'; + } + + @override + String get rejoin => 'Wieder beitreten'; + + @override + String get removeAllOtherDevices => 'Alle anderen Geräte entfernen'; + + @override + String removedBy(String username) { + return 'Entfernt von $username'; + } + + @override + String get removeDevice => 'Gerät entfernen'; + + @override + String get unbanFromChat => 'Verbannung aufheben'; + + @override + String get removeYourAvatar => 'Deinen Avatar löschen'; + + @override + String get replaceRoomWithNewerVersion => 'Raum mit neuer Version ersetzen'; + + @override + String get reply => 'Antworten'; + + @override + String get reportMessage => 'Nachricht melden'; + + @override + String get translateMessage => 'Translate message'; + + @override + String get translatedMessage => 'Translated message'; + + @override + String get errorTranslatingMessage => + 'An error has occured while translating the message.'; + + @override + String get recoverMessage => 'Recover message'; + + @override + String get recoveredMessage => 'Recovered message'; + + @override + String get errorRecoveringMessage => + 'An error has occured while recovering the message.'; + + @override + String get errorRecoveringMessageNoAdmin => + 'This feature is available on Synapse homeservers only for adminstrators.'; + + @override + String get requestPermission => 'Berechtigung anfragen'; + + @override + String get roomHasBeenUpgraded => 'Der Raum wurde ge-upgraded'; + + @override + String get roomVersion => 'Raumversion'; + + @override + String get saveFile => 'Datei speichern'; + + @override + String get retry => 'Retry'; + + @override + String get search => 'Suchen'; + + @override + String get security => 'Sicherheit'; + + @override + String get recoveryKey => 'Wiederherstellungs-Schlüssel'; + + @override + String get recoveryKeyLost => 'Wiederherstellungsschlüssel verloren?'; + + @override + String seenByUser(String username) { + return 'Gelesen von $username'; + } + + @override + String get send => 'Senden'; + + @override + String get sendAMessage => 'Nachricht schreiben'; + + @override + String get sendAsText => 'Sende als Text'; + + @override + String get sendAudio => 'Sende Audiodatei'; + + @override + String get sendFile => 'Datei senden'; + + @override + String get sendImage => 'Bild senden'; + + @override + String sendImages(int count) { + return 'Sende $count Bilder'; + } + + @override + String get sendMessages => 'Nachrichten senden'; + + @override + String get sendOriginal => 'Sende Original'; + + @override + String get sendSticker => 'Sticker senden'; + + @override + String get sendVideo => 'Sende Video'; + + @override + String sentAFile(String username) { + return '📁 $username hat eine Datei gesendet'; + } + + @override + String sentAnAudio(String username) { + return '🎤 $username hat eine Audio-Datei gesendet'; + } + + @override + String sentAPicture(String username) { + return '🖼️ $username hat ein Bild gesendet'; + } + + @override + String sentASticker(String username) { + return '😊 $username hat einen Sticker gesendet'; + } + + @override + String sentAVideo(String username) { + return '🎥 $username hat ein Video gesendet'; + } + + @override + String sentCallInformations(String senderName) { + return '$senderName hat Anrufinformationen geschickt'; + } + + @override + String get separateChatTypes => 'Separate Direktchats und Gruppen'; + + @override + String get setAsCanonicalAlias => 'Als Haupt-Alias festlegen'; + + @override + String get setCustomEmotes => 'Eigene Emoticons einstellen'; + + @override + String get setChatDescription => 'Chatbeschreibung festlegen'; + + @override + String get setInvitationLink => 'Einladungslink festlegen'; + + @override + String get setPermissionsLevel => 'Berechtigungsstufe einstellen'; + + @override + String get setStatus => 'Status ändern'; + + @override + String get settings => 'Einstellungen'; + + @override + String get share => 'Teilen'; + + @override + String sharedTheLocation(String username) { + return '$username hat den Standort geteilt'; + } + + @override + String get shareLocation => 'Standort teilen'; + + @override + String get showPassword => 'Passwort anzeigen'; + + @override + String get presenceStyle => 'Statusmeldungen:'; + + @override + String get hideAvatarsInInvites => 'Hide avatars in invites'; + + @override + String get hideAvatarsInInvitesDescription => + 'Do not show room avatars in invites'; + + @override + String get presencesToggle => 'Status-Nachrichten anderer Benutzer anzeigen'; + + @override + String get pureBlackToggle => 'Pure Black'; + + @override + String get singlesignon => 'Einmalige Anmeldung'; + + @override + String get skip => 'Überspringe'; + + @override + String get sourceCode => 'Quellcode'; + + @override + String get spaceIsPublic => 'Space ist öffentlich'; + + @override + String get spaceName => 'Space-Name'; + + @override + String startedACall(String senderName) { + return '$senderName hat einen Anruf getätigt'; + } + + @override + String get startFirstChat => 'Starte deinen ersten Chat'; + + @override + String get status => 'Status'; + + @override + String get statusExampleMessage => 'Wie geht es dir heute?'; + + @override + String get submit => 'Absenden'; + + @override + String get synchronizingPleaseWait => 'Synchronisiere... Bitte warten.'; + + @override + String synchronizingPleaseWaitCounter(String percentage) { + return ' Synchronisierung… ($percentage%)'; + } + + @override + String get systemTheme => 'System'; + + @override + String get theyDontMatch => 'Stimmen nicht überein'; + + @override + String get theyMatch => 'Stimmen überein'; + + @override + String get title => 'Extera'; + + @override + String get toggleFavorite => 'Favorite umschalten'; + + @override + String get toggleMuted => 'Stummgeschaltete umschalten'; + + @override + String get toggleUnread => 'Markieren als gelesen/ungelesen'; + + @override + String get tooManyRequestsWarning => + 'Zu viele Anfragen. Bitte versuche es später noch einmal!'; + + @override + String get transferFromAnotherDevice => 'Von anderem Gerät übertragen'; + + @override + String get tryToSendAgain => 'Noch mal versuchen zu senden'; + + @override + String get unavailable => 'Nicht verfügbar'; + + @override + String unbannedUser(String username, String targetName) { + return '$username hat die Verbannung von $targetName aufgehoben'; + } + + @override + String get unblockDevice => 'Geräteblockierung aufheben'; + + @override + String get unknownDevice => 'Unbekanntes Gerät'; + + @override + String get unknownEncryptionAlgorithm => + 'Unbekannter Verschlüsselungsalgorithmus'; + + @override + String unknownEvent(String type) { + return 'Unbekanntes Ereignis \'$type\''; + } + + @override + String get unmuteChat => 'Stumm aus'; + + @override + String get unpin => 'Nicht mehr anpinnen'; + + @override + String unreadChats(int unreadCount) { + String _temp0 = intl.Intl.pluralLogic( + unreadCount, + locale: localeName, + other: '$unreadCount ungelesene Unterhaltungen', + one: '1 ungelesene Unterhaltung', + ); + return '$_temp0'; + } + + @override + String userAndOthersAreTyping(String username, int count) { + return '$username und $count andere schreiben …'; + } + + @override + String userAndUserAreTyping(String username, String username2) { + return '$username und $username2 schreiben …'; + } + + @override + String userIsTyping(String username) { + return '$username schreibt …'; + } + + @override + String userLeftTheChat(String username) { + return '🚪 $username hat den Chat verlassen'; + } + + @override + String get username => 'Benutzername'; + + @override + String userSentUnknownEvent(String username, String type) { + return '$username hat ein $type-Ereignis gesendet'; + } + + @override + String get unverified => 'Unverifiziert'; + + @override + String get verified => 'Verifiziert'; + + @override + String get verify => 'Verifizieren'; + + @override + String get verifyStart => 'Starte Verifikation'; + + @override + String get verifySuccess => 'Erfolgreich verifiziert!'; + + @override + String get verifyTitle => 'Anderes Konto wird verifiziert'; + + @override + String get videoCall => 'Videoanruf'; + + @override + String get visibilityOfTheChatHistory => 'Sichtbarkeit des Chat-Verlaufs'; + + @override + String get visibleForAllParticipants => 'Sichtbar für alle Mitglieder'; + + @override + String get visibleForEveryone => 'Für jeden sichtbar'; + + @override + String get voiceMessage => 'Sprachnachricht'; + + @override + String get waitingPartnerAcceptRequest => + 'Warte darauf, dass der Partner die Anfrage annimmt …'; + + @override + String get waitingPartnerEmoji => + 'Warte darauf, dass der Partner die Emoji annimmt …'; + + @override + String get waitingPartnerNumbers => + 'Warten, dass der Partner die Zahlen annimmt …'; + + @override + String get wallpaper => 'Hintergrund:'; + + @override + String get warning => 'Achtung!'; + + @override + String get weSentYouAnEmail => 'Wir haben dir eine E-Mail gesendet'; + + @override + String get whoCanPerformWhichAction => 'Wer kann welche Aktion ausführen'; + + @override + String get whoIsAllowedToJoinThisGroup => 'Wer darf der Gruppe beitreten'; + + @override + String get whyDoYouWantToReportThis => 'Warum willst du dies melden?'; + + @override + String get wipeChatBackup => + 'Den Chat-Backup löschen, um einen neuen Wiederherstellungsschlüssel zu erstellen?'; + + @override + String get withTheseAddressesRecoveryDescription => + 'Mit diesen Adressen kannst du dein Passwort wiederherstellen, wenn du es vergessen hast.'; + + @override + String get writeAMessage => 'Schreibe eine Nachricht …'; + + @override + String get yes => 'Ja'; + + @override + String get you => 'Du'; + + @override + String get youAreNoLongerParticipatingInThisChat => + 'Du bist kein Mitglied mehr in diesem Chat'; + + @override + String get youHaveBeenBannedFromThisChat => + 'Du wurdest aus dem Chat verbannt'; + + @override + String get yourPublicKey => 'Dein öffentlicher Schlüssel'; + + @override + String get messageInfo => 'Nachrichten-Info'; + + @override + String get time => 'Zeit'; + + @override + String get messageType => 'Nachrichtentyp'; + + @override + String get sender => 'Absender:in'; + + @override + String get openGallery => 'Galerie öffnen'; + + @override + String get removeFromSpace => 'Aus dem Space entfernen'; + + @override + String get addToSpaceDescription => + 'Wähle einen Space aus, um diesen Chat hinzuzufügen.'; + + @override + String get start => 'Start'; + + @override + String get pleaseEnterRecoveryKeyDescription => + 'Um deine alten Nachrichten zu entsperren, gib bitte den Wiederherstellungsschlüssel ein, der in einer früheren Sitzung generiert wurde. Dein Wiederherstellungsschlüssel ist NICHT dein Passwort.'; + + @override + String get publish => 'Veröffentlichen'; + + @override + String videoWithSize(String size) { + return 'Video ($size)'; + } + + @override + String get openChat => 'Chat öffnen'; + + @override + String get markAsRead => 'Als gelesen markiert'; + + @override + String get reportUser => 'Benutzer melden'; + + @override + String get dismiss => 'Verwerfen'; + + @override + String reactedWith(String sender, String reaction) { + return '$sender reagierte mit $reaction'; + } + + @override + String get pinMessage => 'An Raum anheften'; + + @override + String get confirmEventUnpin => + 'Möchtest du das Ereignis wirklich dauerhaft lösen?'; + + @override + String get emojis => 'Emojis'; + + @override + String get placeCall => 'Anruf tätigen'; + + @override + String get voiceCall => 'Sprachanruf'; + + @override + String get unsupportedAndroidVersion => 'Nicht unterstützte Android-Version'; + + @override + String get unsupportedAndroidVersionLong => + 'Diese Funktion erfordert eine neuere Android-Version. Bitte suche nach Updates oder prüfe die Lineage-OS-Unterstützung.'; + + @override + String get videoCallsBetaWarning => + 'Bitte beachte, dass sich Videoanrufe derzeit in der Beta-Phase befinden. Sie funktionieren möglicherweise nicht wie erwartet oder überhaupt nicht auf allen Plattformen.'; + + @override + String get experimentalVideoCalls => 'Experimentelle Videoanrufe'; + + @override + String get emailOrUsername => 'E-Mail oder Benutzername'; + + @override + String get indexedDbErrorTitle => 'Probleme im Privatmodus'; + + @override + String get indexedDbErrorLong => + 'Die Nachrichtenspeicherung ist im privaten Modus standardmäßig leider nicht aktiviert.\nBitte besuche\n- about:config\n- Setze dom.indexedDB.privateBrowsing.enabled auf true\nAndernfalls ist es nicht möglich, Extera auszuführen.'; + + @override + String switchToAccount(String number) { + return 'Zu Konto $number wechseln'; + } + + @override + String get nextAccount => 'Nächstes Konto'; + + @override + String get previousAccount => 'Vorheriges Konto'; + + @override + String get addWidget => 'Widget hinzufügen'; + + @override + String get widgetVideo => 'Video'; + + @override + String get widgetEtherpad => 'Textnotiz'; + + @override + String get widgetJitsi => 'Jitsi Meet'; + + @override + String get widgetCustom => 'Angepasst'; + + @override + String get widgetName => 'Name'; + + @override + String get widgetUrlError => 'Das ist keine gültige URL.'; + + @override + String get widgetNameError => 'Bitte gib einen Anzeigenamen an.'; + + @override + String get errorAddingWidget => 'Fehler beim Hinzufügen des Widgets.'; + + @override + String get youRejectedTheInvitation => 'Du hast die Einladung abgelehnt'; + + @override + String get youJoinedTheChat => 'Du bist dem Chat beigetreten'; + + @override + String get youAcceptedTheInvitation => '👍 Du hast die Einladung angenommen'; + + @override + String youBannedUser(String user) { + return 'Du hast den $user verbannt'; + } + + @override + String youHaveWithdrawnTheInvitationFor(String user) { + return 'Du hast die Einladung für $user zurückgezogen'; + } + + @override + String youInvitedToBy(String alias) { + return '📩 Du wurdest per Link eingeladen zu:\n$alias'; + } + + @override + String youInvitedBy(String user) { + return '📩 Du wurdest von $user eingeladen'; + } + + @override + String invitedBy(String user) { + return '📩 Eingeladen von $user'; + } + + @override + String youInvitedUser(String user) { + return '📩 Du hast $user eingeladen'; + } + + @override + String youKicked(String user) { + return '👞 Du hast $user rausgeworfen'; + } + + @override + String youKickedAndBanned(String user) { + return '🙅 Du hast $user rausgeworfen und verbannt'; + } + + @override + String youUnbannedUser(String user) { + return 'Du hast die Verbannung von $user rückgängig gemacht'; + } + + @override + String hasKnocked(String user) { + return '🚪 $user hat angeklopft'; + } + + @override + String get usersMustKnock => 'Benutzer müssen anklopfen'; + + @override + String get noOneCanJoin => 'Niemand kann beitreten'; + + @override + String userWouldLikeToChangeTheChat(String user) { + return '$user würde dem Chat gerne beitreten.'; + } + + @override + String get noPublicLinkHasBeenCreatedYet => + 'Es wurde noch kein öffentlicher Link erstellt'; + + @override + String get knock => 'Anklopfen'; + + @override + String get users => 'Benutzer'; + + @override + String get unlockOldMessages => 'Entsperre alte Nachrichten'; + + @override + String get storeInSecureStorageDescription => + 'Speicher den Wiederherstellungsschlüssel im sicheren Speicher dieses Geräts.'; + + @override + String get saveKeyManuallyDescription => + 'Speicher diesen Schlüssel manuell, indem du den Systemfreigabedialog oder die Zwischenablage auslöst.'; + + @override + String get storeInAndroidKeystore => 'Im Android KeyStore speichern'; + + @override + String get storeInAppleKeyChain => 'Im Apple KeyChain speichern'; + + @override + String get storeSecurlyOnThisDevice => 'Auf diesem Gerät sicher speichern'; + + @override + String countFiles(int count) { + return '$count Dateien'; + } + + @override + String get user => 'Benutzer'; + + @override + String get custom => 'Benutzerdefiniert'; + + @override + String get foregroundServiceRunning => + 'Diese Benachrichtigung wird angezeigt, wenn der Vordergrunddienst ausgeführt wird.'; + + @override + String get screenSharingTitle => 'Bildschirm teilen'; + + @override + String get screenSharingDetail => 'Du teilst deinen Bildschirm in FuffyChat'; + + @override + String get callingPermissions => 'Anrufberechtigungen'; + + @override + String get callingAccount => 'Anrufkonto'; + + @override + String get callingAccountDetails => + 'Ermöglicht Extera, die native Android-Dialer-App zu verwenden.'; + + @override + String get appearOnTop => 'Oben erscheinen'; + + @override + String get appearOnTopDetails => + 'Ermöglicht, dass die App oben angezeigt wird (nicht erforderlich, wenn du Fluffychat bereits als Anrufkonto eingerichtet haben)'; + + @override + String get otherCallingPermissions => + 'Mikrofon, Kamera und andere Extera-Berechtigungen'; + + @override + String get whyIsThisMessageEncrypted => + 'Warum ist diese Nachricht nicht lesbar?'; + + @override + String get noKeyForThisMessage => + 'Dies kann passieren, wenn die Nachricht gesendet wurde, bevor du dich auf diesem Gerät bei deinem Konto angemeldet hast.\n\nEs ist auch möglich, dass der Absender dein Gerät blockiert hat oder etwas mit der Internetverbindung schief gelaufen ist.\n\nKannst du die Nachricht in einer anderen Sitzung lesen? Dann kannst du die Nachricht davon übertragen! Gehe zu den Einstellungen > Geräte und vergewissere dich, dass sich deine Geräte gegenseitig verifiziert haben. Wenn du den Raum das nächste Mal öffnest und beide Sitzungen im Vordergrund sind, werden die Schlüssel automatisch übertragen.\n\nDu möchtest die Schlüssel beim Abmelden oder Gerätewechsel nicht verlieren? Stelle sicher, dass du das Chat-Backup in den Einstellungen aktiviert hast.'; + + @override + String get newGroup => 'Neue Gruppe'; + + @override + String get newSpace => 'Neuer Space'; + + @override + String get enterSpace => 'Raum betreten'; + + @override + String get enterRoom => 'Raum betreten'; + + @override + String get allSpaces => 'Alle Spaces'; + + @override + String numChats(String number) { + return '$number Chats'; + } + + @override + String get hideUnimportantStateEvents => + 'Blende unwichtige Zustandsereignisse aus'; + + @override + String get hidePresences => 'Status-Liste verbergen?'; + + @override + String get doNotShowAgain => 'Nicht mehr anzeigen'; + + @override + String wasDirectChatDisplayName(String oldDisplayName) { + return 'Leerer Chat (war $oldDisplayName)'; + } + + @override + String get newSpaceDescription => + 'Mit Spaces kannst du deine Chats zusammenfassen und private oder öffentliche Communities aufbauen.'; + + @override + String get encryptThisChat => 'Diesen Chat verschlüsseln'; + + @override + String get disableEncryptionWarning => + 'Aus Sicherheitsgründen kannst du die Verschlüsselung in einem Chat nicht deaktivieren, wo sie zuvor aktiviert wurde.'; + + @override + String get sorryThatsNotPossible => 'Sorry ... das ist nicht möglich'; + + @override + String get deviceKeys => 'Geräteschlüssel:'; + + @override + String get reopenChat => 'Chat wieder eröffnen'; + + @override + String get noBackupWarning => + 'Achtung! Ohne Aktivierung des Chat-Backups verlierst du den Zugriff auf deine verschlüsselten Nachrichten. Vor dem Ausloggen wird dringend empfohlen, das Chat-Backup zu aktivieren.'; + + @override + String get noOtherDevicesFound => 'Keine anderen Geräte anwesend'; + + @override + String fileIsTooBigForServer(String max) { + return 'Kann nicht gesendet werden! Der Server unterstützt nur Anhänge bis höchstens $max.'; + } + + @override + String fileHasBeenSavedAt(String path) { + return 'Datei wurde gespeichert unter $path'; + } + + @override + String get jumpToLastReadMessage => 'Zur letzten ungelesenen Nachricht'; + + @override + String get readUpToHere => 'Bis hier gelesen'; + + @override + String get jump => 'Springen'; + + @override + String get openLinkInBrowser => 'Link im Browser öffnen'; + + @override + String get reportErrorDescription => + '😭 Oh nein. Etwas ist schief gelaufen. Wenn du möchtest, kannst du den Bug bei den Entwicklern melden.'; + + @override + String get report => 'Melden'; + + @override + String get signInWithPassword => 'Anmelden mit Passwort'; + + @override + String get pleaseTryAgainLaterOrChooseDifferentServer => + 'Bitte versuche es später noch einmal oder wähle einen anderen Server.'; + + @override + String signInWith(String provider) { + return 'Anmelden mit $provider'; + } + + @override + String get profileNotFound => + 'Der Benutzer konnte auf dem Server nicht gefunden werden. Vielleicht gibt es ein Verbindungsproblem oder der Benutzer existiert nicht.'; + + @override + String get setTheme => 'Design festlegen:'; + + @override + String get setColorTheme => 'Farbdesign einstellen:'; + + @override + String get invite => 'Einladen'; + + @override + String get inviteGroupChat => '📨 Einladungen zum Gruppenchat'; + + @override + String get invitePrivateChat => '📨 Einladungen zum privaten Chat'; + + @override + String get invalidInput => 'Ungültige Eingabe!'; + + @override + String wrongPinEntered(int seconds) { + return 'Falsche PIN eingegeben! Bitte in $seconds Sekunden erneut versuchen ...'; + } + + @override + String get pleaseEnterANumber => 'Bitte eine Zahl größer 0 eingeben'; + + @override + String get archiveRoomDescription => + 'Der Chat wird in das Archiv verschoben. Andere Benutzer können sehen, dass du den Chat verlassen hast.'; + + @override + String get roomUpgradeDescription => + 'Der Chat wird dann mit der neuen Raumversion neu erstellt. Alle Teilnehmer werden benachrichtigt, dass sie zum neuen Chat wechseln müssen. Mehr über Raumversionen erfährst du unter https://spec.matrix.org/latest/rooms/'; + + @override + String get removeDevicesDescription => + 'Du wirst von diesem Gerät abgemeldet und kannst dann dort keine Nachrichten mehr empfangen.'; + + @override + String get banUserDescription => + 'Der Benutzer wird aus dem Chat gebannt und kann den Chat erst wieder betreten, wenn die Verbannung aufgehoben wird.'; + + @override + String get unbanUserDescription => + 'Der Benutzer kann den Chat dann wieder betreten, wenn er es versucht.'; + + @override + String get kickUserDescription => + 'Der Benutzer wird aus dem Chat geworfen, aber nicht gebannt. In öffentlichen Chats kann der Benutzer jederzeit wieder beitreten.'; + + @override + String get makeAdminDescription => + 'Sobald du diesen Benutzer zum Administrator gemacht hast, kannst du das möglicherweise nicht mehr rückgängig machen, da er dann über dieselben Berechtigungen wie du verfügt.'; + + @override + String get pushNotificationsNotAvailable => + 'Push-Benachrichtigungen nicht verfügbar'; + + @override + String get learnMore => 'Erfahre mehr'; + + @override + String get yourGlobalUserIdIs => 'Deine globale Benutzer-ID ist: '; + + @override + String noUsersFoundWithQuery(String query) { + return 'Leider konnte mit \"$query\" kein Benutzer gefunden werden. Bitte schau nach, ob dir ein Tippfehler unterlaufen ist.'; + } + + @override + String get knocking => 'Klopft'; + + @override + String chatCanBeDiscoveredViaSearchOnServer(String server) { + return 'Chat kann über die Suche auf $server gefunden werden'; + } + + @override + String get searchChatsRooms => 'Suche nach #Chats, @Nutzer ...'; + + @override + String get nothingFound => 'Nichts gefunden ...'; + + @override + String get groupName => 'Gruppenname'; + + @override + String get createGroupAndInviteUsers => + 'Gruppe erstellen und Nutzer einladen'; + + @override + String get groupCanBeFoundViaSearch => + 'Gruppe kann über die Suche gefunden werden'; + + @override + String get wrongRecoveryKey => + 'Entschuldigung ... das scheint nicht der richtige Wiederherstellungsschlüssel zu sein.'; + + @override + String get startConversation => 'Unterhaltung starten'; + + @override + String get commandHint_sendraw => 'Rohes JSON senden'; + + @override + String get databaseMigrationTitle => 'Datenbank wird optimiert'; + + @override + String get databaseMigrationBody => + 'Bitte warten. Dies kann einen Moment dauern.'; + + @override + String get leaveEmptyToClearStatus => + 'Leer lassen, um den Status zu löschen.'; + + @override + String get select => 'Auswählen'; + + @override + String get searchForUsers => 'Suche nach @benutzer ...'; + + @override + String get pleaseEnterYourCurrentPassword => + 'Bitte dein aktuelles Passwort eingeben'; + + @override + String get newPassword => 'Neues Passwort'; + + @override + String get pleaseChooseAStrongPassword => 'Bitte wähle ein starkes Passwort'; + + @override + String get passwordsDoNotMatch => 'Passwörter stimmen nicht überein'; + + @override + String get passwordIsWrong => 'Dein eingegebenes Passwort ist falsch'; + + @override + String get publicLink => 'Öffentlicher Link'; + + @override + String get publicChatAddresses => 'Öffentliche Chat-Adressen'; + + @override + String get createNewAddress => 'Neue Adresse erstellen'; + + @override + String get joinSpace => 'Space beitreten'; + + @override + String get publicSpaces => 'Öffentliche Spaces'; + + @override + String get addChatOrSubSpace => 'Chat oder Sub-Space hinzufügen'; + + @override + String get subspace => 'Sub-Space'; + + @override + String get decline => 'Ablehnen'; + + @override + String get thisDevice => 'Dieses Gerät:'; + + @override + String get initAppError => 'Beim Starten der App ist ein Fehler aufgetreten'; + + @override + String get userRole => 'Benutzerrolle'; + + @override + String minimumPowerLevel(String level) { + return '$level is das minimale Power-Level.'; + } + + @override + String searchIn(String chat) { + return 'In Chat \"$chat\" suchen ...'; + } + + @override + String get searchMore => 'Weiter suchen ...'; + + @override + String get gallery => 'Galerie'; + + @override + String get files => 'Dateien'; + + @override + String databaseBuildErrorBody(String url, String error) { + return 'Die SQlite-Datenbank kann nicht erstellt werden. Die App versucht vorerst, die Legacy-Datenbank zu verwenden. Bitte melde diesen Fehler an die Entwickler unter $url. Die Fehlermeldung lautet: $error'; + } + + @override + String sessionLostBody(String url, String error) { + return 'Die App versucht nun, deine Sitzung aus der Sicherung wiederherzustellen. Bitte melde diesen Fehler an die Entwickler unter $url. Die Fehlermeldung lautet: $error'; + } + + @override + String restoreSessionBody(String url, String error) { + return 'Die App versucht nun, deine Sitzung aus der Sicherung wiederherzustellen. Bitte melde diesen Fehler an die Entwickler unter $url. Die Fehlermeldung lautet: $error'; + } + + @override + String forwardMessageTo(String roomName) { + return 'Nachricht weiterleiten an $roomName?'; + } + + @override + String get sendReadReceipts => 'Lesebestätigungen senden'; + + @override + String get sendTypingNotificationsDescription => + 'Andere Teilnehmer in einem Chat können sehen, wenn du eine neue Nachricht tippst.'; + + @override + String get sendReadReceiptsDescription => + 'Andere Teilnehmer in einem Chat können sehen, ob du eine Nachricht gelesen hast.'; + + @override + String get formattedMessages => 'Formatierte Nachrichten'; + + @override + String get formattedMessagesDescription => + 'Formatierte Nachrichteninhalte wie fettgedruckten Text mit Markdown anzeigen.'; + + @override + String get verifyOtherUser => '🔐 Anderen Benutzer verifizieren'; + + @override + String get verifyOtherUserDescription => + 'Wenn du einen anderen Benutzer verifizierst, kannst du sicher sein, dass du weißt, an wen du wirklich schreibst. 💪\n\nWenn du eine Verifizierung startest, wird dir und dem anderen Nutzer ein Popup in der App angezeigt. Dort siehst du dann eine Reihe von Emojis oder Zahlen, die ihr miteinander vergleichen müsst.\n\nDas geht am besten, wenn man sich trifft oder einen Videoanruf startet. 👭'; + + @override + String get verifyOtherDevice => '🔐 Anderes Gerät verifizieren'; + + @override + String get verifyOtherDeviceDescription => + 'Wenn du ein anderes Gerät verifizieren, können diese Geräteschlüssel austauschen, was die Sicherheit insgesamt erhöht. 💪\n\nSobald du eine Verifizierung starten, erscheint ein Pop-up in der App auf beiden Geräten. Dort siehst du dann eine Reihe von Emojis oder Zahlen, die du miteinander vergleichen musst.\n\nAm besten hältst du beide Geräte bereit, bevor du die Verifizierung startest. 🤳'; + + @override + String acceptedKeyVerification(String sender) { + return '$sender hat die Schlüsselverifikation akzeptiert'; + } + + @override + String canceledKeyVerification(String sender) { + return '$sender hat die Schlüsselverifikation abgebrochen'; + } + + @override + String completedKeyVerification(String sender) { + return '$sender hat die Schlüsselverifikation abgeschlossen'; + } + + @override + String isReadyForKeyVerification(String sender) { + return '$sender ist bereit für die Schlüsselverifikation'; + } + + @override + String requestedKeyVerification(String sender) { + return '$sender hat eine Schlüsselverifikation angefragt'; + } + + @override + String startedKeyVerification(String sender) { + return '$sender hat die Schlüsselverifikation gestartet'; + } + + @override + String get transparent => 'Transparent'; + + @override + String get incomingMessages => 'Eingehende Nachrichten'; + + @override + String get stickers => 'Sticker'; + + @override + String get discover => 'Entdecken'; + + @override + String get commandHint_ignore => 'Angegebene Matrix-ID ignorieren'; + + @override + String get commandHint_unignore => + 'Angegebene Matrix-ID nicht mehr ignorieren'; + + @override + String unreadChatsInApp(String appname, String unread) { + return '$appname: $unread ungelesene Chats'; + } + + @override + String get noDatabaseEncryption => + 'Datenbankverschlüsselung wird auf dieser Plattform nicht unterstützt'; + + @override + String thereAreCountUsersBlocked(Object count) { + return 'Im Augenblick werden $count Benutzer blockiert.'; + } + + @override + String get restricted => 'Beschränkt'; + + @override + String get knockRestricted => 'Anklopfen beschränkt'; + + @override + String goToSpace(Object space) { + return 'Geh zum Space: $space'; + } + + @override + String get markAsUnread => 'Als ungelesen markieren'; + + @override + String userLevel(int level) { + return '$level - Benutzer'; + } + + @override + String moderatorLevel(int level) { + return '$level - Moderator'; + } + + @override + String adminLevel(int level) { + return '$level - Administrator'; + } + + @override + String get changeGeneralChatSettings => + 'Allgemeine Chat-Einstellungen ändern'; + + @override + String get inviteOtherUsers => 'Lade andere Benutzer in diesen Chat ein'; + + @override + String get changeTheChatPermissions => 'Ändere die Chat-Berechtigungen'; + + @override + String get changeTheVisibilityOfChatHistory => + 'Wechsele die Sichtbarkeit der Chat-Historie'; + + @override + String get changeTheCanonicalRoomAlias => + 'Ändern der Hauptadresse für den öffentlichen Chat'; + + @override + String get sendRoomNotifications => 'Sende eine @room-Benachrichtigung'; + + @override + String get changeTheDescriptionOfTheGroup => 'Chat-Beschreibung ändern'; + + @override + String get chatPermissionsDescription => + 'Einstellen, welches Level für bestimmte Aktionen in diesem Chat erforderlich ist. Die Level 0, 50 und 100 stehen üblicherweise für Benutzer, Moderatoren und Admins, aber jede Abstufung ist möglich.'; + + @override + String updateInstalled(String version) { + return '🎉 Update $version installiert!'; + } + + @override + String get changelog => 'Änderungsprotokoll'; + + @override + String get sendCanceled => 'Senden abgebrochen'; + + @override + String get loginWithMatrixId => 'Mit Matrix-ID anmelden'; + + @override + String get discoverHomeservers => 'Server suchen'; + + @override + String get whatIsAHomeserver => 'Was ist ein Homeserver?'; + + @override + String get homeserverDescription => + 'Alle deine Daten werden auf einem Homeserver gespeichert, so wie bei einem E-Mail Anbieter. Du kannst aussuchen, welchen Homeserver du benutzen willst und kannst trotzdem mit allen kommunizieren. Erfahre mehr auf https://matrix.org.'; + + @override + String get doesNotSeemToBeAValidHomeserver => + 'Scheint kein kompatibler Homeserver zu sein. Falsche URL?'; + + @override + String get calculatingFileSize => 'Dateigröße wird berechnet ...'; + + @override + String get prepareSendingAttachment => 'Anhang zum Senden vorbereiten ...'; + + @override + String get sendingAttachment => 'Anhang wird gesendet ...'; + + @override + String get generatingVideoThumbnail => 'Generiere Video-Vorschaubild ...'; + + @override + String get compressVideo => 'Video wird komprimiert ...'; + + @override + String sendingAttachmentCountOfCount(int index, int length) { + return 'Sende Anhang $index von $length ...'; + } + + @override + String serverLimitReached(int seconds) { + return 'Server-Limit erreicht! Warte $seconds Sekunden ...'; + } + + @override + String get oneOfYourDevicesIsNotVerified => + 'Eines deiner Geräte ist nicht verifiziert'; + + @override + String get noticeChatBackupDeviceVerification => + 'Hinweis: Wenn du alle deine Geräte mit dem Chat-Backup verbindest, sind sie automatisch verifiziert.'; + + @override + String get continueText => 'Fortfahren'; + + @override + String get welcomeText => + 'Hey Hey 👋 Das ist Extera. Du kannst sich bei jedem Homeserver anmelden, der mit https://matrix.org kompatibel ist. Und dann mit jedem chatten. Das hier ist ein riesiges dezentrales Nachrichtennetzwerk!'; + + @override + String get blur => 'Verwischen:'; + + @override + String get opacity => 'Deckkraft:'; + + @override + String get setWallpaper => 'Hintergrund ändern'; + + @override + String get manageAccount => 'Konto verwalten'; + + @override + String get noContactInformationProvided => + 'Der Server stellt keine gültigen Kontaktinformationen bereit'; + + @override + String get contactServerAdmin => 'Serveradministrator kontaktieren'; + + @override + String get contactServerSecurity => 'Server-Sicherheit kontaktieren'; + + @override + String get supportPage => 'Support-Seite'; + + @override + String get serverInformation => 'Server-Informationen:'; + + @override + String get name => 'Name'; + + @override + String get version => 'Version'; + + @override + String get website => 'Website'; + + @override + String get compress => 'Komprimieren'; + + @override + String get boldText => 'Fetter Text'; + + @override + String get italicText => 'Kursiver Text'; + + @override + String get strikeThrough => 'Durchgestrichen'; + + @override + String get pleaseFillOut => 'Bitte ausfüllen'; + + @override + String get invalidUrl => 'Ungültige URL'; + + @override + String get addLink => 'Link hinzufügen'; + + @override + String get unableToJoinChat => + 'Chat kann nicht beigetreten werden. Möglicherweise hat die Gegenseite das Gespräch bereits beendet.'; + + @override + String get previous => 'Vorige'; + + @override + String get otherPartyNotLoggedIn => + 'Der User ist aktuell nicht eingeloggt und kann daher keine Nachrichten empfangen!'; + + @override + String appWantsToUseForLogin(String server) { + return 'Nutze \'$server\' um dich einzuloggen'; + } + + @override + String get appWantsToUseForLoginDescription => + 'Hiermit erlaubst du der App und der Website, Informationen über dich weiterzugeben.'; + + @override + String get open => 'Offen'; + + @override + String get waitingForServer => 'Auf Server warten...'; + + @override + String get appIntroduction => + 'Mit Extera kannst du über verschiedene Messenger hinweg mit deinen Freunden chatten. Erfahre mehr dazu auf https://matrix.org oder tippe einfach auf *Fortfahren*.'; + + @override + String get newChatRequest => '📩 Neue Chat-Anfrage'; + + @override + String get contentNotificationSettings => + 'Einstellungen für Inhaltsbenachrichtigungen'; + + @override + String get generalNotificationSettings => + 'Allgemeine Benachrichtigungseinstellungen'; + + @override + String get roomNotificationSettings => + 'Einstellungen für Raumbenachrichtigungen'; + + @override + String get userSpecificNotificationSettings => + 'Benutzerspezifische Benachrichtigungseinstellungen'; + + @override + String get otherNotificationSettings => + 'Andere Benachrichtigungseinstellungen'; + + @override + String get notificationRuleContainsUserName => 'Enthält Benutzernamen'; + + @override + String get notificationRuleContainsUserNameDescription => + 'Benachrichtigt den Benutzer, wenn eine Nachricht seinen Benutzernamen enthält.'; + + @override + String get notificationRuleMaster => 'Alle Benachrichtigungen stummschalten'; + + @override + String get notificationRuleMasterDescription => + 'Setzt alle anderen Regeln außer Kraft und deaktiviert alle Benachrichtigungen.'; + + @override + String get notificationRuleSuppressNotices => + 'Automatisierte Nachrichten unterdrücken'; + + @override + String get notificationRuleSuppressNoticesDescription => + 'Unterdrückt Benachrichtigungen von automatisierten Clients wie Bots.'; + + @override + String get notificationRuleInviteForMe => 'Einladung für mich'; + + @override + String get notificationRuleInviteForMeDescription => + 'Notifies the user when they are invited to a room.'; + + @override + String get notificationRuleMemberEvent => 'Member Event'; + + @override + String get notificationRuleMemberEventDescription => + 'Suppresses notifications for membership events.'; + + @override + String get notificationRuleIsUserMention => 'User Mention'; + + @override + String get notificationRuleIsUserMentionDescription => + 'Notifies the user when they are directly mentioned in a message.'; + + @override + String get notificationRuleContainsDisplayName => 'Contains Display Name'; + + @override + String get notificationRuleContainsDisplayNameDescription => + 'Notifies the user when a message contains their display name.'; + + @override + String get notificationRuleIsRoomMention => 'Room Mention'; + + @override + String get notificationRuleIsRoomMentionDescription => + 'Notifies the user when there is a room mention.'; + + @override + String get notificationRuleRoomnotif => 'Room Notification'; + + @override + String get notificationRuleRoomnotifDescription => + 'Notifies the user when a message contains \'@room\'.'; + + @override + String get notificationRuleTombstone => 'Tombstone'; + + @override + String get notificationRuleTombstoneDescription => + 'Notifies the user about room deactivation messages.'; + + @override + String get notificationRuleReaction => 'Reaktion'; + + @override + String get notificationRuleReactionDescription => + 'Unterdrückt Benachrichtigungen für Reaktionen.'; + + @override + String get notificationRuleRoomServerAcl => 'Room Server ACL'; + + @override + String get notificationRuleRoomServerAclDescription => + 'Unterdrückt Benachrichtigungen für Raumserver-Zugriffskontrolllisten (ACL).'; + + @override + String get notificationRuleSuppressEdits => 'Unterdrückt Bearbeitungen'; + + @override + String get notificationRuleSuppressEditsDescription => + 'Unterdrückt Benachrichtigungen für bearbeitete Nachrichten.'; + + @override + String get notificationRuleCall => 'Anruf'; + + @override + String get notificationRuleCallDescription => + 'Benachrichtigt den Benutzer über Anrufe.'; + + @override + String get notificationRuleEncryptedRoomOneToOne => + 'Encrypted Room One-to-One'; + + @override + String get notificationRuleEncryptedRoomOneToOneDescription => + 'Notifies the user about messages in encrypted one-to-one rooms.'; + + @override + String get notificationRuleRoomOneToOne => 'Room One-to-One'; + + @override + String get notificationRuleRoomOneToOneDescription => + 'Notifies the user about messages in one-to-one rooms.'; + + @override + String get notificationRuleMessage => 'Nachricht'; + + @override + String get notificationRuleMessageDescription => + 'Informiert den Benutzer über allgemeine Nachrichten.'; + + @override + String get notificationRuleEncrypted => 'Verschlüsselt'; + + @override + String get notificationRuleEncryptedDescription => + 'Notifies the user about messages in encrypted rooms.'; + + @override + String get notificationRuleJitsi => 'Jitsi'; + + @override + String get notificationRuleJitsiDescription => + 'Notifies the user about Jitsi widget events.'; + + @override + String get notificationRuleServerAcl => 'Suppress Server ACL Events'; + + @override + String get notificationRuleServerAclDescription => + 'Suppresses notifications for Server ACL events.'; + + @override + String unknownPushRule(String rule) { + return 'Unknown push rule \'$rule\''; + } + + @override + String get deletePushRuleCanNotBeUndone => + 'If you delete this notification setting, this can not be undone.'; + + @override + String get more => 'Mehr'; + + @override + String get shareKeysWith => 'Schlüssel teilen mit...'; + + @override + String get shareKeysWithDescription => + 'Welchen Geräten sollte vertraut werden, damit sie deine Nachrichten in verschlüsselten Chats mitlesen können?'; + + @override + String get allDevices => 'Alle Geräte'; + + @override + String get crossVerifiedDevicesIfEnabled => + 'Cross verified devices if enabled'; + + @override + String get crossVerifiedDevices => 'Cross verified devices'; + + @override + String get verifiedDevicesOnly => 'Nur verifizierte Geräte'; + + @override + String get takeAPhoto => 'Foto aufnehmen'; + + @override + String get recordAVideo => 'Video aufnehmen'; + + @override + String get optionalMessage => '(Optionale) Nachricht...'; + + @override + String get notSupportedOnThisDevice => 'Nicht unterstützt auf diesem Gerät'; + + @override + String get enterNewChat => 'Neuen Chat starten'; + + @override + String get approve => 'Approve'; + + @override + String get youHaveKnocked => 'You have knocked'; + + @override + String get pleaseWaitUntilInvited => + 'Please wait now, until someone from the room invites you.'; +} diff --git a/lib/generated/l10n/l10n_el.dart b/lib/generated/l10n/l10n_el.dart new file mode 100644 index 0000000..85711cc --- /dev/null +++ b/lib/generated/l10n/l10n_el.dart @@ -0,0 +1,2746 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'l10n.dart'; + +// ignore_for_file: type=lint + +/// The translations for Modern Greek (`el`). +class L10nEl extends L10n { + L10nEl([String locale = 'el']) : super(locale); + + @override + String get noSendPermission => 'You can\'t send messages here'; + + @override + String get alwaysUse24HourFormat => 'false'; + + @override + String get repeatPassword => 'Επανάληψη κωδικού πρόσβασης'; + + @override + String get notAnImage => 'Δεν είναι αρχείο εικόνας.'; + + @override + String get setCustomPermissionLevel => 'Set custom permission level'; + + @override + String get setPermissionsLevelDescription => + 'Please choose a predefined role below or enter a custom permission level between 0 and 100.'; + + @override + String get ignoreUser => 'Ignore user'; + + @override + String get normalUser => 'Normal user'; + + @override + String get remove => 'Αφαιρέστε το'; + + @override + String get importNow => 'Εισαγωγή τώρα'; + + @override + String get importEmojis => 'Εισαγωγή Emojis'; + + @override + String get importFromZipFile => 'Εισαγωγή από αρχείο .zip'; + + @override + String get exportEmotePack => 'Εξαγωγή πακέτου Emote ως .zip'; + + @override + String get replace => 'Αντικαταστήστε το'; + + @override + String get about => 'Σχετικά με το'; + + @override + String aboutHomeserver(String homeserver) { + return 'About $homeserver'; + } + + @override + String get accept => 'Αποδοχή'; + + @override + String acceptedTheInvitation(String username) { + return '👍 $username αποδέχτηκε την πρόσκληση'; + } + + @override + String get account => 'Λογαριασμός'; + + @override + String activatedEndToEndEncryption(String username) { + return '🔐 $username ενεργοποίησε κρυπτογράφηση από άκρη σε άκρη'; + } + + @override + String get addEmail => 'Προσθήκη email'; + + @override + String get confirmMatrixId => + 'Παρακαλούμε επιβεβαιώστε το Matrix ID σας για να διαγράψετε τον λογαριασμό σας.'; + + @override + String supposedMxid(String mxid) { + return 'Αυτό θα πρέπει να είναι $mxid'; + } + + @override + String get addChatDescription => 'Προσθέστε μια περιγραφή συνομιλίας...'; + + @override + String get addToSpace => 'Προσθήκη στο χώρο'; + + @override + String get admin => 'Διαχειριστής'; + + @override + String get alias => 'ψευδώνυμο'; + + @override + String get all => 'Όλα'; + + @override + String get allChats => 'Όλες οι συνομιλίες'; + + @override + String get commandHint_roomupgrade => + 'Upgrade this room to the given room version'; + + @override + String get commandHint_googly => 'Στείλτε μερικά μάτια'; + + @override + String get commandHint_cuddle => 'Στείλτε μια αγκαλιά'; + + @override + String get commandHint_hug => 'Στείλτε μια αγκαλιά'; + + @override + String googlyEyesContent(String senderName) { + return '$senderName σας στέλνει googly eyes'; + } + + @override + String cuddleContent(String senderName) { + return '$senderName σε αγκαλιάζει'; + } + + @override + String hugContent(String senderName) { + return '$senderName σε αγκαλιάζει'; + } + + @override + String answeredTheCall(String senderName) { + return '$senderName απάντησε στην κλήση'; + } + + @override + String get anyoneCanJoin => 'Οποιοσδήποτε μπορεί να συμμετάσχει'; + + @override + String get appLock => 'Κλείδωμα εφαρμογών'; + + @override + String get appLockDescription => + 'Lock the app when not using with a pin code'; + + @override + String get archive => 'Αρχείο'; + + @override + String get areGuestsAllowedToJoin => + 'Επιτρέπεται στους φιλοξενούμενους χρήστες να συμμετάσχουν'; + + @override + String get areYouSure => 'Είσαι σίγουρος;'; + + @override + String get areYouSureYouWantToLogout => 'Σίγουρα θέλετε να αποσυνδεθείτε;'; + + @override + String get askSSSSSign => + 'Για να μπορέσετε να υπογράψετε το άλλο άτομο, πληκτρολογήστε τη συνθηματική φράση ασφαλούς αποθήκευσης ή το κλειδί ανάκτησης.'; + + @override + String askVerificationRequest(String username) { + return 'Αποδοχή αυτού του αιτήματος επαλήθευσης από $username;'; + } + + @override + String get autoplayImages => + 'Αυτόματη αναπαραγωγή κινούμενων αυτοκόλλητων και emotes'; + + @override + String badServerLoginTypesException(String serverVersions, + String supportedVersions, Object suportedVersions) { + return 'Ο homeserver υποστηρίζει τους τύπους σύνδεσης:\n$serverVersions\nΑλλά αυτή η εφαρμογή υποστηρίζει μόνο:\n$supportedVersions'; + } + + @override + String get sendTypingNotifications => 'Αποστολή ειδοποιήσεων δακτυλογράφησης'; + + @override + String get swipeRightToLeftToReply => 'Swipe right to left to reply'; + + @override + String get sendOnEnter => 'Αποστολή με enter'; + + @override + String badServerVersionsException(String serverVersions, + String supportedVersions, Object serverVerions, Object suportedVersions) { + return 'Ο homeserver υποστηρίζει τις εκδόσεις Spec:\n$serverVersions\nΑλλά αυτή η εφαρμογή υποστηρίζει μόνο τις $supportedVersions'; + } + + @override + String countChatsAndCountParticipants(int chats, int participants) { + return '$chats chats and $participants participants'; + } + + @override + String get noMoreChatsFound => 'No more chats found...'; + + @override + String get noChatsFoundHere => + 'No chats found here yet. Start a new chat with someone by using the button below. ⤵️'; + + @override + String get joinedChats => 'Joined chats'; + + @override + String get unread => 'Unread'; + + @override + String get space => 'Space'; + + @override + String get spaces => 'Spaces'; + + @override + String get banFromChat => 'Απαγόρευση από τη συνομιλία'; + + @override + String get banned => 'Απαγορευμένο'; + + @override + String bannedUser(String username, String targetName) { + return '$username banned $targetName'; + } + + @override + String get blockDevice => 'Συσκευή μπλοκ'; + + @override + String get blocked => 'Αποκλεισμένο'; + + @override + String get botMessages => 'Μηνύματα bot'; + + @override + String get cancel => 'Ακύρωση'; + + @override + String cantOpenUri(String uri) { + return 'Δεν μπορεί να ανοίξει το URI $uri'; + } + + @override + String get changeDeviceName => 'Change device name'; + + @override + String changedTheChatAvatar(String username) { + return '$username changed the chat avatar'; + } + + @override + String changedTheChatDescriptionTo(String username, String description) { + return '$username changed the chat description to: \'$description\''; + } + + @override + String changedTheChatNameTo(String username, String chatname) { + return '$username changed the chat name to: \'$chatname\''; + } + + @override + String changedTheChatPermissions(String username) { + return '$username changed the chat permissions'; + } + + @override + String changedTheDisplaynameTo(String username, String displayname) { + return '$username changed their displayname to: \'$displayname\''; + } + + @override + String changedTheGuestAccessRules(String username) { + return '$username changed the guest access rules'; + } + + @override + String changedTheGuestAccessRulesTo(String username, String rules) { + return '$username changed the guest access rules to: $rules'; + } + + @override + String changedTheHistoryVisibility(String username) { + return '$username changed the history visibility'; + } + + @override + String changedTheHistoryVisibilityTo(String username, String rules) { + return '$username changed the history visibility to: $rules'; + } + + @override + String changedTheJoinRules(String username) { + return '$username changed the join rules'; + } + + @override + String changedTheJoinRulesTo(String username, String joinRules) { + return '$username changed the join rules to: $joinRules'; + } + + @override + String changedTheProfileAvatar(String username) { + return '$username changed their avatar'; + } + + @override + String changedTheRoomAliases(String username) { + return '$username changed the room aliases'; + } + + @override + String changedTheRoomInvitationLink(String username) { + return '$username changed the invitation link'; + } + + @override + String get changePassword => 'Change password'; + + @override + String get changeTheHomeserver => 'Change the homeserver'; + + @override + String get changeTheme => 'Change your style'; + + @override + String get changeTheNameOfTheGroup => 'Change the name of the group'; + + @override + String get changeYourAvatar => 'Change your avatar'; + + @override + String get channelCorruptedDecryptError => + 'The encryption has been corrupted'; + + @override + String get chat => 'Chat'; + + @override + String get yourChatBackupHasBeenSetUp => 'Your chat backup has been set up.'; + + @override + String get chatBackup => 'Chat backup'; + + @override + String get chatBackupDescription => + 'Your old messages are secured with a recovery key. Please make sure you don\'t lose it.'; + + @override + String get chatDetails => 'Chat details'; + + @override + String get chatHasBeenAddedToThisSpace => 'Chat has been added to this space'; + + @override + String get chats => 'Chats'; + + @override + String get chooseAStrongPassword => 'Choose a strong password'; + + @override + String get clearArchive => 'Clear archive'; + + @override + String get close => 'Close'; + + @override + String get commandHint_markasdm => + 'Mark as direct message room for the giving Matrix ID'; + + @override + String get commandHint_markasgroup => 'Mark as group'; + + @override + String get commandHint_ban => 'Ban the given user from this room'; + + @override + String get commandHint_clearcache => 'Clear cache'; + + @override + String get commandHint_create => + 'Create an empty group chat\nUse --no-encryption to disable encryption'; + + @override + String get commandHint_discardsession => 'Discard session'; + + @override + String get commandHint_dm => + 'Start a direct chat\nUse --no-encryption to disable encryption'; + + @override + String get commandHint_html => 'Send HTML-formatted text'; + + @override + String get commandHint_invite => 'Invite the given user to this room'; + + @override + String get commandHint_join => 'Join the given room'; + + @override + String get commandHint_kick => 'Remove the given user from this room'; + + @override + String get commandHint_leave => 'Leave this room'; + + @override + String get commandHint_me => 'Describe yourself'; + + @override + String get commandHint_myroomavatar => + 'Set your picture for this room (by mxc-uri)'; + + @override + String get commandHint_myroomnick => 'Set your display name for this room'; + + @override + String get commandHint_op => + 'Set the given user\'s power level (default: 50)'; + + @override + String get commandHint_plain => 'Send unformatted text'; + + @override + String get commandHint_react => 'Send reply as a reaction'; + + @override + String get commandHint_send => 'Send text'; + + @override + String get commandHint_unban => 'Unban the given user from this room'; + + @override + String get commandInvalid => 'Command invalid'; + + @override + String commandMissing(String command) { + return '$command is not a command.'; + } + + @override + String get compareEmojiMatch => 'Please compare the emojis'; + + @override + String get compareNumbersMatch => 'Please compare the numbers'; + + @override + String get configureChat => 'Configure chat'; + + @override + String get confirm => 'Confirm'; + + @override + String get connect => 'Connect'; + + @override + String get contactHasBeenInvitedToTheGroup => + 'Contact has been invited to the group'; + + @override + String get containsDisplayName => 'Contains display name'; + + @override + String get containsUserName => 'Contains username'; + + @override + String get contentHasBeenReported => + 'The content has been reported to the server admins'; + + @override + String get copiedToClipboard => 'Copied to clipboard'; + + @override + String get copy => 'Copy'; + + @override + String get copyToClipboard => 'Copy to clipboard'; + + @override + String couldNotDecryptMessage(String error) { + return 'Could not decrypt message: $error'; + } + + @override + String countParticipants(int count) { + return '$count participants'; + } + + @override + String get create => 'Create'; + + @override + String createdTheChat(String username) { + return '💬 $username created the chat'; + } + + @override + String get createGroup => 'Create group'; + + @override + String get createNewSpace => 'New space'; + + @override + String get currentlyActive => 'Currently active'; + + @override + String get darkTheme => 'Dark'; + + @override + String dateAndTimeOfDay(String date, String timeOfDay) { + return '$date, $timeOfDay'; + } + + @override + String dateWithoutYear(String month, String day) { + return '$month-$day'; + } + + @override + String dateWithYear(String year, String month, String day) { + return '$year-$month-$day'; + } + + @override + String get deactivateAccountWarning => + 'This will deactivate your user account. This can not be undone! Are you sure?'; + + @override + String get defaultPermissionLevel => 'Default permission level for new users'; + + @override + String get delete => 'Delete'; + + @override + String get deleteAccount => 'Delete account'; + + @override + String get deleteMessage => 'Delete message'; + + @override + String get device => 'Device'; + + @override + String get deviceId => 'Device ID'; + + @override + String get devices => 'Devices'; + + @override + String get directChats => 'Direct Chats'; + + @override + String get allRooms => 'All Group Chats'; + + @override + String get displaynameHasBeenChanged => 'Displayname has been changed'; + + @override + String get downloadFile => 'Download file'; + + @override + String get edit => 'Edit'; + + @override + String get editBlockedServers => 'Edit blocked servers'; + + @override + String get chatPermissions => 'Chat permissions'; + + @override + String get editDisplayname => 'Edit displayname'; + + @override + String get editRoomAliases => 'Edit room aliases'; + + @override + String get editRoomAvatar => 'Edit room avatar'; + + @override + String get emoteExists => 'Emote already exists!'; + + @override + String get emoteInvalid => 'Invalid emote shortcode!'; + + @override + String get emoteKeyboardNoRecents => + 'Recently-used emotes will appear here...'; + + @override + String get emotePacks => 'Emote packs for room'; + + @override + String get emoteSettings => 'Emote Settings'; + + @override + String get globalChatId => 'Global chat ID'; + + @override + String get accessAndVisibility => 'Access and visibility'; + + @override + String get accessAndVisibilityDescription => + 'Who is allowed to join this chat and how the chat can be discovered.'; + + @override + String get calls => 'Calls'; + + @override + String get customEmojisAndStickers => 'Custom emojis and stickers'; + + @override + String get customEmojisAndStickersBody => + 'Add or share custom emojis or stickers which can be used in any chat.'; + + @override + String get emoteShortcode => 'Emote shortcode'; + + @override + String get emoteWarnNeedToPick => + 'You need to pick an emote shortcode and an image!'; + + @override + String get emptyChat => 'Empty chat'; + + @override + String get enableEmotesGlobally => 'Enable emote pack globally'; + + @override + String get enableEncryption => 'Enable encryption'; + + @override + String get enableEncryptionWarning => + 'You won\'t be able to disable the encryption anymore. Are you sure?'; + + @override + String get encrypted => 'Encrypted'; + + @override + String get encryption => 'Encryption'; + + @override + String get encryptionNotEnabled => 'Encryption is not enabled'; + + @override + String endedTheCall(String senderName) { + return '$senderName ended the call'; + } + + @override + String get enterAnEmailAddress => 'Enter an email address'; + + @override + String get homeserver => 'Homeserver'; + + @override + String get enterYourHomeserver => 'Enter your homeserver'; + + @override + String errorObtainingLocation(String error) { + return 'Error obtaining location: $error'; + } + + @override + String get everythingReady => 'Everything ready!'; + + @override + String get extremeOffensive => 'Extremely offensive'; + + @override + String get fileName => 'File name'; + + @override + String get fluffychat => 'Extera'; + + @override + String get fontSize => 'Font size'; + + @override + String get forward => 'Forward'; + + @override + String get fromJoining => 'From joining'; + + @override + String get fromTheInvitation => 'From the invitation'; + + @override + String get goToTheNewRoom => 'Go to the new room'; + + @override + String get group => 'Group'; + + @override + String get chatDescription => 'Chat description'; + + @override + String get chatDescriptionHasBeenChanged => 'Chat description changed'; + + @override + String get groupIsPublic => 'Group is public'; + + @override + String get groups => 'Groups'; + + @override + String groupWith(String displayname) { + return 'Group with $displayname'; + } + + @override + String get guestsAreForbidden => 'Guests are forbidden'; + + @override + String get guestsCanJoin => 'Guests can join'; + + @override + String hasWithdrawnTheInvitationFor(String username, String targetName) { + return '$username has withdrawn the invitation for $targetName'; + } + + @override + String get help => 'Help'; + + @override + String get hideRedactedEvents => 'Hide redacted events'; + + @override + String get hideRedactedMessages => 'Hide redacted messages'; + + @override + String get hideRedactedMessagesBody => + 'If someone redacts a message, this message won\'t be visible in the chat anymore.'; + + @override + String get hideInvalidOrUnknownMessageFormats => + 'Hide invalid or unknown message formats'; + + @override + String get howOffensiveIsThisContent => 'How offensive is this content?'; + + @override + String get id => 'ID'; + + @override + String get identity => 'Identity'; + + @override + String get block => 'Block'; + + @override + String get blockedUsers => 'Blocked users'; + + @override + String get blockListDescription => + 'You can block users who are disturbing you. You won\'t be able to receive any messages or room invites from the users on your personal block list.'; + + @override + String get blockUsername => 'Ignore username'; + + @override + String get iHaveClickedOnLink => 'I have clicked on the link'; + + @override + String get incorrectPassphraseOrKey => 'Incorrect passphrase or recovery key'; + + @override + String get inoffensive => 'Inoffensive'; + + @override + String get inviteContact => 'Invite contact'; + + @override + String inviteContactToGroupQuestion(Object contact, Object groupName) { + return 'Do you want to invite $contact to the chat \"$groupName\"?'; + } + + @override + String inviteContactToGroup(String groupName) { + return 'Invite contact to $groupName'; + } + + @override + String get noChatDescriptionYet => 'No chat description created yet.'; + + @override + String get tryAgain => 'Try again'; + + @override + String get invalidServerName => 'Invalid server name'; + + @override + String get invited => 'Invited'; + + @override + String get redactMessageDescription => + 'The message will be redacted for all participants in this conversation. This cannot be undone.'; + + @override + String get optionalRedactReason => + '(Optional) Reason for redacting this message...'; + + @override + String invitedUser(String username, String targetName) { + return '📩 $username invited $targetName'; + } + + @override + String get invitedUsersOnly => 'Invited users only'; + + @override + String get inviteForMe => 'Invite for me'; + + @override + String inviteText(String username, String link) { + return '$username invited you to Extera.\n1. Visit fluffychat.im and install the app \n2. Sign up or sign in \n3. Open the invite link: \n $link'; + } + + @override + String get isTyping => 'is typing…'; + + @override + String joinedTheChat(String username) { + return '👋 $username joined the chat'; + } + + @override + String get joinRoom => 'Join room'; + + @override + String kicked(String username, String targetName) { + return '👞 $username kicked $targetName'; + } + + @override + String kickedAndBanned(String username, String targetName) { + return '🙅 $username kicked and banned $targetName'; + } + + @override + String get kickFromChat => 'Kick from chat'; + + @override + String lastActiveAgo(String localizedTimeShort) { + return 'Last active: $localizedTimeShort'; + } + + @override + String get leave => 'Leave'; + + @override + String get leftTheChat => 'Left the chat'; + + @override + String get license => 'License'; + + @override + String get lightTheme => 'Light'; + + @override + String loadCountMoreParticipants(int count) { + return 'Load $count more participants'; + } + + @override + String get dehydrate => 'Export session and wipe device'; + + @override + String get dehydrateWarning => + 'This action cannot be undone. Ensure you safely store the backup file.'; + + @override + String get dehydrateTor => 'TOR Users: Export session'; + + @override + String get dehydrateTorLong => + 'For TOR users, it is recommended to export the session before closing the window.'; + + @override + String get hydrateTor => 'TOR Users: Import session export'; + + @override + String get hydrateTorLong => + 'Did you export your session last time on TOR? Quickly import it and continue chatting.'; + + @override + String get hydrate => 'Restore from backup file'; + + @override + String get loadingPleaseWait => 'Loading… Please wait.'; + + @override + String get loadMore => 'Load more…'; + + @override + String get locationDisabledNotice => + 'Location services are disabled. Please enable them to be able to share your location.'; + + @override + String get locationPermissionDeniedNotice => + 'Location permission denied. Please grant them to be able to share your location.'; + + @override + String get login => 'Login'; + + @override + String logInTo(String homeserver) { + return 'Log in to $homeserver'; + } + + @override + String get logout => 'Logout'; + + @override + String get memberChanges => 'Member changes'; + + @override + String get mention => 'Mention'; + + @override + String get messages => 'Messages'; + + @override + String get messagesStyle => 'Messages:'; + + @override + String get moderator => 'Moderator'; + + @override + String get muteChat => 'Mute chat'; + + @override + String get needPantalaimonWarning => + 'Please be aware that you need Pantalaimon to use end-to-end encryption for now.'; + + @override + String get newChat => 'New chat'; + + @override + String get newMessageInFluffyChat => '💬 New message in Extera'; + + @override + String get newVerificationRequest => 'New verification request!'; + + @override + String get next => 'Next'; + + @override + String get no => 'No'; + + @override + String get noConnectionToTheServer => 'No connection to the server'; + + @override + String get noEmotesFound => 'No emotes found. 😕'; + + @override + String get noEncryptionForPublicRooms => + 'You can only activate encryption as soon as the room is no longer publicly accessible.'; + + @override + String get noGoogleServicesWarning => + 'Firebase Cloud Messaging doesn\'t appear to be available on your device. To still receive push notifications, we recommend installing ntfy. With ntfy or another Unified Push provider you can receive push notifications in a data secure way. You can download ntfy from the PlayStore or from F-Droid.'; + + @override + String noMatrixServer(String server1, String server2) { + return '$server1 is no matrix server, use $server2 instead?'; + } + + @override + String get shareInviteLink => 'Share invite link'; + + @override + String get scanQrCode => 'Scan QR code'; + + @override + String get none => 'None'; + + @override + String get noPasswordRecoveryDescription => + 'You have not added a way to recover your password yet.'; + + @override + String get noPermission => 'No permission'; + + @override + String get noRoomsFound => 'No rooms found…'; + + @override + String get notifications => 'Notifications'; + + @override + String get notificationsEnabledForThisAccount => + 'Notifications enabled for this account'; + + @override + String numUsersTyping(int count) { + return '$count users are typing…'; + } + + @override + String get obtainingLocation => 'Obtaining location…'; + + @override + String get offensive => 'Offensive'; + + @override + String get offline => 'Offline'; + + @override + String get ok => 'Ok'; + + @override + String get online => 'Online'; + + @override + String get onlineKeyBackupEnabled => 'Online Key Backup is enabled'; + + @override + String get oopsPushError => + 'Oops! Unfortunately, an error occurred when setting up the push notifications.'; + + @override + String get oopsSomethingWentWrong => 'Oops, something went wrong…'; + + @override + String get openAppToReadMessages => 'Open app to read messages'; + + @override + String get openCamera => 'Open camera'; + + @override + String get openVideoCamera => 'Open camera for a video'; + + @override + String get oneClientLoggedOut => 'One of your clients has been logged out'; + + @override + String get addAccount => 'Add account'; + + @override + String get editBundlesForAccount => 'Edit bundles for this account'; + + @override + String get addToBundle => 'Add to bundle'; + + @override + String get removeFromBundle => 'Remove from this bundle'; + + @override + String get bundleName => 'Bundle name'; + + @override + String get enableMultiAccounts => + '(BETA) Enable multi accounts on this device'; + + @override + String get openInMaps => 'Open in maps'; + + @override + String get link => 'Link'; + + @override + String get serverRequiresEmail => + 'This server needs to validate your email address for registration.'; + + @override + String get or => 'Or'; + + @override + String get participant => 'Participant'; + + @override + String get passphraseOrKey => 'passphrase or recovery key'; + + @override + String get password => 'Password'; + + @override + String get passwordForgotten => 'Password forgotten'; + + @override + String get passwordHasBeenChanged => 'Password has been changed'; + + @override + String get hideMemberChangesInPublicChats => + 'Hide member changes in public chats'; + + @override + String get hideMemberChangesInPublicChatsBody => + 'Do not show in the chat timeline if someone joins or leaves a public chat to improve readability.'; + + @override + String get overview => 'Overview'; + + @override + String get notifyMeFor => 'Notify me for'; + + @override + String get passwordRecoverySettings => 'Password recovery settings'; + + @override + String get passwordRecovery => 'Password recovery'; + + @override + String get people => 'People'; + + @override + String get pickImage => 'Pick an image'; + + @override + String get pin => 'Pin'; + + @override + String play(String fileName) { + return 'Play $fileName'; + } + + @override + String get pleaseChoose => 'Please choose'; + + @override + String get pleaseChooseAPasscode => 'Please choose a pass code'; + + @override + String get pleaseClickOnLink => + 'Please click on the link in the email and then proceed.'; + + @override + String get pleaseEnter4Digits => + 'Please enter 4 digits or leave empty to disable app lock.'; + + @override + String get pleaseEnterRecoveryKey => 'Please enter your recovery key:'; + + @override + String get pleaseEnterYourPassword => 'Please enter your password'; + + @override + String get pleaseEnterYourPin => 'Please enter your pin'; + + @override + String get pleaseEnterYourUsername => 'Please enter your username'; + + @override + String get pleaseFollowInstructionsOnWeb => + 'Please follow the instructions on the website and tap on next.'; + + @override + String get privacy => 'Privacy'; + + @override + String get publicRooms => 'Public Rooms'; + + @override + String get pushRules => 'Push rules'; + + @override + String get reason => 'Reason'; + + @override + String get recording => 'Recording'; + + @override + String redactedBy(String username) { + return 'Redacted by $username'; + } + + @override + String get directChat => 'Direct chat'; + + @override + String redactedByBecause(String username, String reason) { + return 'Redacted by $username because: \"$reason\"'; + } + + @override + String redactedAnEvent(String username) { + return '$username redacted an event'; + } + + @override + String get redactMessage => 'Redact message'; + + @override + String get register => 'Register'; + + @override + String get reject => 'Reject'; + + @override + String rejectedTheInvitation(String username) { + return '$username rejected the invitation'; + } + + @override + String get rejoin => 'Rejoin'; + + @override + String get removeAllOtherDevices => 'Remove all other devices'; + + @override + String removedBy(String username) { + return 'Removed by $username'; + } + + @override + String get removeDevice => 'Remove device'; + + @override + String get unbanFromChat => 'Unban from chat'; + + @override + String get removeYourAvatar => 'Remove your avatar'; + + @override + String get replaceRoomWithNewerVersion => 'Replace room with newer version'; + + @override + String get reply => 'Reply'; + + @override + String get reportMessage => 'Report message'; + + @override + String get translateMessage => 'Translate message'; + + @override + String get translatedMessage => 'Translated message'; + + @override + String get errorTranslatingMessage => + 'An error has occured while translating the message.'; + + @override + String get recoverMessage => 'Recover message'; + + @override + String get recoveredMessage => 'Recovered message'; + + @override + String get errorRecoveringMessage => + 'An error has occured while recovering the message.'; + + @override + String get errorRecoveringMessageNoAdmin => + 'This feature is available on Synapse homeservers only for adminstrators.'; + + @override + String get requestPermission => 'Request permission'; + + @override + String get roomHasBeenUpgraded => 'Room has been upgraded'; + + @override + String get roomVersion => 'Room version'; + + @override + String get saveFile => 'Save file'; + + @override + String get retry => 'Retry'; + + @override + String get search => 'Search'; + + @override + String get security => 'Security'; + + @override + String get recoveryKey => 'Recovery key'; + + @override + String get recoveryKeyLost => 'Recovery key lost?'; + + @override + String seenByUser(String username) { + return 'Seen by $username'; + } + + @override + String get send => 'Send'; + + @override + String get sendAMessage => 'Send a message'; + + @override + String get sendAsText => 'Send as text'; + + @override + String get sendAudio => 'Send audio'; + + @override + String get sendFile => 'Send file'; + + @override + String get sendImage => 'Send image'; + + @override + String sendImages(int count) { + return 'Send $count image'; + } + + @override + String get sendMessages => 'Send messages'; + + @override + String get sendOriginal => 'Send original'; + + @override + String get sendSticker => 'Send sticker'; + + @override + String get sendVideo => 'Send video'; + + @override + String sentAFile(String username) { + return '📁 $username sent a file'; + } + + @override + String sentAnAudio(String username) { + return '🎤 $username sent an audio'; + } + + @override + String sentAPicture(String username) { + return '🖼️ $username sent a picture'; + } + + @override + String sentASticker(String username) { + return '😊 $username sent a sticker'; + } + + @override + String sentAVideo(String username) { + return '🎥 $username sent a video'; + } + + @override + String sentCallInformations(String senderName) { + return '$senderName sent call information'; + } + + @override + String get separateChatTypes => 'Separate Direct Chats and Groups'; + + @override + String get setAsCanonicalAlias => 'Set as main alias'; + + @override + String get setCustomEmotes => 'Set custom emotes'; + + @override + String get setChatDescription => 'Set chat description'; + + @override + String get setInvitationLink => 'Set invitation link'; + + @override + String get setPermissionsLevel => 'Set permissions level'; + + @override + String get setStatus => 'Set status'; + + @override + String get settings => 'Settings'; + + @override + String get share => 'Share'; + + @override + String sharedTheLocation(String username) { + return '$username shared their location'; + } + + @override + String get shareLocation => 'Share location'; + + @override + String get showPassword => 'Show password'; + + @override + String get presenceStyle => 'Presence:'; + + @override + String get hideAvatarsInInvites => 'Hide avatars in invites'; + + @override + String get hideAvatarsInInvitesDescription => + 'Do not show room avatars in invites'; + + @override + String get presencesToggle => 'Show status messages from other users'; + + @override + String get pureBlackToggle => 'Pure Black'; + + @override + String get singlesignon => 'Single Sign on'; + + @override + String get skip => 'Skip'; + + @override + String get sourceCode => 'Source code'; + + @override + String get spaceIsPublic => 'Space is public'; + + @override + String get spaceName => 'Space name'; + + @override + String startedACall(String senderName) { + return '$senderName started a call'; + } + + @override + String get startFirstChat => 'Start your first chat'; + + @override + String get status => 'Status'; + + @override + String get statusExampleMessage => 'How are you today?'; + + @override + String get submit => 'Submit'; + + @override + String get synchronizingPleaseWait => 'Synchronizing… Please wait.'; + + @override + String synchronizingPleaseWaitCounter(String percentage) { + return ' Synchronizing… ($percentage%)'; + } + + @override + String get systemTheme => 'System'; + + @override + String get theyDontMatch => 'They Don\'t Match'; + + @override + String get theyMatch => 'They Match'; + + @override + String get title => 'Extera'; + + @override + String get toggleFavorite => 'Toggle Favorite'; + + @override + String get toggleMuted => 'Toggle Muted'; + + @override + String get toggleUnread => 'Mark Read/Unread'; + + @override + String get tooManyRequestsWarning => + 'Too many requests. Please try again later!'; + + @override + String get transferFromAnotherDevice => 'Transfer from another device'; + + @override + String get tryToSendAgain => 'Try to send again'; + + @override + String get unavailable => 'Unavailable'; + + @override + String unbannedUser(String username, String targetName) { + return '$username unbanned $targetName'; + } + + @override + String get unblockDevice => 'Unblock Device'; + + @override + String get unknownDevice => 'Unknown device'; + + @override + String get unknownEncryptionAlgorithm => 'Unknown encryption algorithm'; + + @override + String unknownEvent(String type) { + return 'Unknown event \'$type\''; + } + + @override + String get unmuteChat => 'Unmute chat'; + + @override + String get unpin => 'Unpin'; + + @override + String unreadChats(int unreadCount) { + String _temp0 = intl.Intl.pluralLogic( + unreadCount, + locale: localeName, + other: '$unreadCount unread chats', + one: '1 unread chat', + ); + return '$_temp0'; + } + + @override + String userAndOthersAreTyping(String username, int count) { + return '$username and $count others are typing…'; + } + + @override + String userAndUserAreTyping(String username, String username2) { + return '$username and $username2 are typing…'; + } + + @override + String userIsTyping(String username) { + return '$username is typing…'; + } + + @override + String userLeftTheChat(String username) { + return '🚪 $username left the chat'; + } + + @override + String get username => 'Username'; + + @override + String userSentUnknownEvent(String username, String type) { + return '$username sent a $type event'; + } + + @override + String get unverified => 'Unverified'; + + @override + String get verified => 'Verified'; + + @override + String get verify => 'Verify'; + + @override + String get verifyStart => 'Start Verification'; + + @override + String get verifySuccess => 'You successfully verified!'; + + @override + String get verifyTitle => 'Verifying other account'; + + @override + String get videoCall => 'Video call'; + + @override + String get visibilityOfTheChatHistory => 'Visibility of the chat history'; + + @override + String get visibleForAllParticipants => 'Visible for all participants'; + + @override + String get visibleForEveryone => 'Visible for everyone'; + + @override + String get voiceMessage => 'Voice message'; + + @override + String get waitingPartnerAcceptRequest => + 'Waiting for partner to accept the request…'; + + @override + String get waitingPartnerEmoji => 'Waiting for partner to accept the emoji…'; + + @override + String get waitingPartnerNumbers => + 'Waiting for partner to accept the numbers…'; + + @override + String get wallpaper => 'Wallpaper:'; + + @override + String get warning => 'Warning!'; + + @override + String get weSentYouAnEmail => 'We sent you an email'; + + @override + String get whoCanPerformWhichAction => 'Who can perform which action'; + + @override + String get whoIsAllowedToJoinThisGroup => 'Who is allowed to join this group'; + + @override + String get whyDoYouWantToReportThis => 'Why do you want to report this?'; + + @override + String get wipeChatBackup => + 'Wipe your chat backup to create a new recovery key?'; + + @override + String get withTheseAddressesRecoveryDescription => + 'With these addresses you can recover your password.'; + + @override + String get writeAMessage => 'Write a message…'; + + @override + String get yes => 'Yes'; + + @override + String get you => 'You'; + + @override + String get youAreNoLongerParticipatingInThisChat => + 'You are no longer participating in this chat'; + + @override + String get youHaveBeenBannedFromThisChat => + 'You have been banned from this chat'; + + @override + String get yourPublicKey => 'Your public key'; + + @override + String get messageInfo => 'Message info'; + + @override + String get time => 'Time'; + + @override + String get messageType => 'Message Type'; + + @override + String get sender => 'Sender'; + + @override + String get openGallery => 'Open gallery'; + + @override + String get removeFromSpace => 'Remove from space'; + + @override + String get addToSpaceDescription => 'Select a space to add this chat to it.'; + + @override + String get start => 'Start'; + + @override + String get pleaseEnterRecoveryKeyDescription => + 'To unlock your old messages, please enter your recovery key that has been generated in a previous session. Your recovery key is NOT your password.'; + + @override + String get publish => 'Publish'; + + @override + String videoWithSize(String size) { + return 'Video ($size)'; + } + + @override + String get openChat => 'Open Chat'; + + @override + String get markAsRead => 'Mark as read'; + + @override + String get reportUser => 'Report user'; + + @override + String get dismiss => 'Dismiss'; + + @override + String reactedWith(String sender, String reaction) { + return '$sender reacted with $reaction'; + } + + @override + String get pinMessage => 'Pin to room'; + + @override + String get confirmEventUnpin => + 'Are you sure to permanently unpin the event?'; + + @override + String get emojis => 'Emojis'; + + @override + String get placeCall => 'Place call'; + + @override + String get voiceCall => 'Voice call'; + + @override + String get unsupportedAndroidVersion => 'Unsupported Android version'; + + @override + String get unsupportedAndroidVersionLong => + 'This feature requires a newer Android version. Please check for updates or Lineage OS support.'; + + @override + String get videoCallsBetaWarning => + 'Please note that video calls are currently in beta. They might not work as expected or work at all on all platforms.'; + + @override + String get experimentalVideoCalls => 'Experimental video calls'; + + @override + String get emailOrUsername => 'Email or username'; + + @override + String get indexedDbErrorTitle => 'Private mode issues'; + + @override + String get indexedDbErrorLong => + 'The message storage is unfortunately not enabled in private mode by default.\nPlease visit\n - about:config\n - set dom.indexedDB.privateBrowsing.enabled to true\nOtherwise, it is not possible to run Extera.'; + + @override + String switchToAccount(String number) { + return 'Switch to account $number'; + } + + @override + String get nextAccount => 'Next account'; + + @override + String get previousAccount => 'Previous account'; + + @override + String get addWidget => 'Add widget'; + + @override + String get widgetVideo => 'Video'; + + @override + String get widgetEtherpad => 'Text note'; + + @override + String get widgetJitsi => 'Jitsi Meet'; + + @override + String get widgetCustom => 'Custom'; + + @override + String get widgetName => 'Name'; + + @override + String get widgetUrlError => 'This is not a valid URL.'; + + @override + String get widgetNameError => 'Please provide a display name.'; + + @override + String get errorAddingWidget => 'Error adding the widget.'; + + @override + String get youRejectedTheInvitation => 'You rejected the invitation'; + + @override + String get youJoinedTheChat => 'You joined the chat'; + + @override + String get youAcceptedTheInvitation => '👍 You accepted the invitation'; + + @override + String youBannedUser(String user) { + return 'You banned $user'; + } + + @override + String youHaveWithdrawnTheInvitationFor(String user) { + return 'You have withdrawn the invitation for $user'; + } + + @override + String youInvitedToBy(String alias) { + return '📩 You have been invited via link to:\n$alias'; + } + + @override + String youInvitedBy(String user) { + return '📩 You have been invited by $user'; + } + + @override + String invitedBy(String user) { + return '📩 Invited by $user'; + } + + @override + String youInvitedUser(String user) { + return '📩 You invited $user'; + } + + @override + String youKicked(String user) { + return '👞 You kicked $user'; + } + + @override + String youKickedAndBanned(String user) { + return '🙅 You kicked and banned $user'; + } + + @override + String youUnbannedUser(String user) { + return 'You unbanned $user'; + } + + @override + String hasKnocked(String user) { + return '🚪 $user has knocked'; + } + + @override + String get usersMustKnock => 'Users must knock'; + + @override + String get noOneCanJoin => 'No one can join'; + + @override + String userWouldLikeToChangeTheChat(String user) { + return '$user would like to join the chat.'; + } + + @override + String get noPublicLinkHasBeenCreatedYet => + 'No public link has been created yet'; + + @override + String get knock => 'Knock'; + + @override + String get users => 'Users'; + + @override + String get unlockOldMessages => 'Unlock old messages'; + + @override + String get storeInSecureStorageDescription => + 'Store the recovery key in the secure storage of this device.'; + + @override + String get saveKeyManuallyDescription => + 'Save this key manually by triggering the system share dialog or clipboard.'; + + @override + String get storeInAndroidKeystore => 'Store in Android KeyStore'; + + @override + String get storeInAppleKeyChain => 'Store in Apple KeyChain'; + + @override + String get storeSecurlyOnThisDevice => 'Store securely on this device'; + + @override + String countFiles(int count) { + return '$count files'; + } + + @override + String get user => 'User'; + + @override + String get custom => 'Custom'; + + @override + String get foregroundServiceRunning => + 'This notification appears when the foreground service is running.'; + + @override + String get screenSharingTitle => 'screen sharing'; + + @override + String get screenSharingDetail => 'You are sharing your screen in Extera'; + + @override + String get callingPermissions => 'Calling permissions'; + + @override + String get callingAccount => 'Calling account'; + + @override + String get callingAccountDetails => + 'Allows Extera to use the native android dialer app.'; + + @override + String get appearOnTop => 'Appear on top'; + + @override + String get appearOnTopDetails => + 'Allows the app to appear on top (not needed if you already have Fluffychat setup as a calling account)'; + + @override + String get otherCallingPermissions => + 'Microphone, camera and other Extera permissions'; + + @override + String get whyIsThisMessageEncrypted => 'Why is this message unreadable?'; + + @override + String get noKeyForThisMessage => + 'This can happen if the message was sent before you have signed in to your account at this device.\n\nIt is also possible that the sender has blocked your device or something went wrong with the internet connection.\n\nAre you able to read the message on another session? Then you can transfer the message from it! Go to Settings > Devices and make sure that your devices have verified each other. When you open the room the next time and both sessions are in the foreground, the keys will be transmitted automatically.\n\nDo you not want to lose the keys when logging out or switching devices? Make sure that you have enabled the chat backup in the settings.'; + + @override + String get newGroup => 'New group'; + + @override + String get newSpace => 'New space'; + + @override + String get enterSpace => 'Enter space'; + + @override + String get enterRoom => 'Enter room'; + + @override + String get allSpaces => 'All spaces'; + + @override + String numChats(String number) { + return '$number chats'; + } + + @override + String get hideUnimportantStateEvents => 'Hide unimportant state events'; + + @override + String get hidePresences => 'Hide Status List?'; + + @override + String get doNotShowAgain => 'Do not show again'; + + @override + String wasDirectChatDisplayName(String oldDisplayName) { + return 'Empty chat (was $oldDisplayName)'; + } + + @override + String get newSpaceDescription => + 'Spaces allows you to consolidate your chats and build private or public communities.'; + + @override + String get encryptThisChat => 'Encrypt this chat'; + + @override + String get disableEncryptionWarning => + 'For security reasons you can not disable encryption in a chat, where it has been enabled before.'; + + @override + String get sorryThatsNotPossible => 'Sorry... that is not possible'; + + @override + String get deviceKeys => 'Device keys:'; + + @override + String get reopenChat => 'Reopen chat'; + + @override + String get noBackupWarning => + 'Warning! Without enabling chat backup, you will lose access to your encrypted messages. It is highly recommended to enable the chat backup first before logging out.'; + + @override + String get noOtherDevicesFound => 'No other devices found'; + + @override + String fileIsTooBigForServer(String max) { + return 'Unable to send! The server only supports attachments up to $max.'; + } + + @override + String fileHasBeenSavedAt(String path) { + return 'File has been saved at $path'; + } + + @override + String get jumpToLastReadMessage => 'Jump to last read message'; + + @override + String get readUpToHere => 'Read up to here'; + + @override + String get jump => 'Jump'; + + @override + String get openLinkInBrowser => 'Open link in browser'; + + @override + String get reportErrorDescription => + '😭 Oh no. Something went wrong. If you want, you can report this bug to the developers.'; + + @override + String get report => 'Report'; + + @override + String get signInWithPassword => 'Sign in with password'; + + @override + String get pleaseTryAgainLaterOrChooseDifferentServer => + 'Please try again later or choose a different server.'; + + @override + String signInWith(String provider) { + return 'Sign in with $provider'; + } + + @override + String get profileNotFound => + 'The user could not be found on the server. Maybe there is a connection problem or the user doesn\'t exist.'; + + @override + String get setTheme => 'Set theme:'; + + @override + String get setColorTheme => 'Set color theme:'; + + @override + String get invite => 'Invite'; + + @override + String get inviteGroupChat => '📨 Invite group chat'; + + @override + String get invitePrivateChat => '📨 Invite private chat'; + + @override + String get invalidInput => 'Invalid input!'; + + @override + String wrongPinEntered(int seconds) { + return 'Wrong pin entered! Try again in $seconds seconds...'; + } + + @override + String get pleaseEnterANumber => 'Please enter a number greater than 0'; + + @override + String get archiveRoomDescription => + 'The chat will be moved to the archive. Other users will be able to see that you have left the chat.'; + + @override + String get roomUpgradeDescription => + 'The chat will then be recreated with the new room version. All participants will be notified that they need to switch to the new chat. You can find out more about room versions at https://spec.matrix.org/latest/rooms/'; + + @override + String get removeDevicesDescription => + 'You will be logged out of this device and will no longer be able to receive messages.'; + + @override + String get banUserDescription => + 'The user will be banned from the chat and will not be able to enter the chat again until they are unbanned.'; + + @override + String get unbanUserDescription => + 'The user will be able to enter the chat again if they try.'; + + @override + String get kickUserDescription => + 'The user is kicked out of the chat but not banned. In public chats, the user can rejoin at any time.'; + + @override + String get makeAdminDescription => + 'Once you make this user admin, you may not be able to undo this as they will then have the same permissions as you.'; + + @override + String get pushNotificationsNotAvailable => + 'Push notifications not available'; + + @override + String get learnMore => 'Learn more'; + + @override + String get yourGlobalUserIdIs => 'Your global user-ID is: '; + + @override + String noUsersFoundWithQuery(String query) { + return 'Unfortunately no user could be found with \"$query\". Please check whether you made a typo.'; + } + + @override + String get knocking => 'Knocking'; + + @override + String chatCanBeDiscoveredViaSearchOnServer(String server) { + return 'Chat can be discovered via the search on $server'; + } + + @override + String get searchChatsRooms => 'Search for #chats, @users...'; + + @override + String get nothingFound => 'Nothing found...'; + + @override + String get groupName => 'Group name'; + + @override + String get createGroupAndInviteUsers => 'Create a group and invite users'; + + @override + String get groupCanBeFoundViaSearch => 'Group can be found via search'; + + @override + String get wrongRecoveryKey => + 'Sorry... this does not seem to be the correct recovery key.'; + + @override + String get startConversation => 'Start conversation'; + + @override + String get commandHint_sendraw => 'Send raw json'; + + @override + String get databaseMigrationTitle => 'Database is optimized'; + + @override + String get databaseMigrationBody => 'Please wait. This may take a moment.'; + + @override + String get leaveEmptyToClearStatus => 'Leave empty to clear your status.'; + + @override + String get select => 'Select'; + + @override + String get searchForUsers => 'Search for @users...'; + + @override + String get pleaseEnterYourCurrentPassword => + 'Please enter your current password'; + + @override + String get newPassword => 'New password'; + + @override + String get pleaseChooseAStrongPassword => 'Please choose a strong password'; + + @override + String get passwordsDoNotMatch => 'Passwords do not match'; + + @override + String get passwordIsWrong => 'Your entered password is wrong'; + + @override + String get publicLink => 'Public link'; + + @override + String get publicChatAddresses => 'Public chat addresses'; + + @override + String get createNewAddress => 'Create new address'; + + @override + String get joinSpace => 'Join space'; + + @override + String get publicSpaces => 'Public spaces'; + + @override + String get addChatOrSubSpace => 'Add chat or sub space'; + + @override + String get subspace => 'Subspace'; + + @override + String get decline => 'Decline'; + + @override + String get thisDevice => 'This device:'; + + @override + String get initAppError => 'An error occured while init the app'; + + @override + String get userRole => 'User role'; + + @override + String minimumPowerLevel(String level) { + return '$level is the minimum power level.'; + } + + @override + String searchIn(String chat) { + return 'Search in chat \"$chat\"...'; + } + + @override + String get searchMore => 'Search more...'; + + @override + String get gallery => 'Gallery'; + + @override + String get files => 'Files'; + + @override + String databaseBuildErrorBody(String url, String error) { + return 'Unable to build the SQlite database. The app tries to use the legacy database for now. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String sessionLostBody(String url, String error) { + return 'Your session is lost. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String restoreSessionBody(String url, String error) { + return 'The app now tries to restore your session from the backup. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String forwardMessageTo(String roomName) { + return 'Forward message to $roomName?'; + } + + @override + String get sendReadReceipts => 'Send read receipts'; + + @override + String get sendTypingNotificationsDescription => + 'Other participants in a chat can see when you are typing a new message.'; + + @override + String get sendReadReceiptsDescription => + 'Other participants in a chat can see when you have read a message.'; + + @override + String get formattedMessages => 'Formatted messages'; + + @override + String get formattedMessagesDescription => + 'Display rich message content like bold text using markdown.'; + + @override + String get verifyOtherUser => '🔐 Verify other user'; + + @override + String get verifyOtherUserDescription => + 'If you verify another user, you can be sure that you know who you are really writing to. 💪\n\nWhen you start a verification, you and the other user will see a popup in the app. There you will then see a series of emojis or numbers that you have to compare with each other.\n\nThe best way to do this is to meet up or start a video call. 👭'; + + @override + String get verifyOtherDevice => '🔐 Verify other device'; + + @override + String get verifyOtherDeviceDescription => + 'When you verify another device, those devices can exchange keys, increasing your overall security. 💪 When you start a verification, a popup will appear in the app on both devices. There you will then see a series of emojis or numbers that you have to compare with each other. It\'s best to have both devices handy before you start the verification. 🤳'; + + @override + String acceptedKeyVerification(String sender) { + return '$sender accepted key verification'; + } + + @override + String canceledKeyVerification(String sender) { + return '$sender canceled key verification'; + } + + @override + String completedKeyVerification(String sender) { + return '$sender completed key verification'; + } + + @override + String isReadyForKeyVerification(String sender) { + return '$sender is ready for key verification'; + } + + @override + String requestedKeyVerification(String sender) { + return '$sender requested key verification'; + } + + @override + String startedKeyVerification(String sender) { + return '$sender started key verification'; + } + + @override + String get transparent => 'Transparent'; + + @override + String get incomingMessages => 'Incoming messages'; + + @override + String get stickers => 'Stickers'; + + @override + String get discover => 'Discover'; + + @override + String get commandHint_ignore => 'Ignore the given matrix ID'; + + @override + String get commandHint_unignore => 'Unignore the given matrix ID'; + + @override + String unreadChatsInApp(String appname, String unread) { + return '$appname: $unread unread chats'; + } + + @override + String get noDatabaseEncryption => + 'Database encryption is not supported on this platform'; + + @override + String thereAreCountUsersBlocked(Object count) { + return 'Right now there are $count users blocked.'; + } + + @override + String get restricted => 'Restricted'; + + @override + String get knockRestricted => 'Knock restricted'; + + @override + String goToSpace(Object space) { + return 'Go to space: $space'; + } + + @override + String get markAsUnread => 'Mark as unread'; + + @override + String userLevel(int level) { + return '$level - User'; + } + + @override + String moderatorLevel(int level) { + return '$level - Moderator'; + } + + @override + String adminLevel(int level) { + return '$level - Admin'; + } + + @override + String get changeGeneralChatSettings => 'Change general chat settings'; + + @override + String get inviteOtherUsers => 'Invite other users to this chat'; + + @override + String get changeTheChatPermissions => 'Change the chat permissions'; + + @override + String get changeTheVisibilityOfChatHistory => + 'Change the visibility of the chat history'; + + @override + String get changeTheCanonicalRoomAlias => + 'Change the main public chat address'; + + @override + String get sendRoomNotifications => 'Send a @room notifications'; + + @override + String get changeTheDescriptionOfTheGroup => + 'Change the description of the chat'; + + @override + String get chatPermissionsDescription => + 'Define which power level is necessary for certain actions in this chat. The power levels 0, 50 and 100 are usually representing users, moderators and admins, but any gradation is possible.'; + + @override + String updateInstalled(String version) { + return '🎉 Update $version installed!'; + } + + @override + String get changelog => 'Changelog'; + + @override + String get sendCanceled => 'Sending canceled'; + + @override + String get loginWithMatrixId => 'Login with Matrix-ID'; + + @override + String get discoverHomeservers => 'Discover homeservers'; + + @override + String get whatIsAHomeserver => 'What is a homeserver?'; + + @override + String get homeserverDescription => + 'All your data is stored on the homeserver, just like an email provider. You can choose which homeserver you want to use, while you can still communicate with everyone. Learn more at at https://matrix.org.'; + + @override + String get doesNotSeemToBeAValidHomeserver => + 'Doesn\'t seem to be a compatible homeserver. Wrong URL?'; + + @override + String get calculatingFileSize => 'Calculating file size...'; + + @override + String get prepareSendingAttachment => 'Prepare sending attachment...'; + + @override + String get sendingAttachment => 'Sending attachment...'; + + @override + String get generatingVideoThumbnail => 'Generating video thumbnail...'; + + @override + String get compressVideo => 'Compressing video...'; + + @override + String sendingAttachmentCountOfCount(int index, int length) { + return 'Sending attachment $index of $length...'; + } + + @override + String serverLimitReached(int seconds) { + return 'Server limit reached! Waiting $seconds seconds...'; + } + + @override + String get oneOfYourDevicesIsNotVerified => + 'One of your devices is not verified'; + + @override + String get noticeChatBackupDeviceVerification => + 'Note: When you connect all your devices to the chat backup, they are automatically verified.'; + + @override + String get continueText => 'Continue'; + + @override + String get welcomeText => + 'Hey Hey 👋 This is Extera. You can sign in to any homeserver, which is compatible with https://matrix.org. And then chat with anyone. It\'s a huge decentralized messaging network!'; + + @override + String get blur => 'Blur:'; + + @override + String get opacity => 'Opacity:'; + + @override + String get setWallpaper => 'Set wallpaper'; + + @override + String get manageAccount => 'Manage account'; + + @override + String get noContactInformationProvided => + 'Server does not provide any valid contact information'; + + @override + String get contactServerAdmin => 'Contact server admin'; + + @override + String get contactServerSecurity => 'Contact server security'; + + @override + String get supportPage => 'Support page'; + + @override + String get serverInformation => 'Server information:'; + + @override + String get name => 'Name'; + + @override + String get version => 'Version'; + + @override + String get website => 'Website'; + + @override + String get compress => 'Compress'; + + @override + String get boldText => 'Bold text'; + + @override + String get italicText => 'Italic text'; + + @override + String get strikeThrough => 'Strikethrough'; + + @override + String get pleaseFillOut => 'Please fill out'; + + @override + String get invalidUrl => 'Invalid url'; + + @override + String get addLink => 'Add link'; + + @override + String get unableToJoinChat => + 'Unable to join chat. Maybe the other party has already closed the conversation.'; + + @override + String get previous => 'Previous'; + + @override + String get otherPartyNotLoggedIn => + 'The other party is currently not logged in and therefore cannot receive messages!'; + + @override + String appWantsToUseForLogin(String server) { + return 'Use \'$server\' to log in'; + } + + @override + String get appWantsToUseForLoginDescription => + 'You hereby allow the app and website to share information about you.'; + + @override + String get open => 'Open'; + + @override + String get waitingForServer => 'Waiting for server...'; + + @override + String get appIntroduction => + 'Extera lets you chat with your friends across different messengers. Learn more at https://matrix.org or just tap *Continue*.'; + + @override + String get newChatRequest => '📩 New chat request'; + + @override + String get contentNotificationSettings => 'Content notification settings'; + + @override + String get generalNotificationSettings => 'General notification settings'; + + @override + String get roomNotificationSettings => 'Room notification settings'; + + @override + String get userSpecificNotificationSettings => + 'User specific notification settings'; + + @override + String get otherNotificationSettings => 'Other notification settings'; + + @override + String get notificationRuleContainsUserName => 'Contains User Name'; + + @override + String get notificationRuleContainsUserNameDescription => + 'Notifies the user when a message contains their username.'; + + @override + String get notificationRuleMaster => 'Mute all notifications'; + + @override + String get notificationRuleMasterDescription => + 'Overrides all other rules and disables all notifications.'; + + @override + String get notificationRuleSuppressNotices => 'Suppress Automated Messages'; + + @override + String get notificationRuleSuppressNoticesDescription => + 'Suppresses notifications from automated clients like bots.'; + + @override + String get notificationRuleInviteForMe => 'Invite for Me'; + + @override + String get notificationRuleInviteForMeDescription => + 'Notifies the user when they are invited to a room.'; + + @override + String get notificationRuleMemberEvent => 'Member Event'; + + @override + String get notificationRuleMemberEventDescription => + 'Suppresses notifications for membership events.'; + + @override + String get notificationRuleIsUserMention => 'User Mention'; + + @override + String get notificationRuleIsUserMentionDescription => + 'Notifies the user when they are directly mentioned in a message.'; + + @override + String get notificationRuleContainsDisplayName => 'Contains Display Name'; + + @override + String get notificationRuleContainsDisplayNameDescription => + 'Notifies the user when a message contains their display name.'; + + @override + String get notificationRuleIsRoomMention => 'Room Mention'; + + @override + String get notificationRuleIsRoomMentionDescription => + 'Notifies the user when there is a room mention.'; + + @override + String get notificationRuleRoomnotif => 'Room Notification'; + + @override + String get notificationRuleRoomnotifDescription => + 'Notifies the user when a message contains \'@room\'.'; + + @override + String get notificationRuleTombstone => 'Tombstone'; + + @override + String get notificationRuleTombstoneDescription => + 'Notifies the user about room deactivation messages.'; + + @override + String get notificationRuleReaction => 'Reaction'; + + @override + String get notificationRuleReactionDescription => + 'Suppresses notifications for reactions.'; + + @override + String get notificationRuleRoomServerAcl => 'Room Server ACL'; + + @override + String get notificationRuleRoomServerAclDescription => + 'Suppresses notifications for room server access control lists (ACL).'; + + @override + String get notificationRuleSuppressEdits => 'Suppress Edits'; + + @override + String get notificationRuleSuppressEditsDescription => + 'Suppresses notifications for edited messages.'; + + @override + String get notificationRuleCall => 'Call'; + + @override + String get notificationRuleCallDescription => + 'Notifies the user about calls.'; + + @override + String get notificationRuleEncryptedRoomOneToOne => + 'Encrypted Room One-to-One'; + + @override + String get notificationRuleEncryptedRoomOneToOneDescription => + 'Notifies the user about messages in encrypted one-to-one rooms.'; + + @override + String get notificationRuleRoomOneToOne => 'Room One-to-One'; + + @override + String get notificationRuleRoomOneToOneDescription => + 'Notifies the user about messages in one-to-one rooms.'; + + @override + String get notificationRuleMessage => 'Message'; + + @override + String get notificationRuleMessageDescription => + 'Notifies the user about general messages.'; + + @override + String get notificationRuleEncrypted => 'Encrypted'; + + @override + String get notificationRuleEncryptedDescription => + 'Notifies the user about messages in encrypted rooms.'; + + @override + String get notificationRuleJitsi => 'Jitsi'; + + @override + String get notificationRuleJitsiDescription => + 'Notifies the user about Jitsi widget events.'; + + @override + String get notificationRuleServerAcl => 'Suppress Server ACL Events'; + + @override + String get notificationRuleServerAclDescription => + 'Suppresses notifications for Server ACL events.'; + + @override + String unknownPushRule(String rule) { + return 'Unknown push rule \'$rule\''; + } + + @override + String get deletePushRuleCanNotBeUndone => + 'If you delete this notification setting, this can not be undone.'; + + @override + String get more => 'More'; + + @override + String get shareKeysWith => 'Share keys with...'; + + @override + String get shareKeysWithDescription => + 'Which devices should be trusted so that they can read along your messages in encrypted chats?'; + + @override + String get allDevices => 'All devices'; + + @override + String get crossVerifiedDevicesIfEnabled => + 'Cross verified devices if enabled'; + + @override + String get crossVerifiedDevices => 'Cross verified devices'; + + @override + String get verifiedDevicesOnly => 'Verified devices only'; + + @override + String get takeAPhoto => 'Take a photo'; + + @override + String get recordAVideo => 'Record a video'; + + @override + String get optionalMessage => '(Optional) message...'; + + @override + String get notSupportedOnThisDevice => 'Not supported on this device'; + + @override + String get enterNewChat => 'Enter new chat'; + + @override + String get approve => 'Approve'; + + @override + String get youHaveKnocked => 'You have knocked'; + + @override + String get pleaseWaitUntilInvited => + 'Please wait now, until someone from the room invites you.'; +} diff --git a/lib/generated/l10n/l10n_en.dart b/lib/generated/l10n/l10n_en.dart new file mode 100644 index 0000000..f9f51a3 --- /dev/null +++ b/lib/generated/l10n/l10n_en.dart @@ -0,0 +1,2745 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'l10n.dart'; + +// ignore_for_file: type=lint + +/// The translations for English (`en`). +class L10nEn extends L10n { + L10nEn([String locale = 'en']) : super(locale); + + @override + String get noSendPermission => 'You can\'t send messages here'; + + @override + String get alwaysUse24HourFormat => 'false'; + + @override + String get repeatPassword => 'Repeat password'; + + @override + String get notAnImage => 'Not an image file.'; + + @override + String get setCustomPermissionLevel => 'Set custom permission level'; + + @override + String get setPermissionsLevelDescription => + 'Please choose a predefined role below or enter a custom permission level between 0 and 100.'; + + @override + String get ignoreUser => 'Ignore user'; + + @override + String get normalUser => 'Normal user'; + + @override + String get remove => 'Remove'; + + @override + String get importNow => 'Import now'; + + @override + String get importEmojis => 'Import Emojis'; + + @override + String get importFromZipFile => 'Import from .zip file'; + + @override + String get exportEmotePack => 'Export Emote pack as .zip'; + + @override + String get replace => 'Replace'; + + @override + String get about => 'About'; + + @override + String aboutHomeserver(String homeserver) { + return 'About $homeserver'; + } + + @override + String get accept => 'Accept'; + + @override + String acceptedTheInvitation(String username) { + return '👍 $username accepted the invitation'; + } + + @override + String get account => 'Account'; + + @override + String activatedEndToEndEncryption(String username) { + return '🔐 $username activated end to end encryption'; + } + + @override + String get addEmail => 'Add email'; + + @override + String get confirmMatrixId => + 'Please confirm your Matrix ID in order to delete your account.'; + + @override + String supposedMxid(String mxid) { + return 'This should be $mxid'; + } + + @override + String get addChatDescription => 'Add a chat description...'; + + @override + String get addToSpace => 'Add to space'; + + @override + String get admin => 'Admin'; + + @override + String get alias => 'alias'; + + @override + String get all => 'All'; + + @override + String get allChats => 'All chats'; + + @override + String get commandHint_roomupgrade => + 'Upgrade this room to the given room version'; + + @override + String get commandHint_googly => 'Send some googly eyes'; + + @override + String get commandHint_cuddle => 'Send a cuddle'; + + @override + String get commandHint_hug => 'Send a hug'; + + @override + String googlyEyesContent(String senderName) { + return '$senderName sends you googly eyes'; + } + + @override + String cuddleContent(String senderName) { + return '$senderName cuddles you'; + } + + @override + String hugContent(String senderName) { + return '$senderName hugs you'; + } + + @override + String answeredTheCall(String senderName) { + return '$senderName answered the call'; + } + + @override + String get anyoneCanJoin => 'Anyone can join'; + + @override + String get appLock => 'App lock'; + + @override + String get appLockDescription => + 'Lock the app when not using with a pin code'; + + @override + String get archive => 'Archive'; + + @override + String get areGuestsAllowedToJoin => 'Are guest users allowed to join'; + + @override + String get areYouSure => 'Are you sure?'; + + @override + String get areYouSureYouWantToLogout => 'Are you sure you want to log out?'; + + @override + String get askSSSSSign => + 'To be able to sign the other person, please enter your secure store passphrase or recovery key.'; + + @override + String askVerificationRequest(String username) { + return 'Accept this verification request from $username?'; + } + + @override + String get autoplayImages => + 'Automatically play animated stickers and emotes'; + + @override + String badServerLoginTypesException(String serverVersions, + String supportedVersions, Object suportedVersions) { + return 'The homeserver supports the login types:\n$serverVersions\nBut this app supports only:\n$supportedVersions'; + } + + @override + String get sendTypingNotifications => 'Send typing notifications'; + + @override + String get swipeRightToLeftToReply => 'Swipe right to left to reply'; + + @override + String get sendOnEnter => 'Send on enter'; + + @override + String badServerVersionsException(String serverVersions, + String supportedVersions, Object serverVerions, Object suportedVersions) { + return 'The homeserver supports the Spec versions:\n$serverVersions\nBut this app supports only $supportedVersions'; + } + + @override + String countChatsAndCountParticipants(int chats, int participants) { + return '$chats chats and $participants participants'; + } + + @override + String get noMoreChatsFound => 'No more chats found...'; + + @override + String get noChatsFoundHere => + 'No chats found here yet. Start a new chat with someone by using the button below. ⤵️'; + + @override + String get joinedChats => 'Joined chats'; + + @override + String get unread => 'Unread'; + + @override + String get space => 'Space'; + + @override + String get spaces => 'Spaces'; + + @override + String get banFromChat => 'Ban from chat'; + + @override + String get banned => 'Banned'; + + @override + String bannedUser(String username, String targetName) { + return '$username banned $targetName'; + } + + @override + String get blockDevice => 'Block Device'; + + @override + String get blocked => 'Blocked'; + + @override + String get botMessages => 'Bot messages'; + + @override + String get cancel => 'Cancel'; + + @override + String cantOpenUri(String uri) { + return 'Can\'t open the URI $uri'; + } + + @override + String get changeDeviceName => 'Change device name'; + + @override + String changedTheChatAvatar(String username) { + return '$username changed the chat avatar'; + } + + @override + String changedTheChatDescriptionTo(String username, String description) { + return '$username changed the chat description to: \'$description\''; + } + + @override + String changedTheChatNameTo(String username, String chatname) { + return '$username changed the chat name to: \'$chatname\''; + } + + @override + String changedTheChatPermissions(String username) { + return '$username changed the chat permissions'; + } + + @override + String changedTheDisplaynameTo(String username, String displayname) { + return '$username changed their displayname to: \'$displayname\''; + } + + @override + String changedTheGuestAccessRules(String username) { + return '$username changed the guest access rules'; + } + + @override + String changedTheGuestAccessRulesTo(String username, String rules) { + return '$username changed the guest access rules to: $rules'; + } + + @override + String changedTheHistoryVisibility(String username) { + return '$username changed the history visibility'; + } + + @override + String changedTheHistoryVisibilityTo(String username, String rules) { + return '$username changed the history visibility to: $rules'; + } + + @override + String changedTheJoinRules(String username) { + return '$username changed the join rules'; + } + + @override + String changedTheJoinRulesTo(String username, String joinRules) { + return '$username changed the join rules to: $joinRules'; + } + + @override + String changedTheProfileAvatar(String username) { + return '$username changed their avatar'; + } + + @override + String changedTheRoomAliases(String username) { + return '$username changed the room aliases'; + } + + @override + String changedTheRoomInvitationLink(String username) { + return '$username changed the invitation link'; + } + + @override + String get changePassword => 'Change password'; + + @override + String get changeTheHomeserver => 'Change the homeserver'; + + @override + String get changeTheme => 'Change your style'; + + @override + String get changeTheNameOfTheGroup => 'Change the name of the group'; + + @override + String get changeYourAvatar => 'Change your avatar'; + + @override + String get channelCorruptedDecryptError => + 'The encryption has been corrupted'; + + @override + String get chat => 'Chat'; + + @override + String get yourChatBackupHasBeenSetUp => 'Your chat backup has been set up.'; + + @override + String get chatBackup => 'Chat backup'; + + @override + String get chatBackupDescription => + 'Your old messages are secured with a recovery key. Please make sure you don\'t lose it.'; + + @override + String get chatDetails => 'Chat details'; + + @override + String get chatHasBeenAddedToThisSpace => 'Chat has been added to this space'; + + @override + String get chats => 'Chats'; + + @override + String get chooseAStrongPassword => 'Choose a strong password'; + + @override + String get clearArchive => 'Clear archive'; + + @override + String get close => 'Close'; + + @override + String get commandHint_markasdm => + 'Mark as direct message room for the giving Matrix ID'; + + @override + String get commandHint_markasgroup => 'Mark as group'; + + @override + String get commandHint_ban => 'Ban the given user from this room'; + + @override + String get commandHint_clearcache => 'Clear cache'; + + @override + String get commandHint_create => + 'Create an empty group chat\nUse --no-encryption to disable encryption'; + + @override + String get commandHint_discardsession => 'Discard session'; + + @override + String get commandHint_dm => + 'Start a direct chat\nUse --no-encryption to disable encryption'; + + @override + String get commandHint_html => 'Send HTML-formatted text'; + + @override + String get commandHint_invite => 'Invite the given user to this room'; + + @override + String get commandHint_join => 'Join the given room'; + + @override + String get commandHint_kick => 'Remove the given user from this room'; + + @override + String get commandHint_leave => 'Leave this room'; + + @override + String get commandHint_me => 'Describe yourself'; + + @override + String get commandHint_myroomavatar => + 'Set your picture for this room (by mxc-uri)'; + + @override + String get commandHint_myroomnick => 'Set your display name for this room'; + + @override + String get commandHint_op => + 'Set the given user\'s power level (default: 50)'; + + @override + String get commandHint_plain => 'Send unformatted text'; + + @override + String get commandHint_react => 'Send reply as a reaction'; + + @override + String get commandHint_send => 'Send text'; + + @override + String get commandHint_unban => 'Unban the given user from this room'; + + @override + String get commandInvalid => 'Command invalid'; + + @override + String commandMissing(String command) { + return '$command is not a command.'; + } + + @override + String get compareEmojiMatch => 'Please compare the emojis'; + + @override + String get compareNumbersMatch => 'Please compare the numbers'; + + @override + String get configureChat => 'Configure chat'; + + @override + String get confirm => 'Confirm'; + + @override + String get connect => 'Connect'; + + @override + String get contactHasBeenInvitedToTheGroup => + 'Contact has been invited to the group'; + + @override + String get containsDisplayName => 'Contains display name'; + + @override + String get containsUserName => 'Contains username'; + + @override + String get contentHasBeenReported => + 'The content has been reported to the server admins'; + + @override + String get copiedToClipboard => 'Copied to clipboard'; + + @override + String get copy => 'Copy'; + + @override + String get copyToClipboard => 'Copy to clipboard'; + + @override + String couldNotDecryptMessage(String error) { + return 'Could not decrypt message: $error'; + } + + @override + String countParticipants(int count) { + return '$count participants'; + } + + @override + String get create => 'Create'; + + @override + String createdTheChat(String username) { + return '💬 $username created the chat'; + } + + @override + String get createGroup => 'Create group'; + + @override + String get createNewSpace => 'New space'; + + @override + String get currentlyActive => 'Currently active'; + + @override + String get darkTheme => 'Dark'; + + @override + String dateAndTimeOfDay(String date, String timeOfDay) { + return '$date, $timeOfDay'; + } + + @override + String dateWithoutYear(String month, String day) { + return '$month-$day'; + } + + @override + String dateWithYear(String year, String month, String day) { + return '$year-$month-$day'; + } + + @override + String get deactivateAccountWarning => + 'This will deactivate your user account. This can not be undone! Are you sure?'; + + @override + String get defaultPermissionLevel => 'Default permission level for new users'; + + @override + String get delete => 'Delete'; + + @override + String get deleteAccount => 'Delete account'; + + @override + String get deleteMessage => 'Delete message'; + + @override + String get device => 'Device'; + + @override + String get deviceId => 'Device ID'; + + @override + String get devices => 'Devices'; + + @override + String get directChats => 'Direct Chats'; + + @override + String get allRooms => 'All Group Chats'; + + @override + String get displaynameHasBeenChanged => 'Displayname has been changed'; + + @override + String get downloadFile => 'Download file'; + + @override + String get edit => 'Edit'; + + @override + String get editBlockedServers => 'Edit blocked servers'; + + @override + String get chatPermissions => 'Chat permissions'; + + @override + String get editDisplayname => 'Edit displayname'; + + @override + String get editRoomAliases => 'Edit room aliases'; + + @override + String get editRoomAvatar => 'Edit room avatar'; + + @override + String get emoteExists => 'Emote already exists!'; + + @override + String get emoteInvalid => 'Invalid emote shortcode!'; + + @override + String get emoteKeyboardNoRecents => + 'Recently-used emotes will appear here...'; + + @override + String get emotePacks => 'Emote packs for room'; + + @override + String get emoteSettings => 'Emote Settings'; + + @override + String get globalChatId => 'Global chat ID'; + + @override + String get accessAndVisibility => 'Access and visibility'; + + @override + String get accessAndVisibilityDescription => + 'Who is allowed to join this chat and how the chat can be discovered.'; + + @override + String get calls => 'Calls'; + + @override + String get customEmojisAndStickers => 'Custom emojis and stickers'; + + @override + String get customEmojisAndStickersBody => + 'Add or share custom emojis or stickers which can be used in any chat.'; + + @override + String get emoteShortcode => 'Emote shortcode'; + + @override + String get emoteWarnNeedToPick => + 'You need to pick an emote shortcode and an image!'; + + @override + String get emptyChat => 'Empty chat'; + + @override + String get enableEmotesGlobally => 'Enable emote pack globally'; + + @override + String get enableEncryption => 'Enable encryption'; + + @override + String get enableEncryptionWarning => + 'You won\'t be able to disable the encryption anymore. Are you sure?'; + + @override + String get encrypted => 'Encrypted'; + + @override + String get encryption => 'Encryption'; + + @override + String get encryptionNotEnabled => 'Encryption is not enabled'; + + @override + String endedTheCall(String senderName) { + return '$senderName ended the call'; + } + + @override + String get enterAnEmailAddress => 'Enter an email address'; + + @override + String get homeserver => 'Homeserver'; + + @override + String get enterYourHomeserver => 'Enter your homeserver'; + + @override + String errorObtainingLocation(String error) { + return 'Error obtaining location: $error'; + } + + @override + String get everythingReady => 'Everything ready!'; + + @override + String get extremeOffensive => 'Extremely offensive'; + + @override + String get fileName => 'File name'; + + @override + String get fluffychat => 'Extera'; + + @override + String get fontSize => 'Font size'; + + @override + String get forward => 'Forward'; + + @override + String get fromJoining => 'From joining'; + + @override + String get fromTheInvitation => 'From the invitation'; + + @override + String get goToTheNewRoom => 'Go to the new room'; + + @override + String get group => 'Group'; + + @override + String get chatDescription => 'Chat description'; + + @override + String get chatDescriptionHasBeenChanged => 'Chat description changed'; + + @override + String get groupIsPublic => 'Group is public'; + + @override + String get groups => 'Groups'; + + @override + String groupWith(String displayname) { + return 'Group with $displayname'; + } + + @override + String get guestsAreForbidden => 'Guests are forbidden'; + + @override + String get guestsCanJoin => 'Guests can join'; + + @override + String hasWithdrawnTheInvitationFor(String username, String targetName) { + return '$username has withdrawn the invitation for $targetName'; + } + + @override + String get help => 'Help'; + + @override + String get hideRedactedEvents => 'Hide redacted events'; + + @override + String get hideRedactedMessages => 'Hide redacted messages'; + + @override + String get hideRedactedMessagesBody => + 'If someone redacts a message, this message won\'t be visible in the chat anymore.'; + + @override + String get hideInvalidOrUnknownMessageFormats => + 'Hide invalid or unknown message formats'; + + @override + String get howOffensiveIsThisContent => 'How offensive is this content?'; + + @override + String get id => 'ID'; + + @override + String get identity => 'Identity'; + + @override + String get block => 'Block'; + + @override + String get blockedUsers => 'Blocked users'; + + @override + String get blockListDescription => + 'You can block users who are disturbing you. You won\'t be able to receive any messages or room invites from the users on your personal block list.'; + + @override + String get blockUsername => 'Ignore username'; + + @override + String get iHaveClickedOnLink => 'I have clicked on the link'; + + @override + String get incorrectPassphraseOrKey => 'Incorrect passphrase or recovery key'; + + @override + String get inoffensive => 'Inoffensive'; + + @override + String get inviteContact => 'Invite contact'; + + @override + String inviteContactToGroupQuestion(Object contact, Object groupName) { + return 'Do you want to invite $contact to the chat \"$groupName\"?'; + } + + @override + String inviteContactToGroup(String groupName) { + return 'Invite contact to $groupName'; + } + + @override + String get noChatDescriptionYet => 'No chat description created yet.'; + + @override + String get tryAgain => 'Try again'; + + @override + String get invalidServerName => 'Invalid server name'; + + @override + String get invited => 'Invited'; + + @override + String get redactMessageDescription => + 'The message will be redacted for all participants in this conversation. This cannot be undone.'; + + @override + String get optionalRedactReason => + '(Optional) Reason for redacting this message...'; + + @override + String invitedUser(String username, String targetName) { + return '📩 $username invited $targetName'; + } + + @override + String get invitedUsersOnly => 'Invited users only'; + + @override + String get inviteForMe => 'Invite for me'; + + @override + String inviteText(String username, String link) { + return '$username invited you to Extera.\n1. Visit fluffychat.im and install the app \n2. Sign up or sign in \n3. Open the invite link: \n $link'; + } + + @override + String get isTyping => 'is typing…'; + + @override + String joinedTheChat(String username) { + return '👋 $username joined the chat'; + } + + @override + String get joinRoom => 'Join room'; + + @override + String kicked(String username, String targetName) { + return '👞 $username kicked $targetName'; + } + + @override + String kickedAndBanned(String username, String targetName) { + return '🙅 $username kicked and banned $targetName'; + } + + @override + String get kickFromChat => 'Kick from chat'; + + @override + String lastActiveAgo(String localizedTimeShort) { + return 'Last active: $localizedTimeShort'; + } + + @override + String get leave => 'Leave'; + + @override + String get leftTheChat => 'Left the chat'; + + @override + String get license => 'License'; + + @override + String get lightTheme => 'Light'; + + @override + String loadCountMoreParticipants(int count) { + return 'Load $count more participants'; + } + + @override + String get dehydrate => 'Export session and wipe device'; + + @override + String get dehydrateWarning => + 'This action cannot be undone. Ensure you safely store the backup file.'; + + @override + String get dehydrateTor => 'TOR Users: Export session'; + + @override + String get dehydrateTorLong => + 'For TOR users, it is recommended to export the session before closing the window.'; + + @override + String get hydrateTor => 'TOR Users: Import session export'; + + @override + String get hydrateTorLong => + 'Did you export your session last time on TOR? Quickly import it and continue chatting.'; + + @override + String get hydrate => 'Restore from backup file'; + + @override + String get loadingPleaseWait => 'Loading… Please wait.'; + + @override + String get loadMore => 'Load more…'; + + @override + String get locationDisabledNotice => + 'Location services are disabled. Please enable them to be able to share your location.'; + + @override + String get locationPermissionDeniedNotice => + 'Location permission denied. Please grant them to be able to share your location.'; + + @override + String get login => 'Login'; + + @override + String logInTo(String homeserver) { + return 'Log in to $homeserver'; + } + + @override + String get logout => 'Logout'; + + @override + String get memberChanges => 'Member changes'; + + @override + String get mention => 'Mention'; + + @override + String get messages => 'Messages'; + + @override + String get messagesStyle => 'Messages:'; + + @override + String get moderator => 'Moderator'; + + @override + String get muteChat => 'Mute chat'; + + @override + String get needPantalaimonWarning => + 'Please be aware that you need Pantalaimon to use end-to-end encryption for now.'; + + @override + String get newChat => 'New chat'; + + @override + String get newMessageInFluffyChat => '💬 New message in Extera'; + + @override + String get newVerificationRequest => 'New verification request!'; + + @override + String get next => 'Next'; + + @override + String get no => 'No'; + + @override + String get noConnectionToTheServer => 'No connection to the server'; + + @override + String get noEmotesFound => 'No emotes found. 😕'; + + @override + String get noEncryptionForPublicRooms => + 'You can only activate encryption as soon as the room is no longer publicly accessible.'; + + @override + String get noGoogleServicesWarning => + 'Firebase Cloud Messaging doesn\'t appear to be available on your device. To still receive push notifications, we recommend installing ntfy. With ntfy or another Unified Push provider you can receive push notifications in a data secure way. You can download ntfy from the PlayStore or from F-Droid.'; + + @override + String noMatrixServer(String server1, String server2) { + return '$server1 is no matrix server, use $server2 instead?'; + } + + @override + String get shareInviteLink => 'Share invite link'; + + @override + String get scanQrCode => 'Scan QR code'; + + @override + String get none => 'None'; + + @override + String get noPasswordRecoveryDescription => + 'You have not added a way to recover your password yet.'; + + @override + String get noPermission => 'No permission'; + + @override + String get noRoomsFound => 'No rooms found…'; + + @override + String get notifications => 'Notifications'; + + @override + String get notificationsEnabledForThisAccount => + 'Notifications enabled for this account'; + + @override + String numUsersTyping(int count) { + return '$count users are typing…'; + } + + @override + String get obtainingLocation => 'Obtaining location…'; + + @override + String get offensive => 'Offensive'; + + @override + String get offline => 'Offline'; + + @override + String get ok => 'Ok'; + + @override + String get online => 'Online'; + + @override + String get onlineKeyBackupEnabled => 'Online Key Backup is enabled'; + + @override + String get oopsPushError => + 'Oops! Unfortunately, an error occurred when setting up the push notifications.'; + + @override + String get oopsSomethingWentWrong => 'Oops, something went wrong…'; + + @override + String get openAppToReadMessages => 'Open app to read messages'; + + @override + String get openCamera => 'Open camera'; + + @override + String get openVideoCamera => 'Open camera for a video'; + + @override + String get oneClientLoggedOut => 'One of your clients has been logged out'; + + @override + String get addAccount => 'Add account'; + + @override + String get editBundlesForAccount => 'Edit bundles for this account'; + + @override + String get addToBundle => 'Add to bundle'; + + @override + String get removeFromBundle => 'Remove from this bundle'; + + @override + String get bundleName => 'Bundle name'; + + @override + String get enableMultiAccounts => + '(BETA) Enable multi accounts on this device'; + + @override + String get openInMaps => 'Open in maps'; + + @override + String get link => 'Link'; + + @override + String get serverRequiresEmail => + 'This server needs to validate your email address for registration.'; + + @override + String get or => 'Or'; + + @override + String get participant => 'Participant'; + + @override + String get passphraseOrKey => 'passphrase or recovery key'; + + @override + String get password => 'Password'; + + @override + String get passwordForgotten => 'Password forgotten'; + + @override + String get passwordHasBeenChanged => 'Password has been changed'; + + @override + String get hideMemberChangesInPublicChats => + 'Hide member changes in public chats'; + + @override + String get hideMemberChangesInPublicChatsBody => + 'Do not show in the chat timeline if someone joins or leaves a public chat to improve readability.'; + + @override + String get overview => 'Overview'; + + @override + String get notifyMeFor => 'Notify me for'; + + @override + String get passwordRecoverySettings => 'Password recovery settings'; + + @override + String get passwordRecovery => 'Password recovery'; + + @override + String get people => 'People'; + + @override + String get pickImage => 'Pick an image'; + + @override + String get pin => 'Pin'; + + @override + String play(String fileName) { + return 'Play $fileName'; + } + + @override + String get pleaseChoose => 'Please choose'; + + @override + String get pleaseChooseAPasscode => 'Please choose a pass code'; + + @override + String get pleaseClickOnLink => + 'Please click on the link in the email and then proceed.'; + + @override + String get pleaseEnter4Digits => + 'Please enter 4 digits or leave empty to disable app lock.'; + + @override + String get pleaseEnterRecoveryKey => 'Please enter your recovery key:'; + + @override + String get pleaseEnterYourPassword => 'Please enter your password'; + + @override + String get pleaseEnterYourPin => 'Please enter your pin'; + + @override + String get pleaseEnterYourUsername => 'Please enter your username'; + + @override + String get pleaseFollowInstructionsOnWeb => + 'Please follow the instructions on the website and tap on next.'; + + @override + String get privacy => 'Privacy'; + + @override + String get publicRooms => 'Public Rooms'; + + @override + String get pushRules => 'Push rules'; + + @override + String get reason => 'Reason'; + + @override + String get recording => 'Recording'; + + @override + String redactedBy(String username) { + return 'Redacted by $username'; + } + + @override + String get directChat => 'Direct chat'; + + @override + String redactedByBecause(String username, String reason) { + return 'Redacted by $username because: \"$reason\"'; + } + + @override + String redactedAnEvent(String username) { + return '$username redacted an event'; + } + + @override + String get redactMessage => 'Redact message'; + + @override + String get register => 'Register'; + + @override + String get reject => 'Reject'; + + @override + String rejectedTheInvitation(String username) { + return '$username rejected the invitation'; + } + + @override + String get rejoin => 'Rejoin'; + + @override + String get removeAllOtherDevices => 'Remove all other devices'; + + @override + String removedBy(String username) { + return 'Removed by $username'; + } + + @override + String get removeDevice => 'Remove device'; + + @override + String get unbanFromChat => 'Unban from chat'; + + @override + String get removeYourAvatar => 'Remove your avatar'; + + @override + String get replaceRoomWithNewerVersion => 'Replace room with newer version'; + + @override + String get reply => 'Reply'; + + @override + String get reportMessage => 'Report message'; + + @override + String get translateMessage => 'Translate message'; + + @override + String get translatedMessage => 'Translated message'; + + @override + String get errorTranslatingMessage => + 'An error has occured while translating the message.'; + + @override + String get recoverMessage => 'Recover message'; + + @override + String get recoveredMessage => 'Recovered message'; + + @override + String get errorRecoveringMessage => + 'An error has occured while recovering the message.'; + + @override + String get errorRecoveringMessageNoAdmin => + 'This feature is available on Synapse homeservers only for adminstrators.'; + + @override + String get requestPermission => 'Request permission'; + + @override + String get roomHasBeenUpgraded => 'Room has been upgraded'; + + @override + String get roomVersion => 'Room version'; + + @override + String get saveFile => 'Save file'; + + @override + String get retry => 'Retry'; + + @override + String get search => 'Search'; + + @override + String get security => 'Security'; + + @override + String get recoveryKey => 'Recovery key'; + + @override + String get recoveryKeyLost => 'Recovery key lost?'; + + @override + String seenByUser(String username) { + return 'Seen by $username'; + } + + @override + String get send => 'Send'; + + @override + String get sendAMessage => 'Send a message'; + + @override + String get sendAsText => 'Send as text'; + + @override + String get sendAudio => 'Send audio'; + + @override + String get sendFile => 'Send file'; + + @override + String get sendImage => 'Send image'; + + @override + String sendImages(int count) { + return 'Send $count image'; + } + + @override + String get sendMessages => 'Send messages'; + + @override + String get sendOriginal => 'Send original'; + + @override + String get sendSticker => 'Send sticker'; + + @override + String get sendVideo => 'Send video'; + + @override + String sentAFile(String username) { + return '📁 $username sent a file'; + } + + @override + String sentAnAudio(String username) { + return '🎤 $username sent an audio'; + } + + @override + String sentAPicture(String username) { + return '🖼️ $username sent a picture'; + } + + @override + String sentASticker(String username) { + return '😊 $username sent a sticker'; + } + + @override + String sentAVideo(String username) { + return '🎥 $username sent a video'; + } + + @override + String sentCallInformations(String senderName) { + return '$senderName sent call information'; + } + + @override + String get separateChatTypes => 'Separate Direct Chats and Groups'; + + @override + String get setAsCanonicalAlias => 'Set as main alias'; + + @override + String get setCustomEmotes => 'Set custom emotes'; + + @override + String get setChatDescription => 'Set chat description'; + + @override + String get setInvitationLink => 'Set invitation link'; + + @override + String get setPermissionsLevel => 'Set permissions level'; + + @override + String get setStatus => 'Set status'; + + @override + String get settings => 'Settings'; + + @override + String get share => 'Share'; + + @override + String sharedTheLocation(String username) { + return '$username shared their location'; + } + + @override + String get shareLocation => 'Share location'; + + @override + String get showPassword => 'Show password'; + + @override + String get presenceStyle => 'Presence:'; + + @override + String get hideAvatarsInInvites => 'Hide avatars in invites'; + + @override + String get hideAvatarsInInvitesDescription => + 'Do not show room avatars in invites'; + + @override + String get presencesToggle => 'Show status messages from other users'; + + @override + String get pureBlackToggle => 'Pure Black'; + + @override + String get singlesignon => 'Single Sign on'; + + @override + String get skip => 'Skip'; + + @override + String get sourceCode => 'Source code'; + + @override + String get spaceIsPublic => 'Space is public'; + + @override + String get spaceName => 'Space name'; + + @override + String startedACall(String senderName) { + return '$senderName started a call'; + } + + @override + String get startFirstChat => 'Start your first chat'; + + @override + String get status => 'Status'; + + @override + String get statusExampleMessage => 'How are you today?'; + + @override + String get submit => 'Submit'; + + @override + String get synchronizingPleaseWait => 'Synchronizing… Please wait.'; + + @override + String synchronizingPleaseWaitCounter(String percentage) { + return ' Synchronizing… ($percentage%)'; + } + + @override + String get systemTheme => 'System'; + + @override + String get theyDontMatch => 'They Don\'t Match'; + + @override + String get theyMatch => 'They Match'; + + @override + String get title => 'Extera'; + + @override + String get toggleFavorite => 'Toggle Favorite'; + + @override + String get toggleMuted => 'Toggle Muted'; + + @override + String get toggleUnread => 'Mark Read/Unread'; + + @override + String get tooManyRequestsWarning => + 'Too many requests. Please try again later!'; + + @override + String get transferFromAnotherDevice => 'Transfer from another device'; + + @override + String get tryToSendAgain => 'Try to send again'; + + @override + String get unavailable => 'Unavailable'; + + @override + String unbannedUser(String username, String targetName) { + return '$username unbanned $targetName'; + } + + @override + String get unblockDevice => 'Unblock Device'; + + @override + String get unknownDevice => 'Unknown device'; + + @override + String get unknownEncryptionAlgorithm => 'Unknown encryption algorithm'; + + @override + String unknownEvent(String type) { + return 'Unknown event \'$type\''; + } + + @override + String get unmuteChat => 'Unmute chat'; + + @override + String get unpin => 'Unpin'; + + @override + String unreadChats(int unreadCount) { + String _temp0 = intl.Intl.pluralLogic( + unreadCount, + locale: localeName, + other: '$unreadCount unread chats', + one: '1 unread chat', + ); + return '$_temp0'; + } + + @override + String userAndOthersAreTyping(String username, int count) { + return '$username and $count others are typing…'; + } + + @override + String userAndUserAreTyping(String username, String username2) { + return '$username and $username2 are typing…'; + } + + @override + String userIsTyping(String username) { + return '$username is typing…'; + } + + @override + String userLeftTheChat(String username) { + return '🚪 $username left the chat'; + } + + @override + String get username => 'Username'; + + @override + String userSentUnknownEvent(String username, String type) { + return '$username sent a $type event'; + } + + @override + String get unverified => 'Unverified'; + + @override + String get verified => 'Verified'; + + @override + String get verify => 'Verify'; + + @override + String get verifyStart => 'Start Verification'; + + @override + String get verifySuccess => 'You successfully verified!'; + + @override + String get verifyTitle => 'Verifying other account'; + + @override + String get videoCall => 'Video call'; + + @override + String get visibilityOfTheChatHistory => 'Visibility of the chat history'; + + @override + String get visibleForAllParticipants => 'Visible for all participants'; + + @override + String get visibleForEveryone => 'Visible for everyone'; + + @override + String get voiceMessage => 'Voice message'; + + @override + String get waitingPartnerAcceptRequest => + 'Waiting for partner to accept the request…'; + + @override + String get waitingPartnerEmoji => 'Waiting for partner to accept the emoji…'; + + @override + String get waitingPartnerNumbers => + 'Waiting for partner to accept the numbers…'; + + @override + String get wallpaper => 'Wallpaper:'; + + @override + String get warning => 'Warning!'; + + @override + String get weSentYouAnEmail => 'We sent you an email'; + + @override + String get whoCanPerformWhichAction => 'Who can perform which action'; + + @override + String get whoIsAllowedToJoinThisGroup => 'Who is allowed to join this group'; + + @override + String get whyDoYouWantToReportThis => 'Why do you want to report this?'; + + @override + String get wipeChatBackup => + 'Wipe your chat backup to create a new recovery key?'; + + @override + String get withTheseAddressesRecoveryDescription => + 'With these addresses you can recover your password.'; + + @override + String get writeAMessage => 'Write a message…'; + + @override + String get yes => 'Yes'; + + @override + String get you => 'You'; + + @override + String get youAreNoLongerParticipatingInThisChat => + 'You are no longer participating in this chat'; + + @override + String get youHaveBeenBannedFromThisChat => + 'You have been banned from this chat'; + + @override + String get yourPublicKey => 'Your public key'; + + @override + String get messageInfo => 'Message info'; + + @override + String get time => 'Time'; + + @override + String get messageType => 'Message Type'; + + @override + String get sender => 'Sender'; + + @override + String get openGallery => 'Open gallery'; + + @override + String get removeFromSpace => 'Remove from space'; + + @override + String get addToSpaceDescription => 'Select a space to add this chat to it.'; + + @override + String get start => 'Start'; + + @override + String get pleaseEnterRecoveryKeyDescription => + 'To unlock your old messages, please enter your recovery key that has been generated in a previous session. Your recovery key is NOT your password.'; + + @override + String get publish => 'Publish'; + + @override + String videoWithSize(String size) { + return 'Video ($size)'; + } + + @override + String get openChat => 'Open Chat'; + + @override + String get markAsRead => 'Mark as read'; + + @override + String get reportUser => 'Report user'; + + @override + String get dismiss => 'Dismiss'; + + @override + String reactedWith(String sender, String reaction) { + return '$sender reacted with $reaction'; + } + + @override + String get pinMessage => 'Pin to room'; + + @override + String get confirmEventUnpin => + 'Are you sure to permanently unpin the event?'; + + @override + String get emojis => 'Emojis'; + + @override + String get placeCall => 'Place call'; + + @override + String get voiceCall => 'Voice call'; + + @override + String get unsupportedAndroidVersion => 'Unsupported Android version'; + + @override + String get unsupportedAndroidVersionLong => + 'This feature requires a newer Android version. Please check for updates or Lineage OS support.'; + + @override + String get videoCallsBetaWarning => + 'Please note that video calls are currently in beta. They might not work as expected or work at all on all platforms.'; + + @override + String get experimentalVideoCalls => 'Experimental video calls'; + + @override + String get emailOrUsername => 'Email or username'; + + @override + String get indexedDbErrorTitle => 'Private mode issues'; + + @override + String get indexedDbErrorLong => + 'The message storage is unfortunately not enabled in private mode by default.\nPlease visit\n - about:config\n - set dom.indexedDB.privateBrowsing.enabled to true\nOtherwise, it is not possible to run Extera.'; + + @override + String switchToAccount(String number) { + return 'Switch to account $number'; + } + + @override + String get nextAccount => 'Next account'; + + @override + String get previousAccount => 'Previous account'; + + @override + String get addWidget => 'Add widget'; + + @override + String get widgetVideo => 'Video'; + + @override + String get widgetEtherpad => 'Text note'; + + @override + String get widgetJitsi => 'Jitsi Meet'; + + @override + String get widgetCustom => 'Custom'; + + @override + String get widgetName => 'Name'; + + @override + String get widgetUrlError => 'This is not a valid URL.'; + + @override + String get widgetNameError => 'Please provide a display name.'; + + @override + String get errorAddingWidget => 'Error adding the widget.'; + + @override + String get youRejectedTheInvitation => 'You rejected the invitation'; + + @override + String get youJoinedTheChat => 'You joined the chat'; + + @override + String get youAcceptedTheInvitation => '👍 You accepted the invitation'; + + @override + String youBannedUser(String user) { + return 'You banned $user'; + } + + @override + String youHaveWithdrawnTheInvitationFor(String user) { + return 'You have withdrawn the invitation for $user'; + } + + @override + String youInvitedToBy(String alias) { + return '📩 You have been invited via link to:\n$alias'; + } + + @override + String youInvitedBy(String user) { + return '📩 You have been invited by $user'; + } + + @override + String invitedBy(String user) { + return '📩 Invited by $user'; + } + + @override + String youInvitedUser(String user) { + return '📩 You invited $user'; + } + + @override + String youKicked(String user) { + return '👞 You kicked $user'; + } + + @override + String youKickedAndBanned(String user) { + return '🙅 You kicked and banned $user'; + } + + @override + String youUnbannedUser(String user) { + return 'You unbanned $user'; + } + + @override + String hasKnocked(String user) { + return '🚪 $user has knocked'; + } + + @override + String get usersMustKnock => 'Users must knock'; + + @override + String get noOneCanJoin => 'No one can join'; + + @override + String userWouldLikeToChangeTheChat(String user) { + return '$user would like to join the chat.'; + } + + @override + String get noPublicLinkHasBeenCreatedYet => + 'No public link has been created yet'; + + @override + String get knock => 'Knock'; + + @override + String get users => 'Users'; + + @override + String get unlockOldMessages => 'Unlock old messages'; + + @override + String get storeInSecureStorageDescription => + 'Store the recovery key in the secure storage of this device.'; + + @override + String get saveKeyManuallyDescription => + 'Save this key manually by triggering the system share dialog or clipboard.'; + + @override + String get storeInAndroidKeystore => 'Store in Android KeyStore'; + + @override + String get storeInAppleKeyChain => 'Store in Apple KeyChain'; + + @override + String get storeSecurlyOnThisDevice => 'Store securely on this device'; + + @override + String countFiles(int count) { + return '$count files'; + } + + @override + String get user => 'User'; + + @override + String get custom => 'Custom'; + + @override + String get foregroundServiceRunning => + 'This notification appears when the foreground service is running.'; + + @override + String get screenSharingTitle => 'screen sharing'; + + @override + String get screenSharingDetail => 'You are sharing your screen in Extera'; + + @override + String get callingPermissions => 'Calling permissions'; + + @override + String get callingAccount => 'Calling account'; + + @override + String get callingAccountDetails => + 'Allows Extera to use the native android dialer app.'; + + @override + String get appearOnTop => 'Appear on top'; + + @override + String get appearOnTopDetails => + 'Allows the app to appear on top (not needed if you already have Fluffychat setup as a calling account)'; + + @override + String get otherCallingPermissions => + 'Microphone, camera and other Extera permissions'; + + @override + String get whyIsThisMessageEncrypted => 'Why is this message unreadable?'; + + @override + String get noKeyForThisMessage => + 'This can happen if the message was sent before you have signed in to your account at this device.\n\nIt is also possible that the sender has blocked your device or something went wrong with the internet connection.\n\nAre you able to read the message on another session? Then you can transfer the message from it! Go to Settings > Devices and make sure that your devices have verified each other. When you open the room the next time and both sessions are in the foreground, the keys will be transmitted automatically.\n\nDo you not want to lose the keys when logging out or switching devices? Make sure that you have enabled the chat backup in the settings.'; + + @override + String get newGroup => 'New group'; + + @override + String get newSpace => 'New space'; + + @override + String get enterSpace => 'Enter space'; + + @override + String get enterRoom => 'Enter room'; + + @override + String get allSpaces => 'All spaces'; + + @override + String numChats(String number) { + return '$number chats'; + } + + @override + String get hideUnimportantStateEvents => 'Hide unimportant state events'; + + @override + String get hidePresences => 'Hide Status List?'; + + @override + String get doNotShowAgain => 'Do not show again'; + + @override + String wasDirectChatDisplayName(String oldDisplayName) { + return 'Empty chat (was $oldDisplayName)'; + } + + @override + String get newSpaceDescription => + 'Spaces allows you to consolidate your chats and build private or public communities.'; + + @override + String get encryptThisChat => 'Encrypt this chat'; + + @override + String get disableEncryptionWarning => + 'For security reasons you can not disable encryption in a chat, where it has been enabled before.'; + + @override + String get sorryThatsNotPossible => 'Sorry... that is not possible'; + + @override + String get deviceKeys => 'Device keys:'; + + @override + String get reopenChat => 'Reopen chat'; + + @override + String get noBackupWarning => + 'Warning! Without enabling chat backup, you will lose access to your encrypted messages. It is highly recommended to enable the chat backup first before logging out.'; + + @override + String get noOtherDevicesFound => 'No other devices found'; + + @override + String fileIsTooBigForServer(String max) { + return 'Unable to send! The server only supports attachments up to $max.'; + } + + @override + String fileHasBeenSavedAt(String path) { + return 'File has been saved at $path'; + } + + @override + String get jumpToLastReadMessage => 'Jump to last read message'; + + @override + String get readUpToHere => 'Read up to here'; + + @override + String get jump => 'Jump'; + + @override + String get openLinkInBrowser => 'Open link in browser'; + + @override + String get reportErrorDescription => + '😭 Oh no. Something went wrong. If you want, you can report this bug to the developers.'; + + @override + String get report => 'Report'; + + @override + String get signInWithPassword => 'Sign in with password'; + + @override + String get pleaseTryAgainLaterOrChooseDifferentServer => + 'Please try again later or choose a different server.'; + + @override + String signInWith(String provider) { + return 'Sign in with $provider'; + } + + @override + String get profileNotFound => + 'The user could not be found on the server. Maybe there is a connection problem or the user doesn\'t exist.'; + + @override + String get setTheme => 'Set theme:'; + + @override + String get setColorTheme => 'Set color theme:'; + + @override + String get invite => 'Invite'; + + @override + String get inviteGroupChat => '📨 Invite group chat'; + + @override + String get invitePrivateChat => '📨 Invite private chat'; + + @override + String get invalidInput => 'Invalid input!'; + + @override + String wrongPinEntered(int seconds) { + return 'Wrong pin entered! Try again in $seconds seconds...'; + } + + @override + String get pleaseEnterANumber => 'Please enter a number greater than 0'; + + @override + String get archiveRoomDescription => + 'The chat will be moved to the archive. Other users will be able to see that you have left the chat.'; + + @override + String get roomUpgradeDescription => + 'The chat will then be recreated with the new room version. All participants will be notified that they need to switch to the new chat. You can find out more about room versions at https://spec.matrix.org/latest/rooms/'; + + @override + String get removeDevicesDescription => + 'You will be logged out of this device and will no longer be able to receive messages.'; + + @override + String get banUserDescription => + 'The user will be banned from the chat and will not be able to enter the chat again until they are unbanned.'; + + @override + String get unbanUserDescription => + 'The user will be able to enter the chat again if they try.'; + + @override + String get kickUserDescription => + 'The user is kicked out of the chat but not banned. In public chats, the user can rejoin at any time.'; + + @override + String get makeAdminDescription => + 'Once you make this user admin, you may not be able to undo this as they will then have the same permissions as you.'; + + @override + String get pushNotificationsNotAvailable => + 'Push notifications not available'; + + @override + String get learnMore => 'Learn more'; + + @override + String get yourGlobalUserIdIs => 'Your global user-ID is: '; + + @override + String noUsersFoundWithQuery(String query) { + return 'Unfortunately no user could be found with \"$query\". Please check whether you made a typo.'; + } + + @override + String get knocking => 'Knocking'; + + @override + String chatCanBeDiscoveredViaSearchOnServer(String server) { + return 'Chat can be discovered via the search on $server'; + } + + @override + String get searchChatsRooms => 'Search for #chats, @users...'; + + @override + String get nothingFound => 'Nothing found...'; + + @override + String get groupName => 'Group name'; + + @override + String get createGroupAndInviteUsers => 'Create a group and invite users'; + + @override + String get groupCanBeFoundViaSearch => 'Group can be found via search'; + + @override + String get wrongRecoveryKey => + 'Sorry... this does not seem to be the correct recovery key.'; + + @override + String get startConversation => 'Start conversation'; + + @override + String get commandHint_sendraw => 'Send raw json'; + + @override + String get databaseMigrationTitle => 'Database is optimized'; + + @override + String get databaseMigrationBody => 'Please wait. This may take a moment.'; + + @override + String get leaveEmptyToClearStatus => 'Leave empty to clear your status.'; + + @override + String get select => 'Select'; + + @override + String get searchForUsers => 'Search for @users...'; + + @override + String get pleaseEnterYourCurrentPassword => + 'Please enter your current password'; + + @override + String get newPassword => 'New password'; + + @override + String get pleaseChooseAStrongPassword => 'Please choose a strong password'; + + @override + String get passwordsDoNotMatch => 'Passwords do not match'; + + @override + String get passwordIsWrong => 'Your entered password is wrong'; + + @override + String get publicLink => 'Public link'; + + @override + String get publicChatAddresses => 'Public chat addresses'; + + @override + String get createNewAddress => 'Create new address'; + + @override + String get joinSpace => 'Join space'; + + @override + String get publicSpaces => 'Public spaces'; + + @override + String get addChatOrSubSpace => 'Add chat or sub space'; + + @override + String get subspace => 'Subspace'; + + @override + String get decline => 'Decline'; + + @override + String get thisDevice => 'This device:'; + + @override + String get initAppError => 'An error occured while init the app'; + + @override + String get userRole => 'User role'; + + @override + String minimumPowerLevel(String level) { + return '$level is the minimum power level.'; + } + + @override + String searchIn(String chat) { + return 'Search in chat \"$chat\"...'; + } + + @override + String get searchMore => 'Search more...'; + + @override + String get gallery => 'Gallery'; + + @override + String get files => 'Files'; + + @override + String databaseBuildErrorBody(String url, String error) { + return 'Unable to build the SQlite database. The app tries to use the legacy database for now. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String sessionLostBody(String url, String error) { + return 'Your session is lost. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String restoreSessionBody(String url, String error) { + return 'The app now tries to restore your session from the backup. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String forwardMessageTo(String roomName) { + return 'Forward message to $roomName?'; + } + + @override + String get sendReadReceipts => 'Send read receipts'; + + @override + String get sendTypingNotificationsDescription => + 'Other participants in a chat can see when you are typing a new message.'; + + @override + String get sendReadReceiptsDescription => + 'Other participants in a chat can see when you have read a message.'; + + @override + String get formattedMessages => 'Formatted messages'; + + @override + String get formattedMessagesDescription => + 'Display rich message content like bold text using markdown.'; + + @override + String get verifyOtherUser => '🔐 Verify other user'; + + @override + String get verifyOtherUserDescription => + 'If you verify another user, you can be sure that you know who you are really writing to. 💪\n\nWhen you start a verification, you and the other user will see a popup in the app. There you will then see a series of emojis or numbers that you have to compare with each other.\n\nThe best way to do this is to meet up or start a video call. 👭'; + + @override + String get verifyOtherDevice => '🔐 Verify other device'; + + @override + String get verifyOtherDeviceDescription => + 'When you verify another device, those devices can exchange keys, increasing your overall security. 💪 When you start a verification, a popup will appear in the app on both devices. There you will then see a series of emojis or numbers that you have to compare with each other. It\'s best to have both devices handy before you start the verification. 🤳'; + + @override + String acceptedKeyVerification(String sender) { + return '$sender accepted key verification'; + } + + @override + String canceledKeyVerification(String sender) { + return '$sender canceled key verification'; + } + + @override + String completedKeyVerification(String sender) { + return '$sender completed key verification'; + } + + @override + String isReadyForKeyVerification(String sender) { + return '$sender is ready for key verification'; + } + + @override + String requestedKeyVerification(String sender) { + return '$sender requested key verification'; + } + + @override + String startedKeyVerification(String sender) { + return '$sender started key verification'; + } + + @override + String get transparent => 'Transparent'; + + @override + String get incomingMessages => 'Incoming messages'; + + @override + String get stickers => 'Stickers'; + + @override + String get discover => 'Discover'; + + @override + String get commandHint_ignore => 'Ignore the given matrix ID'; + + @override + String get commandHint_unignore => 'Unignore the given matrix ID'; + + @override + String unreadChatsInApp(String appname, String unread) { + return '$appname: $unread unread chats'; + } + + @override + String get noDatabaseEncryption => + 'Database encryption is not supported on this platform'; + + @override + String thereAreCountUsersBlocked(Object count) { + return 'Right now there are $count users blocked.'; + } + + @override + String get restricted => 'Restricted'; + + @override + String get knockRestricted => 'Knock restricted'; + + @override + String goToSpace(Object space) { + return 'Go to space: $space'; + } + + @override + String get markAsUnread => 'Mark as unread'; + + @override + String userLevel(int level) { + return '$level - User'; + } + + @override + String moderatorLevel(int level) { + return '$level - Moderator'; + } + + @override + String adminLevel(int level) { + return '$level - Admin'; + } + + @override + String get changeGeneralChatSettings => 'Change general chat settings'; + + @override + String get inviteOtherUsers => 'Invite other users to this chat'; + + @override + String get changeTheChatPermissions => 'Change the chat permissions'; + + @override + String get changeTheVisibilityOfChatHistory => + 'Change the visibility of the chat history'; + + @override + String get changeTheCanonicalRoomAlias => + 'Change the main public chat address'; + + @override + String get sendRoomNotifications => 'Send a @room notifications'; + + @override + String get changeTheDescriptionOfTheGroup => + 'Change the description of the chat'; + + @override + String get chatPermissionsDescription => + 'Define which power level is necessary for certain actions in this chat. The power levels 0, 50 and 100 are usually representing users, moderators and admins, but any gradation is possible.'; + + @override + String updateInstalled(String version) { + return '🎉 Update $version installed!'; + } + + @override + String get changelog => 'Changelog'; + + @override + String get sendCanceled => 'Sending canceled'; + + @override + String get loginWithMatrixId => 'Login with Matrix-ID'; + + @override + String get discoverHomeservers => 'Discover homeservers'; + + @override + String get whatIsAHomeserver => 'What is a homeserver?'; + + @override + String get homeserverDescription => + 'All your data is stored on the homeserver, just like an email provider. You can choose which homeserver you want to use, while you can still communicate with everyone. Learn more at at https://matrix.org.'; + + @override + String get doesNotSeemToBeAValidHomeserver => + 'Doesn\'t seem to be a compatible homeserver. Wrong URL?'; + + @override + String get calculatingFileSize => 'Calculating file size...'; + + @override + String get prepareSendingAttachment => 'Prepare sending attachment...'; + + @override + String get sendingAttachment => 'Sending attachment...'; + + @override + String get generatingVideoThumbnail => 'Generating video thumbnail...'; + + @override + String get compressVideo => 'Compressing video...'; + + @override + String sendingAttachmentCountOfCount(int index, int length) { + return 'Sending attachment $index of $length...'; + } + + @override + String serverLimitReached(int seconds) { + return 'Server limit reached! Waiting $seconds seconds...'; + } + + @override + String get oneOfYourDevicesIsNotVerified => + 'One of your devices is not verified'; + + @override + String get noticeChatBackupDeviceVerification => + 'Note: When you connect all your devices to the chat backup, they are automatically verified.'; + + @override + String get continueText => 'Continue'; + + @override + String get welcomeText => + 'Hey Hey 👋 This is Extera. You can sign in to any homeserver, which is compatible with https://matrix.org. And then chat with anyone. It\'s a huge decentralized messaging network!'; + + @override + String get blur => 'Blur:'; + + @override + String get opacity => 'Opacity:'; + + @override + String get setWallpaper => 'Set wallpaper'; + + @override + String get manageAccount => 'Manage account'; + + @override + String get noContactInformationProvided => + 'Server does not provide any valid contact information'; + + @override + String get contactServerAdmin => 'Contact server admin'; + + @override + String get contactServerSecurity => 'Contact server security'; + + @override + String get supportPage => 'Support page'; + + @override + String get serverInformation => 'Server information:'; + + @override + String get name => 'Name'; + + @override + String get version => 'Version'; + + @override + String get website => 'Website'; + + @override + String get compress => 'Compress'; + + @override + String get boldText => 'Bold text'; + + @override + String get italicText => 'Italic text'; + + @override + String get strikeThrough => 'Strikethrough'; + + @override + String get pleaseFillOut => 'Please fill out'; + + @override + String get invalidUrl => 'Invalid url'; + + @override + String get addLink => 'Add link'; + + @override + String get unableToJoinChat => + 'Unable to join chat. Maybe the other party has already closed the conversation.'; + + @override + String get previous => 'Previous'; + + @override + String get otherPartyNotLoggedIn => + 'The other party is currently not logged in and therefore cannot receive messages!'; + + @override + String appWantsToUseForLogin(String server) { + return 'Use \'$server\' to log in'; + } + + @override + String get appWantsToUseForLoginDescription => + 'You hereby allow the app and website to share information about you.'; + + @override + String get open => 'Open'; + + @override + String get waitingForServer => 'Waiting for server...'; + + @override + String get appIntroduction => + 'Extera lets you chat with your friends across different messengers. Learn more at https://matrix.org or just tap *Continue*.'; + + @override + String get newChatRequest => '📩 New chat request'; + + @override + String get contentNotificationSettings => 'Content notification settings'; + + @override + String get generalNotificationSettings => 'General notification settings'; + + @override + String get roomNotificationSettings => 'Room notification settings'; + + @override + String get userSpecificNotificationSettings => + 'User specific notification settings'; + + @override + String get otherNotificationSettings => 'Other notification settings'; + + @override + String get notificationRuleContainsUserName => 'Contains User Name'; + + @override + String get notificationRuleContainsUserNameDescription => + 'Notifies the user when a message contains their username.'; + + @override + String get notificationRuleMaster => 'Mute all notifications'; + + @override + String get notificationRuleMasterDescription => + 'Overrides all other rules and disables all notifications.'; + + @override + String get notificationRuleSuppressNotices => 'Suppress Automated Messages'; + + @override + String get notificationRuleSuppressNoticesDescription => + 'Suppresses notifications from automated clients like bots.'; + + @override + String get notificationRuleInviteForMe => 'Invite for Me'; + + @override + String get notificationRuleInviteForMeDescription => + 'Notifies the user when they are invited to a room.'; + + @override + String get notificationRuleMemberEvent => 'Member Event'; + + @override + String get notificationRuleMemberEventDescription => + 'Suppresses notifications for membership events.'; + + @override + String get notificationRuleIsUserMention => 'User Mention'; + + @override + String get notificationRuleIsUserMentionDescription => + 'Notifies the user when they are directly mentioned in a message.'; + + @override + String get notificationRuleContainsDisplayName => 'Contains Display Name'; + + @override + String get notificationRuleContainsDisplayNameDescription => + 'Notifies the user when a message contains their display name.'; + + @override + String get notificationRuleIsRoomMention => 'Room Mention'; + + @override + String get notificationRuleIsRoomMentionDescription => + 'Notifies the user when there is a room mention.'; + + @override + String get notificationRuleRoomnotif => 'Room Notification'; + + @override + String get notificationRuleRoomnotifDescription => + 'Notifies the user when a message contains \'@room\'.'; + + @override + String get notificationRuleTombstone => 'Tombstone'; + + @override + String get notificationRuleTombstoneDescription => + 'Notifies the user about room deactivation messages.'; + + @override + String get notificationRuleReaction => 'Reaction'; + + @override + String get notificationRuleReactionDescription => + 'Suppresses notifications for reactions.'; + + @override + String get notificationRuleRoomServerAcl => 'Room Server ACL'; + + @override + String get notificationRuleRoomServerAclDescription => + 'Suppresses notifications for room server access control lists (ACL).'; + + @override + String get notificationRuleSuppressEdits => 'Suppress Edits'; + + @override + String get notificationRuleSuppressEditsDescription => + 'Suppresses notifications for edited messages.'; + + @override + String get notificationRuleCall => 'Call'; + + @override + String get notificationRuleCallDescription => + 'Notifies the user about calls.'; + + @override + String get notificationRuleEncryptedRoomOneToOne => + 'Encrypted Room One-to-One'; + + @override + String get notificationRuleEncryptedRoomOneToOneDescription => + 'Notifies the user about messages in encrypted one-to-one rooms.'; + + @override + String get notificationRuleRoomOneToOne => 'Room One-to-One'; + + @override + String get notificationRuleRoomOneToOneDescription => + 'Notifies the user about messages in one-to-one rooms.'; + + @override + String get notificationRuleMessage => 'Message'; + + @override + String get notificationRuleMessageDescription => + 'Notifies the user about general messages.'; + + @override + String get notificationRuleEncrypted => 'Encrypted'; + + @override + String get notificationRuleEncryptedDescription => + 'Notifies the user about messages in encrypted rooms.'; + + @override + String get notificationRuleJitsi => 'Jitsi'; + + @override + String get notificationRuleJitsiDescription => + 'Notifies the user about Jitsi widget events.'; + + @override + String get notificationRuleServerAcl => 'Suppress Server ACL Events'; + + @override + String get notificationRuleServerAclDescription => + 'Suppresses notifications for Server ACL events.'; + + @override + String unknownPushRule(String rule) { + return 'Unknown push rule \'$rule\''; + } + + @override + String get deletePushRuleCanNotBeUndone => + 'If you delete this notification setting, this can not be undone.'; + + @override + String get more => 'More'; + + @override + String get shareKeysWith => 'Share keys with...'; + + @override + String get shareKeysWithDescription => + 'Which devices should be trusted so that they can read along your messages in encrypted chats?'; + + @override + String get allDevices => 'All devices'; + + @override + String get crossVerifiedDevicesIfEnabled => + 'Cross verified devices if enabled'; + + @override + String get crossVerifiedDevices => 'Cross verified devices'; + + @override + String get verifiedDevicesOnly => 'Verified devices only'; + + @override + String get takeAPhoto => 'Take a photo'; + + @override + String get recordAVideo => 'Record a video'; + + @override + String get optionalMessage => '(Optional) message...'; + + @override + String get notSupportedOnThisDevice => 'Not supported on this device'; + + @override + String get enterNewChat => 'Enter new chat'; + + @override + String get approve => 'Approve'; + + @override + String get youHaveKnocked => 'You have knocked'; + + @override + String get pleaseWaitUntilInvited => + 'Please wait now, until someone from the room invites you.'; +} diff --git a/lib/generated/l10n/l10n_eo.dart b/lib/generated/l10n/l10n_eo.dart new file mode 100644 index 0000000..9abd89b --- /dev/null +++ b/lib/generated/l10n/l10n_eo.dart @@ -0,0 +1,2752 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'l10n.dart'; + +// ignore_for_file: type=lint + +/// The translations for Esperanto (`eo`). +class L10nEo extends L10n { + L10nEo([String locale = 'eo']) : super(locale); + + @override + String get noSendPermission => 'You can\'t send messages here'; + + @override + String get alwaysUse24HourFormat => 'false'; + + @override + String get repeatPassword => 'Repeat password'; + + @override + String get notAnImage => 'Not an image file.'; + + @override + String get setCustomPermissionLevel => 'Set custom permission level'; + + @override + String get setPermissionsLevelDescription => + 'Please choose a predefined role below or enter a custom permission level between 0 and 100.'; + + @override + String get ignoreUser => 'Ignore user'; + + @override + String get normalUser => 'Normal user'; + + @override + String get remove => 'Forigi'; + + @override + String get importNow => 'Import now'; + + @override + String get importEmojis => 'Import Emojis'; + + @override + String get importFromZipFile => 'Import from .zip file'; + + @override + String get exportEmotePack => 'Export Emote pack as .zip'; + + @override + String get replace => 'Replace'; + + @override + String get about => 'Prio'; + + @override + String aboutHomeserver(String homeserver) { + return 'About $homeserver'; + } + + @override + String get accept => 'Akcepti'; + + @override + String acceptedTheInvitation(String username) { + return '$username akceptis la inviton'; + } + + @override + String get account => 'Konto'; + + @override + String activatedEndToEndEncryption(String username) { + return '$username aktivigis tutvojan ĉifradon'; + } + + @override + String get addEmail => 'Aldoni retpoŝtadreson'; + + @override + String get confirmMatrixId => + 'Please confirm your Matrix ID in order to delete your account.'; + + @override + String supposedMxid(String mxid) { + return 'This should be $mxid'; + } + + @override + String get addChatDescription => 'Add a chat description...'; + + @override + String get addToSpace => 'Aldoni al aro'; + + @override + String get admin => 'Administranto'; + + @override + String get alias => 'kromnomo'; + + @override + String get all => 'Ĉio'; + + @override + String get allChats => 'Ĉiuj babiloj'; + + @override + String get commandHint_roomupgrade => + 'Upgrade this room to the given room version'; + + @override + String get commandHint_googly => 'Send some googly eyes'; + + @override + String get commandHint_cuddle => 'Send a cuddle'; + + @override + String get commandHint_hug => 'Send a hug'; + + @override + String googlyEyesContent(String senderName) { + return '$senderName sends you googly eyes'; + } + + @override + String cuddleContent(String senderName) { + return '$senderName cuddles you'; + } + + @override + String hugContent(String senderName) { + return '$senderName hugs you'; + } + + @override + String answeredTheCall(String senderName) { + return '$senderName respondis la vokon'; + } + + @override + String get anyoneCanJoin => 'Ĉiu ajn povas aliĝi'; + + @override + String get appLock => 'Ŝlosado'; + + @override + String get appLockDescription => + 'Lock the app when not using with a pin code'; + + @override + String get archive => 'Arĥivo'; + + @override + String get areGuestsAllowedToJoin => 'Ĉu gastoj rajtas aliĝi'; + + @override + String get areYouSure => 'Ĉu vi certas?'; + + @override + String get areYouSureYouWantToLogout => 'Ĉu vi certe volas adiaŭi?'; + + @override + String get askSSSSSign => + 'Por ke vi povu kontroli (subskribi) la alian personon, bonvolu enigi pasfrazon de via sekreta deponejo aŭ vian rehavan ŝlosilon.'; + + @override + String askVerificationRequest(String username) { + return 'Ĉu akcepti ĉi tiun kontrolpeton de $username?'; + } + + @override + String get autoplayImages => + 'Memage ludi movbildajn glumarkojn kaj mienetojn'; + + @override + String badServerLoginTypesException(String serverVersions, + String supportedVersions, Object suportedVersions) { + return 'La hejmservilo subtenas la jenajn specojn de salutoj:\n$serverVersions\nSed ĉi tiu aplikaĵo subtenas nur:\n$supportedVersions'; + } + + @override + String get sendTypingNotifications => 'Send typing notifications'; + + @override + String get swipeRightToLeftToReply => 'Swipe right to left to reply'; + + @override + String get sendOnEnter => 'Sendi per eniga klavo'; + + @override + String badServerVersionsException(String serverVersions, + String supportedVersions, Object serverVerions, Object suportedVersions) { + return 'La hejmservilo subtenas la jenajn version de la specifaĵo:\n$serverVersions\nSed ĉi tiu aplikaĵo subtenas nur $supportedVersions'; + } + + @override + String countChatsAndCountParticipants(int chats, int participants) { + return '$chats chats and $participants participants'; + } + + @override + String get noMoreChatsFound => 'No more chats found...'; + + @override + String get noChatsFoundHere => + 'No chats found here yet. Start a new chat with someone by using the button below. ⤵️'; + + @override + String get joinedChats => 'Joined chats'; + + @override + String get unread => 'Unread'; + + @override + String get space => 'Space'; + + @override + String get spaces => 'Spaces'; + + @override + String get banFromChat => 'Forbari de babilo'; + + @override + String get banned => 'Forbarita'; + + @override + String bannedUser(String username, String targetName) { + return '$username forbaris uzanton $targetName'; + } + + @override + String get blockDevice => 'Bloki aparaton'; + + @override + String get blocked => 'Blokita'; + + @override + String get botMessages => 'Mesaĝoj de robotoj'; + + @override + String get cancel => 'Nuligi'; + + @override + String cantOpenUri(String uri) { + return 'Ne povis malfermi URI $uri'; + } + + @override + String get changeDeviceName => 'Ŝanĝi nomon de aparato'; + + @override + String changedTheChatAvatar(String username) { + return '$username ŝanĝis bildon de la babilo'; + } + + @override + String changedTheChatDescriptionTo(String username, String description) { + return '$username ŝanĝis priskribon de la babilo al: «$description»'; + } + + @override + String changedTheChatNameTo(String username, String chatname) { + return '$username ŝanĝis nomon de la babilo al: «$chatname»'; + } + + @override + String changedTheChatPermissions(String username) { + return '$username ŝanĝis permesojn pri la babilo'; + } + + @override + String changedTheDisplaynameTo(String username, String displayname) { + return '$username ŝanĝis sian prezentan nomon al: $username'; + } + + @override + String changedTheGuestAccessRules(String username) { + return '$username ŝanĝis regulojn pri aliro de gastoj'; + } + + @override + String changedTheGuestAccessRulesTo(String username, String rules) { + return '$username ŝanĝis regulojn pri aliro de gastoj al: $rules'; + } + + @override + String changedTheHistoryVisibility(String username) { + return '$username ŝanĝis videblecon de la historio'; + } + + @override + String changedTheHistoryVisibilityTo(String username, String rules) { + return '$username ŝanĝis videblecon de la historio al: $rules'; + } + + @override + String changedTheJoinRules(String username) { + return '$username ŝanĝis regulojn pri aliĝado'; + } + + @override + String changedTheJoinRulesTo(String username, String joinRules) { + return '$username ŝanĝis regulojn pri aliĝado al: $joinRules'; + } + + @override + String changedTheProfileAvatar(String username) { + return '$username ŝanĝis sian profilbildon'; + } + + @override + String changedTheRoomAliases(String username) { + return '$username ŝanĝis la kromnomojn de la ĉambro'; + } + + @override + String changedTheRoomInvitationLink(String username) { + return '$username ŝanĝis la invitan ligilon'; + } + + @override + String get changePassword => 'Ŝanĝi pasvorton'; + + @override + String get changeTheHomeserver => 'Ŝanĝi hejmservilon'; + + @override + String get changeTheme => 'Ŝanĝu la haŭton'; + + @override + String get changeTheNameOfTheGroup => 'Ŝanĝi nomon de la grupo'; + + @override + String get changeYourAvatar => 'Ŝanĝi vian profilbildon'; + + @override + String get channelCorruptedDecryptError => 'La ĉifrado estas difektita'; + + @override + String get chat => 'Babilo'; + + @override + String get yourChatBackupHasBeenSetUp => 'Your chat backup has been set up.'; + + @override + String get chatBackup => 'Savkopiado de babilo'; + + @override + String get chatBackupDescription => + 'Via savkopio de babilo estas sekurigita per sekureca ŝlosilo. Bonvolu certigi, ke vi ne perdos ĝin.'; + + @override + String get chatDetails => 'Detaloj pri babilo'; + + @override + String get chatHasBeenAddedToThisSpace => 'Babilo aldoniĝis al ĉi tiu aro'; + + @override + String get chats => 'Babiloj'; + + @override + String get chooseAStrongPassword => 'Elektu fortan pasvorton'; + + @override + String get clearArchive => 'Vakigi arĥivon'; + + @override + String get close => 'Fermi'; + + @override + String get commandHint_markasdm => + 'Mark as direct message room for the giving Matrix ID'; + + @override + String get commandHint_markasgroup => 'Mark as group'; + + @override + String get commandHint_ban => 'Forbari la donitan uzanton de ĉi tiu ĉambro'; + + @override + String get commandHint_clearcache => 'Clear cache'; + + @override + String get commandHint_create => + 'Create an empty group chat\nUse --no-encryption to disable encryption'; + + @override + String get commandHint_discardsession => 'Discard session'; + + @override + String get commandHint_dm => + 'Start a direct chat\nUse --no-encryption to disable encryption'; + + @override + String get commandHint_html => 'Sendi tekston formatan je HTML'; + + @override + String get commandHint_invite => 'Inviti la donitan uzanton al ĉi tiu ĉambro'; + + @override + String get commandHint_join => 'Aliĝi al la donita ĉambro'; + + @override + String get commandHint_kick => 'Forigi la donitan uzanton de ĉi tiu ĉambro'; + + @override + String get commandHint_leave => 'Foriri de ĉi tiu ĉambro'; + + @override + String get commandHint_me => 'Priskribu vian agon'; + + @override + String get commandHint_myroomavatar => + 'Agordi vian profilbildon por ĉi tiu ĉambro (laŭ mxc-uri)'; + + @override + String get commandHint_myroomnick => + 'Agordi vian prezentan nomon en ĉi tiu ĉambro'; + + @override + String get commandHint_op => + 'Agordi povnivelon de la donita uzanto (implicite: 50)'; + + @override + String get commandHint_plain => 'Sendi senformatan tekston'; + + @override + String get commandHint_react => 'Sendi respondon kiel reagon'; + + @override + String get commandHint_send => 'Sendi tekston'; + + @override + String get commandHint_unban => + 'Malforbari la donitan uzanton de ĉi tiu ĉambro'; + + @override + String get commandInvalid => 'Nevalida ordono'; + + @override + String commandMissing(String command) { + return '$command ne estas ordono.'; + } + + @override + String get compareEmojiMatch => + 'Komparu kaj certigu, ke la jenaj bildosignoj samas en ambaŭ aparatoj:'; + + @override + String get compareNumbersMatch => + 'Komparu kaj certigu, ke la jenaj numeroj samas en ambaŭ aparatoj:'; + + @override + String get configureChat => 'Agordi babilon'; + + @override + String get confirm => 'Konfirmi'; + + @override + String get connect => 'Konektiĝi'; + + @override + String get contactHasBeenInvitedToTheGroup => + 'Kontakto invitiĝis al la grupo'; + + @override + String get containsDisplayName => 'Enhavas prezentan nomon'; + + @override + String get containsUserName => 'Enhavas uzantonomon'; + + @override + String get contentHasBeenReported => + 'La enhavo raportiĝis al la administrantoj de la servilo'; + + @override + String get copiedToClipboard => 'Kopiite al tondujo'; + + @override + String get copy => 'Kopii'; + + @override + String get copyToClipboard => 'Kopii al tondujo'; + + @override + String couldNotDecryptMessage(String error) { + return 'Ne povis malĉifri mesaĝon: $error'; + } + + @override + String countParticipants(int count) { + return '$count partoprenantoj'; + } + + @override + String get create => 'Krei'; + + @override + String createdTheChat(String username) { + return '$username kreis la babilon'; + } + + @override + String get createGroup => 'Create group'; + + @override + String get createNewSpace => 'Nova aro'; + + @override + String get currentlyActive => 'Nun aktiva'; + + @override + String get darkTheme => 'Malhela'; + + @override + String dateAndTimeOfDay(String date, String timeOfDay) { + return '$date, $timeOfDay'; + } + + @override + String dateWithoutYear(String month, String day) { + return '${day}a de la ${month}a'; + } + + @override + String dateWithYear(String year, String month, String day) { + return '${day}a de la ${month}a de $year'; + } + + @override + String get deactivateAccountWarning => + 'Ĉi tio malaktivigos vian konton de uzanto. Ne eblas tion malfari! Ĉu certe vi certas?'; + + @override + String get defaultPermissionLevel => 'Norma nivelo de permesoj'; + + @override + String get delete => 'Forigi'; + + @override + String get deleteAccount => 'Forigi konton'; + + @override + String get deleteMessage => 'Forigi mesaĝon'; + + @override + String get device => 'Aparato'; + + @override + String get deviceId => 'Identigilo de aparato'; + + @override + String get devices => 'Aparatoj'; + + @override + String get directChats => 'Rektaj babiloj'; + + @override + String get allRooms => 'All Group Chats'; + + @override + String get displaynameHasBeenChanged => 'Prezenta nomo ŝanĝiĝis'; + + @override + String get downloadFile => 'Elŝuti dosieron'; + + @override + String get edit => 'Redakti'; + + @override + String get editBlockedServers => 'Redakti blokitajn servilojn'; + + @override + String get chatPermissions => 'Chat permissions'; + + @override + String get editDisplayname => 'Redakti prezentan nomon'; + + @override + String get editRoomAliases => 'Ŝanĝi kromnomojn de ĉambro'; + + @override + String get editRoomAvatar => 'Redakti bildon de ĉambro'; + + @override + String get emoteExists => 'Mieneto jam ekzistas!'; + + @override + String get emoteInvalid => 'Nevalida mallongigo de mieneto!'; + + @override + String get emoteKeyboardNoRecents => + 'Recently-used emotes will appear here...'; + + @override + String get emotePacks => 'Mienetaroj por la ĉambro'; + + @override + String get emoteSettings => 'Agordoj pri mienetoj'; + + @override + String get globalChatId => 'Global chat ID'; + + @override + String get accessAndVisibility => 'Access and visibility'; + + @override + String get accessAndVisibilityDescription => + 'Who is allowed to join this chat and how the chat can be discovered.'; + + @override + String get calls => 'Calls'; + + @override + String get customEmojisAndStickers => 'Custom emojis and stickers'; + + @override + String get customEmojisAndStickersBody => + 'Add or share custom emojis or stickers which can be used in any chat.'; + + @override + String get emoteShortcode => 'Mallongigo de mieneto'; + + @override + String get emoteWarnNeedToPick => + 'Vi devas elekti mallongigon de mieneto kaj bildon!'; + + @override + String get emptyChat => 'Malplena babilo'; + + @override + String get enableEmotesGlobally => 'Ŝalti mienetaron ĉie'; + + @override + String get enableEncryption => 'Ŝalti ĉifradon'; + + @override + String get enableEncryptionWarning => + 'Vi ne povos malŝalti la ĉifradon. Ĉu vi certas?'; + + @override + String get encrypted => 'Ĉifrite'; + + @override + String get encryption => 'Ĉifrado'; + + @override + String get encryptionNotEnabled => 'Ĉifrado ne estas ŝaltita'; + + @override + String endedTheCall(String senderName) { + return '$senderName finis la vokon'; + } + + @override + String get enterAnEmailAddress => 'Enigu retpoŝtadreson'; + + @override + String get homeserver => 'Hejmservilo'; + + @override + String get enterYourHomeserver => 'Enigu vian hejmservilon'; + + @override + String errorObtainingLocation(String error) { + return 'Eraris akirado de loko: $error'; + } + + @override + String get everythingReady => 'Ĉio pretas!'; + + @override + String get extremeOffensive => 'Tre ofenda'; + + @override + String get fileName => 'Dosiernomo'; + + @override + String get fluffychat => 'FluffyChat'; + + @override + String get fontSize => 'Grandeco de tiparo'; + + @override + String get forward => 'Plusendi'; + + @override + String get fromJoining => 'Ekde aliĝo'; + + @override + String get fromTheInvitation => 'Ekde la invito'; + + @override + String get goToTheNewRoom => 'Iri al la nova ĉambro'; + + @override + String get group => 'Grupo'; + + @override + String get chatDescription => 'Chat description'; + + @override + String get chatDescriptionHasBeenChanged => 'Chat description changed'; + + @override + String get groupIsPublic => 'Grupo estas publika'; + + @override + String get groups => 'Grupoj'; + + @override + String groupWith(String displayname) { + return 'Grupo kun $displayname'; + } + + @override + String get guestsAreForbidden => 'Gastoj estas malpermesitaj'; + + @override + String get guestsCanJoin => 'Gastoj povas aliĝi'; + + @override + String hasWithdrawnTheInvitationFor(String username, String targetName) { + return '$username nuligis la inviton por $targetName'; + } + + @override + String get help => 'Helpo'; + + @override + String get hideRedactedEvents => 'Kaŝi obskurigitajn eventojn'; + + @override + String get hideRedactedMessages => 'Hide redacted messages'; + + @override + String get hideRedactedMessagesBody => + 'If someone redacts a message, this message won\'t be visible in the chat anymore.'; + + @override + String get hideInvalidOrUnknownMessageFormats => + 'Hide invalid or unknown message formats'; + + @override + String get howOffensiveIsThisContent => 'Kiel ofenda estas ĉi tiu enhavo?'; + + @override + String get id => 'Identigilo'; + + @override + String get identity => 'Identeco'; + + @override + String get block => 'Block'; + + @override + String get blockedUsers => 'Blocked users'; + + @override + String get blockListDescription => + 'You can block users who are disturbing you. You won\'t be able to receive any messages or room invites from the users on your personal block list.'; + + @override + String get blockUsername => 'Ignore username'; + + @override + String get iHaveClickedOnLink => 'Mi klakis la ligilon'; + + @override + String get incorrectPassphraseOrKey => 'Neĝusta pasfrazo aŭ rehava ŝlosilo'; + + @override + String get inoffensive => 'Neofenda'; + + @override + String get inviteContact => 'Inviti kontakton'; + + @override + String inviteContactToGroupQuestion(Object contact, Object groupName) { + return 'Do you want to invite $contact to the chat \"$groupName\"?'; + } + + @override + String inviteContactToGroup(String groupName) { + return 'Inviti kontakton al $groupName'; + } + + @override + String get noChatDescriptionYet => 'No chat description created yet.'; + + @override + String get tryAgain => 'Try again'; + + @override + String get invalidServerName => 'Invalid server name'; + + @override + String get invited => 'Invitita'; + + @override + String get redactMessageDescription => + 'The message will be redacted for all participants in this conversation. This cannot be undone.'; + + @override + String get optionalRedactReason => + '(Optional) Reason for redacting this message...'; + + @override + String invitedUser(String username, String targetName) { + return '$username invitis uzanton $targetName'; + } + + @override + String get invitedUsersOnly => 'Nur invititoj'; + + @override + String get inviteForMe => 'Invito por mi'; + + @override + String inviteText(String username, String link) { + return '$username invitis vin al FluffyChat. \n1. Instalu la aplikaĵon FluffyChat: https://fluffychat.im \n2. Registriĝu aŭ salutu \n3. Malfermu la invitan ligilon: $link'; + } + + @override + String get isTyping => 'tajpas…'; + + @override + String joinedTheChat(String username) { + return '$username aliĝis al la babilo'; + } + + @override + String get joinRoom => 'Aliĝi al ĉambro'; + + @override + String kicked(String username, String targetName) { + return '$username forpelis uzanton $targetName'; + } + + @override + String kickedAndBanned(String username, String targetName) { + return '$username forpelis kaj forbaris uzanton $targetName'; + } + + @override + String get kickFromChat => 'Forpeli de babilo'; + + @override + String lastActiveAgo(String localizedTimeShort) { + return 'Lastafoje aktiva: $localizedTimeShort'; + } + + @override + String get leave => 'Foriri'; + + @override + String get leftTheChat => 'Foriris de la ĉambro'; + + @override + String get license => 'Permesilo'; + + @override + String get lightTheme => 'Hela'; + + @override + String loadCountMoreParticipants(int count) { + return 'Enlegi $count pliajn partoprenantojn'; + } + + @override + String get dehydrate => 'Export session and wipe device'; + + @override + String get dehydrateWarning => + 'This action cannot be undone. Ensure you safely store the backup file.'; + + @override + String get dehydrateTor => 'TOR Users: Export session'; + + @override + String get dehydrateTorLong => + 'For TOR users, it is recommended to export the session before closing the window.'; + + @override + String get hydrateTor => 'TOR Users: Import session export'; + + @override + String get hydrateTorLong => + 'Did you export your session last time on TOR? Quickly import it and continue chatting.'; + + @override + String get hydrate => 'Restore from backup file'; + + @override + String get loadingPleaseWait => 'Enlegante… bonvolu atendi.'; + + @override + String get loadMore => 'Enlegi pli…'; + + @override + String get locationDisabledNotice => + 'Location services are disabled. Please enable them to be able to share your location.'; + + @override + String get locationPermissionDeniedNotice => + 'Location permission denied. Please grant them to be able to share your location.'; + + @override + String get login => 'Saluti'; + + @override + String logInTo(String homeserver) { + return 'Saluti servilon $homeserver'; + } + + @override + String get logout => 'Adiaŭi'; + + @override + String get memberChanges => 'Ŝanĝoj de anoj'; + + @override + String get mention => 'Mencii'; + + @override + String get messages => 'Mesaĝoj'; + + @override + String get messagesStyle => 'Messages:'; + + @override + String get moderator => 'Reguligisto'; + + @override + String get muteChat => 'Silentigi babilon'; + + @override + String get needPantalaimonWarning => + 'Bonvolu scii, ke vi ankoraŭ bezonas la programon Pantalaimon por uzi tutvojan ĉifradon.'; + + @override + String get newChat => 'Nova babilo'; + + @override + String get newMessageInFluffyChat => 'Nova mesaĝo en FluffyChat'; + + @override + String get newVerificationRequest => 'Nova kontrolpeto!'; + + @override + String get next => 'Sekva'; + + @override + String get no => 'Ne'; + + @override + String get noConnectionToTheServer => 'Neniu konekto al la servilo'; + + @override + String get noEmotesFound => 'Neniuj mienetoj troviĝis. 😕'; + + @override + String get noEncryptionForPublicRooms => + 'Vi nur povas aktivigi ĉifradon kiam la ĉambro ne plu estas publike alirebla.'; + + @override + String get noGoogleServicesWarning => + 'Ŝajnas, ke via telefono ne havas servojn de Google. Tio estas bona decido por via privateco! Por ricevadi pasivajn sciigojn en FluffyChat, ni rekomendas, ke vi uzu la https://microg.org/ aŭ https://unifiedpush.org/.'; + + @override + String noMatrixServer(String server1, String server2) { + return '$server1 ne estas matriksa servilo, eble provu anstataŭe servilon $server2?'; + } + + @override + String get shareInviteLink => 'Share invite link'; + + @override + String get scanQrCode => 'Scan QR code'; + + @override + String get none => 'Neniu'; + + @override + String get noPasswordRecoveryDescription => + 'Vi ankoraŭ ne aldonis manieron rehavi vian pasvorton.'; + + @override + String get noPermission => 'Neniu permeso'; + + @override + String get noRoomsFound => 'Neniuj ĉambroj troviĝis…'; + + @override + String get notifications => 'Sciigoj'; + + @override + String get notificationsEnabledForThisAccount => + 'Sciigoj ŝaltiĝis por ĉi tiu konto'; + + @override + String numUsersTyping(int count) { + return '$count uzantoj tajpas…'; + } + + @override + String get obtainingLocation => 'Akirante lokon…'; + + @override + String get offensive => 'Ofenda'; + + @override + String get offline => 'Eksterrete'; + + @override + String get ok => 'bone'; + + @override + String get online => 'Enrete'; + + @override + String get onlineKeyBackupEnabled => + 'Enreta savkopiado de ŝlosiloj estas ŝaltita'; + + @override + String get oopsPushError => + 'Oj! Bedaŭrinde eraris la agordado de pasivaj sciigoj.'; + + @override + String get oopsSomethingWentWrong => 'Oj! Io misokazis…'; + + @override + String get openAppToReadMessages => 'Malfermu la aplikaĵon por legi mesaĝojn'; + + @override + String get openCamera => 'Malfermi fotilon'; + + @override + String get openVideoCamera => 'Open camera for a video'; + + @override + String get oneClientLoggedOut => 'One of your clients has been logged out'; + + @override + String get addAccount => 'Add account'; + + @override + String get editBundlesForAccount => 'Edit bundles for this account'; + + @override + String get addToBundle => 'Add to bundle'; + + @override + String get removeFromBundle => 'Remove from this bundle'; + + @override + String get bundleName => 'Bundle name'; + + @override + String get enableMultiAccounts => + '(BETA) Enable multi accounts on this device'; + + @override + String get openInMaps => 'Open in maps'; + + @override + String get link => 'Link'; + + @override + String get serverRequiresEmail => + 'This server needs to validate your email address for registration.'; + + @override + String get or => 'Aŭ'; + + @override + String get participant => 'Partoprenanto'; + + @override + String get passphraseOrKey => 'pasfrazo aŭ rehava ŝlosilo'; + + @override + String get password => 'Pasvorto'; + + @override + String get passwordForgotten => 'Forgesita pasvorto'; + + @override + String get passwordHasBeenChanged => 'Pasvorto ŝanĝiĝis'; + + @override + String get hideMemberChangesInPublicChats => + 'Hide member changes in public chats'; + + @override + String get hideMemberChangesInPublicChatsBody => + 'Do not show in the chat timeline if someone joins or leaves a public chat to improve readability.'; + + @override + String get overview => 'Overview'; + + @override + String get notifyMeFor => 'Notify me for'; + + @override + String get passwordRecoverySettings => 'Password recovery settings'; + + @override + String get passwordRecovery => 'Rehavo de pasvorto'; + + @override + String get people => 'Personoj'; + + @override + String get pickImage => 'Elekti bildon'; + + @override + String get pin => 'Fiksi'; + + @override + String play(String fileName) { + return 'Ludi $fileName'; + } + + @override + String get pleaseChoose => 'Bonvolu elekti'; + + @override + String get pleaseChooseAPasscode => 'Bonvolu elekti paskodon'; + + @override + String get pleaseClickOnLink => + 'Bonvolu klaki la ligilon en la retletero kaj pluiĝi.'; + + @override + String get pleaseEnter4Digits => + 'Bonvolu enigi 4 ciferojn, aŭ nenion por malŝalti ŝlosadon de la aplikaĵo.'; + + @override + String get pleaseEnterRecoveryKey => 'Please enter your recovery key:'; + + @override + String get pleaseEnterYourPassword => 'Bonvolu enigi vian pasvorton'; + + @override + String get pleaseEnterYourPin => + 'Bonvolu enigi vian personan identigan numeron'; + + @override + String get pleaseEnterYourUsername => 'Bonvolu enigi vian uzantonomon'; + + @override + String get pleaseFollowInstructionsOnWeb => + 'Bonvolu sekvi la instrukciojn de la retejo kaj tuŝetu al «Sekva».'; + + @override + String get privacy => 'Privateco'; + + @override + String get publicRooms => 'Publikaj ĉambroj'; + + @override + String get pushRules => 'Reguloj de pasivaj sciigoj'; + + @override + String get reason => 'Kialo'; + + @override + String get recording => 'Registrante'; + + @override + String redactedBy(String username) { + return 'Redacted by $username'; + } + + @override + String get directChat => 'Direct chat'; + + @override + String redactedByBecause(String username, String reason) { + return 'Redacted by $username because: \"$reason\"'; + } + + @override + String redactedAnEvent(String username) { + return '$username obskurigis eventon'; + } + + @override + String get redactMessage => 'Obskurigi mesaĝon'; + + @override + String get register => 'Registriĝi'; + + @override + String get reject => 'Rifuzi'; + + @override + String rejectedTheInvitation(String username) { + return '$username rifuzis la inviton'; + } + + @override + String get rejoin => 'Ree aliĝi'; + + @override + String get removeAllOtherDevices => 'Forigi ĉiujn aliajn aparatojn'; + + @override + String removedBy(String username) { + return 'Forigita de $username'; + } + + @override + String get removeDevice => 'Forigi aparaton'; + + @override + String get unbanFromChat => 'Malforbari'; + + @override + String get removeYourAvatar => 'Forigi vian profilbildon'; + + @override + String get replaceRoomWithNewerVersion => + 'Anstataŭigi ĉambron per nova versio'; + + @override + String get reply => 'Respondi'; + + @override + String get reportMessage => 'Raporti mesaĝon'; + + @override + String get translateMessage => 'Translate message'; + + @override + String get translatedMessage => 'Translated message'; + + @override + String get errorTranslatingMessage => + 'An error has occured while translating the message.'; + + @override + String get recoverMessage => 'Recover message'; + + @override + String get recoveredMessage => 'Recovered message'; + + @override + String get errorRecoveringMessage => + 'An error has occured while recovering the message.'; + + @override + String get errorRecoveringMessageNoAdmin => + 'This feature is available on Synapse homeservers only for adminstrators.'; + + @override + String get requestPermission => 'Peti permeson'; + + @override + String get roomHasBeenUpgraded => 'Ĉambro gradaltiĝis'; + + @override + String get roomVersion => 'Versio de ĉambro'; + + @override + String get saveFile => 'Konservi dosieron'; + + @override + String get retry => 'Retry'; + + @override + String get search => 'Serĉi'; + + @override + String get security => 'Sekureco'; + + @override + String get recoveryKey => 'Recovery key'; + + @override + String get recoveryKeyLost => 'Recovery key lost?'; + + @override + String seenByUser(String username) { + return 'Vidita de $username'; + } + + @override + String get send => 'Sendi'; + + @override + String get sendAMessage => 'Sendi mesaĝon'; + + @override + String get sendAsText => 'Sendi kiel tekston'; + + @override + String get sendAudio => 'Sendi sondosieron'; + + @override + String get sendFile => 'Sendi dosieron'; + + @override + String get sendImage => 'Sendi bildon'; + + @override + String sendImages(int count) { + return 'Send $count image'; + } + + @override + String get sendMessages => 'Sendi mesaĝojn'; + + @override + String get sendOriginal => 'Sendi originalon'; + + @override + String get sendSticker => 'Sendi glumarkon'; + + @override + String get sendVideo => 'Sendi filmon'; + + @override + String sentAFile(String username) { + return '$username sendis dosieron'; + } + + @override + String sentAnAudio(String username) { + return '$username sendis sondosieron'; + } + + @override + String sentAPicture(String username) { + return '$username sendis bildon'; + } + + @override + String sentASticker(String username) { + return '$username sendis glumarkon'; + } + + @override + String sentAVideo(String username) { + return '$username sendis filmon'; + } + + @override + String sentCallInformations(String senderName) { + return '$senderName sendis informojn pri voko'; + } + + @override + String get separateChatTypes => 'Separate Direct Chats and Groups'; + + @override + String get setAsCanonicalAlias => 'Agordi kiel ĉefan kromnomon'; + + @override + String get setCustomEmotes => 'Agordi proprajn mienetojn'; + + @override + String get setChatDescription => 'Set chat description'; + + @override + String get setInvitationLink => 'Agordi invitan ligilon'; + + @override + String get setPermissionsLevel => 'Agordi nivelon de permesoj'; + + @override + String get setStatus => 'Agordi staton'; + + @override + String get settings => 'Agordoj'; + + @override + String get share => 'Konigi'; + + @override + String sharedTheLocation(String username) { + return '$username konigis sian lokon'; + } + + @override + String get shareLocation => 'Konigi lokon'; + + @override + String get showPassword => 'Montri pasvorton'; + + @override + String get presenceStyle => 'Presence:'; + + @override + String get hideAvatarsInInvites => 'Hide avatars in invites'; + + @override + String get hideAvatarsInInvitesDescription => + 'Do not show room avatars in invites'; + + @override + String get presencesToggle => 'Show status messages from other users'; + + @override + String get pureBlackToggle => 'Pure Black'; + + @override + String get singlesignon => 'Ununura saluto'; + + @override + String get skip => 'Preterpasi'; + + @override + String get sourceCode => 'Fontkodo'; + + @override + String get spaceIsPublic => 'Aro estas publika'; + + @override + String get spaceName => 'Nomo de aro'; + + @override + String startedACall(String senderName) { + return '$senderName komencis vokon'; + } + + @override + String get startFirstChat => 'Start your first chat'; + + @override + String get status => 'Stato'; + + @override + String get statusExampleMessage => 'Kiel vi fartas?'; + + @override + String get submit => 'Sendi'; + + @override + String get synchronizingPleaseWait => 'Spegulante… Bonvolu atendi.'; + + @override + String synchronizingPleaseWaitCounter(String percentage) { + return ' Synchronizing… ($percentage%)'; + } + + @override + String get systemTheme => 'Sistema'; + + @override + String get theyDontMatch => 'Ili ne akordas'; + + @override + String get theyMatch => 'Ili akordas'; + + @override + String get title => 'FluffyChat'; + + @override + String get toggleFavorite => 'Baskuli elstarigon'; + + @override + String get toggleMuted => 'Basklui silentigon'; + + @override + String get toggleUnread => 'Baskuli legitecon'; + + @override + String get tooManyRequestsWarning => + 'Tro multaj petoj. Bonvolu reprovi poste!'; + + @override + String get transferFromAnotherDevice => 'Transporti de alia aparato'; + + @override + String get tryToSendAgain => 'Reprovi sendi'; + + @override + String get unavailable => 'Nedisponeble'; + + @override + String unbannedUser(String username, String targetName) { + return '$username malforbaris uzanton $targetName'; + } + + @override + String get unblockDevice => 'Malbloki aparaton'; + + @override + String get unknownDevice => 'Nekonata aparato'; + + @override + String get unknownEncryptionAlgorithm => 'Nekonata ĉifra algoritmo'; + + @override + String unknownEvent(String type) { + return 'Nekonata evento «$type»'; + } + + @override + String get unmuteChat => 'Malsilentigi babilon'; + + @override + String get unpin => 'Malfiksi'; + + @override + String unreadChats(int unreadCount) { + String _temp0 = intl.Intl.pluralLogic( + unreadCount, + locale: localeName, + other: '$unreadCount nelegitaj babiloj', + one: '1 nelegita babilo', + ); + return '$_temp0'; + } + + @override + String userAndOthersAreTyping(String username, int count) { + return '$username kaj $count aliaj tajpas…'; + } + + @override + String userAndUserAreTyping(String username, String username2) { + return '$username kaj $username2 tajpas…'; + } + + @override + String userIsTyping(String username) { + return '$username tajpas…'; + } + + @override + String userLeftTheChat(String username) { + return '$username foriris de la babilo'; + } + + @override + String get username => 'Uzantonomo'; + + @override + String userSentUnknownEvent(String username, String type) { + return '$username sendis eventon de speco $type'; + } + + @override + String get unverified => 'Unverified'; + + @override + String get verified => 'Kontrolita'; + + @override + String get verify => 'Kontroli'; + + @override + String get verifyStart => 'Komenci kontrolon'; + + @override + String get verifySuccess => 'Vi sukcese kontrolis!'; + + @override + String get verifyTitle => 'Kontrolante alian konton'; + + @override + String get videoCall => 'Vidvoko'; + + @override + String get visibilityOfTheChatHistory => 'Videbleco de historio de la babilo'; + + @override + String get visibleForAllParticipants => 'Videbla al ĉiuj partoprenantoj'; + + @override + String get visibleForEveryone => 'Videbla al ĉiuj'; + + @override + String get voiceMessage => 'Voĉmesaĝo'; + + @override + String get waitingPartnerAcceptRequest => + 'Atendante konfirmon de peto de la kunulo…'; + + @override + String get waitingPartnerEmoji => + 'Atendante akcepton de la bildosignoj de la kunulo…'; + + @override + String get waitingPartnerNumbers => + 'Atendante akcepton de la numeroj, de la kunulo…'; + + @override + String get wallpaper => 'Fonbildo'; + + @override + String get warning => 'Averto!'; + + @override + String get weSentYouAnEmail => 'Ni sendis retleteron al vi'; + + @override + String get whoCanPerformWhichAction => 'Kiu povas kion'; + + @override + String get whoIsAllowedToJoinThisGroup => 'Kiu rajtas aliĝi al ĉi tiu grupo'; + + @override + String get whyDoYouWantToReportThis => 'Kial vi volas tion ĉi raporti?'; + + @override + String get wipeChatBackup => + 'Ĉu forviŝi la savkopion de via babilo por krei novan sekurecan ŝlosilon?'; + + @override + String get withTheseAddressesRecoveryDescription => + 'Per tiuj ĉi adresoj vi povas rehavi vian pasvorton.'; + + @override + String get writeAMessage => 'Skribi mesaĝon…'; + + @override + String get yes => 'Jes'; + + @override + String get you => 'Vi'; + + @override + String get youAreNoLongerParticipatingInThisChat => + 'Vi ne plu partoprenas ĉi tiun babilon'; + + @override + String get youHaveBeenBannedFromThisChat => + 'Vi estas forbarita de ĉi tiu babilo'; + + @override + String get yourPublicKey => 'Via publika ŝlosilo'; + + @override + String get messageInfo => 'Message info'; + + @override + String get time => 'Time'; + + @override + String get messageType => 'Message Type'; + + @override + String get sender => 'Sender'; + + @override + String get openGallery => 'Open gallery'; + + @override + String get removeFromSpace => 'Remove from space'; + + @override + String get addToSpaceDescription => 'Select a space to add this chat to it.'; + + @override + String get start => 'Start'; + + @override + String get pleaseEnterRecoveryKeyDescription => + 'To unlock your old messages, please enter your recovery key that has been generated in a previous session. Your recovery key is NOT your password.'; + + @override + String get publish => 'Publish'; + + @override + String videoWithSize(String size) { + return 'Video ($size)'; + } + + @override + String get openChat => 'Open Chat'; + + @override + String get markAsRead => 'Mark as read'; + + @override + String get reportUser => 'Report user'; + + @override + String get dismiss => 'Dismiss'; + + @override + String reactedWith(String sender, String reaction) { + return '$sender reacted with $reaction'; + } + + @override + String get pinMessage => 'Pin to room'; + + @override + String get confirmEventUnpin => + 'Are you sure to permanently unpin the event?'; + + @override + String get emojis => 'Emojis'; + + @override + String get placeCall => 'Place call'; + + @override + String get voiceCall => 'Voice call'; + + @override + String get unsupportedAndroidVersion => 'Unsupported Android version'; + + @override + String get unsupportedAndroidVersionLong => + 'This feature requires a newer Android version. Please check for updates or Lineage OS support.'; + + @override + String get videoCallsBetaWarning => + 'Please note that video calls are currently in beta. They might not work as expected or work at all on all platforms.'; + + @override + String get experimentalVideoCalls => 'Experimental video calls'; + + @override + String get emailOrUsername => 'Email or username'; + + @override + String get indexedDbErrorTitle => 'Private mode issues'; + + @override + String get indexedDbErrorLong => + 'The message storage is unfortunately not enabled in private mode by default.\nPlease visit\n - about:config\n - set dom.indexedDB.privateBrowsing.enabled to true\nOtherwise, it is not possible to run Extera.'; + + @override + String switchToAccount(String number) { + return 'Switch to account $number'; + } + + @override + String get nextAccount => 'Next account'; + + @override + String get previousAccount => 'Previous account'; + + @override + String get addWidget => 'Add widget'; + + @override + String get widgetVideo => 'Video'; + + @override + String get widgetEtherpad => 'Text note'; + + @override + String get widgetJitsi => 'Jitsi Meet'; + + @override + String get widgetCustom => 'Custom'; + + @override + String get widgetName => 'Name'; + + @override + String get widgetUrlError => 'This is not a valid URL.'; + + @override + String get widgetNameError => 'Please provide a display name.'; + + @override + String get errorAddingWidget => 'Error adding the widget.'; + + @override + String get youRejectedTheInvitation => 'You rejected the invitation'; + + @override + String get youJoinedTheChat => 'You joined the chat'; + + @override + String get youAcceptedTheInvitation => '👍 You accepted the invitation'; + + @override + String youBannedUser(String user) { + return 'You banned $user'; + } + + @override + String youHaveWithdrawnTheInvitationFor(String user) { + return 'You have withdrawn the invitation for $user'; + } + + @override + String youInvitedToBy(String alias) { + return '📩 You have been invited via link to:\n$alias'; + } + + @override + String youInvitedBy(String user) { + return '📩 You have been invited by $user'; + } + + @override + String invitedBy(String user) { + return '📩 Invited by $user'; + } + + @override + String youInvitedUser(String user) { + return '📩 You invited $user'; + } + + @override + String youKicked(String user) { + return '👞 You kicked $user'; + } + + @override + String youKickedAndBanned(String user) { + return '🙅 You kicked and banned $user'; + } + + @override + String youUnbannedUser(String user) { + return 'You unbanned $user'; + } + + @override + String hasKnocked(String user) { + return '🚪 $user has knocked'; + } + + @override + String get usersMustKnock => 'Users must knock'; + + @override + String get noOneCanJoin => 'No one can join'; + + @override + String userWouldLikeToChangeTheChat(String user) { + return '$user would like to join the chat.'; + } + + @override + String get noPublicLinkHasBeenCreatedYet => + 'No public link has been created yet'; + + @override + String get knock => 'Knock'; + + @override + String get users => 'Users'; + + @override + String get unlockOldMessages => 'Unlock old messages'; + + @override + String get storeInSecureStorageDescription => + 'Store the recovery key in the secure storage of this device.'; + + @override + String get saveKeyManuallyDescription => + 'Save this key manually by triggering the system share dialog or clipboard.'; + + @override + String get storeInAndroidKeystore => 'Store in Android KeyStore'; + + @override + String get storeInAppleKeyChain => 'Store in Apple KeyChain'; + + @override + String get storeSecurlyOnThisDevice => 'Store securely on this device'; + + @override + String countFiles(int count) { + return '$count files'; + } + + @override + String get user => 'User'; + + @override + String get custom => 'Custom'; + + @override + String get foregroundServiceRunning => + 'This notification appears when the foreground service is running.'; + + @override + String get screenSharingTitle => 'screen sharing'; + + @override + String get screenSharingDetail => 'You are sharing your screen in Extera'; + + @override + String get callingPermissions => 'Calling permissions'; + + @override + String get callingAccount => 'Calling account'; + + @override + String get callingAccountDetails => + 'Allows Extera to use the native android dialer app.'; + + @override + String get appearOnTop => 'Appear on top'; + + @override + String get appearOnTopDetails => + 'Allows the app to appear on top (not needed if you already have Fluffychat setup as a calling account)'; + + @override + String get otherCallingPermissions => + 'Microphone, camera and other Extera permissions'; + + @override + String get whyIsThisMessageEncrypted => 'Why is this message unreadable?'; + + @override + String get noKeyForThisMessage => + 'This can happen if the message was sent before you have signed in to your account at this device.\n\nIt is also possible that the sender has blocked your device or something went wrong with the internet connection.\n\nAre you able to read the message on another session? Then you can transfer the message from it! Go to Settings > Devices and make sure that your devices have verified each other. When you open the room the next time and both sessions are in the foreground, the keys will be transmitted automatically.\n\nDo you not want to lose the keys when logging out or switching devices? Make sure that you have enabled the chat backup in the settings.'; + + @override + String get newGroup => 'New group'; + + @override + String get newSpace => 'New space'; + + @override + String get enterSpace => 'Enter space'; + + @override + String get enterRoom => 'Enter room'; + + @override + String get allSpaces => 'All spaces'; + + @override + String numChats(String number) { + return '$number chats'; + } + + @override + String get hideUnimportantStateEvents => 'Hide unimportant state events'; + + @override + String get hidePresences => 'Hide Status List?'; + + @override + String get doNotShowAgain => 'Do not show again'; + + @override + String wasDirectChatDisplayName(String oldDisplayName) { + return 'Empty chat (was $oldDisplayName)'; + } + + @override + String get newSpaceDescription => + 'Spaces allows you to consolidate your chats and build private or public communities.'; + + @override + String get encryptThisChat => 'Encrypt this chat'; + + @override + String get disableEncryptionWarning => + 'For security reasons you can not disable encryption in a chat, where it has been enabled before.'; + + @override + String get sorryThatsNotPossible => 'Sorry... that is not possible'; + + @override + String get deviceKeys => 'Device keys:'; + + @override + String get reopenChat => 'Reopen chat'; + + @override + String get noBackupWarning => + 'Warning! Without enabling chat backup, you will lose access to your encrypted messages. It is highly recommended to enable the chat backup first before logging out.'; + + @override + String get noOtherDevicesFound => 'No other devices found'; + + @override + String fileIsTooBigForServer(String max) { + return 'Unable to send! The server only supports attachments up to $max.'; + } + + @override + String fileHasBeenSavedAt(String path) { + return 'File has been saved at $path'; + } + + @override + String get jumpToLastReadMessage => 'Jump to last read message'; + + @override + String get readUpToHere => 'Read up to here'; + + @override + String get jump => 'Jump'; + + @override + String get openLinkInBrowser => 'Open link in browser'; + + @override + String get reportErrorDescription => + '😭 Oh no. Something went wrong. If you want, you can report this bug to the developers.'; + + @override + String get report => 'Report'; + + @override + String get signInWithPassword => 'Sign in with password'; + + @override + String get pleaseTryAgainLaterOrChooseDifferentServer => + 'Please try again later or choose a different server.'; + + @override + String signInWith(String provider) { + return 'Sign in with $provider'; + } + + @override + String get profileNotFound => + 'The user could not be found on the server. Maybe there is a connection problem or the user doesn\'t exist.'; + + @override + String get setTheme => 'Set theme:'; + + @override + String get setColorTheme => 'Set color theme:'; + + @override + String get invite => 'Invite'; + + @override + String get inviteGroupChat => '📨 Invite group chat'; + + @override + String get invitePrivateChat => '📨 Invite private chat'; + + @override + String get invalidInput => 'Invalid input!'; + + @override + String wrongPinEntered(int seconds) { + return 'Wrong pin entered! Try again in $seconds seconds...'; + } + + @override + String get pleaseEnterANumber => 'Please enter a number greater than 0'; + + @override + String get archiveRoomDescription => + 'The chat will be moved to the archive. Other users will be able to see that you have left the chat.'; + + @override + String get roomUpgradeDescription => + 'The chat will then be recreated with the new room version. All participants will be notified that they need to switch to the new chat. You can find out more about room versions at https://spec.matrix.org/latest/rooms/'; + + @override + String get removeDevicesDescription => + 'You will be logged out of this device and will no longer be able to receive messages.'; + + @override + String get banUserDescription => + 'The user will be banned from the chat and will not be able to enter the chat again until they are unbanned.'; + + @override + String get unbanUserDescription => + 'The user will be able to enter the chat again if they try.'; + + @override + String get kickUserDescription => + 'The user is kicked out of the chat but not banned. In public chats, the user can rejoin at any time.'; + + @override + String get makeAdminDescription => + 'Once you make this user admin, you may not be able to undo this as they will then have the same permissions as you.'; + + @override + String get pushNotificationsNotAvailable => + 'Push notifications not available'; + + @override + String get learnMore => 'Learn more'; + + @override + String get yourGlobalUserIdIs => 'Your global user-ID is: '; + + @override + String noUsersFoundWithQuery(String query) { + return 'Unfortunately no user could be found with \"$query\". Please check whether you made a typo.'; + } + + @override + String get knocking => 'Knocking'; + + @override + String chatCanBeDiscoveredViaSearchOnServer(String server) { + return 'Chat can be discovered via the search on $server'; + } + + @override + String get searchChatsRooms => 'Search for #chats, @users...'; + + @override + String get nothingFound => 'Nothing found...'; + + @override + String get groupName => 'Group name'; + + @override + String get createGroupAndInviteUsers => 'Create a group and invite users'; + + @override + String get groupCanBeFoundViaSearch => 'Group can be found via search'; + + @override + String get wrongRecoveryKey => + 'Sorry... this does not seem to be the correct recovery key.'; + + @override + String get startConversation => 'Start conversation'; + + @override + String get commandHint_sendraw => 'Send raw json'; + + @override + String get databaseMigrationTitle => 'Database is optimized'; + + @override + String get databaseMigrationBody => 'Please wait. This may take a moment.'; + + @override + String get leaveEmptyToClearStatus => 'Leave empty to clear your status.'; + + @override + String get select => 'Select'; + + @override + String get searchForUsers => 'Search for @users...'; + + @override + String get pleaseEnterYourCurrentPassword => + 'Please enter your current password'; + + @override + String get newPassword => 'New password'; + + @override + String get pleaseChooseAStrongPassword => 'Please choose a strong password'; + + @override + String get passwordsDoNotMatch => 'Passwords do not match'; + + @override + String get passwordIsWrong => 'Your entered password is wrong'; + + @override + String get publicLink => 'Public link'; + + @override + String get publicChatAddresses => 'Public chat addresses'; + + @override + String get createNewAddress => 'Create new address'; + + @override + String get joinSpace => 'Join space'; + + @override + String get publicSpaces => 'Public spaces'; + + @override + String get addChatOrSubSpace => 'Add chat or sub space'; + + @override + String get subspace => 'Subspace'; + + @override + String get decline => 'Decline'; + + @override + String get thisDevice => 'This device:'; + + @override + String get initAppError => 'An error occured while init the app'; + + @override + String get userRole => 'User role'; + + @override + String minimumPowerLevel(String level) { + return '$level is the minimum power level.'; + } + + @override + String searchIn(String chat) { + return 'Search in chat \"$chat\"...'; + } + + @override + String get searchMore => 'Search more...'; + + @override + String get gallery => 'Gallery'; + + @override + String get files => 'Files'; + + @override + String databaseBuildErrorBody(String url, String error) { + return 'Unable to build the SQlite database. The app tries to use the legacy database for now. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String sessionLostBody(String url, String error) { + return 'Your session is lost. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String restoreSessionBody(String url, String error) { + return 'The app now tries to restore your session from the backup. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String forwardMessageTo(String roomName) { + return 'Forward message to $roomName?'; + } + + @override + String get sendReadReceipts => 'Send read receipts'; + + @override + String get sendTypingNotificationsDescription => + 'Other participants in a chat can see when you are typing a new message.'; + + @override + String get sendReadReceiptsDescription => + 'Other participants in a chat can see when you have read a message.'; + + @override + String get formattedMessages => 'Formatted messages'; + + @override + String get formattedMessagesDescription => + 'Display rich message content like bold text using markdown.'; + + @override + String get verifyOtherUser => '🔐 Verify other user'; + + @override + String get verifyOtherUserDescription => + 'If you verify another user, you can be sure that you know who you are really writing to. 💪\n\nWhen you start a verification, you and the other user will see a popup in the app. There you will then see a series of emojis or numbers that you have to compare with each other.\n\nThe best way to do this is to meet up or start a video call. 👭'; + + @override + String get verifyOtherDevice => '🔐 Verify other device'; + + @override + String get verifyOtherDeviceDescription => + 'When you verify another device, those devices can exchange keys, increasing your overall security. 💪 When you start a verification, a popup will appear in the app on both devices. There you will then see a series of emojis or numbers that you have to compare with each other. It\'s best to have both devices handy before you start the verification. 🤳'; + + @override + String acceptedKeyVerification(String sender) { + return '$sender accepted key verification'; + } + + @override + String canceledKeyVerification(String sender) { + return '$sender canceled key verification'; + } + + @override + String completedKeyVerification(String sender) { + return '$sender completed key verification'; + } + + @override + String isReadyForKeyVerification(String sender) { + return '$sender is ready for key verification'; + } + + @override + String requestedKeyVerification(String sender) { + return '$sender requested key verification'; + } + + @override + String startedKeyVerification(String sender) { + return '$sender started key verification'; + } + + @override + String get transparent => 'Transparent'; + + @override + String get incomingMessages => 'Incoming messages'; + + @override + String get stickers => 'Stickers'; + + @override + String get discover => 'Discover'; + + @override + String get commandHint_ignore => 'Ignore the given matrix ID'; + + @override + String get commandHint_unignore => 'Unignore the given matrix ID'; + + @override + String unreadChatsInApp(String appname, String unread) { + return '$appname: $unread unread chats'; + } + + @override + String get noDatabaseEncryption => + 'Database encryption is not supported on this platform'; + + @override + String thereAreCountUsersBlocked(Object count) { + return 'Right now there are $count users blocked.'; + } + + @override + String get restricted => 'Restricted'; + + @override + String get knockRestricted => 'Knock restricted'; + + @override + String goToSpace(Object space) { + return 'Go to space: $space'; + } + + @override + String get markAsUnread => 'Mark as unread'; + + @override + String userLevel(int level) { + return '$level - User'; + } + + @override + String moderatorLevel(int level) { + return '$level - Moderator'; + } + + @override + String adminLevel(int level) { + return '$level - Admin'; + } + + @override + String get changeGeneralChatSettings => 'Change general chat settings'; + + @override + String get inviteOtherUsers => 'Invite other users to this chat'; + + @override + String get changeTheChatPermissions => 'Change the chat permissions'; + + @override + String get changeTheVisibilityOfChatHistory => + 'Change the visibility of the chat history'; + + @override + String get changeTheCanonicalRoomAlias => + 'Change the main public chat address'; + + @override + String get sendRoomNotifications => 'Send a @room notifications'; + + @override + String get changeTheDescriptionOfTheGroup => + 'Change the description of the chat'; + + @override + String get chatPermissionsDescription => + 'Define which power level is necessary for certain actions in this chat. The power levels 0, 50 and 100 are usually representing users, moderators and admins, but any gradation is possible.'; + + @override + String updateInstalled(String version) { + return '🎉 Update $version installed!'; + } + + @override + String get changelog => 'Changelog'; + + @override + String get sendCanceled => 'Sending canceled'; + + @override + String get loginWithMatrixId => 'Login with Matrix-ID'; + + @override + String get discoverHomeservers => 'Discover homeservers'; + + @override + String get whatIsAHomeserver => 'What is a homeserver?'; + + @override + String get homeserverDescription => + 'All your data is stored on the homeserver, just like an email provider. You can choose which homeserver you want to use, while you can still communicate with everyone. Learn more at at https://matrix.org.'; + + @override + String get doesNotSeemToBeAValidHomeserver => + 'Doesn\'t seem to be a compatible homeserver. Wrong URL?'; + + @override + String get calculatingFileSize => 'Calculating file size...'; + + @override + String get prepareSendingAttachment => 'Prepare sending attachment...'; + + @override + String get sendingAttachment => 'Sending attachment...'; + + @override + String get generatingVideoThumbnail => 'Generating video thumbnail...'; + + @override + String get compressVideo => 'Compressing video...'; + + @override + String sendingAttachmentCountOfCount(int index, int length) { + return 'Sending attachment $index of $length...'; + } + + @override + String serverLimitReached(int seconds) { + return 'Server limit reached! Waiting $seconds seconds...'; + } + + @override + String get oneOfYourDevicesIsNotVerified => + 'One of your devices is not verified'; + + @override + String get noticeChatBackupDeviceVerification => + 'Note: When you connect all your devices to the chat backup, they are automatically verified.'; + + @override + String get continueText => 'Continue'; + + @override + String get welcomeText => + 'Hey Hey 👋 This is Extera. You can sign in to any homeserver, which is compatible with https://matrix.org. And then chat with anyone. It\'s a huge decentralized messaging network!'; + + @override + String get blur => 'Blur:'; + + @override + String get opacity => 'Opacity:'; + + @override + String get setWallpaper => 'Set wallpaper'; + + @override + String get manageAccount => 'Manage account'; + + @override + String get noContactInformationProvided => + 'Server does not provide any valid contact information'; + + @override + String get contactServerAdmin => 'Contact server admin'; + + @override + String get contactServerSecurity => 'Contact server security'; + + @override + String get supportPage => 'Support page'; + + @override + String get serverInformation => 'Server information:'; + + @override + String get name => 'Name'; + + @override + String get version => 'Version'; + + @override + String get website => 'Website'; + + @override + String get compress => 'Compress'; + + @override + String get boldText => 'Bold text'; + + @override + String get italicText => 'Italic text'; + + @override + String get strikeThrough => 'Strikethrough'; + + @override + String get pleaseFillOut => 'Please fill out'; + + @override + String get invalidUrl => 'Invalid url'; + + @override + String get addLink => 'Add link'; + + @override + String get unableToJoinChat => + 'Unable to join chat. Maybe the other party has already closed the conversation.'; + + @override + String get previous => 'Previous'; + + @override + String get otherPartyNotLoggedIn => + 'The other party is currently not logged in and therefore cannot receive messages!'; + + @override + String appWantsToUseForLogin(String server) { + return 'Use \'$server\' to log in'; + } + + @override + String get appWantsToUseForLoginDescription => + 'You hereby allow the app and website to share information about you.'; + + @override + String get open => 'Open'; + + @override + String get waitingForServer => 'Waiting for server...'; + + @override + String get appIntroduction => + 'Extera lets you chat with your friends across different messengers. Learn more at https://matrix.org or just tap *Continue*.'; + + @override + String get newChatRequest => '📩 New chat request'; + + @override + String get contentNotificationSettings => 'Content notification settings'; + + @override + String get generalNotificationSettings => 'General notification settings'; + + @override + String get roomNotificationSettings => 'Room notification settings'; + + @override + String get userSpecificNotificationSettings => + 'User specific notification settings'; + + @override + String get otherNotificationSettings => 'Other notification settings'; + + @override + String get notificationRuleContainsUserName => 'Contains User Name'; + + @override + String get notificationRuleContainsUserNameDescription => + 'Notifies the user when a message contains their username.'; + + @override + String get notificationRuleMaster => 'Mute all notifications'; + + @override + String get notificationRuleMasterDescription => + 'Overrides all other rules and disables all notifications.'; + + @override + String get notificationRuleSuppressNotices => 'Suppress Automated Messages'; + + @override + String get notificationRuleSuppressNoticesDescription => + 'Suppresses notifications from automated clients like bots.'; + + @override + String get notificationRuleInviteForMe => 'Invite for Me'; + + @override + String get notificationRuleInviteForMeDescription => + 'Notifies the user when they are invited to a room.'; + + @override + String get notificationRuleMemberEvent => 'Member Event'; + + @override + String get notificationRuleMemberEventDescription => + 'Suppresses notifications for membership events.'; + + @override + String get notificationRuleIsUserMention => 'User Mention'; + + @override + String get notificationRuleIsUserMentionDescription => + 'Notifies the user when they are directly mentioned in a message.'; + + @override + String get notificationRuleContainsDisplayName => 'Contains Display Name'; + + @override + String get notificationRuleContainsDisplayNameDescription => + 'Notifies the user when a message contains their display name.'; + + @override + String get notificationRuleIsRoomMention => 'Room Mention'; + + @override + String get notificationRuleIsRoomMentionDescription => + 'Notifies the user when there is a room mention.'; + + @override + String get notificationRuleRoomnotif => 'Room Notification'; + + @override + String get notificationRuleRoomnotifDescription => + 'Notifies the user when a message contains \'@room\'.'; + + @override + String get notificationRuleTombstone => 'Tombstone'; + + @override + String get notificationRuleTombstoneDescription => + 'Notifies the user about room deactivation messages.'; + + @override + String get notificationRuleReaction => 'Reaction'; + + @override + String get notificationRuleReactionDescription => + 'Suppresses notifications for reactions.'; + + @override + String get notificationRuleRoomServerAcl => 'Room Server ACL'; + + @override + String get notificationRuleRoomServerAclDescription => + 'Suppresses notifications for room server access control lists (ACL).'; + + @override + String get notificationRuleSuppressEdits => 'Suppress Edits'; + + @override + String get notificationRuleSuppressEditsDescription => + 'Suppresses notifications for edited messages.'; + + @override + String get notificationRuleCall => 'Call'; + + @override + String get notificationRuleCallDescription => + 'Notifies the user about calls.'; + + @override + String get notificationRuleEncryptedRoomOneToOne => + 'Encrypted Room One-to-One'; + + @override + String get notificationRuleEncryptedRoomOneToOneDescription => + 'Notifies the user about messages in encrypted one-to-one rooms.'; + + @override + String get notificationRuleRoomOneToOne => 'Room One-to-One'; + + @override + String get notificationRuleRoomOneToOneDescription => + 'Notifies the user about messages in one-to-one rooms.'; + + @override + String get notificationRuleMessage => 'Message'; + + @override + String get notificationRuleMessageDescription => + 'Notifies the user about general messages.'; + + @override + String get notificationRuleEncrypted => 'Encrypted'; + + @override + String get notificationRuleEncryptedDescription => + 'Notifies the user about messages in encrypted rooms.'; + + @override + String get notificationRuleJitsi => 'Jitsi'; + + @override + String get notificationRuleJitsiDescription => + 'Notifies the user about Jitsi widget events.'; + + @override + String get notificationRuleServerAcl => 'Suppress Server ACL Events'; + + @override + String get notificationRuleServerAclDescription => + 'Suppresses notifications for Server ACL events.'; + + @override + String unknownPushRule(String rule) { + return 'Unknown push rule \'$rule\''; + } + + @override + String get deletePushRuleCanNotBeUndone => + 'If you delete this notification setting, this can not be undone.'; + + @override + String get more => 'More'; + + @override + String get shareKeysWith => 'Share keys with...'; + + @override + String get shareKeysWithDescription => + 'Which devices should be trusted so that they can read along your messages in encrypted chats?'; + + @override + String get allDevices => 'All devices'; + + @override + String get crossVerifiedDevicesIfEnabled => + 'Cross verified devices if enabled'; + + @override + String get crossVerifiedDevices => 'Cross verified devices'; + + @override + String get verifiedDevicesOnly => 'Verified devices only'; + + @override + String get takeAPhoto => 'Take a photo'; + + @override + String get recordAVideo => 'Record a video'; + + @override + String get optionalMessage => '(Optional) message...'; + + @override + String get notSupportedOnThisDevice => 'Not supported on this device'; + + @override + String get enterNewChat => 'Enter new chat'; + + @override + String get approve => 'Approve'; + + @override + String get youHaveKnocked => 'You have knocked'; + + @override + String get pleaseWaitUntilInvited => + 'Please wait now, until someone from the room invites you.'; +} diff --git a/lib/generated/l10n/l10n_es.dart b/lib/generated/l10n/l10n_es.dart new file mode 100644 index 0000000..26e484f --- /dev/null +++ b/lib/generated/l10n/l10n_es.dart @@ -0,0 +1,2774 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'l10n.dart'; + +// ignore_for_file: type=lint + +/// The translations for Spanish Castilian (`es`). +class L10nEs extends L10n { + L10nEs([String locale = 'es']) : super(locale); + + @override + String get noSendPermission => 'You can\'t send messages here'; + + @override + String get alwaysUse24HourFormat => 'falso'; + + @override + String get repeatPassword => 'Repite la contraseña'; + + @override + String get notAnImage => 'El archivo no es una imagen.'; + + @override + String get setCustomPermissionLevel => 'Set custom permission level'; + + @override + String get setPermissionsLevelDescription => + 'Please choose a predefined role below or enter a custom permission level between 0 and 100.'; + + @override + String get ignoreUser => 'Ignore user'; + + @override + String get normalUser => 'Normal user'; + + @override + String get remove => 'Eliminar'; + + @override + String get importNow => 'Importar ahora'; + + @override + String get importEmojis => 'Importar emojis'; + + @override + String get importFromZipFile => 'Importar de un archivo .zip'; + + @override + String get exportEmotePack => 'Exportar paquete de emotes a .zip'; + + @override + String get replace => 'Reemplazar'; + + @override + String get about => 'Acerca de'; + + @override + String aboutHomeserver(String homeserver) { + return 'Acerca de $homeserver'; + } + + @override + String get accept => 'Aceptar'; + + @override + String acceptedTheInvitation(String username) { + return '👍 $username aceptó la invitación'; + } + + @override + String get account => 'Cuenta'; + + @override + String activatedEndToEndEncryption(String username) { + return '🔐 $username activó el cifrado de extremo a extremo'; + } + + @override + String get addEmail => 'Añadir dirección de correo'; + + @override + String get confirmMatrixId => + 'Por favor confirma tu Matrix ID para borrar tu cuenta.'; + + @override + String supposedMxid(String mxid) { + return 'Esto debería ser $mxid'; + } + + @override + String get addChatDescription => 'Añadir una descripción del chat...'; + + @override + String get addToSpace => 'Agregar al espacio'; + + @override + String get admin => 'Administrador'; + + @override + String get alias => 'alias'; + + @override + String get all => 'Todo'; + + @override + String get allChats => 'Todos los chats'; + + @override + String get commandHint_roomupgrade => + 'Upgrade this room to the given room version'; + + @override + String get commandHint_googly => 'Enviar unos ojos saltones'; + + @override + String get commandHint_cuddle => 'Enviar un abrazo'; + + @override + String get commandHint_hug => 'Mandar un abrazo'; + + @override + String googlyEyesContent(String senderName) { + return '$senderName te manda ojos saltones'; + } + + @override + String cuddleContent(String senderName) { + return '$senderName se acurruca contigo'; + } + + @override + String hugContent(String senderName) { + return '$senderName te abraza'; + } + + @override + String answeredTheCall(String senderName) { + return '$senderName respondió a la llamada'; + } + + @override + String get anyoneCanJoin => 'Cualquiera puede unirse'; + + @override + String get appLock => 'Bloqueo de aplicación'; + + @override + String get appLockDescription => + 'Bloquear la aplicación cuando no se use con código pin'; + + @override + String get archive => 'Archivo'; + + @override + String get areGuestsAllowedToJoin => '¿Pueden unirse usuarios de visita?'; + + @override + String get areYouSure => '¿Estás seguro?'; + + @override + String get areYouSureYouWantToLogout => '¿Confirma que quiere cerrar sesión?'; + + @override + String get askSSSSSign => + 'Para poder confirmar a la otra persona, ingrese su contraseña de almacenamiento segura o la clave de recuperación.'; + + @override + String askVerificationRequest(String username) { + return '¿Aceptar esta solicitud de verificación de $username?'; + } + + @override + String get autoplayImages => + 'Reproducir emoticonos y stickers animados automáticamente'; + + @override + String badServerLoginTypesException(String serverVersions, + String supportedVersions, Object suportedVersions) { + return 'El servidor soporta los siguientes mecanismos para autenticación:\n$serverVersions\npero esta aplicación sólo soporta:\n$supportedVersions'; + } + + @override + String get sendTypingNotifications => + 'Enviar notificaciones \"está escribiendo\"'; + + @override + String get swipeRightToLeftToReply => 'Desliza a la izquierda para responder'; + + @override + String get sendOnEnter => 'Enviar con enter'; + + @override + String badServerVersionsException(String serverVersions, + String supportedVersions, Object serverVerions, Object suportedVersions) { + return 'El servidor soporta las siguientes versiones de la especificación:\n$serverVersions\npero esta aplicación sólo soporta las versiones $supportedVersions'; + } + + @override + String countChatsAndCountParticipants(int chats, int participants) { + return '$chats chats y $participants participantes'; + } + + @override + String get noMoreChatsFound => 'No se encontraron más chats...'; + + @override + String get noChatsFoundHere => + 'No se han encontrado chats. Inicia un nuevo chat usando el botón de abajo. ⤵️'; + + @override + String get joinedChats => 'Chats Unidos'; + + @override + String get unread => 'No leídos'; + + @override + String get space => 'Espacio'; + + @override + String get spaces => 'Espacios'; + + @override + String get banFromChat => 'Vetar del chat'; + + @override + String get banned => 'Vetado'; + + @override + String bannedUser(String username, String targetName) { + return '$username vetó a $targetName'; + } + + @override + String get blockDevice => 'Bloquear dispositivo'; + + @override + String get blocked => 'Bloqueado'; + + @override + String get botMessages => 'Mensajes de bot'; + + @override + String get cancel => 'Cancelar'; + + @override + String cantOpenUri(String uri) { + return 'No puedo abrir el URI $uri'; + } + + @override + String get changeDeviceName => 'Cambiar el nombre del dispositivo'; + + @override + String changedTheChatAvatar(String username) { + return '$username cambió el icono del chat'; + } + + @override + String changedTheChatDescriptionTo(String username, String description) { + return '$username cambió la descripción del chat a: \'$description\''; + } + + @override + String changedTheChatNameTo(String username, String chatname) { + return '$username cambió el nombre del chat a: \'$chatname\''; + } + + @override + String changedTheChatPermissions(String username) { + return '$username cambió los permisos del chat'; + } + + @override + String changedTheDisplaynameTo(String username, String displayname) { + return '$username cambió su nombre visible a: \'$displayname\''; + } + + @override + String changedTheGuestAccessRules(String username) { + return '$username cambió las reglas de acceso de visitantes'; + } + + @override + String changedTheGuestAccessRulesTo(String username, String rules) { + return '$username cambió las reglas de acceso de visitantes a: $rules'; + } + + @override + String changedTheHistoryVisibility(String username) { + return '$username cambió la visibilidad del historial'; + } + + @override + String changedTheHistoryVisibilityTo(String username, String rules) { + return '$username cambió la visibilidad del historial a: $rules'; + } + + @override + String changedTheJoinRules(String username) { + return '$username cambió las reglas de ingreso'; + } + + @override + String changedTheJoinRulesTo(String username, String joinRules) { + return '$username cambió las reglas de ingreso a $joinRules'; + } + + @override + String changedTheProfileAvatar(String username) { + return '$username cambió su imagen de perfil'; + } + + @override + String changedTheRoomAliases(String username) { + return '$username cambió el alias de la sala'; + } + + @override + String changedTheRoomInvitationLink(String username) { + return '$username cambió el enlace de invitación'; + } + + @override + String get changePassword => 'Cambiar la contraseña'; + + @override + String get changeTheHomeserver => 'Cambiar el servidor'; + + @override + String get changeTheme => 'Cambia tu estilo'; + + @override + String get changeTheNameOfTheGroup => 'Cambiar el nombre del grupo'; + + @override + String get changeYourAvatar => 'Cambiar tu avatar'; + + @override + String get channelCorruptedDecryptError => 'El cifrado se ha corrompido'; + + @override + String get chat => 'Chat'; + + @override + String get yourChatBackupHasBeenSetUp => + 'Se ha configurado la copia de respaldo del chat.'; + + @override + String get chatBackup => 'Copia de respaldo del chat'; + + @override + String get chatBackupDescription => + 'La copia de respaldo del chat está protegida por una llave de seguridad. Procure no perderla.'; + + @override + String get chatDetails => 'Detalles del chat'; + + @override + String get chatHasBeenAddedToThisSpace => + 'El chat se ha agregado a este espacio'; + + @override + String get chats => 'Conversaciones'; + + @override + String get chooseAStrongPassword => 'Elija una contraseña segura'; + + @override + String get clearArchive => 'Borrar archivo'; + + @override + String get close => 'Cerrar'; + + @override + String get commandHint_markasdm => + 'Marcar como sala de mensajes directos para el ID de Matrix'; + + @override + String get commandHint_markasgroup => 'Marcar como grupo'; + + @override + String get commandHint_ban => 'Prohibir al usuario dado en esta sala'; + + @override + String get commandHint_clearcache => 'Limpiar cache'; + + @override + String get commandHint_create => + 'Crear un chat grupal vacío\nUse --no-encryption para deshabilitar el cifrado'; + + @override + String get commandHint_discardsession => 'Descartar sesión'; + + @override + String get commandHint_dm => + 'Iniciar un chat directo\nUse --no-encryption para deshabilitar el cifrado'; + + @override + String get commandHint_html => 'Enviar texto con formato HTML'; + + @override + String get commandHint_invite => 'Invitar al usuario indicado a esta sala'; + + @override + String get commandHint_join => 'Únete a la sala indicada'; + + @override + String get commandHint_kick => 'Eliminar el usuario indicado de esta sala'; + + @override + String get commandHint_leave => 'Deja esta sala'; + + @override + String get commandHint_me => 'Descríbete'; + + @override + String get commandHint_myroomavatar => + 'Selecciona tu foto para esta sala (by mxc-uri)'; + + @override + String get commandHint_myroomnick => + 'Establece tu nombre para mostrar para esta sala'; + + @override + String get commandHint_op => + 'Establece el nivel de potencia del usuario dado (default: 50)'; + + @override + String get commandHint_plain => 'Enviar texto sin formato'; + + @override + String get commandHint_react => 'Enviar respuesta como reacción'; + + @override + String get commandHint_send => 'Enviar texto'; + + @override + String get commandHint_unban => 'Des banear al usuario dado en esta sala'; + + @override + String get commandInvalid => 'Comando inválido'; + + @override + String commandMissing(String command) { + return '$command no es un comando.'; + } + + @override + String get compareEmojiMatch => 'Por favor compare los emojis'; + + @override + String get compareNumbersMatch => 'Por favor compare los números'; + + @override + String get configureChat => 'Configurar chat'; + + @override + String get confirm => 'Confirmar'; + + @override + String get connect => 'Conectar'; + + @override + String get contactHasBeenInvitedToTheGroup => + 'El contacto ha sido invitado al grupo'; + + @override + String get containsDisplayName => 'Contiene nombre para mostrar'; + + @override + String get containsUserName => 'Contiene nombre de usuario'; + + @override + String get contentHasBeenReported => + 'El contenido ha sido reportado a los administradores del servidor'; + + @override + String get copiedToClipboard => 'Copiado al portapapeles'; + + @override + String get copy => 'Copiar'; + + @override + String get copyToClipboard => 'Copiar al portapapeles'; + + @override + String couldNotDecryptMessage(String error) { + return 'No se pudo descifrar el mensaje: $error'; + } + + @override + String countParticipants(int count) { + return '$count participantes'; + } + + @override + String get create => 'Crear'; + + @override + String createdTheChat(String username) { + return '💬$username creó el chat'; + } + + @override + String get createGroup => 'Crear grupo'; + + @override + String get createNewSpace => 'Nuevo espacio'; + + @override + String get currentlyActive => 'Actualmente activo'; + + @override + String get darkTheme => 'Oscuro'; + + @override + String dateAndTimeOfDay(String date, String timeOfDay) { + return '$date, $timeOfDay'; + } + + @override + String dateWithoutYear(String month, String day) { + return '$day-$month'; + } + + @override + String dateWithYear(String year, String month, String day) { + return '$day-$month-$year'; + } + + @override + String get deactivateAccountWarning => + 'Se desactivará su cuenta de usuario. ¡La operación no se puede cancelar! ¿Está seguro?'; + + @override + String get defaultPermissionLevel => + 'Nivel de permiso predeterminado para nuevo usuarios'; + + @override + String get delete => 'Eliminar'; + + @override + String get deleteAccount => 'Cancelar cuenta'; + + @override + String get deleteMessage => 'Eliminar mensaje'; + + @override + String get device => 'Dispositivo'; + + @override + String get deviceId => 'ID del dispositivo'; + + @override + String get devices => 'Dispositivos'; + + @override + String get directChats => 'Chat directo'; + + @override + String get allRooms => 'Todos los chats grupales'; + + @override + String get displaynameHasBeenChanged => 'El nombre visible ha cambiado'; + + @override + String get downloadFile => 'Descargar archivo'; + + @override + String get edit => 'Editar'; + + @override + String get editBlockedServers => 'Editar servidores bloqueado'; + + @override + String get chatPermissions => 'Permisos del chat'; + + @override + String get editDisplayname => 'Editar nombre visible'; + + @override + String get editRoomAliases => 'Editar alias de la sala'; + + @override + String get editRoomAvatar => 'Editar avatar de sala'; + + @override + String get emoteExists => '¡El emote ya existe!'; + + @override + String get emoteInvalid => '¡El atajo del emote es inválido!'; + + @override + String get emoteKeyboardNoRecents => + 'Los emotes usados recientemente aparecerán aquí...'; + + @override + String get emotePacks => 'Paquetes de emoticonos para la habitación'; + + @override + String get emoteSettings => 'Configuración de emotes'; + + @override + String get globalChatId => 'ID de chat Global'; + + @override + String get accessAndVisibility => 'Acceso y visibilidad'; + + @override + String get accessAndVisibilityDescription => + 'A quién se le permite unirse a este chat y cómo se puede descubrir el chat.'; + + @override + String get calls => 'Llamadas'; + + @override + String get customEmojisAndStickers => 'Emojis y stickers personalizados'; + + @override + String get customEmojisAndStickersBody => + 'Agrega o comparte emojis y stickers personalizados que se pueden utilizar en cualquier chat.'; + + @override + String get emoteShortcode => 'Atajo de emote'; + + @override + String get emoteWarnNeedToPick => + '¡Debes elegir un atajo de emote y una imagen!'; + + @override + String get emptyChat => 'Chat vacío'; + + @override + String get enableEmotesGlobally => + 'Habilitar paquete de emoticonos a nivel general'; + + @override + String get enableEncryption => 'Habilitar la encriptación'; + + @override + String get enableEncryptionWarning => + 'Ya no podrá deshabilitar el cifrado. ¿Estás seguro?'; + + @override + String get encrypted => 'Encriptado'; + + @override + String get encryption => 'Cifrado'; + + @override + String get encryptionNotEnabled => 'El cifrado no está habilitado'; + + @override + String endedTheCall(String senderName) { + return '$senderName terminó la llamada'; + } + + @override + String get enterAnEmailAddress => + 'Introducir una dirección de correo electrónico'; + + @override + String get homeserver => 'Servidor inicial'; + + @override + String get enterYourHomeserver => 'Ingrese su servidor'; + + @override + String errorObtainingLocation(String error) { + return 'Error al obtener la ubicación: $error'; + } + + @override + String get everythingReady => '¡Todo listo!'; + + @override + String get extremeOffensive => 'Extremadamente ofensivo'; + + @override + String get fileName => 'Nombre del archivo'; + + @override + String get fluffychat => 'Extera'; + + @override + String get fontSize => 'Tamaño de fuente'; + + @override + String get forward => 'Reenviar'; + + @override + String get fromJoining => 'Desde que se unió'; + + @override + String get fromTheInvitation => 'Desde la invitación'; + + @override + String get goToTheNewRoom => 'Ir a la nueva sala'; + + @override + String get group => 'Grupo'; + + @override + String get chatDescription => 'Descripción del chat'; + + @override + String get chatDescriptionHasBeenChanged => + 'Se ha cambiado la descripción del chat'; + + @override + String get groupIsPublic => 'El grupo es público'; + + @override + String get groups => 'Grupos'; + + @override + String groupWith(String displayname) { + return 'Grupo con $displayname'; + } + + @override + String get guestsAreForbidden => 'Los visitantes están prohibidos'; + + @override + String get guestsCanJoin => 'Los visitantes pueden unirse'; + + @override + String hasWithdrawnTheInvitationFor(String username, String targetName) { + return '$username ha retirado la invitación para $targetName'; + } + + @override + String get help => 'Ayuda'; + + @override + String get hideRedactedEvents => 'Ocultar sucesos censurados'; + + @override + String get hideRedactedMessages => 'Esconde mensajes eliminados'; + + @override + String get hideRedactedMessagesBody => + 'Si alguien elimina un mensaje, este mensaje ya no será visible en el chat.'; + + @override + String get hideInvalidOrUnknownMessageFormats => + 'Esconde formatos de mensajes inválidos o desconocidos'; + + @override + String get howOffensiveIsThisContent => '¿Cuán ofensivo es este contenido?'; + + @override + String get id => 'Identificación'; + + @override + String get identity => 'Identidad'; + + @override + String get block => 'Bloquear'; + + @override + String get blockedUsers => 'Usuarios bloqueados'; + + @override + String get blockListDescription => + 'Puedes bloquear usuarios que te estén molestando. No podrás recibir mensajes ni invitaciones de chat de los usuarios de tu lista de bloqueo.'; + + @override + String get blockUsername => 'Ignorar nombre de usuario'; + + @override + String get iHaveClickedOnLink => 'He hecho clic en el enlace'; + + @override + String get incorrectPassphraseOrKey => + 'Frase de contraseña o clave de recuperación incorrecta'; + + @override + String get inoffensive => 'Inofensivo'; + + @override + String get inviteContact => 'Invitar contacto'; + + @override + String inviteContactToGroupQuestion(Object contact, Object groupName) { + return '¿Quieres invitar a $contact al chat $groupName?'; + } + + @override + String inviteContactToGroup(String groupName) { + return 'Invitar contacto a $groupName'; + } + + @override + String get noChatDescriptionYet => + 'No se ha creado una descripción del chat aún.'; + + @override + String get tryAgain => 'Inténtelo de nuevo'; + + @override + String get invalidServerName => 'Nombre del servidor no válido'; + + @override + String get invited => 'Invitado'; + + @override + String get redactMessageDescription => + 'El mensaje será censurado para todas las personas participantes en la conversación. Esto no se puede deshacer.'; + + @override + String get optionalRedactReason => + '(Opcional) Motivo para censurar este mensaje...'; + + @override + String invitedUser(String username, String targetName) { + return '📩$username invitó a $targetName'; + } + + @override + String get invitedUsersOnly => 'Sólo usuarios invitados'; + + @override + String get inviteForMe => 'Invitar por mí'; + + @override + String inviteText(String username, String link) { + return '$username te invitó a Extera.\n1.Visita fluffychat.im e instala la app\n2. Regístrate o inicia sesión\n3. Abre el enlace de invitación:\n$link'; + } + + @override + String get isTyping => 'está escribiendo…'; + + @override + String joinedTheChat(String username) { + return '👋$username se unió al chat'; + } + + @override + String get joinRoom => 'Unirse a la sala'; + + @override + String kicked(String username, String targetName) { + return '👞$username echó a $targetName'; + } + + @override + String kickedAndBanned(String username, String targetName) { + return '🙅$username echó y vetó a $targetName'; + } + + @override + String get kickFromChat => 'Echar del chat'; + + @override + String lastActiveAgo(String localizedTimeShort) { + return 'Última vez activo: $localizedTimeShort'; + } + + @override + String get leave => 'Abandonar'; + + @override + String get leftTheChat => 'Abandonó el chat'; + + @override + String get license => 'Licencia'; + + @override + String get lightTheme => 'Claro'; + + @override + String loadCountMoreParticipants(int count) { + return 'Mostrar $count participantes más'; + } + + @override + String get dehydrate => 'Exportar sesión y limpiar dispositivo'; + + @override + String get dehydrateWarning => + 'Esta acción no se puede deshacer. Asegúrese de que ha almacenado de forma segura el fichero de copia de seguridad.'; + + @override + String get dehydrateTor => 'TOR: Exportar sesión'; + + @override + String get dehydrateTorLong => + 'Si está usando TOR, es recomendable exportar la sesión antes de cerrar la ventana.'; + + @override + String get hydrateTor => 'TOR: Importar sesión exportada'; + + @override + String get hydrateTorLong => + '¿Exportó su sesión la última vez que estuvo en TOR? Impórtela rápidamente y continúe chateando.'; + + @override + String get hydrate => 'Restaurar desde fichero de copia de seguridad'; + + @override + String get loadingPleaseWait => 'Cargando… Por favor espere.'; + + @override + String get loadMore => 'Mostrar más…'; + + @override + String get locationDisabledNotice => + 'Los servicios de ubicación están deshabilitado. Habilite para poder compartir su ubicación.'; + + @override + String get locationPermissionDeniedNotice => + 'Permiso de ubicación denegado. Concédeles que puedan compartir tu ubicación.'; + + @override + String get login => 'Acceso'; + + @override + String logInTo(String homeserver) { + return 'Iniciar sesión en $homeserver'; + } + + @override + String get logout => 'Cerrar sesión'; + + @override + String get memberChanges => 'Cambios de miembros'; + + @override + String get mention => 'Mencionar'; + + @override + String get messages => 'Mensajes'; + + @override + String get messagesStyle => 'Mensajes:'; + + @override + String get moderator => 'Moderador'; + + @override + String get muteChat => 'Silenciar chat'; + + @override + String get needPantalaimonWarning => + 'Tenga en cuenta que necesita Pantalaimon para utilizar el cifrado de extremo a extremo por ahora.'; + + @override + String get newChat => 'Nuevo chat'; + + @override + String get newMessageInFluffyChat => 'Nuevo mensaje en Extera'; + + @override + String get newVerificationRequest => '¡Nueva solicitud de verificación!'; + + @override + String get next => 'Siguiente'; + + @override + String get no => 'No'; + + @override + String get noConnectionToTheServer => 'Sin conexión al servidor'; + + @override + String get noEmotesFound => 'Ningún emote encontrado. 😕'; + + @override + String get noEncryptionForPublicRooms => + 'Sólo se puede activar el cifrado en cuanto la sala deja de ser de acceso público.'; + + @override + String get noGoogleServicesWarning => + 'Parece que no tienes servicios de Firebase Cloud Messaging en tu dispositivo. Para recibir de todas formas notificaciones, recomendamos instalar ntfy. Con ntfy o cualquier proveedor Unified Push, puedes recibir notificaciones manteniendo seguridad de datos. Puedes descargar ntfy de la PlayStore o de F-Droid.'; + + @override + String noMatrixServer(String server1, String server2) { + return '$server1 no es un servidor matrix, usar $server2 en su lugar?'; + } + + @override + String get shareInviteLink => 'Compartir enlace de invitación'; + + @override + String get scanQrCode => 'Escanear código QR'; + + @override + String get none => 'Ninguno'; + + @override + String get noPasswordRecoveryDescription => + 'Aún no ha agregado una forma de recuperar su contraseña.'; + + @override + String get noPermission => 'Sin autorización'; + + @override + String get noRoomsFound => 'Ninguna sala encontrada…'; + + @override + String get notifications => 'Notificaciones'; + + @override + String get notificationsEnabledForThisAccount => + 'Notificaciones habilitadas para esta cuenta'; + + @override + String numUsersTyping(int count) { + return '$count usuarios están escribiendo…'; + } + + @override + String get obtainingLocation => 'Obteniendo ubicación…'; + + @override + String get offensive => 'Ofensiva'; + + @override + String get offline => 'Desconectado'; + + @override + String get ok => 'Ok'; + + @override + String get online => 'Conectado'; + + @override + String get onlineKeyBackupEnabled => + 'La copia de seguridad de la clave en línea está habilitada'; + + @override + String get oopsPushError => + '¡UPS¡ Desafortunadamente, se produjo un error al configurar las notificaciones push.'; + + @override + String get oopsSomethingWentWrong => 'Ups, algo salió mal…'; + + @override + String get openAppToReadMessages => + 'Abrir la aplicación para leer los mensajes'; + + @override + String get openCamera => 'Abrir cámara'; + + @override + String get openVideoCamera => 'Abrir la cámara para un video'; + + @override + String get oneClientLoggedOut => + 'Se ha cerrado en la sesión de uno de sus clientes'; + + @override + String get addAccount => 'Añadir cuenta'; + + @override + String get editBundlesForAccount => 'Editar paquetes para esta cuenta'; + + @override + String get addToBundle => 'Agregar al paquete'; + + @override + String get removeFromBundle => 'Quitar de este paquete'; + + @override + String get bundleName => 'Nombre del paquete'; + + @override + String get enableMultiAccounts => + '(BETA) habilite varias cuenta en este dispositivo'; + + @override + String get openInMaps => 'Abrir en maps'; + + @override + String get link => 'Link'; + + @override + String get serverRequiresEmail => + 'Este servidor necesita validar su dirección de correo electrónico para registrarse.'; + + @override + String get or => 'O'; + + @override + String get participant => 'Participante'; + + @override + String get passphraseOrKey => 'contraseña o clave de recuperación'; + + @override + String get password => 'Contraseña'; + + @override + String get passwordForgotten => 'Contraseña olvidada'; + + @override + String get passwordHasBeenChanged => 'La contraseña ha sido cambiada'; + + @override + String get hideMemberChangesInPublicChats => + 'Ocultar cambios de miembros en salas públicas'; + + @override + String get hideMemberChangesInPublicChatsBody => + 'No mostrar en el chat que alguien entra o sale de una sala pública para mejorar la inteligibilidad.'; + + @override + String get overview => 'Vista general'; + + @override + String get notifyMeFor => 'Notificarme'; + + @override + String get passwordRecoverySettings => 'Ajustes de recuperación de clave'; + + @override + String get passwordRecovery => 'Recuperación de contraseña'; + + @override + String get people => 'Personas'; + + @override + String get pickImage => 'Elegir imagen'; + + @override + String get pin => 'Pin'; + + @override + String play(String fileName) { + return 'Reproducir $fileName'; + } + + @override + String get pleaseChoose => 'Por favor elija'; + + @override + String get pleaseChooseAPasscode => 'Elija un código de acceso'; + + @override + String get pleaseClickOnLink => + 'Haga clic en el enlace del correo electrónico y luego continúe.'; + + @override + String get pleaseEnter4Digits => + 'Ingrese 4 dígitos o déjelo en blanco para deshabilitar el bloqueo de la aplicación.'; + + @override + String get pleaseEnterRecoveryKey => + 'Por favor, introduzca su clave de recuperación:'; + + @override + String get pleaseEnterYourPassword => 'Por favor ingrese su contraseña'; + + @override + String get pleaseEnterYourPin => 'Por favor ingrese su PIN'; + + @override + String get pleaseEnterYourUsername => + 'Por favor ingrese su nombre de usuario'; + + @override + String get pleaseFollowInstructionsOnWeb => + 'Por favor, siga las instrucciones del sitio web y presione \"siguiente\".'; + + @override + String get privacy => 'Privacidad'; + + @override + String get publicRooms => 'Salas públicas'; + + @override + String get pushRules => 'Regla de Push'; + + @override + String get reason => 'Razón'; + + @override + String get recording => 'Grabando'; + + @override + String redactedBy(String username) { + return 'Censurado por $username'; + } + + @override + String get directChat => 'Chat directo'; + + @override + String redactedByBecause(String username, String reason) { + return 'Censurado por $username porque: \"$reason\"'; + } + + @override + String redactedAnEvent(String username) { + return '$username censuró un suceso'; + } + + @override + String get redactMessage => 'Censurar mensaje'; + + @override + String get register => 'Registrarse'; + + @override + String get reject => 'Rechazar'; + + @override + String rejectedTheInvitation(String username) { + return '$username rechazó la invitación'; + } + + @override + String get rejoin => 'Volver a unirse'; + + @override + String get removeAllOtherDevices => 'Eliminar todos los otros dispositivos'; + + @override + String removedBy(String username) { + return 'Eliminado por $username'; + } + + @override + String get removeDevice => 'Eliminar dispositivo'; + + @override + String get unbanFromChat => 'Eliminar la expulsión'; + + @override + String get removeYourAvatar => 'Quitar tu avatar'; + + @override + String get replaceRoomWithNewerVersion => + 'Reemplazar habitación con una versión más nueva'; + + @override + String get reply => 'Responder'; + + @override + String get reportMessage => 'Mensaje de informe'; + + @override + String get translateMessage => 'Translate message'; + + @override + String get translatedMessage => 'Translated message'; + + @override + String get errorTranslatingMessage => + 'An error has occured while translating the message.'; + + @override + String get recoverMessage => 'Recover message'; + + @override + String get recoveredMessage => 'Recovered message'; + + @override + String get errorRecoveringMessage => + 'An error has occured while recovering the message.'; + + @override + String get errorRecoveringMessageNoAdmin => + 'This feature is available on Synapse homeservers only for adminstrators.'; + + @override + String get requestPermission => 'Solicitar permiso'; + + @override + String get roomHasBeenUpgraded => 'La sala ha subido de categoría'; + + @override + String get roomVersion => 'Versión de sala'; + + @override + String get saveFile => 'Guardar el archivo'; + + @override + String get retry => 'Retry'; + + @override + String get search => 'Buscar'; + + @override + String get security => 'Seguridad'; + + @override + String get recoveryKey => 'Clave de recuperación'; + + @override + String get recoveryKeyLost => '¿Perdió su clave de recuperación?'; + + @override + String seenByUser(String username) { + return 'Visto por $username'; + } + + @override + String get send => 'Enviar'; + + @override + String get sendAMessage => 'Enviar un mensaje'; + + @override + String get sendAsText => 'Enviar como texto'; + + @override + String get sendAudio => 'Enviar audio'; + + @override + String get sendFile => 'Enviar un archivo'; + + @override + String get sendImage => 'Enviar una imagen'; + + @override + String sendImages(int count) { + return 'Envío de la imagen $count'; + } + + @override + String get sendMessages => 'Enviar mensajes'; + + @override + String get sendOriginal => 'Enviar el original'; + + @override + String get sendSticker => 'Enviar stickers'; + + @override + String get sendVideo => 'Enviar video'; + + @override + String sentAFile(String username) { + return '$username envió un archivo'; + } + + @override + String sentAnAudio(String username) { + return '$username envió un audio'; + } + + @override + String sentAPicture(String username) { + return '$username envió una imagen'; + } + + @override + String sentASticker(String username) { + return '$username envió un sticker'; + } + + @override + String sentAVideo(String username) { + return '$username envió un video'; + } + + @override + String sentCallInformations(String senderName) { + return '$senderName envió información de la llamada'; + } + + @override + String get separateChatTypes => 'Separar chats directos de grupos'; + + @override + String get setAsCanonicalAlias => 'Fijar alias principal'; + + @override + String get setCustomEmotes => 'Establecer emoticonos personalizados'; + + @override + String get setChatDescription => 'Establecer descripción del chat'; + + @override + String get setInvitationLink => 'Establecer enlace de invitación'; + + @override + String get setPermissionsLevel => 'Establecer nivel de permisos'; + + @override + String get setStatus => 'Establecer estado'; + + @override + String get settings => 'Ajustes'; + + @override + String get share => 'Compartir'; + + @override + String sharedTheLocation(String username) { + return '$username compartió la ubicación'; + } + + @override + String get shareLocation => 'Compartir ubicación'; + + @override + String get showPassword => 'Mostrar contraseña'; + + @override + String get presenceStyle => 'Presencia:'; + + @override + String get hideAvatarsInInvites => 'Hide avatars in invites'; + + @override + String get hideAvatarsInInvitesDescription => + 'Do not show room avatars in invites'; + + @override + String get presencesToggle => 'Mostrar mensajes de estado de otros usuarios'; + + @override + String get pureBlackToggle => 'Pure Black'; + + @override + String get singlesignon => 'Inicio de sesión único'; + + @override + String get skip => 'Omitir'; + + @override + String get sourceCode => 'Código fuente'; + + @override + String get spaceIsPublic => 'El espacio es público'; + + @override + String get spaceName => 'Nombre del espacio'; + + @override + String startedACall(String senderName) { + return '$senderName comenzó una llamada'; + } + + @override + String get startFirstChat => 'Comience su primer chat'; + + @override + String get status => 'Estado'; + + @override + String get statusExampleMessage => '¿Cómo estás hoy?'; + + @override + String get submit => 'Enviar'; + + @override + String get synchronizingPleaseWait => 'Sincronizando... por favor espere.'; + + @override + String synchronizingPleaseWaitCounter(String percentage) { + return ' Sincronizando… ($percentage%)'; + } + + @override + String get systemTheme => 'Sistema'; + + @override + String get theyDontMatch => 'No coinciden'; + + @override + String get theyMatch => 'Coinciden'; + + @override + String get title => 'Extera'; + + @override + String get toggleFavorite => 'Alternar favorito'; + + @override + String get toggleMuted => 'Alternar silenciado'; + + @override + String get toggleUnread => 'Marcar como: leído / no leído'; + + @override + String get tooManyRequestsWarning => + 'Demasiadas solicitudes. ¡Por favor inténtelo más tarde!'; + + @override + String get transferFromAnotherDevice => 'Transferir desde otro dispositivo'; + + @override + String get tryToSendAgain => 'Intentar enviar nuevamente'; + + @override + String get unavailable => 'Indisponible'; + + @override + String unbannedUser(String username, String targetName) { + return '$username admitió a $targetName nuevamente'; + } + + @override + String get unblockDevice => 'Desbloquear dispositivo'; + + @override + String get unknownDevice => 'Dispositivo desconocido'; + + @override + String get unknownEncryptionAlgorithm => 'Algoritmo de cifrado desconocido'; + + @override + String unknownEvent(String type) { + return 'Evento desconocido \'$type\''; + } + + @override + String get unmuteChat => 'Dejar de silenciar el chat'; + + @override + String get unpin => 'Despinchar'; + + @override + String unreadChats(int unreadCount) { + String _temp0 = intl.Intl.pluralLogic( + unreadCount, + locale: localeName, + other: '$unreadCount chats no leídos', + one: '1 chat no leído', + ); + return '$_temp0'; + } + + @override + String userAndOthersAreTyping(String username, int count) { + return '$username y $count más están escribiendo…'; + } + + @override + String userAndUserAreTyping(String username, String username2) { + return '$username y $username2 están escribiendo…'; + } + + @override + String userIsTyping(String username) { + return '$username está escribiendo…'; + } + + @override + String userLeftTheChat(String username) { + return '$username abandonó el chat'; + } + + @override + String get username => 'Nombre de usuario'; + + @override + String userSentUnknownEvent(String username, String type) { + return '$username envió un evento $type'; + } + + @override + String get unverified => 'No verificado'; + + @override + String get verified => 'Verificado'; + + @override + String get verify => 'Verificar'; + + @override + String get verifyStart => 'Comenzar verificación'; + + @override + String get verifySuccess => '¡Has verificado exitosamente!'; + + @override + String get verifyTitle => 'Verificando la otra cuenta'; + + @override + String get videoCall => 'Video llamada'; + + @override + String get visibilityOfTheChatHistory => 'Visibilidad del historial del chat'; + + @override + String get visibleForAllParticipants => + 'Visible para todos los participantes'; + + @override + String get visibleForEveryone => 'Visible para todo el mundo'; + + @override + String get voiceMessage => 'Mensaje de voz'; + + @override + String get waitingPartnerAcceptRequest => + 'Esperando a que el socio acepte la solicitud…'; + + @override + String get waitingPartnerEmoji => + 'Esperando a que el socio acepte los emojis…'; + + @override + String get waitingPartnerNumbers => + 'Esperando a que el socio acepte los números…'; + + @override + String get wallpaper => 'Fondo de pantalla:'; + + @override + String get warning => '¡Advertencia!'; + + @override + String get weSentYouAnEmail => 'Te enviamos un correo electrónico'; + + @override + String get whoCanPerformWhichAction => 'Quién puede realizar qué acción'; + + @override + String get whoIsAllowedToJoinThisGroup => + 'Quién tiene permitido unirse al grupo'; + + @override + String get whyDoYouWantToReportThis => '¿Por qué quieres denunciar esto?'; + + @override + String get wipeChatBackup => + '¿Limpiar la copia de seguridad de tu chat para crear una nueva clave de recuperación?'; + + @override + String get withTheseAddressesRecoveryDescription => + 'Con esta dirección puede recuperar su contraseña.'; + + @override + String get writeAMessage => 'Escribe un mensaje…'; + + @override + String get yes => 'Sí'; + + @override + String get you => 'Tú'; + + @override + String get youAreNoLongerParticipatingInThisChat => + 'Ya no estás participando en este chat'; + + @override + String get youHaveBeenBannedFromThisChat => 'Has sido vetado de este chat'; + + @override + String get yourPublicKey => 'Tu clave pública'; + + @override + String get messageInfo => 'Información del mensaje'; + + @override + String get time => 'Tiempo'; + + @override + String get messageType => 'Tipo de Mensaje'; + + @override + String get sender => 'Remitente'; + + @override + String get openGallery => 'Abrir galería'; + + @override + String get removeFromSpace => 'Eliminar del espacio'; + + @override + String get addToSpaceDescription => + 'Elige un espacio para añadirle este chat.'; + + @override + String get start => 'Iniciar'; + + @override + String get pleaseEnterRecoveryKeyDescription => + 'Para desbloquear sus viejos mensajes, introduzca su clave de recuperación que se generó en una sesión anterior. Su clave de recuperación NO es su contraseña.'; + + @override + String get publish => 'Publicar'; + + @override + String videoWithSize(String size) { + return 'Video ($size)'; + } + + @override + String get openChat => 'Abrir chat'; + + @override + String get markAsRead => 'Marcar como leído'; + + @override + String get reportUser => 'Reportar usuario'; + + @override + String get dismiss => 'Descartar'; + + @override + String reactedWith(String sender, String reaction) { + return '$sender reaccionó con $reaction'; + } + + @override + String get pinMessage => 'Anclar a la sala'; + + @override + String get confirmEventUnpin => + '¿Seguro que quiere desfijar permanentemente el evento?'; + + @override + String get emojis => 'Emojis'; + + @override + String get placeCall => 'Llamar'; + + @override + String get voiceCall => 'Llamada de voz'; + + @override + String get unsupportedAndroidVersion => 'Versión de Android no compatible'; + + @override + String get unsupportedAndroidVersionLong => + 'Esta característica requiere una versión más reciente de Android. Por favor, compruebe las actualizaciones o la compatibilidad de LineageOS.'; + + @override + String get videoCallsBetaWarning => + 'Tenga en cuenta que las videollamadas están actualmente en fase beta. Es posible que no funcionen como se espera o que no funcionen de ninguna manera en algunas plataformas.'; + + @override + String get experimentalVideoCalls => 'Videollamadas experimentales'; + + @override + String get emailOrUsername => 'Correo electrónico o nombre de usuario'; + + @override + String get indexedDbErrorTitle => 'Problemas con el modo privado'; + + @override + String get indexedDbErrorLong => + 'El almacenamiento de mensajes, por desgracia, no está habilitado en el modo privado por defecto.\nPor favor, visite\n - about:config\n - Establezca dom.indexedDB.privateBrowsing.enabled a true\nDe otra forma, no es posible usar Extera.'; + + @override + String switchToAccount(String number) { + return 'Cambiar a la cuenta $number'; + } + + @override + String get nextAccount => 'Siguiente cuenta'; + + @override + String get previousAccount => 'Cuenta anterior'; + + @override + String get addWidget => 'Añadir widget'; + + @override + String get widgetVideo => 'Vídeo'; + + @override + String get widgetEtherpad => 'Nota de texto'; + + @override + String get widgetJitsi => 'Jitsi Meet'; + + @override + String get widgetCustom => 'Personalizado'; + + @override + String get widgetName => 'Nombre'; + + @override + String get widgetUrlError => 'Esta no es una URL válida.'; + + @override + String get widgetNameError => 'Por favor proporciona un nombre para mostrar.'; + + @override + String get errorAddingWidget => 'Fallo al añadir el widget.'; + + @override + String get youRejectedTheInvitation => 'Rechazaste la invitación'; + + @override + String get youJoinedTheChat => 'Usted se ha unido al chat'; + + @override + String get youAcceptedTheInvitation => '👍 Aceptaste la invitación'; + + @override + String youBannedUser(String user) { + return 'Usted prohibió el acceso a $user'; + } + + @override + String youHaveWithdrawnTheInvitationFor(String user) { + return 'Usted retiró la invitación a $user'; + } + + @override + String youInvitedToBy(String alias) { + return '📩 Te han invitado con un enlace a:\n$alias'; + } + + @override + String youInvitedBy(String user) { + return '📩 Has sido invitado por $user'; + } + + @override + String invitedBy(String user) { + return '📩 Invitado por $user'; + } + + @override + String youInvitedUser(String user) { + return '📩 Usted invitó a $user'; + } + + @override + String youKicked(String user) { + return '👞 Usted expulsó a $user'; + } + + @override + String youKickedAndBanned(String user) { + return '🙅 Usted expulsó y prohibió el acceso a $user'; + } + + @override + String youUnbannedUser(String user) { + return 'Usted volvió a permitir el acceso a $user'; + } + + @override + String hasKnocked(String user) { + return '🚪 $user ha avisado'; + } + + @override + String get usersMustKnock => 'Los usuarios han de avisar'; + + @override + String get noOneCanJoin => 'Nadie puede unirse'; + + @override + String userWouldLikeToChangeTheChat(String user) { + return '$user quiere unirse al chat.'; + } + + @override + String get noPublicLinkHasBeenCreatedYet => + 'No se ha creado un enlace público aún'; + + @override + String get knock => 'Aviso'; + + @override + String get users => 'Usuarios'; + + @override + String get unlockOldMessages => 'Desbloquear mensajes viejos'; + + @override + String get storeInSecureStorageDescription => + 'Almacenar la clave de recuperación en el almacenamiento seguro de este dispositivo.'; + + @override + String get saveKeyManuallyDescription => + 'Compartir esta clave manualmente usando el diálogo de compartir del sistema o el portapapeles.'; + + @override + String get storeInAndroidKeystore => 'Almacenar en la KeyStore de Android'; + + @override + String get storeInAppleKeyChain => 'Almacenar en la KeyChain de Apple'; + + @override + String get storeSecurlyOnThisDevice => + 'Almacenar de forma segura en este dispositivo'; + + @override + String countFiles(int count) { + return '$count archivos'; + } + + @override + String get user => 'Usuario'; + + @override + String get custom => 'Personalizado'; + + @override + String get foregroundServiceRunning => + 'Esta notificación aparece cuando el servicio en segundo plano se está ejecutando.'; + + @override + String get screenSharingTitle => 'Compartir la pantalla'; + + @override + String get screenSharingDetail => + 'Usted está compartiendo su pantalla en Extera'; + + @override + String get callingPermissions => 'Permisos de llamadas'; + + @override + String get callingAccount => 'Llamando a cuenta'; + + @override + String get callingAccountDetails => + 'Permite a Extera utilizar la aplicación de llamadas nativa de Android.'; + + @override + String get appearOnTop => 'Aparecer en la cima'; + + @override + String get appearOnTopDetails => + 'Permite que la app aparezca delante (no hace falta si ya tienes Fluffychat configurado como cuenta llamante)'; + + @override + String get otherCallingPermissions => + 'Micrófono, cámara y otros permisos de Extera'; + + @override + String get whyIsThisMessageEncrypted => + '¿Por qué no se puede leer este mensaje?'; + + @override + String get noKeyForThisMessage => + 'Esto puede ocurrir si el mensaje se envió antes de que entraras en tu cuenta en este dispositivo.\n\nTambién puede que el remitente haya bloqueado tu dispositivo o haya fallado algo en la conexión a Internet.\n\n¿Puedes leer el mensaje en otra sesión? Entonces, ¡puedes transferir el mensaje desde allí! Ve a Ajustes > Dispositivos y asegúrate de que tus dispositivos se han verificado mutuamente. Cuando abras la sala la próxima vez y ambas sesiones estén en primer plano, las claves se transmitirán automáticamente.\n\n¿No quieres perder las claves al salir o al cambiar de dispositivo? Asegúrate de que has habilitado la copia de seguridad del chat en los ajustes.'; + + @override + String get newGroup => 'Nuevo grupo'; + + @override + String get newSpace => 'Nuevo espacio'; + + @override + String get enterSpace => 'Unirse al espacio'; + + @override + String get enterRoom => 'Unirse a la sala'; + + @override + String get allSpaces => 'Todos los espacios'; + + @override + String numChats(String number) { + return '$number chats'; + } + + @override + String get hideUnimportantStateEvents => + 'Ocultar eventos de estado no importantes'; + + @override + String get hidePresences => '¿Esconder la lista de estado?'; + + @override + String get doNotShowAgain => 'No mostrar de nuevo'; + + @override + String wasDirectChatDisplayName(String oldDisplayName) { + return 'Chat vacío (era $oldDisplayName)'; + } + + @override + String get newSpaceDescription => + 'Los espacios permiten consolidar los chats y montar comunidades privadas o públicas.'; + + @override + String get encryptThisChat => 'Cifrar este chat'; + + @override + String get disableEncryptionWarning => + 'Por motivos de seguridad no es posible deshabilitar el cifrado en un chat si ha sido habilitado previamente.'; + + @override + String get sorryThatsNotPossible => 'Lo siento... eso no es posible'; + + @override + String get deviceKeys => 'Claves de dispositivo:'; + + @override + String get reopenChat => 'Reabrir chat'; + + @override + String get noBackupWarning => + '¡Cuidado! Si no se habilita la copia de seguridad del chat, perderás acceso a tus mensajes cifrados. Se recomienda encarecidamente habilitar la copia de seguridad del chat antes de salir.'; + + @override + String get noOtherDevicesFound => 'No se han encontrado otros dispositivos'; + + @override + String fileIsTooBigForServer(String max) { + return '¡No se pudo mandar! El servidor solamente permite adjuntos de hasta $max.'; + } + + @override + String fileHasBeenSavedAt(String path) { + return 'Archivo guardado en $path'; + } + + @override + String get jumpToLastReadMessage => 'Saltar al último mensaje leído'; + + @override + String get readUpToHere => 'Leer hasta aquí'; + + @override + String get jump => 'Saltar'; + + @override + String get openLinkInBrowser => 'Abrir enlace en navegador'; + + @override + String get reportErrorDescription => + '😭 Oh, no. Algo ha salido mal. Si quieres, puedes informar de este fallo a los desarrolladores.'; + + @override + String get report => 'informe'; + + @override + String get signInWithPassword => 'Entrar con clave'; + + @override + String get pleaseTryAgainLaterOrChooseDifferentServer => + 'Por favor, intente luego o elija un servidor distinto.'; + + @override + String signInWith(String provider) { + return 'Entrar con $provider'; + } + + @override + String get profileNotFound => + 'El usuario no se encontró en el servidor. Puede que haya un problema de conexión o el usuario no exista.'; + + @override + String get setTheme => 'Poner tema:'; + + @override + String get setColorTheme => 'Poner tema de color:'; + + @override + String get invite => 'Invitación'; + + @override + String get inviteGroupChat => '📨 Invitar a grupo de chat'; + + @override + String get invitePrivateChat => '📨 Invitar a chat privado'; + + @override + String get invalidInput => '¡Entrada no válida!'; + + @override + String wrongPinEntered(int seconds) { + return '¡Pin erróneo! Vuelve a intenrarlo en $seconds segundos...'; + } + + @override + String get pleaseEnterANumber => 'Por favor pon un número mayor que 0'; + + @override + String get archiveRoomDescription => + 'El chat se moverá al archivo. Otros usuarios podrán ver que has abandonado el chat.'; + + @override + String get roomUpgradeDescription => + 'El chat se volverá a crear con la nueva versión de sala. Todos los participantes serán notificados de que tienen que cambiarse al nuevo chat. Puedes encontrar más información sobre versiones de salas en https://spec.matrix.org/latest/rooms/'; + + @override + String get removeDevicesDescription => + 'Vas a salir en este dispositivo y ya no podrás recibir mensajes.'; + + @override + String get banUserDescription => + 'Se expulsará al usuario del chat y no podrá volver a entrar hasta que se le permita.'; + + @override + String get unbanUserDescription => + 'El usuario podrá entrar al chat de nuevo si lo intenta.'; + + @override + String get kickUserDescription => + 'Se expulsa al usuario del chat, pero no se le prohíbe volver a entrar. En chats públicos, el usuario podrá volver a entrar en cualquier momento.'; + + @override + String get makeAdminDescription => + 'Una vez hagas que este usuario sea admin, puede que no puedas deshacerlo porque tendrá los mismos permisos que tú.'; + + @override + String get pushNotificationsNotAvailable => + 'No están disponibles las notificaciones emergentes'; + + @override + String get learnMore => 'Aprender más'; + + @override + String get yourGlobalUserIdIs => 'Tu id de usuario global es: '; + + @override + String noUsersFoundWithQuery(String query) { + return 'Desgraciadamente, no se encontró ningún usuario con \"$query\". Por favor, revisa si cometiste un error.'; + } + + @override + String get knocking => 'Avisando'; + + @override + String chatCanBeDiscoveredViaSearchOnServer(String server) { + return 'El chat se puede descubrir buscando en $server'; + } + + @override + String get searchChatsRooms => 'Buscar #chats, @usuarios...'; + + @override + String get nothingFound => 'No se encontró nada...'; + + @override + String get groupName => 'Nombre de grupo'; + + @override + String get createGroupAndInviteUsers => 'Crear un grupo e invitar usuarios'; + + @override + String get groupCanBeFoundViaSearch => + 'Los grupos se pueden encontrar buscando'; + + @override + String get wrongRecoveryKey => + 'Lo siento... esta no parece ser la clave de recuperación correcta.'; + + @override + String get startConversation => 'Iniciar conversación'; + + @override + String get commandHint_sendraw => 'Mandar json pelado'; + + @override + String get databaseMigrationTitle => 'La base de datos está optimizada'; + + @override + String get databaseMigrationBody => + 'Por favor espera. Esto llevará un momento.'; + + @override + String get leaveEmptyToClearStatus => 'Deja vacío para limpiar tu estado.'; + + @override + String get select => 'Elegir'; + + @override + String get searchForUsers => 'Buscar @usuarios...'; + + @override + String get pleaseEnterYourCurrentPassword => 'Por favor, pon tu clave actual'; + + @override + String get newPassword => 'Nueva clave'; + + @override + String get pleaseChooseAStrongPassword => 'Por favor, pon una clave fuerte'; + + @override + String get passwordsDoNotMatch => 'Las claves no coinciden'; + + @override + String get passwordIsWrong => 'La clave que has puesto es incorrecta'; + + @override + String get publicLink => 'Enlace público'; + + @override + String get publicChatAddresses => 'Dirección de chat pública'; + + @override + String get createNewAddress => 'Crear nueva dirección'; + + @override + String get joinSpace => 'Unirse al espacio'; + + @override + String get publicSpaces => 'Espacios públicos'; + + @override + String get addChatOrSubSpace => 'Añadir chat o sub espacio'; + + @override + String get subspace => 'Sub espacio'; + + @override + String get decline => 'Declinar'; + + @override + String get thisDevice => 'Este dispositivo:'; + + @override + String get initAppError => 'Hubo un error al arrancar la app'; + + @override + String get userRole => 'Rol de usuario'; + + @override + String minimumPowerLevel(String level) { + return '$level es el nivel mínimo.'; + } + + @override + String searchIn(String chat) { + return 'Buscar en chat \"$chat\"...'; + } + + @override + String get searchMore => 'Buscar más...'; + + @override + String get gallery => 'Galería'; + + @override + String get files => 'Archivos'; + + @override + String databaseBuildErrorBody(String url, String error) { + return 'No pude crear la base de datos SQlite. La app intenta usar la base de datos heredada por ahora. Por favor, informa de este error a los desarrolladores en $url. El mensaje de error es: $error'; + } + + @override + String sessionLostBody(String url, String error) { + return 'Se perdió tu sesión. Por favor, informa de este error a los desarrolladores en $url. El mensaje de error es: $error'; + } + + @override + String restoreSessionBody(String url, String error) { + return 'La app ahora trata de recuperar tu sesión de la copia de seguridad. Por favor, informa de este error a los desarrolladores en $url. El mensaje de error es: $error'; + } + + @override + String forwardMessageTo(String roomName) { + return '¿Reenviar mensaje a $roomName?'; + } + + @override + String get sendReadReceipts => 'Mandar recibos de lectura'; + + @override + String get sendTypingNotificationsDescription => + 'Otros participantes en un chat pueden ver cuándo estás escribiendo un mensaje.'; + + @override + String get sendReadReceiptsDescription => + 'Otros participantes en un chat pueden ver cuándo has leído un mensaje.'; + + @override + String get formattedMessages => 'Mensajes con formato'; + + @override + String get formattedMessagesDescription => + 'Mostrar contenido de mensaje enriquecido, como texto en negrita, usando markdown.'; + + @override + String get verifyOtherUser => '🔐 Verificar a otro usuario'; + + @override + String get verifyOtherUserDescription => + 'Si verificas a otro usuario, puedes estar seguro de a quién estás escribiendo realmente. 💪\n\nCuando empiezas una verificación, tú y el otro usuario veréis una ventana emergente en la app. En ella veréis una serie de emojiso números que tenéis que comparar.\n\nLa mejor forma de hacer esto es quedar o una videollamada. 👭'; + + @override + String get verifyOtherDevice => '🔐 Verificar otro dispositivo'; + + @override + String get verifyOtherDeviceDescription => + 'Cuando verificas otro dispositivo, esos dispositivos pueden intercambiar claves, incrementando tu seguridad global. 💪 Cuando inicias una verificación, aparece una ventana en la app en ambos dispositivos. En ella, verás una serie de emojis o números que tienes que comparar. Es mejor tener ambos dispositivos a mano antes de empezar la verificación. 🤳'; + + @override + String acceptedKeyVerification(String sender) { + return '$sender aceptó la verificación de clave'; + } + + @override + String canceledKeyVerification(String sender) { + return '$sender canceló la verificación de clave'; + } + + @override + String completedKeyVerification(String sender) { + return '$sender completó la verificación de clave'; + } + + @override + String isReadyForKeyVerification(String sender) { + return '$sender está preparado para verificación de clave'; + } + + @override + String requestedKeyVerification(String sender) { + return '$sender ha pedido verificación de clave'; + } + + @override + String startedKeyVerification(String sender) { + return '$sender ha comenzado verificación de clave'; + } + + @override + String get transparent => 'Transparente'; + + @override + String get incomingMessages => 'Mensajes entrantes'; + + @override + String get stickers => 'Pegatinas'; + + @override + String get discover => 'Descubrir'; + + @override + String get commandHint_ignore => 'Ignorar la ID de matrix dada'; + + @override + String get commandHint_unignore => 'No ignorar la ID de matrix dada'; + + @override + String unreadChatsInApp(String appname, String unread) { + return '$appname: $unread chats no leídos'; + } + + @override + String get noDatabaseEncryption => + 'En esta plataforma no hay cifrado de base de datos'; + + @override + String thereAreCountUsersBlocked(Object count) { + return 'Ahora mismo, hay $count usuarios bloqueados.'; + } + + @override + String get restricted => 'Restringido'; + + @override + String get knockRestricted => 'Aviso restringido'; + + @override + String goToSpace(Object space) { + return 'Ir al espacio: $space'; + } + + @override + String get markAsUnread => 'Marcar no leído'; + + @override + String userLevel(int level) { + return '$level - Usuario'; + } + + @override + String moderatorLevel(int level) { + return '$level - Moderador'; + } + + @override + String adminLevel(int level) { + return '$level - Administrador'; + } + + @override + String get changeGeneralChatSettings => + 'Cambiar los ajustes generales de chat'; + + @override + String get inviteOtherUsers => 'Invitar a otros usuarios a este chat'; + + @override + String get changeTheChatPermissions => 'Cambiar los permisos de chat'; + + @override + String get changeTheVisibilityOfChatHistory => + 'Cambiar la visibilidad de la historia de chat'; + + @override + String get changeTheCanonicalRoomAlias => + 'Cambiar la dirección pública principal de chat'; + + @override + String get sendRoomNotifications => 'Mandar notificación @sala'; + + @override + String get changeTheDescriptionOfTheGroup => + 'Cambiar la descripción del chat'; + + @override + String get chatPermissionsDescription => + 'Definir el nivel necesario para ciertas acciones en este chat. Los niveles 0, 50 y 100 habitualmente representan usuarios, moderadores y administradores, pero se puede establecer cualquier escala.'; + + @override + String updateInstalled(String version) { + return '¡🎉 Actualización $version instalada!'; + } + + @override + String get changelog => 'Cambios'; + + @override + String get sendCanceled => 'Envío cancelado'; + + @override + String get loginWithMatrixId => 'Entrar con un ID de Matrix'; + + @override + String get discoverHomeservers => 'Descubrir homeservers'; + + @override + String get whatIsAHomeserver => '¿Qué es un homeserver?'; + + @override + String get homeserverDescription => + 'Todos tus datos se guardan en el homeserver, como en un proveedor de correo electrónico. Puedes elegir el homeserver que quieres usar, a la par que te puedes comunicar con todos. Más en https://matrix.org.'; + + @override + String get doesNotSeemToBeAValidHomeserver => + 'No parece ser un homeserver compatible. ¿URL equivocada?'; + + @override + String get calculatingFileSize => 'Calculando tamaño de archivo...'; + + @override + String get prepareSendingAttachment => 'Prepara envío del adjunto...'; + + @override + String get sendingAttachment => 'Enviando adjunto...'; + + @override + String get generatingVideoThumbnail => 'Generando miniatura de vídeo...'; + + @override + String get compressVideo => 'Comprimiendo vídeo...'; + + @override + String sendingAttachmentCountOfCount(int index, int length) { + return 'Enviando adjunto $index de $length...'; + } + + @override + String serverLimitReached(int seconds) { + return '¡Alcanzado límite del servidor! Esperando $seconds segundos...'; + } + + @override + String get oneOfYourDevicesIsNotVerified => + 'Uno de tus dispositivos no está verificado'; + + @override + String get noticeChatBackupDeviceVerification => + 'Nota: Cuando conectas todos tus dispositivos a la copia de seguridad del chat, son verificados automáticamente.'; + + @override + String get continueText => 'Continuar'; + + @override + String get welcomeText => + 'Eh, eh, 👋 Esto es Extera. Puedes acceder a cualquier homeserver, que sea compatible con https://matrix.org. Y luego chatear con cualquiera. ¡Es una red de mensajería descentralizada enorme!'; + + @override + String get blur => 'Difuminar:'; + + @override + String get opacity => 'Opacidad:'; + + @override + String get setWallpaper => 'Poner fondo'; + + @override + String get manageAccount => 'Gestionar cuenta'; + + @override + String get noContactInformationProvided => + 'El servidor no suministra ninguna información de contacto válida'; + + @override + String get contactServerAdmin => + 'Contactar con el administrador del servidor'; + + @override + String get contactServerSecurity => 'Contactar con seguridad del servidor'; + + @override + String get supportPage => 'Página de atención'; + + @override + String get serverInformation => 'Información del servidor:'; + + @override + String get name => 'Nombre'; + + @override + String get version => 'Versión'; + + @override + String get website => 'Web'; + + @override + String get compress => 'Comprimir'; + + @override + String get boldText => 'Texto en negrita'; + + @override + String get italicText => 'Texto en cursiva'; + + @override + String get strikeThrough => 'Tachado'; + + @override + String get pleaseFillOut => 'Por favor, rellenar'; + + @override + String get invalidUrl => 'URL incorrecta'; + + @override + String get addLink => 'Añadir enlace'; + + @override + String get unableToJoinChat => + 'No se puede entrar al chat. Puede que la otra parte ya haya cerrado la conversación.'; + + @override + String get previous => 'Anterior'; + + @override + String get otherPartyNotLoggedIn => + 'La otra parte ahora mismo no está conectada y por tanto ¡no puede recibir mensajes!'; + + @override + String appWantsToUseForLogin(String server) { + return 'Usar \'$server\' para entrar'; + } + + @override + String get appWantsToUseForLoginDescription => + 'Por la presente permites a la app y web compartir información sobre ti.'; + + @override + String get open => 'Abrir'; + + @override + String get waitingForServer => 'Esperando al servidor...'; + + @override + String get appIntroduction => + 'Extera te permite chatear con tus amigos con diferentes mensajerías. Aprende más en https://matrix.org o simplemente pincha *Continuar*.'; + + @override + String get newChatRequest => '📩 Nueva petición de chat'; + + @override + String get contentNotificationSettings => + 'Ajustes de notificación de contenido'; + + @override + String get generalNotificationSettings => 'Ajustes de notificación generales'; + + @override + String get roomNotificationSettings => 'Ajustes de notificación de salas'; + + @override + String get userSpecificNotificationSettings => + 'Ajustes de notificación por usuario'; + + @override + String get otherNotificationSettings => 'Otros ajustes de notificación'; + + @override + String get notificationRuleContainsUserName => 'Contiene nombre de usuario'; + + @override + String get notificationRuleContainsUserNameDescription => + 'Notifica al usuario cuando un mensaje contiene su nombre de usuario.'; + + @override + String get notificationRuleMaster => 'Silenciar todas las notificaciones'; + + @override + String get notificationRuleMasterDescription => + 'Anula todas las demás reglas y desactiva todas las notificaciones.'; + + @override + String get notificationRuleSuppressNotices => + 'Suprimir los mensajes automáticos'; + + @override + String get notificationRuleSuppressNoticesDescription => + 'Suprimir notificaciones de clientes automáticos, como bots.'; + + @override + String get notificationRuleInviteForMe => 'Invitación para mí'; + + @override + String get notificationRuleInviteForMeDescription => + 'Notifica al usuario cuando se les invita a una sala.'; + + @override + String get notificationRuleMemberEvent => 'Evento para miembros'; + + @override + String get notificationRuleMemberEventDescription => + 'Suprimir notificaciones de eventos para miembros.'; + + @override + String get notificationRuleIsUserMention => 'Mención al usuario'; + + @override + String get notificationRuleIsUserMentionDescription => + 'Notifica al usuario cuando son mencionados directamente en un mensaje.'; + + @override + String get notificationRuleContainsDisplayName => + 'Contiene el nombre visible'; + + @override + String get notificationRuleContainsDisplayNameDescription => + 'Notifica al usuario cuando un mensaje contiene su nombre visible.'; + + @override + String get notificationRuleIsRoomMention => 'Mención de sala'; + + @override + String get notificationRuleIsRoomMentionDescription => + 'Notifica al usuario cuando hay una mención de sala.'; + + @override + String get notificationRuleRoomnotif => 'Notificación de sala'; + + @override + String get notificationRuleRoomnotifDescription => + 'Notifica al usuario cuando un mensaje contiene \'@sala\'.'; + + @override + String get notificationRuleTombstone => 'Lápida'; + + @override + String get notificationRuleTombstoneDescription => + 'Notifica al usuario sobre mensajes de desactivación de sala.'; + + @override + String get notificationRuleReaction => 'Reacción'; + + @override + String get notificationRuleReactionDescription => + 'Suprime notificaciones por reacciones.'; + + @override + String get notificationRuleRoomServerAcl => 'ACL de servidor de sala'; + + @override + String get notificationRuleRoomServerAclDescription => + 'Suprime notificaciones de listas de control de acceso de servidores de sala.'; + + @override + String get notificationRuleSuppressEdits => 'Suprimir ediciones'; + + @override + String get notificationRuleSuppressEditsDescription => + 'Suprime las notificaciones de mensajes editados.'; + + @override + String get notificationRuleCall => 'Llamar'; + + @override + String get notificationRuleCallDescription => + 'Notifica al usuario de llamadas.'; + + @override + String get notificationRuleEncryptedRoomOneToOne => 'Sala cifrada uno a uno'; + + @override + String get notificationRuleEncryptedRoomOneToOneDescription => + 'Notifica al usuario sobre mensajes en salas cifradas uno a uno.'; + + @override + String get notificationRuleRoomOneToOne => 'Sala uno a uno'; + + @override + String get notificationRuleRoomOneToOneDescription => + 'Notifica al usuario sobre mensajes en salas uno a uno.'; + + @override + String get notificationRuleMessage => 'Mensaje'; + + @override + String get notificationRuleMessageDescription => + 'Notifica al usuario sobre mensajes generales.'; + + @override + String get notificationRuleEncrypted => 'Cifrado'; + + @override + String get notificationRuleEncryptedDescription => + 'Notifica al usuario sobre mensajes en salas cifradas.'; + + @override + String get notificationRuleJitsi => 'Jitsi'; + + @override + String get notificationRuleJitsiDescription => + 'Notifica al usuario sobre eventos del componente de Jitsi.'; + + @override + String get notificationRuleServerAcl => + 'Suprimir eventos de ACL del servidor'; + + @override + String get notificationRuleServerAclDescription => + 'Suprime notificaciones de eventos de ACL del servidor.'; + + @override + String unknownPushRule(String rule) { + return 'Regla de notificación desconocida \'$rule\''; + } + + @override + String get deletePushRuleCanNotBeUndone => + 'Si eliminas este ajuste de notificación, esto no se puede deshacer.'; + + @override + String get more => 'Más'; + + @override + String get shareKeysWith => 'Compartir claves con...'; + + @override + String get shareKeysWithDescription => + '¿Qué dispositivos deben ser de confianza para que puedan leer tus mensajes en chats cifrados?'; + + @override + String get allDevices => 'Todos los dispositivos'; + + @override + String get crossVerifiedDevicesIfEnabled => + 'Dispositivos verificados si están habilitados'; + + @override + String get crossVerifiedDevices => 'Dispositivos verificados'; + + @override + String get verifiedDevicesOnly => 'Solo dispositivos verificados'; + + @override + String get takeAPhoto => 'Tomar foto'; + + @override + String get recordAVideo => 'Grabar video'; + + @override + String get optionalMessage => '(Opcional) mensaje...'; + + @override + String get notSupportedOnThisDevice => + 'No es compatible con este dispositivo'; + + @override + String get enterNewChat => 'Ingresar a nuevo chat'; + + @override + String get approve => 'Approve'; + + @override + String get youHaveKnocked => 'You have knocked'; + + @override + String get pleaseWaitUntilInvited => + 'Please wait now, until someone from the room invites you.'; +} diff --git a/lib/generated/l10n/l10n_et.dart b/lib/generated/l10n/l10n_et.dart new file mode 100644 index 0000000..6aa7162 --- /dev/null +++ b/lib/generated/l10n/l10n_et.dart @@ -0,0 +1,2768 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'l10n.dart'; + +// ignore_for_file: type=lint + +/// The translations for Estonian (`et`). +class L10nEt extends L10n { + L10nEt([String locale = 'et']) : super(locale); + + @override + String get noSendPermission => 'You can\'t send messages here'; + + @override + String get alwaysUse24HourFormat => 'false'; + + @override + String get repeatPassword => 'Korda salasõna'; + + @override + String get notAnImage => 'See pole pildifail.'; + + @override + String get setCustomPermissionLevel => 'Set custom permission level'; + + @override + String get setPermissionsLevelDescription => + 'Please choose a predefined role below or enter a custom permission level between 0 and 100.'; + + @override + String get ignoreUser => 'Ignore user'; + + @override + String get normalUser => 'Normal user'; + + @override + String get remove => 'Eemalda'; + + @override + String get importNow => 'Impordi kohe'; + + @override + String get importEmojis => 'Impordi emojid'; + + @override + String get importFromZipFile => 'Impordi zip-failist'; + + @override + String get exportEmotePack => 'Ekspordi emotikonide pakk zip-failina'; + + @override + String get replace => 'Asenda'; + + @override + String get about => 'Rakenduse teave'; + + @override + String aboutHomeserver(String homeserver) { + return 'Koduserveri teave: $homeserver'; + } + + @override + String get accept => 'Nõustu'; + + @override + String acceptedTheInvitation(String username) { + return '👍 $username võttis kutse vastu'; + } + + @override + String get account => 'Kasutajakonto'; + + @override + String activatedEndToEndEncryption(String username) { + return '🔐$username võttis kasutusele läbiva krüptimise'; + } + + @override + String get addEmail => 'Lisa e-posti aadress'; + + @override + String get confirmMatrixId => + 'Konto kustutamiseks palun kinnitage oma Matrix\'i ID.'; + + @override + String supposedMxid(String mxid) { + return 'See peaks olema $mxid'; + } + + @override + String get addChatDescription => 'Lisa vestluse kirjeldus...'; + + @override + String get addToSpace => 'Lisa kogukonda'; + + @override + String get admin => 'Peakasutaja'; + + @override + String get alias => 'alias'; + + @override + String get all => 'Kõik'; + + @override + String get allChats => 'Kõik vestlused'; + + @override + String get commandHint_roomupgrade => + 'Uuenda see jututuba antud jututoa versioonini'; + + @override + String get commandHint_googly => 'Saada ühed otsivad silmad'; + + @override + String get commandHint_cuddle => 'Saada üks kaisutus'; + + @override + String get commandHint_hug => 'Saada üks kallistus'; + + @override + String googlyEyesContent(String senderName) { + return '$senderName saatis sulle otsivad silmad'; + } + + @override + String cuddleContent(String senderName) { + return '$senderName kaisutab sind'; + } + + @override + String hugContent(String senderName) { + return '$senderName kallistab sind'; + } + + @override + String answeredTheCall(String senderName) { + return '$senderName vastas kõnele'; + } + + @override + String get anyoneCanJoin => 'Kõik võivad liituda'; + + @override + String get appLock => 'Rakenduse lukustus'; + + @override + String get appLockDescription => + 'Kui sa rakendust parasjagu ei kasuta, siis lukusta ta PIN-koodiga'; + + @override + String get archive => 'Arhiiv'; + + @override + String get areGuestsAllowedToJoin => 'Kas külalised võivad liituda'; + + @override + String get areYouSure => 'Kas sa oled kindel?'; + + @override + String get areYouSureYouWantToLogout => + 'Kas sa oled kindel, et soovid välja logida?'; + + @override + String get askSSSSSign => + 'Selleks, et teist osapoolt identifitseerivat allkirja anda, palun sisesta oma turvahoidla paroolifraas või taastevõti.'; + + @override + String askVerificationRequest(String username) { + return 'Kas võtad vastu selle verifitseerimispalve kasutajalt $username?'; + } + + @override + String get autoplayImages => + 'Esita liikuvad kleepse ja emotikone automaatselt'; + + @override + String badServerLoginTypesException(String serverVersions, + String supportedVersions, Object suportedVersions) { + return 'See koduserver toetab Matrixi võrku sisselogimiseks:\n$serverVersions\nAga see rakendus toetab vaid järgmisi võimalusi:\n$supportedVersions'; + } + + @override + String get sendTypingNotifications => 'Saada kirjutamise teavitusi'; + + @override + String get swipeRightToLeftToReply => 'Vastamiseks viipa paremalt vasakule'; + + @override + String get sendOnEnter => 'Saada sõnum sisestusklahvi vajutusel'; + + @override + String badServerVersionsException(String serverVersions, + String supportedVersions, Object serverVerions, Object suportedVersions) { + return 'See koduserver toetab Matrixi spetsifikatsioonist järgmisi versioone:\n$serverVersions\nAga see rakendus toetab vaid järgmisi versioone: $supportedVersions'; + } + + @override + String countChatsAndCountParticipants(int chats, int participants) { + return '$chats vestlust ja $participants osalejat'; + } + + @override + String get noMoreChatsFound => 'Rohkem vestlusi ei leidu...'; + + @override + String get noChatsFoundHere => + 'Siin ei leidu veel ühtegi vestlust. Alusta uut vestlust klõpsides allpool asuvat nuppu. ⤵️'; + + @override + String get joinedChats => 'Vestlusi, millega oled liitunud'; + + @override + String get unread => 'Lugemata'; + + @override + String get space => 'Kogukond'; + + @override + String get spaces => 'Kogukonnad'; + + @override + String get banFromChat => 'Keela ligipääs vestlusele'; + + @override + String get banned => 'Ligipääs vestlusele on keelatud'; + + @override + String bannedUser(String username, String targetName) { + return '$username keelas ligipääsu kasutajale $targetName'; + } + + @override + String get blockDevice => 'Blokeeri seade'; + + @override + String get blocked => 'Blokeeritud'; + + @override + String get botMessages => 'Robotite sõnumid'; + + @override + String get cancel => 'Katkesta'; + + @override + String cantOpenUri(String uri) { + return '$uri aadressi avamine ei õnnestu'; + } + + @override + String get changeDeviceName => 'Muuda seadme nime'; + + @override + String changedTheChatAvatar(String username) { + return '$username muutis vestluse tunnuspilti'; + } + + @override + String changedTheChatDescriptionTo(String username, String description) { + return '$username muutis vestluse uueks kirjelduseks \'$description\''; + } + + @override + String changedTheChatNameTo(String username, String chatname) { + return '$username muutis oma uueks vestlusnimeks \'$chatname\''; + } + + @override + String changedTheChatPermissions(String username) { + return '$username muutis vestlusega seotud õigusi'; + } + + @override + String changedTheDisplaynameTo(String username, String displayname) { + return '$username muutis oma uueks kuvatavaks nimeks: \'$displayname\''; + } + + @override + String changedTheGuestAccessRules(String username) { + return '$username muutis külaliste ligipääsureegleid'; + } + + @override + String changedTheGuestAccessRulesTo(String username, String rules) { + return '$username muutis külaliste ligipääsureegleid järgnevalt: $rules'; + } + + @override + String changedTheHistoryVisibility(String username) { + return '$username muutis sõnumite ajaloo nähtavust'; + } + + @override + String changedTheHistoryVisibilityTo(String username, String rules) { + return '$username muutis sõnumite ajaloo nähtavust järgnevalt: $rules'; + } + + @override + String changedTheJoinRules(String username) { + return '$username muutis liitumise reegleid'; + } + + @override + String changedTheJoinRulesTo(String username, String joinRules) { + return '$username muutis liitumise reegleid järgnevalt: $joinRules'; + } + + @override + String changedTheProfileAvatar(String username) { + return '$username muutis oma tunnuspilti'; + } + + @override + String changedTheRoomAliases(String username) { + return '$username muutis jututoa aliast'; + } + + @override + String changedTheRoomInvitationLink(String username) { + return '$username muutis kutse linki'; + } + + @override + String get changePassword => 'Muuda salasõna'; + + @override + String get changeTheHomeserver => 'Muuda koduserverit'; + + @override + String get changeTheme => 'Muuda oma stiili'; + + @override + String get changeTheNameOfTheGroup => 'Muuda vestlusrühma nime'; + + @override + String get changeYourAvatar => 'Muuda oma tunnuspilti'; + + @override + String get channelCorruptedDecryptError => 'Kasutatud krüptimine on vigane'; + + @override + String get chat => 'Vestlus'; + + @override + String get yourChatBackupHasBeenSetUp => + 'Sinu vestluste varundus on seadistatud.'; + + @override + String get chatBackup => 'Varunda vestlus'; + + @override + String get chatBackupDescription => + 'Sinu vestluste varukoopia on krüptitud taastamiseks mõeldud turvavõtmega. Palun vaata, et sa seda ei kaota.'; + + @override + String get chatDetails => 'Vestluse teave'; + + @override + String get chatHasBeenAddedToThisSpace => 'Lisasime vestluse kogukonda'; + + @override + String get chats => 'Vestlused'; + + @override + String get chooseAStrongPassword => 'Vali korralik salasõna'; + + @override + String get clearArchive => 'Kustuta arhiiv'; + + @override + String get close => 'Sulge'; + + @override + String get commandHint_markasdm => + 'Märgi otsevestusluseks antud Matrixi ID jaoks'; + + @override + String get commandHint_markasgroup => 'Märgi vestlusrühmaks'; + + @override + String get commandHint_ban => + 'Sea sellele kasutajale antud jututoas suhtluskeeld'; + + @override + String get commandHint_clearcache => 'Tühjenda vahemälu'; + + @override + String get commandHint_create => + 'Loo tühi vestlusrühm\nKrüptimise keelamiseks kasuta --no-encryption võtit'; + + @override + String get commandHint_discardsession => 'Loobu sessioonist'; + + @override + String get commandHint_dm => + 'Alusta otsevestlust\nKrüptimise keelamiseks kasuta --no-encryption võtit'; + + @override + String get commandHint_html => 'Saada HTML-vormingus tekst'; + + @override + String get commandHint_invite => 'Kutsu see kasutaja antud jututuppa'; + + @override + String get commandHint_join => 'Liitu selle jututoaga'; + + @override + String get commandHint_kick => 'Eemalda antud kasutaja sellest jututoast'; + + @override + String get commandHint_leave => 'Lahku sellest jututoast'; + + @override + String get commandHint_me => 'Kirjelda ennast'; + + @override + String get commandHint_myroomavatar => + 'Määra selles jututoas oma tunnuspilt (mxc-uri vahendusel)'; + + @override + String get commandHint_myroomnick => 'Määra selles jututoas oma kuvatav nimi'; + + @override + String get commandHint_op => 'Seadista selle kasutaja õigusi (vaikimisi: 50)'; + + @override + String get commandHint_plain => 'Saada vormindamata tekst'; + + @override + String get commandHint_react => 'Saada vastus reaktsioonina'; + + @override + String get commandHint_send => 'Saada sõnum'; + + @override + String get commandHint_unban => + 'Eemalda sellelt kasutajalt antud jututoas suhtluskeeld'; + + @override + String get commandInvalid => 'Vigane käsk'; + + @override + String commandMissing(String command) { + return '$command ei ole käsk.'; + } + + @override + String get compareEmojiMatch => 'Palun võrdle emotikone'; + + @override + String get compareNumbersMatch => 'Palun võrdle numbreid'; + + @override + String get configureChat => 'Seadista vestlust'; + + @override + String get confirm => 'Kinnita'; + + @override + String get connect => 'Ühenda'; + + @override + String get contactHasBeenInvitedToTheGroup => + 'Sinu kontakt on kutsutud liituma vestlusrühma'; + + @override + String get containsDisplayName => 'Sisaldab kuvatavat nime'; + + @override + String get containsUserName => 'Sisaldab kasutajanime'; + + @override + String get contentHasBeenReported => + 'Saatsime selle sisu kohta teate koduserveri haldajate'; + + @override + String get copiedToClipboard => 'Kopeerisin lõikelauale'; + + @override + String get copy => 'Kopeeri'; + + @override + String get copyToClipboard => 'Kopeeri lõikelauale'; + + @override + String couldNotDecryptMessage(String error) { + return 'Sõnumi dekrüptimine ei õnnestunud: $error'; + } + + @override + String countParticipants(int count) { + return '$count osalejat'; + } + + @override + String get create => 'Loo'; + + @override + String createdTheChat(String username) { + return '💬 $username algatas vestluse'; + } + + @override + String get createGroup => 'Loo vestlusrühm'; + + @override + String get createNewSpace => 'Uus kogukond'; + + @override + String get currentlyActive => 'Hetkel aktiivne'; + + @override + String get darkTheme => 'Tume'; + + @override + String dateAndTimeOfDay(String date, String timeOfDay) { + return '$date, $timeOfDay'; + } + + @override + String dateWithoutYear(String month, String day) { + return '$day.$month'; + } + + @override + String dateWithYear(String year, String month, String day) { + return '$year.$month.$day'; + } + + @override + String get deactivateAccountWarning => + 'Järgnevaga eemaldatakse sinu konto kasutusest. Seda tegevust ei saa tagasi pöörata! Kas sa ikka oled kindel?'; + + @override + String get defaultPermissionLevel => 'Vaikimisi õigused uutele kasutajatele'; + + @override + String get delete => 'Kustuta'; + + @override + String get deleteAccount => 'Kustuta kasutajakonto'; + + @override + String get deleteMessage => 'Kustuta sõnum'; + + @override + String get device => 'Seade'; + + @override + String get deviceId => 'Seadme tunnus'; + + @override + String get devices => 'Seadmed'; + + @override + String get directChats => 'Otsevestlused'; + + @override + String get allRooms => 'Kõik vestlusrühmad'; + + @override + String get displaynameHasBeenChanged => 'Kuvatav nimi on muudetud'; + + @override + String get downloadFile => 'Laadi fail alla'; + + @override + String get edit => 'Muuda'; + + @override + String get editBlockedServers => 'Muuda blokeeritud serverite loendit'; + + @override + String get chatPermissions => 'Vestluse õigused'; + + @override + String get editDisplayname => 'Muuda kuvatavat nime'; + + @override + String get editRoomAliases => 'Muuda jututoa aliast'; + + @override + String get editRoomAvatar => 'Muuda jututoa tunnuspilti'; + + @override + String get emoteExists => 'Selline emotsioonitegevus on juba olemas!'; + + @override + String get emoteInvalid => 'Vigane emotsioonitegevuse lühikood!'; + + @override + String get emoteKeyboardNoRecents => + 'Hiljuti kasutatud emotikonid kuvame siin...'; + + @override + String get emotePacks => 'Emotsioonitegevuste pakid jututoa jaoks'; + + @override + String get emoteSettings => 'Emotsioonitegevuste seadistused'; + + @override + String get globalChatId => 'Üldine vestluse tunnus'; + + @override + String get accessAndVisibility => 'Ligipääsetavus ja nähtavus'; + + @override + String get accessAndVisibilityDescription => + 'Kes võib selle vestlusega liituda ja kuidas on võimalik seda vestlust leida.'; + + @override + String get calls => 'Kõned'; + + @override + String get customEmojisAndStickers => 'Kohandatud emotikonid ja kleepsud'; + + @override + String get customEmojisAndStickersBody => + 'Lisa või jaga kohandatud emotikone või kleepsupakke, mida võiks kasutada igas vestluses.'; + + @override + String get emoteShortcode => 'Emotsioonitegevuse lühikood'; + + @override + String get emoteWarnNeedToPick => + 'Sa pead valima emotsioonitegevuse lühikoodi ja pildi!'; + + @override + String get emptyChat => 'Vestlust pole olnud'; + + @override + String get enableEmotesGlobally => + 'Võta emotsioonitegevuste pakid läbivalt kasutusele'; + + @override + String get enableEncryption => 'Kasuta krüptimist'; + + @override + String get enableEncryptionWarning => + 'Sa ei saa hiljem enam krüptimist välja lülitada. Kas oled kindel?'; + + @override + String get encrypted => 'Krüptitud'; + + @override + String get encryption => 'Krüptimine'; + + @override + String get encryptionNotEnabled => 'Krüptimine ei ole kasutusel'; + + @override + String endedTheCall(String senderName) { + return '$senderName lõpetas kõne'; + } + + @override + String get enterAnEmailAddress => 'Sisesta e-posti aadress'; + + @override + String get homeserver => 'Koduserver'; + + @override + String get enterYourHomeserver => 'Sisesta oma koduserveri aadress'; + + @override + String errorObtainingLocation(String error) { + return 'Viga asukoha tuvastamisel: $error'; + } + + @override + String get everythingReady => 'Kõik on valmis!'; + + @override + String get extremeOffensive => 'Äärmiselt solvav'; + + @override + String get fileName => 'Faili nimi'; + + @override + String get fluffychat => 'FluffyChat'; + + @override + String get fontSize => 'Fondi suurus'; + + @override + String get forward => 'Edasta'; + + @override + String get fromJoining => 'Alates liitumise hetkest'; + + @override + String get fromTheInvitation => 'Kutse saamisest'; + + @override + String get goToTheNewRoom => 'Hakka kasutama uut jututuba'; + + @override + String get group => 'Vestlusrühm'; + + @override + String get chatDescription => 'Vestluse kirjeldus'; + + @override + String get chatDescriptionHasBeenChanged => 'Vestluse kirjeldus on muutunud'; + + @override + String get groupIsPublic => 'Vestlusrühm on avalik'; + + @override + String get groups => 'Vestlusrühmad'; + + @override + String groupWith(String displayname) { + return 'Vestlusrühm $displayname kasutajanimega'; + } + + @override + String get guestsAreForbidden => 'Külalised ei ole lubatud'; + + @override + String get guestsCanJoin => 'Külalised võivad liituda'; + + @override + String hasWithdrawnTheInvitationFor(String username, String targetName) { + return '$username on võtnud tagasi $targetName kutse'; + } + + @override + String get help => 'Abiteave'; + + @override + String get hideRedactedEvents => 'Peida muudetud sündmused'; + + @override + String get hideRedactedMessages => 'Peida muudetud sõnumid'; + + @override + String get hideRedactedMessagesBody => + 'Kui keegi muudab sõnumit, siis teda enam ei kuvataks vestluses.'; + + @override + String get hideInvalidOrUnknownMessageFormats => + 'Peida vigase või tundmatu vorminguga sõnumid'; + + @override + String get howOffensiveIsThisContent => 'Kui solvav see sisu on?'; + + @override + String get id => 'ID'; + + @override + String get identity => 'Identiteet'; + + @override + String get block => 'Blokeeri'; + + @override + String get blockedUsers => 'Blokeeritud kasutajad'; + + @override + String get blockListDescription => + 'Sul on võimalik blokeerida neid kasutajaid, kes sind segavad. Oma isiklikku blokerimisloendisse lisatud kasutajad ei saa sulle saata sõnumeid ega kutseid.'; + + @override + String get blockUsername => 'Eira kasutajanime'; + + @override + String get iHaveClickedOnLink => 'Ma olen klõpsinud saadetud linki'; + + @override + String get incorrectPassphraseOrKey => 'Vigane paroolifraas või taastevõti'; + + @override + String get inoffensive => 'Kahjutu'; + + @override + String get inviteContact => 'Kutsu sõpru ja tuttavaid'; + + @override + String inviteContactToGroupQuestion(Object contact, Object groupName) { + return 'Kas sa soovid kutsuda kasutajat $contact „$groupName“ jututuppa?'; + } + + @override + String inviteContactToGroup(String groupName) { + return 'Kutsu sõpru ja tuttavaid $groupName liikmeks'; + } + + @override + String get noChatDescriptionYet => 'Vestluse kirjeldus on puudu.'; + + @override + String get tryAgain => 'Proovi uuesti'; + + @override + String get invalidServerName => 'Vigane serveri nimi'; + + @override + String get invited => 'Kutsutud'; + + @override + String get redactMessageDescription => + 'Sõnumi muudatus kehtib kõikidele vestluses osalejatele. Seda muudatust ei saa tagasi pöörata.'; + + @override + String get optionalRedactReason => + '(Kui soovid lisada) Sõnumi muutmise põhjus...'; + + @override + String invitedUser(String username, String targetName) { + return '📩 $username saatis kutse kasutajale $targetName'; + } + + @override + String get invitedUsersOnly => 'Ainult kutsutud kasutajatele'; + + @override + String get inviteForMe => 'Kutse minu jaoks'; + + @override + String inviteText(String username, String link) { + return '$username kutsus sind kasutama Matrix\'i-põhist suhtlusrakendust FluffyChat. \n1. Ava fluffychat.im ja paigalda FluffyChat\'i rakendus \n2. Liitu kasutajaks või logi sisse olemasoleva Matrix\'i kasutajakontoga\n3. Ava kutse link: \n $link'; + } + + @override + String get isTyping => 'kirjutab…'; + + @override + String joinedTheChat(String username) { + return '👋 $username liitus vestlusega'; + } + + @override + String get joinRoom => 'Liitu jututoaga'; + + @override + String kicked(String username, String targetName) { + return '👞 $username müksas kasutaja $targetName välja'; + } + + @override + String kickedAndBanned(String username, String targetName) { + return '🙅$username müksas kasutaja $targetName välja ning seadis talle suhtluskeelu'; + } + + @override + String get kickFromChat => 'Müksa vestlusest välja'; + + @override + String lastActiveAgo(String localizedTimeShort) { + return 'Viimati nähtud: $localizedTimeShort'; + } + + @override + String get leave => 'Lahku'; + + @override + String get leftTheChat => 'Lahkus vestlusest'; + + @override + String get license => 'Litsents'; + + @override + String get lightTheme => 'Hele'; + + @override + String loadCountMoreParticipants(int count) { + return 'Lisa veel $count osalejat'; + } + + @override + String get dehydrate => + 'Ekspordi sessiooni teave ja kustuta nutiseadmest rakenduse andmed'; + + @override + String get dehydrateWarning => + 'Seda tegevust ei saa tagasi pöörata. Palun kontrolli, et sa oled varukoopia turvaliselt salvestanud.'; + + @override + String get dehydrateTor => 'TOR\'i kasutajad: Ekspordi sessioon'; + + @override + String get dehydrateTorLong => + 'Kui oled TOR\'i võrgu kasutaja, siis enne akna sulgemist palun ekspordi viimase sessiooni andmed.'; + + @override + String get hydrateTor => + 'TOR\'i kasutajatele: impordi viimati eksporditud sessiooni andmed'; + + @override + String get hydrateTorLong => + 'Kui viimati TOR\'i võrku kasutasid, siis kas sa eksportisid oma sessiooni andmed? Kui jah, siis impordi nad mugavasti ja jätka suhtlemist.'; + + @override + String get hydrate => 'Taasta varundatud failist'; + + @override + String get loadingPleaseWait => 'Laadin andmeid… Palun oota.'; + + @override + String get loadMore => 'Laadi veel…'; + + @override + String get locationDisabledNotice => + 'Asukohateenused on seadmes väljalülitatud. Asukoha jagamiseks palun lülita nad sisse.'; + + @override + String get locationPermissionDeniedNotice => + 'Puudub luba asukohateenuste kasutamiseks. Asukoha jagamiseks palun anna rakendusele vastavad õigused.'; + + @override + String get login => 'Logi sisse'; + + @override + String logInTo(String homeserver) { + return 'Logi sisse $homeserver serverisse'; + } + + @override + String get logout => 'Logi välja'; + + @override + String get memberChanges => 'Muudatused liikmeskonnas'; + + @override + String get mention => 'Märgi ära'; + + @override + String get messages => 'Sõnumid'; + + @override + String get messagesStyle => 'Sõnumid:'; + + @override + String get moderator => 'Moderaator'; + + @override + String get muteChat => 'Summuta vestlus'; + + @override + String get needPantalaimonWarning => + 'Palun arvesta, et sa saad hetkel kasutada läbivat krüptimist vaid siis, kui koduserver kasutab Pantalaimon\'it.'; + + @override + String get newChat => 'Uus vestlus'; + + @override + String get newMessageInFluffyChat => '💬 Uus sõnum FluffyChat\'i vahendusel'; + + @override + String get newVerificationRequest => 'Uus verifitseerimispäring!'; + + @override + String get next => 'Edasi'; + + @override + String get no => 'Ei'; + + @override + String get noConnectionToTheServer => 'Puudub ühendus koduserveriga'; + + @override + String get noEmotesFound => 'Ühtegi emotsioonitegevust ei leidunud. 😕'; + + @override + String get noEncryptionForPublicRooms => + 'Sa võid krüptimise kasutusele võtta niipea, kui jututuba pole enam avalik.'; + + @override + String get noGoogleServicesWarning => + 'Tundub, et sinu nutiseadmes pole Firebase Cloud Messaging teenuseid. Sinu privaatsuse mõttes on see kindlasti hea otsus! Kui sa soovid FluffyChatis näha tõuketeavitusi, siis soovitame, et selle jaoks kasutad ntfy liidestust. Kasutades ntfyd või mõnda muud Unified Push standardil põhinevat liidestust saad tõuketeavitusi turvalisel moel. Ntfy rakendus on saadaval nii PlayStore kui F-Droidi rakendusepoodides.'; + + @override + String noMatrixServer(String server1, String server2) { + return '$server1 pole Matrix\'i server, kas kasutame selle asemel $server2 serverit?'; + } + + @override + String get shareInviteLink => 'Jaga kutse linki'; + + @override + String get scanQrCode => 'Skaneeri QR-koodi'; + + @override + String get none => 'Mitte midagi'; + + @override + String get noPasswordRecoveryDescription => + 'Sa pole veel lisanud võimalust salasõna taastamiseks.'; + + @override + String get noPermission => 'Õigused puuduvad'; + + @override + String get noRoomsFound => 'Jututubasid ei leidunud…'; + + @override + String get notifications => 'Teavitused'; + + @override + String get notificationsEnabledForThisAccount => + 'Teavitused on sellel kontol kasutusel'; + + @override + String numUsersTyping(int count) { + return '$count kasutajat kirjutavad…'; + } + + @override + String get obtainingLocation => 'Tuvastan asukohta…'; + + @override + String get offensive => 'Solvav'; + + @override + String get offline => 'Väljas'; + + @override + String get ok => 'Sobib'; + + @override + String get online => 'Saadaval'; + + @override + String get onlineKeyBackupEnabled => + 'Krüptovõtmete veebipõhine varundus on kasutusel'; + + @override + String get oopsPushError => + 'Hopsti! Kahjuks tekkis tõuketeavituste seadistamisel viga.'; + + @override + String get oopsSomethingWentWrong => 'Hopsti! Midagi läks nüüd viltu…'; + + @override + String get openAppToReadMessages => 'Sõnumite lugemiseks ava rakendus'; + + @override + String get openCamera => 'Ava kaamera'; + + @override + String get openVideoCamera => 'Tee video'; + + @override + String get oneClientLoggedOut => + 'Üks sinu klientrakendustest on Matrix\'i võrgust välja loginud'; + + @override + String get addAccount => 'Lisa kasutajakonto'; + + @override + String get editBundlesForAccount => 'Muuda selle kasutajakonto köiteid'; + + @override + String get addToBundle => 'Lisa köitesse'; + + @override + String get removeFromBundle => 'Eemalda sellest köitest'; + + @override + String get bundleName => 'Köite nimi'; + + @override + String get enableMultiAccounts => + '(KATSELINE) Pruugi selles seadmes mitut Matrix\'i kasutajakontot'; + + @override + String get openInMaps => 'Ava kaardirakendusega'; + + @override + String get link => 'Link'; + + @override + String get serverRequiresEmail => + 'See koduserver eeldab registreerimisel kasutatava e-postiaadressi kinnitamist.'; + + @override + String get or => 'või'; + + @override + String get participant => 'Osaleja'; + + @override + String get passphraseOrKey => 'paroolifraas või taastevõti'; + + @override + String get password => 'Salasõna'; + + @override + String get passwordForgotten => 'Salasõna on ununenud'; + + @override + String get passwordHasBeenChanged => 'Salasõna on muudetud'; + + @override + String get hideMemberChangesInPublicChats => + 'Peida avalike vestluste liikmelisuse muutused'; + + @override + String get hideMemberChangesInPublicChatsBody => + 'Parema loetavuse nimel ära näita vestluse ajajoonel avaliku jututoaga liitumisi ja sealt lahkumisi.'; + + @override + String get overview => 'Ülevaade'; + + @override + String get notifyMeFor => 'Teavita mind kui'; + + @override + String get passwordRecoverySettings => 'Salasõna taastamise seadistused'; + + @override + String get passwordRecovery => 'Salasõna taastamine'; + + @override + String get people => 'Inimesed'; + + @override + String get pickImage => 'Vali pilt'; + + @override + String get pin => 'Klammerda'; + + @override + String play(String fileName) { + return 'Esita $fileName'; + } + + @override + String get pleaseChoose => 'Palun vali'; + + @override + String get pleaseChooseAPasscode => 'Palun vali rakenduse PIN-kood'; + + @override + String get pleaseClickOnLink => + 'Jätkamiseks palun klõpsi sulle saadetud e-kirjas leiduvat linki.'; + + @override + String get pleaseEnter4Digits => + 'Rakenduse luku jaoks sisesta 4 numbrit või kui sa sellist võimalust ei soovi kasutada, siis jäta nad tühjaks.'; + + @override + String get pleaseEnterRecoveryKey => 'Palun sisesta oma taastevõti:'; + + @override + String get pleaseEnterYourPassword => 'Palun sisesta oma salasõna'; + + @override + String get pleaseEnterYourPin => 'Palun sisesta oma PIN-kood'; + + @override + String get pleaseEnterYourUsername => 'Palun sisesta oma kasutajanimi'; + + @override + String get pleaseFollowInstructionsOnWeb => + 'Palun järgi veebilehel olevaid juhiseid ja klõpsi nuppu Edasi.'; + + @override + String get privacy => 'Privaatsus'; + + @override + String get publicRooms => 'Avalikud jututoad'; + + @override + String get pushRules => 'Tõukereeglid'; + + @override + String get reason => 'Põhjus'; + + @override + String get recording => 'Salvestan'; + + @override + String redactedBy(String username) { + return 'Muutja: $username'; + } + + @override + String get directChat => 'Otsevestlus'; + + @override + String redactedByBecause(String username, String reason) { + return 'Muutja $username märkis põhjuseks: „$reason“'; + } + + @override + String redactedAnEvent(String username) { + return '$username muutis sündmust'; + } + + @override + String get redactMessage => 'Muuda sõnumit'; + + @override + String get register => 'Registreeru'; + + @override + String get reject => 'Lükka tagasi'; + + @override + String rejectedTheInvitation(String username) { + return '$username lükkas kutse tagasi'; + } + + @override + String get rejoin => 'Liitu uuesti'; + + @override + String get removeAllOtherDevices => 'Eemalda kõik muud seadmed'; + + @override + String removedBy(String username) { + return '$username eemaldas sündmuse'; + } + + @override + String get removeDevice => 'Eemalda seade'; + + @override + String get unbanFromChat => 'Eemalda suhtluskeeld'; + + @override + String get removeYourAvatar => 'Kustuta oma tunnuspilt'; + + @override + String get replaceRoomWithNewerVersion => + 'Asenda jututoa senine versioon uuega'; + + @override + String get reply => 'Vasta'; + + @override + String get reportMessage => 'Teata sõnumist'; + + @override + String get translateMessage => 'Translate message'; + + @override + String get translatedMessage => 'Translated message'; + + @override + String get errorTranslatingMessage => + 'An error has occured while translating the message.'; + + @override + String get recoverMessage => 'Recover message'; + + @override + String get recoveredMessage => 'Recovered message'; + + @override + String get errorRecoveringMessage => + 'An error has occured while recovering the message.'; + + @override + String get errorRecoveringMessageNoAdmin => + 'This feature is available on Synapse homeservers only for adminstrators.'; + + @override + String get requestPermission => 'Palu õigusi'; + + @override + String get roomHasBeenUpgraded => 'Jututoa vesrioon on uuendatud'; + + @override + String get roomVersion => 'Jututoa versioon'; + + @override + String get saveFile => 'Salvesta fail'; + + @override + String get retry => 'Retry'; + + @override + String get search => 'Otsi'; + + @override + String get security => 'Turvalisus'; + + @override + String get recoveryKey => 'Taastevõti'; + + @override + String get recoveryKeyLost => 'Kas taasetvõti on kadunud?'; + + @override + String seenByUser(String username) { + return 'Sõnumit nägi $username'; + } + + @override + String get send => 'Saada'; + + @override + String get sendAMessage => 'Saada sõnum'; + + @override + String get sendAsText => 'Saada tekstisõnumina'; + + @override + String get sendAudio => 'Saada helifail'; + + @override + String get sendFile => 'Saada fail'; + + @override + String get sendImage => 'Saada pilt'; + + @override + String sendImages(int count) { + return 'Saada $count pilti'; + } + + @override + String get sendMessages => 'Saada sõnumeid'; + + @override + String get sendOriginal => 'Saada fail muutmata kujul'; + + @override + String get sendSticker => 'Saada kleeps'; + + @override + String get sendVideo => 'Saada videofail'; + + @override + String sentAFile(String username) { + return '📁 $username saatis faili'; + } + + @override + String sentAnAudio(String username) { + return '🎤 $username saatis helifaili'; + } + + @override + String sentAPicture(String username) { + return '🖼️ $username saatis pildi'; + } + + @override + String sentASticker(String username) { + return '😊 $username saatis kleepsu'; + } + + @override + String sentAVideo(String username) { + return '🎥 $username saatis video'; + } + + @override + String sentCallInformations(String senderName) { + return '$senderName saatis teavet kõne kohta'; + } + + @override + String get separateChatTypes => 'Eraldi vestlused ja jututoad'; + + @override + String get setAsCanonicalAlias => 'Määra põhinimeks'; + + @override + String get setCustomEmotes => 'Kohanda emotsioonitegevusi'; + + @override + String get setChatDescription => 'Lisa vestluse kirjeldus'; + + @override + String get setInvitationLink => 'Tee kutselink'; + + @override + String get setPermissionsLevel => 'Seadista õigusi'; + + @override + String get setStatus => 'Määra olek'; + + @override + String get settings => 'Seadistused'; + + @override + String get share => 'Jaga'; + + @override + String sharedTheLocation(String username) { + return '$username jagas oma asukohta'; + } + + @override + String get shareLocation => 'Jaga asukohta'; + + @override + String get showPassword => 'Näita salasõna'; + + @override + String get presenceStyle => 'Olekuteated:'; + + @override + String get hideAvatarsInInvites => 'Hide avatars in invites'; + + @override + String get hideAvatarsInInvitesDescription => + 'Do not show room avatars in invites'; + + @override + String get presencesToggle => 'Näita teiste kasutajate olekuteateid'; + + @override + String get pureBlackToggle => 'Pure Black'; + + @override + String get singlesignon => 'Ühekordne sisselogimine'; + + @override + String get skip => 'Jäta vahele'; + + @override + String get sourceCode => 'Lähtekood'; + + @override + String get spaceIsPublic => 'Kogukond on avalik'; + + @override + String get spaceName => 'Kogukonna nimi'; + + @override + String startedACall(String senderName) { + return '$senderName alustas kõnet'; + } + + @override + String get startFirstChat => 'Alusta oma esimest vestlust'; + + @override + String get status => 'Olek'; + + @override + String get statusExampleMessage => 'Kuidas sul täna läheb?'; + + @override + String get submit => 'Saada'; + + @override + String get synchronizingPleaseWait => 'Sünkroniseerin andmeid… Palun oota.'; + + @override + String synchronizingPleaseWaitCounter(String percentage) { + return ' Sünkroniseerime… ($percentage%)'; + } + + @override + String get systemTheme => 'Süsteem'; + + @override + String get theyDontMatch => 'Nad ei klapi omavahel'; + + @override + String get theyMatch => 'Nad klapivad omavahel'; + + @override + String get title => 'FluffyChat'; + + @override + String get toggleFavorite => 'Muuda olekut lemmikuna'; + + @override + String get toggleMuted => 'Lülita summutamine sisse või välja'; + + @override + String get toggleUnread => 'Märgi loetuks / lugemata'; + + @override + String get tooManyRequestsWarning => + 'Liiga palju päringuid. Palun proovi hiljem uuesti!'; + + @override + String get transferFromAnotherDevice => 'Tõsta teisest seadmest'; + + @override + String get tryToSendAgain => 'Proovi uuesti saata'; + + @override + String get unavailable => 'Eemal'; + + @override + String unbannedUser(String username, String targetName) { + return '$username eemaldas ligipääsukeelu kasutajalt $targetName'; + } + + @override + String get unblockDevice => 'Eemalda seadmelt blokeering'; + + @override + String get unknownDevice => 'Tundmatu seade'; + + @override + String get unknownEncryptionAlgorithm => 'Tundmatu krüptoalgoritm'; + + @override + String unknownEvent(String type) { + return 'Tundmatu sündmuse tüüp \'$type\''; + } + + @override + String get unmuteChat => 'Lõpeta vestluse vaigistamine'; + + @override + String get unpin => 'Eemalda klammerdus'; + + @override + String unreadChats(int unreadCount) { + String _temp0 = intl.Intl.pluralLogic( + unreadCount, + locale: localeName, + other: '$unreadCount lugemata vestlust', + one: '1 lugemata vestlus', + ); + return '$_temp0'; + } + + @override + String userAndOthersAreTyping(String username, int count) { + return '$username ja $count muud kirjutavad…'; + } + + @override + String userAndUserAreTyping(String username, String username2) { + return '$username ja $username2 kirjutavad…'; + } + + @override + String userIsTyping(String username) { + return '$username kirjutab…'; + } + + @override + String userLeftTheChat(String username) { + return '🚪$username lahkus vestlusest'; + } + + @override + String get username => 'Kasutajanimi'; + + @override + String userSentUnknownEvent(String username, String type) { + return '$username saatis $type sündmuse'; + } + + @override + String get unverified => 'Verifitseerimata'; + + @override + String get verified => 'Verifitseeritud'; + + @override + String get verify => 'Verifitseeri'; + + @override + String get verifyStart => 'Alusta verifitseerimist'; + + @override + String get verifySuccess => 'Sinu verifitseerimine õnnestus!'; + + @override + String get verifyTitle => 'Verifitseerin teist kasutajakontot'; + + @override + String get videoCall => 'Videokõne'; + + @override + String get visibilityOfTheChatHistory => 'Vestluse ajaloo nähtavus'; + + @override + String get visibleForAllParticipants => 'Nähtav kõikidele osalejatele'; + + @override + String get visibleForEveryone => 'Nähtav kõikidele'; + + @override + String get voiceMessage => 'Häälsõnum'; + + @override + String get waitingPartnerAcceptRequest => + 'Ootan, et teine osapool nõustuks päringuga…'; + + @override + String get waitingPartnerEmoji => + 'Ootan teise osapoole kinnitust, et tegemist on samade emojidega…'; + + @override + String get waitingPartnerNumbers => + 'Ootan teise osapoole kinnitust, et tegemist on samade numbritega…'; + + @override + String get wallpaper => 'Taustapilt:'; + + @override + String get warning => 'Hoiatus!'; + + @override + String get weSentYouAnEmail => 'Me saatsime sulle e-kirja'; + + @override + String get whoCanPerformWhichAction => + 'Erinevatele kasutajatele lubatud toimingud'; + + @override + String get whoIsAllowedToJoinThisGroup => + 'Kes võivad selle vestlusrühmaga liituda'; + + @override + String get whyDoYouWantToReportThis => 'Miks sa soovid sellest teatada?'; + + @override + String get wipeChatBackup => + 'Kas kustutame sinu vestluste varukoopia ja loome uue taastamiseks mõeldud krüptovõtme?'; + + @override + String get withTheseAddressesRecoveryDescription => + 'Nende e-posti aadresside abil saad taastada oma salasõna.'; + + @override + String get writeAMessage => 'Kirjuta üks sõnum…'; + + @override + String get yes => 'Jah'; + + @override + String get you => 'Sina'; + + @override + String get youAreNoLongerParticipatingInThisChat => + 'Sa enam ei osale selles vestluses'; + + @override + String get youHaveBeenBannedFromThisChat => + 'Sinule on selles vestluses seatud suhtluskeeld'; + + @override + String get yourPublicKey => 'Sinu avalik võti'; + + @override + String get messageInfo => 'Sõnumi teave'; + + @override + String get time => 'Kellaaeg'; + + @override + String get messageType => 'Sõnumi tüüp'; + + @override + String get sender => 'Saatja'; + + @override + String get openGallery => 'Ava galerii'; + + @override + String get removeFromSpace => 'Eemalda kogukonnast'; + + @override + String get addToSpaceDescription => + 'Vali kogukond, kuhu soovid seda vestlust lisada.'; + + @override + String get start => 'Alusta'; + + @override + String get pleaseEnterRecoveryKeyDescription => + 'Vanade sõnumite lugemiseks palun siseta oma varasemas sessioonis loodud taastevõti. Taastamiseks mõeldud krüptovõti EI OLE sinu salasõna.'; + + @override + String get publish => 'Avalda'; + + @override + String videoWithSize(String size) { + return 'Video ($size)'; + } + + @override + String get openChat => 'Ava vestlus'; + + @override + String get markAsRead => 'Märgi loetuks'; + + @override + String get reportUser => 'Teata kasutajast'; + + @override + String get dismiss => 'Loobu'; + + @override + String reactedWith(String sender, String reaction) { + return '$sender reageeris nii $reaction'; + } + + @override + String get pinMessage => 'Klammerda sõnum jututuppa'; + + @override + String get confirmEventUnpin => + 'Kas sa oled kindel, et tahad klammerdatud sündmuse eemaldada?'; + + @override + String get emojis => 'Emotikonid'; + + @override + String get placeCall => 'Helista'; + + @override + String get voiceCall => 'Häälkõne'; + + @override + String get unsupportedAndroidVersion => + 'See Androidi versioon ei ole toetatud'; + + @override + String get unsupportedAndroidVersionLong => + 'See funktsionaalsus eeldab uuemat Androidi versiooni. Palun kontrolli, kas sinu nutiseadmele leidub süsteemiuuendusi või saaks seal Lineage OSi kasutada.'; + + @override + String get videoCallsBetaWarning => + 'Palun arvesta, et videokõned on veel beetajärgus. Nad ei pruugi veel toimida kõikidel platvormidel korrektselt.'; + + @override + String get experimentalVideoCalls => 'Katselised videokõned'; + + @override + String get emailOrUsername => 'E-posti aadress või kasutajanimi'; + + @override + String get indexedDbErrorTitle => + 'Brauseri privaatse akna kasutamisega seotud asjaolud'; + + @override + String get indexedDbErrorLong => + 'Privaatse akna puhul andmete salvestamine vaikimisi pole kasutusel.\nPalun toimi alljärgnevalt:\n- ava about:config\n- määra dom.indexedDB.privateBrowsing.enabled väärtuseks true\nVastasel juhul sa ei saa FluffyChat\'i kasutada.'; + + @override + String switchToAccount(String number) { + return 'Pruugi kasutajakontot # $number'; + } + + @override + String get nextAccount => 'Järgmine kasutajakonto'; + + @override + String get previousAccount => 'Eelmine kasutajakonto'; + + @override + String get addWidget => 'Lisa vidin'; + + @override + String get widgetVideo => 'Video'; + + @override + String get widgetEtherpad => 'Märkmed ja tekstid'; + + @override + String get widgetJitsi => 'Jitsi Meet'; + + @override + String get widgetCustom => 'Kohandatud'; + + @override + String get widgetName => 'Nimi'; + + @override + String get widgetUrlError => 'See pole korrektne URL.'; + + @override + String get widgetNameError => 'Palun sisesta kuvatav nimi.'; + + @override + String get errorAddingWidget => 'Vidina lisamisel tekkis viga.'; + + @override + String get youRejectedTheInvitation => 'Sa lükkasid kutse tagasi'; + + @override + String get youJoinedTheChat => 'Sa liitusid vestlusega'; + + @override + String get youAcceptedTheInvitation => '👍 Sa võtsid kutse vastu'; + + @override + String youBannedUser(String user) { + return 'Sa seadsid suhtluskeelu kasutajale $user'; + } + + @override + String youHaveWithdrawnTheInvitationFor(String user) { + return 'Sa oled tühistanud kutse kasutajale $user'; + } + + @override + String youInvitedToBy(String alias) { + return '📩 Sa oled lingiga saanud kutse jututuppa:\n$alias'; + } + + @override + String youInvitedBy(String user) { + return '📩 $user saatis sulle kutse'; + } + + @override + String invitedBy(String user) { + return '📩 Kutsujaks $user'; + } + + @override + String youInvitedUser(String user) { + return '📩 Sa saatsid kutse kasutajale $user'; + } + + @override + String youKicked(String user) { + return '👞 Sa müksasid kasutaja $user välja'; + } + + @override + String youKickedAndBanned(String user) { + return '🙅Sa müksasid kasutaja $user välja ning seadsid talle suhtluskeelu'; + } + + @override + String youUnbannedUser(String user) { + return 'Sa eemaldasid suhtluskeelu kasutajalt $user'; + } + + @override + String hasKnocked(String user) { + return '🚪$user on jututoa uksele koputanud'; + } + + @override + String get usersMustKnock => 'Kasutajad peavad uksele koputama'; + + @override + String get noOneCanJoin => 'Mitte keegi ei saa liituda'; + + @override + String userWouldLikeToChangeTheChat(String user) { + return '$user soovib liituda vestlusega.'; + } + + @override + String get noPublicLinkHasBeenCreatedYet => + 'Avalikult kasutatavat linki pole veel olemas'; + + @override + String get knock => 'Koputa uksele'; + + @override + String get users => 'Kasutajad'; + + @override + String get unlockOldMessages => 'Muuda vanad sõnumid loetavaks'; + + @override + String get storeInSecureStorageDescription => + 'Salvesta taastevõti selle seadme turvahoidlas.'; + + @override + String get saveKeyManuallyDescription => + 'Salvesta see krüptovõti kasutades selle süsteemi jagamisvalikuid või lõikelauda.'; + + @override + String get storeInAndroidKeystore => 'Vali salvestuskohaks Android KeyStore'; + + @override + String get storeInAppleKeyChain => 'Vali salvestuskohaks Apple KeyChain'; + + @override + String get storeSecurlyOnThisDevice => 'Salvesta turvaliselt selles seadmes'; + + @override + String countFiles(int count) { + return '$count faili'; + } + + @override + String get user => 'Kasutaja'; + + @override + String get custom => 'Kohandatud'; + + @override + String get foregroundServiceRunning => + 'See teavitus toimib siis, kui esiplaaniteenus töötab.'; + + @override + String get screenSharingTitle => 'ekraani jagamine'; + + @override + String get screenSharingDetail => + 'Sa jagad oma ekraani FuffyChati vahendusel'; + + @override + String get callingPermissions => 'Helistamise õigused'; + + @override + String get callingAccount => 'Helistamiskonto'; + + @override + String get callingAccountDetails => + 'Võimaldab FluffyChat\'il kasutada Androidi helistamisrakendust.'; + + @override + String get appearOnTop => 'Luba pealmise rakendusena'; + + @override + String get appearOnTopDetails => + 'Sellega lubad rakendust avada kõige pealmisena (pole vajalik, kui Fluffychat on juba seadistatud toimima helistamiskontoga)'; + + @override + String get otherCallingPermissions => + 'Mikrofoni, kaamera ja muud FluffyChat\'i õigused'; + + @override + String get whyIsThisMessageEncrypted => 'Miks see sõnum pole loetav?'; + + @override + String get 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.'; + + @override + String get newGroup => 'Uus jututuba'; + + @override + String get newSpace => 'Uus kogukond'; + + @override + String get enterSpace => 'Sisene kogukonda'; + + @override + String get enterRoom => 'Ava jututuba'; + + @override + String get allSpaces => 'Kõik kogukonnad'; + + @override + String numChats(String number) { + return '$number vestlust'; + } + + @override + String get hideUnimportantStateEvents => 'Peida väheolulised olekuteated'; + + @override + String get hidePresences => 'Peida olekute loend?'; + + @override + String get doNotShowAgain => 'Ära näita uuesti'; + + @override + String wasDirectChatDisplayName(String oldDisplayName) { + return 'Sõnumiteta vestlus (vana nimega $oldDisplayName)'; + } + + @override + String get newSpaceDescription => + 'Kogukonnad võimaldavad sul koondada erinevaid vestlusi ning korraldada avalikku või privaatset ühistegevust.'; + + @override + String get encryptThisChat => 'Krüpti see vestlus'; + + @override + String get disableEncryptionWarning => + 'Kui vestluses on krüptimine kasutusele võetud, siis turvalisuse huvides ei saa seda hiljem välja lülitada.'; + + @override + String get sorryThatsNotPossible => 'Vabandust... see ei ole võimalik'; + + @override + String get deviceKeys => 'Seadme võtmed:'; + + @override + String get reopenChat => 'Alusta vestlust uuesti'; + + @override + String get noBackupWarning => + 'Hoiatus! Kui sa ei lülita sisse vestluse varundust, siis sul puudub hiljem ligipääs krüptitud sõnumitele. Me tungivalt soovitame, et palun lülita vestluse varundamine sisse enne väljalogimist.'; + + @override + String get noOtherDevicesFound => 'Muid seadmeid ei leidu'; + + @override + String fileIsTooBigForServer(String max) { + return 'Saatmine ei õnnestu! Serveri vaid kuni $max suurusega manuseid.'; + } + + @override + String fileHasBeenSavedAt(String path) { + return 'Fail on salvestatud kausta: $path'; + } + + @override + String get jumpToLastReadMessage => 'Liigu viimase loetud sõnumini'; + + @override + String get readUpToHere => 'Siiamaani on loetud'; + + @override + String get jump => 'Hüppa'; + + @override + String get openLinkInBrowser => 'Ava link veebibrauseris'; + + @override + String get reportErrorDescription => + '😭 Oh appike! Midagi läks valesti. Kui soovid, võid sellest veast arendajatele teatada.'; + + @override + String get report => 'teata'; + + @override + String get signInWithPassword => 'Logi sisse salasõnaga'; + + @override + String get pleaseTryAgainLaterOrChooseDifferentServer => + 'Palun proovi hiljem uuesti või muuda serveri nime.'; + + @override + String signInWith(String provider) { + return 'Logi sisse kasutades teenusepakkujat $provider'; + } + + @override + String get profileNotFound => + 'Sellist kasutajat serveris ei leidu. Tegemist võib olla kas võrguühenduse probleemiga või sellist kasutajat tõesti pole olemas.'; + + @override + String get setTheme => 'Vali teema:'; + + @override + String get setColorTheme => 'Vali värviteema:'; + + @override + String get invite => 'Kutsu'; + + @override + String get inviteGroupChat => '📨 Kutsu vestlusrühma'; + + @override + String get invitePrivateChat => '📨 Kutsu omavahelisele vestlusele'; + + @override + String get invalidInput => 'Vigane sisend!'; + + @override + String wrongPinEntered(int seconds) { + return 'Sisestasid vale PIN-koodi! Proovi uuesti $seconds sekundi pärast...'; + } + + @override + String get pleaseEnterANumber => 'Palun sisesta 0\'st suurem number'; + + @override + String get archiveRoomDescription => + 'Selle vestluse tõstame nüüd arhiivi. Muud osalejad näevad, et sa oled vestlusest lahkunud.'; + + @override + String get roomUpgradeDescription => + 'See vestlus luuakse nüüd uuesti jututoa uue versioonina. Kõik senised osalejad saavad teate, et nad peavad liituma uue vestlusega. Jututubade versioonide kohta leiad teavet https://spec.matrix.org/latest/rooms/ lehelt'; + + @override + String get removeDevicesDescription => + 'Sind logitakse sellest seadmest välja ja sa enam ei saa sõnumeid.'; + + @override + String get banUserDescription => + 'Sellele kasutajale on nüüd selles jututoas seatud suhtluskeeld ning ta ei saa vestluses osaleda seni, kuni suhtluskeeld pole eemaldatud.'; + + @override + String get unbanUserDescription => + 'Uuesti proovimisel saab see kasutaja nüüd vestlusega liituda.'; + + @override + String get kickUserDescription => + 'See kasutaja on nüüd jutuoast välja müksatud, kuid talle pole seatud suhtluskeeldu. Avaliku jututoa puhul saab ta alati uuesti liituda.'; + + @override + String get makeAdminDescription => + 'Kui annad sellele kasutajale peakasutaja õigused, siis kuna tal on sinuga samad õigused, sa ei saa seda toimingut enam tagasi pöörata.'; + + @override + String get pushNotificationsNotAvailable => 'Tõuketeavitused pole saadaval'; + + @override + String get learnMore => 'Loe lisaks'; + + @override + String get yourGlobalUserIdIs => 'Sinu üldine kasutajatunnus on: '; + + @override + String noUsersFoundWithQuery(String query) { + return 'Päringuga „$query“ ei leidunud kahkus ühtegi kasutajat. Palun kontrolli, et päringus poleks vigu.'; + } + + @override + String get knocking => 'Koputus uksele'; + + @override + String chatCanBeDiscoveredViaSearchOnServer(String server) { + return 'Vestluse või jututoa saad leida otsingust serveris $server'; + } + + @override + String get searchChatsRooms => 'Otsi #vestlusi, @kasutajaid...'; + + @override + String get nothingFound => 'Ei leidnud mitte midagi...'; + + @override + String get groupName => 'Vestlusrühma nimi'; + + @override + String get createGroupAndInviteUsers => + 'Lisavestlusrühm ja kutsu sinna kasutajaid'; + + @override + String get groupCanBeFoundViaSearch => 'Vestlusrühm on leitav otsinguga'; + + @override + String get wrongRecoveryKey => + 'Vabandust..., see ei tundu olema korrektne taastevõti.'; + + @override + String get startConversation => 'Alusta vestlust'; + + @override + String get commandHint_sendraw => 'Saada json oma algupärasel kujul'; + + @override + String get databaseMigrationTitle => 'Andmebaas on optimeeritud'; + + @override + String get databaseMigrationBody => + 'Palun oota üks hetk. Natuke võib kuluda aega.'; + + @override + String get leaveEmptyToClearStatus => + 'Senise oleku eemaldamiseks jäta väärtus tühjaks.'; + + @override + String get select => 'Vali'; + + @override + String get searchForUsers => 'Otsi kasutajat @kasutajanimi ...'; + + @override + String get pleaseEnterYourCurrentPassword => + 'Palun sisesta oma praegune salasõna'; + + @override + String get newPassword => 'Uus salasõna'; + + @override + String get pleaseChooseAStrongPassword => 'Palun sisesta korralik salasõna'; + + @override + String get passwordsDoNotMatch => 'Salasõnad ei klapi omavahel'; + + @override + String get passwordIsWrong => 'Sinu sisestatud salasõna on vale'; + + @override + String get publicLink => 'Avalik link'; + + @override + String get publicChatAddresses => 'Vestluse avalik aadress'; + + @override + String get createNewAddress => 'Loo uus aadress'; + + @override + String get joinSpace => 'Liitu kogukonnaga'; + + @override + String get publicSpaces => 'Avalikud kogukonnad'; + + @override + String get addChatOrSubSpace => 'Lisa vestlus või jututuba'; + + @override + String get subspace => 'Jututuba või alamkogukond'; + + @override + String get decline => 'Keeldu'; + + @override + String get thisDevice => 'See seade:'; + + @override + String get initAppError => 'Rakenduse käivitamisel tekkis viga'; + + @override + String get userRole => 'Kasutaja roll'; + + @override + String minimumPowerLevel(String level) { + return '$level on väikseim võimalik õiguste tase.'; + } + + @override + String searchIn(String chat) { + return 'Otsi vestlusest „$chat“...'; + } + + @override + String get searchMore => 'Otsi veel...'; + + @override + String get gallery => 'Galerii'; + + @override + String get files => 'Failid'; + + @override + String databaseBuildErrorBody(String url, String error) { + return 'SQlite andmebaasi loomine ei õnnestu. Seetõttu üritab rakendus kasutada senist andmehoidlat. Palun teata sellest veast arendajatele siin: $url märkides veateate: $error'; + } + + @override + String sessionLostBody(String url, String error) { + return 'Sinu sessioon on kadunud. Palun teata sellest veast arendajatele siin: $url märkides veateate: $error'; + } + + @override + String restoreSessionBody(String url, String error) { + return 'Nüüd üritab rakendus taastada sinu sessiooni varukoopiast. Palun teata sellest veast arendajatele siin: $url märkides veateate: $error'; + } + + @override + String forwardMessageTo(String roomName) { + return 'Kas edastame sõnumi jututuppa $roomName?'; + } + + @override + String get sendReadReceipts => 'Saada lugemisteatisi'; + + @override + String get sendTypingNotificationsDescription => + 'Muud vestluses osalejad saavad näha, kui sa oled uut sõnumit kirjutamas.'; + + @override + String get sendReadReceiptsDescription => + 'Muud vestluses osalejad näevad, kas oled sõnumit lugenud.'; + + @override + String get formattedMessages => 'Vormindatud sõnumid'; + + @override + String get formattedMessagesDescription => + 'Kasutades markdown-süntaksit kuva vormindust, nagu rasvases kirjas tekst.'; + + @override + String get verifyOtherUser => '🔐 Verifitseeri teine kasutaja'; + + @override + String get verifyOtherUserDescription => + 'Kui sa oled vestluse teise osapoole verifitseerinud, siis saad kindel olla, et tead, kellega suhtled. 💪\n\nKui alustad verifitseerimist, siis sinul ja teisel osapoolel tekib rakenduses hüpikaken. Seal kuvatakse emotikonide või numbrite jada, mida peate omavahel võrdlema.\n\nKõige lihtsam on seda teha kas omavahelise kohtumise ajal või videokõne kestel. 👭'; + + @override + String get verifyOtherDevice => '🔐 Verifitseeri oma muu seade'; + + @override + String get verifyOtherDeviceDescription => + 'Kui sa oled oma muu seadme verifitseerinud, siis need seadmed võivad vahetada krüptovõtmeid ning see parandab üldist turvalisust. 💪 Kui alustad verifitseerimist, siis sinu mõlemas seadmes tekib rakenduses hüpikaken. Seal kuvatakse emotikonide või numbrite jada, mida pead omavahel võrdlema. On oluline, et mõlemad seadmed on verifitseerimise alustamisel sinu kõrval. 🤳'; + + @override + String acceptedKeyVerification(String sender) { + return '$sender nõustus krüptovõtmete verifitseerimisega'; + } + + @override + String canceledKeyVerification(String sender) { + return '$sender katkestas krüptovõtmete verifitseerimise'; + } + + @override + String completedKeyVerification(String sender) { + return '$sender sai valmis krüptovõtmete verifitseerimise'; + } + + @override + String isReadyForKeyVerification(String sender) { + return '$sender on valmis krüptovõtmete verifitseerimiseks'; + } + + @override + String requestedKeyVerification(String sender) { + return '$sender palus krüptovõtmete verifitseerimist'; + } + + @override + String startedKeyVerification(String sender) { + return '$sender alustas krüptovõtmete verifitseerimist'; + } + + @override + String get transparent => 'Läbipaistev'; + + @override + String get incomingMessages => 'Saabuvad sõnumid'; + + @override + String get stickers => 'Kleepsud'; + + @override + String get discover => 'Otsi ja leia'; + + @override + String get commandHint_ignore => 'Eira seda Matrixi kasutajatunnust'; + + @override + String get commandHint_unignore => + 'Lõpeta selle Matrixi kasutajatunnuse eiramine'; + + @override + String unreadChatsInApp(String appname, String unread) { + return '$appname: $unread lugemata vestlust'; + } + + @override + String get noDatabaseEncryption => + 'Andmebaasi krüptimine pole sellel platvormil toetatud'; + + @override + String thereAreCountUsersBlocked(Object count) { + return 'Hetkel on $count blokeeritud kasutajat.'; + } + + @override + String get restricted => 'Piiratud'; + + @override + String get knockRestricted => 'Koputa piiratud ligipääsuga jututoa uksele'; + + @override + String goToSpace(Object space) { + return 'Ava kogukond: $space'; + } + + @override + String get markAsUnread => 'Märgi mitteloetuks'; + + @override + String userLevel(int level) { + return '$level - kasutaja'; + } + + @override + String moderatorLevel(int level) { + return '$level - moderaator'; + } + + @override + String adminLevel(int level) { + return '$level - peakasutaja'; + } + + @override + String get changeGeneralChatSettings => 'Muuda vestluse üldiseid seadistusi'; + + @override + String get inviteOtherUsers => 'Kutsu teisi osalejaid sellesse vestlusesse'; + + @override + String get changeTheChatPermissions => 'Muuda vestluse õigusi'; + + @override + String get changeTheVisibilityOfChatHistory => + 'Muuda vestluse ajaloo nähtavust'; + + @override + String get changeTheCanonicalRoomAlias => + 'Muuda vestluse põhilist avalikult nähtavat aadressi'; + + @override + String get sendRoomNotifications => 'Saada @jututuba teavitusi'; + + @override + String get changeTheDescriptionOfTheGroup => 'Muuda vestluse kirjeldust'; + + @override + String get 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.'; + + @override + String updateInstalled(String version) { + return '🎉 Versiooniuuendus $version on paigaldatud!'; + } + + @override + String get changelog => 'Muudatuste logi'; + + @override + String get sendCanceled => 'Saatmine on katkestatud'; + + @override + String get loginWithMatrixId => 'Logi sisse Matrix-ID alusel'; + + @override + String get discoverHomeservers => 'Leia koduservereid'; + + @override + String get whatIsAHomeserver => 'Mis on koduserver?'; + + @override + String get homeserverDescription => + 'Sarnaselt e-postiteenuse pakkujale on kõik sinu sõnumid salvestatud koduserveris. Sa võid valida sellise koduserveri, nagu sulle meeldib ja nad kõik suudavad teiste koduserveritega suhelda. Lisateavet leiad veebisaidist https://matrix.org.'; + + @override + String get doesNotSeemToBeAValidHomeserver => + 'Ei tundu olema ühilduv koduserver. Kas võrguaadress on ikka õige?'; + + @override + String get calculatingFileSize => 'Arvutame faili suurust...'; + + @override + String get prepareSendingAttachment => 'Valmistume manuse saatmiseks...'; + + @override + String get sendingAttachment => 'Saadame manust...'; + + @override + String get generatingVideoThumbnail => 'Loome video pisipilti...'; + + @override + String get compressVideo => 'Pakime videot väiksemaks...'; + + @override + String sendingAttachmentCountOfCount(int index, int length) { + return 'Saadame manust: $index pikkusega $length...'; + } + + @override + String serverLimitReached(int seconds) { + return 'Serveri poolt lubatud ülempiir on käes. Ootame $seconds sekundit...'; + } + + @override + String get oneOfYourDevicesIsNotVerified => + 'Üks sinu seadmetest pole verifitseeritud'; + + @override + String get noticeChatBackupDeviceVerification => + 'Märkus: kui liidad kõik oma seadmed vestluste varundamisega, siis on nad sellega ka automaatselt verifitseeritud.'; + + @override + String get continueText => 'Jätka'; + + @override + String get welcomeText => + 'Tere, tere 👋 See on FluffyChat. Sa võid sisse logida igasse koduserverisse, mis ühildub https://matrix.org serveriga. Ja seejärel saad suhelda kõigiga. Tegemist on ikka väga suure detsentraliseeritud sõnumivõrguga!'; + + @override + String get blur => 'Hägusus:'; + + @override + String get opacity => 'Läbipaistmatus:'; + + @override + String get setWallpaper => 'Määra taustapildiks'; + + @override + String get manageAccount => 'Halda kasutajakontot'; + + @override + String get noContactInformationProvided => + 'Server ei jaga asjakohast kontaktteavet'; + + @override + String get contactServerAdmin => 'Võta ühendust serveri haldajaga'; + + @override + String get contactServerSecurity => + 'Võta ühendust serveri andmeturbe eest vastutajaga'; + + @override + String get supportPage => 'Kasutajatugi'; + + @override + String get serverInformation => 'Serveri teave:'; + + @override + String get name => 'Nimi'; + + @override + String get version => 'Versioon'; + + @override + String get website => 'Veebisait'; + + @override + String get compress => 'Paki kokku'; + + @override + String get boldText => 'Paks kiri'; + + @override + String get italicText => 'Kaldkiri'; + + @override + String get strikeThrough => 'Läbikriipsutatud kiri'; + + @override + String get pleaseFillOut => 'Palun täida'; + + @override + String get invalidUrl => 'Vigane võrguaadress'; + + @override + String get addLink => 'Lisa link'; + + @override + String get unableToJoinChat => + 'Vestlusega liitumine ei õnnestu. Võib-olla on teine osapool juba vestluse sulgenud.'; + + @override + String get previous => 'Eelmine'; + + @override + String get otherPartyNotLoggedIn => + 'Vestluse teine osapool pole hetkel võrku loginud ega seega saa neid sõnumeid kohe kätte!'; + + @override + String appWantsToUseForLogin(String server) { + return 'Sisselogimiseks kasuta serverit \'$server\''; + } + + @override + String get appWantsToUseForLoginDescription => + 'Järgnevaga lubad sa, et rakendus ja veebisait jagavad teavet sinu kohta.'; + + @override + String get open => 'Ava'; + + @override + String get waitingForServer => 'Ootame serveri vastust...'; + + @override + String get appIntroduction => + 'FluffyChat võimaldab sul suhelda sõprade ja tuttavatega, kes kasutavad erinevaid sõnumikliente. Lisateavet leiad https://matrix.org saidist või lihtsalt klõpsi „Jätka“.'; + + @override + String get newChatRequest => '📩 Uus vestluskutse'; + + @override + String get contentNotificationSettings => 'Sisuteavituste seadistused'; + + @override + String get generalNotificationSettings => 'Üldised teavituste seadistused'; + + @override + String get roomNotificationSettings => 'Jututoa teavituste seadistused'; + + @override + String get userSpecificNotificationSettings => + 'Kasutajakohaste teavituste seadistused'; + + @override + String get otherNotificationSettings => 'Muud teavituste seadistused'; + + @override + String get notificationRuleContainsUserName => 'Kasutajanime olemasolul'; + + @override + String get notificationRuleContainsUserNameDescription => + 'Teavita kasutajat, kui sõnumis on tema kasutajanimi.'; + + @override + String get notificationRuleMaster => 'Summuta kõik teavitused'; + + @override + String get notificationRuleMasterDescription => + 'Ära järgi muid reegleid ja lülita kõik teavitused välja.'; + + @override + String get notificationRuleSuppressNotices => + 'Ära teavita automaatsete sõnumite korral'; + + @override + String get notificationRuleSuppressNoticesDescription => + 'Ära teavita sõnumite puhul, mis on genereeritud masinate, nt jututubade robotite poolt.'; + + @override + String get notificationRuleInviteForMe => 'Kutsed mulle'; + + @override + String get notificationRuleInviteForMeDescription => + 'Teavita kasutajat jututoa kutse saamisel.'; + + @override + String get notificationRuleMemberEvent => + 'Jututoa liikmelisusega seotud sündmus'; + + @override + String get notificationRuleMemberEventDescription => + 'Ära teavita sõnumite puhul, mis seotud jututubade liikmelisusega.'; + + @override + String get notificationRuleIsUserMention => 'Kasutaja mainimised'; + + @override + String get notificationRuleIsUserMentionDescription => + 'Teavita kasutajat, kui ta on sõnumis otseselt mainitud.'; + + @override + String get notificationRuleContainsDisplayName => + 'Kuvatava nime sisaldumisel'; + + @override + String get notificationRuleContainsDisplayNameDescription => + 'Teavita kasutajat, kui sõnumis leidub ta kuvatav nimi.'; + + @override + String get notificationRuleIsRoomMention => 'Jututoa mainimine'; + + @override + String get notificationRuleIsRoomMentionDescription => + 'Teavita kasutajat, kui jututuba on sõnumis otseselt mainitud.'; + + @override + String get notificationRuleRoomnotif => 'Jututoa üldteavitus'; + + @override + String get notificationRuleRoomnotifDescription => + 'Teavita kasutajat, kui jututuba on sõnumis otseselt mainitud viisil „@toanimi“.'; + + @override + String get notificationRuleTombstone => 'Jututoa tegevuse lõpetamine'; + + @override + String get notificationRuleTombstoneDescription => + 'Teavita kasutajat jututoa väljalülitamisega seotud sõnumite korral.'; + + @override + String get notificationRuleReaction => 'Reageerimised'; + + @override + String get notificationRuleReactionDescription => + 'Teavita kasutajat sõnumitele reageerimise korral.'; + + @override + String get notificationRuleRoomServerAcl => + 'Jututoa ligipääsuõigused serveris'; + + @override + String get notificationRuleRoomServerAclDescription => + 'Peida teavitused jututoa ligipääsuõiguste muutuste korral serveris.'; + + @override + String get notificationRuleSuppressEdits => 'Peida muutmised'; + + @override + String get notificationRuleSuppressEditsDescription => + 'Peida teavitused sõnumite muutmise kohta.'; + + @override + String get notificationRuleCall => 'Kõned'; + + @override + String get notificationRuleCallDescription => + 'Teavita kasutajat saabuvast video- või häälkõnest.'; + + @override + String get notificationRuleEncryptedRoomOneToOne => + 'Kahepoolne vestlus krüptitud jututoas'; + + @override + String get notificationRuleEncryptedRoomOneToOneDescription => + 'Teavita kasutajat kahepoolse krüptitud vestluse sõnumitest.'; + + @override + String get notificationRuleRoomOneToOne => + 'Kahepoolne vestlus krüptimata jututoas'; + + @override + String get notificationRuleRoomOneToOneDescription => + 'Teavita kasutajat kahepoolse krüptimata vestluse sõnumitest.'; + + @override + String get notificationRuleMessage => 'Üldised sõnumid'; + + @override + String get notificationRuleMessageDescription => + 'Teavita kasutajat üldistest sõnumitest.'; + + @override + String get notificationRuleEncrypted => 'Krüptitud sõnumid'; + + @override + String get notificationRuleEncryptedDescription => + 'Teavita kasutajat sõnumitest krüptitud jututubades.'; + + @override + String get notificationRuleJitsi => 'Jitsi videokõned'; + + @override + String get notificationRuleJitsiDescription => + 'Teavita kasutajat sündmustest Jitsi vidinas.'; + + @override + String get notificationRuleServerAcl => 'Ligipääsuõigused serveris'; + + @override + String get notificationRuleServerAclDescription => + 'Peida teavitused ligipääsuõiguste muutuste korral serveris.'; + + @override + String unknownPushRule(String rule) { + return 'Tõuketeavituse tundmatu reegel \'$rule\''; + } + + @override + String get deletePushRuleCanNotBeUndone => + 'Kui sa kustutad selle teavituse seadistuse, siis seda tegevust tagasi võtta ei saa.'; + + @override + String get more => 'Lisateave'; + + @override + String get shareKeysWith => 'Jaga võtmeid seadmega...'; + + @override + String get shareKeysWithDescription => + 'Missuguseid seadmeid sa usaldad, et neist võiks lugeda krüptitud vestluste sõnumeid?'; + + @override + String get allDevices => 'Kõiki seadmeid'; + + @override + String get crossVerifiedDevicesIfEnabled => + 'Risttunnustatud seadmeid, kui see võimalus on kasutusel'; + + @override + String get crossVerifiedDevices => 'Risttunnustatud seadmeid'; + + @override + String get verifiedDevicesOnly => 'Vaid verifitseeritud seadmeid'; + + @override + String get takeAPhoto => 'Pildista'; + + @override + String get recordAVideo => 'Salvesta video'; + + @override + String get optionalMessage => 'Sõnum (kui soovid lisada)...'; + + @override + String get notSupportedOnThisDevice => 'See pole antud seadmes toetatud'; + + @override + String get enterNewChat => 'Liitu uue vestlusega'; + + @override + String get approve => 'Approve'; + + @override + String get youHaveKnocked => 'You have knocked'; + + @override + String get pleaseWaitUntilInvited => + 'Please wait now, until someone from the room invites you.'; +} diff --git a/lib/generated/l10n/l10n_eu.dart b/lib/generated/l10n/l10n_eu.dart new file mode 100644 index 0000000..35a3795 --- /dev/null +++ b/lib/generated/l10n/l10n_eu.dart @@ -0,0 +1,2757 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'l10n.dart'; + +// ignore_for_file: type=lint + +/// The translations for Basque (`eu`). +class L10nEu extends L10n { + L10nEu([String locale = 'eu']) : super(locale); + + @override + String get noSendPermission => 'You can\'t send messages here'; + + @override + String get alwaysUse24HourFormat => 'false'; + + @override + String get repeatPassword => 'Idatzi berriro pasahitza'; + + @override + String get notAnImage => 'Ez da irudi-fitxategia.'; + + @override + String get setCustomPermissionLevel => 'Set custom permission level'; + + @override + String get setPermissionsLevelDescription => + 'Please choose a predefined role below or enter a custom permission level between 0 and 100.'; + + @override + String get ignoreUser => 'Ignore user'; + + @override + String get normalUser => 'Normal user'; + + @override + String get remove => 'Kendu'; + + @override + String get importNow => 'Inportatu orain'; + + @override + String get importEmojis => 'Inportatu emojiak'; + + @override + String get importFromZipFile => 'Inportatu .zip fitxategi batetik'; + + @override + String get exportEmotePack => 'Esportatu emote-sorta .zip gisa'; + + @override + String get replace => 'Ordezkatu'; + + @override + String get about => 'Honi buruz'; + + @override + String aboutHomeserver(String homeserver) { + return '$homeserver(e)ri buruz'; + } + + @override + String get accept => 'Onartu'; + + @override + String acceptedTheInvitation(String username) { + return '👍 $username(e)k gonbidapena onartu du'; + } + + @override + String get account => 'Kontua'; + + @override + String activatedEndToEndEncryption(String username) { + return '🔐 $username(e)k ertzetik ertzerako zifratzea gaitu du'; + } + + @override + String get addEmail => 'Gehitu ePosta'; + + @override + String get confirmMatrixId => + 'Baieztatu zure Matrix IDa kontua ezabatu ahal izateko.'; + + @override + String supposedMxid(String mxid) { + return 'Hau $mxid izan behar da'; + } + + @override + String get addChatDescription => 'Gehitu txataren deskribapena…'; + + @override + String get addToSpace => 'Gehitu gunera'; + + @override + String get admin => 'Administratzailea'; + + @override + String get alias => 'ezizena'; + + @override + String get all => 'Guztia'; + + @override + String get allChats => 'Txat guztiak'; + + @override + String get commandHint_roomupgrade => + 'Upgrade this room to the given room version'; + + @override + String get commandHint_googly => 'Bidali begi dibertigarri batzuk'; + + @override + String get commandHint_cuddle => 'Bidali besarkada samurra'; + + @override + String get commandHint_hug => 'Bidali besarkada'; + + @override + String googlyEyesContent(String senderName) { + return '$senderName(e)k begi dibertigarri batzuk bidali dizkizu'; + } + + @override + String cuddleContent(String senderName) { + return '$senderName(e)k samurki besarkatu zaitu'; + } + + @override + String hugContent(String senderName) { + return '$senderName(e)k besarkatu zaitu'; + } + + @override + String answeredTheCall(String senderName) { + return '$senderName(e)k deia erantzun du'; + } + + @override + String get anyoneCanJoin => 'Edonor batu daiteke'; + + @override + String get appLock => 'Aplikazioa blokeatzea'; + + @override + String get appLockDescription => + 'Blokeatu aplikazioa pin kode batekin erabiltzen ari ez zarenean'; + + @override + String get archive => 'Fitxategia'; + + @override + String get areGuestsAllowedToJoin => + 'Batu daitezke bisitan dauden erabiltzaileak?'; + + @override + String get areYouSure => 'Ziur zaude?'; + + @override + String get areYouSureYouWantToLogout => + 'Ziur zaude saioa amaitu nahi duzula?'; + + @override + String get askSSSSSign => + 'Beste pertsona egiaztatzeko, sartu zure biltegiratze segururako pasaesaldia edo berreskuratze-gakoa.'; + + @override + String askVerificationRequest(String username) { + return '$username(r)en egiaztaketa-eskaera onartu?'; + } + + @override + String get autoplayImages => + 'Automatikoki abiarazi pegatina eta emote animatuak'; + + @override + String badServerLoginTypesException(String serverVersions, + String supportedVersions, Object suportedVersions) { + return 'Zerbitzariak ondorengo aukerak onartzen ditu saioa hasteko:\n$serverVersions\nBaina aplikazioak hauek onartzen ditu bakarrik:\n$supportedVersions'; + } + + @override + String get sendTypingNotifications => 'Jakinarazi idazten nagoela'; + + @override + String get swipeRightToLeftToReply => 'Herrestatu eskuin-ezker erantzuteko'; + + @override + String get sendOnEnter => 'Bidali enter sakatuz'; + + @override + String badServerVersionsException(String serverVersions, + String supportedVersions, Object serverVerions, Object suportedVersions) { + return 'Zerbitzariak ondorengo ezaugarriak onartzen ditu:\n$serverVersions\nBaina aplikazioak hauek onartzen ditu bakarrik: $supportedVersions'; + } + + @override + String countChatsAndCountParticipants(int chats, int participants) { + return '$chats txat eta $participants partaide'; + } + + @override + String get noMoreChatsFound => 'Ez da beste txatik aurkitu...'; + + @override + String get noChatsFoundHere => + 'Ez da txatik aurkitu. Hasi norbaitekin txateatzen beheko botoia erabiliz. ⤵️'; + + @override + String get joinedChats => 'Batu zaren txatak'; + + @override + String get unread => 'Irakurtzeke'; + + @override + String get space => 'Gunea'; + + @override + String get spaces => 'Guneak'; + + @override + String get banFromChat => 'Txatera batzeko debekua ezarri'; + + @override + String get banned => 'Kanporatuta'; + + @override + String bannedUser(String username, String targetName) { + return '$username(e)k $targetName(r)i debekua ezarri dio'; + } + + @override + String get blockDevice => 'Blokeatu gailua'; + + @override + String get blocked => 'Blokeatuta'; + + @override + String get botMessages => 'Boten mezuak'; + + @override + String get cancel => 'Utzi'; + + @override + String cantOpenUri(String uri) { + return 'Ezin da $uri URIa ireki'; + } + + @override + String get changeDeviceName => 'Aldatu gailuaren izena'; + + @override + String changedTheChatAvatar(String username) { + return '$username(e)k txataren abatarra aldatu du'; + } + + @override + String changedTheChatDescriptionTo(String username, String description) { + return '$username(e)k txataren deskribapena aldatu du: \'$description\''; + } + + @override + String changedTheChatNameTo(String username, String chatname) { + return '$username(e)k txataren izena \'$chatname\'(e)ra aldatu du'; + } + + @override + String changedTheChatPermissions(String username) { + return '$username(e)k txataren baimenak aldatu ditu'; + } + + @override + String changedTheDisplaynameTo(String username, String displayname) { + return '$username(e)k bere ezizena aldatu du. Aurrerantzean \'$displayname\' izango da'; + } + + @override + String changedTheGuestAccessRules(String username) { + return '$username(e)k bisitarien sarbide-arauak aldatu ditu'; + } + + @override + String changedTheGuestAccessRulesTo(String username, String rules) { + return '$username(e)k bisitarien arauak aldatu ditu: $rules'; + } + + @override + String changedTheHistoryVisibility(String username) { + return '$username(e)k historiaren ikusgaitasuna aldatu du'; + } + + @override + String changedTheHistoryVisibilityTo(String username, String rules) { + return '$username(e)k historiaren ikusgaitasuna $rules-(e)ra aldatu du'; + } + + @override + String changedTheJoinRules(String username) { + return '$username(e)k batzeko arauak aldatu ditu'; + } + + @override + String changedTheJoinRulesTo(String username, String joinRules) { + return '$username(e)k batzeko arauak aldatu ditu: $joinRules'; + } + + @override + String changedTheProfileAvatar(String username) { + return '$username(e)k profileko abatarra aldatu du'; + } + + @override + String changedTheRoomAliases(String username) { + return '$username(e)k gelaren ezizena aldatu du'; + } + + @override + String changedTheRoomInvitationLink(String username) { + return '$username(e)k gonbidapen-esteka aldatu du'; + } + + @override + String get changePassword => 'Aldatu pasahitza'; + + @override + String get changeTheHomeserver => 'Aldatu zerbitzaria'; + + @override + String get changeTheme => 'Aldatu itxura'; + + @override + String get changeTheNameOfTheGroup => 'Taldearen izena aldatu'; + + @override + String get changeYourAvatar => 'Aldatu abatarra'; + + @override + String get channelCorruptedDecryptError => 'Zifratzea hondatu egin da'; + + @override + String get chat => 'Txata'; + + @override + String get yourChatBackupHasBeenSetUp => 'Txaten babeskopiak ezarri dira.'; + + @override + String get chatBackup => 'Txataren babeskopia'; + + @override + String get chatBackupDescription => + 'Txat zaharrak berreskuratze-gako batekin daude babestuta. Ez galdu gako hori.'; + + @override + String get chatDetails => 'Txataren xehetasunak'; + + @override + String get chatHasBeenAddedToThisSpace => 'Txata gune honetara gehitu da'; + + @override + String get chats => 'Txatak'; + + @override + String get chooseAStrongPassword => 'Aukeratu pasahitz sendo bat'; + + @override + String get clearArchive => 'Ezabatu artxiboa'; + + @override + String get close => 'Itxi'; + + @override + String get commandHint_markasdm => + 'Markatu mezu-zuzen gela bezala Matrix ID jakin honentzat'; + + @override + String get commandHint_markasgroup => 'Markatu talde bezala'; + + @override + String get commandHint_ban => 'Debekatu erabiltzailea gela honetan'; + + @override + String get commandHint_clearcache => 'Ezabatu katxea'; + + @override + String get commandHint_create => + 'Sortu taldeko-txat huts bat\nErabili --no-encyption zifratzea desgaitzeko'; + + @override + String get commandHint_discardsession => 'Baztertu saioa'; + + @override + String get commandHint_dm => + 'Hasi banakako txat bat\nErabili --no-encyption zifratzea desgaitzeko'; + + @override + String get commandHint_html => 'Bidali testua HTML formatuan'; + + @override + String get commandHint_invite => 'Gonbidatu erabiltzailea gela honetara'; + + @override + String get commandHint_join => 'Batu gelara'; + + @override + String get commandHint_kick => 'Kendu erabiltzaile hori gela honetatik'; + + @override + String get commandHint_leave => 'Utzi gela hau'; + + @override + String get commandHint_me => 'Deskribatu zure burua'; + + @override + String get commandHint_myroomavatar => + 'Ezarri zure irudia gela honetarako (mxc-uri bidez)'; + + @override + String get commandHint_myroomnick => 'Ezarri zure ezizena gela honetarako'; + + @override + String get commandHint_op => + 'Zehaztu erabiltzaile honen botere-maila (defektuz: 50)'; + + @override + String get commandHint_plain => 'Bidali formaturik gabeko testua'; + + @override + String get commandHint_react => 'Bidali erantzuna erreakzio gisa'; + + @override + String get commandHint_send => 'Bidali testua'; + + @override + String get commandHint_unban => + 'Kendu erabiltzaileak gela honetan duen debekua'; + + @override + String get commandInvalid => 'Komandoa ez da baliozkoa'; + + @override + String commandMissing(String command) { + return '$command ez da komandoa.'; + } + + @override + String get compareEmojiMatch => 'Konparatu emojiak'; + + @override + String get compareNumbersMatch => 'Konparatu zenbakiak'; + + @override + String get configureChat => 'Txata konfiguratu'; + + @override + String get confirm => 'Baieztatu'; + + @override + String get connect => 'Konektatu'; + + @override + String get contactHasBeenInvitedToTheGroup => + 'Kontaktua taldera gonbidatu da'; + + @override + String get containsDisplayName => 'Ezizena dauka'; + + @override + String get containsUserName => 'Erabiltzaile-izena dauka'; + + @override + String get contentHasBeenReported => + 'Edukia zerbitzariko administratzaileei jakinarazi zaie'; + + @override + String get copiedToClipboard => 'Arbelera kopiatu da'; + + @override + String get copy => 'Kopiatu'; + + @override + String get copyToClipboard => 'Kopiatu arbelera'; + + @override + String couldNotDecryptMessage(String error) { + return 'Ezin izan da mezua deszifratu: $error'; + } + + @override + String countParticipants(int count) { + return '$count partaide'; + } + + @override + String get create => 'Sortu'; + + @override + String createdTheChat(String username) { + return '💬 $username(e)k txata sortu du'; + } + + @override + String get createGroup => 'Sortu taldea'; + + @override + String get createNewSpace => 'Gune berria'; + + @override + String get currentlyActive => 'Une honetan aktibo'; + + @override + String get darkTheme => 'Iluna'; + + @override + String dateAndTimeOfDay(String date, String timeOfDay) { + return '$date, $timeOfDay'; + } + + @override + String dateWithoutYear(String month, String day) { + return '$month/$day'; + } + + @override + String dateWithYear(String year, String month, String day) { + return '$year/$month/$day'; + } + + @override + String get deactivateAccountWarning => + 'Honek zure kontua desaktibatuko du. Ezin da desegin! Ziur zaude?'; + + @override + String get defaultPermissionLevel => + 'Erabiltzaile berrien defektuzko botere-maila'; + + @override + String get delete => 'Ezabatu'; + + @override + String get deleteAccount => 'Ezabatu kontua'; + + @override + String get deleteMessage => 'Mezuak ezabatu'; + + @override + String get device => 'Gailua'; + + @override + String get deviceId => 'Gailuaren IDa'; + + @override + String get devices => 'Gailuak'; + + @override + String get directChats => 'Banakako txatak'; + + @override + String get allRooms => 'Talde-txat guztiak'; + + @override + String get displaynameHasBeenChanged => 'Ezizena aldatu da'; + + @override + String get downloadFile => 'Deskargatu fitxategia'; + + @override + String get edit => 'Editatu'; + + @override + String get editBlockedServers => 'Editatu blokeatutako zerbitzariak'; + + @override + String get chatPermissions => 'Txataren baimenak'; + + @override + String get editDisplayname => 'Editatu ezizena'; + + @override + String get editRoomAliases => 'Editatu gelaren aliasak'; + + @override + String get editRoomAvatar => 'Gelaren abatarra editatu'; + + @override + String get emoteExists => 'Emotea badago lehendik ere!'; + + @override + String get emoteInvalid => 'Emotearen laburdura ez da baliozkoa!'; + + @override + String get emoteKeyboardNoRecents => + 'Oraintsu erabilitako emoteak hemen ageriko dira…'; + + @override + String get emotePacks => 'Gelarako emote-sortak'; + + @override + String get emoteSettings => 'Emote-ezarpenak'; + + @override + String get globalChatId => 'Txat ID orokorra'; + + @override + String get accessAndVisibility => 'Sarbidea eta ikusgaitasuna'; + + @override + String get accessAndVisibilityDescription => + 'Nork du txat honetara batzeko baimena eta nola aurkitu daiteke txata.'; + + @override + String get calls => 'Deiak'; + + @override + String get customEmojisAndStickers => 'Emoji eta pegatina propioak'; + + @override + String get customEmojisAndStickersBody => + 'Gehitu edo partekatu edozein txatetan erabil daitezkeen emoji edo pegatina propioak.'; + + @override + String get emoteShortcode => 'Laburdura'; + + @override + String get emoteWarnNeedToPick => + 'Emote-laburdura eta irudi bat aukeratu behar dituzu!'; + + @override + String get emptyChat => 'Txata hutsik dago'; + + @override + String get enableEmotesGlobally => 'Gaitu emote-sorta txat guztietarako'; + + @override + String get enableEncryption => 'Gaitu zifratzea'; + + @override + String get enableEncryptionWarning => + 'Ezingo duzu zifratzea ezgaitu. Ziur zaude?'; + + @override + String get encrypted => 'Zifratuta'; + + @override + String get encryption => 'Zifratzea'; + + @override + String get encryptionNotEnabled => 'Zifratzea ez dago gaituta'; + + @override + String endedTheCall(String senderName) { + return '$senderName(e)k deia amaitu du'; + } + + @override + String get enterAnEmailAddress => 'Sartu helbide elektroniko bat'; + + @override + String get homeserver => 'Zerbitzaria'; + + @override + String get enterYourHomeserver => 'Sartu zure zerbitzaria'; + + @override + String errorObtainingLocation(String error) { + return 'Errorea kokapena lortzerakoan: $error'; + } + + @override + String get everythingReady => 'Dena prest!'; + + @override + String get extremeOffensive => 'Izugarri iraingarria'; + + @override + String get fileName => 'Fitxategiaren izena'; + + @override + String get fluffychat => 'Extera'; + + @override + String get fontSize => 'Letraren tamaina'; + + @override + String get forward => 'Birbidali'; + + @override + String get fromJoining => 'Batzeaz geroztik'; + + @override + String get fromTheInvitation => 'Gonbidapenaz geroztik'; + + @override + String get goToTheNewRoom => 'Joan gela berrira'; + + @override + String get group => 'Taldea'; + + @override + String get chatDescription => 'Txataren deskribapena'; + + @override + String get chatDescriptionHasBeenChanged => 'Txataren deskribapena aldatu da'; + + @override + String get groupIsPublic => 'Taldea publikoa da'; + + @override + String get groups => 'Taldeak'; + + @override + String groupWith(String displayname) { + return '$displayname duen taldea'; + } + + @override + String get guestsAreForbidden => 'Ez, bisitariak ez daude baimenduta'; + + @override + String get guestsCanJoin => 'Bai, bisitariak batu daitezke'; + + @override + String hasWithdrawnTheInvitationFor(String username, String targetName) { + return '$username(e)k $targetName(r)en gonbidapena atzera bota du'; + } + + @override + String get help => 'Laguntza'; + + @override + String get hideRedactedEvents => 'Ezkutatu atzera botatako gertaerak'; + + @override + String get hideRedactedMessages => 'Ezkutatu atzera botatako mezuak'; + + @override + String get hideRedactedMessagesBody => + 'Norbaitek mezuren bat atzera botaz gero, mezua txatetik kenduko da, abisurik gabe.'; + + @override + String get hideInvalidOrUnknownMessageFormats => + 'Ezkutatu mezuen formatu ezezagun edo baliogabea'; + + @override + String get howOffensiveIsThisContent => + 'Zenbaterainoko iraingarria da eduki hau?'; + + @override + String get id => 'IDa'; + + @override + String get identity => 'Identitatea'; + + @override + String get block => 'Blokeatu'; + + @override + String get blockedUsers => 'Blokeatutako erabiltzaileak'; + + @override + String get blockListDescription => + 'Gogaitzen zaituzten erabiltzaileak blokeatu ditzakezu. Ez duzu blokeatutakoen zerrendan dituzun erabiltzaileen mezurik edo gelara batzeko gonbidapenik jasoko.'; + + @override + String get blockUsername => 'Ezikusi erabiltzaile-izena'; + + @override + String get iHaveClickedOnLink => 'Estekan sakatu dut'; + + @override + String get incorrectPassphraseOrKey => + 'Pasaesaldi edo berreskuratze-gakoa ez da zuzena'; + + @override + String get inoffensive => 'Ez da iraingarria'; + + @override + String get inviteContact => 'Kontaktuak gonbidatu'; + + @override + String inviteContactToGroupQuestion(Object contact, Object groupName) { + return '$contact \"$groupName\" txatera gonbidatu nahi duzu?'; + } + + @override + String inviteContactToGroup(String groupName) { + return 'Gonbidatu kontaktua $groupName(e)ra'; + } + + @override + String get noChatDescriptionYet => + 'Ez da txaterako deskribapenik sortu oraindik.'; + + @override + String get tryAgain => 'Saiatu berriro'; + + @override + String get invalidServerName => 'Zerbitzari-izenak ez du balio'; + + @override + String get invited => 'Gonbidatuta'; + + @override + String get redactMessageDescription => + 'Mezua elkarrizketa honetako partaide guztientzat botako da atzera. Ezin da desegin.'; + + @override + String get optionalRedactReason => + '(Aukerakoa) Mezua atzera botatzearen arrazoia…'; + + @override + String invitedUser(String username, String targetName) { + return '📩 $username(e)k $targetName gonbidatu du'; + } + + @override + String get invitedUsersOnly => 'Gonbidatutako erabiltzaileak solik'; + + @override + String get inviteForMe => 'Niretzako gonbidapenak'; + + @override + String inviteText(String username, String link) { + return '$username(e)k FluffyChatera gonbidatu zaitu.\n1. Bisitatu https://fluffychat.im eta instalatu aplikazioa\n2. Eman izena edo hasi saioa\n3. Ireki gonbidapen-esteka:\n$link'; + } + + @override + String get isTyping => 'idazten ari da…'; + + @override + String joinedTheChat(String username) { + return '👋 $username txatera batu da'; + } + + @override + String get joinRoom => 'Batu gelara'; + + @override + String kicked(String username, String targetName) { + return '👞 $username(e)k $targetName kanporatu du'; + } + + @override + String kickedAndBanned(String username, String targetName) { + return '🙅 $username(e)k $targetName kanporatu eta debekua ezarri dio'; + } + + @override + String get kickFromChat => 'Txatetik kanporatu'; + + @override + String lastActiveAgo(String localizedTimeShort) { + return 'Azkenekoz aktibo: $localizedTimeShort'; + } + + @override + String get leave => 'Irten'; + + @override + String get leftTheChat => 'Txatetik irten da'; + + @override + String get license => 'Lizentzia'; + + @override + String get lightTheme => 'Argia'; + + @override + String loadCountMoreParticipants(int count) { + return 'Kargatu $count partaide gehiago'; + } + + @override + String get dehydrate => 'Esportatu saioa eta ezabatu gailua'; + + @override + String get dehydrateWarning => + 'Ekintza hau ezin da desegin. Egiaztatu babeskopia toki seguruan gorde duzula.'; + + @override + String get dehydrateTor => 'TOR Erabiltzaileak: Esportatu saioa'; + + @override + String get dehydrateTorLong => + 'TOR erabiltzaileentzat gomendioa leihoa itxi baino lehen saioa esportatzea da.'; + + @override + String get hydrateTor => 'TOR Erabiltzaileak: Inportatu esportatutako saioa'; + + @override + String get hydrateTorLong => + 'Esportatu al zenuen zure saioa TOR erabili zenuen azken aldian? Inportatu segidan eta jarraitu txateatzen.'; + + @override + String get hydrate => 'Lehengoratu babeskopia bat erabiliz'; + + @override + String get loadingPleaseWait => 'Kargatzen… itxaron.'; + + @override + String get loadMore => 'Kargatu gehiago…'; + + @override + String get locationDisabledNotice => + 'Kokapen zerbitzuak ezgaituta daude. Gaitu zure kokapena partekatu ahal izateko.'; + + @override + String get locationPermissionDeniedNotice => + 'Kokapen baimena ukatu da. Eman zure kokapena partekatzeko baimena.'; + + @override + String get login => 'Hasi saioa'; + + @override + String logInTo(String homeserver) { + return 'Hasi saioa $homeserver(e)n'; + } + + @override + String get logout => 'Amaitu saioa'; + + @override + String get memberChanges => 'Kideen aldaketak'; + + @override + String get mention => 'Aipatu'; + + @override + String get messages => 'Mezuak'; + + @override + String get messagesStyle => 'Mezuak:'; + + @override + String get moderator => 'Moderatzailea'; + + @override + String get muteChat => 'Mututu txata'; + + @override + String get needPantalaimonWarning => + 'Kontuan izan oraingoz Pantalaimon behar duzula ertzetik ertzerako zifratzerako.'; + + @override + String get newChat => 'Txat berria'; + + @override + String get newMessageInFluffyChat => '💬 Mezu berria FluffyChaten'; + + @override + String get newVerificationRequest => 'Egiaztaketa-eskaera berria!'; + + @override + String get next => 'Hurrengoa'; + + @override + String get no => 'Ez'; + + @override + String get noConnectionToTheServer => 'Ez dago konexiorik zerbitzariarekin'; + + @override + String get noEmotesFound => 'Ez da emoterik aurkitu. 😕'; + + @override + String get noEncryptionForPublicRooms => + 'Zifratzea aktiba dezakezu soilik gelak publikoa izateari utzi badio.'; + + @override + String get noGoogleServicesWarning => + 'Ez dirudi Firebase Cloud Messaging zure mugikorrean erabilgarri dagoenik. Jakinarazpenak jasotzeko ntfy instalatzea gomendatzen dugu. ntfy edo beste Unified Push hornitzaileren batekin, push jakinarazpenak jaso ditzazkezu datuentzako segurua den modu batean. ntfy PlayStore edo F-Droid dendetatik deskarga dezakezu.'; + + @override + String noMatrixServer(String server1, String server2) { + return '$server1 ez da matrix zerbitzari bat, $server2 erabili nahi duzu haren ordez?'; + } + + @override + String get shareInviteLink => 'Partekatu gonbidapen-esteka'; + + @override + String get scanQrCode => 'Eskaneatu QR kodea'; + + @override + String get none => 'Bat ere ez'; + + @override + String get noPasswordRecoveryDescription => + 'Oraindik ez duzu pasahitza berreskuratzeko modurik gehitu.'; + + @override + String get noPermission => 'Baimenik gabe'; + + @override + String get noRoomsFound => 'Ez da gelarik aurkitu…'; + + @override + String get notifications => 'Jakinarazpenak'; + + @override + String get notificationsEnabledForThisAccount => + 'Gaitu kontu honentzako jakinarazpenak'; + + @override + String numUsersTyping(int count) { + return '$count erabiltzaile idazten ari dira…'; + } + + @override + String get obtainingLocation => 'Kokapena atzitzen…'; + + @override + String get offensive => 'Iraingarria'; + + @override + String get offline => 'Lineaz kanpo'; + + @override + String get ok => 'Ados'; + + @override + String get online => 'Linean'; + + @override + String get onlineKeyBackupEnabled => 'Gakoen online babeskopia gaituta dago'; + + @override + String get oopsPushError => + 'Hara! Zoritxarrez, errore bat gertatu da push jakinarazpenak ezartzerakoan.'; + + @override + String get oopsSomethingWentWrong => 'Hara, zerbaitek huts egin du…'; + + @override + String get openAppToReadMessages => 'Ireki aplikazioa mezuak irakurtzeko'; + + @override + String get openCamera => 'Ireki kamera'; + + @override + String get openVideoCamera => 'Ireki kamera bideorako'; + + @override + String get oneClientLoggedOut => 'Zure gailuetako batek saioa amaitu du'; + + @override + String get addAccount => 'Gehitu kontua'; + + @override + String get editBundlesForAccount => 'Editatu kontu honetarako sortak'; + + @override + String get addToBundle => 'Gehitu sortara'; + + @override + String get removeFromBundle => 'Kendu sorta honetatik'; + + @override + String get bundleName => 'Sortaren izena'; + + @override + String get enableMultiAccounts => + '(BETA) Gaitu kontu bat baino gehiago gailu honetan'; + + @override + String get openInMaps => 'Ireki mapen aplikazioan'; + + @override + String get link => 'Esteka'; + + @override + String get serverRequiresEmail => + 'Zerbitzari honek zure posta elektronikoa egiaztatu behar du izena eman dezazun.'; + + @override + String get or => 'Edo'; + + @override + String get participant => 'Partaide'; + + @override + String get passphraseOrKey => 'pasaesaldia edo berreskuratze-gakoa'; + + @override + String get password => 'Pasahitza'; + + @override + String get passwordForgotten => 'Pasahitza ahaztu dut'; + + @override + String get passwordHasBeenChanged => 'Pasahitza aldatu da'; + + @override + String get hideMemberChangesInPublicChats => + 'Ezkutatu kideen egoera aldaketak txat publikoetan'; + + @override + String get hideMemberChangesInPublicChatsBody => + 'Ez erakutsi txataren denbora-lerroan norbait txat publikora batu edo txatetik irteten dela, irakurgaitasuna hobetzeko.'; + + @override + String get overview => 'Ikuspegi orokorra'; + + @override + String get notifyMeFor => 'Jakinarazi…'; + + @override + String get passwordRecoverySettings => 'Pasahitza berreskuratzeko ezarpenak'; + + @override + String get passwordRecovery => 'Pasahitzaren berreskurapena'; + + @override + String get people => 'Jendea'; + + @override + String get pickImage => 'Aukeratu irudi bat'; + + @override + String get pin => 'Finkatu'; + + @override + String play(String fileName) { + return 'Abiarazi $fileName'; + } + + @override + String get pleaseChoose => 'Aukeratu'; + + @override + String get pleaseChooseAPasscode => 'Aukeratu sartzeko kode bat'; + + @override + String get pleaseClickOnLink => + 'Sakatu ePostako estekan eta ondoren jarraitu.'; + + @override + String get pleaseEnter4Digits => + 'Sartu lau zenbaki edo utzi hutsik aplikazioa babestu nahi ez baduzu.'; + + @override + String get pleaseEnterRecoveryKey => 'Sartu berreskuratze-gakoa:'; + + @override + String get pleaseEnterYourPassword => 'Sartu zure pasahitza'; + + @override + String get pleaseEnterYourPin => 'Sartu zure PINa'; + + @override + String get pleaseEnterYourUsername => 'Sartu zure erabiltzaile-izena'; + + @override + String get pleaseFollowInstructionsOnWeb => + 'Jarraitu webguneko argibideak eta sakatu \'Hurrengoa\'.'; + + @override + String get privacy => 'Pribatutasuna'; + + @override + String get publicRooms => 'Gela publikoak'; + + @override + String get pushRules => 'Push arauak'; + + @override + String get reason => 'Arrazoia'; + + @override + String get recording => 'Grabatzen'; + + @override + String redactedBy(String username) { + return '$username(e)k atzera bota du'; + } + + @override + String get directChat => 'Banakako txata'; + + @override + String redactedByBecause(String username, String reason) { + return '$username(e)k atzera bota du \"$reason\" dela-eta'; + } + + @override + String redactedAnEvent(String username) { + return '$username(e)k gertaera bat atzera bota du'; + } + + @override + String get redactMessage => 'Bota mezua atzera'; + + @override + String get register => 'Eman izena'; + + @override + String get reject => 'Baztertu'; + + @override + String rejectedTheInvitation(String username) { + return '$username(e)k gonbidapena baztertu du'; + } + + @override + String get rejoin => 'Batu berriro'; + + @override + String get removeAllOtherDevices => 'Kendu gainerako gailu guztiak'; + + @override + String removedBy(String username) { + return '$username(e)k kendu du'; + } + + @override + String get removeDevice => 'Kendu gailua'; + + @override + String get unbanFromChat => 'Kendu txatean duen debekua'; + + @override + String get removeYourAvatar => 'Kendu zure abatarra'; + + @override + String get replaceRoomWithNewerVersion => + 'Ordezkatu gela bertsio berriago batekin'; + + @override + String get reply => 'Erantzun'; + + @override + String get reportMessage => 'Salatu mezua'; + + @override + String get translateMessage => 'Translate message'; + + @override + String get translatedMessage => 'Translated message'; + + @override + String get errorTranslatingMessage => + 'An error has occured while translating the message.'; + + @override + String get recoverMessage => 'Recover message'; + + @override + String get recoveredMessage => 'Recovered message'; + + @override + String get errorRecoveringMessage => + 'An error has occured while recovering the message.'; + + @override + String get errorRecoveringMessageNoAdmin => + 'This feature is available on Synapse homeservers only for adminstrators.'; + + @override + String get requestPermission => 'Eskatu baimena'; + + @override + String get roomHasBeenUpgraded => 'Gela bertsio-berritu da'; + + @override + String get roomVersion => 'Gelaren bertsioa'; + + @override + String get saveFile => 'Gorde fitxategia'; + + @override + String get retry => 'Retry'; + + @override + String get search => 'Bilatu'; + + @override + String get security => 'Segurtasuna'; + + @override + String get recoveryKey => 'Berreskuratze-gakoa'; + + @override + String get recoveryKeyLost => 'Berreskuratze-gakoa galdu duzu?'; + + @override + String seenByUser(String username) { + return '$username(e)k ikusi du'; + } + + @override + String get send => 'Bidali'; + + @override + String get sendAMessage => 'Bidali mezua'; + + @override + String get sendAsText => 'Bidali testu bezala'; + + @override + String get sendAudio => 'Bidali audioa'; + + @override + String get sendFile => 'Bidali fitxategia'; + + @override + String get sendImage => 'Bidali irudia'; + + @override + String sendImages(int count) { + return 'Bidali $count irudi'; + } + + @override + String get sendMessages => 'Mezuak bidali'; + + @override + String get sendOriginal => 'Bidali jatorrizkoa'; + + @override + String get sendSticker => 'Bidali pegatina'; + + @override + String get sendVideo => 'Bidali bideoa'; + + @override + String sentAFile(String username) { + return '📁 $username(e)k fitxategia bidali du'; + } + + @override + String sentAnAudio(String username) { + return '🎤 $username(e)k audioa bidali du'; + } + + @override + String sentAPicture(String username) { + return '🖼️ $username(e)k irudia bidali du'; + } + + @override + String sentASticker(String username) { + return '😊 $username(e)k pegatina bidali du'; + } + + @override + String sentAVideo(String username) { + return '🎥 $username(e)k bideoa bidali du'; + } + + @override + String sentCallInformations(String senderName) { + return '$senderName(e)k deiaren informazioa bidali du'; + } + + @override + String get separateChatTypes => 'Bereizi banakako mezuak eta taldeak'; + + @override + String get setAsCanonicalAlias => 'Ezarri alias nagusi bezala'; + + @override + String get setCustomEmotes => 'Ezarri zure emoteak'; + + @override + String get setChatDescription => 'Ezarri txataren deskribapena'; + + @override + String get setInvitationLink => 'Gonbidapen-esteka ezarri'; + + @override + String get setPermissionsLevel => 'Ezarri baimen-maila'; + + @override + String get setStatus => 'Ezarri egoera'; + + @override + String get settings => 'Ezarpenak'; + + @override + String get share => 'Partekatu'; + + @override + String sharedTheLocation(String username) { + return '$username(e)k kokapena partekatu du'; + } + + @override + String get shareLocation => 'Partekatu kokapena'; + + @override + String get showPassword => 'Erakutsi pasahitza'; + + @override + String get presenceStyle => 'Presentzia:'; + + @override + String get hideAvatarsInInvites => 'Hide avatars in invites'; + + @override + String get hideAvatarsInInvitesDescription => + 'Do not show room avatars in invites'; + + @override + String get presencesToggle => 'Erakutsi beste erabiltzaileen egoera-mezuak'; + + @override + String get pureBlackToggle => 'Pure Black'; + + @override + String get singlesignon => 'Single Sign on'; + + @override + String get skip => 'Saltatu'; + + @override + String get sourceCode => 'Iturburu kodea'; + + @override + String get spaceIsPublic => 'Gunea publikoa da'; + + @override + String get spaceName => 'Gunearen izena'; + + @override + String startedACall(String senderName) { + return '$senderName(e)k deia hasi du'; + } + + @override + String get startFirstChat => 'Hasi zure lehen txata'; + + @override + String get status => 'Egoera'; + + @override + String get statusExampleMessage => 'Zer moduz zaude gaur?'; + + @override + String get submit => 'Bidali'; + + @override + String get synchronizingPleaseWait => 'Sinkronizatzen… itxaron.'; + + @override + String synchronizingPleaseWaitCounter(String percentage) { + return ' Sinkronizatzen… (%$percentage)'; + } + + @override + String get systemTheme => 'Sistemak darabilena'; + + @override + String get theyDontMatch => 'Ez datoz bat'; + + @override + String get theyMatch => 'Bat datoz'; + + @override + String get title => 'Extera'; + + @override + String get toggleFavorite => 'Ikusi / Ezkutatu gogokoak'; + + @override + String get toggleMuted => 'Ikusi / Ezkutatu mutututakoak'; + + @override + String get toggleUnread => 'Markatu irakurrita / irakurri gabe'; + + @override + String get tooManyRequestsWarning => + 'Eskaera gehiegi. Saiatu berriro geroago!'; + + @override + String get transferFromAnotherDevice => 'Beste gailu batetik transferitu'; + + @override + String get tryToSendAgain => 'Saiatu berriro bidaltzen'; + + @override + String get unavailable => 'Ez dago eskuragai'; + + @override + String unbannedUser(String username, String targetName) { + return '$username(e)k $targetName(r)i debekua kendu dio'; + } + + @override + String get unblockDevice => 'Desblokeatu gailua'; + + @override + String get unknownDevice => 'Gailu ezezaguna'; + + @override + String get unknownEncryptionAlgorithm => 'Zifratze-algoritmo ezezaguna'; + + @override + String unknownEvent(String type) { + return '\'$type\' gertaera ezezaguna'; + } + + @override + String get unmuteChat => 'Utzi txata mututzeari'; + + @override + String get unpin => 'Utzi finkatzeari'; + + @override + String unreadChats(int unreadCount) { + String _temp0 = intl.Intl.pluralLogic( + unreadCount, + locale: localeName, + other: 'irakurri gabeko $unreadCount txat', + one: 'irakurri gabeko txat 1', + ); + return '$_temp0'; + } + + @override + String userAndOthersAreTyping(String username, int count) { + return '$username eta beste $count idazten ari dira…'; + } + + @override + String userAndUserAreTyping(String username, String username2) { + return '$username eta $username2 idazten ari dira…'; + } + + @override + String userIsTyping(String username) { + return '$username idazten ari da…'; + } + + @override + String userLeftTheChat(String username) { + return '🚪 $username(e)k txata utzi du'; + } + + @override + String get username => 'Erabiltzaile-izena'; + + @override + String userSentUnknownEvent(String username, String type) { + return '$username(e)k $type gertaera bat bidali du'; + } + + @override + String get unverified => 'Egiaztatu gabe(a)'; + + @override + String get verified => 'Egiaztatuta'; + + @override + String get verify => 'Egiaztatu'; + + @override + String get verifyStart => 'Abiarazi egiaztaketa'; + + @override + String get verifySuccess => 'Ondo egiaztatu duzu!'; + + @override + String get verifyTitle => 'Beste kontua egiaztatzen'; + + @override + String get videoCall => 'Bideo-deia'; + + @override + String get visibilityOfTheChatHistory => 'Txat-historiaren ikusgaitasuna'; + + @override + String get visibleForAllParticipants => 'Partaide guztientzat ikusgai'; + + @override + String get visibleForEveryone => 'Edonorentzat ikusgai'; + + @override + String get voiceMessage => 'Ahozko mezua'; + + @override + String get waitingPartnerAcceptRequest => 'Kideak eskaera onartuko zain…'; + + @override + String get waitingPartnerEmoji => 'Kideak emojia onartuko zain…'; + + @override + String get waitingPartnerNumbers => 'Kideak zenbakiak onartuko zain…'; + + @override + String get wallpaper => 'Horma-irudia:'; + + @override + String get warning => 'Kontuz!'; + + @override + String get weSentYouAnEmail => 'ePosta bat bidali dizugu'; + + @override + String get whoCanPerformWhichAction => 'Nork zer egin dezakeen'; + + @override + String get whoIsAllowedToJoinThisGroup => 'Nor batu daiteke talde honetara?'; + + @override + String get whyDoYouWantToReportThis => 'Zergatik salatu nahi duzu?'; + + @override + String get wipeChatBackup => + 'Ezabatu txataren babeskopia berreskuratze-gako berria sortzeko?'; + + @override + String get withTheseAddressesRecoveryDescription => + 'Helbide hauekin pasahitza berreskuratu dezakezu.'; + + @override + String get writeAMessage => 'Idatzi mezua…'; + + @override + String get yes => 'Bai'; + + @override + String get you => 'Zeu'; + + @override + String get youAreNoLongerParticipatingInThisChat => + 'Ez duzu txat honetan parte hartzen honezkero'; + + @override + String get youHaveBeenBannedFromThisChat => + 'Txat honetan debekua ezarri dizute'; + + @override + String get yourPublicKey => 'Zure gako publikoa'; + + @override + String get messageInfo => 'Mezuaren xehetasunak'; + + @override + String get time => 'Ordua'; + + @override + String get messageType => 'Mezu mota'; + + @override + String get sender => 'Igorlea'; + + @override + String get openGallery => 'Ireki bilduma'; + + @override + String get removeFromSpace => 'Kendu gunetik'; + + @override + String get addToSpaceDescription => + 'Hautatu gune bat txat hau bertara gehitzeko.'; + + @override + String get start => 'Hasi'; + + @override + String get pleaseEnterRecoveryKeyDescription => + 'Mezu zaharrak ikusi ahal izateko, sartu aurreko saioan sortu zen berreskuratze-gakoa. Berreskuratze-gakoa EZ da zure pasahitza.'; + + @override + String get publish => 'Argitaratu'; + + @override + String videoWithSize(String size) { + return 'Bideoa ($size)'; + } + + @override + String get openChat => 'Ireki txata'; + + @override + String get markAsRead => 'Markatu irakurritzat'; + + @override + String get reportUser => 'Salatu erabiltzailea'; + + @override + String get dismiss => 'Baztertu'; + + @override + String reactedWith(String sender, String reaction) { + return '$sender(e)k $reaction(r)ekin erreakzionatu du'; + } + + @override + String get pinMessage => 'Finkatu gelan'; + + @override + String get confirmEventUnpin => + 'Ziur zaude gertaera finaktzeari utzi nahi diozula?'; + + @override + String get emojis => 'Emojiak'; + + @override + String get placeCall => 'Egin deia'; + + @override + String get voiceCall => 'Ahozko deia'; + + @override + String get unsupportedAndroidVersion => 'Android bertsioa ez da bateragarria'; + + @override + String get unsupportedAndroidVersionLong => + 'Funtzio honek Android bertsio berriago bat behar du. Egiaztatu eguneraketak ote dauden edo begiratu Lineage OS-ek zure gailuarentzat aukerarik eskaintzen duen.'; + + @override + String get videoCallsBetaWarning => + 'Kontuan izan bideo-deiak beta fasean daudela. Litekeena da behar bezala erabili ezin izatea —erabili ahal badira—.'; + + @override + String get experimentalVideoCalls => 'Bideo-dei esperimentalak'; + + @override + String get emailOrUsername => 'ePosta edo erabiltzaile-izena'; + + @override + String get indexedDbErrorTitle => 'Arazoak modu pribatuarekin'; + + @override + String get indexedDbErrorLong => + 'Mezuen artxibatzea ez dago defektuz gaituta modu pribatua erabiltzean.\nGaitzeko:\n - about:config\n - dom.indexedDB.privateBrowsing.enabled aukerak true erakutsi dezala\nBestela ezin da Extera erabili.'; + + @override + String switchToAccount(String number) { + return 'Aldatu $number kontura'; + } + + @override + String get nextAccount => 'Hurrengo kontua'; + + @override + String get previousAccount => 'Aurreko kontua'; + + @override + String get addWidget => 'Gehitu widgeta'; + + @override + String get widgetVideo => 'Bideoa'; + + @override + String get widgetEtherpad => 'Testu-oharra'; + + @override + String get widgetJitsi => 'Jitsi Meet'; + + @override + String get widgetCustom => 'Norberak ezarritakoa'; + + @override + String get widgetName => 'Izena'; + + @override + String get widgetUrlError => 'Ez da baliozko URLa.'; + + @override + String get widgetNameError => 'Zehaztu ezizen bat.'; + + @override + String get errorAddingWidget => 'Errorea widgeta gehitzerakoan.'; + + @override + String get youRejectedTheInvitation => 'Gonbidapena baztertu duzu'; + + @override + String get youJoinedTheChat => 'Txatera batu zara'; + + @override + String get youAcceptedTheInvitation => '👍 Gonbidapena onartu duzu'; + + @override + String youBannedUser(String user) { + return '$user(r)i debekua ezarri diozu'; + } + + @override + String youHaveWithdrawnTheInvitationFor(String user) { + return '$user(r)i luzatutako gonbidapena baliogabetu duzu'; + } + + @override + String youInvitedToBy(String alias) { + return '📩 Esteka baten bidez gonbidatu zaituzte:\n$alias'; + } + + @override + String youInvitedBy(String user) { + return '📩 $user(e)k gonbidatu zaitu'; + } + + @override + String invitedBy(String user) { + return '📩 $user(e)k gonbidatua'; + } + + @override + String youInvitedUser(String user) { + return '📩 $user gonbidatu duzu'; + } + + @override + String youKicked(String user) { + return '👞 $user kanporatu duzu'; + } + + @override + String youKickedAndBanned(String user) { + return '🙅 $user kanporatu eta debekua ezarri diozu'; + } + + @override + String youUnbannedUser(String user) { + return '$user(r)i debekua kendu diozu'; + } + + @override + String hasKnocked(String user) { + return '🚪 $user(e)k baimena eskatu du'; + } + + @override + String get usersMustKnock => 'Erabiltzaileek baimena eskatu behar dute'; + + @override + String get noOneCanJoin => 'Ezin da inor batu'; + + @override + String userWouldLikeToChangeTheChat(String user) { + return '$user(e)k txatera batu nahiko luke.'; + } + + @override + String get noPublicLinkHasBeenCreatedYet => + 'Oraindik ez da esteka publikorik sortu'; + + @override + String get knock => 'Eskatu baimena'; + + @override + String get users => 'Erabiltzaileak'; + + @override + String get unlockOldMessages => 'Desblokeatu mezu zaharrak'; + + @override + String get storeInSecureStorageDescription => + 'Gorde berreskuratze-gakoa gailu honetako biltegiratze seguruan.'; + + @override + String get saveKeyManuallyDescription => + 'Gorde eskuz gako hau gailuko partekatze-menua edo arbela erabiliz.'; + + @override + String get storeInAndroidKeystore => 'Gorde Android KeyStore-n'; + + @override + String get storeInAppleKeyChain => 'Gorde Apple KeyChain-en'; + + @override + String get storeSecurlyOnThisDevice => 'Gorde gailu honetan modu seguruan'; + + @override + String countFiles(int count) { + return '$count fitxategi'; + } + + @override + String get user => 'Erabiltzailea'; + + @override + String get custom => 'Neurrira egindakoa'; + + @override + String get foregroundServiceRunning => + 'Jakinarazpen hau zerbitzua martxan dagoenean agertzen da.'; + + @override + String get screenSharingTitle => 'pantaila-partekatzea'; + + @override + String get screenSharingDetail => + 'Pantaila FluffyChaten partekatzen ari zara'; + + @override + String get callingPermissions => 'Deitzeko baimenak'; + + @override + String get callingAccount => 'Deitzen ari den kontua'; + + @override + String get callingAccountDetails => + 'Baimendu Extera Android gailuko telefono-markagailua erabiltzea.'; + + @override + String get appearOnTop => 'Gainean erakutsi'; + + @override + String get appearOnTopDetails => + 'Aplikazioa goikaldean agertzea baimentzen du (ez da beharrezkoa Extera deitzeko kontutzat ezarri baduzu)'; + + @override + String get otherCallingPermissions => + 'Mikrofono, kamera eta FluffyChaten beste baimen batzuk'; + + @override + String get whyIsThisMessageEncrypted => 'Zergatik ezin da mezu hau irakurri?'; + + @override + String get noKeyForThisMessage => + 'Mezua gailu honetan saioa hasi baino lehen bidali bazen gertatu daiteke.\n\nBeste aukera bat igorleak zure gailua blokeatu izana da, edo zerbaitek huts egin izana interneteko konexioan.\n\nMezua beste saio batean irakur dezakezu? Hala bada, mezua transferitu dezakezu! Zoaz Ezrpenetara > Gailuak eta baieztatu zure gailuek bata bestea egiaztatu dutela. Gela irekiko duzun hurrengo aldian eta bi saioak aurreko planoan irekita daudenean, gakoak automatikoki partekatuko dira.\n\nEz duzu gakorik galdu nahi saioa amaitu edo gailuak aldatzen dituzunean? Baieztatu ezarpenetan txaten babeskopiak gaituta dituzula.'; + + @override + String get newGroup => 'Talde berria'; + + @override + String get newSpace => 'Gune berria'; + + @override + String get enterSpace => 'Sartu gunera'; + + @override + String get enterRoom => 'Sartu gelara'; + + @override + String get allSpaces => 'Gune guztiak'; + + @override + String numChats(String number) { + return '$number txat'; + } + + @override + String get hideUnimportantStateEvents => + 'Ezkutatu garrantzirik gabeko gertaerak'; + + @override + String get hidePresences => 'Ezkutatu Egoeren Zerrenda?'; + + @override + String get doNotShowAgain => 'Ez erakutsi berriro'; + + @override + String wasDirectChatDisplayName(String oldDisplayName) { + return 'Txata hutsik dago ($oldDisplayName zen lehen)'; + } + + @override + String get newSpaceDescription => + 'Guneek txatak taldekatzea ahalbidetzen dute eta komunitate pribatu edo publikoak osatzea.'; + + @override + String get encryptThisChat => 'Zifratu txata'; + + @override + String get disableEncryptionWarning => + 'Segurtasun arrazoiak direla-eta, ezin duzu lehendik zifratuta zegoen txat bateko zifratzea ezgaitu.'; + + @override + String get sorryThatsNotPossible => 'Barka… hori ez da posible'; + + @override + String get deviceKeys => 'Gailuaren gakoak:'; + + @override + String get reopenChat => 'Ireki txata berriro'; + + @override + String get noBackupWarning => + 'Adi! Txataren babeskopia gaitzen ez baduzu, ezingo dituzu zifratutako txatak atzitu. Oso gomendagarria da txaten babeskopia gaitzea saioa amaitu baino lehen.'; + + @override + String get noOtherDevicesFound => 'Ez da beste gailurik aurkitu'; + + @override + String fileIsTooBigForServer(String max) { + return 'Ezin da bidali! Zerbitzariak gehienez $max-ko eranskinak onartzen ditu.'; + } + + @override + String fileHasBeenSavedAt(String path) { + return 'Fitxategia $path(e)n gorde da'; + } + + @override + String get jumpToLastReadMessage => 'Joan irakurritako azken mezura'; + + @override + String get readUpToHere => 'Honaino irakurrita'; + + @override + String get jump => 'Joan'; + + @override + String get openLinkInBrowser => 'Ireki esteka nabigatzailean'; + + @override + String get reportErrorDescription => + '😭 O ez! Zerbaitek huts egin du. Nahi izanez gero, eman garatzaileei errorearen berri.'; + + @override + String get report => 'salatu'; + + @override + String get signInWithPassword => 'Hasi saioa pasahitzarekin'; + + @override + String get pleaseTryAgainLaterOrChooseDifferentServer => + 'Saiatu geroago edo aukeratu beste zerbitzari bat.'; + + @override + String signInWith(String provider) { + return 'Hasi saioa $provider(r)ekin'; + } + + @override + String get profileNotFound => + 'Ezin izan da erabiltzailea zerbitzarian aurkitu. Agian arazo bat dago konexioarekin edo erabiltzailea ez da existitzen.'; + + @override + String get setTheme => 'Ezarri gaia:'; + + @override + String get setColorTheme => 'Ezarri kolore-gaia:'; + + @override + String get invite => 'Gonbidatu'; + + @override + String get inviteGroupChat => '📨 Gonbidatu taldeko txatera'; + + @override + String get invitePrivateChat => '📨 Gonbidatu txat pribatura'; + + @override + String get invalidInput => 'Sartu duzunak ez du balio!'; + + @override + String wrongPinEntered(int seconds) { + return 'PIN okerra! Saiatu berriro $seconds segundu barru…'; + } + + @override + String get pleaseEnterANumber => 'Sartu 0 baino zenbaki handiago bat'; + + @override + String get archiveRoomDescription => + 'Txata artxibategira mugituko da. Beste erabiltzaileek txatetik alde egin duzula ikusi ahal izango dute.'; + + @override + String get roomUpgradeDescription => + 'Gela bertsio berri gisa birsortuko da txata. Partaide guztiei jakinaraziko zaie txat berrira aldatu behar direla. Gehiago irakur dezakezu gela bertsioei buruz ondorengo estekan: https://spec.matrix.org/latest/rooms/'; + + @override + String get removeDevicesDescription => + 'Gailu honetako saioa amaituko da eta ezingo duzu mezurik jaso aurrerantzean.'; + + @override + String get banUserDescription => + 'Erabiltzailea txatetik kanporatu eta berriro sartzeko debekua ezarriko zaio; ezingo da berriro sartu debekua kendu arte.'; + + @override + String get unbanUserDescription => + 'Erabiltzailea txatera berriro sartu ahal izango da berak nahi izanez gero.'; + + @override + String get kickUserDescription => + 'Erabiltzailea txatetik kanporatu da baina ez zaio debekua ezarri. Txat publikoen kasuan, edozein momentutan batu daiteke berriro.'; + + @override + String get makeAdminDescription => + 'Behin erabiltzaile hau administratzaile eginda, litekeena da desegin ezin izatea zuk dituzun baimenak izango dituelako.'; + + @override + String get pushNotificationsNotAvailable => + 'Push jakinarazpenak ez daude erabilgarri'; + + @override + String get learnMore => 'Gehiago irakurri'; + + @override + String get yourGlobalUserIdIs => 'Zure erabiltzaile-ID orokorra: '; + + @override + String noUsersFoundWithQuery(String query) { + return 'Zoritxarrez ez da \"$query\" duen erabiltzailerik aurkitu. Egiaztatu zuzen idatzi duzula.'; + } + + @override + String get knocking => 'Baimena eskatzen'; + + @override + String chatCanBeDiscoveredViaSearchOnServer(String server) { + return 'Txata $server(e)n bilaketa eginez aurkitu daiteke'; + } + + @override + String get searchChatsRooms => 'Bilatu #txatak, @erabiltzaileak…'; + + @override + String get nothingFound => 'Ez da ezer aurkitu…'; + + @override + String get groupName => 'Taldearen izena'; + + @override + String get createGroupAndInviteUsers => + 'Sortu talde bat eta gonbidatu partaideak'; + + @override + String get groupCanBeFoundViaSearch => + 'Bilaketa erabiliz aurkitu daiteke taldea'; + + @override + String get wrongRecoveryKey => + 'Barka baina ez dirudi berreskuratze-gako zuzena denik.'; + + @override + String get startConversation => 'Hasi elkarrizketa'; + + @override + String get commandHint_sendraw => 'Bidali json gordina'; + + @override + String get databaseMigrationTitle => 'Datu-basea optimizatu da'; + + @override + String get databaseMigrationBody => + 'Itxaron, litekeena da tarte bat behar izatea.'; + + @override + String get leaveEmptyToClearStatus => 'Utzi hutsik zure egoera garbitzeko.'; + + @override + String get select => 'Hautatu'; + + @override + String get searchForUsers => 'Bilatu @erabiltzaileak…'; + + @override + String get pleaseEnterYourCurrentPassword => 'Sartu oraingo pasahitza'; + + @override + String get newPassword => 'Pasahitz berria'; + + @override + String get pleaseChooseAStrongPassword => 'Aukeratu pasahitz sendo bat'; + + @override + String get passwordsDoNotMatch => 'Pasahitzak ez datoz bat'; + + @override + String get passwordIsWrong => 'Sartu duzun pasahitza okerra da'; + + @override + String get publicLink => 'Esteka publikoa'; + + @override + String get publicChatAddresses => 'Txataren helbide publikoak'; + + @override + String get createNewAddress => 'Sortu helbide berria'; + + @override + String get joinSpace => 'Batu gunera'; + + @override + String get publicSpaces => 'Gune publikoak'; + + @override + String get addChatOrSubSpace => 'Gehitu txata edo azpi-gunea'; + + @override + String get subspace => 'Azpi-gunea'; + + @override + String get decline => 'Baztertu'; + + @override + String get thisDevice => 'Gailu hau:'; + + @override + String get initAppError => 'Errorea aplikazioa abiaraztean'; + + @override + String get userRole => 'Erabiltzailearen rola'; + + @override + String minimumPowerLevel(String level) { + return '$level da gutxieneko botere-maila.'; + } + + @override + String searchIn(String chat) { + return 'Bilatu $chat txatean...'; + } + + @override + String get searchMore => 'Bilatu gehiago...'; + + @override + String get gallery => 'Galeria'; + + @override + String get files => 'Fitxategiak'; + + @override + String databaseBuildErrorBody(String url, String error) { + return 'Ezin da SQlite datu-basea eraiki. Aplikazioa aurreko datu-basea erabiltzen saiatuko da oraingoz. Jakinarazi errorea garatzaileei $url helbidean. Errorearen mezua ondorengoa da: $error'; + } + + @override + String sessionLostBody(String url, String error) { + return 'Zure saioa galdu da. Jakinarazi errorea garatzaileei $url helbidean. Errorearen mezua ondorengoa da: $error'; + } + + @override + String restoreSessionBody(String url, String error) { + return 'Aplikazioa babeskopia erabiliz saioa leheneratzen saiatuko da. Jakinarazi errorea garatzaileei $url helbidean. Errorearen mezua ondorengoa da: $error'; + } + + @override + String forwardMessageTo(String roomName) { + return 'Birbidali mezua $roomName(e)ra?'; + } + + @override + String get sendReadReceipts => 'Bidali irakurri izanaren agiria'; + + @override + String get sendTypingNotificationsDescription => + 'Txateko beste partaideek mezu berri bat idazten ari zarela ikus dezakete.'; + + @override + String get sendReadReceiptsDescription => + 'Txateko beste partaideek mezu bat irakurri duzula ikus dezakete.'; + + @override + String get formattedMessages => 'Formatua duten mezuak'; + + @override + String get formattedMessagesDescription => + 'Erakutsi mezu aberatsen edukia markdown erabiliz, testu lodia esaterako.'; + + @override + String get verifyOtherUser => '🔐 Egiaztatu beste erabiltzaile bat'; + + @override + String get verifyOtherUserDescription => + 'Beste erabiltzaile bat egiaztatzen baduzu, ziur egon zaitezke nori idazten ari zaren. 💪\n\nEgiaztapena hasten duzunean, zuk eta beste erabiltzaileak laster-leiho bat ikusiko duzue aplikazioan. Bertan, elkarrekin alderatu behar diren emoji edo zenbaki batzuk erakutsiko dira.\n\nBideo-dei bat hastea edo aurrez-aurre batzea da horretarako modurik onena. 👭'; + + @override + String get verifyOtherDevice => '🔐 Egiaztatu beste gailu bat'; + + @override + String get verifyOtherDeviceDescription => + 'Beste gailu bat egiaztatzean, gailu horiek gakoak truka ditzakete, eta segurtasun orokorra handitu. 💪 Egiaztapena hasten duzunean, laster-leiho bat agertuko da bi gailuetan. Bertan, elkarrekin alderatu behar diren emoji edo zenbaki batzuk ikusiko dituzu. Hobe da bi gailuak eskura izatea egiaztapena hasi aurretik. 🤳'; + + @override + String acceptedKeyVerification(String sender) { + return '$sender(e)k gakoaren egiaztapena onartu du'; + } + + @override + String canceledKeyVerification(String sender) { + return '$sender(e)k gakoen egiaztapena ezeztatu du'; + } + + @override + String completedKeyVerification(String sender) { + return '$sender(e)k gakoen egiaztapena osatu du'; + } + + @override + String isReadyForKeyVerification(String sender) { + return '$sender gakoak egiaztatzeko prest dago'; + } + + @override + String requestedKeyVerification(String sender) { + return '$sender(e)k gakoen egiaztapena galdegin du'; + } + + @override + String startedKeyVerification(String sender) { + return '$sender(e)k gakoen egiaztapena hasi du'; + } + + @override + String get transparent => 'Gardena'; + + @override + String get incomingMessages => 'Jasotako mezuak'; + + @override + String get stickers => 'Pegatinak'; + + @override + String get discover => 'Arakatu'; + + @override + String get commandHint_ignore => 'Muzin egin Matrix ID honi'; + + @override + String get commandHint_unignore => 'Utzi Matrix ID honi muzin egiteari'; + + @override + String unreadChatsInApp(String appname, String unread) { + return '$appname: $unread mezu irakurri gabe'; + } + + @override + String get noDatabaseEncryption => + 'Plataforma honetan ezin da datu-basea zifratu'; + + @override + String thereAreCountUsersBlocked(Object count) { + return 'Une honetan $count erabiltzaile daude blokeatuta.'; + } + + @override + String get restricted => 'Mugatuta'; + + @override + String get knockRestricted => 'Eskatu baimena sarrera mugatua duen txatean'; + + @override + String goToSpace(Object space) { + return 'Joan $space gunera'; + } + + @override + String get markAsUnread => 'Markatu irakurri gabetzat'; + + @override + String userLevel(int level) { + return '$level - Erabiltzailea'; + } + + @override + String moderatorLevel(int level) { + return '$level - Moderatzailea'; + } + + @override + String adminLevel(int level) { + return '$level - Administratzailea'; + } + + @override + String get changeGeneralChatSettings => 'Aldatu txataren ezarpen orokorrak'; + + @override + String get inviteOtherUsers => 'Gonbidatu beste erabiltzaileak txat honetara'; + + @override + String get changeTheChatPermissions => 'Aldatu txataren baimenak'; + + @override + String get changeTheVisibilityOfChatHistory => + 'Aldatu txataren historiaren ikusgaitasuna'; + + @override + String get changeTheCanonicalRoomAlias => + 'Aldatu txataren helbide publiko nagusia'; + + @override + String get sendRoomNotifications => 'Bidali @gela jakinarazpena'; + + @override + String get changeTheDescriptionOfTheGroup => 'Aldatu txataren deskribapena'; + + @override + String get chatPermissionsDescription => + 'Definitu zer botere-maila behar den txat honetako ekintza jakinetarako. 0, 50 eta 100 botere-mailek erabiltzaileak, moderatzaileak eta administratzaileak ordezkatzen dituzte, baina edozein graduazio posible da.'; + + @override + String updateInstalled(String version) { + return '🎉 $version bertsioa instalatu da!'; + } + + @override + String get changelog => 'Aldaketak'; + + @override + String get sendCanceled => 'Bidalketa bertan behera utzi da'; + + @override + String get loginWithMatrixId => 'Hasi saioa Matrix IDarekin'; + + @override + String get discoverHomeservers => 'Arakatu zerbitzariak'; + + @override + String get whatIsAHomeserver => 'Zer da zerbitzari bat?'; + + @override + String get homeserverDescription => + 'Zerbitzariak datuak gordetzen ditu, ePosta hornitzaileek mezuak gordetzen dituzten bezala. Nahi duzun zerbitzaria aukeratu dezakezu eta, hala ere, besteetako edonorekin hitz egin. Ikasi gehiago https://matrix.org webgunean.'; + + @override + String get doesNotSeemToBeAValidHomeserver => + 'Ez dirudi zerbitzaria bateragarria denik. Zuzena da URLa?'; + + @override + String get calculatingFileSize => 'Fitxategiaren tamaina kalkulatzen…'; + + @override + String get prepareSendingAttachment => 'Eranskinaren bidalketa prestatzen…'; + + @override + String get sendingAttachment => 'Eranskina bidaltzen…'; + + @override + String get generatingVideoThumbnail => 'Bideoaren iruditxoa sortzen…'; + + @override + String get compressVideo => 'Bideoa konprimatzen…'; + + @override + String sendingAttachmentCountOfCount(int index, int length) { + return '$index. eranskina bidaltzen ($length guztira)…'; + } + + @override + String serverLimitReached(int seconds) { + return 'Zerbitzariaren muga gainditu da! Itxaron $seconds segundo…'; + } + + @override + String get oneOfYourDevicesIsNotVerified => + 'Zure gailuetako bat ez dago egiaztatuta'; + + @override + String get noticeChatBackupDeviceVerification => + 'Oharra: gailu guztiak txat-babeskopiarekin konektatzen dituzunean, automatikoki egiaztatzen dira.'; + + @override + String get continueText => 'Jarraitu'; + + @override + String get welcomeText => + 'Ieup 👋 Ongi etorri Extera-era. https://matrix.org-rekin bateragarria den edozein zerbitzaritan hasi dezakezu saioa eta edonorekin txateatu. Mezularitza-sare deszentralizatu eraraldoia da!'; + + @override + String get blur => 'Lausotu:'; + + @override + String get opacity => 'Opakutasuna:'; + + @override + String get setWallpaper => 'Ezarri horma-irudia'; + + @override + String get manageAccount => 'Kudeatu kontua'; + + @override + String get noContactInformationProvided => + 'Zerbitzariak ez du harremanetarako informaziorik zehaztu'; + + @override + String get contactServerAdmin => + 'Jarri harremanetan zerbitzariaren administratzailearekin'; + + @override + String get contactServerSecurity => 'Jakinarazi segurtasun arazo bat'; + + @override + String get supportPage => 'Laguntza orria'; + + @override + String get serverInformation => 'Zerbitzariaren informazioa:'; + + @override + String get name => 'Izena'; + + @override + String get version => 'Bertsioa'; + + @override + String get website => 'Webgunea'; + + @override + String get compress => 'Konprimatu'; + + @override + String get boldText => 'Testu lodia'; + + @override + String get italicText => 'Testu etzana'; + + @override + String get strikeThrough => 'Zirrimarra'; + + @override + String get pleaseFillOut => 'Bete ezazu'; + + @override + String get invalidUrl => 'URL baliogabea'; + + @override + String get addLink => 'Gehitu esteka'; + + @override + String get unableToJoinChat => + 'Ezin da txatera batu. Agian besteak elkarrizketa itxiko zuen honezkero.'; + + @override + String get previous => 'Aurrekoa'; + + @override + String get otherPartyNotLoggedIn => + 'Besteak ez du saiorik hasita eta, beraz, ezin du mezurik jaso!'; + + @override + String appWantsToUseForLogin(String server) { + return 'Erabili \'$server\' saioa hasteko'; + } + + @override + String get appWantsToUseForLoginDescription => + 'Honenbestez, aplikazioak eta webguneak zuri buruzko informazioa partekatzea baimentzen duzu.'; + + @override + String get open => 'Ireki'; + + @override + String get waitingForServer => 'Zerbitzariaren zain…'; + + @override + String get appIntroduction => + 'FluffyChatek mezularitza-programa desberdinak erabiltzen dituzten lagunekin txateatzea ahalbidetzen dizu. Ikasi gehiago https://matrix.org estekan edo sakatu *Jarraitu*.'; + + @override + String get newChatRequest => '📩 Txat-eskaera berria'; + + @override + String get contentNotificationSettings => + 'Edukiaren jakinarazpenen ezarpenak'; + + @override + String get generalNotificationSettings => 'Jakinarazpen orokorren ezarpenak'; + + @override + String get roomNotificationSettings => 'Gelen jakinarazpenen ezarpenak'; + + @override + String get userSpecificNotificationSettings => + 'Erabiltzaile zehatzen jakinarazpenen ezarpenak'; + + @override + String get otherNotificationSettings => 'Beste jakinarazpenen ezarpenak'; + + @override + String get notificationRuleContainsUserName => 'Erabiltzaile-izena dauka'; + + @override + String get notificationRuleContainsUserNameDescription => + 'Mezuan erabiltzaile-izena aipatzen denean jakinarazten du.'; + + @override + String get notificationRuleMaster => 'Isilarazi jakinarazpen guztiak'; + + @override + String get notificationRuleMasterDescription => + 'Gainerako arauak gainidatzi eta jakinarazpenak ezgaitzen ditu.'; + + @override + String get notificationRuleSuppressNotices => 'Ezkutatu mezu automatikoak'; + + @override + String get notificationRuleSuppressNoticesDescription => + 'BOTen eta bestelako bezero automatikoen jakinarazpenak ezkutatzen ditu.'; + + @override + String get notificationRuleInviteForMe => 'Gonbidapena niretzat'; + + @override + String get notificationRuleInviteForMeDescription => + 'Erabiltzailea gela batera gonbidatzen dutenean jakinarazten du.'; + + @override + String get notificationRuleMemberEvent => 'Kideen gertaera'; + + @override + String get notificationRuleMemberEventDescription => + 'Kideen gertaeren jakinarazpenak ezkutatzen ditu.'; + + @override + String get notificationRuleIsUserMention => 'Erabiltzailea aipatzea'; + + @override + String get notificationRuleIsUserMentionDescription => + 'Erabiltzailea mezu zuzen batean aipatzen dutenean jakinarazten du.'; + + @override + String get notificationRuleContainsDisplayName => 'Pantaila-izena dauka'; + + @override + String get notificationRuleContainsDisplayNameDescription => + 'Mezu batek erabiltzailearen pantaila-izena duenean jakinarazten du.'; + + @override + String get notificationRuleIsRoomMention => 'Gelaren aipamena'; + + @override + String get notificationRuleIsRoomMentionDescription => + 'Gela aipatzen denean erabiltzailea jakinarazten du.'; + + @override + String get notificationRuleRoomnotif => 'Gelaren jakinarazpena'; + + @override + String get notificationRuleRoomnotifDescription => + 'Mezu batek \'@room\' duenean erabiltzaileari jakinarazten dio.'; + + @override + String get notificationRuleTombstone => 'Hilarria'; + + @override + String get notificationRuleTombstoneDescription => + 'Gela desaktibatzeko mezuei buruz jakinarazten dio erabiltzaileari.'; + + @override + String get notificationRuleReaction => 'Erreakzioa'; + + @override + String get notificationRuleReactionDescription => + 'Erreakzioen jakinarazpenak ezkutatzen ditu.'; + + @override + String get notificationRuleRoomServerAcl => 'Gelaren zerbitzariaren ACLa'; + + @override + String get notificationRuleRoomServerAclDescription => + 'Suppresses notifications for room server access control lists (ACL).'; + + @override + String get notificationRuleSuppressEdits => 'Ezkutatu edizioak'; + + @override + String get notificationRuleSuppressEditsDescription => + 'Editatutako mezuen jakinarazpenak ezkutatzen ditu.'; + + @override + String get notificationRuleCall => 'Deia'; + + @override + String get notificationRuleCallDescription => + 'Erabiltzaileari deiei buruz jakinarazten dio.'; + + @override + String get notificationRuleEncryptedRoomOneToOne => + 'Zifratutako bien arteko gela'; + + @override + String get notificationRuleEncryptedRoomOneToOneDescription => + 'Erabiltzailea jakinarazten du zifratutako bien arteko geletako mezuei buruz.'; + + @override + String get notificationRuleRoomOneToOne => 'Bien arteko gela'; + + @override + String get notificationRuleRoomOneToOneDescription => + 'Erabiltzailea jakinarazten du bien arteko geletako mezuei buruz.'; + + @override + String get notificationRuleMessage => 'Mezua'; + + @override + String get notificationRuleMessageDescription => + 'Erabiltzailea jakinarazten du mezu orokorrei buruz.'; + + @override + String get notificationRuleEncrypted => 'Zifratuak'; + + @override + String get notificationRuleEncryptedDescription => + 'Erabiltzailea jakinarazten du zifratutako geletako mezuei buruz.'; + + @override + String get notificationRuleJitsi => 'Jitsi'; + + @override + String get notificationRuleJitsiDescription => + 'Erabiltzailea jakinarazten du Jitsi widgetaren gertaerei buruz.'; + + @override + String get notificationRuleServerAcl => + 'Ezkutatu zerbitzariaren ACL gertaerak'; + + @override + String get notificationRuleServerAclDescription => + 'Zerbitzariaren ACL gertaerak ezkutatzen ditu.'; + + @override + String unknownPushRule(String rule) { + return 'Push arau ezezaguna \'$rule\''; + } + + @override + String get deletePushRuleCanNotBeUndone => + 'Jakinarazpen ezarpen hau ezabatzen baduzu, ezin da desegin.'; + + @override + String get more => 'Gehiago'; + + @override + String get shareKeysWith => 'Partekatu gakoak…'; + + @override + String get shareKeysWithDescription => + 'Zein gailu hartu beharko litzateke fidagarritzat zifratutako txaten mezuak irakur ditzaten?'; + + @override + String get allDevices => 'Gailu guztiekin'; + + @override + String get crossVerifiedDevicesIfEnabled => + 'Egiaztapen gurutzatuko gailuekin, gaituta badaude'; + + @override + String get crossVerifiedDevices => 'Egiaztapen gurutzatuko gailuekin'; + + @override + String get verifiedDevicesOnly => 'Egiaztatutako gailuekin soilik'; + + @override + String get takeAPhoto => 'Egin argazkia'; + + @override + String get recordAVideo => 'Grabatu bideoa'; + + @override + String get optionalMessage => 'Mezua (aukerakoa)…'; + + @override + String get notSupportedOnThisDevice => 'Ez da gailu honekin bateragarria'; + + @override + String get enterNewChat => 'Enter new chat'; + + @override + String get approve => 'Approve'; + + @override + String get youHaveKnocked => 'You have knocked'; + + @override + String get pleaseWaitUntilInvited => + 'Please wait now, until someone from the room invites you.'; +} diff --git a/lib/generated/l10n/l10n_fa.dart b/lib/generated/l10n/l10n_fa.dart new file mode 100644 index 0000000..4cfa523 --- /dev/null +++ b/lib/generated/l10n/l10n_fa.dart @@ -0,0 +1,2748 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'l10n.dart'; + +// ignore_for_file: type=lint + +/// The translations for Persian (`fa`). +class L10nFa extends L10n { + L10nFa([String locale = 'fa']) : super(locale); + + @override + String get noSendPermission => 'You can\'t send messages here'; + + @override + String get alwaysUse24HourFormat => 'false'; + + @override + String get repeatPassword => 'تکرار رمزعبور'; + + @override + String get notAnImage => 'یک فایل تصویری نیست.'; + + @override + String get setCustomPermissionLevel => 'Set custom permission level'; + + @override + String get setPermissionsLevelDescription => + 'Please choose a predefined role below or enter a custom permission level between 0 and 100.'; + + @override + String get ignoreUser => 'Ignore user'; + + @override + String get normalUser => 'Normal user'; + + @override + String get remove => 'حذف کردن'; + + @override + String get importNow => 'Import now'; + + @override + String get importEmojis => 'Import Emojis'; + + @override + String get importFromZipFile => 'Import from .zip file'; + + @override + String get exportEmotePack => 'Export Emote pack as .zip'; + + @override + String get replace => 'Replace'; + + @override + String get about => 'درباره'; + + @override + String aboutHomeserver(String homeserver) { + return 'About $homeserver'; + } + + @override + String get accept => 'پذیرش'; + + @override + String acceptedTheInvitation(String username) { + return '👍 $username دعوت را پذیرفت'; + } + + @override + String get account => 'حساب'; + + @override + String activatedEndToEndEncryption(String username) { + return '🔐 $username رمزگذاری سرتاسر را فعال کرد'; + } + + @override + String get addEmail => 'افزودن ایمیل'; + + @override + String get confirmMatrixId => + 'برای حذف حسابتان، لطفا هویت ماتریکستان را تایید کنید.'; + + @override + String supposedMxid(String mxid) { + return 'این باید $mxid باشد'; + } + + @override + String get addChatDescription => 'Add a chat description...'; + + @override + String get addToSpace => 'به فضا اضافه کنید'; + + @override + String get admin => 'ادمین'; + + @override + String get alias => 'نام مستعار'; + + @override + String get all => 'همه'; + + @override + String get allChats => 'همه گپ‌ها'; + + @override + String get commandHint_roomupgrade => + 'Upgrade this room to the given room version'; + + @override + String get commandHint_googly => 'ارسال چند چشم گوگولی'; + + @override + String get commandHint_cuddle => 'ارسال آغوش'; + + @override + String get commandHint_hug => 'ارسال بغل'; + + @override + String googlyEyesContent(String senderName) { + return '$senderName به شما چشمان گوگولی می‌فرستد'; + } + + @override + String cuddleContent(String senderName) { + return '$senderName شما را در آغوش می‌گیرد'; + } + + @override + String hugContent(String senderName) { + return '$senderName شما را بغل می‌کند'; + } + + @override + String answeredTheCall(String senderName) { + return '$senderName پاسخ تماس را داد'; + } + + @override + String get anyoneCanJoin => 'هرکسی می‌تواند بپیوندد'; + + @override + String get appLock => 'قفل برنامه'; + + @override + String get appLockDescription => + 'Lock the app when not using with a pin code'; + + @override + String get archive => 'بایگانی'; + + @override + String get areGuestsAllowedToJoin => 'آیا کاربران مهمان اجازه پیوستن دارند'; + + @override + String get areYouSure => 'مطمئن هستید؟'; + + @override + String get areYouSureYouWantToLogout => 'مطمئن هستید می‌خواهید خارج شوید؟'; + + @override + String get askSSSSSign => + 'لطفا عبارت عبور یا کلید بازیابی حافظه امن خود را وارد کنید تا بتوانید شخص دیگر را امضا کنید.'; + + @override + String askVerificationRequest(String username) { + return 'این درخواست تایید را از $username می‌پذیرید؟'; + } + + @override + String get autoplayImages => 'اموجی و برچسب‌های متحرک به طور خودکار پخش شوند'; + + @override + String badServerLoginTypesException(String serverVersions, + String supportedVersions, Object suportedVersions) { + return 'سرور می‌تواند این گونه‌های ورود‮ را پشتیباتی کند:\n$serverVersions\nولی این برنامه فقط می‌تواند این‌ها را پشتیبانی کند:\n$supportedVersions'; + } + + @override + String get sendTypingNotifications => 'Send typing notifications'; + + @override + String get swipeRightToLeftToReply => 'Swipe right to left to reply'; + + @override + String get sendOnEnter => 'ارسال با کلید تعويض سطر'; + + @override + String badServerVersionsException(String serverVersions, + String supportedVersions, Object serverVerions, Object suportedVersions) { + return 'سرور می‌تواند این نسخه‌های مشخصات را پشتیبانی کند:\n$serverVersions\nولی این برنامه فقط می‌تواند این‌ها را پشتیبانی کند:\n$supportedVersions'; + } + + @override + String countChatsAndCountParticipants(int chats, int participants) { + return '$chats chats and $participants participants'; + } + + @override + String get noMoreChatsFound => 'No more chats found...'; + + @override + String get noChatsFoundHere => + 'No chats found here yet. Start a new chat with someone by using the button below. ⤵️'; + + @override + String get joinedChats => 'Joined chats'; + + @override + String get unread => 'Unread'; + + @override + String get space => 'Space'; + + @override + String get spaces => 'Spaces'; + + @override + String get banFromChat => 'از گپ محروم کنید'; + + @override + String get banned => 'محروم شده'; + + @override + String bannedUser(String username, String targetName) { + return '$username $targetName را محروم کرد'; + } + + @override + String get blockDevice => 'دستگاه را مسدود کنید'; + + @override + String get blocked => 'مسدود شده'; + + @override + String get botMessages => 'پیام‌های روبات'; + + @override + String get cancel => 'لغو'; + + @override + String cantOpenUri(String uri) { + return 'نمی‌توانیم این آدرس اینترنتی را باز کنیم: $uri'; + } + + @override + String get changeDeviceName => 'نام دستگاه را تغییر دهید'; + + @override + String changedTheChatAvatar(String username) { + return '$username تصویر گپ را تغییر داد'; + } + + @override + String changedTheChatDescriptionTo(String username, String description) { + return '$username توصیف گپ را تغییر داد به: «$description»'; + } + + @override + String changedTheChatNameTo(String username, String chatname) { + return '$username نام گپ را تغییر داد به: «$chatname»'; + } + + @override + String changedTheChatPermissions(String username) { + return '$username اجازه‌های گپ را تغییر داد'; + } + + @override + String changedTheDisplaynameTo(String username, String displayname) { + return '$username نام نمایشی خود را تغییر داد به: «$displayname»'; + } + + @override + String changedTheGuestAccessRules(String username) { + return '$username قوانین دسترسی مهمان را تغییر داد'; + } + + @override + String changedTheGuestAccessRulesTo(String username, String rules) { + return '$username قوانین دسترسی مهمان را تغییر داد به: $rules'; + } + + @override + String changedTheHistoryVisibility(String username) { + return '$username قابليت‌ ديدن‌ تاریخچه را تغییر داد'; + } + + @override + String changedTheHistoryVisibilityTo(String username, String rules) { + return '$username قابليت‌ ديدن‌ تاریخچه را تغییر داد به: $rules'; + } + + @override + String changedTheJoinRules(String username) { + return '$username قوانین پیوستن را تغییر داد'; + } + + @override + String changedTheJoinRulesTo(String username, String joinRules) { + return '$username قوانین پیوستن را تغییر داد به: $joinRules'; + } + + @override + String changedTheProfileAvatar(String username) { + return '$username عکس پروفایل خود را تغییر داد'; + } + + @override + String changedTheRoomAliases(String username) { + return '$username نام‌های مستعار اتاق را تغییر داد'; + } + + @override + String changedTheRoomInvitationLink(String username) { + return '$username لینک دعوت را تغییر داد'; + } + + @override + String get changePassword => 'تغییر رمز عبور'; + + @override + String get changeTheHomeserver => 'تغییر سرور خانه'; + + @override + String get changeTheme => 'سبک خود را تغییر دهید'; + + @override + String get changeTheNameOfTheGroup => 'نام گروه را تغییر دهید'; + + @override + String get changeYourAvatar => 'عکس پروفایل خود را تغییر دهید'; + + @override + String get channelCorruptedDecryptError => 'رمزگذاری مخدوش شده‌ است'; + + @override + String get chat => 'گپ'; + + @override + String get yourChatBackupHasBeenSetUp => 'پشتیبان گپ‌تان تنظیم شده است.'; + + @override + String get chatBackup => 'پشتیبان گپ'; + + @override + String get chatBackupDescription => + 'پیام‌های قدیمی‌تان با یک کلید باز یابی، امن می‌شوند. لطفا مطمئن شوید که آن را گم نمی‌کنید.'; + + @override + String get chatDetails => 'جزئیات گپ'; + + @override + String get chatHasBeenAddedToThisSpace => 'گپ به این فضا اضافه شده است'; + + @override + String get chats => 'گپ‌ها'; + + @override + String get chooseAStrongPassword => 'رمز عبور قوی انتخاب کنید'; + + @override + String get clearArchive => 'بایگانی را پاک کنید'; + + @override + String get close => 'بستن'; + + @override + String get commandHint_markasdm => + 'برای دادن شناسه ماتریکس به عنوان اتاق پیام‌های مستقیم علامت بگذارید'; + + @override + String get commandHint_markasgroup => 'به عنوان گروه علامت بگذارید'; + + @override + String get commandHint_ban => 'کاربر مشخص شده را از این اتاق محروم کنید'; + + @override + String get commandHint_clearcache => 'حافظه پنھان را پاک کنید'; + + @override + String get commandHint_create => + 'یک گپ گروهی خالی بسازید\nاز «--no-encryption» برای غیرفعال کردن رمزگذاری استفاده کنید'; + + @override + String get commandHint_discardsession => 'طرد نشست'; + + @override + String get commandHint_dm => + 'یک گپ مستقیم شروع کنید\nاز «--no-encryption» برای غیرفعال کردن رمزگذاری استفاده کنید'; + + @override + String get commandHint_html => 'متن با فرمت HTML بفرستید'; + + @override + String get commandHint_invite => 'کاربر مشخص شده را به این اتاق دعوت کنید'; + + @override + String get commandHint_join => 'به اتاق مشخص شده بپیوندید'; + + @override + String get commandHint_kick => 'کاربر مشخص شده را از این اتاق حذف کنید'; + + @override + String get commandHint_leave => 'این اتاق را ترک کنید'; + + @override + String get commandHint_me => 'خود را توصیف کنید'; + + @override + String get commandHint_myroomavatar => + 'عکس پروفایل خود را برای این اتاق تنظیم کنید (با mxc-uri)'; + + @override + String get commandHint_myroomnick => + 'نام نمایشی خود را برای این اتاق تنظیم کنید'; + + @override + String get commandHint_op => + 'درجه اختیار کاربر مشخص شده را تنظیم کنید (پیشفرض: ۵۰)'; + + @override + String get commandHint_plain => 'متن بی‌فرمت بفرستید'; + + @override + String get commandHint_react => 'پاسخ را به عنوان یک واکنش بفرستید'; + + @override + String get commandHint_send => 'متن را بفرستید'; + + @override + String get commandHint_unban => + 'محرومیت کاربر مشخص شده را از این اتاق لغو کنید'; + + @override + String get commandInvalid => 'دستور نامعتبر'; + + @override + String commandMissing(String command) { + return '$command یک دستور نیست.'; + } + + @override + String get compareEmojiMatch => 'لطفا ایموجی‌ها را مقایسه کنید'; + + @override + String get compareNumbersMatch => 'لطفا اعداد را مقایسه کنید'; + + @override + String get configureChat => 'گپ را تنظیم کنید'; + + @override + String get confirm => 'تایید'; + + @override + String get connect => 'اتصال'; + + @override + String get contactHasBeenInvitedToTheGroup => 'مخاطب به گروه دعوت شده است'; + + @override + String get containsDisplayName => 'شامل نام نمایشی است'; + + @override + String get containsUserName => 'شامل نام کاربری است'; + + @override + String get contentHasBeenReported => 'محتوا به مدیران سرور گزارش شده است'; + + @override + String get copiedToClipboard => 'در حافظه کپی شد'; + + @override + String get copy => 'کپی'; + + @override + String get copyToClipboard => 'در حافظه کپی کنید'; + + @override + String couldNotDecryptMessage(String error) { + return 'نتوانستیم پیام را رمزگشایی کنیم: $error'; + } + + @override + String countParticipants(int count) { + return '$count شرکت کننده'; + } + + @override + String get create => 'ایجاد'; + + @override + String createdTheChat(String username) { + return '💬 $username گپ را ایجاد کرد'; + } + + @override + String get createGroup => 'Create group'; + + @override + String get createNewSpace => 'فضای جدید'; + + @override + String get currentlyActive => 'اکنون فعال'; + + @override + String get darkTheme => 'تاریک'; + + @override + String dateAndTimeOfDay(String date, String timeOfDay) { + return '$date، $timeOfDay'; + } + + @override + String dateWithoutYear(String month, String day) { + return '$month-$day'; + } + + @override + String dateWithYear(String year, String month, String day) { + return '$year-$month-$day'; + } + + @override + String get deactivateAccountWarning => + 'این کار حساب کاربری‌تان را غیرفعال خواهد کرد. این عمل قابل جبران و بازگشت نیست! آیا اطمینان دارید؟'; + + @override + String get defaultPermissionLevel => 'درجه اجازۀ پیشفرض'; + + @override + String get delete => 'حذف'; + + @override + String get deleteAccount => 'حساب را حذف کنید'; + + @override + String get deleteMessage => 'پیام را حذف کنید'; + + @override + String get device => 'دستگاه'; + + @override + String get deviceId => 'هویت دستگاه'; + + @override + String get devices => 'دستگاه‌ها'; + + @override + String get directChats => 'گپ‌های مستقیم'; + + @override + String get allRooms => 'تمام چت‌های گروهی'; + + @override + String get displaynameHasBeenChanged => 'نام نمایشی تغییر یافته است'; + + @override + String get downloadFile => 'بارگیری فایل'; + + @override + String get edit => 'ویرایش'; + + @override + String get editBlockedServers => 'سرور‌های مسدود را ویرایش کنید'; + + @override + String get chatPermissions => 'Chat permissions'; + + @override + String get editDisplayname => 'ویرایش نام نمایشی'; + + @override + String get editRoomAliases => 'نام‌های مستعار اتاق را ویرایش کنید'; + + @override + String get editRoomAvatar => 'عکس اتاق را ویرایش کنید'; + + @override + String get emoteExists => 'شکلک از پیش وجود دارد!'; + + @override + String get emoteInvalid => 'کد کوتاه شکلک نامعتبر!'; + + @override + String get emoteKeyboardNoRecents => + 'Recently-used emotes will appear here...'; + + @override + String get emotePacks => 'بسته‌های شکلک برای اتاق'; + + @override + String get emoteSettings => '‏تنظیمات شکلک'; + + @override + String get globalChatId => 'Global chat ID'; + + @override + String get accessAndVisibility => 'Access and visibility'; + + @override + String get accessAndVisibilityDescription => + 'Who is allowed to join this chat and how the chat can be discovered.'; + + @override + String get calls => 'Calls'; + + @override + String get customEmojisAndStickers => 'Custom emojis and stickers'; + + @override + String get customEmojisAndStickersBody => + 'Add or share custom emojis or stickers which can be used in any chat.'; + + @override + String get emoteShortcode => 'کد کوتاه شکلک'; + + @override + String get emoteWarnNeedToPick => + 'باید یک کد کوتاه شکلک و یک تصویر انتخاب کنید!'; + + @override + String get emptyChat => 'گپ خالی'; + + @override + String get enableEmotesGlobally => 'بسته شکلک را به طور سراسری فعال کنید'; + + @override + String get enableEncryption => 'رمزگذاری را فعال کنید'; + + @override + String get enableEncryptionWarning => + 'شما دیگر قادر به غیرفعال کردن رمزگذاری نخواهید بود. آیا مطمئن هستید؟'; + + @override + String get encrypted => 'رمزگذاری شده'; + + @override + String get encryption => 'رمزگذاری'; + + @override + String get encryptionNotEnabled => 'رمزگذاری فعال نیست'; + + @override + String endedTheCall(String senderName) { + return '$senderName به تماس پایان داد'; + } + + @override + String get enterAnEmailAddress => 'یک آدرس رایانامه(ایمیل) وارد کنید'; + + @override + String get homeserver => 'سرور خانه'; + + @override + String get enterYourHomeserver => 'سرور خانه خود را وارد کنید'; + + @override + String errorObtainingLocation(String error) { + return 'خطا هنگام بدست آوردن مکان: $error'; + } + + @override + String get everythingReady => 'همه‌چیز آماده است!'; + + @override + String get extremeOffensive => 'به شدت توهین آمیز'; + + @override + String get fileName => 'نام فایل'; + + @override + String get fluffychat => 'فلافی‌چت'; + + @override + String get fontSize => 'اندازه قلم'; + + @override + String get forward => 'ارسال'; + + @override + String get fromJoining => 'از پیوستن'; + + @override + String get fromTheInvitation => 'از دعوت'; + + @override + String get goToTheNewRoom => 'به اتاق جدید بروید'; + + @override + String get group => 'گروه'; + + @override + String get chatDescription => 'Chat description'; + + @override + String get chatDescriptionHasBeenChanged => 'Chat description changed'; + + @override + String get groupIsPublic => 'گروه عمومی است'; + + @override + String get groups => 'گروه‌ها'; + + @override + String groupWith(String displayname) { + return 'گروه با $displayname'; + } + + @override + String get guestsAreForbidden => 'مهمان‌ها ممنوع شده‌اند'; + + @override + String get guestsCanJoin => 'مهمان‌ها می‌توانند بپیوندند'; + + @override + String hasWithdrawnTheInvitationFor(String username, String targetName) { + return '$username دعوت‌نامه $targetName را پس گرفته است'; + } + + @override + String get help => 'کمک'; + + @override + String get hideRedactedEvents => 'پنهان کردن رویدادهای ویرایش شده'; + + @override + String get hideRedactedMessages => 'Hide redacted messages'; + + @override + String get hideRedactedMessagesBody => + 'If someone redacts a message, this message won\'t be visible in the chat anymore.'; + + @override + String get hideInvalidOrUnknownMessageFormats => + 'Hide invalid or unknown message formats'; + + @override + String get howOffensiveIsThisContent => 'این محتوا چه مقدار توهین آمیز است؟'; + + @override + String get id => 'آی‌دی'; + + @override + String get identity => 'هویت'; + + @override + String get block => 'Block'; + + @override + String get blockedUsers => 'Blocked users'; + + @override + String get blockListDescription => + 'You can block users who are disturbing you. You won\'t be able to receive any messages or room invites from the users on your personal block list.'; + + @override + String get blockUsername => 'Ignore username'; + + @override + String get iHaveClickedOnLink => 'من روی پیوند کلیک کردم'; + + @override + String get incorrectPassphraseOrKey => + 'عبارت عبور یا کلید بازیابی اشتباه است'; + + @override + String get inoffensive => 'بی ضرر'; + + @override + String get inviteContact => 'دعوت از مخاطب'; + + @override + String inviteContactToGroupQuestion(Object contact, Object groupName) { + return 'Do you want to invite $contact to the chat \"$groupName\"?'; + } + + @override + String inviteContactToGroup(String groupName) { + return 'دعوت از مخاطب به $groupName'; + } + + @override + String get noChatDescriptionYet => 'No chat description created yet.'; + + @override + String get tryAgain => 'Try again'; + + @override + String get invalidServerName => 'Invalid server name'; + + @override + String get invited => 'دعوت شده'; + + @override + String get redactMessageDescription => + 'The message will be redacted for all participants in this conversation. This cannot be undone.'; + + @override + String get optionalRedactReason => + '(Optional) Reason for redacting this message...'; + + @override + String invitedUser(String username, String targetName) { + return '📩 $username از $targetName دعوت کرد'; + } + + @override + String get invitedUsersOnly => 'فقط کاربران دعوت شده'; + + @override + String get inviteForMe => 'دعوت برای من'; + + @override + String inviteText(String username, String link) { + return '$username شما را به فلافی‌چت دعوت کرد.\n۱. به fluffychat.im مراجعه کرده و کاره را نصب کنید\n۲. ثبت نام کنید یا وارد شوید.\n۳. لینک دعوت را باز کنید:\n $link'; + } + + @override + String get isTyping => 'در حال نوشتن…'; + + @override + String joinedTheChat(String username) { + return '👋 $username به گپ پیوست'; + } + + @override + String get joinRoom => 'پیوستن به اتاق'; + + @override + String kicked(String username, String targetName) { + return '👞 $username $targetName را بیرون کرد'; + } + + @override + String kickedAndBanned(String username, String targetName) { + return '🙅 $username $targetName را بیرون و محروم کرد'; + } + + @override + String get kickFromChat => 'از گفتگو بیرون کردن'; + + @override + String lastActiveAgo(String localizedTimeShort) { + return 'آخرین فعالیت: $localizedTimeShort'; + } + + @override + String get leave => 'ترک کردن'; + + @override + String get leftTheChat => 'گپ را ترک کرد'; + + @override + String get license => 'پروانه'; + + @override + String get lightTheme => 'روشن'; + + @override + String loadCountMoreParticipants(int count) { + return 'بارگیری $count شرکت کنندۀ بیشتر'; + } + + @override + String get dehydrate => 'صدور جلسه و پاک کردن دستگاه'; + + @override + String get dehydrateWarning => + 'این عمل قابل لغو نیست. مطمئن شوید که فایل پشتیبان را به صورت امن ذخیره می کنید.'; + + @override + String get dehydrateTor => 'کاربران تور (TOR): صدور جلسه'; + + @override + String get dehydrateTorLong => + 'برای کاربران تور (TOR)، توصیه می شود قبل از بستن پنجره، جلسه را صادر کنند.'; + + @override + String get hydrateTor => 'کاربران تور (TOR): صادرات جلسه را وارد کنید'; + + @override + String get hydrateTorLong => + 'آیا آخرین بار جلسه خود را با تور (TOR) صادر کردید؟ به سرعت آن را وارد کنید و به گپ‌زنی ادامه دهید.'; + + @override + String get hydrate => 'بازیابی از فایل پشتیبان'; + + @override + String get loadingPleaseWait => 'در حال بارگیری... لطفا صبر کنید.'; + + @override + String get loadMore => 'بارگیری بیشتر…'; + + @override + String get locationDisabledNotice => + 'خدمات مکان غیرفعال است. لطفا آن را فعال کنید تا بتوانید موقعیت مکانی خود را به اشتراک بگذارید.'; + + @override + String get locationPermissionDeniedNotice => + 'مجوز مکان رد شد. برای به اشتراک گذاشتن موقعیت مکانی شما لطفا به آن اجازه دهید.'; + + @override + String get login => 'وارد شدن'; + + @override + String logInTo(String homeserver) { + return 'وارد شدن به $homeserver'; + } + + @override + String get logout => 'خارج شدن'; + + @override + String get memberChanges => 'تغییرات اعضا'; + + @override + String get mention => 'نام‌‌بردن‌'; + + @override + String get messages => 'پیام‌ها'; + + @override + String get messagesStyle => 'Messages:'; + + @override + String get moderator => 'مدیر'; + + @override + String get muteChat => 'بی‌صدا کردن گپ'; + + @override + String get needPantalaimonWarning => + 'لطفا توجه داشته باشید که در حال حاضر برای استفاده از رمزگذاری انتها به انتها به Pantalaimon نیاز دارید.'; + + @override + String get newChat => 'گپ جدید'; + + @override + String get newMessageInFluffyChat => '💬 پیام جدید در فلافی‌چت'; + + @override + String get newVerificationRequest => 'درخواست تایید جدید!'; + + @override + String get next => 'بعدی'; + + @override + String get no => 'نه'; + + @override + String get noConnectionToTheServer => 'عدم اتصال به سرور'; + + @override + String get noEmotesFound => 'هیچ شکلکی پیدا نشد. 😕'; + + @override + String get noEncryptionForPublicRooms => + 'فقط زمانی می‌توانید رمزگذاری را فعال کنید که اتاق، دیگر در دسترس عموم نباشد.'; + + @override + String get noGoogleServicesWarning => + 'به نظر می رسد که شما سرویس‌های گوگل را در گوشی خود ندارید. این تصمیم خوبی برای حفظ حریم خصوصی شماست! برای دریافت اعلان‌ها در فلافی‌چت توصیه می‌کنیم ازhttps://ntfy.sh استفاده کنید. با ntfy یا یک ارائه دهنده UnifiedPush می توانید اعلان‌های فشار را به روش داده امن دریافت کنید. می توانید ntfy را از پلی استور یا از اف‌دروید بارگیری کنید.'; + + @override + String noMatrixServer(String server1, String server2) { + return '$server1 سرور ماتریکس نیست، به جای آن از $server2 استفاده شود؟'; + } + + @override + String get shareInviteLink => 'Share invite link'; + + @override + String get scanQrCode => 'کد QR را اسکن کنید'; + + @override + String get none => 'هیچ‌کدام'; + + @override + String get noPasswordRecoveryDescription => + 'شما هنوز راهی برای بازیابی رمز عبور خود اضافه نکرده‌اید.'; + + @override + String get noPermission => 'بدون اجازه'; + + @override + String get noRoomsFound => 'اتاقی پیدا نشد…'; + + @override + String get notifications => 'اعلان‌ها'; + + @override + String get notificationsEnabledForThisAccount => + 'اعلان‌ها برای این حساب فعال شد'; + + @override + String numUsersTyping(int count) { + return '$count کاربر در حال نوشتن…'; + } + + @override + String get obtainingLocation => 'به دست آوردن مکان…'; + + @override + String get offensive => 'توهین آمیز'; + + @override + String get offline => 'آفلاین'; + + @override + String get ok => 'تایید'; + + @override + String get online => 'آنلاین'; + + @override + String get onlineKeyBackupEnabled => 'پشتیبان‌گیری آنلاین از کلید فعال است'; + + @override + String get oopsPushError => + 'اوه! متاسفانه هنگام تنظیم اعلان‌ها خطایی روی داد.'; + + @override + String get oopsSomethingWentWrong => 'اوه، مشکلی پیش آمد…'; + + @override + String get openAppToReadMessages => 'برای خواندن پیام‌ها، برنامه را باز کنید'; + + @override + String get openCamera => 'باز کردن دوربین'; + + @override + String get openVideoCamera => 'بازکردن دوربین برای فیلم‌برداری'; + + @override + String get oneClientLoggedOut => + 'یکی از کلاینت(برنامه)های شما از سیستم خارج شده است'; + + @override + String get addAccount => 'اضافه کردن حساب کاربری'; + + @override + String get editBundlesForAccount => 'بسته‌های این حساب را ویرایش کنید'; + + @override + String get addToBundle => 'به بسته نرم‌افزاری اضافه کنید'; + + @override + String get removeFromBundle => 'از این بسته حذف کنید'; + + @override + String get bundleName => 'اسم بسته'; + + @override + String get enableMultiAccounts => + '(آزمایشی) چند حساب را در این دستگاه فعال کنید'; + + @override + String get openInMaps => 'باز کردن در نقشه'; + + @override + String get link => 'پیوند'; + + @override + String get serverRequiresEmail => + 'برای ثبت‌نام، این سرور باید آدرس ایمیل شما را تایید کند.'; + + @override + String get or => 'یا'; + + @override + String get participant => 'شرکت‌کننده'; + + @override + String get passphraseOrKey => 'عبارت عبور یا کلید بازیابی'; + + @override + String get password => 'رمز عبور'; + + @override + String get passwordForgotten => 'رمز عبور را فراموش کرده‌ام'; + + @override + String get passwordHasBeenChanged => 'رمز عبور تغییر کرد'; + + @override + String get hideMemberChangesInPublicChats => + 'Hide member changes in public chats'; + + @override + String get hideMemberChangesInPublicChatsBody => + 'Do not show in the chat timeline if someone joins or leaves a public chat to improve readability.'; + + @override + String get overview => 'Overview'; + + @override + String get notifyMeFor => 'Notify me for'; + + @override + String get passwordRecoverySettings => 'Password recovery settings'; + + @override + String get passwordRecovery => 'بازیابی رمز عبور'; + + @override + String get people => 'مردم'; + + @override + String get pickImage => 'یک عکس انتخاب کنید'; + + @override + String get pin => 'سنجاق کردن'; + + @override + String play(String fileName) { + return 'پخش $fileName'; + } + + @override + String get pleaseChoose => 'لطفا انتخاب کنید'; + + @override + String get pleaseChooseAPasscode => 'لطفا یک کد عبور انتخاب کنید'; + + @override + String get pleaseClickOnLink => + 'لطفا روی لینک موجود در رایانامه(ایمیل) کلیک کنید و سپس ادامه دهید.'; + + @override + String get pleaseEnter4Digits => + 'لطفا ۴ رقم وارد کنید یا خالی بگذارید تا قفل برنامه غیرفعال شود.'; + + @override + String get pleaseEnterRecoveryKey => 'لطفا کلید بازیابی خود را وارد کنید:'; + + @override + String get pleaseEnterYourPassword => 'لطفا رمزعبور خود را وارد کنید'; + + @override + String get pleaseEnterYourPin => 'لطفا کد خود را وارد کنید'; + + @override + String get pleaseEnterYourUsername => 'لطفا نام‌کاربری خود را وارد کنید'; + + @override + String get pleaseFollowInstructionsOnWeb => + 'لطفا دستورالعمل‌های وب‌سایت را دنبال کنید و روی بعدی بزنید.'; + + @override + String get privacy => 'حریم خصوصی'; + + @override + String get publicRooms => 'اتاق‌های عمومی'; + + @override + String get pushRules => 'قواعد دریافت اعلان'; + + @override + String get reason => 'دلیل'; + + @override + String get recording => 'در حال ضبط'; + + @override + String redactedBy(String username) { + return 'Redacted by $username'; + } + + @override + String get directChat => 'Direct chat'; + + @override + String redactedByBecause(String username, String reason) { + return 'Redacted by $username because: \"$reason\"'; + } + + @override + String redactedAnEvent(String username) { + return '$username یک رویداد را ویرایش کرد'; + } + + @override + String get redactMessage => 'ویرایش پیام'; + + @override + String get register => 'ثبت نام'; + + @override + String get reject => 'رد کردن'; + + @override + String rejectedTheInvitation(String username) { + return '$username دعوت را رد کرد'; + } + + @override + String get rejoin => 'دوباره پیوستن'; + + @override + String get removeAllOtherDevices => 'حذف تمام دستگاه‌های دیگر'; + + @override + String removedBy(String username) { + return 'حذف شده توسط $username'; + } + + @override + String get removeDevice => 'حذف دستگاه'; + + @override + String get unbanFromChat => 'لغو محرومیت از گپ'; + + @override + String get removeYourAvatar => 'آواتار(عکس حساب) خود را حذف کنید'; + + @override + String get replaceRoomWithNewerVersion => + 'اتاق را با نسخه جدیدتر جایگزین کنید'; + + @override + String get reply => 'پاسخ'; + + @override + String get reportMessage => 'گزارش دادن پیام'; + + @override + String get translateMessage => 'Translate message'; + + @override + String get translatedMessage => 'Translated message'; + + @override + String get errorTranslatingMessage => + 'An error has occured while translating the message.'; + + @override + String get recoverMessage => 'Recover message'; + + @override + String get recoveredMessage => 'Recovered message'; + + @override + String get errorRecoveringMessage => + 'An error has occured while recovering the message.'; + + @override + String get errorRecoveringMessageNoAdmin => + 'This feature is available on Synapse homeservers only for adminstrators.'; + + @override + String get requestPermission => 'درخواست اجازه'; + + @override + String get roomHasBeenUpgraded => 'اتاق ارتقا پیدا کرد'; + + @override + String get roomVersion => 'نسخه اتاق'; + + @override + String get saveFile => 'ذخیره فایل'; + + @override + String get retry => 'Retry'; + + @override + String get search => 'جستجو'; + + @override + String get security => 'امنیت'; + + @override + String get recoveryKey => 'کلید بازیابی'; + + @override + String get recoveryKeyLost => 'کلید بازیابی را گم کردید؟'; + + @override + String seenByUser(String username) { + return 'دیده شده توسط $username'; + } + + @override + String get send => 'ارسال'; + + @override + String get sendAMessage => 'ارسال پیام'; + + @override + String get sendAsText => 'ارسال به عنوان متن'; + + @override + String get sendAudio => 'ارسال صدا'; + + @override + String get sendFile => 'ارسال فایل'; + + @override + String get sendImage => 'ارسال تصویر'; + + @override + String sendImages(int count) { + return 'Send $count image'; + } + + @override + String get sendMessages => 'ارسال پیام‌ها'; + + @override + String get sendOriginal => 'ارسال اصل'; + + @override + String get sendSticker => 'ارسال برچسب'; + + @override + String get sendVideo => 'ارسال ویدئو'; + + @override + String sentAFile(String username) { + return '📁 $username یک فایل فرستاد'; + } + + @override + String sentAnAudio(String username) { + return '🎤 $username یک صدای ضبط شده فرستاد'; + } + + @override + String sentAPicture(String username) { + return '🖼️ $username یک عکس فرستاد'; + } + + @override + String sentASticker(String username) { + return '😊 $username یک برچسب فرستاد'; + } + + @override + String sentAVideo(String username) { + return '🎥 $username یک ویدئو فرستاد'; + } + + @override + String sentCallInformations(String senderName) { + return '$senderName اطلاعات تماس را فرستاد'; + } + + @override + String get separateChatTypes => 'گپ‌های مستقیم را از گروه‌ها جدا کنید'; + + @override + String get setAsCanonicalAlias => 'به عنوان نام مستعار اصلی تنظیم کنید'; + + @override + String get setCustomEmotes => 'شکلک سفارشی را تنظیم کنید'; + + @override + String get setChatDescription => 'Set chat description'; + + @override + String get setInvitationLink => 'تنظیم پیوند دعوت'; + + @override + String get setPermissionsLevel => 'تنظیم درجه اجازه‌ها'; + + @override + String get setStatus => 'تنظیم وضعیت'; + + @override + String get settings => 'تنظیمات'; + + @override + String get share => 'اشتراک‌گذاری'; + + @override + String sharedTheLocation(String username) { + return '$username وضعیت مکانی خود را به اشتراک گذاشت'; + } + + @override + String get shareLocation => 'اشتراک‌گذاری وضعیت مکانی'; + + @override + String get showPassword => 'نمایش رمز عبور'; + + @override + String get presenceStyle => 'Presence:'; + + @override + String get hideAvatarsInInvites => 'Hide avatars in invites'; + + @override + String get hideAvatarsInInvitesDescription => + 'Do not show room avatars in invites'; + + @override + String get presencesToggle => 'Show status messages from other users'; + + @override + String get pureBlackToggle => 'Pure Black'; + + @override + String get singlesignon => 'شناسایی یگانه(Single Sign on)'; + + @override + String get skip => 'رد شدن'; + + @override + String get sourceCode => 'کد منبع'; + + @override + String get spaceIsPublic => 'فضا عمومی است'; + + @override + String get spaceName => 'نام فضا'; + + @override + String startedACall(String senderName) { + return '$senderName تماسی را شروع کرد'; + } + + @override + String get startFirstChat => 'اولین گپ خود را شروع کنید'; + + @override + String get status => 'وضعیت'; + + @override + String get statusExampleMessage => 'امروز حالتان چطور است؟'; + + @override + String get submit => 'ارسال'; + + @override + String get synchronizingPleaseWait => 'در حال همگام‌سازی... لطفا صبر کنید.'; + + @override + String synchronizingPleaseWaitCounter(String percentage) { + return ' Synchronizing… ($percentage%)'; + } + + @override + String get systemTheme => 'سیستم'; + + @override + String get theyDontMatch => 'با هم منطبق نیستند'; + + @override + String get theyMatch => 'با هم منطبق هستند'; + + @override + String get title => 'فلافی‌چت'; + + @override + String get toggleFavorite => 'تغییر حالت محبوبیت'; + + @override + String get toggleMuted => 'تغییر حالت بی‌صدا'; + + @override + String get toggleUnread => 'علامت‌گذاشتن به عنوان خوانده‌شده/خوانده‌نشده'; + + @override + String get tooManyRequestsWarning => + 'تعداد درخواست‌های بیش از حد. لطفا بعدا دوباره امتحان کنید!'; + + @override + String get transferFromAnotherDevice => 'انتقال از دستگاهی دیگر'; + + @override + String get tryToSendAgain => 'تلاش برای ارسال مجدد'; + + @override + String get unavailable => 'خارج از دسترس'; + + @override + String unbannedUser(String username, String targetName) { + return '$username محرومیت $targetName را برداشت'; + } + + @override + String get unblockDevice => 'برداشتن مسدود بودن دستگاه'; + + @override + String get unknownDevice => 'دستگاه ناشناس'; + + @override + String get unknownEncryptionAlgorithm => 'الگوریتم رمزگذاری ناشناخته'; + + @override + String unknownEvent(String type) { + return 'رویداد ناشناخته «$type»'; + } + + @override + String get unmuteChat => 'بازکردن صدای گپ'; + + @override + String get unpin => 'برداشتن سنجاق'; + + @override + String unreadChats(int unreadCount) { + String _temp0 = intl.Intl.pluralLogic( + unreadCount, + locale: localeName, + other: '$unreadCount گپ خوانده نشده', + ); + return '$_temp0'; + } + + @override + String userAndOthersAreTyping(String username, int count) { + return '$username و $count نفر دیگر در حال تایپ کردن…'; + } + + @override + String userAndUserAreTyping(String username, String username2) { + return '$username و $username2 در حال تایپ کردن…'; + } + + @override + String userIsTyping(String username) { + return '$username در حال تایپ کردن…'; + } + + @override + String userLeftTheChat(String username) { + return '🚪$username گپ را ترک کرد'; + } + + @override + String get username => 'نام‌کاربری'; + + @override + String userSentUnknownEvent(String username, String type) { + return '$username یک رویداد $type فرستاد'; + } + + @override + String get unverified => 'تاییدنشده'; + + @override + String get verified => 'تاییدشده'; + + @override + String get verify => 'بازبینی و تایید'; + + @override + String get verifyStart => 'شروع بازبینی و تایید'; + + @override + String get verifySuccess => 'بازبینی و تایید با موفقیت انجام شد!'; + + @override + String get verifyTitle => 'در حال تایید حساب دیگر'; + + @override + String get videoCall => 'تماس تصویری'; + + @override + String get visibilityOfTheChatHistory => 'قابلیت دیدن تاریخچه گپ'; + + @override + String get visibleForAllParticipants => 'قابل رویت برای تمام شرکت‌کنندگان'; + + @override + String get visibleForEveryone => 'قابل رویت برای همه'; + + @override + String get voiceMessage => 'پیام صوتی'; + + @override + String get waitingPartnerAcceptRequest => + 'در انتظار پذیرفتن درخواست از جانب فرد دیگر…'; + + @override + String get waitingPartnerEmoji => 'در انتظار پذیرفتن شکلک از جانب فرد دیگر…'; + + @override + String get waitingPartnerNumbers => + 'در انتظار پذیرفتن اعداد از جانب فرد دیگر…'; + + @override + String get wallpaper => 'کاغذدیواری:'; + + @override + String get warning => 'هشدار!'; + + @override + String get weSentYouAnEmail => 'یک ایمیل برایتان فرستادیم'; + + @override + String get whoCanPerformWhichAction => 'چه کسی توان انجام کدام عمل را داراست'; + + @override + String get whoIsAllowedToJoinThisGroup => + 'چه کسی اجازه پیوستن به این گروه را دارد'; + + @override + String get whyDoYouWantToReportThis => 'چرا می‌خواهید گزارش دهید؟'; + + @override + String get wipeChatBackup => + 'برای ایجاد کلید بازیابی جدید، پشتیبان گپ خود را پاک می‌کنید؟'; + + @override + String get withTheseAddressesRecoveryDescription => + 'با این آدرس‌ها می‌توانید رمز خود را بازیابی کنید.'; + + @override + String get writeAMessage => 'نوشتن پیام…'; + + @override + String get yes => 'بله'; + + @override + String get you => 'شما'; + + @override + String get youAreNoLongerParticipatingInThisChat => + 'شما دیگر در این گپ شرکت نمی‌کنید'; + + @override + String get youHaveBeenBannedFromThisChat => 'شما از این گپ محروم شده‌اید'; + + @override + String get yourPublicKey => 'کلید عمومی شما'; + + @override + String get messageInfo => 'اطلاعات پیام'; + + @override + String get time => 'زمان'; + + @override + String get messageType => 'نوع پیام'; + + @override + String get sender => 'فرستنده'; + + @override + String get openGallery => 'بازکردن گالری'; + + @override + String get removeFromSpace => 'حذف از فضا'; + + @override + String get addToSpaceDescription => + 'فضایی برای افزودن این گپ به آن انتخاب کنید.'; + + @override + String get start => 'شروع'; + + @override + String get pleaseEnterRecoveryKeyDescription => + 'برای گشودن قفل پیام‌های قدیمیتان، لطفا کلید بازیابی‌ای که در یک نشست پیشین تولید شده را وارد کنید. کلید بازیابی شما، رمز عبور شما نیست.'; + + @override + String get publish => 'انتشار'; + + @override + String videoWithSize(String size) { + return 'ویدئو ($size)'; + } + + @override + String get openChat => 'بازکردن گپ'; + + @override + String get markAsRead => 'علامت‌گذاشتن به عنوان خوانده شده'; + + @override + String get reportUser => 'گزارش دادن کاربر'; + + @override + String get dismiss => 'رد كردن‌'; + + @override + String reactedWith(String sender, String reaction) { + return '$sender با $reaction واکنش نشان داد'; + } + + @override + String get pinMessage => 'سنجاق کردن به اتاق'; + + @override + String get confirmEventUnpin => + 'آیا از برداشتن سنجاق رویداد به صورت دائمی مطمئن هستید؟'; + + @override + String get emojis => 'شکلک‌ها'; + + @override + String get placeCall => 'برقراری تماس'; + + @override + String get voiceCall => 'تماس صوتی'; + + @override + String get unsupportedAndroidVersion => 'نسخه اندروید پشتیبانی نشده'; + + @override + String get unsupportedAndroidVersionLong => + 'این ویژگی به نسخه تازه‌تری از اندروید نیاز دارد. لطفا به‌روزرسانی یا پشتیبانی لینیج‌اواس(LineageOS) را بررسی کنید.'; + + @override + String get videoCallsBetaWarning => + 'لطفا توجه داشته باشید که تماس‌های تصویری در حال حاضر آزمایشی هستند. ممکن است طبق انتظار کار نکنند یا روی همه پلتفرم‌ها اصلا کار نکنند.'; + + @override + String get experimentalVideoCalls => 'تماس‌های تصویری آزمایشی'; + + @override + String get emailOrUsername => 'رایانامه(ایمیل) یا نام کاربری'; + + @override + String get indexedDbErrorTitle => 'اشکالات حالت خصوصی'; + + @override + String get indexedDbErrorLong => + 'متاسفانه فضای ذخیره‌سازی پیام‌ها، به صورت پیش‌فرض در حالت خصوصی فعال نیست.\nلطفا آدرس زیر را باز کنید:\nabout:config\nمقدار «dom.indexedDB.privateBrowsing.enabled» را به «true» تغییر دهید\nدر غیر این صورت، امکان اجرای فلافی‌چت وجود ندارد.'; + + @override + String switchToAccount(String number) { + return 'تغییر به حساب $number'; + } + + @override + String get nextAccount => 'حساب بعدی'; + + @override + String get previousAccount => 'حساب قبلی'; + + @override + String get addWidget => 'افزودن ویجت'; + + @override + String get widgetVideo => 'ویدئو'; + + @override + String get widgetEtherpad => 'یادداشت متنی'; + + @override + String get widgetJitsi => 'جیتسی‌میت(Jitsi Meet)'; + + @override + String get widgetCustom => 'سفارشی'; + + @override + String get widgetName => 'نام'; + + @override + String get widgetUrlError => 'این آدرس وب معتبر نیست.'; + + @override + String get widgetNameError => 'لطفا یک نام نمایشی مشخص کنید.'; + + @override + String get errorAddingWidget => 'بروز خطا هنگام افزودن ویجت.'; + + @override + String get youRejectedTheInvitation => 'شما دعوت را رد کردید'; + + @override + String get youJoinedTheChat => 'شما به گپ پیوستید'; + + @override + String get youAcceptedTheInvitation => '👍 شما دعوت را پذیرفتید'; + + @override + String youBannedUser(String user) { + return 'شما $user را محروم کردید'; + } + + @override + String youHaveWithdrawnTheInvitationFor(String user) { + return 'شما دعوت $user را پس‌گرفتید'; + } + + @override + String youInvitedToBy(String alias) { + return '📩 You have been invited via link to:\n$alias'; + } + + @override + String youInvitedBy(String user) { + return '📩 شما توسط $user دعوت شده‌اید'; + } + + @override + String invitedBy(String user) { + return '📩 Invited by $user'; + } + + @override + String youInvitedUser(String user) { + return '📩 شما $user را دعوت کردید'; + } + + @override + String youKicked(String user) { + return '👞 شما $user را بیرون کردید'; + } + + @override + String youKickedAndBanned(String user) { + return '🙅 شما $user را بیرون و محروم کردید'; + } + + @override + String youUnbannedUser(String user) { + return 'شما محرومیت $user را برداشتید'; + } + + @override + String hasKnocked(String user) { + return '🚪 $user has knocked'; + } + + @override + String get usersMustKnock => 'Users must knock'; + + @override + String get noOneCanJoin => 'No one can join'; + + @override + String userWouldLikeToChangeTheChat(String user) { + return '$user would like to join the chat.'; + } + + @override + String get noPublicLinkHasBeenCreatedYet => + 'No public link has been created yet'; + + @override + String get knock => 'Knock'; + + @override + String get users => 'کاربرها'; + + @override + String get unlockOldMessages => 'گشودن قفل پیام‌های قدیمی'; + + @override + String get storeInSecureStorageDescription => + 'کلید بازیابی را در محل ذخیره‌سازی امن این دستگاه ذخیره کنید.'; + + @override + String get saveKeyManuallyDescription => + 'این کلید را به صورت دستی با فعال کردن گفتگوی اشتراک گذاری سیستم یا کلیپ بورد ذخیره کنید.'; + + @override + String get storeInAndroidKeystore => 'در Android KeyStore ذخیره کنید'; + + @override + String get storeInAppleKeyChain => 'در Apple KeyChain ذخیره کنید'; + + @override + String get storeSecurlyOnThisDevice => 'به طور ایمن در دستگاه ذخیره کنید'; + + @override + String countFiles(int count) { + return '$count فایل'; + } + + @override + String get user => 'کاربر'; + + @override + String get custom => 'سفارشی'; + + @override + String get foregroundServiceRunning => + 'این اعلان زمانی وقتی ظاهر می شود که سرویس پیش‌زمینه در حال اجرا است.'; + + @override + String get screenSharingTitle => 'اشتراک گذاری صفحه نمایش'; + + @override + String get screenSharingDetail => + 'شما در حال به اشتراک‌گذاری صفحه‌نمایش خود در فلافی‌چت هستید'; + + @override + String get callingPermissions => 'اجازه‌های تماس'; + + @override + String get callingAccount => 'حساب تماس'; + + @override + String get callingAccountDetails => + 'به فلافی‌چت اجازه می‌دهد تا از برنامه شماره‌گیر بومی اندروید استفاده کند.'; + + @override + String get appearOnTop => 'در بالا ظاهر شود'; + + @override + String get appearOnTopDetails => + 'به برنامه اجازه می‌دهد در بالا ظاهر شود (اگر قبلا فلافی‌‌چت را به عنوان حساب تماس تنظیم کرده‌اید، لازم نیست)'; + + @override + String get otherCallingPermissions => + 'میکروفون، دوربین و سایر مجوزهای فلافی‌چت'; + + @override + String get whyIsThisMessageEncrypted => 'چرا این پیام قابل خواندن نیست؟'; + + @override + String get noKeyForThisMessage => + 'اگر پیام قبل از ورود به حسابتان در این دستگاه ارسال شده باشد، ممکن است این اتفاق بیفتد.\n\nهمچنین ممکن است فرستنده، دستگاه شما را مسدود کرده باشد یا مشکلی در اتصال اینترنت رخ داده باشد.\n\nآیا می توانید پیام را در نشست دیگری بخوانید؟ بنابراین می توانید پیام را از آن منتقل کنید! به تنظیمات > دستگاه‌ها بروید و مطمئن شوید که دستگاه های شما یکدیگر را تایید کرده‌اند. هنگامی که دفعه بعد اتاق را باز می‌کنید و هر دو جلسه در پیش‌زمینه هستند، کلیدها به طور خودکار منتقل می‌شوند.\n\nآیا نمی‌خواهید هنگام خروج از سیستم یا تعویض دستگاه، کلیدها را گم کنید؟ مطمئن شوید که پشتیبان گپ را در تنظیمات فعال کرده‌اید.'; + + @override + String get newGroup => 'گروه جدید'; + + @override + String get newSpace => 'فضای جدید'; + + @override + String get enterSpace => 'ورود به فضا'; + + @override + String get enterRoom => 'ورود به اتاق'; + + @override + String get allSpaces => 'همه فضاها'; + + @override + String numChats(String number) { + return '$number گپ'; + } + + @override + String get hideUnimportantStateEvents => + 'رویدادهای غیر مهم مربوط به وضعیت را پنهان کنید'; + + @override + String get hidePresences => 'Hide Status List?'; + + @override + String get doNotShowAgain => 'دوباره نشان نده'; + + @override + String wasDirectChatDisplayName(String oldDisplayName) { + return 'گپ خالی ($oldDisplayName بود)'; + } + + @override + String get newSpaceDescription => + 'فضاها به شما امکان می‌دهند گپ‌های خود را یکپارچه کنید و جوامع خصوصی یا عمومی بسازید.'; + + @override + String get encryptThisChat => 'این گپ را رمزگذاری کنید'; + + @override + String get disableEncryptionWarning => + 'به دلایل امنیتی نمی‌توانید رمزگذاری را در گپ غیرفعال کنید، در حالی که از قبل فعال شده است.'; + + @override + String get sorryThatsNotPossible => 'متاسفم... این امکان‌پذیر نیست'; + + @override + String get deviceKeys => 'کلیدهای دستگاه:'; + + @override + String get reopenChat => 'گپ را دوباره باز کنید'; + + @override + String get noBackupWarning => + 'هشدار! بدون فعال کردن پشتیبان گپ، دسترسی به پیام های رمزگذاری شده خود را از دست خواهید داد. قویا توصیه می‌شود قبل از خروج از سیستم، ابتدا پشتیبان‌گیری گپ را فعال کنید.'; + + @override + String get noOtherDevicesFound => 'دستگاه دیگری پیدا نشد'; + + @override + String fileIsTooBigForServer(String max) { + return 'سرور گزارش می‌دهد که فایل برای ارسال بسیار بزرگ است.'; + } + + @override + String fileHasBeenSavedAt(String path) { + return 'فایل در $path ذخیره شده است'; + } + + @override + String get jumpToLastReadMessage => 'پرش به آخرین پیام خوانده شده'; + + @override + String get readUpToHere => 'تا اینجا خوانده شده'; + + @override + String get jump => 'پرش'; + + @override + String get openLinkInBrowser => 'بازکردن پیوند در مرورگر'; + + @override + String get reportErrorDescription => + 'اوه نه. اشتباهی رخ داد. اگر تمایل دارید، می‌توانید این اشکال را با توسعه‌دهندگان گزارش دهید.'; + + @override + String get report => 'گزارش'; + + @override + String get signInWithPassword => 'ورود با رمزعبور'; + + @override + String get pleaseTryAgainLaterOrChooseDifferentServer => + 'لطفا بعدا تلاش کنید یا سرور دیگری انتخاب کنید.'; + + @override + String signInWith(String provider) { + return 'Sign in with $provider'; + } + + @override + String get profileNotFound => + 'The user could not be found on the server. Maybe there is a connection problem or the user doesn\'t exist.'; + + @override + String get setTheme => 'Set theme:'; + + @override + String get setColorTheme => 'Set color theme:'; + + @override + String get invite => 'Invite'; + + @override + String get inviteGroupChat => '📨 Invite group chat'; + + @override + String get invitePrivateChat => '📨 Invite private chat'; + + @override + String get invalidInput => 'Invalid input!'; + + @override + String wrongPinEntered(int seconds) { + return 'Wrong pin entered! Try again in $seconds seconds...'; + } + + @override + String get pleaseEnterANumber => 'Please enter a number greater than 0'; + + @override + String get archiveRoomDescription => + 'The chat will be moved to the archive. Other users will be able to see that you have left the chat.'; + + @override + String get roomUpgradeDescription => + 'The chat will then be recreated with the new room version. All participants will be notified that they need to switch to the new chat. You can find out more about room versions at https://spec.matrix.org/latest/rooms/'; + + @override + String get removeDevicesDescription => + 'You will be logged out of this device and will no longer be able to receive messages.'; + + @override + String get banUserDescription => + 'The user will be banned from the chat and will not be able to enter the chat again until they are unbanned.'; + + @override + String get unbanUserDescription => + 'The user will be able to enter the chat again if they try.'; + + @override + String get kickUserDescription => + 'The user is kicked out of the chat but not banned. In public chats, the user can rejoin at any time.'; + + @override + String get makeAdminDescription => + 'Once you make this user admin, you may not be able to undo this as they will then have the same permissions as you.'; + + @override + String get pushNotificationsNotAvailable => + 'Push notifications not available'; + + @override + String get learnMore => 'Learn more'; + + @override + String get yourGlobalUserIdIs => 'Your global user-ID is: '; + + @override + String noUsersFoundWithQuery(String query) { + return 'Unfortunately no user could be found with \"$query\". Please check whether you made a typo.'; + } + + @override + String get knocking => 'Knocking'; + + @override + String chatCanBeDiscoveredViaSearchOnServer(String server) { + return 'Chat can be discovered via the search on $server'; + } + + @override + String get searchChatsRooms => 'Search for #chats, @users...'; + + @override + String get nothingFound => 'Nothing found...'; + + @override + String get groupName => 'Group name'; + + @override + String get createGroupAndInviteUsers => 'Create a group and invite users'; + + @override + String get groupCanBeFoundViaSearch => 'Group can be found via search'; + + @override + String get wrongRecoveryKey => + 'Sorry... this does not seem to be the correct recovery key.'; + + @override + String get startConversation => 'Start conversation'; + + @override + String get commandHint_sendraw => 'Send raw json'; + + @override + String get databaseMigrationTitle => 'Database is optimized'; + + @override + String get databaseMigrationBody => 'Please wait. This may take a moment.'; + + @override + String get leaveEmptyToClearStatus => 'Leave empty to clear your status.'; + + @override + String get select => 'Select'; + + @override + String get searchForUsers => 'Search for @users...'; + + @override + String get pleaseEnterYourCurrentPassword => + 'Please enter your current password'; + + @override + String get newPassword => 'New password'; + + @override + String get pleaseChooseAStrongPassword => 'Please choose a strong password'; + + @override + String get passwordsDoNotMatch => 'Passwords do not match'; + + @override + String get passwordIsWrong => 'Your entered password is wrong'; + + @override + String get publicLink => 'Public link'; + + @override + String get publicChatAddresses => 'Public chat addresses'; + + @override + String get createNewAddress => 'Create new address'; + + @override + String get joinSpace => 'Join space'; + + @override + String get publicSpaces => 'Public spaces'; + + @override + String get addChatOrSubSpace => 'Add chat or sub space'; + + @override + String get subspace => 'Subspace'; + + @override + String get decline => 'Decline'; + + @override + String get thisDevice => 'This device:'; + + @override + String get initAppError => 'An error occured while init the app'; + + @override + String get userRole => 'User role'; + + @override + String minimumPowerLevel(String level) { + return '$level is the minimum power level.'; + } + + @override + String searchIn(String chat) { + return 'Search in chat \"$chat\"...'; + } + + @override + String get searchMore => 'Search more...'; + + @override + String get gallery => 'Gallery'; + + @override + String get files => 'Files'; + + @override + String databaseBuildErrorBody(String url, String error) { + return 'Unable to build the SQlite database. The app tries to use the legacy database for now. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String sessionLostBody(String url, String error) { + return 'Your session is lost. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String restoreSessionBody(String url, String error) { + return 'The app now tries to restore your session from the backup. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String forwardMessageTo(String roomName) { + return 'Forward message to $roomName?'; + } + + @override + String get sendReadReceipts => 'Send read receipts'; + + @override + String get sendTypingNotificationsDescription => + 'Other participants in a chat can see when you are typing a new message.'; + + @override + String get sendReadReceiptsDescription => + 'Other participants in a chat can see when you have read a message.'; + + @override + String get formattedMessages => 'Formatted messages'; + + @override + String get formattedMessagesDescription => + 'Display rich message content like bold text using markdown.'; + + @override + String get verifyOtherUser => '🔐 Verify other user'; + + @override + String get verifyOtherUserDescription => + 'If you verify another user, you can be sure that you know who you are really writing to. 💪\n\nWhen you start a verification, you and the other user will see a popup in the app. There you will then see a series of emojis or numbers that you have to compare with each other.\n\nThe best way to do this is to meet up or start a video call. 👭'; + + @override + String get verifyOtherDevice => '🔐 Verify other device'; + + @override + String get verifyOtherDeviceDescription => + 'When you verify another device, those devices can exchange keys, increasing your overall security. 💪 When you start a verification, a popup will appear in the app on both devices. There you will then see a series of emojis or numbers that you have to compare with each other. It\'s best to have both devices handy before you start the verification. 🤳'; + + @override + String acceptedKeyVerification(String sender) { + return '$sender accepted key verification'; + } + + @override + String canceledKeyVerification(String sender) { + return '$sender canceled key verification'; + } + + @override + String completedKeyVerification(String sender) { + return '$sender completed key verification'; + } + + @override + String isReadyForKeyVerification(String sender) { + return '$sender is ready for key verification'; + } + + @override + String requestedKeyVerification(String sender) { + return '$sender requested key verification'; + } + + @override + String startedKeyVerification(String sender) { + return '$sender started key verification'; + } + + @override + String get transparent => 'Transparent'; + + @override + String get incomingMessages => 'Incoming messages'; + + @override + String get stickers => 'Stickers'; + + @override + String get discover => 'Discover'; + + @override + String get commandHint_ignore => 'Ignore the given matrix ID'; + + @override + String get commandHint_unignore => 'Unignore the given matrix ID'; + + @override + String unreadChatsInApp(String appname, String unread) { + return '$appname: $unread unread chats'; + } + + @override + String get noDatabaseEncryption => + 'Database encryption is not supported on this platform'; + + @override + String thereAreCountUsersBlocked(Object count) { + return 'Right now there are $count users blocked.'; + } + + @override + String get restricted => 'Restricted'; + + @override + String get knockRestricted => 'Knock restricted'; + + @override + String goToSpace(Object space) { + return 'Go to space: $space'; + } + + @override + String get markAsUnread => 'Mark as unread'; + + @override + String userLevel(int level) { + return '$level - User'; + } + + @override + String moderatorLevel(int level) { + return '$level - Moderator'; + } + + @override + String adminLevel(int level) { + return '$level - Admin'; + } + + @override + String get changeGeneralChatSettings => 'Change general chat settings'; + + @override + String get inviteOtherUsers => 'Invite other users to this chat'; + + @override + String get changeTheChatPermissions => 'Change the chat permissions'; + + @override + String get changeTheVisibilityOfChatHistory => + 'Change the visibility of the chat history'; + + @override + String get changeTheCanonicalRoomAlias => + 'Change the main public chat address'; + + @override + String get sendRoomNotifications => 'Send a @room notifications'; + + @override + String get changeTheDescriptionOfTheGroup => + 'Change the description of the chat'; + + @override + String get chatPermissionsDescription => + 'Define which power level is necessary for certain actions in this chat. The power levels 0, 50 and 100 are usually representing users, moderators and admins, but any gradation is possible.'; + + @override + String updateInstalled(String version) { + return '🎉 Update $version installed!'; + } + + @override + String get changelog => 'Changelog'; + + @override + String get sendCanceled => 'Sending canceled'; + + @override + String get loginWithMatrixId => 'Login with Matrix-ID'; + + @override + String get discoverHomeservers => 'Discover homeservers'; + + @override + String get whatIsAHomeserver => 'What is a homeserver?'; + + @override + String get homeserverDescription => + 'All your data is stored on the homeserver, just like an email provider. You can choose which homeserver you want to use, while you can still communicate with everyone. Learn more at at https://matrix.org.'; + + @override + String get doesNotSeemToBeAValidHomeserver => + 'Doesn\'t seem to be a compatible homeserver. Wrong URL?'; + + @override + String get calculatingFileSize => 'Calculating file size...'; + + @override + String get prepareSendingAttachment => 'Prepare sending attachment...'; + + @override + String get sendingAttachment => 'Sending attachment...'; + + @override + String get generatingVideoThumbnail => 'Generating video thumbnail...'; + + @override + String get compressVideo => 'Compressing video...'; + + @override + String sendingAttachmentCountOfCount(int index, int length) { + return 'Sending attachment $index of $length...'; + } + + @override + String serverLimitReached(int seconds) { + return 'Server limit reached! Waiting $seconds seconds...'; + } + + @override + String get oneOfYourDevicesIsNotVerified => + 'One of your devices is not verified'; + + @override + String get noticeChatBackupDeviceVerification => + 'Note: When you connect all your devices to the chat backup, they are automatically verified.'; + + @override + String get continueText => 'Continue'; + + @override + String get welcomeText => + 'Hey Hey 👋 This is Extera. You can sign in to any homeserver, which is compatible with https://matrix.org. And then chat with anyone. It\'s a huge decentralized messaging network!'; + + @override + String get blur => 'Blur:'; + + @override + String get opacity => 'Opacity:'; + + @override + String get setWallpaper => 'Set wallpaper'; + + @override + String get manageAccount => 'Manage account'; + + @override + String get noContactInformationProvided => + 'Server does not provide any valid contact information'; + + @override + String get contactServerAdmin => 'Contact server admin'; + + @override + String get contactServerSecurity => 'Contact server security'; + + @override + String get supportPage => 'Support page'; + + @override + String get serverInformation => 'Server information:'; + + @override + String get name => 'Name'; + + @override + String get version => 'Version'; + + @override + String get website => 'Website'; + + @override + String get compress => 'Compress'; + + @override + String get boldText => 'Bold text'; + + @override + String get italicText => 'Italic text'; + + @override + String get strikeThrough => 'Strikethrough'; + + @override + String get pleaseFillOut => 'Please fill out'; + + @override + String get invalidUrl => 'Invalid url'; + + @override + String get addLink => 'Add link'; + + @override + String get unableToJoinChat => + 'Unable to join chat. Maybe the other party has already closed the conversation.'; + + @override + String get previous => 'Previous'; + + @override + String get otherPartyNotLoggedIn => + 'The other party is currently not logged in and therefore cannot receive messages!'; + + @override + String appWantsToUseForLogin(String server) { + return 'Use \'$server\' to log in'; + } + + @override + String get appWantsToUseForLoginDescription => + 'You hereby allow the app and website to share information about you.'; + + @override + String get open => 'Open'; + + @override + String get waitingForServer => 'Waiting for server...'; + + @override + String get appIntroduction => + 'Extera lets you chat with your friends across different messengers. Learn more at https://matrix.org or just tap *Continue*.'; + + @override + String get newChatRequest => '📩 New chat request'; + + @override + String get contentNotificationSettings => 'Content notification settings'; + + @override + String get generalNotificationSettings => 'General notification settings'; + + @override + String get roomNotificationSettings => 'Room notification settings'; + + @override + String get userSpecificNotificationSettings => + 'User specific notification settings'; + + @override + String get otherNotificationSettings => 'Other notification settings'; + + @override + String get notificationRuleContainsUserName => 'Contains User Name'; + + @override + String get notificationRuleContainsUserNameDescription => + 'Notifies the user when a message contains their username.'; + + @override + String get notificationRuleMaster => 'Mute all notifications'; + + @override + String get notificationRuleMasterDescription => + 'Overrides all other rules and disables all notifications.'; + + @override + String get notificationRuleSuppressNotices => 'Suppress Automated Messages'; + + @override + String get notificationRuleSuppressNoticesDescription => + 'Suppresses notifications from automated clients like bots.'; + + @override + String get notificationRuleInviteForMe => 'Invite for Me'; + + @override + String get notificationRuleInviteForMeDescription => + 'Notifies the user when they are invited to a room.'; + + @override + String get notificationRuleMemberEvent => 'Member Event'; + + @override + String get notificationRuleMemberEventDescription => + 'Suppresses notifications for membership events.'; + + @override + String get notificationRuleIsUserMention => 'User Mention'; + + @override + String get notificationRuleIsUserMentionDescription => + 'Notifies the user when they are directly mentioned in a message.'; + + @override + String get notificationRuleContainsDisplayName => 'Contains Display Name'; + + @override + String get notificationRuleContainsDisplayNameDescription => + 'Notifies the user when a message contains their display name.'; + + @override + String get notificationRuleIsRoomMention => 'Room Mention'; + + @override + String get notificationRuleIsRoomMentionDescription => + 'Notifies the user when there is a room mention.'; + + @override + String get notificationRuleRoomnotif => 'Room Notification'; + + @override + String get notificationRuleRoomnotifDescription => + 'Notifies the user when a message contains \'@room\'.'; + + @override + String get notificationRuleTombstone => 'Tombstone'; + + @override + String get notificationRuleTombstoneDescription => + 'Notifies the user about room deactivation messages.'; + + @override + String get notificationRuleReaction => 'Reaction'; + + @override + String get notificationRuleReactionDescription => + 'Suppresses notifications for reactions.'; + + @override + String get notificationRuleRoomServerAcl => 'Room Server ACL'; + + @override + String get notificationRuleRoomServerAclDescription => + 'Suppresses notifications for room server access control lists (ACL).'; + + @override + String get notificationRuleSuppressEdits => 'Suppress Edits'; + + @override + String get notificationRuleSuppressEditsDescription => + 'Suppresses notifications for edited messages.'; + + @override + String get notificationRuleCall => 'Call'; + + @override + String get notificationRuleCallDescription => + 'Notifies the user about calls.'; + + @override + String get notificationRuleEncryptedRoomOneToOne => + 'Encrypted Room One-to-One'; + + @override + String get notificationRuleEncryptedRoomOneToOneDescription => + 'Notifies the user about messages in encrypted one-to-one rooms.'; + + @override + String get notificationRuleRoomOneToOne => 'Room One-to-One'; + + @override + String get notificationRuleRoomOneToOneDescription => + 'Notifies the user about messages in one-to-one rooms.'; + + @override + String get notificationRuleMessage => 'Message'; + + @override + String get notificationRuleMessageDescription => + 'Notifies the user about general messages.'; + + @override + String get notificationRuleEncrypted => 'Encrypted'; + + @override + String get notificationRuleEncryptedDescription => + 'Notifies the user about messages in encrypted rooms.'; + + @override + String get notificationRuleJitsi => 'Jitsi'; + + @override + String get notificationRuleJitsiDescription => + 'Notifies the user about Jitsi widget events.'; + + @override + String get notificationRuleServerAcl => 'Suppress Server ACL Events'; + + @override + String get notificationRuleServerAclDescription => + 'Suppresses notifications for Server ACL events.'; + + @override + String unknownPushRule(String rule) { + return 'Unknown push rule \'$rule\''; + } + + @override + String get deletePushRuleCanNotBeUndone => + 'If you delete this notification setting, this can not be undone.'; + + @override + String get more => 'More'; + + @override + String get shareKeysWith => 'Share keys with...'; + + @override + String get shareKeysWithDescription => + 'Which devices should be trusted so that they can read along your messages in encrypted chats?'; + + @override + String get allDevices => 'All devices'; + + @override + String get crossVerifiedDevicesIfEnabled => + 'Cross verified devices if enabled'; + + @override + String get crossVerifiedDevices => 'Cross verified devices'; + + @override + String get verifiedDevicesOnly => 'Verified devices only'; + + @override + String get takeAPhoto => 'Take a photo'; + + @override + String get recordAVideo => 'Record a video'; + + @override + String get optionalMessage => '(Optional) message...'; + + @override + String get notSupportedOnThisDevice => 'Not supported on this device'; + + @override + String get enterNewChat => 'Enter new chat'; + + @override + String get approve => 'Approve'; + + @override + String get youHaveKnocked => 'You have knocked'; + + @override + String get pleaseWaitUntilInvited => + 'Please wait now, until someone from the room invites you.'; +} diff --git a/lib/generated/l10n/l10n_fi.dart b/lib/generated/l10n/l10n_fi.dart new file mode 100644 index 0000000..b5fab90 --- /dev/null +++ b/lib/generated/l10n/l10n_fi.dart @@ -0,0 +1,2754 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'l10n.dart'; + +// ignore_for_file: type=lint + +/// The translations for Finnish (`fi`). +class L10nFi extends L10n { + L10nFi([String locale = 'fi']) : super(locale); + + @override + String get noSendPermission => 'You can\'t send messages here'; + + @override + String get alwaysUse24HourFormat => 'false'; + + @override + String get repeatPassword => 'Salasana uudelleen'; + + @override + String get notAnImage => 'Tämä ei ole kuvatiedosto.'; + + @override + String get setCustomPermissionLevel => 'Set custom permission level'; + + @override + String get setPermissionsLevelDescription => + 'Please choose a predefined role below or enter a custom permission level between 0 and 100.'; + + @override + String get ignoreUser => 'Ignore user'; + + @override + String get normalUser => 'Normal user'; + + @override + String get remove => 'Poista'; + + @override + String get importNow => 'Tuo nyt'; + + @override + String get importEmojis => 'Tuo emojit'; + + @override + String get importFromZipFile => 'Tuo .zip -tiedostosta'; + + @override + String get exportEmotePack => 'Vie emotepaketti .zip-tiedostona'; + + @override + String get replace => 'Korvaa'; + + @override + String get about => 'Tietoa FluffyChatista'; + + @override + String aboutHomeserver(String homeserver) { + return 'About $homeserver'; + } + + @override + String get accept => 'Hyväksy'; + + @override + String acceptedTheInvitation(String username) { + return '$username hyväksyi kutsun'; + } + + @override + String get account => 'Tili'; + + @override + String activatedEndToEndEncryption(String username) { + return '🔐 $username otti käyttöön päästä-päähän salauksen'; + } + + @override + String get addEmail => 'Lisää sähköpostiosoite'; + + @override + String get confirmMatrixId => + 'Kirjoita Matrix IDsi uudelleen poistaaksesi tunnuksesi.'; + + @override + String supposedMxid(String mxid) { + return 'Tämän pitäisi olla $mxid'; + } + + @override + String get addChatDescription => 'Lisää keskustelulle kuvaus...'; + + @override + String get addToSpace => 'Lisää tilaan'; + + @override + String get admin => 'Ylläpitäjä'; + + @override + String get alias => 'alias'; + + @override + String get all => 'Kaikki'; + + @override + String get allChats => 'Kaikki keskustelut'; + + @override + String get commandHint_roomupgrade => + 'Upgrade this room to the given room version'; + + @override + String get commandHint_googly => 'Lähetä askartelusilmiä'; + + @override + String get commandHint_cuddle => 'Lähetä kokovartaluhalaus'; + + @override + String get commandHint_hug => 'Lähetä halaus'; + + @override + String googlyEyesContent(String senderName) { + return '$senderName lähettää askartelusilmiä'; + } + + @override + String cuddleContent(String senderName) { + return '$senderName kokovartalohalaa sinua'; + } + + @override + String hugContent(String senderName) { + return '$senderName halaa sinua'; + } + + @override + String answeredTheCall(String senderName) { + return '$senderName vastasi puheluun'; + } + + @override + String get anyoneCanJoin => 'Kuka tahansa voi liittyä'; + + @override + String get appLock => 'Sovelluksen lukitus'; + + @override + String get appLockDescription => + 'Lock the app when not using with a pin code'; + + @override + String get archive => 'Arkisto'; + + @override + String get areGuestsAllowedToJoin => 'Sallitaanko vieraiden liittyminen'; + + @override + String get areYouSure => 'Oletko varma?'; + + @override + String get areYouSureYouWantToLogout => 'Haluatko varmasti kirjautua ulos?'; + + @override + String get askSSSSSign => + 'Voidaksesi allekirjoittaa toisen henkilön, syötä turvavaraston salalause tai palautusavain.'; + + @override + String askVerificationRequest(String username) { + return 'Hyväksytäänkö tämä varmennuspyyntö käyttäjältä $username?'; + } + + @override + String get autoplayImages => + 'Toista animoidut tarrat ja emojit automaattisesti'; + + @override + String badServerLoginTypesException(String serverVersions, + String supportedVersions, Object suportedVersions) { + return 'Tämä kotipalvelin tukee sisäänkirjautumistapoja: \n$serverVersions,\nmutta tämä sovellus tukee vain -tapoja: \n$supportedVersions'; + } + + @override + String get sendTypingNotifications => 'Lähetä kirjoitusilmoituksia'; + + @override + String get swipeRightToLeftToReply => + 'Vastaa pyyhkäisemällä oikealta vasemmalle'; + + @override + String get sendOnEnter => 'Lähetä painamalla rivinvaihtonäppäintä'; + + @override + String badServerVersionsException(String serverVersions, + String supportedVersions, Object serverVerions, Object suportedVersions) { + return 'Kotipalvelin tukee Matrix Spec versio(it)a:\n$serverVersions, mutta tämä sovellus tukee vain versio(it)a $supportedVersions'; + } + + @override + String countChatsAndCountParticipants(int chats, int participants) { + return '$chats chats and $participants participants'; + } + + @override + String get noMoreChatsFound => 'Lisää keskusteluja ei löytynyt...'; + + @override + String get noChatsFoundHere => + 'No chats found here yet. Start a new chat with someone by using the button below. ⤵️'; + + @override + String get joinedChats => 'Joined chats'; + + @override + String get unread => 'Lukemattomat'; + + @override + String get space => 'Space'; + + @override + String get spaces => 'Spaces'; + + @override + String get banFromChat => 'Anna porttikielto keskusteluun'; + + @override + String get banned => 'Porttikiellossa'; + + @override + String bannedUser(String username, String targetName) { + return '$username antoi porttikiellon käyttäjälle $targetName'; + } + + @override + String get blockDevice => 'Estä laite'; + + @override + String get blocked => 'Estetty'; + + @override + String get botMessages => 'Bottien lähettämät viestit'; + + @override + String get cancel => 'Peruuta'; + + @override + String cantOpenUri(String uri) { + return 'URI-osoitetta $uri ei voida avata'; + } + + @override + String get changeDeviceName => 'Vaihda laitteen nimeä'; + + @override + String changedTheChatAvatar(String username) { + return '$username muutti keskustelun kuvaa'; + } + + @override + String changedTheChatDescriptionTo(String username, String description) { + return '$username asetti keskustelun kuvaukseksi: \'$description\''; + } + + @override + String changedTheChatNameTo(String username, String chatname) { + return '$username asetti keskustelun nimeksi: \'$chatname\''; + } + + @override + String changedTheChatPermissions(String username) { + return '$username muutti keskustelun oikeuksia'; + } + + @override + String changedTheDisplaynameTo(String username, String displayname) { + return '$username asetti näyttönimekseen: \'$displayname\''; + } + + @override + String changedTheGuestAccessRules(String username) { + return '$username muutti vieraspääsyn sääntöjä'; + } + + @override + String changedTheGuestAccessRulesTo(String username, String rules) { + return '$username asetti vieraspääsyn säännö(i)ksi: $rules'; + } + + @override + String changedTheHistoryVisibility(String username) { + return '$username muutti historian näkyvyyttä'; + } + + @override + String changedTheHistoryVisibilityTo(String username, String rules) { + return '$username asetti historian näkymissäännöksi: $rules'; + } + + @override + String changedTheJoinRules(String username) { + return '$username muutti liittymissääntöjä'; + } + + @override + String changedTheJoinRulesTo(String username, String joinRules) { + return '$username asetti liittymissäännöiksi: $joinRules'; + } + + @override + String changedTheProfileAvatar(String username) { + return '$username vaihtoi profiilikuvaansa'; + } + + @override + String changedTheRoomAliases(String username) { + return '$username muutti huoneen aliaksia'; + } + + @override + String changedTheRoomInvitationLink(String username) { + return '$username muutti kutsulinkkiä'; + } + + @override + String get changePassword => 'Vaihda salasana'; + + @override + String get changeTheHomeserver => 'Vaihda kotipalvelinta'; + + @override + String get changeTheme => 'Vaihda tyyliäsi'; + + @override + String get changeTheNameOfTheGroup => 'Vaihda ryhmän nimeä'; + + @override + String get changeYourAvatar => 'Vaihda profiilikuvasi'; + + @override + String get channelCorruptedDecryptError => 'Salaus on korruptoitunut'; + + @override + String get chat => 'Keskustelu'; + + @override + String get yourChatBackupHasBeenSetUp => + 'Keskustelujesi varmuuskopiointi on asetettu.'; + + @override + String get chatBackup => 'Keskustelun varmuuskopiointi'; + + @override + String get chatBackupDescription => + 'Vanhat viestisi on suojattu palautusavaimella. Varmistathan ettet hävitä sitä.'; + + @override + String get chatDetails => 'Keskustelun tiedot'; + + @override + String get chatHasBeenAddedToThisSpace => + 'Keskustelu on lisätty tähän tilaan'; + + @override + String get chats => 'Keskustelut'; + + @override + String get chooseAStrongPassword => 'Valitse vahva salasana'; + + @override + String get clearArchive => 'Tyhjennä arkisto'; + + @override + String get close => 'Sulje'; + + @override + String get commandHint_markasdm => + 'Merkitse yksityiskeskusteluksi syötetyn Matrix IDn kanssa'; + + @override + String get commandHint_markasgroup => 'Merkitse ryhmäksi'; + + @override + String get commandHint_ban => + 'Anna syötetylle käyttäjälle porttikielto tähän huoneeseen'; + + @override + String get commandHint_clearcache => 'Tyhjennä välimuisti'; + + @override + String get commandHint_create => + 'Luo tyhjä ryhmäkeskustelu\nKäytä parametria --no-encryption poistaaksesi salauksen käytöstä'; + + @override + String get commandHint_discardsession => 'Hylkää istunto'; + + @override + String get commandHint_dm => + 'Aloita yksityiskeskustelu\nKäytä parametria --no-encryption poistaaksesi salauksen käytöstä'; + + @override + String get commandHint_html => 'Lähetä HTML-muotoiltua tekstiä'; + + @override + String get commandHint_invite => 'Kutsu syötetty käyttäjä tähän huoneeseen'; + + @override + String get commandHint_join => 'Liity syötettyyn huoneeseen'; + + @override + String get commandHint_kick => 'Poista syötetty käyttäjä huoneesta'; + + @override + String get commandHint_leave => 'Poistu tästä huoneesta'; + + @override + String get commandHint_me => 'Kuvaile itseäsi'; + + @override + String get commandHint_myroomavatar => + 'Aseta profiilikuvasi tähän huoneeseen (syöttämällä mxc-uri)'; + + @override + String get commandHint_myroomnick => + 'Aseta näyttönimesi vain tässä huoneessa'; + + @override + String get commandHint_op => 'Aseta käyttäjän voimataso (oletus: 50)'; + + @override + String get commandHint_plain => 'Lähetä muotoilematonta tekstiä'; + + @override + String get commandHint_react => 'Lähetä vastaus reaktiona'; + + @override + String get commandHint_send => 'Lähetä tekstiä'; + + @override + String get commandHint_unban => + 'Poista syötetyn käyttäjän porttikielto tästä huoneesta'; + + @override + String get commandInvalid => 'Epäkelvollinen komento'; + + @override + String commandMissing(String command) { + return '$command ei ole komento.'; + } + + @override + String get compareEmojiMatch => 'Vertaa hymiöitä'; + + @override + String get compareNumbersMatch => 'Vertaa numeroita'; + + @override + String get configureChat => 'Määritä keskustelu'; + + @override + String get confirm => 'Vahvista'; + + @override + String get connect => 'Yhdistä'; + + @override + String get contactHasBeenInvitedToTheGroup => + 'Yhteystieto on kutsuttu ryhmään'; + + @override + String get containsDisplayName => 'Sisältää näyttönimen'; + + @override + String get containsUserName => 'Sisältää käyttäjätunnuksen'; + + @override + String get contentHasBeenReported => + 'Sisältö on ilmoitettu palvelimen ylläpitäjille'; + + @override + String get copiedToClipboard => 'Kopioitu leikepöydälle'; + + @override + String get copy => 'Kopioi'; + + @override + String get copyToClipboard => 'Kopioi leikepöydälle'; + + @override + String couldNotDecryptMessage(String error) { + return 'Viestin salausta ei voitu purkaa: $error'; + } + + @override + String countParticipants(int count) { + return '$count osallistujaa'; + } + + @override + String get create => 'Luo'; + + @override + String createdTheChat(String username) { + return '$username loi keskustelun'; + } + + @override + String get createGroup => 'Luo ryhmä'; + + @override + String get createNewSpace => 'Uusi tila'; + + @override + String get currentlyActive => 'Aktiivinen nyt'; + + @override + String get darkTheme => 'Tumma'; + + @override + String dateAndTimeOfDay(String date, String timeOfDay) { + return '$date, $timeOfDay'; + } + + @override + String dateWithoutYear(String month, String day) { + return '$day.$month'; + } + + @override + String dateWithYear(String year, String month, String day) { + return '$day.$month.$year'; + } + + @override + String get deactivateAccountWarning => + 'Tämä poistaa tunnuksesi käytöstä. Tätä ei voi kumota! Oletko varma?'; + + @override + String get defaultPermissionLevel => + 'Uusien käyttäjien oikeuksien oletustaso'; + + @override + String get delete => 'Poista'; + + @override + String get deleteAccount => 'Poista tunnus'; + + @override + String get deleteMessage => 'Poista viesti'; + + @override + String get device => 'Laite'; + + @override + String get deviceId => 'Laite-ID'; + + @override + String get devices => 'Laitteet'; + + @override + String get directChats => 'Suorat keskustelut'; + + @override + String get allRooms => 'Kaikki ryhmäkeskustelut'; + + @override + String get displaynameHasBeenChanged => 'Näyttönimi on vaihdettu'; + + @override + String get downloadFile => 'Lataa tiedosto'; + + @override + String get edit => 'Muokkaa'; + + @override + String get editBlockedServers => 'Muokkaa estettyjä palvelimia'; + + @override + String get chatPermissions => 'Keskustelun oikeudet'; + + @override + String get editDisplayname => 'Muokkaa näyttönimeä'; + + @override + String get editRoomAliases => 'Muokkaa huoneen aliaksia'; + + @override + String get editRoomAvatar => 'Muokkaa huoneen profiilikuvaa'; + + @override + String get emoteExists => 'Emote on jo olemassa!'; + + @override + String get emoteInvalid => 'Epäkelpo emote-lyhytkoodi'; + + @override + String get emoteKeyboardNoRecents => + 'Viimeaikoina käytetyt emotet tulevat näkymään täällä...'; + + @override + String get emotePacks => 'Huoneen emote-paketit'; + + @override + String get emoteSettings => 'Emote-asetukset'; + + @override + String get globalChatId => 'Global chat ID'; + + @override + String get accessAndVisibility => 'Pääsy ja näkyvyys'; + + @override + String get accessAndVisibilityDescription => + 'Who is allowed to join this chat and how the chat can be discovered.'; + + @override + String get calls => 'Calls'; + + @override + String get customEmojisAndStickers => 'Custom emojis and stickers'; + + @override + String get customEmojisAndStickersBody => + 'Add or share custom emojis or stickers which can be used in any chat.'; + + @override + String get emoteShortcode => 'Emote-lyhytkoodi'; + + @override + String get emoteWarnNeedToPick => 'Emote-lyhytkoodi ja kuva on valittava!'; + + @override + String get emptyChat => 'Tyhjä keskustelu'; + + @override + String get enableEmotesGlobally => 'Ota emote-paketti käyttöön kaikkialla'; + + @override + String get enableEncryption => 'Ota salaus käyttöön'; + + @override + String get enableEncryptionWarning => + 'Et voi poistaa salausta myöhemmin. Oletko varma?'; + + @override + String get encrypted => 'Salattu'; + + @override + String get encryption => 'Salaus'; + + @override + String get encryptionNotEnabled => 'Salaus ei ole käytössä'; + + @override + String endedTheCall(String senderName) { + return '$senderName päätti puhelun'; + } + + @override + String get enterAnEmailAddress => 'Syötä sähköposti-osoite'; + + @override + String get homeserver => 'Kotipalvelin'; + + @override + String get enterYourHomeserver => 'Syötä kotipalvelimesi'; + + @override + String errorObtainingLocation(String error) { + return 'Virhe paikannuksessa: $error'; + } + + @override + String get everythingReady => 'Kaikki on valmista!'; + + @override + String get extremeOffensive => 'Erittäin loukkaavaa'; + + @override + String get fileName => 'Tiedostonimi'; + + @override + String get fluffychat => 'FluffyChat'; + + @override + String get fontSize => 'Fonttikoko'; + + @override + String get forward => 'Edelleenlähetä'; + + @override + String get fromJoining => 'Alkaen liittymisestä'; + + @override + String get fromTheInvitation => 'Alkaen kutsumisesta'; + + @override + String get goToTheNewRoom => 'Mene uuteen huoneeseen'; + + @override + String get group => 'Ryhmä'; + + @override + String get chatDescription => 'Keskustelun kuvaus'; + + @override + String get chatDescriptionHasBeenChanged => 'Keskustelun kuvaus muutettu'; + + @override + String get groupIsPublic => 'Ryhmä on julkinen'; + + @override + String get groups => 'Ryhmät'; + + @override + String groupWith(String displayname) { + return 'Ryhmä seuralaisina $displayname'; + } + + @override + String get guestsAreForbidden => 'Vieraat on kielletty'; + + @override + String get guestsCanJoin => 'Vieraat voivat liittyä'; + + @override + String hasWithdrawnTheInvitationFor(String username, String targetName) { + return '$username on perunnut käyttäjän $targetName kutsun'; + } + + @override + String get help => 'Apua'; + + @override + String get hideRedactedEvents => 'Piilota poistetut tapahtumat'; + + @override + String get hideRedactedMessages => 'Hide redacted messages'; + + @override + String get hideRedactedMessagesBody => + 'If someone redacts a message, this message won\'t be visible in the chat anymore.'; + + @override + String get hideInvalidOrUnknownMessageFormats => + 'Hide invalid or unknown message formats'; + + @override + String get howOffensiveIsThisContent => 'Kuinka loukkaavaa tämä sisältö on?'; + + @override + String get id => 'ID'; + + @override + String get identity => 'Identiteetti'; + + @override + String get block => 'Block'; + + @override + String get blockedUsers => 'Blocked users'; + + @override + String get blockListDescription => + 'You can block users who are disturbing you. You won\'t be able to receive any messages or room invites from the users on your personal block list.'; + + @override + String get blockUsername => 'Ignore username'; + + @override + String get iHaveClickedOnLink => 'Olen klikannut linkkiä'; + + @override + String get incorrectPassphraseOrKey => + 'Virheellinen salasana tai palautusavain'; + + @override + String get inoffensive => 'Loukkaamatonta'; + + @override + String get inviteContact => 'Kutsu yhteystieto'; + + @override + String inviteContactToGroupQuestion(Object contact, Object groupName) { + return 'Tahdotko kutsua yhteystiedon $contact keskusteluun \"$groupName\"?'; + } + + @override + String inviteContactToGroup(String groupName) { + return 'Kutsu yhteystieto ryhmään $groupName'; + } + + @override + String get noChatDescriptionYet => 'Keskustelun kuvausta ei ole vielä luotu.'; + + @override + String get tryAgain => 'Yritä uudelleen'; + + @override + String get invalidServerName => 'Virheellinen palvelimen nimi'; + + @override + String get invited => 'Kutsuttu'; + + @override + String get redactMessageDescription => + 'Viesti poistetaan kaikilta keskustelun osallistujilta. Tätä ei voida kumota.'; + + @override + String get optionalRedactReason => + '(Vapaaehtoinen) Syy tämän viestin poistamiselle...'; + + @override + String invitedUser(String username, String targetName) { + return '📩 $username kutsui käyttäjän $targetName'; + } + + @override + String get invitedUsersOnly => 'Vain kutsutut käyttäjät'; + + @override + String get inviteForMe => 'Kutsu minua varten'; + + @override + String inviteText(String username, String link) { + return '$username kutsui sinut FluffyChattiin.\n1. Viereaile sivulla: https://fluffychat.im ja asenna sovellus\n2. Rekisteröidy tai kirjaudu sisään\n3. Avaa kutsulinkki:\n$link'; + } + + @override + String get isTyping => 'kirjoittaa…'; + + @override + String joinedTheChat(String username) { + return '👋 $username liittyi keskusteluun'; + } + + @override + String get joinRoom => 'Liity huoneeseen'; + + @override + String kicked(String username, String targetName) { + return '👞 $username potki käyttäjän $targetName'; + } + + @override + String kickedAndBanned(String username, String targetName) { + return '🙅 $username potki ja antoi porttikiellon käyttäjälle $targetName'; + } + + @override + String get kickFromChat => 'Potki keskustelusta'; + + @override + String lastActiveAgo(String localizedTimeShort) { + return 'Aktiivinen viimeksi: $localizedTimeShort'; + } + + @override + String get leave => 'Poistu'; + + @override + String get leftTheChat => 'Poistui keskustelusta'; + + @override + String get license => 'Lisenssi'; + + @override + String get lightTheme => 'Vaalea'; + + @override + String loadCountMoreParticipants(int count) { + return 'Lataa vielä $count osallistujaa'; + } + + @override + String get dehydrate => 'Vie istunto ja tyhjennä laite'; + + @override + String get dehydrateWarning => + 'Tätä toimenpidettä ei voi kumota.\nVarmista varmuuskopiotiedoston turvallinen tallennus.'; + + @override + String get dehydrateTor => 'TOR-käyttäjät: vie istunto'; + + @override + String get dehydrateTorLong => + 'Tor-käyttäjille suositellaan istunnon vientiä ennen ikkunan sulkemista.'; + + @override + String get hydrateTor => 'TOR-käyttäjät: tuo viety istunto'; + + @override + String get hydrateTorLong => + 'Veitkö edellisen istuntosi käyttäessäsi TORia? Tuo se nopeasti ja jatka jutustelua.'; + + @override + String get hydrate => 'Palauta varmuuskopiotiedostosta'; + + @override + String get loadingPleaseWait => 'Ladataan... Hetkinen.'; + + @override + String get loadMore => 'Lataa lisää…'; + + @override + String get locationDisabledNotice => + 'Sijaintipalvelut ovat poissa käytöstä. Otathan ne käyttöön jakaaksesi sijaintisi.'; + + @override + String get locationPermissionDeniedNotice => + 'SIjaintioikeus on estetty. Myönnäthän sen jakaaksesi sijaintisi.'; + + @override + String get login => 'Kirjaudu sisään'; + + @override + String logInTo(String homeserver) { + return 'Kirjaudu sisään palvelimelle $homeserver'; + } + + @override + String get logout => 'Kirjaudu ulos'; + + @override + String get memberChanges => 'Jäsenmuutoksia'; + + @override + String get mention => 'Mainitse'; + + @override + String get messages => 'Viestit'; + + @override + String get messagesStyle => 'Viestit:'; + + @override + String get moderator => 'Valvoja'; + + @override + String get muteChat => 'Vaienna keskustelu'; + + @override + String get needPantalaimonWarning => + 'Tiedäthän tarvitsevasi toistaiseksi Pantalaimonin käyttääksesi päästä-päähän-salausta.'; + + @override + String get newChat => 'Uusi keskustelu'; + + @override + String get newMessageInFluffyChat => '💬 Uusi viesti FluffyChätissä'; + + @override + String get newVerificationRequest => 'Uusi varmennuspyyntö!'; + + @override + String get next => 'Seuraava'; + + @override + String get no => 'Ei'; + + @override + String get noConnectionToTheServer => 'Ei yhteyttä palvelimeen'; + + @override + String get noEmotesFound => 'Emoteja ei löytynyt. 😕'; + + @override + String get noEncryptionForPublicRooms => + 'Voit ottaa salauksen käyttöön vasta kun huone ei ole julkisesti liityttävissä.'; + + @override + String get noGoogleServicesWarning => + 'Firebase Cloud Messaging -palvelu ei vaikuta olevan saatavilla laitteellasi. Saadaksesi push-ilmoituksia silti, suosittelemme Ntfy-sovelluksen asentamista. Käyttämällä Ntfy-sovellusta tai muuta Unified Push -tarjoajaa, saat push-ilmoitukset tietoturvallisella tavalla. Voit ladata Ntfy-sovelluksen Play Kaupasta tai F-Droidista.'; + + @override + String noMatrixServer(String server1, String server2) { + return '$server1 ei ole Matrix-palvelin, käytetäänkö $server2 sen sijaan?'; + } + + @override + String get shareInviteLink => 'Jaa kutsulinkki'; + + @override + String get scanQrCode => 'Skannaa QR-koodi'; + + @override + String get none => 'Ei yhtään'; + + @override + String get noPasswordRecoveryDescription => + 'Et ole vielä lisännyt tapaa salasanasi palauttamiseksi.'; + + @override + String get noPermission => 'Ei lupaa'; + + @override + String get noRoomsFound => 'Huoneita ei löytynyt…'; + + @override + String get notifications => 'Ilmoitukset'; + + @override + String get notificationsEnabledForThisAccount => + 'Tämän tunnuksen ilmoitukset ovat käytössä'; + + @override + String numUsersTyping(int count) { + return '$count käyttäjää kirjoittavat…'; + } + + @override + String get obtainingLocation => 'Paikannetaan sijantia…'; + + @override + String get offensive => 'Loukkaava'; + + @override + String get offline => 'Poissa verkosta'; + + @override + String get ok => 'ok'; + + @override + String get online => 'Linjoilla'; + + @override + String get onlineKeyBackupEnabled => 'Verkkkoavainvarmuuskopio on käytössä'; + + @override + String get oopsPushError => + 'Hups! Valitettavasti push-ilmoituksia käyttöönotettaessa tapahtui virhe.'; + + @override + String get oopsSomethingWentWrong => 'Hups, jotakin meni pieleen…'; + + @override + String get openAppToReadMessages => 'Avaa sovellus lukeaksesi viestit'; + + @override + String get openCamera => 'Avaa kamera'; + + @override + String get openVideoCamera => 'Avaa kamera videokuvausta varten'; + + @override + String get oneClientLoggedOut => 'Yksi tunnuksistasi on kirjattu ulos'; + + @override + String get addAccount => 'Lisää tili'; + + @override + String get editBundlesForAccount => 'Muokkaa tämän tilin kääröjä'; + + @override + String get addToBundle => 'Lisää kääreeseen'; + + @override + String get removeFromBundle => 'Poista tästä kääreestä'; + + @override + String get bundleName => 'Kääreen nimi'; + + @override + String get enableMultiAccounts => + '(BETA) Ota käyttöön tuki usealle tilille tällä laitteella'; + + @override + String get openInMaps => 'Avaa kartoissa'; + + @override + String get link => 'Linkki'; + + @override + String get serverRequiresEmail => + 'Tämän palvelimen täytyy tarkistaa sähköposti-osoitteesi rekisteröitymistä varten.'; + + @override + String get or => 'Tai'; + + @override + String get participant => 'Osallistuja'; + + @override + String get passphraseOrKey => 'salalause tai palautusavain'; + + @override + String get password => 'Salasana'; + + @override + String get passwordForgotten => 'Salasana unohtunut'; + + @override + String get passwordHasBeenChanged => 'Salasana on vaihdettu'; + + @override + String get hideMemberChangesInPublicChats => + 'Hide member changes in public chats'; + + @override + String get hideMemberChangesInPublicChatsBody => + 'Do not show in the chat timeline if someone joins or leaves a public chat to improve readability.'; + + @override + String get overview => 'Overview'; + + @override + String get notifyMeFor => 'Notify me for'; + + @override + String get passwordRecoverySettings => 'Password recovery settings'; + + @override + String get passwordRecovery => 'Salasanan palautus'; + + @override + String get people => 'Ihmiset'; + + @override + String get pickImage => 'Valitse kuva'; + + @override + String get pin => 'Kiinnitä'; + + @override + String play(String fileName) { + return 'Toista $fileName'; + } + + @override + String get pleaseChoose => 'Valitse'; + + @override + String get pleaseChooseAPasscode => 'Valitse pääsykoodi'; + + @override + String get pleaseClickOnLink => + 'Klikkaa linkkiä sähköpostissa ja sitten jatka.'; + + @override + String get pleaseEnter4Digits => + 'Syötä 4 numeroa tai jätä tyhjäksi poistaaksesi sovelluksen lukituksen.'; + + @override + String get pleaseEnterRecoveryKey => 'Syötä palautusavaimesi:'; + + @override + String get pleaseEnterYourPassword => 'Syötä salasanasi'; + + @override + String get pleaseEnterYourPin => 'Syötä PIN-koodisi'; + + @override + String get pleaseEnterYourUsername => 'Syötä käyttäjätunnuksesi'; + + @override + String get pleaseFollowInstructionsOnWeb => + 'Seuraa ohjeita verkkosivulla ja paina seuraava.'; + + @override + String get privacy => 'Yksityisyys'; + + @override + String get publicRooms => 'Julkiset huoneet'; + + @override + String get pushRules => 'Push-säännöt'; + + @override + String get reason => 'Syy'; + + @override + String get recording => 'Tallenne'; + + @override + String redactedBy(String username) { + return 'Poistanut $username'; + } + + @override + String get directChat => 'Yksityiskeskustelu'; + + @override + String redactedByBecause(String username, String reason) { + return 'Poistanut $username syystä: \"$reason\"'; + } + + @override + String redactedAnEvent(String username) { + return '$username poisti tapahtuman'; + } + + @override + String get redactMessage => 'Poista viesti'; + + @override + String get register => 'Rekisteröidy'; + + @override + String get reject => 'Hylkää'; + + @override + String rejectedTheInvitation(String username) { + return '$username hylkäsi kutsun'; + } + + @override + String get rejoin => 'Liity uudelleen'; + + @override + String get removeAllOtherDevices => 'Poista kaikki muut laitteet'; + + @override + String removedBy(String username) { + return 'Poistanut $username'; + } + + @override + String get removeDevice => 'Poista laite'; + + @override + String get unbanFromChat => 'Poista porttikielto keskusteluun'; + + @override + String get removeYourAvatar => 'Poista profiilikuvasi'; + + @override + String get replaceRoomWithNewerVersion => 'Korvaa huone uudemmalla versiolla'; + + @override + String get reply => 'Vastaa'; + + @override + String get reportMessage => 'Ilmoita viesti'; + + @override + String get translateMessage => 'Translate message'; + + @override + String get translatedMessage => 'Translated message'; + + @override + String get errorTranslatingMessage => + 'An error has occured while translating the message.'; + + @override + String get recoverMessage => 'Recover message'; + + @override + String get recoveredMessage => 'Recovered message'; + + @override + String get errorRecoveringMessage => + 'An error has occured while recovering the message.'; + + @override + String get errorRecoveringMessageNoAdmin => + 'This feature is available on Synapse homeservers only for adminstrators.'; + + @override + String get requestPermission => 'Pyydä lupaa'; + + @override + String get roomHasBeenUpgraded => 'Huone on päivitetty'; + + @override + String get roomVersion => 'Huoneen versio'; + + @override + String get saveFile => 'Tallenna tiedosto'; + + @override + String get retry => 'Retry'; + + @override + String get search => 'Hae'; + + @override + String get security => 'Turvallisuus'; + + @override + String get recoveryKey => 'Palautusavain'; + + @override + String get recoveryKeyLost => 'Kadonnut palautusavain?'; + + @override + String seenByUser(String username) { + return 'Nähnyt $username'; + } + + @override + String get send => 'Lähetä'; + + @override + String get sendAMessage => 'Lähetä viesti'; + + @override + String get sendAsText => 'Lähetä tekstinä'; + + @override + String get sendAudio => 'Lähetä ääniviesti'; + + @override + String get sendFile => 'Lähetä tiedosto'; + + @override + String get sendImage => 'Lähetä kuva'; + + @override + String sendImages(int count) { + return 'Send $count image'; + } + + @override + String get sendMessages => 'Lähetä viestejä'; + + @override + String get sendOriginal => 'Lähetä alkuperäinen'; + + @override + String get sendSticker => 'Lähetä tarra'; + + @override + String get sendVideo => 'Lähetä video'; + + @override + String sentAFile(String username) { + return '📁 $username lähetti tiedoston'; + } + + @override + String sentAnAudio(String username) { + return '🎤 $username lähetti ääniviestin'; + } + + @override + String sentAPicture(String username) { + return '🖼️ $username lähetti kuvan'; + } + + @override + String sentASticker(String username) { + return '😊 $username lähetti tarran'; + } + + @override + String sentAVideo(String username) { + return '🎥 $username lähetti videon'; + } + + @override + String sentCallInformations(String senderName) { + return '$senderName lähetti puhelutiedot'; + } + + @override + String get separateChatTypes => 'Erota yksityiskeskustelut ryhmistä'; + + @override + String get setAsCanonicalAlias => 'Aseta pääalias'; + + @override + String get setCustomEmotes => 'Aseta mukautetut emotet'; + + @override + String get setChatDescription => 'Asetti keskustelun kuvauksen'; + + @override + String get setInvitationLink => 'Aseta kutsulinkki'; + + @override + String get setPermissionsLevel => 'Aseta oikeustasot'; + + @override + String get setStatus => 'Aseta tila'; + + @override + String get settings => 'Asetukset'; + + @override + String get share => 'Jaa'; + + @override + String sharedTheLocation(String username) { + return '$username jakoi sijaintinsa'; + } + + @override + String get shareLocation => 'Jaa sijainti'; + + @override + String get showPassword => 'Näytä salasana'; + + @override + String get presenceStyle => 'Presence:'; + + @override + String get hideAvatarsInInvites => 'Hide avatars in invites'; + + @override + String get hideAvatarsInInvitesDescription => + 'Do not show room avatars in invites'; + + @override + String get presencesToggle => 'Show status messages from other users'; + + @override + String get pureBlackToggle => 'Pure Black'; + + @override + String get singlesignon => 'Kertakirjautuminen'; + + @override + String get skip => 'Ohita'; + + @override + String get sourceCode => 'Lähdekoodi'; + + @override + String get spaceIsPublic => 'Tila on julkinen'; + + @override + String get spaceName => 'Tilan nimi'; + + @override + String startedACall(String senderName) { + return '$senderName aloitti puhelun'; + } + + @override + String get startFirstChat => 'Aloita ensimmäinen keskustelusi'; + + @override + String get status => 'Tila'; + + @override + String get statusExampleMessage => 'Millainen on vointisi?'; + + @override + String get submit => 'Lähetä'; + + @override + String get synchronizingPleaseWait => 'Synkronoidaan... Hetkinen.'; + + @override + String synchronizingPleaseWaitCounter(String percentage) { + return ' Synchronizing… ($percentage%)'; + } + + @override + String get systemTheme => 'Järjestelmä'; + + @override + String get theyDontMatch => 'Ne eivät täsmää'; + + @override + String get theyMatch => 'Ne täsmäävät'; + + @override + String get title => 'FluffyChat'; + + @override + String get toggleFavorite => 'Suosikki-kytkin'; + + @override + String get toggleMuted => 'Mykistetty-kytkin'; + + @override + String get toggleUnread => 'Merkitse lukemattomaksi/luetuksi'; + + @override + String get tooManyRequestsWarning => + 'Liikaa pyyntöjä. Yritä myöhemmin uudelleen!'; + + @override + String get transferFromAnotherDevice => 'Siirrä toiselta laitteelta'; + + @override + String get tryToSendAgain => 'Yritä uudelleenlähettämistä'; + + @override + String get unavailable => 'Ei saatavilla'; + + @override + String unbannedUser(String username, String targetName) { + return '$username poisti käyttäjän $targetName porttikiellon'; + } + + @override + String get unblockDevice => 'Poista laitteen esto'; + + @override + String get unknownDevice => 'Tuntematon laite'; + + @override + String get unknownEncryptionAlgorithm => 'Tuntematon salausalgoritmi'; + + @override + String unknownEvent(String type) { + return 'Tuntematon tapahtuma \'$type\''; + } + + @override + String get unmuteChat => 'Poista keskustelun mykistys'; + + @override + String get unpin => 'Poista kiinnitys'; + + @override + String unreadChats(int unreadCount) { + String _temp0 = intl.Intl.pluralLogic( + unreadCount, + locale: localeName, + other: '$unreadCount lukematonta keskustelua', + one: '1 lukematon keskustelu', + ); + return '$_temp0'; + } + + @override + String userAndOthersAreTyping(String username, int count) { + return '$username ja $count muuta kirjoittavat…'; + } + + @override + String userAndUserAreTyping(String username, String username2) { + return '$username ja $username2 kirjoittavat…'; + } + + @override + String userIsTyping(String username) { + return '$username kirjoittaa…'; + } + + @override + String userLeftTheChat(String username) { + return '🚪 $username poistui keskustelusta'; + } + + @override + String get username => 'Käyttäjätunnus'; + + @override + String userSentUnknownEvent(String username, String type) { + return '$username lähetti $type-tapahtuman'; + } + + @override + String get unverified => 'Varmistamaton'; + + @override + String get verified => 'Varmistettu'; + + @override + String get verify => 'Varmista'; + + @override + String get verifyStart => 'Aloita varmennus'; + + @override + String get verifySuccess => 'Varmensit onnistuneesti!'; + + @override + String get verifyTitle => 'Varmistetaan toista tunnusta'; + + @override + String get videoCall => 'Videopuhelu'; + + @override + String get visibilityOfTheChatHistory => 'Keskusteluhistorian näkyvyys'; + + @override + String get visibleForAllParticipants => 'Näkyy kaikille osallistujille'; + + @override + String get visibleForEveryone => 'Näkyy kaikille'; + + @override + String get voiceMessage => 'Ääniviesti'; + + @override + String get waitingPartnerAcceptRequest => + 'Odotetaan kumppanin varmistavan pyynnön…'; + + @override + String get waitingPartnerEmoji => 'Odotetaan kumppanin hyväksyvän emojit…'; + + @override + String get waitingPartnerNumbers => 'Odotetaan kumppanin hyväksyvän numerot…'; + + @override + String get wallpaper => 'Taustakuva:'; + + @override + String get warning => 'Varoitus!'; + + @override + String get weSentYouAnEmail => 'Lähetimme sinulle sähköpostia'; + + @override + String get whoCanPerformWhichAction => + 'Kuka voi suorittaa minkä toimenpiteen'; + + @override + String get whoIsAllowedToJoinThisGroup => + 'Kenen on sallittua liittyä ryhmään'; + + @override + String get whyDoYouWantToReportThis => 'Miksi haluat ilmoittaa tämän?'; + + @override + String get wipeChatBackup => + 'Pyyhi keskusteluvarmuuskopio luodaksesi uuden palautusavaimen?'; + + @override + String get withTheseAddressesRecoveryDescription => + 'Näillä osoitteilla voit palauttaa salasanasi.'; + + @override + String get writeAMessage => 'Kirjoita viesti…'; + + @override + String get yes => 'Kyllä'; + + @override + String get you => 'Sinä'; + + @override + String get youAreNoLongerParticipatingInThisChat => + 'Et enää osallistu tähän keskusteluun'; + + @override + String get youHaveBeenBannedFromThisChat => + 'Sinulle on annettu porttikielto tähän keskusteluun'; + + @override + String get yourPublicKey => 'Julkinen avaimesi'; + + @override + String get messageInfo => 'Viestin tiedot'; + + @override + String get time => 'Aika'; + + @override + String get messageType => 'Viestin tyyppi'; + + @override + String get sender => 'Lähettäjä'; + + @override + String get openGallery => 'Avaa galleria'; + + @override + String get removeFromSpace => 'Poista tilasta'; + + @override + String get addToSpaceDescription => + 'Valitse tila, johon tämä keskustelu lisätään.'; + + @override + String get start => 'Aloita'; + + @override + String get pleaseEnterRecoveryKeyDescription => + 'Avataksesi vanhojen viestiesi salauksen, syötä palautusavaimesi, joka luotiin edellisessä istunnossa. Palautusavaimesi EI OLE salasanasi.'; + + @override + String get publish => 'Julkaise'; + + @override + String videoWithSize(String size) { + return 'Video ($size)'; + } + + @override + String get openChat => 'Avaa Keskustelu'; + + @override + String get markAsRead => 'Merkitse luetuksi'; + + @override + String get reportUser => 'Ilmianna käyttäjä'; + + @override + String get dismiss => 'Hylkää'; + + @override + String reactedWith(String sender, String reaction) { + return '$sender reagoi $reaction'; + } + + @override + String get pinMessage => 'Kiinnitä huoneeseen'; + + @override + String get confirmEventUnpin => + 'Haluatko varmasti irrottaa tapahtuman pysyvästi?'; + + @override + String get emojis => 'Hymiöt'; + + @override + String get placeCall => 'Soita'; + + @override + String get voiceCall => 'Äänipuhelu'; + + @override + String get unsupportedAndroidVersion => 'Ei tuettu Android-versio'; + + @override + String get unsupportedAndroidVersionLong => + 'Tämä ominaisuus vaatii uudemman Android-version. Tarkista päivitykset tai LineageOS-tuki.'; + + @override + String get videoCallsBetaWarning => + 'Huomaathan videopuheluiden ovan beta-asteella. Ne eivät ehkä toimi odotetusti tai toimi ollenkaan kaikilla alustoilla.'; + + @override + String get experimentalVideoCalls => 'Kokeelliset videopuhelut'; + + @override + String get emailOrUsername => 'Sähköposti-osoite tai käyttäjätunnus'; + + @override + String get indexedDbErrorTitle => 'Yksityisen selauksen ongelmat'; + + @override + String get indexedDbErrorLong => + 'Viestivarasto ei ole käytössä yksityisselauksessa oletuksena.\nKäythän osoitteessa\n - about:config\n - Aseta dom.indexedDB.privateBrowsing.enabled arvoon true\nMuuten FluffyChatin käyttäminen ei ole mahdollista.'; + + @override + String switchToAccount(String number) { + return 'Siirry tilille $number'; + } + + @override + String get nextAccount => 'Seuraava tili'; + + @override + String get previousAccount => 'Edellinen tili'; + + @override + String get addWidget => 'Lisää pienoissovellus'; + + @override + String get widgetVideo => 'Video'; + + @override + String get widgetEtherpad => 'Tekstimuotoinen muistiinpano'; + + @override + String get widgetJitsi => 'Jitsi Meet'; + + @override + String get widgetCustom => 'Mukautettu'; + + @override + String get widgetName => 'Nimi'; + + @override + String get widgetUrlError => 'Epäkelvollinen URL.'; + + @override + String get widgetNameError => 'Syötä näyttönimi.'; + + @override + String get errorAddingWidget => 'Virhe lisättäessä pienoissovellusta.'; + + @override + String get youRejectedTheInvitation => 'Kieltäydyit kutsusta'; + + @override + String get youJoinedTheChat => 'Liityit keskusteluun'; + + @override + String get youAcceptedTheInvitation => '👍 Hyväksyit kutsun'; + + @override + String youBannedUser(String user) { + return 'Annoit porttikiellon käyttäjälle $user'; + } + + @override + String youHaveWithdrawnTheInvitationFor(String user) { + return 'Olet perunut kutsun käyttäjälle $user'; + } + + @override + String youInvitedToBy(String alias) { + return '📩 You have been invited via link to:\n$alias'; + } + + @override + String youInvitedBy(String user) { + return '📩 $user kutsui sinut'; + } + + @override + String invitedBy(String user) { + return '📩 Invited by $user'; + } + + @override + String youInvitedUser(String user) { + return '📩 Kutsuit käyttäjän $user'; + } + + @override + String youKicked(String user) { + return '👞 Potkit käyttäjän $user keskustelusta'; + } + + @override + String youKickedAndBanned(String user) { + return '🙅 Potkit ja annoit porttikiellon käyttäjälle $user'; + } + + @override + String youUnbannedUser(String user) { + return 'Poistit käyttäjän $user porttikiellon'; + } + + @override + String hasKnocked(String user) { + return '🚪 $user on koputtanut'; + } + + @override + String get usersMustKnock => 'Users must knock'; + + @override + String get noOneCanJoin => 'No one can join'; + + @override + String userWouldLikeToChangeTheChat(String user) { + return '$user would like to join the chat.'; + } + + @override + String get noPublicLinkHasBeenCreatedYet => + 'No public link has been created yet'; + + @override + String get knock => 'Knock'; + + @override + String get users => 'Käyttäjät'; + + @override + String get unlockOldMessages => 'Pura vanhojen viestien salaus'; + + @override + String get storeInSecureStorageDescription => + 'Tallenna palautusavain tämän laitteen turvavarastoon.'; + + @override + String get saveKeyManuallyDescription => + 'Tallenna tämä avain manuaalisesti käyttäen järjestelmän jakodialogia tai leikepöytää.'; + + @override + String get storeInAndroidKeystore => 'Tallenna Android KeyStoreen'; + + @override + String get storeInAppleKeyChain => 'Tallenna Applen avainnippuun'; + + @override + String get storeSecurlyOnThisDevice => + 'Tallenna turvallisesti tälle laitteelle'; + + @override + String countFiles(int count) { + return '$count tiedostoa'; + } + + @override + String get user => 'Käyttäjä'; + + @override + String get custom => 'Mukautettu'; + + @override + String get foregroundServiceRunning => + 'Tämä ilmoitus näkyy etualapalvelun ollessa käynnissä.'; + + @override + String get screenSharingTitle => 'ruudunjako'; + + @override + String get screenSharingDetail => 'Jaat ruutuasi FluffyChatissä'; + + @override + String get callingPermissions => 'Puheluoikeudet'; + + @override + String get callingAccount => 'Soittamistunnus'; + + @override + String get callingAccountDetails => + 'Sallii FluffyChatin käyttää Androidin omaa Puhelut-sovellusta.'; + + @override + String get appearOnTop => 'Näy päällä'; + + @override + String get appearOnTopDetails => + 'Sallii sovelluksen näkyä muiden sovellusten päällä (tätä ei tarvita, mikäli olet jo määrittänyt FluffyChatin puhelin-tunnukseksi)'; + + @override + String get otherCallingPermissions => + 'Mikrofoni, kamera ja muut FluffyChatin oikeudet'; + + @override + String get whyIsThisMessageEncrypted => 'Miksei tätä viestiä voida lukea?'; + + @override + String get noKeyForThisMessage => + 'Tämä voi tapahtua mikäli viesti lähetettiin ennen sisäänkirjautumistasi tälle laitteelle.\n\nOn myös mahdollista, että lähettäjä on estänyt tämän laitteen tai jokin meni pieleen verkkoyhteyden kanssa.\n\nPystytkö lukemaan viestin toisella istunnolla? Siinä tapauksessa voit siirtää viestin siltä! Mene Asetukset > Laitteet ja varmista, että laitteesi ovat varmistaneet toisensa. Seuraavankerran avatessasi huoneen ja molempien istuntojen ollessa etualalla, avaimet siirretään automaattisesti.\n\nHaluatko varmistaa ettet menetä avaimia uloskirjautuessa tai laitteita vaihtaessa? Varmista avainvarmuuskopion käytössäolo asetuksista.'; + + @override + String get newGroup => 'Uusi ryhmä'; + + @override + String get newSpace => 'Uusi tila'; + + @override + String get enterSpace => 'Siirry tilaan'; + + @override + String get enterRoom => 'Siirry huoneeseen'; + + @override + String get allSpaces => 'Kaikki tilat'; + + @override + String numChats(String number) { + return '$number keskustelua'; + } + + @override + String get hideUnimportantStateEvents => + 'Piilota ei-niin-tärkeät tilatapahtumat'; + + @override + String get hidePresences => 'Hide Status List?'; + + @override + String get doNotShowAgain => 'Älä näytä uudelleen'; + + @override + String wasDirectChatDisplayName(String oldDisplayName) { + return 'Tyhjä keskustelu (oli $oldDisplayName)'; + } + + @override + String get newSpaceDescription => + 'Tilat mahdollistavat keskusteluidesi keräämisen ja yksityisten tai julkisten yhteisöjen rakentamisen.'; + + @override + String get encryptThisChat => 'Salaa tämä keskustelu'; + + @override + String get disableEncryptionWarning => + 'Turvallisuuden vuoksi et voi poistaa salausta käytöstä huoneista, joissa se on aiemmin otettu käyttöön.'; + + @override + String get sorryThatsNotPossible => 'Anteeksi... se ei ole mahdollista'; + + @override + String get deviceKeys => 'Laite-avaimet:'; + + @override + String get reopenChat => 'Avaa keskustelu uudelleen'; + + @override + String get noBackupWarning => + 'Varoitus! Ilman avainvarmuuskopion käyttöönottoa menetät pääsyn salattuihin viesteihisi. Suosittelemme ehdottomasti avainvarmuuskopion käyttöönottoa ennen uloskirjautumista.'; + + @override + String get noOtherDevicesFound => 'Muita laitteita ei löytynyt'; + + @override + String fileIsTooBigForServer(String max) { + return 'Ei voi lähettää! Palvelin tukee liitetiedostoja vain enintään $max.'; + } + + @override + String fileHasBeenSavedAt(String path) { + return 'Tiedosto on tallennettu sijaintiin $path'; + } + + @override + String get jumpToLastReadMessage => 'Hyppää viimeiseen luettuun viestiin'; + + @override + String get readUpToHere => 'Luettu tähän asti'; + + @override + String get jump => 'Hyppää'; + + @override + String get openLinkInBrowser => 'Avaa linkki selaimessa'; + + @override + String get reportErrorDescription => + '😭 Voi ei. Jokin meni pieleen. Halutessasi voit ilmoittaa ongelman kehittäjille.'; + + @override + String get report => 'ilmoita'; + + @override + String get signInWithPassword => 'Kirjaudu sisään salasanalla'; + + @override + String get pleaseTryAgainLaterOrChooseDifferentServer => + 'Yritä myöhemmin uudelleen tai valitse toinen palvelin.'; + + @override + String signInWith(String provider) { + return 'Kirjaudu sisään palvelulla $provider'; + } + + @override + String get profileNotFound => + 'Käyttäjää ei löydy palvelimelta. Tämä voi olla yhteysongelma tai käyttäjä ei ole olemassa.'; + + @override + String get setTheme => 'Aseta teema:'; + + @override + String get setColorTheme => 'Aseta väriteema:'; + + @override + String get invite => 'Kutsu'; + + @override + String get inviteGroupChat => 'Kutsu ryhmäkeskusteluun'; + + @override + String get invitePrivateChat => 'Kutsu yksityiskeskusteluun'; + + @override + String get invalidInput => 'Virheellinen syöte!'; + + @override + String wrongPinEntered(int seconds) { + return 'Väärä pin-koodi! Yritä uudelleen $seconds sekuntin kuluttua...'; + } + + @override + String get pleaseEnterANumber => 'Syötä suurempi luku kuin 0'; + + @override + String get archiveRoomDescription => + 'Keskustelu siirretään arkistoon. Muut käyttäjät näkevät sinun poistuneen keskustelusta.'; + + @override + String get roomUpgradeDescription => + 'Keskustelu luodaan uudelleen uudella huoneversiolla. Kaikille osallistujille ilmoitetaan, että heidän tulee siirtyä uuteen keskusteluun. Voit lukea lisää huoneversioista osoitteesta https://spec.matrix.org/latest/rooms/'; + + @override + String get removeDevicesDescription => + 'You will be logged out of this device and will no longer be able to receive messages.'; + + @override + String get banUserDescription => + 'The user will be banned from the chat and will not be able to enter the chat again until they are unbanned.'; + + @override + String get unbanUserDescription => + 'The user will be able to enter the chat again if they try.'; + + @override + String get kickUserDescription => + 'The user is kicked out of the chat but not banned. In public chats, the user can rejoin at any time.'; + + @override + String get makeAdminDescription => + 'Once you make this user admin, you may not be able to undo this as they will then have the same permissions as you.'; + + @override + String get pushNotificationsNotAvailable => + 'Push notifications not available'; + + @override + String get learnMore => 'Learn more'; + + @override + String get yourGlobalUserIdIs => 'Your global user-ID is: '; + + @override + String noUsersFoundWithQuery(String query) { + return 'Unfortunately no user could be found with \"$query\". Please check whether you made a typo.'; + } + + @override + String get knocking => 'Knocking'; + + @override + String chatCanBeDiscoveredViaSearchOnServer(String server) { + return 'Chat can be discovered via the search on $server'; + } + + @override + String get searchChatsRooms => 'Search for #chats, @users...'; + + @override + String get nothingFound => 'Nothing found...'; + + @override + String get groupName => 'Group name'; + + @override + String get createGroupAndInviteUsers => 'Create a group and invite users'; + + @override + String get groupCanBeFoundViaSearch => 'Group can be found via search'; + + @override + String get wrongRecoveryKey => + 'Sorry... this does not seem to be the correct recovery key.'; + + @override + String get startConversation => 'Start conversation'; + + @override + String get commandHint_sendraw => 'Send raw json'; + + @override + String get databaseMigrationTitle => 'Database is optimized'; + + @override + String get databaseMigrationBody => 'Please wait. This may take a moment.'; + + @override + String get leaveEmptyToClearStatus => 'Leave empty to clear your status.'; + + @override + String get select => 'Select'; + + @override + String get searchForUsers => 'Search for @users...'; + + @override + String get pleaseEnterYourCurrentPassword => + 'Please enter your current password'; + + @override + String get newPassword => 'New password'; + + @override + String get pleaseChooseAStrongPassword => 'Please choose a strong password'; + + @override + String get passwordsDoNotMatch => 'Passwords do not match'; + + @override + String get passwordIsWrong => 'Your entered password is wrong'; + + @override + String get publicLink => 'Public link'; + + @override + String get publicChatAddresses => 'Public chat addresses'; + + @override + String get createNewAddress => 'Create new address'; + + @override + String get joinSpace => 'Join space'; + + @override + String get publicSpaces => 'Public spaces'; + + @override + String get addChatOrSubSpace => 'Add chat or sub space'; + + @override + String get subspace => 'Subspace'; + + @override + String get decline => 'Decline'; + + @override + String get thisDevice => 'This device:'; + + @override + String get initAppError => 'An error occured while init the app'; + + @override + String get userRole => 'User role'; + + @override + String minimumPowerLevel(String level) { + return '$level is the minimum power level.'; + } + + @override + String searchIn(String chat) { + return 'Search in chat \"$chat\"...'; + } + + @override + String get searchMore => 'Search more...'; + + @override + String get gallery => 'Gallery'; + + @override + String get files => 'Files'; + + @override + String databaseBuildErrorBody(String url, String error) { + return 'Unable to build the SQlite database. The app tries to use the legacy database for now. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String sessionLostBody(String url, String error) { + return 'Your session is lost. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String restoreSessionBody(String url, String error) { + return 'The app now tries to restore your session from the backup. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String forwardMessageTo(String roomName) { + return 'Forward message to $roomName?'; + } + + @override + String get sendReadReceipts => 'Send read receipts'; + + @override + String get sendTypingNotificationsDescription => + 'Other participants in a chat can see when you are typing a new message.'; + + @override + String get sendReadReceiptsDescription => + 'Other participants in a chat can see when you have read a message.'; + + @override + String get formattedMessages => 'Formatted messages'; + + @override + String get formattedMessagesDescription => + 'Display rich message content like bold text using markdown.'; + + @override + String get verifyOtherUser => '🔐 Verify other user'; + + @override + String get verifyOtherUserDescription => + 'If you verify another user, you can be sure that you know who you are really writing to. 💪\n\nWhen you start a verification, you and the other user will see a popup in the app. There you will then see a series of emojis or numbers that you have to compare with each other.\n\nThe best way to do this is to meet up or start a video call. 👭'; + + @override + String get verifyOtherDevice => '🔐 Verify other device'; + + @override + String get verifyOtherDeviceDescription => + 'When you verify another device, those devices can exchange keys, increasing your overall security. 💪 When you start a verification, a popup will appear in the app on both devices. There you will then see a series of emojis or numbers that you have to compare with each other. It\'s best to have both devices handy before you start the verification. 🤳'; + + @override + String acceptedKeyVerification(String sender) { + return '$sender accepted key verification'; + } + + @override + String canceledKeyVerification(String sender) { + return '$sender canceled key verification'; + } + + @override + String completedKeyVerification(String sender) { + return '$sender completed key verification'; + } + + @override + String isReadyForKeyVerification(String sender) { + return '$sender is ready for key verification'; + } + + @override + String requestedKeyVerification(String sender) { + return '$sender requested key verification'; + } + + @override + String startedKeyVerification(String sender) { + return '$sender started key verification'; + } + + @override + String get transparent => 'Transparent'; + + @override + String get incomingMessages => 'Incoming messages'; + + @override + String get stickers => 'Stickers'; + + @override + String get discover => 'Discover'; + + @override + String get commandHint_ignore => 'Ignore the given matrix ID'; + + @override + String get commandHint_unignore => 'Unignore the given matrix ID'; + + @override + String unreadChatsInApp(String appname, String unread) { + return '$appname: $unread unread chats'; + } + + @override + String get noDatabaseEncryption => + 'Database encryption is not supported on this platform'; + + @override + String thereAreCountUsersBlocked(Object count) { + return 'Right now there are $count users blocked.'; + } + + @override + String get restricted => 'Restricted'; + + @override + String get knockRestricted => 'Knock restricted'; + + @override + String goToSpace(Object space) { + return 'Go to space: $space'; + } + + @override + String get markAsUnread => 'Mark as unread'; + + @override + String userLevel(int level) { + return '$level - User'; + } + + @override + String moderatorLevel(int level) { + return '$level - Moderator'; + } + + @override + String adminLevel(int level) { + return '$level - Admin'; + } + + @override + String get changeGeneralChatSettings => 'Change general chat settings'; + + @override + String get inviteOtherUsers => 'Invite other users to this chat'; + + @override + String get changeTheChatPermissions => 'Change the chat permissions'; + + @override + String get changeTheVisibilityOfChatHistory => + 'Change the visibility of the chat history'; + + @override + String get changeTheCanonicalRoomAlias => + 'Change the main public chat address'; + + @override + String get sendRoomNotifications => 'Send a @room notifications'; + + @override + String get changeTheDescriptionOfTheGroup => + 'Change the description of the chat'; + + @override + String get chatPermissionsDescription => + 'Define which power level is necessary for certain actions in this chat. The power levels 0, 50 and 100 are usually representing users, moderators and admins, but any gradation is possible.'; + + @override + String updateInstalled(String version) { + return '🎉 Update $version installed!'; + } + + @override + String get changelog => 'Changelog'; + + @override + String get sendCanceled => 'Sending canceled'; + + @override + String get loginWithMatrixId => 'Login with Matrix-ID'; + + @override + String get discoverHomeservers => 'Discover homeservers'; + + @override + String get whatIsAHomeserver => 'What is a homeserver?'; + + @override + String get homeserverDescription => + 'All your data is stored on the homeserver, just like an email provider. You can choose which homeserver you want to use, while you can still communicate with everyone. Learn more at at https://matrix.org.'; + + @override + String get doesNotSeemToBeAValidHomeserver => + 'Doesn\'t seem to be a compatible homeserver. Wrong URL?'; + + @override + String get calculatingFileSize => 'Calculating file size...'; + + @override + String get prepareSendingAttachment => 'Prepare sending attachment...'; + + @override + String get sendingAttachment => 'Sending attachment...'; + + @override + String get generatingVideoThumbnail => 'Generating video thumbnail...'; + + @override + String get compressVideo => 'Compressing video...'; + + @override + String sendingAttachmentCountOfCount(int index, int length) { + return 'Sending attachment $index of $length...'; + } + + @override + String serverLimitReached(int seconds) { + return 'Server limit reached! Waiting $seconds seconds...'; + } + + @override + String get oneOfYourDevicesIsNotVerified => + 'One of your devices is not verified'; + + @override + String get noticeChatBackupDeviceVerification => + 'Note: When you connect all your devices to the chat backup, they are automatically verified.'; + + @override + String get continueText => 'Continue'; + + @override + String get welcomeText => + 'Hey Hey 👋 This is Extera. You can sign in to any homeserver, which is compatible with https://matrix.org. And then chat with anyone. It\'s a huge decentralized messaging network!'; + + @override + String get blur => 'Blur:'; + + @override + String get opacity => 'Opacity:'; + + @override + String get setWallpaper => 'Set wallpaper'; + + @override + String get manageAccount => 'Manage account'; + + @override + String get noContactInformationProvided => + 'Server does not provide any valid contact information'; + + @override + String get contactServerAdmin => 'Contact server admin'; + + @override + String get contactServerSecurity => 'Contact server security'; + + @override + String get supportPage => 'Support page'; + + @override + String get serverInformation => 'Server information:'; + + @override + String get name => 'Name'; + + @override + String get version => 'Version'; + + @override + String get website => 'Website'; + + @override + String get compress => 'Compress'; + + @override + String get boldText => 'Bold text'; + + @override + String get italicText => 'Italic text'; + + @override + String get strikeThrough => 'Strikethrough'; + + @override + String get pleaseFillOut => 'Please fill out'; + + @override + String get invalidUrl => 'Invalid url'; + + @override + String get addLink => 'Add link'; + + @override + String get unableToJoinChat => + 'Unable to join chat. Maybe the other party has already closed the conversation.'; + + @override + String get previous => 'Previous'; + + @override + String get otherPartyNotLoggedIn => + 'The other party is currently not logged in and therefore cannot receive messages!'; + + @override + String appWantsToUseForLogin(String server) { + return 'Use \'$server\' to log in'; + } + + @override + String get appWantsToUseForLoginDescription => + 'You hereby allow the app and website to share information about you.'; + + @override + String get open => 'Open'; + + @override + String get waitingForServer => 'Waiting for server...'; + + @override + String get appIntroduction => + 'Extera lets you chat with your friends across different messengers. Learn more at https://matrix.org or just tap *Continue*.'; + + @override + String get newChatRequest => '📩 New chat request'; + + @override + String get contentNotificationSettings => 'Content notification settings'; + + @override + String get generalNotificationSettings => 'General notification settings'; + + @override + String get roomNotificationSettings => 'Room notification settings'; + + @override + String get userSpecificNotificationSettings => + 'User specific notification settings'; + + @override + String get otherNotificationSettings => 'Other notification settings'; + + @override + String get notificationRuleContainsUserName => 'Contains User Name'; + + @override + String get notificationRuleContainsUserNameDescription => + 'Notifies the user when a message contains their username.'; + + @override + String get notificationRuleMaster => 'Mute all notifications'; + + @override + String get notificationRuleMasterDescription => + 'Overrides all other rules and disables all notifications.'; + + @override + String get notificationRuleSuppressNotices => 'Suppress Automated Messages'; + + @override + String get notificationRuleSuppressNoticesDescription => + 'Suppresses notifications from automated clients like bots.'; + + @override + String get notificationRuleInviteForMe => 'Invite for Me'; + + @override + String get notificationRuleInviteForMeDescription => + 'Notifies the user when they are invited to a room.'; + + @override + String get notificationRuleMemberEvent => 'Member Event'; + + @override + String get notificationRuleMemberEventDescription => + 'Suppresses notifications for membership events.'; + + @override + String get notificationRuleIsUserMention => 'User Mention'; + + @override + String get notificationRuleIsUserMentionDescription => + 'Notifies the user when they are directly mentioned in a message.'; + + @override + String get notificationRuleContainsDisplayName => 'Contains Display Name'; + + @override + String get notificationRuleContainsDisplayNameDescription => + 'Notifies the user when a message contains their display name.'; + + @override + String get notificationRuleIsRoomMention => 'Room Mention'; + + @override + String get notificationRuleIsRoomMentionDescription => + 'Notifies the user when there is a room mention.'; + + @override + String get notificationRuleRoomnotif => 'Room Notification'; + + @override + String get notificationRuleRoomnotifDescription => + 'Notifies the user when a message contains \'@room\'.'; + + @override + String get notificationRuleTombstone => 'Tombstone'; + + @override + String get notificationRuleTombstoneDescription => + 'Notifies the user about room deactivation messages.'; + + @override + String get notificationRuleReaction => 'Reaction'; + + @override + String get notificationRuleReactionDescription => + 'Suppresses notifications for reactions.'; + + @override + String get notificationRuleRoomServerAcl => 'Room Server ACL'; + + @override + String get notificationRuleRoomServerAclDescription => + 'Suppresses notifications for room server access control lists (ACL).'; + + @override + String get notificationRuleSuppressEdits => 'Suppress Edits'; + + @override + String get notificationRuleSuppressEditsDescription => + 'Suppresses notifications for edited messages.'; + + @override + String get notificationRuleCall => 'Call'; + + @override + String get notificationRuleCallDescription => + 'Notifies the user about calls.'; + + @override + String get notificationRuleEncryptedRoomOneToOne => + 'Encrypted Room One-to-One'; + + @override + String get notificationRuleEncryptedRoomOneToOneDescription => + 'Notifies the user about messages in encrypted one-to-one rooms.'; + + @override + String get notificationRuleRoomOneToOne => 'Room One-to-One'; + + @override + String get notificationRuleRoomOneToOneDescription => + 'Notifies the user about messages in one-to-one rooms.'; + + @override + String get notificationRuleMessage => 'Message'; + + @override + String get notificationRuleMessageDescription => + 'Notifies the user about general messages.'; + + @override + String get notificationRuleEncrypted => 'Encrypted'; + + @override + String get notificationRuleEncryptedDescription => + 'Notifies the user about messages in encrypted rooms.'; + + @override + String get notificationRuleJitsi => 'Jitsi'; + + @override + String get notificationRuleJitsiDescription => + 'Notifies the user about Jitsi widget events.'; + + @override + String get notificationRuleServerAcl => 'Suppress Server ACL Events'; + + @override + String get notificationRuleServerAclDescription => + 'Suppresses notifications for Server ACL events.'; + + @override + String unknownPushRule(String rule) { + return 'Unknown push rule \'$rule\''; + } + + @override + String get deletePushRuleCanNotBeUndone => + 'If you delete this notification setting, this can not be undone.'; + + @override + String get more => 'More'; + + @override + String get shareKeysWith => 'Share keys with...'; + + @override + String get shareKeysWithDescription => + 'Which devices should be trusted so that they can read along your messages in encrypted chats?'; + + @override + String get allDevices => 'All devices'; + + @override + String get crossVerifiedDevicesIfEnabled => + 'Cross verified devices if enabled'; + + @override + String get crossVerifiedDevices => 'Cross verified devices'; + + @override + String get verifiedDevicesOnly => 'Verified devices only'; + + @override + String get takeAPhoto => 'Take a photo'; + + @override + String get recordAVideo => 'Record a video'; + + @override + String get optionalMessage => '(Optional) message...'; + + @override + String get notSupportedOnThisDevice => 'Not supported on this device'; + + @override + String get enterNewChat => 'Enter new chat'; + + @override + String get approve => 'Approve'; + + @override + String get youHaveKnocked => 'You have knocked'; + + @override + String get pleaseWaitUntilInvited => + 'Please wait now, until someone from the room invites you.'; +} diff --git a/lib/generated/l10n/l10n_fil.dart b/lib/generated/l10n/l10n_fil.dart new file mode 100644 index 0000000..13a09cc --- /dev/null +++ b/lib/generated/l10n/l10n_fil.dart @@ -0,0 +1,2751 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'l10n.dart'; + +// ignore_for_file: type=lint + +/// The translations for Filipino Pilipino (`fil`). +class L10nFil extends L10n { + L10nFil([String locale = 'fil']) : super(locale); + + @override + String get noSendPermission => 'You can\'t send messages here'; + + @override + String get alwaysUse24HourFormat => 'false'; + + @override + String get repeatPassword => 'Ulitin ang password'; + + @override + String get notAnImage => 'Hindi isang file na larawan.'; + + @override + String get setCustomPermissionLevel => 'Set custom permission level'; + + @override + String get setPermissionsLevelDescription => + 'Please choose a predefined role below or enter a custom permission level between 0 and 100.'; + + @override + String get ignoreUser => 'Ignore user'; + + @override + String get normalUser => 'Normal user'; + + @override + String get remove => 'Tanggalin'; + + @override + String get importNow => 'I-import ngayon'; + + @override + String get importEmojis => 'I-import ang mga Emoji'; + + @override + String get importFromZipFile => 'Mag-import mula sa .zip file'; + + @override + String get exportEmotePack => 'I-export ang Emote pack bilang .zip'; + + @override + String get replace => 'Palitan'; + + @override + String get about => 'Tungkol sa'; + + @override + String aboutHomeserver(String homeserver) { + return 'Tungkol sa $homeserver'; + } + + @override + String get accept => 'Tanggapin'; + + @override + String acceptedTheInvitation(String username) { + return '👍 Tinanggap ni $username ang imbitasyon'; + } + + @override + String get account => 'Account'; + + @override + String activatedEndToEndEncryption(String username) { + return '🔐 Na-activate ni $username ang end to end encryption'; + } + + @override + String get addEmail => 'Magdagdag ng email'; + + @override + String get confirmMatrixId => + 'Paki-kumpirma ang iyong Matrix ID para burahin ang iyong account.'; + + @override + String supposedMxid(String mxid) { + return 'Dapat ito ay $mxid'; + } + + @override + String get addChatDescription => 'Magdagdag ng deskripsyon ng chat...'; + + @override + String get addToSpace => 'Idagdag sa space'; + + @override + String get admin => 'Admin'; + + @override + String get alias => 'alyas'; + + @override + String get all => 'Lahat'; + + @override + String get allChats => 'Lahat ng mga chat'; + + @override + String get commandHint_roomupgrade => + 'Upgrade this room to the given room version'; + + @override + String get commandHint_googly => 'Magpadala ng mga googly eye'; + + @override + String get commandHint_cuddle => 'Magpadala ng yakap'; + + @override + String get commandHint_hug => 'Magpadala ng yakap'; + + @override + String googlyEyesContent(String senderName) { + return 'Nagpadala si $senderName ng googly eyes'; + } + + @override + String cuddleContent(String senderName) { + return 'Niyakap ka ni $senderName'; + } + + @override + String hugContent(String senderName) { + return 'Niyakap ka ni $senderName'; + } + + @override + String answeredTheCall(String senderName) { + return 'Sinagot ni $senderName ang tawag'; + } + + @override + String get anyoneCanJoin => 'Pwede sumali ang anumang tao'; + + @override + String get appLock => 'Lock ng app'; + + @override + String get appLockDescription => + 'I-lock ang app kapag hindi ginagamit sa pamamagitan ng pin code'; + + @override + String get archive => 'Archive'; + + @override + String get areGuestsAllowedToJoin => 'Pwede ba sumali ang mga bisita'; + + @override + String get areYouSure => 'Sigurado ka?'; + + @override + String get areYouSureYouWantToLogout => + 'Sigurado kang gusto mong mag-log out?'; + + @override + String get askSSSSSign => + 'Para i-sign ang isa pang tao, pakilagay ang iyong secure store passphrase o recovery key.'; + + @override + String askVerificationRequest(String username) { + return 'Tanggapin ang hiling ng verification mula sa $username?'; + } + + @override + String get autoplayImages => + 'Awtomatikong i-play ang mga gumagalaw na sticker at emote'; + + @override + String badServerLoginTypesException(String serverVersions, + String supportedVersions, Object suportedVersions) { + return 'Ang homeserver ay sinusuportahan ang sumusunod na uri ng login:\n$serverVersions\nNgunit sinusuportahan lang ng app ang:\n$supportedVersions'; + } + + @override + String get sendTypingNotifications => 'Ipadala ang mga typing notification'; + + @override + String get swipeRightToLeftToReply => + 'Mag-swipe pakaliwa o kanan para tumugon'; + + @override + String get sendOnEnter => 'Ipadala sa pagpindot ng enter'; + + @override + String badServerVersionsException(String serverVersions, + String supportedVersions, Object serverVerions, Object suportedVersions) { + return 'Ang homeserver ay sinusuportahan ang mga Spec bersyon:\n$serverVersions\nNgunit sinusuportahan lang ng app ang $supportedVersions'; + } + + @override + String countChatsAndCountParticipants(int chats, int participants) { + return '$chats mga chat at $participants mga kasali'; + } + + @override + String get noMoreChatsFound => 'Wala nang mga chat na nahanap…'; + + @override + String get noChatsFoundHere => + 'Walang pang mga chat na nahanap dito. Magsimula ng bagong chat kasama ang isang tao sa pamamagitan ng paggamit ng button sa ibaba. ⤵️'; + + @override + String get joinedChats => 'Mga nasaling chat'; + + @override + String get unread => 'Hindi nabasa'; + + @override + String get space => 'Espasyo'; + + @override + String get spaces => 'Mga Espasyo'; + + @override + String get banFromChat => 'Pagbawalan sa chat'; + + @override + String get banned => 'Pinagbawalan'; + + @override + String bannedUser(String username, String targetName) { + return 'Pinagbawalan ni $username si $targetName'; + } + + @override + String get blockDevice => 'I-block ang Device'; + + @override + String get blocked => 'Na-block'; + + @override + String get botMessages => 'Mga mensahe ng bot'; + + @override + String get cancel => 'Kanselahin'; + + @override + String cantOpenUri(String uri) { + return 'Hindi mabuksan ang URI na $uri'; + } + + @override + String get changeDeviceName => 'Palitan ang pangalan ng device'; + + @override + String changedTheChatAvatar(String username) { + return 'Pinalitan ni $username ang avatar ng chat'; + } + + @override + String changedTheChatDescriptionTo(String username, String description) { + return 'Pinalitan ni $username ang deskripsyon ng chat sa: \'$description\''; + } + + @override + String changedTheChatNameTo(String username, String chatname) { + return 'Pinalitan ni $username ang pangalan ng chat sa: \'$chatname\''; + } + + @override + String changedTheChatPermissions(String username) { + return 'Pinalitan ni $username ang mga pahintulot ng chat'; + } + + @override + String changedTheDisplaynameTo(String username, String displayname) { + return 'Pinalitan ni $username ang kanilang displayname sa: \'$displayname\''; + } + + @override + String changedTheGuestAccessRules(String username) { + return 'Pinalitan ni $username ang mga tuntunin sa pag-access ng bisita'; + } + + @override + String changedTheGuestAccessRulesTo(String username, String rules) { + return 'Pinalitan ni $username ang mga tuntunin sa pag-access ng bisita sa: $rules'; + } + + @override + String changedTheHistoryVisibility(String username) { + return 'Pinalitan ni $username ang kakayahan ng pagkikita ng history'; + } + + @override + String changedTheHistoryVisibilityTo(String username, String rules) { + return 'Pinalitan ni $username ang kakayahan ng pagkikita ng history sa: $rules'; + } + + @override + String changedTheJoinRules(String username) { + return 'Pinalitan ni $username ang mga tuntunin sa pagsali'; + } + + @override + String changedTheJoinRulesTo(String username, String joinRules) { + return 'Pinalitan ni $username ang mga tuntunin sa pagsali sa: $joinRules'; + } + + @override + String changedTheProfileAvatar(String username) { + return 'Pinalitan ni $username ang kanilang avatar'; + } + + @override + String changedTheRoomAliases(String username) { + return 'Pinalitan ni $username ang mga alias ng room'; + } + + @override + String changedTheRoomInvitationLink(String username) { + return 'Pinalitan ni $username ang link ng imbitasyon'; + } + + @override + String get changePassword => 'Palitan ang password'; + + @override + String get changeTheHomeserver => 'Palitan ang homeserver'; + + @override + String get changeTheme => 'Palitan ang iyong istilio'; + + @override + String get changeTheNameOfTheGroup => 'Palitan ng pangalan ng grupo'; + + @override + String get changeYourAvatar => 'Palitan ang iyong avatar'; + + @override + String get channelCorruptedDecryptError => 'Nasira ang encryption'; + + @override + String get chat => 'Chat'; + + @override + String get yourChatBackupHasBeenSetUp => + 'Na-set up na ang iyong chat backup.'; + + @override + String get chatBackup => 'Pag-backup ng chat'; + + @override + String get chatBackupDescription => + 'Naka-secure ang iyong mga lumang mensahe gamit ng recovery key. Siguraduhing hindi mo ito mawalan.'; + + @override + String get chatDetails => 'Mga detalye ng chat'; + + @override + String get chatHasBeenAddedToThisSpace => 'Nadagdag ang chat sa space na ito'; + + @override + String get chats => 'Mga Chat'; + + @override + String get chooseAStrongPassword => 'Pumili ng malakas na password'; + + @override + String get clearArchive => 'I-clear ang archive'; + + @override + String get close => 'Isara'; + + @override + String get commandHint_markasdm => + 'Markahan bilang direktang mensahe na room para sa ibinigay na Matrix ID'; + + @override + String get commandHint_markasgroup => 'Markahan bilang grupo'; + + @override + String get commandHint_ban => + 'Pagbawalan ang ibinigay na user sa room na ito'; + + @override + String get commandHint_clearcache => 'I-clear ang cache'; + + @override + String get commandHint_create => + 'Gumawa ng walang lamang group chat\nGumamit ng --no-encryption para i-disable ang encryption'; + + @override + String get commandHint_discardsession => 'Iwaksi ang sesyon'; + + @override + String get commandHint_dm => + 'Magsimula ng direktong chat\nGumamit ng --no-encryptiom para i-disable ang encryption'; + + @override + String get commandHint_html => 'Magpadala ng HTML-formatted na text'; + + @override + String get commandHint_invite => + 'Imbitahan ang ibinigay na user sa room na ito'; + + @override + String get commandHint_join => 'Sumali sa ibinigay na room'; + + @override + String get commandHint_kick => + 'Tanggalin ang ibinigay na user sa room na ito'; + + @override + String get commandHint_leave => 'Umalis sa room na ito'; + + @override + String get commandHint_me => 'Ilarawan ang iyong sarili'; + + @override + String get commandHint_myroomavatar => + 'Ilapat ang iyong larawan para sa room na ito (bilang mxc-uri)'; + + @override + String get commandHint_myroomnick => + 'Ilapat ang iyong display name para sa room na ito'; + + @override + String get commandHint_op => + 'Ilapat ang level ng lakas sa ibinigay na user (default: 50)'; + + @override + String get commandHint_plain => 'Magpadala ng hindi na-format na text'; + + @override + String get commandHint_react => 'Magpadala ng reply bilang reaksyon'; + + @override + String get commandHint_send => 'Magpadala ng text'; + + @override + String get commandHint_unban => 'I-unban ang ibinigay na user sa room na ito'; + + @override + String get commandInvalid => 'Hindi wastong command'; + + @override + String commandMissing(String command) { + return 'Hindi isang command ang $command.'; + } + + @override + String get compareEmojiMatch => 'Paki-kumpara ang mga emoji'; + + @override + String get compareNumbersMatch => 'Paki-kumpara ang mga numero'; + + @override + String get configureChat => 'I-configure ang chat'; + + @override + String get confirm => 'Kumpirmahin'; + + @override + String get connect => 'Kumonekta'; + + @override + String get contactHasBeenInvitedToTheGroup => 'Inimbita ang contact sa group'; + + @override + String get containsDisplayName => 'Naglalaman ng display name'; + + @override + String get containsUserName => 'Naglalaman ng username'; + + @override + String get contentHasBeenReported => + 'Inulat ang nilalaman sa mga pangangasiwa ng server'; + + @override + String get copiedToClipboard => 'Kinopya sa clipboard'; + + @override + String get copy => 'Kopyahin'; + + @override + String get copyToClipboard => 'Kopyahin sa clipboard'; + + @override + String couldNotDecryptMessage(String error) { + return 'Hindi ma-decrypt ang mensahe: $error'; + } + + @override + String countParticipants(int count) { + return '$count mga kasali'; + } + + @override + String get create => 'Gumawa'; + + @override + String createdTheChat(String username) { + return '💬 Ginawa ni $username ang chat'; + } + + @override + String get createGroup => 'Gumawa ng grupo'; + + @override + String get createNewSpace => 'Bagong space'; + + @override + String get currentlyActive => 'Kasalukuyang aktibo'; + + @override + String get darkTheme => 'Madilim'; + + @override + String dateAndTimeOfDay(String date, String timeOfDay) { + return '$date, $timeOfDay'; + } + + @override + String dateWithoutYear(String month, String day) { + return '$month/$day'; + } + + @override + String dateWithYear(String year, String month, String day) { + return '$month/$day/$year'; + } + + @override + String get deactivateAccountWarning => + 'Ide-deactivate nito ang iyong user account. Hindi na ito maaaring bawiin! Sigurado ka?'; + + @override + String get defaultPermissionLevel => + 'Default na antas ng pahintulot para sa mga bagong user'; + + @override + String get delete => 'Burahin'; + + @override + String get deleteAccount => 'Burahin ang account'; + + @override + String get deleteMessage => 'Burahin ang mensahe'; + + @override + String get device => 'Device'; + + @override + String get deviceId => 'ID ng Device'; + + @override + String get devices => 'Mga Device'; + + @override + String get directChats => 'Mga Direktang Chat'; + + @override + String get allRooms => 'Lahat ng Mga Group Chat'; + + @override + String get displaynameHasBeenChanged => 'Pinalitan na ang display name'; + + @override + String get downloadFile => 'I-download ang file'; + + @override + String get edit => 'I-edit'; + + @override + String get editBlockedServers => 'I-edit ang mga naka-block na server'; + + @override + String get chatPermissions => 'Mga pahintulot ng chat'; + + @override + String get editDisplayname => 'I-edit ang display name'; + + @override + String get editRoomAliases => 'I-edit ang mga alyas ng room'; + + @override + String get editRoomAvatar => 'I-edit ang avatar ng room'; + + @override + String get emoteExists => 'Umiiral na ang emote!'; + + @override + String get emoteInvalid => 'Hindi wastong shortcode ng emote!'; + + @override + String get emoteKeyboardNoRecents => + 'Ang mga kamakailang ginamit na emote ay lalabas dito...'; + + @override + String get emotePacks => 'Mga emote pack para sa room'; + + @override + String get emoteSettings => 'Mga Setting ng Emote'; + + @override + String get globalChatId => 'Global chat ID'; + + @override + String get accessAndVisibility => 'Pag-access at visibility'; + + @override + String get accessAndVisibilityDescription => + 'Sino ang pinapayagang sumali sa chat at paano matutuklas ang chat.'; + + @override + String get calls => 'Mga Tawag'; + + @override + String get customEmojisAndStickers => 'Mga custom emoji at sticker'; + + @override + String get customEmojisAndStickersBody => + 'Magdagdag o magbahagi ng mga custom emoji o sticker na maaring gamitin sa anumang chat.'; + + @override + String get emoteShortcode => 'Shortcode ng emoji'; + + @override + String get emoteWarnNeedToPick => + 'Kailangan mong pumili ng emote shortcode at isang larawan!'; + + @override + String get emptyChat => 'Walang lamang chat'; + + @override + String get enableEmotesGlobally => 'I-enable ang emote pack globally'; + + @override + String get enableEncryption => 'I-enable ang encryption'; + + @override + String get enableEncryptionWarning => + 'Hindi mo madi-disable ang encryption. Sigurado ka ba?'; + + @override + String get encrypted => 'Naka-encrypt'; + + @override + String get encryption => 'Pag-encrypt'; + + @override + String get encryptionNotEnabled => 'Hindi naka-enable ang encryption'; + + @override + String endedTheCall(String senderName) { + return 'Tinapos ni $senderName ang tawag'; + } + + @override + String get enterAnEmailAddress => 'Maglagay ng email address'; + + @override + String get homeserver => 'Homeserver'; + + @override + String get enterYourHomeserver => 'Ilagay ang iyong homeserver'; + + @override + String errorObtainingLocation(String error) { + return 'Hindi makuha ang lokasyon: $error'; + } + + @override + String get everythingReady => 'Handa na ang lahat!'; + + @override + String get extremeOffensive => 'Lubhang nakakasakit'; + + @override + String get fileName => 'Pangalan ng file'; + + @override + String get fluffychat => 'FluffyChat'; + + @override + String get fontSize => 'Laki ng font'; + + @override + String get forward => 'I-forward'; + + @override + String get fromJoining => 'Mula sa pagsali'; + + @override + String get fromTheInvitation => 'Mula sa imbitasyon'; + + @override + String get goToTheNewRoom => 'Pumunta sa bagong room'; + + @override + String get group => 'Grupo'; + + @override + String get chatDescription => 'Paglalarawan ng chat'; + + @override + String get chatDescriptionHasBeenChanged => 'Nabago ang paglalarawan ng chat'; + + @override + String get groupIsPublic => 'Pampubliko ang grupo'; + + @override + String get groups => 'Mga grupo'; + + @override + String groupWith(String displayname) { + return 'Grupo kasama kay/sa $displayname'; + } + + @override + String get guestsAreForbidden => 'Pinagbabawal ang mga bisita'; + + @override + String get guestsCanJoin => 'Maaring sumali ang mga bisita'; + + @override + String hasWithdrawnTheInvitationFor(String username, String targetName) { + return '$username has withdrawn the invitation for $targetName'; + } + + @override + String get help => 'Help'; + + @override + String get hideRedactedEvents => 'Hide redacted events'; + + @override + String get hideRedactedMessages => 'Hide redacted messages'; + + @override + String get hideRedactedMessagesBody => + 'If someone redacts a message, this message won\'t be visible in the chat anymore.'; + + @override + String get hideInvalidOrUnknownMessageFormats => + 'Hide invalid or unknown message formats'; + + @override + String get howOffensiveIsThisContent => 'How offensive is this content?'; + + @override + String get id => 'ID'; + + @override + String get identity => 'Identity'; + + @override + String get block => 'Block'; + + @override + String get blockedUsers => 'Blocked users'; + + @override + String get blockListDescription => + 'You can block users who are disturbing you. You won\'t be able to receive any messages or room invites from the users on your personal block list.'; + + @override + String get blockUsername => 'Ignore username'; + + @override + String get iHaveClickedOnLink => 'I have clicked on the link'; + + @override + String get incorrectPassphraseOrKey => 'Incorrect passphrase or recovery key'; + + @override + String get inoffensive => 'Inoffensive'; + + @override + String get inviteContact => 'Invite contact'; + + @override + String inviteContactToGroupQuestion(Object contact, Object groupName) { + return 'Do you want to invite $contact to the chat \"$groupName\"?'; + } + + @override + String inviteContactToGroup(String groupName) { + return 'Invite contact to $groupName'; + } + + @override + String get noChatDescriptionYet => 'No chat description created yet.'; + + @override + String get tryAgain => 'Try again'; + + @override + String get invalidServerName => 'Invalid server name'; + + @override + String get invited => 'Invited'; + + @override + String get redactMessageDescription => + 'The message will be redacted for all participants in this conversation. This cannot be undone.'; + + @override + String get optionalRedactReason => + '(Optional) Reason for redacting this message...'; + + @override + String invitedUser(String username, String targetName) { + return '📩 $username invited $targetName'; + } + + @override + String get invitedUsersOnly => 'Invited users only'; + + @override + String get inviteForMe => 'Invite for me'; + + @override + String inviteText(String username, String link) { + return '$username invited you to Extera.\n1. Visit fluffychat.im and install the app \n2. Sign up or sign in \n3. Open the invite link: \n $link'; + } + + @override + String get isTyping => 'is typing…'; + + @override + String joinedTheChat(String username) { + return '👋 $username joined the chat'; + } + + @override + String get joinRoom => 'Join room'; + + @override + String kicked(String username, String targetName) { + return '👞 $username kicked $targetName'; + } + + @override + String kickedAndBanned(String username, String targetName) { + return '🙅 $username kicked and banned $targetName'; + } + + @override + String get kickFromChat => 'Kick from chat'; + + @override + String lastActiveAgo(String localizedTimeShort) { + return 'Last active: $localizedTimeShort'; + } + + @override + String get leave => 'Leave'; + + @override + String get leftTheChat => 'Left the chat'; + + @override + String get license => 'License'; + + @override + String get lightTheme => 'Light'; + + @override + String loadCountMoreParticipants(int count) { + return 'Load $count more participants'; + } + + @override + String get dehydrate => 'Export session and wipe device'; + + @override + String get dehydrateWarning => + 'This action cannot be undone. Ensure you safely store the backup file.'; + + @override + String get dehydrateTor => 'TOR Users: Export session'; + + @override + String get dehydrateTorLong => + 'For TOR users, it is recommended to export the session before closing the window.'; + + @override + String get hydrateTor => 'TOR Users: Import session export'; + + @override + String get hydrateTorLong => + 'Did you export your session last time on TOR? Quickly import it and continue chatting.'; + + @override + String get hydrate => 'Restore from backup file'; + + @override + String get loadingPleaseWait => 'Loading… Please wait.'; + + @override + String get loadMore => 'Load more…'; + + @override + String get locationDisabledNotice => + 'Location services are disabled. Please enable them to be able to share your location.'; + + @override + String get locationPermissionDeniedNotice => + 'Location permission denied. Please grant them to be able to share your location.'; + + @override + String get login => 'Login'; + + @override + String logInTo(String homeserver) { + return 'Log in to $homeserver'; + } + + @override + String get logout => 'Logout'; + + @override + String get memberChanges => 'Member changes'; + + @override + String get mention => 'Mention'; + + @override + String get messages => 'Messages'; + + @override + String get messagesStyle => 'Messages:'; + + @override + String get moderator => 'Moderator'; + + @override + String get muteChat => 'Mute chat'; + + @override + String get needPantalaimonWarning => + 'Please be aware that you need Pantalaimon to use end-to-end encryption for now.'; + + @override + String get newChat => 'New chat'; + + @override + String get newMessageInFluffyChat => '💬 New message in Extera'; + + @override + String get newVerificationRequest => 'New verification request!'; + + @override + String get next => 'Next'; + + @override + String get no => 'No'; + + @override + String get noConnectionToTheServer => 'No connection to the server'; + + @override + String get noEmotesFound => 'No emotes found. 😕'; + + @override + String get noEncryptionForPublicRooms => + 'You can only activate encryption as soon as the room is no longer publicly accessible.'; + + @override + String get noGoogleServicesWarning => + 'Firebase Cloud Messaging doesn\'t appear to be available on your device. To still receive push notifications, we recommend installing ntfy. With ntfy or another Unified Push provider you can receive push notifications in a data secure way. You can download ntfy from the PlayStore or from F-Droid.'; + + @override + String noMatrixServer(String server1, String server2) { + return '$server1 is no matrix server, use $server2 instead?'; + } + + @override + String get shareInviteLink => 'Share invite link'; + + @override + String get scanQrCode => 'Scan QR code'; + + @override + String get none => 'None'; + + @override + String get noPasswordRecoveryDescription => + 'You have not added a way to recover your password yet.'; + + @override + String get noPermission => 'No permission'; + + @override + String get noRoomsFound => 'No rooms found…'; + + @override + String get notifications => 'Notifications'; + + @override + String get notificationsEnabledForThisAccount => + 'Notifications enabled for this account'; + + @override + String numUsersTyping(int count) { + return '$count users are typing…'; + } + + @override + String get obtainingLocation => 'Obtaining location…'; + + @override + String get offensive => 'Offensive'; + + @override + String get offline => 'Offline'; + + @override + String get ok => 'Ok'; + + @override + String get online => 'Online'; + + @override + String get onlineKeyBackupEnabled => 'Online Key Backup is enabled'; + + @override + String get oopsPushError => + 'Oops! Unfortunately, an error occurred when setting up the push notifications.'; + + @override + String get oopsSomethingWentWrong => 'Oops, something went wrong…'; + + @override + String get openAppToReadMessages => 'Open app to read messages'; + + @override + String get openCamera => 'Open camera'; + + @override + String get openVideoCamera => 'Open camera for a video'; + + @override + String get oneClientLoggedOut => 'One of your clients has been logged out'; + + @override + String get addAccount => 'Add account'; + + @override + String get editBundlesForAccount => 'Edit bundles for this account'; + + @override + String get addToBundle => 'Add to bundle'; + + @override + String get removeFromBundle => 'Remove from this bundle'; + + @override + String get bundleName => 'Bundle name'; + + @override + String get enableMultiAccounts => + '(BETA) Enable multi accounts on this device'; + + @override + String get openInMaps => 'Open in maps'; + + @override + String get link => 'Link'; + + @override + String get serverRequiresEmail => + 'This server needs to validate your email address for registration.'; + + @override + String get or => 'Or'; + + @override + String get participant => 'Participant'; + + @override + String get passphraseOrKey => 'passphrase or recovery key'; + + @override + String get password => 'Password'; + + @override + String get passwordForgotten => 'Password forgotten'; + + @override + String get passwordHasBeenChanged => 'Password has been changed'; + + @override + String get hideMemberChangesInPublicChats => + 'Hide member changes in public chats'; + + @override + String get hideMemberChangesInPublicChatsBody => + 'Do not show in the chat timeline if someone joins or leaves a public chat to improve readability.'; + + @override + String get overview => 'Overview'; + + @override + String get notifyMeFor => 'Notify me for'; + + @override + String get passwordRecoverySettings => 'Password recovery settings'; + + @override + String get passwordRecovery => 'Password recovery'; + + @override + String get people => 'People'; + + @override + String get pickImage => 'Pick an image'; + + @override + String get pin => 'Pin'; + + @override + String play(String fileName) { + return 'Play $fileName'; + } + + @override + String get pleaseChoose => 'Please choose'; + + @override + String get pleaseChooseAPasscode => 'Please choose a pass code'; + + @override + String get pleaseClickOnLink => + 'Please click on the link in the email and then proceed.'; + + @override + String get pleaseEnter4Digits => + 'Please enter 4 digits or leave empty to disable app lock.'; + + @override + String get pleaseEnterRecoveryKey => 'Please enter your recovery key:'; + + @override + String get pleaseEnterYourPassword => 'Please enter your password'; + + @override + String get pleaseEnterYourPin => 'Please enter your pin'; + + @override + String get pleaseEnterYourUsername => 'Please enter your username'; + + @override + String get pleaseFollowInstructionsOnWeb => + 'Please follow the instructions on the website and tap on next.'; + + @override + String get privacy => 'Privacy'; + + @override + String get publicRooms => 'Public Rooms'; + + @override + String get pushRules => 'Push rules'; + + @override + String get reason => 'Reason'; + + @override + String get recording => 'Recording'; + + @override + String redactedBy(String username) { + return 'Redacted by $username'; + } + + @override + String get directChat => 'Direct chat'; + + @override + String redactedByBecause(String username, String reason) { + return 'Redacted by $username because: \"$reason\"'; + } + + @override + String redactedAnEvent(String username) { + return '$username redacted an event'; + } + + @override + String get redactMessage => 'Redact message'; + + @override + String get register => 'Register'; + + @override + String get reject => 'Reject'; + + @override + String rejectedTheInvitation(String username) { + return '$username rejected the invitation'; + } + + @override + String get rejoin => 'Rejoin'; + + @override + String get removeAllOtherDevices => 'Remove all other devices'; + + @override + String removedBy(String username) { + return 'Removed by $username'; + } + + @override + String get removeDevice => 'Remove device'; + + @override + String get unbanFromChat => 'Unban from chat'; + + @override + String get removeYourAvatar => 'Remove your avatar'; + + @override + String get replaceRoomWithNewerVersion => 'Replace room with newer version'; + + @override + String get reply => 'Reply'; + + @override + String get reportMessage => 'Report message'; + + @override + String get translateMessage => 'Translate message'; + + @override + String get translatedMessage => 'Translated message'; + + @override + String get errorTranslatingMessage => + 'An error has occured while translating the message.'; + + @override + String get recoverMessage => 'Recover message'; + + @override + String get recoveredMessage => 'Recovered message'; + + @override + String get errorRecoveringMessage => + 'An error has occured while recovering the message.'; + + @override + String get errorRecoveringMessageNoAdmin => + 'This feature is available on Synapse homeservers only for adminstrators.'; + + @override + String get requestPermission => 'Request permission'; + + @override + String get roomHasBeenUpgraded => 'Room has been upgraded'; + + @override + String get roomVersion => 'Room version'; + + @override + String get saveFile => 'Save file'; + + @override + String get retry => 'Retry'; + + @override + String get search => 'Search'; + + @override + String get security => 'Security'; + + @override + String get recoveryKey => 'Recovery key'; + + @override + String get recoveryKeyLost => 'Recovery key lost?'; + + @override + String seenByUser(String username) { + return 'Seen by $username'; + } + + @override + String get send => 'Send'; + + @override + String get sendAMessage => 'Send a message'; + + @override + String get sendAsText => 'Send as text'; + + @override + String get sendAudio => 'Send audio'; + + @override + String get sendFile => 'Send file'; + + @override + String get sendImage => 'Send image'; + + @override + String sendImages(int count) { + return 'Send $count image'; + } + + @override + String get sendMessages => 'Send messages'; + + @override + String get sendOriginal => 'Send original'; + + @override + String get sendSticker => 'Send sticker'; + + @override + String get sendVideo => 'Send video'; + + @override + String sentAFile(String username) { + return '📁 $username sent a file'; + } + + @override + String sentAnAudio(String username) { + return '🎤 $username sent an audio'; + } + + @override + String sentAPicture(String username) { + return '🖼️ $username sent a picture'; + } + + @override + String sentASticker(String username) { + return '😊 $username sent a sticker'; + } + + @override + String sentAVideo(String username) { + return '🎥 $username sent a video'; + } + + @override + String sentCallInformations(String senderName) { + return '$senderName sent call information'; + } + + @override + String get separateChatTypes => 'Separate Direct Chats and Groups'; + + @override + String get setAsCanonicalAlias => 'Set as main alias'; + + @override + String get setCustomEmotes => 'Set custom emotes'; + + @override + String get setChatDescription => 'Set chat description'; + + @override + String get setInvitationLink => 'Set invitation link'; + + @override + String get setPermissionsLevel => 'Set permissions level'; + + @override + String get setStatus => 'Set status'; + + @override + String get settings => 'Settings'; + + @override + String get share => 'Share'; + + @override + String sharedTheLocation(String username) { + return '$username shared their location'; + } + + @override + String get shareLocation => 'Share location'; + + @override + String get showPassword => 'Show password'; + + @override + String get presenceStyle => 'Presence:'; + + @override + String get hideAvatarsInInvites => 'Hide avatars in invites'; + + @override + String get hideAvatarsInInvitesDescription => + 'Do not show room avatars in invites'; + + @override + String get presencesToggle => 'Show status messages from other users'; + + @override + String get pureBlackToggle => 'Pure Black'; + + @override + String get singlesignon => 'Single Sign on'; + + @override + String get skip => 'Skip'; + + @override + String get sourceCode => 'Source code'; + + @override + String get spaceIsPublic => 'Space is public'; + + @override + String get spaceName => 'Space name'; + + @override + String startedACall(String senderName) { + return '$senderName started a call'; + } + + @override + String get startFirstChat => 'Start your first chat'; + + @override + String get status => 'Status'; + + @override + String get statusExampleMessage => 'How are you today?'; + + @override + String get submit => 'Submit'; + + @override + String get synchronizingPleaseWait => 'Synchronizing… Please wait.'; + + @override + String synchronizingPleaseWaitCounter(String percentage) { + return ' Synchronizing… ($percentage%)'; + } + + @override + String get systemTheme => 'System'; + + @override + String get theyDontMatch => 'They Don\'t Match'; + + @override + String get theyMatch => 'They Match'; + + @override + String get title => 'Extera'; + + @override + String get toggleFavorite => 'Toggle Favorite'; + + @override + String get toggleMuted => 'Toggle Muted'; + + @override + String get toggleUnread => 'Mark Read/Unread'; + + @override + String get tooManyRequestsWarning => + 'Too many requests. Please try again later!'; + + @override + String get transferFromAnotherDevice => 'Transfer from another device'; + + @override + String get tryToSendAgain => 'Try to send again'; + + @override + String get unavailable => 'Unavailable'; + + @override + String unbannedUser(String username, String targetName) { + return '$username unbanned $targetName'; + } + + @override + String get unblockDevice => 'Unblock Device'; + + @override + String get unknownDevice => 'Unknown device'; + + @override + String get unknownEncryptionAlgorithm => 'Unknown encryption algorithm'; + + @override + String unknownEvent(String type) { + return 'Unknown event \'$type\''; + } + + @override + String get unmuteChat => 'Unmute chat'; + + @override + String get unpin => 'Unpin'; + + @override + String unreadChats(int unreadCount) { + String _temp0 = intl.Intl.pluralLogic( + unreadCount, + locale: localeName, + other: '$unreadCount unread chats', + one: '1 unread chat', + ); + return '$_temp0'; + } + + @override + String userAndOthersAreTyping(String username, int count) { + return '$username and $count others are typing…'; + } + + @override + String userAndUserAreTyping(String username, String username2) { + return '$username and $username2 are typing…'; + } + + @override + String userIsTyping(String username) { + return '$username is typing…'; + } + + @override + String userLeftTheChat(String username) { + return '🚪 $username left the chat'; + } + + @override + String get username => 'Username'; + + @override + String userSentUnknownEvent(String username, String type) { + return '$username sent a $type event'; + } + + @override + String get unverified => 'Unverified'; + + @override + String get verified => 'Verified'; + + @override + String get verify => 'Verify'; + + @override + String get verifyStart => 'Start Verification'; + + @override + String get verifySuccess => 'You successfully verified!'; + + @override + String get verifyTitle => 'Verifying other account'; + + @override + String get videoCall => 'Video call'; + + @override + String get visibilityOfTheChatHistory => 'Visibility of the chat history'; + + @override + String get visibleForAllParticipants => 'Visible for all participants'; + + @override + String get visibleForEveryone => 'Visible for everyone'; + + @override + String get voiceMessage => 'Voice message'; + + @override + String get waitingPartnerAcceptRequest => + 'Waiting for partner to accept the request…'; + + @override + String get waitingPartnerEmoji => 'Waiting for partner to accept the emoji…'; + + @override + String get waitingPartnerNumbers => + 'Waiting for partner to accept the numbers…'; + + @override + String get wallpaper => 'Wallpaper:'; + + @override + String get warning => 'Warning!'; + + @override + String get weSentYouAnEmail => 'We sent you an email'; + + @override + String get whoCanPerformWhichAction => 'Who can perform which action'; + + @override + String get whoIsAllowedToJoinThisGroup => 'Who is allowed to join this group'; + + @override + String get whyDoYouWantToReportThis => 'Why do you want to report this?'; + + @override + String get wipeChatBackup => + 'Wipe your chat backup to create a new recovery key?'; + + @override + String get withTheseAddressesRecoveryDescription => + 'With these addresses you can recover your password.'; + + @override + String get writeAMessage => 'Write a message…'; + + @override + String get yes => 'Yes'; + + @override + String get you => 'You'; + + @override + String get youAreNoLongerParticipatingInThisChat => + 'You are no longer participating in this chat'; + + @override + String get youHaveBeenBannedFromThisChat => + 'You have been banned from this chat'; + + @override + String get yourPublicKey => 'Your public key'; + + @override + String get messageInfo => 'Message info'; + + @override + String get time => 'Time'; + + @override + String get messageType => 'Message Type'; + + @override + String get sender => 'Sender'; + + @override + String get openGallery => 'Open gallery'; + + @override + String get removeFromSpace => 'Remove from space'; + + @override + String get addToSpaceDescription => 'Select a space to add this chat to it.'; + + @override + String get start => 'Start'; + + @override + String get pleaseEnterRecoveryKeyDescription => + 'To unlock your old messages, please enter your recovery key that has been generated in a previous session. Your recovery key is NOT your password.'; + + @override + String get publish => 'Publish'; + + @override + String videoWithSize(String size) { + return 'Video ($size)'; + } + + @override + String get openChat => 'Open Chat'; + + @override + String get markAsRead => 'Mark as read'; + + @override + String get reportUser => 'Report user'; + + @override + String get dismiss => 'Dismiss'; + + @override + String reactedWith(String sender, String reaction) { + return '$sender reacted with $reaction'; + } + + @override + String get pinMessage => 'Pin to room'; + + @override + String get confirmEventUnpin => + 'Are you sure to permanently unpin the event?'; + + @override + String get emojis => 'Emojis'; + + @override + String get placeCall => 'Place call'; + + @override + String get voiceCall => 'Voice call'; + + @override + String get unsupportedAndroidVersion => 'Unsupported Android version'; + + @override + String get unsupportedAndroidVersionLong => + 'This feature requires a newer Android version. Please check for updates or Lineage OS support.'; + + @override + String get videoCallsBetaWarning => + 'Please note that video calls are currently in beta. They might not work as expected or work at all on all platforms.'; + + @override + String get experimentalVideoCalls => 'Experimental video calls'; + + @override + String get emailOrUsername => 'Email or username'; + + @override + String get indexedDbErrorTitle => 'Private mode issues'; + + @override + String get indexedDbErrorLong => + 'The message storage is unfortunately not enabled in private mode by default.\nPlease visit\n - about:config\n - set dom.indexedDB.privateBrowsing.enabled to true\nOtherwise, it is not possible to run Extera.'; + + @override + String switchToAccount(String number) { + return 'Switch to account $number'; + } + + @override + String get nextAccount => 'Next account'; + + @override + String get previousAccount => 'Previous account'; + + @override + String get addWidget => 'Add widget'; + + @override + String get widgetVideo => 'Video'; + + @override + String get widgetEtherpad => 'Text note'; + + @override + String get widgetJitsi => 'Jitsi Meet'; + + @override + String get widgetCustom => 'Custom'; + + @override + String get widgetName => 'Name'; + + @override + String get widgetUrlError => 'This is not a valid URL.'; + + @override + String get widgetNameError => 'Please provide a display name.'; + + @override + String get errorAddingWidget => 'Error adding the widget.'; + + @override + String get youRejectedTheInvitation => 'You rejected the invitation'; + + @override + String get youJoinedTheChat => 'You joined the chat'; + + @override + String get youAcceptedTheInvitation => '👍 You accepted the invitation'; + + @override + String youBannedUser(String user) { + return 'You banned $user'; + } + + @override + String youHaveWithdrawnTheInvitationFor(String user) { + return 'You have withdrawn the invitation for $user'; + } + + @override + String youInvitedToBy(String alias) { + return '📩 You have been invited via link to:\n$alias'; + } + + @override + String youInvitedBy(String user) { + return '📩 You have been invited by $user'; + } + + @override + String invitedBy(String user) { + return '📩 Invited by $user'; + } + + @override + String youInvitedUser(String user) { + return '📩 You invited $user'; + } + + @override + String youKicked(String user) { + return '👞 You kicked $user'; + } + + @override + String youKickedAndBanned(String user) { + return '🙅 You kicked and banned $user'; + } + + @override + String youUnbannedUser(String user) { + return 'You unbanned $user'; + } + + @override + String hasKnocked(String user) { + return '🚪 $user has knocked'; + } + + @override + String get usersMustKnock => 'Users must knock'; + + @override + String get noOneCanJoin => 'No one can join'; + + @override + String userWouldLikeToChangeTheChat(String user) { + return '$user would like to join the chat.'; + } + + @override + String get noPublicLinkHasBeenCreatedYet => + 'No public link has been created yet'; + + @override + String get knock => 'Knock'; + + @override + String get users => 'Users'; + + @override + String get unlockOldMessages => 'Unlock old messages'; + + @override + String get storeInSecureStorageDescription => + 'Store the recovery key in the secure storage of this device.'; + + @override + String get saveKeyManuallyDescription => + 'Save this key manually by triggering the system share dialog or clipboard.'; + + @override + String get storeInAndroidKeystore => 'Store in Android KeyStore'; + + @override + String get storeInAppleKeyChain => 'Store in Apple KeyChain'; + + @override + String get storeSecurlyOnThisDevice => 'Store securely on this device'; + + @override + String countFiles(int count) { + return '$count files'; + } + + @override + String get user => 'User'; + + @override + String get custom => 'Custom'; + + @override + String get foregroundServiceRunning => + 'This notification appears when the foreground service is running.'; + + @override + String get screenSharingTitle => 'screen sharing'; + + @override + String get screenSharingDetail => 'You are sharing your screen in Extera'; + + @override + String get callingPermissions => 'Calling permissions'; + + @override + String get callingAccount => 'Calling account'; + + @override + String get callingAccountDetails => + 'Allows Extera to use the native android dialer app.'; + + @override + String get appearOnTop => 'Appear on top'; + + @override + String get appearOnTopDetails => + 'Allows the app to appear on top (not needed if you already have Fluffychat setup as a calling account)'; + + @override + String get otherCallingPermissions => + 'Microphone, camera and other Extera permissions'; + + @override + String get whyIsThisMessageEncrypted => 'Why is this message unreadable?'; + + @override + String get noKeyForThisMessage => + 'This can happen if the message was sent before you have signed in to your account at this device.\n\nIt is also possible that the sender has blocked your device or something went wrong with the internet connection.\n\nAre you able to read the message on another session? Then you can transfer the message from it! Go to Settings > Devices and make sure that your devices have verified each other. When you open the room the next time and both sessions are in the foreground, the keys will be transmitted automatically.\n\nDo you not want to lose the keys when logging out or switching devices? Make sure that you have enabled the chat backup in the settings.'; + + @override + String get newGroup => 'New group'; + + @override + String get newSpace => 'New space'; + + @override + String get enterSpace => 'Enter space'; + + @override + String get enterRoom => 'Enter room'; + + @override + String get allSpaces => 'All spaces'; + + @override + String numChats(String number) { + return '$number chats'; + } + + @override + String get hideUnimportantStateEvents => 'Hide unimportant state events'; + + @override + String get hidePresences => 'Hide Status List?'; + + @override + String get doNotShowAgain => 'Do not show again'; + + @override + String wasDirectChatDisplayName(String oldDisplayName) { + return 'Empty chat (was $oldDisplayName)'; + } + + @override + String get newSpaceDescription => + 'Spaces allows you to consolidate your chats and build private or public communities.'; + + @override + String get encryptThisChat => 'Encrypt this chat'; + + @override + String get disableEncryptionWarning => + 'For security reasons you can not disable encryption in a chat, where it has been enabled before.'; + + @override + String get sorryThatsNotPossible => 'Sorry... that is not possible'; + + @override + String get deviceKeys => 'Device keys:'; + + @override + String get reopenChat => 'Reopen chat'; + + @override + String get noBackupWarning => + 'Warning! Without enabling chat backup, you will lose access to your encrypted messages. It is highly recommended to enable the chat backup first before logging out.'; + + @override + String get noOtherDevicesFound => 'No other devices found'; + + @override + String fileIsTooBigForServer(String max) { + return 'Unable to send! The server only supports attachments up to $max.'; + } + + @override + String fileHasBeenSavedAt(String path) { + return 'File has been saved at $path'; + } + + @override + String get jumpToLastReadMessage => 'Jump to last read message'; + + @override + String get readUpToHere => 'Read up to here'; + + @override + String get jump => 'Jump'; + + @override + String get openLinkInBrowser => 'Open link in browser'; + + @override + String get reportErrorDescription => + '😭 Oh no. Something went wrong. If you want, you can report this bug to the developers.'; + + @override + String get report => 'Report'; + + @override + String get signInWithPassword => 'Sign in with password'; + + @override + String get pleaseTryAgainLaterOrChooseDifferentServer => + 'Please try again later or choose a different server.'; + + @override + String signInWith(String provider) { + return 'Sign in with $provider'; + } + + @override + String get profileNotFound => + 'The user could not be found on the server. Maybe there is a connection problem or the user doesn\'t exist.'; + + @override + String get setTheme => 'Set theme:'; + + @override + String get setColorTheme => 'Set color theme:'; + + @override + String get invite => 'Invite'; + + @override + String get inviteGroupChat => '📨 Invite group chat'; + + @override + String get invitePrivateChat => '📨 Invite private chat'; + + @override + String get invalidInput => 'Invalid input!'; + + @override + String wrongPinEntered(int seconds) { + return 'Wrong pin entered! Try again in $seconds seconds...'; + } + + @override + String get pleaseEnterANumber => 'Please enter a number greater than 0'; + + @override + String get archiveRoomDescription => + 'The chat will be moved to the archive. Other users will be able to see that you have left the chat.'; + + @override + String get roomUpgradeDescription => + 'The chat will then be recreated with the new room version. All participants will be notified that they need to switch to the new chat. You can find out more about room versions at https://spec.matrix.org/latest/rooms/'; + + @override + String get removeDevicesDescription => + 'You will be logged out of this device and will no longer be able to receive messages.'; + + @override + String get banUserDescription => + 'The user will be banned from the chat and will not be able to enter the chat again until they are unbanned.'; + + @override + String get unbanUserDescription => + 'The user will be able to enter the chat again if they try.'; + + @override + String get kickUserDescription => + 'The user is kicked out of the chat but not banned. In public chats, the user can rejoin at any time.'; + + @override + String get makeAdminDescription => + 'Once you make this user admin, you may not be able to undo this as they will then have the same permissions as you.'; + + @override + String get pushNotificationsNotAvailable => + 'Push notifications not available'; + + @override + String get learnMore => 'Learn more'; + + @override + String get yourGlobalUserIdIs => 'Your global user-ID is: '; + + @override + String noUsersFoundWithQuery(String query) { + return 'Unfortunately no user could be found with \"$query\". Please check whether you made a typo.'; + } + + @override + String get knocking => 'Knocking'; + + @override + String chatCanBeDiscoveredViaSearchOnServer(String server) { + return 'Chat can be discovered via the search on $server'; + } + + @override + String get searchChatsRooms => 'Search for #chats, @users...'; + + @override + String get nothingFound => 'Nothing found...'; + + @override + String get groupName => 'Group name'; + + @override + String get createGroupAndInviteUsers => 'Create a group and invite users'; + + @override + String get groupCanBeFoundViaSearch => 'Group can be found via search'; + + @override + String get wrongRecoveryKey => + 'Sorry... this does not seem to be the correct recovery key.'; + + @override + String get startConversation => 'Start conversation'; + + @override + String get commandHint_sendraw => 'Send raw json'; + + @override + String get databaseMigrationTitle => 'Database is optimized'; + + @override + String get databaseMigrationBody => 'Please wait. This may take a moment.'; + + @override + String get leaveEmptyToClearStatus => 'Leave empty to clear your status.'; + + @override + String get select => 'Select'; + + @override + String get searchForUsers => 'Search for @users...'; + + @override + String get pleaseEnterYourCurrentPassword => + 'Please enter your current password'; + + @override + String get newPassword => 'New password'; + + @override + String get pleaseChooseAStrongPassword => 'Please choose a strong password'; + + @override + String get passwordsDoNotMatch => 'Passwords do not match'; + + @override + String get passwordIsWrong => 'Your entered password is wrong'; + + @override + String get publicLink => 'Public link'; + + @override + String get publicChatAddresses => 'Public chat addresses'; + + @override + String get createNewAddress => 'Create new address'; + + @override + String get joinSpace => 'Join space'; + + @override + String get publicSpaces => 'Public spaces'; + + @override + String get addChatOrSubSpace => 'Add chat or sub space'; + + @override + String get subspace => 'Subspace'; + + @override + String get decline => 'Decline'; + + @override + String get thisDevice => 'This device:'; + + @override + String get initAppError => 'An error occured while init the app'; + + @override + String get userRole => 'User role'; + + @override + String minimumPowerLevel(String level) { + return '$level is the minimum power level.'; + } + + @override + String searchIn(String chat) { + return 'Search in chat \"$chat\"...'; + } + + @override + String get searchMore => 'Search more...'; + + @override + String get gallery => 'Gallery'; + + @override + String get files => 'Files'; + + @override + String databaseBuildErrorBody(String url, String error) { + return 'Unable to build the SQlite database. The app tries to use the legacy database for now. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String sessionLostBody(String url, String error) { + return 'Your session is lost. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String restoreSessionBody(String url, String error) { + return 'The app now tries to restore your session from the backup. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String forwardMessageTo(String roomName) { + return 'Forward message to $roomName?'; + } + + @override + String get sendReadReceipts => 'Send read receipts'; + + @override + String get sendTypingNotificationsDescription => + 'Other participants in a chat can see when you are typing a new message.'; + + @override + String get sendReadReceiptsDescription => + 'Other participants in a chat can see when you have read a message.'; + + @override + String get formattedMessages => 'Formatted messages'; + + @override + String get formattedMessagesDescription => + 'Display rich message content like bold text using markdown.'; + + @override + String get verifyOtherUser => '🔐 Verify other user'; + + @override + String get verifyOtherUserDescription => + 'If you verify another user, you can be sure that you know who you are really writing to. 💪\n\nWhen you start a verification, you and the other user will see a popup in the app. There you will then see a series of emojis or numbers that you have to compare with each other.\n\nThe best way to do this is to meet up or start a video call. 👭'; + + @override + String get verifyOtherDevice => '🔐 Verify other device'; + + @override + String get verifyOtherDeviceDescription => + 'When you verify another device, those devices can exchange keys, increasing your overall security. 💪 When you start a verification, a popup will appear in the app on both devices. There you will then see a series of emojis or numbers that you have to compare with each other. It\'s best to have both devices handy before you start the verification. 🤳'; + + @override + String acceptedKeyVerification(String sender) { + return '$sender accepted key verification'; + } + + @override + String canceledKeyVerification(String sender) { + return '$sender canceled key verification'; + } + + @override + String completedKeyVerification(String sender) { + return '$sender completed key verification'; + } + + @override + String isReadyForKeyVerification(String sender) { + return '$sender is ready for key verification'; + } + + @override + String requestedKeyVerification(String sender) { + return '$sender requested key verification'; + } + + @override + String startedKeyVerification(String sender) { + return '$sender started key verification'; + } + + @override + String get transparent => 'Transparent'; + + @override + String get incomingMessages => 'Incoming messages'; + + @override + String get stickers => 'Stickers'; + + @override + String get discover => 'Discover'; + + @override + String get commandHint_ignore => 'Ignore the given matrix ID'; + + @override + String get commandHint_unignore => 'Unignore the given matrix ID'; + + @override + String unreadChatsInApp(String appname, String unread) { + return '$appname: $unread unread chats'; + } + + @override + String get noDatabaseEncryption => + 'Database encryption is not supported on this platform'; + + @override + String thereAreCountUsersBlocked(Object count) { + return 'Right now there are $count users blocked.'; + } + + @override + String get restricted => 'Restricted'; + + @override + String get knockRestricted => 'Knock restricted'; + + @override + String goToSpace(Object space) { + return 'Go to space: $space'; + } + + @override + String get markAsUnread => 'Mark as unread'; + + @override + String userLevel(int level) { + return '$level - User'; + } + + @override + String moderatorLevel(int level) { + return '$level - Moderator'; + } + + @override + String adminLevel(int level) { + return '$level - Admin'; + } + + @override + String get changeGeneralChatSettings => 'Change general chat settings'; + + @override + String get inviteOtherUsers => 'Invite other users to this chat'; + + @override + String get changeTheChatPermissions => 'Change the chat permissions'; + + @override + String get changeTheVisibilityOfChatHistory => + 'Change the visibility of the chat history'; + + @override + String get changeTheCanonicalRoomAlias => + 'Change the main public chat address'; + + @override + String get sendRoomNotifications => 'Send a @room notifications'; + + @override + String get changeTheDescriptionOfTheGroup => + 'Change the description of the chat'; + + @override + String get chatPermissionsDescription => + 'Define which power level is necessary for certain actions in this chat. The power levels 0, 50 and 100 are usually representing users, moderators and admins, but any gradation is possible.'; + + @override + String updateInstalled(String version) { + return '🎉 Update $version installed!'; + } + + @override + String get changelog => 'Changelog'; + + @override + String get sendCanceled => 'Sending canceled'; + + @override + String get loginWithMatrixId => 'Login with Matrix-ID'; + + @override + String get discoverHomeservers => 'Discover homeservers'; + + @override + String get whatIsAHomeserver => 'What is a homeserver?'; + + @override + String get homeserverDescription => + 'All your data is stored on the homeserver, just like an email provider. You can choose which homeserver you want to use, while you can still communicate with everyone. Learn more at at https://matrix.org.'; + + @override + String get doesNotSeemToBeAValidHomeserver => + 'Doesn\'t seem to be a compatible homeserver. Wrong URL?'; + + @override + String get calculatingFileSize => 'Calculating file size...'; + + @override + String get prepareSendingAttachment => 'Prepare sending attachment...'; + + @override + String get sendingAttachment => 'Sending attachment...'; + + @override + String get generatingVideoThumbnail => 'Generating video thumbnail...'; + + @override + String get compressVideo => 'Compressing video...'; + + @override + String sendingAttachmentCountOfCount(int index, int length) { + return 'Sending attachment $index of $length...'; + } + + @override + String serverLimitReached(int seconds) { + return 'Server limit reached! Waiting $seconds seconds...'; + } + + @override + String get oneOfYourDevicesIsNotVerified => + 'One of your devices is not verified'; + + @override + String get noticeChatBackupDeviceVerification => + 'Note: When you connect all your devices to the chat backup, they are automatically verified.'; + + @override + String get continueText => 'Continue'; + + @override + String get welcomeText => + 'Hey Hey 👋 This is Extera. You can sign in to any homeserver, which is compatible with https://matrix.org. And then chat with anyone. It\'s a huge decentralized messaging network!'; + + @override + String get blur => 'Blur:'; + + @override + String get opacity => 'Opacity:'; + + @override + String get setWallpaper => 'Set wallpaper'; + + @override + String get manageAccount => 'Manage account'; + + @override + String get noContactInformationProvided => + 'Server does not provide any valid contact information'; + + @override + String get contactServerAdmin => 'Contact server admin'; + + @override + String get contactServerSecurity => 'Contact server security'; + + @override + String get supportPage => 'Support page'; + + @override + String get serverInformation => 'Server information:'; + + @override + String get name => 'Name'; + + @override + String get version => 'Version'; + + @override + String get website => 'Website'; + + @override + String get compress => 'Compress'; + + @override + String get boldText => 'Bold text'; + + @override + String get italicText => 'Italic text'; + + @override + String get strikeThrough => 'Strikethrough'; + + @override + String get pleaseFillOut => 'Please fill out'; + + @override + String get invalidUrl => 'Invalid url'; + + @override + String get addLink => 'Add link'; + + @override + String get unableToJoinChat => + 'Unable to join chat. Maybe the other party has already closed the conversation.'; + + @override + String get previous => 'Previous'; + + @override + String get otherPartyNotLoggedIn => + 'The other party is currently not logged in and therefore cannot receive messages!'; + + @override + String appWantsToUseForLogin(String server) { + return 'Use \'$server\' to log in'; + } + + @override + String get appWantsToUseForLoginDescription => + 'You hereby allow the app and website to share information about you.'; + + @override + String get open => 'Open'; + + @override + String get waitingForServer => 'Waiting for server...'; + + @override + String get appIntroduction => + 'Extera lets you chat with your friends across different messengers. Learn more at https://matrix.org or just tap *Continue*.'; + + @override + String get newChatRequest => '📩 New chat request'; + + @override + String get contentNotificationSettings => 'Content notification settings'; + + @override + String get generalNotificationSettings => 'General notification settings'; + + @override + String get roomNotificationSettings => 'Room notification settings'; + + @override + String get userSpecificNotificationSettings => + 'User specific notification settings'; + + @override + String get otherNotificationSettings => 'Other notification settings'; + + @override + String get notificationRuleContainsUserName => 'Contains User Name'; + + @override + String get notificationRuleContainsUserNameDescription => + 'Notifies the user when a message contains their username.'; + + @override + String get notificationRuleMaster => 'Mute all notifications'; + + @override + String get notificationRuleMasterDescription => + 'Overrides all other rules and disables all notifications.'; + + @override + String get notificationRuleSuppressNotices => 'Suppress Automated Messages'; + + @override + String get notificationRuleSuppressNoticesDescription => + 'Suppresses notifications from automated clients like bots.'; + + @override + String get notificationRuleInviteForMe => 'Invite for Me'; + + @override + String get notificationRuleInviteForMeDescription => + 'Notifies the user when they are invited to a room.'; + + @override + String get notificationRuleMemberEvent => 'Member Event'; + + @override + String get notificationRuleMemberEventDescription => + 'Suppresses notifications for membership events.'; + + @override + String get notificationRuleIsUserMention => 'User Mention'; + + @override + String get notificationRuleIsUserMentionDescription => + 'Notifies the user when they are directly mentioned in a message.'; + + @override + String get notificationRuleContainsDisplayName => 'Contains Display Name'; + + @override + String get notificationRuleContainsDisplayNameDescription => + 'Notifies the user when a message contains their display name.'; + + @override + String get notificationRuleIsRoomMention => 'Room Mention'; + + @override + String get notificationRuleIsRoomMentionDescription => + 'Notifies the user when there is a room mention.'; + + @override + String get notificationRuleRoomnotif => 'Room Notification'; + + @override + String get notificationRuleRoomnotifDescription => + 'Notifies the user when a message contains \'@room\'.'; + + @override + String get notificationRuleTombstone => 'Tombstone'; + + @override + String get notificationRuleTombstoneDescription => + 'Notifies the user about room deactivation messages.'; + + @override + String get notificationRuleReaction => 'Reaction'; + + @override + String get notificationRuleReactionDescription => + 'Suppresses notifications for reactions.'; + + @override + String get notificationRuleRoomServerAcl => 'Room Server ACL'; + + @override + String get notificationRuleRoomServerAclDescription => + 'Suppresses notifications for room server access control lists (ACL).'; + + @override + String get notificationRuleSuppressEdits => 'Suppress Edits'; + + @override + String get notificationRuleSuppressEditsDescription => + 'Suppresses notifications for edited messages.'; + + @override + String get notificationRuleCall => 'Call'; + + @override + String get notificationRuleCallDescription => + 'Notifies the user about calls.'; + + @override + String get notificationRuleEncryptedRoomOneToOne => + 'Encrypted Room One-to-One'; + + @override + String get notificationRuleEncryptedRoomOneToOneDescription => + 'Notifies the user about messages in encrypted one-to-one rooms.'; + + @override + String get notificationRuleRoomOneToOne => 'Room One-to-One'; + + @override + String get notificationRuleRoomOneToOneDescription => + 'Notifies the user about messages in one-to-one rooms.'; + + @override + String get notificationRuleMessage => 'Message'; + + @override + String get notificationRuleMessageDescription => + 'Notifies the user about general messages.'; + + @override + String get notificationRuleEncrypted => 'Encrypted'; + + @override + String get notificationRuleEncryptedDescription => + 'Notifies the user about messages in encrypted rooms.'; + + @override + String get notificationRuleJitsi => 'Jitsi'; + + @override + String get notificationRuleJitsiDescription => + 'Notifies the user about Jitsi widget events.'; + + @override + String get notificationRuleServerAcl => 'Suppress Server ACL Events'; + + @override + String get notificationRuleServerAclDescription => + 'Suppresses notifications for Server ACL events.'; + + @override + String unknownPushRule(String rule) { + return 'Unknown push rule \'$rule\''; + } + + @override + String get deletePushRuleCanNotBeUndone => + 'If you delete this notification setting, this can not be undone.'; + + @override + String get more => 'More'; + + @override + String get shareKeysWith => 'Share keys with...'; + + @override + String get shareKeysWithDescription => + 'Which devices should be trusted so that they can read along your messages in encrypted chats?'; + + @override + String get allDevices => 'All devices'; + + @override + String get crossVerifiedDevicesIfEnabled => + 'Cross verified devices if enabled'; + + @override + String get crossVerifiedDevices => 'Cross verified devices'; + + @override + String get verifiedDevicesOnly => 'Verified devices only'; + + @override + String get takeAPhoto => 'Take a photo'; + + @override + String get recordAVideo => 'Record a video'; + + @override + String get optionalMessage => '(Optional) message...'; + + @override + String get notSupportedOnThisDevice => 'Not supported on this device'; + + @override + String get enterNewChat => 'Enter new chat'; + + @override + String get approve => 'Approve'; + + @override + String get youHaveKnocked => 'You have knocked'; + + @override + String get pleaseWaitUntilInvited => + 'Please wait now, until someone from the room invites you.'; +} diff --git a/lib/generated/l10n/l10n_fr.dart b/lib/generated/l10n/l10n_fr.dart new file mode 100644 index 0000000..8f1cf70 --- /dev/null +++ b/lib/generated/l10n/l10n_fr.dart @@ -0,0 +1,2792 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'l10n.dart'; + +// ignore_for_file: type=lint + +/// The translations for French (`fr`). +class L10nFr extends L10n { + L10nFr([String locale = 'fr']) : super(locale); + + @override + String get noSendPermission => 'You can\'t send messages here'; + + @override + String get alwaysUse24HourFormat => 'true'; + + @override + String get repeatPassword => 'Répétez le mot de passe'; + + @override + String get notAnImage => 'Pas un fichier image.'; + + @override + String get setCustomPermissionLevel => 'Set custom permission level'; + + @override + String get setPermissionsLevelDescription => + 'Please choose a predefined role below or enter a custom permission level between 0 and 100.'; + + @override + String get ignoreUser => 'Ignore user'; + + @override + String get normalUser => 'Normal user'; + + @override + String get remove => 'Supprimer'; + + @override + String get importNow => 'Importer maintenant'; + + @override + String get importEmojis => 'Importer des Emojis'; + + @override + String get importFromZipFile => 'Importer depuis un fichier .zip'; + + @override + String get exportEmotePack => 'Exporter le pack d\'émoticônes au format .zip'; + + @override + String get replace => 'Remplacer'; + + @override + String get about => 'À propos'; + + @override + String aboutHomeserver(String homeserver) { + return 'À propos de $homeserver'; + } + + @override + String get accept => 'Accepter'; + + @override + String acceptedTheInvitation(String username) { + return '👍 $username a accepté l\'invitation'; + } + + @override + String get account => 'Compte'; + + @override + String activatedEndToEndEncryption(String username) { + return '🔐 $username a activé le chiffrement de bout en bout'; + } + + @override + String get addEmail => 'Ajouter un courriel'; + + @override + String get confirmMatrixId => + 'Veuillez confirmer votre identifiant Matrix afin de supprimer votre compte.'; + + @override + String supposedMxid(String mxid) { + return 'Cela devrait être $mxid'; + } + + @override + String get addChatDescription => 'Ajouter une description à la discussion...'; + + @override + String get addToSpace => 'Ajouter à l\'espace'; + + @override + String get admin => 'Administrateur'; + + @override + String get alias => 'adresse'; + + @override + String get all => 'Tout'; + + @override + String get allChats => 'Toutes les discussions'; + + @override + String get commandHint_roomupgrade => + 'Upgrade this room to the given room version'; + + @override + String get commandHint_googly => 'Envoyer des yeux écarquillés'; + + @override + String get commandHint_cuddle => 'Envoyer un câlin'; + + @override + String get commandHint_hug => 'Envoyer une accolade'; + + @override + String googlyEyesContent(String senderName) { + return '$senderName vous envoie des yeux écarquillés'; + } + + @override + String cuddleContent(String senderName) { + return '$senderName vous fait un câlin'; + } + + @override + String hugContent(String senderName) { + return '$senderName vous fait une accolade'; + } + + @override + String answeredTheCall(String senderName) { + return '$senderName a répondu à l\'appel'; + } + + @override + String get anyoneCanJoin => 'Tout le monde peut rejoindre'; + + @override + String get appLock => 'Verrouillage de l’application'; + + @override + String get appLockDescription => + 'Verrouiller l\'application avec un code PIN lorsqu\'elle n\'est pas utilisée'; + + @override + String get archive => 'Archiver'; + + @override + String get areGuestsAllowedToJoin => 'Les invités peuvent-i·e·ls rejoindre'; + + @override + String get areYouSure => 'Êtes-vous sûr·e ?'; + + @override + String get areYouSureYouWantToLogout => + 'Voulez-vous vraiment vous déconnecter ?'; + + @override + String get askSSSSSign => + 'Pour pouvoir faire signer l\'autre personne, veuillez entrer la phrase de passe de votre trousseau sécurisé ou votre clé de récupération.'; + + @override + String askVerificationRequest(String username) { + return 'Accepter cette demande de vérification de la part de $username ?'; + } + + @override + String get autoplayImages => + 'Lire automatiquement les autocollants et les émojis animés'; + + @override + String badServerLoginTypesException(String serverVersions, + String supportedVersions, Object suportedVersions) { + return 'Le serveur d\'accueil prend en charge les types de connexion :\n$serverVersions\nMais cette application ne prend en charge que :\n$supportedVersions'; + } + + @override + String get sendTypingNotifications => 'Envoyer des notifications de frappe'; + + @override + String get swipeRightToLeftToReply => + 'Glisser de droite à gauche pour répondre'; + + @override + String get sendOnEnter => 'Envoyer avec Entrée'; + + @override + String badServerVersionsException(String serverVersions, + String supportedVersions, Object serverVerions, Object suportedVersions) { + return 'Le serveur d\'accueil prend en charge les versions des spécifications :\n$serverVersions\nMais cette application ne prend en charge que $supportedVersions'; + } + + @override + String countChatsAndCountParticipants(int chats, int participants) { + return '$chats discussions et $participants participants'; + } + + @override + String get noMoreChatsFound => 'Aucune autre discussion trouvée...'; + + @override + String get noChatsFoundHere => + 'Aucune discussion trouvée. Utilisez le bouton ci-dessous pour commencer une nouvelle discussion. ⤵️'; + + @override + String get joinedChats => 'Discussions rejointes'; + + @override + String get unread => 'Non lu'; + + @override + String get space => 'Espace'; + + @override + String get spaces => 'Espaces'; + + @override + String get banFromChat => 'Bannir de la discussion'; + + @override + String get banned => 'Banni'; + + @override + String bannedUser(String username, String targetName) { + return '$username a banni $targetName'; + } + + @override + String get blockDevice => 'Bloquer l\'appareil'; + + @override + String get blocked => 'Bloqué'; + + @override + String get botMessages => 'Messages de bot'; + + @override + String get cancel => 'Annuler'; + + @override + String cantOpenUri(String uri) { + return 'Impossible d\'ouvrir l\'URI $uri'; + } + + @override + String get changeDeviceName => 'Modifier le nom de l\'appareil'; + + @override + String changedTheChatAvatar(String username) { + return '$username a changé l\'image de la discussion'; + } + + @override + String changedTheChatDescriptionTo(String username, String description) { + return '$username a changé la description de la discussion en : \'$description\''; + } + + @override + String changedTheChatNameTo(String username, String chatname) { + return '$username a renommé la discussion en : \'$chatname\''; + } + + @override + String changedTheChatPermissions(String username) { + return '$username a changé les permissions de la discussion'; + } + + @override + String changedTheDisplaynameTo(String username, String displayname) { + return '$username a changé son nom en : \'$displayname\''; + } + + @override + String changedTheGuestAccessRules(String username) { + return '$username a changé les règles d\'accès à la discussion pour les invités'; + } + + @override + String changedTheGuestAccessRulesTo(String username, String rules) { + return '$username a changé les règles d\'accès à la discussion pour les invités en : $rules'; + } + + @override + String changedTheHistoryVisibility(String username) { + return '$username a changé la visibilité de l\'historique de la discussion'; + } + + @override + String changedTheHistoryVisibilityTo(String username, String rules) { + return '$username a changé la visibilité de l\'historique de la discussion en : $rules'; + } + + @override + String changedTheJoinRules(String username) { + return '$username a changé les règles d\'accès à la discussion'; + } + + @override + String changedTheJoinRulesTo(String username, String joinRules) { + return '$username a changé les règles d\'accès à la discussion en : $joinRules'; + } + + @override + String changedTheProfileAvatar(String username) { + return '$username a changé son avatar'; + } + + @override + String changedTheRoomAliases(String username) { + return '$username a changé les adresses du salon'; + } + + @override + String changedTheRoomInvitationLink(String username) { + return '$username a changé le lien d\'invitation'; + } + + @override + String get changePassword => 'Changer de mot de passe'; + + @override + String get changeTheHomeserver => 'Changer le serveur d\'accueil'; + + @override + String get changeTheme => 'Changez votre style'; + + @override + String get changeTheNameOfTheGroup => 'Changer le nom du groupe'; + + @override + String get changeYourAvatar => 'Changer votre avatar'; + + @override + String get channelCorruptedDecryptError => 'Le chiffrement a été corrompu'; + + @override + String get chat => 'Discussion'; + + @override + String get yourChatBackupHasBeenSetUp => + 'Votre sauvegarde de la discussion a été mise en place.'; + + @override + String get chatBackup => 'Sauvegarde des discussions'; + + @override + String get chatBackupDescription => + 'Vos anciens messages sont sécurisés par une clé de récupération. Veillez à ne pas la perdre.'; + + @override + String get chatDetails => 'Détails de la discussion'; + + @override + String get chatHasBeenAddedToThisSpace => + 'La discussion a été ajoutée à cet espace'; + + @override + String get chats => 'Discussions'; + + @override + String get chooseAStrongPassword => 'Choisissez un mot de passe fort'; + + @override + String get clearArchive => 'Effacer les archives'; + + @override + String get close => 'Fermer'; + + @override + String get commandHint_markasdm => + 'Marquer comme salon de messages directs pour l\'identifiant Matrix indiqué'; + + @override + String get commandHint_markasgroup => 'Marquer comme groupe'; + + @override + String get commandHint_ban => + 'Bannir l\'utilisateur/trice donné(e) de ce salon'; + + @override + String get commandHint_clearcache => 'Vider le cache'; + + @override + String get commandHint_create => + 'Créer un groupe de discussion vide\nUtilisez --no-encryption pour désactiver le chiffrement'; + + @override + String get commandHint_discardsession => 'Abandonner la session'; + + @override + String get commandHint_dm => + 'Commencer une discussion directe\nUtilisez --no-encryption pour désactiver le chiffrement'; + + @override + String get commandHint_html => 'Envoyer du texte au format HTML'; + + @override + String get commandHint_invite => + 'Inviter l\'utilisateur/trice donné(e) dans ce salon'; + + @override + String get commandHint_join => 'Rejoindre le salon donné'; + + @override + String get commandHint_kick => + 'Supprime l\'utilisateur/trice donné(e) de ce salon'; + + @override + String get commandHint_leave => 'Quitter ce salon'; + + @override + String get commandHint_me => 'Décrivez-vous'; + + @override + String get commandHint_myroomavatar => + 'Définir votre image pour ce salon (par mxc-uri)'; + + @override + String get commandHint_myroomnick => + 'Définir votre nom d\'affichage pour ce salon'; + + @override + String get commandHint_op => + 'Définir le niveau de puissance de l\'utilisateur/trice donné(e) (par défaut : 50)'; + + @override + String get commandHint_plain => 'Envoyer du texte non formaté'; + + @override + String get commandHint_react => 'Envoyer une réponse en tant que réaction'; + + @override + String get commandHint_send => 'Envoyer du texte'; + + @override + String get commandHint_unban => + 'Débannir l\'utilisateur/trice donné(e) de ce salon'; + + @override + String get commandInvalid => 'Commande invalide'; + + @override + String commandMissing(String command) { + return '$command n\'est pas une commande.'; + } + + @override + String get compareEmojiMatch => 'Veuillez comparer les émojis'; + + @override + String get compareNumbersMatch => 'Veuillez comparer les chiffres'; + + @override + String get configureChat => 'Configurer la discussion'; + + @override + String get confirm => 'Confirmer'; + + @override + String get connect => 'Se connecter'; + + @override + String get contactHasBeenInvitedToTheGroup => + 'Le contact a été invité au groupe'; + + @override + String get containsDisplayName => 'Contient un nom d\'affichage'; + + @override + String get containsUserName => 'Contient un nom d\'utilisateur·ice'; + + @override + String get contentHasBeenReported => + 'Le contenu a été signalé aux administrateurs du serveur'; + + @override + String get copiedToClipboard => 'Copié dans le presse-papier'; + + @override + String get copy => 'Copier'; + + @override + String get copyToClipboard => 'Copier dans le presse-papiers'; + + @override + String couldNotDecryptMessage(String error) { + return 'Impossible de déchiffrer le message : $error'; + } + + @override + String countParticipants(int count) { + return '$count participant(s)'; + } + + @override + String get create => 'Créer'; + + @override + String createdTheChat(String username) { + return '💬 $username a créé la discussion'; + } + + @override + String get createGroup => 'Créer un groupe'; + + @override + String get createNewSpace => 'Nouvel espace'; + + @override + String get currentlyActive => 'Actif en ce moment'; + + @override + String get darkTheme => 'Sombre'; + + @override + String dateAndTimeOfDay(String date, String timeOfDay) { + return '$date, $timeOfDay'; + } + + @override + String dateWithoutYear(String month, String day) { + return '$day/$month'; + } + + @override + String dateWithYear(String year, String month, String day) { + return '$day/$month/$year'; + } + + @override + String get deactivateAccountWarning => + 'Cette opération va désactiver votre compte. Une fois cette action effectuée, aucun retour en arrière n\'est possible ! Êtes-vous sûr·e ?'; + + @override + String get defaultPermissionLevel => + 'Niveau d\'autorisation par défaut pour les arrivants'; + + @override + String get delete => 'Supprimer'; + + @override + String get deleteAccount => 'Supprimer le compte'; + + @override + String get deleteMessage => 'Supprimer le message'; + + @override + String get device => 'Appareil'; + + @override + String get deviceId => 'Identifiant de l\'appareil'; + + @override + String get devices => 'Appareils'; + + @override + String get directChats => 'Discussions directes'; + + @override + String get allRooms => 'Tous les groupes de discussion'; + + @override + String get displaynameHasBeenChanged => 'Renommage effectué'; + + @override + String get downloadFile => 'Télécharger le fichier'; + + @override + String get edit => 'Modifier'; + + @override + String get editBlockedServers => 'Modifier les serveurs bloqués'; + + @override + String get chatPermissions => 'Permissions du salon'; + + @override + String get editDisplayname => 'Changer de nom d\'affichage'; + + @override + String get editRoomAliases => 'Modifier les adresses du salon'; + + @override + String get editRoomAvatar => 'Modifier l\'avatar du salon'; + + @override + String get emoteExists => 'Cette émoticône existe déjà !'; + + @override + String get emoteInvalid => 'Raccourci d\'émoticône invalide !'; + + @override + String get emoteKeyboardNoRecents => + 'Les émoticônes récemment utilisées apparaîtront ici...'; + + @override + String get emotePacks => 'Packs d\'émoticônes pour le salon'; + + @override + String get emoteSettings => 'Paramètre des émoticônes'; + + @override + String get globalChatId => 'Identifiant global de la discussion'; + + @override + String get accessAndVisibility => 'Accès et visibilité'; + + @override + String get accessAndVisibilityDescription => + 'Qui est autorisé à rejoindre cette discussion et comment la discussion peut être découverte.'; + + @override + String get calls => 'Appels'; + + @override + String get customEmojisAndStickers => + 'Émoticônes et autocollants personnalisés'; + + @override + String get customEmojisAndStickersBody => + 'Ajoutez ou partagez des émoticônes ou autocollants personnalisés qui peuvent être utilisés dans n\'importe quelle discussion.'; + + @override + String get emoteShortcode => 'Raccourci de l\'émoticône'; + + @override + String get emoteWarnNeedToPick => + 'Vous devez sélectionner un raccourci d\'émoticône et une image !'; + + @override + String get emptyChat => 'Discussion vide'; + + @override + String get enableEmotesGlobally => + 'Activer globalement le pack d\'émoticônes'; + + @override + String get enableEncryption => 'Activer le chiffrement'; + + @override + String get enableEncryptionWarning => + 'Vous ne pourrez plus désactiver le chiffrement. Êtes-vous sûr(e) ?'; + + @override + String get encrypted => 'Chiffré'; + + @override + String get encryption => 'Chiffrement'; + + @override + String get encryptionNotEnabled => 'Le chiffrement n\'est pas activé'; + + @override + String endedTheCall(String senderName) { + return '$senderName a mis fin à l\'appel'; + } + + @override + String get enterAnEmailAddress => 'Saisissez une adresse de courriel'; + + @override + String get homeserver => 'Serveur d\'accueil'; + + @override + String get enterYourHomeserver => 'Renseignez votre serveur d\'accueil'; + + @override + String errorObtainingLocation(String error) { + return 'Erreur lors de l\'obtention de la localisation : $error'; + } + + @override + String get everythingReady => 'Tout est prêt !'; + + @override + String get extremeOffensive => 'Extrêmement offensant'; + + @override + String get fileName => 'Nom du ficher'; + + @override + String get fluffychat => 'Extera'; + + @override + String get fontSize => 'Taille de la police'; + + @override + String get forward => 'Transférer'; + + @override + String get fromJoining => 'À partir de l\'entrée dans le salon'; + + @override + String get fromTheInvitation => 'À partir de l\'invitation'; + + @override + String get goToTheNewRoom => 'Aller dans le nouveau salon'; + + @override + String get group => 'Groupe'; + + @override + String get chatDescription => 'Description de la discussion'; + + @override + String get chatDescriptionHasBeenChanged => + 'La description du salon a changé'; + + @override + String get groupIsPublic => 'Le groupe est public'; + + @override + String get groups => 'Groupes'; + + @override + String groupWith(String displayname) { + return 'Groupe avec $displayname'; + } + + @override + String get guestsAreForbidden => 'Les invités ne peuvent pas rejoindre'; + + @override + String get guestsCanJoin => 'Les invités peuvent rejoindre'; + + @override + String hasWithdrawnTheInvitationFor(String username, String targetName) { + return '$username a annulé l\'invitation de $targetName'; + } + + @override + String get help => 'Aide'; + + @override + String get hideRedactedEvents => 'Cacher les évènements supprimés'; + + @override + String get hideRedactedMessages => 'Cacher les messages édités'; + + @override + String get hideRedactedMessagesBody => + 'Si quelqu\'un modifie un message, celui-ci ne sera plus visible dans la discussion.'; + + @override + String get hideInvalidOrUnknownMessageFormats => + 'Masquer les formats de message invalides ou inconnus'; + + @override + String get howOffensiveIsThisContent => + 'À quel point ce contenu est-il offensant ?'; + + @override + String get id => 'Identifiant'; + + @override + String get identity => 'Identité'; + + @override + String get block => 'Bloquer'; + + @override + String get blockedUsers => 'Utilisateurs/trices bloqués'; + + @override + String get blockListDescription => + 'Vous pouvez bloquer des utilisateurs/trices qui vous dérangent. Vous ne pourrez plus recevoir aucun message ou invitation à un salon d\'utilisateurs/trices figurant sur votre liste de blocage personnelle.'; + + @override + String get blockUsername => 'Ignorer le nom d\'utilisateur/trice'; + + @override + String get iHaveClickedOnLink => 'J\'ai cliqué sur le lien'; + + @override + String get incorrectPassphraseOrKey => + 'Phrase de passe ou clé de récupération incorrecte'; + + @override + String get inoffensive => 'Non offensant'; + + @override + String get inviteContact => 'Inviter un contact'; + + @override + String inviteContactToGroupQuestion(Object contact, Object groupName) { + return 'Voulez-vous inviter $contact au salon \"$groupName\" ?'; + } + + @override + String inviteContactToGroup(String groupName) { + return 'Inviter un contact dans $groupName'; + } + + @override + String get noChatDescriptionYet => + 'Aucune description de discussion n\'a encore été créée.'; + + @override + String get tryAgain => 'Nouvelle tentative'; + + @override + String get invalidServerName => 'Nom de serveur invalide'; + + @override + String get invited => 'Invité·e'; + + @override + String get redactMessageDescription => + 'Le message sera modifié pour tous les participants de cette conversation. Il n\'est pas possible de revenir en arrière.'; + + @override + String get optionalRedactReason => + '(Facultatif) Raison de la modification de ce message...'; + + @override + String invitedUser(String username, String targetName) { + return '📩 $username a invité $targetName'; + } + + @override + String get invitedUsersOnly => 'Uniquement les utilisateur·ices invité·es'; + + @override + String get inviteForMe => 'Inviter pour moi'; + + @override + String inviteText(String username, String link) { + return '$username vous a invité·e sur Extera.\n1. Visiter fluffychat.im et installer l\'application\n2. Inscrivez-vous ou connectez-vous\n3. Ouvrez le lien d\'invitation :\n$link'; + } + + @override + String get isTyping => 'est en train d\'écrire…'; + + @override + String joinedTheChat(String username) { + return '👋 $username a rejoint la discussion'; + } + + @override + String get joinRoom => 'Rejoindre le salon'; + + @override + String kicked(String username, String targetName) { + return '👞 $username a expulsé $targetName'; + } + + @override + String kickedAndBanned(String username, String targetName) { + return '🙅 $username a expulsé et banni $targetName'; + } + + @override + String get kickFromChat => 'Expulser de la discussion'; + + @override + String lastActiveAgo(String localizedTimeShort) { + return 'Vu·e pour la dernière fois : $localizedTimeShort'; + } + + @override + String get leave => 'Partir'; + + @override + String get leftTheChat => 'A quitté la discussion'; + + @override + String get license => 'Licence'; + + @override + String get lightTheme => 'Clair'; + + @override + String loadCountMoreParticipants(int count) { + return 'Charger $count participant·es de plus'; + } + + @override + String get dehydrate => 'Exporter la session et effacer l\'appareil'; + + @override + String get dehydrateWarning => + 'Cette action ne peut pas être annulée. Assurez-vous d\'enregistrer convenablement le fichier de sauvegarde.'; + + @override + String get dehydrateTor => 'Utilisateurs/trices de TOR : Exporter la session'; + + @override + String get dehydrateTorLong => + 'Pour les utilisateurs/trices de TOR, il est recommandé d\'exporter la session avant de fermer la fenêtre.'; + + @override + String get hydrateTor => + 'Utilisateurs/trices de TOR : Importer une session exportée'; + + @override + String get hydrateTorLong => + 'Vous avez exporté votre session la dernière fois sur TOR ? Importez-la rapidement et continuez à discuter.'; + + @override + String get hydrate => 'Restaurer à partir du fichier de sauvegarde'; + + @override + String get loadingPleaseWait => 'Chargement… Veuillez patienter.'; + + @override + String get loadMore => 'Charger plus…'; + + @override + String get locationDisabledNotice => + 'Les services de localisation sont désactivés. Il est nécessaire de les activer avant de pouvoir partager votre localisation.'; + + @override + String get locationPermissionDeniedNotice => + 'L\'application n\'a pas la permission d\'accéder à votre localisation. Merci de l\'accorder afin de pouvoir partager votre localisation.'; + + @override + String get login => 'Se connecter'; + + @override + String logInTo(String homeserver) { + return 'Se connecter à $homeserver'; + } + + @override + String get logout => 'Se déconnecter'; + + @override + String get memberChanges => 'Changements de membres'; + + @override + String get mention => 'Mentionner'; + + @override + String get messages => 'Messages'; + + @override + String get messagesStyle => 'Messages :'; + + @override + String get moderator => 'Modérateur·rice'; + + @override + String get muteChat => 'Mettre la discussion en sourdine'; + + @override + String get needPantalaimonWarning => + 'Pour l\'instant, vous avez besoin de Pantalaimon pour utiliser le chiffrement de bout en bout.'; + + @override + String get newChat => 'Nouvelle discussion'; + + @override + String get newMessageInFluffyChat => '💬 Nouveau message dans Extera'; + + @override + String get newVerificationRequest => 'Nouvelle demande de vérification !'; + + @override + String get next => 'Suivant'; + + @override + String get no => 'Non'; + + @override + String get noConnectionToTheServer => 'Aucune connexion au serveur'; + + @override + String get noEmotesFound => 'Aucune émoticône trouvée. 😕'; + + @override + String get noEncryptionForPublicRooms => + 'Vous pouvez activer le chiffrement seulement quand le salon n\'est plus accessible au public.'; + + @override + String get noGoogleServicesWarning => + 'Firebase Cloud Messaging ne semble pas être disponible sur votre appareil. Pour continuer à recevoir des notifications poussées, nous vous recommandons d\'installer ntfy. Avec ntfy ou un autre fournisseur Unified Push, vous pouvez recevoir des notifications poussées de manière sécurisée. Vous pouvez télécharger ntfy sur le PlayStore ou sur F-Droid.'; + + @override + String noMatrixServer(String server1, String server2) { + return '$server1 n\'est pas un serveur Matrix, souhaitez-vous utiliser $server2 à la place ?'; + } + + @override + String get shareInviteLink => 'Partager un lien d\'invitation'; + + @override + String get scanQrCode => 'Scanner un code QR'; + + @override + String get none => 'Aucun'; + + @override + String get noPasswordRecoveryDescription => + 'Vous n\'avez pas encore ajouté de moyen pour récupérer votre mot de passe.'; + + @override + String get noPermission => 'Aucune permission'; + + @override + String get noRoomsFound => 'Aucun salon trouvé…'; + + @override + String get notifications => 'Notifications'; + + @override + String get notificationsEnabledForThisAccount => + 'Notifications activées pour ce compte'; + + @override + String numUsersTyping(int count) { + return '$count utilisateur·ices écrivent…'; + } + + @override + String get obtainingLocation => 'Obtention de la localisation…'; + + @override + String get offensive => 'Offensant'; + + @override + String get offline => 'Hors ligne'; + + @override + String get ok => 'Valider'; + + @override + String get online => 'En ligne'; + + @override + String get onlineKeyBackupEnabled => + 'La sauvegarde en ligne des clés est activée'; + + @override + String get oopsPushError => + 'Oups ! Une erreur s\'est malheureusement produite lors du réglage des notifications.'; + + @override + String get oopsSomethingWentWrong => 'Oups, un problème est survenu…'; + + @override + String get openAppToReadMessages => + 'Ouvrez l\'application pour lire le message'; + + @override + String get openCamera => 'Ouvrir l\'appareil photo'; + + @override + String get openVideoCamera => 'Ouvrir la caméra pour une vidéo'; + + @override + String get oneClientLoggedOut => 'Un de vos clients a été déconnecté'; + + @override + String get addAccount => 'Ajouter un compte'; + + @override + String get editBundlesForAccount => 'Modifier les groupes pour ce compte'; + + @override + String get addToBundle => 'Ajouter au groupe'; + + @override + String get removeFromBundle => 'Retirer de ce groupe'; + + @override + String get bundleName => 'Nom du groupe'; + + @override + String get enableMultiAccounts => + '(BETA) Activer les comptes multiples sur cet appareil'; + + @override + String get openInMaps => 'Ouvrir dans maps'; + + @override + String get link => 'Lien'; + + @override + String get serverRequiresEmail => + 'Ce serveur doit valider votre adresse électronique pour l\'inscription.'; + + @override + String get or => 'Ou'; + + @override + String get participant => 'Participant(e)'; + + @override + String get passphraseOrKey => 'Phrase de passe ou clé de récupération'; + + @override + String get password => 'Mot de passe'; + + @override + String get passwordForgotten => 'Mot de passe oublié'; + + @override + String get passwordHasBeenChanged => 'Le mot de passe a été modifié'; + + @override + String get hideMemberChangesInPublicChats => + 'Masquer les modifications de membres dans les discussions publiques'; + + @override + String get hideMemberChangesInPublicChatsBody => + 'Ne pas afficher dans la chronologie de la discussion si quelqu\'un rejoint ou quitte une discussion publique afin d\'améliorer la lisibilité.'; + + @override + String get overview => 'Aperçu'; + + @override + String get notifyMeFor => 'Me notifier pour'; + + @override + String get passwordRecoverySettings => + 'Paramètres de récupération de mot de passe'; + + @override + String get passwordRecovery => 'Récupération du mot de passe'; + + @override + String get people => 'Personnes'; + + @override + String get pickImage => 'Choisir une image'; + + @override + String get pin => 'Épingler'; + + @override + String play(String fileName) { + return 'Lire $fileName'; + } + + @override + String get pleaseChoose => 'Veuillez choisir'; + + @override + String get pleaseChooseAPasscode => 'Veuillez choisir un code d’accès'; + + @override + String get pleaseClickOnLink => + 'Veuillez cliquer sur le lien contenu dans le courriel puis continuez.'; + + @override + String get pleaseEnter4Digits => + 'Veuillez saisir 4 chiffres ou laisser vide pour désactiver le verrouillage de l’application.'; + + @override + String get pleaseEnterRecoveryKey => + 'Veuillez saisir votre clé de récupération :'; + + @override + String get pleaseEnterYourPassword => 'Renseignez votre mot de passe'; + + @override + String get pleaseEnterYourPin => 'Veuillez saisir votre code PIN'; + + @override + String get pleaseEnterYourUsername => + 'Renseignez votre nom d\'utilisateur·ice'; + + @override + String get pleaseFollowInstructionsOnWeb => + 'Veuillez suivre les instructions sur le site et appuyer sur Suivant.'; + + @override + String get privacy => 'Vie privée'; + + @override + String get publicRooms => 'Salons publics'; + + @override + String get pushRules => 'Règles de notifications'; + + @override + String get reason => 'Motif'; + + @override + String get recording => 'Enregistrement'; + + @override + String redactedBy(String username) { + return 'Modifié par $username'; + } + + @override + String get directChat => 'Discussion directe'; + + @override + String redactedByBecause(String username, String reason) { + return 'Modifié par $username car : \"$reason\"'; + } + + @override + String redactedAnEvent(String username) { + return '$username a supprimé un évènement'; + } + + @override + String get redactMessage => 'Supprimer un message'; + + @override + String get register => 'S\'inscrire'; + + @override + String get reject => 'Refuser'; + + @override + String rejectedTheInvitation(String username) { + return '$username a refusé l\'invitation'; + } + + @override + String get rejoin => 'Rejoindre de nouveau'; + + @override + String get removeAllOtherDevices => 'Supprimer tous les autres appareils'; + + @override + String removedBy(String username) { + return 'Supprimé par $username'; + } + + @override + String get removeDevice => 'Supprimer l\'appareil'; + + @override + String get unbanFromChat => 'Débannissement de la discussion'; + + @override + String get removeYourAvatar => 'Supprimer votre avatar'; + + @override + String get replaceRoomWithNewerVersion => + 'Remplacer le salon par une nouvelle version'; + + @override + String get reply => 'Répondre'; + + @override + String get reportMessage => 'Signaler un message'; + + @override + String get translateMessage => 'Translate message'; + + @override + String get translatedMessage => 'Translated message'; + + @override + String get errorTranslatingMessage => + 'An error has occured while translating the message.'; + + @override + String get recoverMessage => 'Recover message'; + + @override + String get recoveredMessage => 'Recovered message'; + + @override + String get errorRecoveringMessage => + 'An error has occured while recovering the message.'; + + @override + String get errorRecoveringMessageNoAdmin => + 'This feature is available on Synapse homeservers only for adminstrators.'; + + @override + String get requestPermission => 'Demander la permission'; + + @override + String get roomHasBeenUpgraded => 'Le salon a été mis à niveau'; + + @override + String get roomVersion => 'Version du salon'; + + @override + String get saveFile => 'Enregistrer le fichier'; + + @override + String get retry => 'Retry'; + + @override + String get search => 'Rechercher'; + + @override + String get security => 'Sécurité'; + + @override + String get recoveryKey => 'Clé de récupération'; + + @override + String get recoveryKeyLost => 'Clé de récupération perdue ?'; + + @override + String seenByUser(String username) { + return 'Vu par $username'; + } + + @override + String get send => 'Envoyer'; + + @override + String get sendAMessage => 'Envoyer un message'; + + @override + String get sendAsText => 'Envoyer un texte'; + + @override + String get sendAudio => 'Envoyer un fichier audio'; + + @override + String get sendFile => 'Envoyer un fichier'; + + @override + String get sendImage => 'Envoyer une image'; + + @override + String sendImages(int count) { + return 'Send $count image'; + } + + @override + String get sendMessages => 'Envoyer des messages'; + + @override + String get sendOriginal => 'Envoyer le fichier original'; + + @override + String get sendSticker => 'Envoyer un autocollant'; + + @override + String get sendVideo => 'Envoyer une vidéo'; + + @override + String sentAFile(String username) { + return '📁 $username a envoyé un fichier'; + } + + @override + String sentAnAudio(String username) { + return '🎤 $username a envoyé un fichier audio'; + } + + @override + String sentAPicture(String username) { + return '🖼️ $username a envoyé une image'; + } + + @override + String sentASticker(String username) { + return '😊 $username a envoyé un autocollant'; + } + + @override + String sentAVideo(String username) { + return '🎥 $username a envoyé une vidéo'; + } + + @override + String sentCallInformations(String senderName) { + return '$senderName a envoyé des informations sur l\'appel'; + } + + @override + String get separateChatTypes => + 'Séparer les discussions directes et les groupes'; + + @override + String get setAsCanonicalAlias => 'Définir comme adresse principale'; + + @override + String get setCustomEmotes => 'Définir des émoticônes personnalisées'; + + @override + String get setChatDescription => 'Définir la description de la discussion'; + + @override + String get setInvitationLink => 'Créer un lien d\'invitation'; + + @override + String get setPermissionsLevel => 'Définir le niveau de permissions'; + + @override + String get setStatus => 'Définir le statut'; + + @override + String get settings => 'Paramètres'; + + @override + String get share => 'Partager'; + + @override + String sharedTheLocation(String username) { + return '$username a partagé sa position'; + } + + @override + String get shareLocation => 'Partager la localisation'; + + @override + String get showPassword => 'Afficher le mot de passe'; + + @override + String get presenceStyle => 'Statut :'; + + @override + String get hideAvatarsInInvites => 'Hide avatars in invites'; + + @override + String get hideAvatarsInInvitesDescription => + 'Do not show room avatars in invites'; + + @override + String get presencesToggle => + 'Afficher les messages de statut des autres utilisateurs/trices'; + + @override + String get pureBlackToggle => 'Pure Black'; + + @override + String get singlesignon => 'Authentification unique'; + + @override + String get skip => 'Ignorer'; + + @override + String get sourceCode => 'Code source'; + + @override + String get spaceIsPublic => 'L\'espace est public'; + + @override + String get spaceName => 'Nom de l\'espace'; + + @override + String startedACall(String senderName) { + return '$senderName a démarré un appel'; + } + + @override + String get startFirstChat => 'Commencez votre première discussion'; + + @override + String get status => 'Statut'; + + @override + String get statusExampleMessage => 'Comment allez-vous aujourd\'hui ?'; + + @override + String get submit => 'Soumettre'; + + @override + String get synchronizingPleaseWait => + 'Synchronisation... Veuillez patienter.'; + + @override + String synchronizingPleaseWaitCounter(String percentage) { + return ' Synchronisation… ($percentage %)'; + } + + @override + String get systemTheme => 'Système'; + + @override + String get theyDontMatch => 'Elles ne correspondent pas'; + + @override + String get theyMatch => 'Elles correspondent'; + + @override + String get title => 'Extera'; + + @override + String get toggleFavorite => 'Activer/désactiver en favori'; + + @override + String get toggleMuted => 'Activer/désactiver la sourdine'; + + @override + String get toggleUnread => 'Marquer comme lu / non lu'; + + @override + String get tooManyRequestsWarning => + 'Trop de requêtes. Veuillez réessayer plus tard !'; + + @override + String get transferFromAnotherDevice => + 'Transfert à partir d\'un autre appareil'; + + @override + String get tryToSendAgain => 'Retenter l\'envoi'; + + @override + String get unavailable => 'Indisponible'; + + @override + String unbannedUser(String username, String targetName) { + return '$username a annulé le bannissement de $targetName'; + } + + @override + String get unblockDevice => 'Retirer le blocage sur l\'appareil'; + + @override + String get unknownDevice => 'Appareil inconnu'; + + @override + String get unknownEncryptionAlgorithm => 'Algorithme de chiffrement inconnu'; + + @override + String unknownEvent(String type) { + return 'Événement de type inconnu : \'$type\''; + } + + @override + String get unmuteChat => 'Retirer la sourdine de la discussion'; + + @override + String get unpin => 'Désépingler'; + + @override + String unreadChats(int unreadCount) { + String _temp0 = intl.Intl.pluralLogic( + unreadCount, + locale: localeName, + other: '$unreadCount discussions non lues', + one: '1 discussion non lue', + ); + return '$_temp0'; + } + + @override + String userAndOthersAreTyping(String username, int count) { + return '$username et $count autres sont en train d\'écrire…'; + } + + @override + String userAndUserAreTyping(String username, String username2) { + return '$username et $username2 sont en train d\'écrire…'; + } + + @override + String userIsTyping(String username) { + return '$username est en train d\'écrire…'; + } + + @override + String userLeftTheChat(String username) { + return '🚪 $username a quitté la discussion'; + } + + @override + String get username => 'Nom d\'utilisateur·ice'; + + @override + String userSentUnknownEvent(String username, String type) { + return '$username a envoyé un évènement de type $type'; + } + + @override + String get unverified => 'Non vérifié'; + + @override + String get verified => 'Vérifié'; + + @override + String get verify => 'Vérifier'; + + @override + String get verifyStart => 'Commencer la vérification'; + + @override + String get verifySuccess => 'La vérification a été effectuée avec succès !'; + + @override + String get verifyTitle => 'Vérification de l\'autre compte'; + + @override + String get videoCall => 'Appel vidéo'; + + @override + String get visibilityOfTheChatHistory => + 'Visibilité de l\'historique de la discussion'; + + @override + String get visibleForAllParticipants => + 'Visible pour tous les participant·es'; + + @override + String get visibleForEveryone => 'Visible pour tout le monde'; + + @override + String get voiceMessage => 'Message vocal'; + + @override + String get waitingPartnerAcceptRequest => + 'En attente de l\'acceptation de la demande par le partenaire…'; + + @override + String get waitingPartnerEmoji => + 'En attente de l\'acceptation de l\'émoji par le partenaire…'; + + @override + String get waitingPartnerNumbers => + 'En attente de l\'acceptation des nombres par le partenaire…'; + + @override + String get wallpaper => 'Image de fond :'; + + @override + String get warning => 'Attention !'; + + @override + String get weSentYouAnEmail => 'Nous vous avons envoyé un courriel'; + + @override + String get whoCanPerformWhichAction => 'Qui peut faire quelle action'; + + @override + String get whoIsAllowedToJoinThisGroup => + 'Qui est autorisé·e à rejoindre ce groupe'; + + @override + String get whyDoYouWantToReportThis => 'Pourquoi voulez-vous le signaler ?'; + + @override + String get wipeChatBackup => + 'Effacer la sauvegarde de votre discussion pour créer une nouvelle clé de récupération ?'; + + @override + String get withTheseAddressesRecoveryDescription => + 'Grâce à ces adresses, vous pouvez récupérer votre mot de passe si vous en avez besoin.'; + + @override + String get writeAMessage => 'Écrivez un message…'; + + @override + String get yes => 'Oui'; + + @override + String get you => 'Vous'; + + @override + String get youAreNoLongerParticipatingInThisChat => + 'Vous ne participez plus à cette discussion'; + + @override + String get youHaveBeenBannedFromThisChat => + 'Vous avez été banni·e de cette discussion'; + + @override + String get yourPublicKey => 'Votre clé publique'; + + @override + String get messageInfo => 'Informations sur le message'; + + @override + String get time => 'Heure'; + + @override + String get messageType => 'Type de message'; + + @override + String get sender => 'Expéditeur/trice'; + + @override + String get openGallery => 'Ouvrir dans la Galerie'; + + @override + String get removeFromSpace => 'Supprimer de l’espace'; + + @override + String get addToSpaceDescription => + 'Sélectionnez un espace pour y ajouter cette discussion.'; + + @override + String get start => 'Commencer'; + + @override + String get pleaseEnterRecoveryKeyDescription => + 'Pour déverrouiller vos anciens messages, veuillez entrer votre clé de récupération qui a été générée lors d\'une session précédente. Votre clé de récupération n\'est PAS votre mot de passe.'; + + @override + String get publish => 'Publier'; + + @override + String videoWithSize(String size) { + return 'Vidéo ($size)'; + } + + @override + String get openChat => 'Ouvrir la discussion'; + + @override + String get markAsRead => 'Marquer comme lu'; + + @override + String get reportUser => 'Signaler l\'utilisateur/trice'; + + @override + String get dismiss => 'Rejeter'; + + @override + String reactedWith(String sender, String reaction) { + return '$sender a réagi avec $reaction'; + } + + @override + String get pinMessage => 'Épingler au salon'; + + @override + String get confirmEventUnpin => + 'Voulez-vous vraiment désépingler définitivement l\'événement ?'; + + @override + String get emojis => 'Émojis'; + + @override + String get placeCall => 'Passer un appel'; + + @override + String get voiceCall => 'Appel vocal'; + + @override + String get unsupportedAndroidVersion => + 'Version d\'Android non prise en charge'; + + @override + String get unsupportedAndroidVersionLong => + 'Cette fonctionnalité nécessite une nouvelle version d\'Android. Veuillez vérifier les mises à jour ou la prise en charge de Lineage OS.'; + + @override + String get videoCallsBetaWarning => + 'Veuillez noter que les appels vidéo sont actuellement en version bêta. Ils peuvent ne pas fonctionner comme prévu ou ne oas fonctionner du tout sur toutes les plateformes.'; + + @override + String get experimentalVideoCalls => 'Appels vidéo expérimentaux'; + + @override + String get emailOrUsername => 'Courriel ou identifiant'; + + @override + String get indexedDbErrorTitle => 'Problèmes relatifs au mode privé'; + + @override + String get indexedDbErrorLong => + 'Le stockage des messages n\'est malheureusement pas activé par défaut en mode privé.\nVeuillez consulter :\n - about:config\n - Définir dom.indexedDB.privateBrowsing.enabled à « vrai ».\nSinon, il n\'est pas possible d\'exécuter Extera.'; + + @override + String switchToAccount(String number) { + return 'Passer au compte $number'; + } + + @override + String get nextAccount => 'Compte suivant'; + + @override + String get previousAccount => 'Compte précédent'; + + @override + String get addWidget => 'Ajouter un widget'; + + @override + String get widgetVideo => 'Vidéo'; + + @override + String get widgetEtherpad => 'Note textuelle'; + + @override + String get widgetJitsi => 'Jitsi Meet'; + + @override + String get widgetCustom => 'Personnalisé'; + + @override + String get widgetName => 'Nom'; + + @override + String get widgetUrlError => 'Ceci n\'est pas un lien valide.'; + + @override + String get widgetNameError => 'Veuillez fournir un nom d\'affichage.'; + + @override + String get errorAddingWidget => 'Erreur lors de l\'ajout du widget.'; + + @override + String get youRejectedTheInvitation => 'Vous avez rejeté l\'invitation'; + + @override + String get youJoinedTheChat => 'Vous avez rejoint la discussion'; + + @override + String get youAcceptedTheInvitation => '👍 Vous avez accepté l\'invitation'; + + @override + String youBannedUser(String user) { + return 'Vous avez banni $user'; + } + + @override + String youHaveWithdrawnTheInvitationFor(String user) { + return 'Vous avez retiré l\'invitation pour $user'; + } + + @override + String youInvitedToBy(String alias) { + return '📩 Vous avez été invité par lien à :\n$alias'; + } + + @override + String youInvitedBy(String user) { + return '📩 Vous avez été invité par $user'; + } + + @override + String invitedBy(String user) { + return '📩 Invitation par $user'; + } + + @override + String youInvitedUser(String user) { + return '📩 Vous avez invité $user'; + } + + @override + String youKicked(String user) { + return '👞 Vous avez dégagé $user'; + } + + @override + String youKickedAndBanned(String user) { + return '🙅 Vous avez dégagé et banni $user'; + } + + @override + String youUnbannedUser(String user) { + return 'Vous avez débanni $user'; + } + + @override + String hasKnocked(String user) { + return '🚪 $user a frappé'; + } + + @override + String get usersMustKnock => 'Les utilisateurs/trices doivent frapper'; + + @override + String get noOneCanJoin => 'Personne ne peut rejoindre'; + + @override + String userWouldLikeToChangeTheChat(String user) { + return '$user souhaite rejoindre la discussion.'; + } + + @override + String get noPublicLinkHasBeenCreatedYet => + 'Aucun lien public n\'a encore été crée'; + + @override + String get knock => 'Frapper à la porte'; + + @override + String get users => 'Utilisateurs/trices'; + + @override + String get unlockOldMessages => 'Déverrouiller les anciens messages'; + + @override + String get storeInSecureStorageDescription => + 'Stocker la clé de récupération dans un espace sécurisé de cet appareil.'; + + @override + String get saveKeyManuallyDescription => + 'Enregistrer cette clé manuellement en déclenchant la boîte de dialogue de partage du système ou le presse-papiers.'; + + @override + String get storeInAndroidKeystore => 'Stocker dans Android KeyStore'; + + @override + String get storeInAppleKeyChain => 'Stocker dans Apple KeyChain'; + + @override + String get storeSecurlyOnThisDevice => + 'Stocker de manière sécurisé sur cet appareil'; + + @override + String countFiles(int count) { + return '$count fichiers'; + } + + @override + String get user => 'Utilisateur/trice'; + + @override + String get custom => 'Personnalisé'; + + @override + String get foregroundServiceRunning => + 'Cette notification s’affiche lorsque le service au premier plan est en cours d’exécution.'; + + @override + String get screenSharingTitle => 'Partage d\'écran'; + + @override + String get screenSharingDetail => 'Vous partagez votre écran dans FuffyChat'; + + @override + String get callingPermissions => 'Permissions d\'appel'; + + @override + String get callingAccount => 'Compte d\'appel'; + + @override + String get callingAccountDetails => + 'Permet à Extera d\'utiliser l\'application de numérotation native d\'Android.'; + + @override + String get appearOnTop => 'Apparaître en haut'; + + @override + String get appearOnTopDetails => + 'Permet à l\'application d\'apparaître en haut de l\'écran (non nécessaire si vous avez déjà configuré Fluffychat comme compte d\'appel)'; + + @override + String get otherCallingPermissions => + 'Microphone, caméra et autres autorisations de Extera'; + + @override + String get whyIsThisMessageEncrypted => + 'Pourquoi ce message est-il illisible ?'; + + @override + String get noKeyForThisMessage => + 'Cela peut se produire si le message a été envoyé avant que vous ne vous soyez connecté à votre compte sur cet appareil.\n\nIl est également possible que l\'expéditeur ait bloqué votre appareil ou qu\'un problème de connexion Internet se soit produit.\n\nÊtes-vous capable de lire le message sur une autre session ? Vous pouvez alors transférer le message à partir de celle-ci ! Allez dans Paramètres > Appareils et assurez-vous que vos appareils se sont vérifiés mutuellement. Lorsque vous ouvrirez le salon la fois suivante et que les deux sessions seront au premier plan, les clés seront transmises automatiquement.\n\nVous ne voulez pas perdre les clés en vous déconnectant ou en changeant d\'appareil ? Assurez-vous que vous avez activé la sauvegarde de la discussion dans les paramètres.'; + + @override + String get newGroup => 'Nouveau groupe'; + + @override + String get newSpace => 'Nouvel espace'; + + @override + String get enterSpace => 'Entrer dans l’espace'; + + @override + String get enterRoom => 'Entrer dans le salon'; + + @override + String get allSpaces => 'Tous les espaces'; + + @override + String numChats(String number) { + return '$number discussions'; + } + + @override + String get hideUnimportantStateEvents => + 'Masquer les événements d\'état sans importance'; + + @override + String get hidePresences => 'Cacher la liste des statuts ?'; + + @override + String get doNotShowAgain => 'Ne plus afficher'; + + @override + String wasDirectChatDisplayName(String oldDisplayName) { + return 'Discussion vide (était $oldDisplayName)'; + } + + @override + String get newSpaceDescription => + 'Les espaces vous permettent de consolider vos conversations et de construire des communautés privées ou publiques.'; + + @override + String get encryptThisChat => 'Chiffrer cette discussion'; + + @override + String get disableEncryptionWarning => + 'Pour des raisons de sécurité, vous ne pouvez pas désactiver le chiffrement dans une discussion s\'il a été activé avant.'; + + @override + String get sorryThatsNotPossible => 'Désolé, ce n\'est pas possible'; + + @override + String get deviceKeys => 'Clés de l’appareil :'; + + @override + String get reopenChat => 'Rouvrir la discussion'; + + @override + String get noBackupWarning => + 'Attention ! Sans l\'activation de la sauvegarde de la discussion, vous perdrez l\'accès à vos messages chiffrés. Il est fortement recommandé d\'activer la sauvegarde de la discussion avant de se déconnecter.'; + + @override + String get noOtherDevicesFound => 'Aucun autre appareil trouvé'; + + @override + String fileIsTooBigForServer(String max) { + return 'Impossible d\'envoyer ! Le serveur accepte uniquement les pièces jointes jusqu\'à $max.'; + } + + @override + String fileHasBeenSavedAt(String path) { + return 'Le fichier a été enregistré dans $path'; + } + + @override + String get jumpToLastReadMessage => 'Aller au dernier message lu'; + + @override + String get readUpToHere => 'Lisez jusqu’ici'; + + @override + String get jump => 'Sauter'; + + @override + String get openLinkInBrowser => 'Ouvrir le lien dans le navigateur'; + + @override + String get reportErrorDescription => + '😭 Oh non. Quelque chose s\'est mal passé. Si vous le souhaitez, vous pouvez signaler ce bogue aux développeurs.'; + + @override + String get report => 'signaler'; + + @override + String get signInWithPassword => 'Se connecter avec mot de passe'; + + @override + String get pleaseTryAgainLaterOrChooseDifferentServer => + 'Veuillez réessayer plus tard ou choisir un autre serveur.'; + + @override + String signInWith(String provider) { + return 'Se connecter avec $provider'; + } + + @override + String get profileNotFound => + 'Cet utilisateur/trice n\'a pu être trouvé sur le serveur. Peut-être est-ce un problème de connexion ou l\'utilisateur/trice n\'existe pas.'; + + @override + String get setTheme => 'Définir le thème :'; + + @override + String get setColorTheme => 'Définir la couleur du thème :'; + + @override + String get invite => 'Inviter'; + + @override + String get inviteGroupChat => '📨 Inviter à une discussion de groupe'; + + @override + String get invitePrivateChat => '📨 Inviter à une discussion privée'; + + @override + String get invalidInput => 'Entrée invalide !'; + + @override + String wrongPinEntered(int seconds) { + return 'Mauvais code PIN saisi ! Veuillez réessayer dans $seconds secondes...'; + } + + @override + String get pleaseEnterANumber => 'Veuillez saisir un nombre supérieur à 0'; + + @override + String get archiveRoomDescription => + 'La discussion sera déplacée dans les archives. Les autres utilisateurs/trices pourront voir que vous avez quitté la discussion.'; + + @override + String get roomUpgradeDescription => + 'La discussion sera alors recréé avec la nouvelle version de salon. Tous les participants seront informés qu\'ils doivent passer à la nouvelle discussion. Pour en savoir plus sur les versions des salons, consultez le site https://spec.matrix.org/latest/rooms/'; + + @override + String get removeDevicesDescription => + 'Vous serez déconnecté de cet appareil et ne pourrez plus recevoir de messages.'; + + @override + String get banUserDescription => + 'L\'utilisateur/trice sera banni de la discussion et ne pourra plus y accéder jusqu\'à ce qu\'il/elle soit débanni.'; + + @override + String get unbanUserDescription => + 'L\'utilisateur/trice pourra entrer à nouveau dans la discussion si il/elle le souhaite.'; + + @override + String get kickUserDescription => + 'L\'utilisateur/trice est expulsé de la discussion mais n\'est pas banni. Dans les discussions publiques, l\'utilisateur/trice peut revenir à tout moment.'; + + @override + String get makeAdminDescription => + 'Une fois que vous aurez nommé cet utilisateur/trice administrateur, vous ne pourrez peut-être plus annuler cette opération, car il disposera alors des mêmes autorisations que vous.'; + + @override + String get pushNotificationsNotAvailable => + 'Notifications poussées indisponibles'; + + @override + String get learnMore => 'En savoir plus'; + + @override + String get yourGlobalUserIdIs => + 'Votre identifiant utilisateur global est : '; + + @override + String noUsersFoundWithQuery(String query) { + return 'Malheureusement, aucun utilisateur/trice n\'a pu être trouvé avec \"$query\". Veuillez vérifier si vous n\'avez pas fait de faute de frappe.'; + } + + @override + String get knocking => 'Frapper'; + + @override + String chatCanBeDiscoveredViaSearchOnServer(String server) { + return 'La discussion peut être découverte via la recherche sur $server'; + } + + @override + String get searchChatsRooms => + 'Rechercher des #discussions, @utilisateurs/trices...'; + + @override + String get nothingFound => 'Rien n\'a été trouvé...'; + + @override + String get groupName => 'Nom du groupe'; + + @override + String get createGroupAndInviteUsers => + 'Créer un groupe et inviter des utilisateurs/trices'; + + @override + String get groupCanBeFoundViaSearch => + 'Le groupe peut être trouvé via la recherche'; + + @override + String get wrongRecoveryKey => + 'Désolé... il ne semble pas s\'agir de la bonne clé de récupération.'; + + @override + String get startConversation => 'Démarrer la conversation'; + + @override + String get commandHint_sendraw => 'Envoyer du JSON brut'; + + @override + String get databaseMigrationTitle => 'La base de données est optimisée'; + + @override + String get databaseMigrationBody => + 'Veuillez patienter. Cela peut prendre un moment.'; + + @override + String get leaveEmptyToClearStatus => + 'Laisser vide pour effacer votre statut.'; + + @override + String get select => 'Sélectionner'; + + @override + String get searchForUsers => 'Rechercher des @utilisateurs/trices...'; + + @override + String get pleaseEnterYourCurrentPassword => + 'Veuillez saisir votre mot de passe actuel'; + + @override + String get newPassword => 'Nouveau mot de passe'; + + @override + String get pleaseChooseAStrongPassword => + 'Veuillez choisir un mot de passe fort'; + + @override + String get passwordsDoNotMatch => 'Les mots de passe ne correspondent pas'; + + @override + String get passwordIsWrong => 'Votre mot de passe saisi est erroné'; + + @override + String get publicLink => 'Lien public'; + + @override + String get publicChatAddresses => 'Addresses de discussion publiques'; + + @override + String get createNewAddress => 'Créer une nouvelle adresse'; + + @override + String get joinSpace => 'Rejoindre l\'espace'; + + @override + String get publicSpaces => 'Espaces publics'; + + @override + String get addChatOrSubSpace => 'Ajouter une discussion ou un sous-espace'; + + @override + String get subspace => 'Sous-espace'; + + @override + String get decline => 'Refuser'; + + @override + String get thisDevice => 'Cet appareil :'; + + @override + String get initAppError => + 'Une erreur est survenue pendant l\'initialisation de l\'application'; + + @override + String get userRole => 'Rôle de l\'utilisateur/trice'; + + @override + String minimumPowerLevel(String level) { + return '$level est le niveau minimum de droits.'; + } + + @override + String searchIn(String chat) { + return 'Rechercher dans la discussion \"$chat\"...'; + } + + @override + String get searchMore => 'Rechercher davantage...'; + + @override + String get gallery => 'Galerie'; + + @override + String get files => 'Fichiers'; + + @override + String databaseBuildErrorBody(String url, String error) { + return 'La base de données SQlite ne peut pas être créée. L\'application essaie d\'utiliser la base de données existante pour le moment. Veuillez signaler cette erreur aux développeurs à $url. Le message d\'erreur est le suivant : $error'; + } + + @override + String sessionLostBody(String url, String error) { + return 'Votre session est perdue. Veuillez signaler cette erreur aux développeurs à $url. Le message d\'erreur est le suivant : $error'; + } + + @override + String restoreSessionBody(String url, String error) { + return 'L\'application tente maintenant de restaurer votre session depuis la sauvegarde. Veuillez signaler cette erreur aux développeurs à $url. Le message d\'erreur est le suivant : $error'; + } + + @override + String forwardMessageTo(String roomName) { + return 'Transférer le message à $roomName ?'; + } + + @override + String get sendReadReceipts => 'Envoyer des accusés de réception'; + + @override + String get sendTypingNotificationsDescription => + 'Les autres participants à une discussion peuvent voir que vous êtes en train de taper un nouveau message.'; + + @override + String get sendReadReceiptsDescription => + 'Les autres participants à une discussion peuvent voir si vous avez lu un message.'; + + @override + String get formattedMessages => 'Messages formatés'; + + @override + String get formattedMessagesDescription => + 'Affichez le contenu formaté des messages comme du texte en gras à l\'aide de markdown.'; + + @override + String get verifyOtherUser => '🔐 Vérifier l\'autre utilisateur/trice'; + + @override + String get verifyOtherUserDescription => + 'Si vous vérifiez un autre utilisateur/trice, vous pouvez être sûr de savoir à qui vous écrivez réellement. 💪\n\nLorsque vous lancez une vérification, vous et l\'autre utilisateur/trice verrez une fenêtre contextuelle dans l\'application. Vous y verrez alors une série d\'émoticônes ou de chiffres que vous devrez comparer.\n\nLa meilleure façon de procéder est de se rencontrer ou de lancer un appel vidéo. 👭'; + + @override + String get verifyOtherDevice => '🔐 Vérifier l\'autre appareil'; + + @override + String get verifyOtherDeviceDescription => + 'Lorsque vous vérifiez un autre appareil, ces appareils peuvent échanger des clés, ce qui augmente votre sécurité globale. 💪 Lorsque vous lancez une vérification, une fenêtre contextuelle s\'affiche dans l\'application sur les deux appareils. Vous y verrez alors une série d\'émoticônes ou de chiffres que vous devrez comparer. Il est préférable d\'avoir les deux appareils à portée de main avant de lancer la vérification. 🤳'; + + @override + String acceptedKeyVerification(String sender) { + return '$sender a accepté la vérification de clé'; + } + + @override + String canceledKeyVerification(String sender) { + return '$sender a annulé la vérification de clé'; + } + + @override + String completedKeyVerification(String sender) { + return '$sender a terminé la vérification de clé'; + } + + @override + String isReadyForKeyVerification(String sender) { + return '$sender est prêt pour la vérification de clé'; + } + + @override + String requestedKeyVerification(String sender) { + return '$sender a demandé une vérification de clé'; + } + + @override + String startedKeyVerification(String sender) { + return '$sender a lancé la vérification de clé'; + } + + @override + String get transparent => 'Transparent'; + + @override + String get incomingMessages => 'Messages entrants'; + + @override + String get stickers => 'Autocollants'; + + @override + String get discover => 'Découvrir'; + + @override + String get commandHint_ignore => 'Ignorer l\'identifiant Matrix indiqué'; + + @override + String get commandHint_unignore => + 'Ne plus ignorer l\'identifiant Matrix indiqué'; + + @override + String unreadChatsInApp(String appname, String unread) { + return '$appname : $unread discussions non lus'; + } + + @override + String get noDatabaseEncryption => + 'Le chiffrement de la base de données n\'est pas supporté sur cette plateforme'; + + @override + String thereAreCountUsersBlocked(Object count) { + return 'Actuellement, il y a $count utilisateurs/trices bloqués.'; + } + + @override + String get restricted => 'Limité'; + + @override + String get knockRestricted => 'Frapper à la porte limité'; + + @override + String goToSpace(Object space) { + return 'Aller dans l\'espace : $space'; + } + + @override + String get markAsUnread => 'Marquer comme non lu'; + + @override + String userLevel(int level) { + return '$level — Membre'; + } + + @override + String moderatorLevel(int level) { + return '$level — Modération'; + } + + @override + String adminLevel(int level) { + return '$level — Administration'; + } + + @override + String get changeGeneralChatSettings => + 'Modifier les paramètres généraux de la discussion'; + + @override + String get inviteOtherUsers => + 'Inviter d\'autres membres dans cette discussion'; + + @override + String get changeTheChatPermissions => + 'Modifier les autorisations de cette discussion'; + + @override + String get changeTheVisibilityOfChatHistory => + 'Modifier la visibilité de l\'historique de la discussion'; + + @override + String get changeTheCanonicalRoomAlias => + 'Modifier l\'adresse publique principale de la discussion'; + + @override + String get sendRoomNotifications => 'Send a @room notifications'; + + @override + String get changeTheDescriptionOfTheGroup => + 'Modifier la description de la discussion'; + + @override + String get chatPermissionsDescription => + 'Définir quel niveau de pouvoir est nécessaires pour certaines actions dans cette discussion. Les niveaux de pouvoir 0, 50 et 100 représentent généralement les membres, la modération et l\'administration, mais toute gradation est possible.'; + + @override + String updateInstalled(String version) { + return '🎉 La mise à niveau $version est installée !'; + } + + @override + String get changelog => 'Journal des modifications'; + + @override + String get sendCanceled => 'Envoi annulé'; + + @override + String get loginWithMatrixId => 'Connexion avec l\'identifiant Matrix'; + + @override + String get discoverHomeservers => 'Discover homeservers'; + + @override + String get whatIsAHomeserver => 'What is a homeserver?'; + + @override + String get homeserverDescription => + 'All your data is stored on the homeserver, just like an email provider. You can choose which homeserver you want to use, while you can still communicate with everyone. Learn more at at https://matrix.org.'; + + @override + String get doesNotSeemToBeAValidHomeserver => + 'Doesn\'t seem to be a compatible homeserver. Wrong URL?'; + + @override + String get calculatingFileSize => 'Calculating file size...'; + + @override + String get prepareSendingAttachment => 'Prepare sending attachment...'; + + @override + String get sendingAttachment => 'Sending attachment...'; + + @override + String get generatingVideoThumbnail => 'Generating video thumbnail...'; + + @override + String get compressVideo => 'Compressing video...'; + + @override + String sendingAttachmentCountOfCount(int index, int length) { + return 'Sending attachment $index of $length...'; + } + + @override + String serverLimitReached(int seconds) { + return 'Server limit reached! Waiting $seconds seconds...'; + } + + @override + String get oneOfYourDevicesIsNotVerified => + 'One of your devices is not verified'; + + @override + String get noticeChatBackupDeviceVerification => + 'Note: When you connect all your devices to the chat backup, they are automatically verified.'; + + @override + String get continueText => 'Continue'; + + @override + String get welcomeText => + 'Hey Hey 👋 This is Extera. You can sign in to any homeserver, which is compatible with https://matrix.org. And then chat with anyone. It\'s a huge decentralized messaging network!'; + + @override + String get blur => 'Blur:'; + + @override + String get opacity => 'Opacity:'; + + @override + String get setWallpaper => 'Set wallpaper'; + + @override + String get manageAccount => 'Manage account'; + + @override + String get noContactInformationProvided => + 'Server does not provide any valid contact information'; + + @override + String get contactServerAdmin => 'Contact server admin'; + + @override + String get contactServerSecurity => 'Contact server security'; + + @override + String get supportPage => 'Support page'; + + @override + String get serverInformation => 'Server information:'; + + @override + String get name => 'Name'; + + @override + String get version => 'Version'; + + @override + String get website => 'Website'; + + @override + String get compress => 'Compress'; + + @override + String get boldText => 'Bold text'; + + @override + String get italicText => 'Italic text'; + + @override + String get strikeThrough => 'Strikethrough'; + + @override + String get pleaseFillOut => 'Please fill out'; + + @override + String get invalidUrl => 'Invalid url'; + + @override + String get addLink => 'Add link'; + + @override + String get unableToJoinChat => + 'Unable to join chat. Maybe the other party has already closed the conversation.'; + + @override + String get previous => 'Previous'; + + @override + String get otherPartyNotLoggedIn => + 'The other party is currently not logged in and therefore cannot receive messages!'; + + @override + String appWantsToUseForLogin(String server) { + return 'Use \'$server\' to log in'; + } + + @override + String get appWantsToUseForLoginDescription => + 'You hereby allow the app and website to share information about you.'; + + @override + String get open => 'Open'; + + @override + String get waitingForServer => 'Waiting for server...'; + + @override + String get appIntroduction => + 'Extera lets you chat with your friends across different messengers. Learn more at https://matrix.org or just tap *Continue*.'; + + @override + String get newChatRequest => '📩 New chat request'; + + @override + String get contentNotificationSettings => 'Content notification settings'; + + @override + String get generalNotificationSettings => 'General notification settings'; + + @override + String get roomNotificationSettings => 'Room notification settings'; + + @override + String get userSpecificNotificationSettings => + 'User specific notification settings'; + + @override + String get otherNotificationSettings => 'Other notification settings'; + + @override + String get notificationRuleContainsUserName => 'Contains User Name'; + + @override + String get notificationRuleContainsUserNameDescription => + 'Notifies the user when a message contains their username.'; + + @override + String get notificationRuleMaster => 'Mute all notifications'; + + @override + String get notificationRuleMasterDescription => + 'Overrides all other rules and disables all notifications.'; + + @override + String get notificationRuleSuppressNotices => 'Suppress Automated Messages'; + + @override + String get notificationRuleSuppressNoticesDescription => + 'Suppresses notifications from automated clients like bots.'; + + @override + String get notificationRuleInviteForMe => 'Invite for Me'; + + @override + String get notificationRuleInviteForMeDescription => + 'Notifies the user when they are invited to a room.'; + + @override + String get notificationRuleMemberEvent => 'Member Event'; + + @override + String get notificationRuleMemberEventDescription => + 'Suppresses notifications for membership events.'; + + @override + String get notificationRuleIsUserMention => 'User Mention'; + + @override + String get notificationRuleIsUserMentionDescription => + 'Notifies the user when they are directly mentioned in a message.'; + + @override + String get notificationRuleContainsDisplayName => 'Contains Display Name'; + + @override + String get notificationRuleContainsDisplayNameDescription => + 'Notifies the user when a message contains their display name.'; + + @override + String get notificationRuleIsRoomMention => 'Room Mention'; + + @override + String get notificationRuleIsRoomMentionDescription => + 'Notifies the user when there is a room mention.'; + + @override + String get notificationRuleRoomnotif => 'Room Notification'; + + @override + String get notificationRuleRoomnotifDescription => + 'Notifies the user when a message contains \'@room\'.'; + + @override + String get notificationRuleTombstone => 'Tombstone'; + + @override + String get notificationRuleTombstoneDescription => + 'Notifies the user about room deactivation messages.'; + + @override + String get notificationRuleReaction => 'Reaction'; + + @override + String get notificationRuleReactionDescription => + 'Suppresses notifications for reactions.'; + + @override + String get notificationRuleRoomServerAcl => 'Room Server ACL'; + + @override + String get notificationRuleRoomServerAclDescription => + 'Suppresses notifications for room server access control lists (ACL).'; + + @override + String get notificationRuleSuppressEdits => 'Suppress Edits'; + + @override + String get notificationRuleSuppressEditsDescription => + 'Suppresses notifications for edited messages.'; + + @override + String get notificationRuleCall => 'Call'; + + @override + String get notificationRuleCallDescription => + 'Notifies the user about calls.'; + + @override + String get notificationRuleEncryptedRoomOneToOne => + 'Encrypted Room One-to-One'; + + @override + String get notificationRuleEncryptedRoomOneToOneDescription => + 'Notifies the user about messages in encrypted one-to-one rooms.'; + + @override + String get notificationRuleRoomOneToOne => 'Room One-to-One'; + + @override + String get notificationRuleRoomOneToOneDescription => + 'Notifies the user about messages in one-to-one rooms.'; + + @override + String get notificationRuleMessage => 'Message'; + + @override + String get notificationRuleMessageDescription => + 'Notifies the user about general messages.'; + + @override + String get notificationRuleEncrypted => 'Encrypted'; + + @override + String get notificationRuleEncryptedDescription => + 'Notifies the user about messages in encrypted rooms.'; + + @override + String get notificationRuleJitsi => 'Jitsi'; + + @override + String get notificationRuleJitsiDescription => + 'Notifies the user about Jitsi widget events.'; + + @override + String get notificationRuleServerAcl => 'Suppress Server ACL Events'; + + @override + String get notificationRuleServerAclDescription => + 'Suppresses notifications for Server ACL events.'; + + @override + String unknownPushRule(String rule) { + return 'Unknown push rule \'$rule\''; + } + + @override + String get deletePushRuleCanNotBeUndone => + 'If you delete this notification setting, this can not be undone.'; + + @override + String get more => 'More'; + + @override + String get shareKeysWith => 'Share keys with...'; + + @override + String get shareKeysWithDescription => + 'Which devices should be trusted so that they can read along your messages in encrypted chats?'; + + @override + String get allDevices => 'All devices'; + + @override + String get crossVerifiedDevicesIfEnabled => + 'Cross verified devices if enabled'; + + @override + String get crossVerifiedDevices => 'Cross verified devices'; + + @override + String get verifiedDevicesOnly => 'Verified devices only'; + + @override + String get takeAPhoto => 'Take a photo'; + + @override + String get recordAVideo => 'Record a video'; + + @override + String get optionalMessage => '(Optional) message...'; + + @override + String get notSupportedOnThisDevice => 'Not supported on this device'; + + @override + String get enterNewChat => 'Enter new chat'; + + @override + String get approve => 'Approve'; + + @override + String get youHaveKnocked => 'You have knocked'; + + @override + String get pleaseWaitUntilInvited => + 'Please wait now, until someone from the room invites you.'; +} diff --git a/lib/generated/l10n/l10n_ga.dart b/lib/generated/l10n/l10n_ga.dart new file mode 100644 index 0000000..9a80ec0 --- /dev/null +++ b/lib/generated/l10n/l10n_ga.dart @@ -0,0 +1,2778 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'l10n.dart'; + +// ignore_for_file: type=lint + +/// The translations for Irish (`ga`). +class L10nGa extends L10n { + L10nGa([String locale = 'ga']) : super(locale); + + @override + String get noSendPermission => 'You can\'t send messages here'; + + @override + String get alwaysUse24HourFormat => 'bréagach'; + + @override + String get repeatPassword => 'Scríobh an pasfhocal arís'; + + @override + String get notAnImage => 'Ní comhad íomhá é.'; + + @override + String get setCustomPermissionLevel => 'Set custom permission level'; + + @override + String get setPermissionsLevelDescription => + 'Please choose a predefined role below or enter a custom permission level between 0 and 100.'; + + @override + String get ignoreUser => 'Ignore user'; + + @override + String get normalUser => 'Normal user'; + + @override + String get remove => 'Bain'; + + @override + String get importNow => 'Iompórtáil anois'; + + @override + String get importEmojis => 'Iompórtáil Emoji'; + + @override + String get importFromZipFile => 'Iompórtáil ó chomhad .zip'; + + @override + String get exportEmotePack => 'Easpórtáil Emote pacáiste mar .zip'; + + @override + String get replace => 'Ionadaigh'; + + @override + String get about => 'Faoi'; + + @override + String aboutHomeserver(String homeserver) { + return 'Maidir le $homeserver'; + } + + @override + String get accept => 'Glac'; + + @override + String acceptedTheInvitation(String username) { + return '👍 Ghlac $username leis an gcuireadh'; + } + + @override + String get account => 'Cuntas'; + + @override + String activatedEndToEndEncryption(String username) { + return '🔐 $username criptithe deireadh go deireadh gníomhachtaithe'; + } + + @override + String get addEmail => 'Cuir ríomhphoist'; + + @override + String get confirmMatrixId => + 'Deimhnigh d’ID Maitrís chun do chuntas a scriosadh.'; + + @override + String supposedMxid(String mxid) { + return 'Ba cheart go mbeadh sé seo $mxid'; + } + + @override + String get addChatDescription => 'Cuir cur síos ar an gcomhrá leis...'; + + @override + String get addToSpace => 'Cuir go spás'; + + @override + String get admin => 'Riarthóir'; + + @override + String get alias => 'ailias'; + + @override + String get all => 'Gach'; + + @override + String get allChats => 'Gach comhrá'; + + @override + String get commandHint_roomupgrade => + 'Uasghrádaigh an seomra seo go dtí an leagan seomra a thugtar'; + + @override + String get commandHint_googly => 'Seol roinnt súile googly'; + + @override + String get commandHint_cuddle => 'Seol cuddle'; + + @override + String get commandHint_hug => 'Seol barróg'; + + @override + String googlyEyesContent(String senderName) { + return 'Seolann $senderName súile googly chugat'; + } + + @override + String cuddleContent(String senderName) { + return 'Cuireann $senderName do chudacht'; + } + + @override + String hugContent(String senderName) { + return 'Tugann $senderName barróg duit'; + } + + @override + String answeredTheCall(String senderName) { + return 'D\'fhreagair $senderName an glao'; + } + + @override + String get anyoneCanJoin => 'Is féidir le aon duine dul isteach'; + + @override + String get appLock => 'Bac aip'; + + @override + String get appLockDescription => + 'Cuir glas ar an aip nuair nach bhfuil sé in úsáid le cód bioráin'; + + @override + String get archive => 'Cartlann'; + + @override + String get areGuestsAllowedToJoin => + 'An bhfuil cead ag aoi-úsáideoirí a bheith páirteach'; + + @override + String get areYouSure => 'An bhfuil tú cinnte?'; + + @override + String get areYouSureYouWantToLogout => + 'An bhfuil tú cinnte gur mhaith leat logáil amach?'; + + @override + String get askSSSSSign => + 'Chun a bheith in ann an duine eile a shíniú, cuir isteach do phasfhrása stóir sábháilte nó d\'eochair téarnaimh.'; + + @override + String askVerificationRequest(String username) { + return 'Glac leis an iarratas fíoraithe seo ó $username?'; + } + + @override + String get autoplayImages => + 'Seinn greamáin agus straoiseog beoite go huathoibríoch'; + + @override + String badServerLoginTypesException(String serverVersions, + String supportedVersions, Object suportedVersions) { + return 'Tá na cineálacha logála isteach seo ar fáil faoin freastalaí baile:\n$serverVersions\nAch níl ach na ceann seo ar fáil faoin aip seo:\n$supportedVersions'; + } + + @override + String get sendTypingNotifications => 'Seol fógraí clóscríofa'; + + @override + String get swipeRightToLeftToReply => + 'Svaidhpeáil ar dheis ar chlé chun freagra a thabhairt'; + + @override + String get sendOnEnter => 'Seol ar iontráil'; + + @override + String badServerVersionsException(String serverVersions, + String supportedVersions, Object serverVerions, Object suportedVersions) { + return 'Tá na leaganacha sonraíochta seo ar fáil faoin freastalaí baile:\n$serverVersions\nAch níl ach na ceann seo ar fáil faoin aip seo $supportedVersions'; + } + + @override + String countChatsAndCountParticipants(int chats, int participants) { + return '$chats comhrá agus $participants rannpháirtí'; + } + + @override + String get noMoreChatsFound => 'Níor aimsíodh a thuilleadh comhráite...'; + + @override + String get noChatsFoundHere => + 'Níor aimsíodh aon chomhrá anseo fós. Cuir tús le comhrá nua le duine éigin tríd an gcnaipe thíos a úsáid. ⤵️'; + + @override + String get joinedChats => 'Glacadh páirt i gcomhráite'; + + @override + String get unread => 'Neamhléite'; + + @override + String get space => 'Spás'; + + @override + String get spaces => 'Spásanna'; + + @override + String get banFromChat => 'Toirmisc ón gcomhrá'; + + @override + String get banned => 'Coiscthe'; + + @override + String bannedUser(String username, String targetName) { + return 'Chuir $username cosc ar $targetName'; + } + + @override + String get blockDevice => 'Bac Gléas'; + + @override + String get blocked => 'Bactha'; + + @override + String get botMessages => 'Teachtaireachtaí bota'; + + @override + String get cancel => 'Cealaigh'; + + @override + String cantOpenUri(String uri) { + return 'Ní féidir an URI $uri a oscailt'; + } + + @override + String get changeDeviceName => 'Athraigh ainm an ghléis'; + + @override + String changedTheChatAvatar(String username) { + return 'D\'athraigh $username abhatár an chomhrá'; + } + + @override + String changedTheChatDescriptionTo(String username, String description) { + return 'D\'athraigh $username an cur síos comhrá go: \'$description\''; + } + + @override + String changedTheChatNameTo(String username, String chatname) { + return 'D\'athraigh $username an t-ainm comhrá go: \'$chatname\''; + } + + @override + String changedTheChatPermissions(String username) { + return 'D\'athraigh $username na ceadanna comhrá'; + } + + @override + String changedTheDisplaynameTo(String username, String displayname) { + return 'D\'athraigh $username a n-ainm taispeána go: \'$displayname\''; + } + + @override + String changedTheGuestAccessRules(String username) { + return 'D\'athraigh $username na rialacha rochtana aoi'; + } + + @override + String changedTheGuestAccessRulesTo(String username, String rules) { + return 'D\'athraigh $username na rialacha maidir le rochtain aoi chuig: $rules'; + } + + @override + String changedTheHistoryVisibility(String username) { + return 'D\'athraigh $username infheictheacht na staire'; + } + + @override + String changedTheHistoryVisibilityTo(String username, String rules) { + return 'D\'athraigh $username infheictheacht na staire go: $rules'; + } + + @override + String changedTheJoinRules(String username) { + return 'D\'athraigh $username na rialacha ceangail'; + } + + @override + String changedTheJoinRulesTo(String username, String joinRules) { + return 'D\'athraigh $username na rialacha ceangail go: $joinRules'; + } + + @override + String changedTheProfileAvatar(String username) { + return 'D\'athraigh $username a n-abhatár'; + } + + @override + String changedTheRoomAliases(String username) { + return 'D\'athraigh $username ailiasanna an tseomra'; + } + + @override + String changedTheRoomInvitationLink(String username) { + return 'D\'athraigh $username nasc an chuiridh'; + } + + @override + String get changePassword => 'Athraigh an pasfhocal'; + + @override + String get changeTheHomeserver => 'Athraigh an freastalaí baile'; + + @override + String get changeTheme => 'Athraigh do stíl'; + + @override + String get changeTheNameOfTheGroup => 'Athraigh ainm an ghrúpa'; + + @override + String get changeYourAvatar => 'Athraigh do abhatár'; + + @override + String get channelCorruptedDecryptError => 'Truaillíodh an criptiú'; + + @override + String get chat => 'Comhrá'; + + @override + String get yourChatBackupHasBeenSetUp => 'Bunaíodh do chúltaca comhrá.'; + + @override + String get chatBackup => 'Cúltaca comhrá'; + + @override + String get chatBackupDescription => + 'Tá do sheanteachtaireachtaí slán le eochair athshlánaithe. Le do thoil déan cinnte nach gcaillfidh tú é.'; + + @override + String get chatDetails => 'Sonraí comhrá'; + + @override + String get chatHasBeenAddedToThisSpace => 'Cuireadh comhrá leis an spás seo'; + + @override + String get chats => 'Comhráite'; + + @override + String get chooseAStrongPassword => 'Roghnaigh pasfhocal láidir'; + + @override + String get clearArchive => 'Glan an cartlann'; + + @override + String get close => 'Dún'; + + @override + String get commandHint_markasdm => + 'Marcáil mar sheomra teachtaireachta dírí don ID Maitrís tugtha'; + + @override + String get commandHint_markasgroup => 'Marcáil mar ghrúpa'; + + @override + String get commandHint_ban => + 'Cuir cosc ar an úsáideoir áirithe ón seomra seo'; + + @override + String get commandHint_clearcache => 'Glan an taisce'; + + @override + String get commandHint_create => + 'Cruthaigh comhrá grúpa folamh\nÚsáid --no-encryption chun criptiúchán a dhíchumasú'; + + @override + String get commandHint_discardsession => 'Scrios an seisiún'; + + @override + String get commandHint_dm => + 'Cuir tús le comhrá díreach\nÚsáid --no-cription chun criptiúchán a dhíchumasú'; + + @override + String get commandHint_html => 'Seol téacs HTML-formáidithe'; + + @override + String get commandHint_invite => + 'Cuir cosc ar an úsáideoir áirithe ón seomra seo'; + + @override + String get commandHint_join => 'Téigh isteach sa seomra áirithe'; + + @override + String get commandHint_kick => 'Bain an t-úsáideoir áirithe den seomra seo'; + + @override + String get commandHint_leave => 'Fág an seomra seo'; + + @override + String get commandHint_me => 'Déan cur síos ort féin'; + + @override + String get commandHint_myroomavatar => + 'Cuir do phictiúr don seomra seo (le mxc-uri)'; + + @override + String get commandHint_myroomnick => + 'Socraigh d\'ainm taispeána don seomra seo'; + + @override + String get commandHint_op => + 'Socraigh leibhéal cumhachta an úsáideora áirithe (réamhshocrú: 50)'; + + @override + String get commandHint_plain => 'Seol téacs neamhfhoirmithe'; + + @override + String get commandHint_react => 'Seol freagra mar fhreagairt'; + + @override + String get commandHint_send => 'Seol téacs'; + + @override + String get commandHint_unban => + 'Cuir deireadh an cosc den úsáideoir áirithe ón seomra seo'; + + @override + String get commandInvalid => 'Ordú neamhbhailí'; + + @override + String commandMissing(String command) { + return 'Ní ordú é $command.'; + } + + @override + String get compareEmojiMatch => 'Cuir na emojis i gcomparáid le do thoil'; + + @override + String get compareNumbersMatch => + 'Cuir na huimhreacha i gcomparáid le do thoil'; + + @override + String get configureChat => 'Cumraigh comhrá'; + + @override + String get confirm => 'Deimhnigh'; + + @override + String get connect => 'Ceangail'; + + @override + String get contactHasBeenInvitedToTheGroup => + 'Tugadh cuireadh don theagmháil a thar isteach sa grúpa'; + + @override + String get containsDisplayName => 'Coinníonn sé ainm taispeána'; + + @override + String get containsUserName => 'Coinníonn sé ainm úsáideora'; + + @override + String get contentHasBeenReported => + 'Tuairiscíodh an t-ábhar do lucht riaracháin an fhreastalaí'; + + @override + String get copiedToClipboard => 'Cóipeáilte ar an ghearrthaisce'; + + @override + String get copy => 'Cóipeáil'; + + @override + String get copyToClipboard => 'Cóipeáil ar an ghearrthaisce'; + + @override + String couldNotDecryptMessage(String error) { + return 'Níorbh fhéidir teachtaireacht a dhíchriptiú: $error'; + } + + @override + String countParticipants(int count) { + return '$count rannpháirtithe'; + } + + @override + String get create => 'Cruthaigh'; + + @override + String createdTheChat(String username) { + return '💬 chruthaigh $username an comhrá'; + } + + @override + String get createGroup => 'Cruthaigh grúpa'; + + @override + String get createNewSpace => 'Spás nua'; + + @override + String get currentlyActive => 'Gníomhach faoi láthair'; + + @override + String get darkTheme => 'Dorcha'; + + @override + String dateAndTimeOfDay(String date, String timeOfDay) { + return '$date, $timeOfDay'; + } + + @override + String dateWithoutYear(String month, String day) { + return '$day/$month'; + } + + @override + String dateWithYear(String year, String month, String day) { + return '$day/$month/$year'; + } + + @override + String get deactivateAccountWarning => + 'Díghníomhachtaeoidh sé seo do chuntas úsáideora. Ní féidir é seo a chealú! An bhfuil tú cinnte?'; + + @override + String get defaultPermissionLevel => + 'Leibhéal ceada réamhshocraithe d\'úsáideoirí nua'; + + @override + String get delete => 'Scrios'; + + @override + String get deleteAccount => 'Scrios an cuntas'; + + @override + String get deleteMessage => 'Scrios an teachtaireacht'; + + @override + String get device => 'Gléas'; + + @override + String get deviceId => 'ID gléis'; + + @override + String get devices => 'Gléasanna'; + + @override + String get directChats => 'Comhráite Díreacha'; + + @override + String get allRooms => 'Gach Comhrá Grúpa'; + + @override + String get displaynameHasBeenChanged => 'Athraíodh an t-ainm taispeána'; + + @override + String get downloadFile => 'Íoslódáil comhad'; + + @override + String get edit => 'Cuir in eagar'; + + @override + String get editBlockedServers => 'Cuir freastalaí blocáilte in eagar'; + + @override + String get chatPermissions => 'Ceadanna comhrá'; + + @override + String get editDisplayname => 'Cuir ainm taispeána in eagar'; + + @override + String get editRoomAliases => 'Cuir ailiasanna an tseomra in eagar'; + + @override + String get editRoomAvatar => 'Cuir in eagar abhatár an tseomra'; + + @override + String get emoteExists => 'Tá iomaite ann cheana féin!'; + + @override + String get emoteInvalid => 'Gearrchód emote neamhbhailí!'; + + @override + String get emoteKeyboardNoRecents => + 'Beidh mothúcháin a úsáideadh le déanaí le feiceáil anseo ...'; + + @override + String get emotePacks => 'Pacáistí straoiseoige don seomra'; + + @override + String get emoteSettings => 'Socruithe straoiseoige'; + + @override + String get globalChatId => 'Aitheantas comhrá domhanda'; + + @override + String get accessAndVisibility => 'Rochtain agus infheictheacht'; + + @override + String get accessAndVisibilityDescription => + 'Cé a bhfuil cead aige páirt a ghlacadh sa chomhrá seo agus conas is féidir an comhrá a aimsiú.'; + + @override + String get calls => 'Glaonna'; + + @override + String get customEmojisAndStickers => 'Emojis agus greamáin saincheaptha'; + + @override + String get customEmojisAndStickersBody => + 'Cuir leis nó roinn emojis nó greamáin saincheaptha is féidir a úsáid in aon chomhrá.'; + + @override + String get emoteShortcode => 'Gearrchód straoiseoige'; + + @override + String get emoteWarnNeedToPick => + 'Caithfidh tú gearrchód straoiseoige agus íomhá a roghnú!'; + + @override + String get emptyChat => 'Comhrá folamh'; + + @override + String get enableEmotesGlobally => + 'Cumasaigh pacáiste straoiseoige go huilíoch'; + + @override + String get enableEncryption => 'Tosaigh criptiú'; + + @override + String get enableEncryptionWarning => + 'Ní bheidh in ann an criptiú a dhíchumasú níos mó. An bhfuil tú cinnte?'; + + @override + String get encrypted => 'Criptithe'; + + @override + String get encryption => 'Criptiúchán'; + + @override + String get encryptionNotEnabled => 'Ní chumasaítear criptiú'; + + @override + String endedTheCall(String senderName) { + return 'Chuir $senderName deireadh leis an nglao'; + } + + @override + String get enterAnEmailAddress => 'Cuir isteach seoladh ríomhphoist'; + + @override + String get homeserver => 'Freastalaí baile'; + + @override + String get enterYourHomeserver => 'Cuir isteach do fhreastalaí baile'; + + @override + String errorObtainingLocation(String error) { + return 'Earráid maidir le suíomh a fháil: $error'; + } + + @override + String get everythingReady => 'Gach rud réidh!'; + + @override + String get extremeOffensive => 'Fíor-maslach'; + + @override + String get fileName => 'Ainm an chomhaid'; + + @override + String get fluffychat => 'FluffyChat'; + + @override + String get fontSize => 'Méid cló'; + + @override + String get forward => 'Seol ar aghaidh'; + + @override + String get fromJoining => 'Ó tar isteach'; + + @override + String get fromTheInvitation => 'Ón gcuireadh'; + + @override + String get goToTheNewRoom => 'Téigh go dtí an seomra nua'; + + @override + String get group => 'Grúpa'; + + @override + String get chatDescription => 'Cur síos ar an gcomhrá'; + + @override + String get chatDescriptionHasBeenChanged => + 'Athraíodh cur síos ar an gcomhrá'; + + @override + String get groupIsPublic => 'Tá an grúpa poiblí'; + + @override + String get groups => 'Grúpaí'; + + @override + String groupWith(String displayname) { + return 'Grúpa le $displayname'; + } + + @override + String get guestsAreForbidden => 'Tá cosc ar aíonna'; + + @override + String get guestsCanJoin => 'Is féidir le haíonna páirt a ghlacadh'; + + @override + String hasWithdrawnTheInvitationFor(String username, String targetName) { + return 'Tharraing $username an cuireadh do $targetName siar'; + } + + @override + String get help => 'Cabhair'; + + @override + String get hideRedactedEvents => 'Folaigh imeachtaí athdhéanta'; + + @override + String get hideRedactedMessages => 'Folaigh teachtaireachtaí curtha in eagar'; + + @override + String get hideRedactedMessagesBody => + 'Má athghníomhaíonn duine éigin teachtaireacht, ní bheidh an teachtaireacht seo le feiceáil sa chomhrá a thuilleadh.'; + + @override + String get hideInvalidOrUnknownMessageFormats => + 'Folaigh formáidí teachtaireachta neamhbhailí nó anaithnid'; + + @override + String get howOffensiveIsThisContent => + 'Cé chomh maslach atá an t-ábhar seo?'; + + @override + String get id => 'ID'; + + @override + String get identity => 'Aitheantas'; + + @override + String get block => 'Bloc'; + + @override + String get blockedUsers => 'Úsáideoirí bactha'; + + @override + String get blockListDescription => + 'Is féidir leat bac a chur ar úsáideoirí atá ag cur isteach ort. Ní bheidh tú in ann teachtaireachtaí nó cuireadh seomra ar bith a fháil ó na húsáideoirí ar do liosta bloc pearsanta.'; + + @override + String get blockUsername => 'Déan neamhaird de ainm úsáideora'; + + @override + String get iHaveClickedOnLink => 'Chliceáil mé ar an nasc'; + + @override + String get incorrectPassphraseOrKey => + 'Pasfhrása nó eochair téarnaimh mícheart'; + + @override + String get inoffensive => 'Neamhurchóideach'; + + @override + String get inviteContact => 'Tabhair cuireadh do theagmháil'; + + @override + String inviteContactToGroupQuestion(Object contact, Object groupName) { + return 'Ar mhaith leat cuireadh a thabhairt do $contact chuig an gcomhrá \"$groupName\"?'; + } + + @override + String inviteContactToGroup(String groupName) { + return 'Tabhair cuireadh do theagmháil chuig $groupName'; + } + + @override + String get noChatDescriptionYet => + 'Níl aon chur síos ar an gcomhrá cruthaithe fós.'; + + @override + String get tryAgain => 'Bain triail eile as'; + + @override + String get invalidServerName => 'Ainm freastalaí neamhbhailí'; + + @override + String get invited => 'Le cuireadh'; + + @override + String get redactMessageDescription => + 'Athrófar an teachtaireacht do gach rannpháirtí sa chomhrá seo. Ní féidir é seo a chealú.'; + + @override + String get optionalRedactReason => + '(Roghnach) An chúis leis an teachtaireacht seo a chur in eagar...'; + + @override + String invitedUser(String username, String targetName) { + return '📩 thug $username cuireadh do $targetName'; + } + + @override + String get invitedUsersOnly => 'Úsáideoirí le cuireadh amháin'; + + @override + String get inviteForMe => 'Tabhair cuireadh dom'; + + @override + String inviteText(String username, String link) { + return 'Thug $username cuireadh duit chuig FluffyChat.\n1. Tabhair cuairt ar fluffychat.im agus a shuiteáil an app\n2. Cláraigh nó sínigh isteach\n3. Oscail an nasc cuirí:\n $link'; + } + + @override + String get isTyping => 'ag clóscríobh…'; + + @override + String joinedTheChat(String username) { + return 'Tháinig 👋 $username isteach sa chomhrá'; + } + + @override + String get joinRoom => 'Téigh isteach sa seomra'; + + @override + String kicked(String username, String targetName) { + return '👞 chiceáil $username $targetName'; + } + + @override + String kickedAndBanned(String username, String targetName) { + return '🙅 chiceáil $username agus chuir sé cosc ar $targetName'; + } + + @override + String get kickFromChat => 'Caith é amach as an comhrá'; + + @override + String lastActiveAgo(String localizedTimeShort) { + return 'Gníomhach deireanach: $localizedTimeShort'; + } + + @override + String get leave => 'Fág'; + + @override + String get leftTheChat => 'Fágadh an comhrá'; + + @override + String get license => 'Ceadúnas'; + + @override + String get lightTheme => 'Solas'; + + @override + String loadCountMoreParticipants(int count) { + return 'Lódáil $count níos mó rannpháirtithe'; + } + + @override + String get dehydrate => 'Easpórtáil seisiún agus gléas wipe'; + + @override + String get dehydrateWarning => + 'Ní féidir an gníomh seo a chealú. Cinntigh go stórálann tú an comhad cúltaca go sábháilte.'; + + @override + String get dehydrateTor => 'Úsáideoirí TOR: Seisiún easpórtála'; + + @override + String get dehydrateTorLong => + 'Maidir le húsáideoirí TOR, moltar an seisiún a onnmhairiú roimh dhúnadh an fhuinneog.'; + + @override + String get hydrateTor => 'Úsáideoirí TOR: Iompórtáil easpórtáil seisiún'; + + @override + String get hydrateTorLong => + 'An ndearna tú do sheisiún a easpórtáil an uair dheireanach ar TOR? Iompórtáil go tapa é agus leanúint ar aghaidh ag comhrá.'; + + @override + String get hydrate => 'Athchóirigh ó chomhad cúltaca'; + + @override + String get loadingPleaseWait => 'Ag lódáil… Fan, le do thoil.'; + + @override + String get loadMore => 'Lódáil níos mó…'; + + @override + String get locationDisabledNotice => + 'Tá seirbhísí suímh díchumasaithe. Cuir ar a gcumas le do thoil a bheith in ann do shuíomh a roinnt.'; + + @override + String get locationPermissionDeniedNotice => + 'Diúltaíodh cead suímh. Deonaigh dóibh le do thoil go mbeidh tú in ann do shuíomh a roinnt.'; + + @override + String get login => 'Logáil isteach'; + + @override + String logInTo(String homeserver) { + return 'Logáil isteach chuig $homeserver'; + } + + @override + String get logout => 'Logáil amach'; + + @override + String get memberChanges => 'Athruithe ball'; + + @override + String get mention => 'Luaigh'; + + @override + String get messages => 'Teachtaireachtaí'; + + @override + String get messagesStyle => 'Teachtaireachtaí:'; + + @override + String get moderator => 'Modhnóir'; + + @override + String get muteChat => 'Ciúnaigh comhrá'; + + @override + String get needPantalaimonWarning => + 'Bí ar an eolas go dteastaíonn Pantalaimon uait chun criptiú ó cheann go ceann a úsáid anois.'; + + @override + String get newChat => 'Comhrá nua'; + + @override + String get newMessageInFluffyChat => '💬 Teachtaireacht nua in FluffyChat'; + + @override + String get newVerificationRequest => 'Iarratas fíoraithe nua!'; + + @override + String get next => 'Ar Aghaidh'; + + @override + String get no => 'Níl'; + + @override + String get noConnectionToTheServer => 'Gan aon nasc leis an bhfreastalaí'; + + @override + String get noEmotesFound => 'Níor aimsíodh aon straoiseoga. 😕'; + + @override + String get noEncryptionForPublicRooms => + 'Ní féidir leat criptiú a ghníomhachtú ach a luaithe nach bhfuil an seomra inrochtana go poiblí a thuilleadh.'; + + @override + String get noGoogleServicesWarning => + 'Is cosúil nach bhfuil Firebase Cloud Messaging ar fáil ar do ghléas. Chun fógraí brú a fháil fós, molaimid ntfy a shuiteáil. Le ntfy nó soláthraí Unified Push eile is féidir leat fógraí brú a fháil ar bhealach atá slán ó thaobh sonraí. Is féidir leat ntfy a íoslódáil ón PlayStore nó ó F-Droid.'; + + @override + String noMatrixServer(String server1, String server2) { + return 'Níl $server1 freastalaí Matrix. Úsáid $server2 ina áit sin?'; + } + + @override + String get shareInviteLink => 'Roinn an nasc cuireadh'; + + @override + String get scanQrCode => 'Scan cód QR'; + + @override + String get none => 'Aon cheann'; + + @override + String get noPasswordRecoveryDescription => + 'Níor chuir tú bealach leis do phasfhocal a aisghabháil fós.'; + + @override + String get noPermission => 'Gan cead'; + + @override + String get noRoomsFound => 'Níor aimsíodh aon seomraí…'; + + @override + String get notifications => 'Fógraí'; + + @override + String get notificationsEnabledForThisAccount => + 'Fógraí cumasaithe don chuntas seo'; + + @override + String numUsersTyping(int count) { + return 'Tá $count úsáideoirí ag clóscríobh…'; + } + + @override + String get obtainingLocation => 'ag Aimsiú an suíomh…'; + + @override + String get offensive => 'Maslach'; + + @override + String get offline => 'As líne'; + + @override + String get ok => 'Ceart go leor'; + + @override + String get online => 'Ar líne'; + + @override + String get onlineKeyBackupEnabled => 'Tá Cúltaca Eochair Ar Líne cumasaithe'; + + @override + String get oopsPushError => + 'Hoips! Ar an drochuair, tharla earráid nuair a bhí na fógraí brú á mbunú.'; + + @override + String get oopsSomethingWentWrong => 'Úps, chuaigh rud éigin mícheart …'; + + @override + String get openAppToReadMessages => + 'Oscail an aip chun teachtaireachtaí a léamh'; + + @override + String get openCamera => 'Oscail ceamara'; + + @override + String get openVideoCamera => 'Oscail físcheamara'; + + @override + String get oneClientLoggedOut => 'Tá duine de do chliaint logáilte amach'; + + @override + String get addAccount => 'Breisigh cuntas'; + + @override + String get editBundlesForAccount => 'Cuir cuachta in eagar don chuntas seo'; + + @override + String get addToBundle => 'Cuir le bundle'; + + @override + String get removeFromBundle => 'Bain as an mbeart seo'; + + @override + String get bundleName => 'Ainm an bheartáin'; + + @override + String get enableMultiAccounts => + '(BÉITE) Cumasaigh cuntais iomadúla ar an gléas seo'; + + @override + String get openInMaps => 'Oscail i léarscáileanna'; + + @override + String get link => 'Nasc'; + + @override + String get serverRequiresEmail => + 'Ní mór don fhreastalaí seo do sheoladh ríomhphoist a bhailíochtú le haghaidh clárúcháin.'; + + @override + String get or => 'Nó'; + + @override + String get participant => 'Rannpháirtí'; + + @override + String get passphraseOrKey => 'pasfhrása nó eochair téarnaimh'; + + @override + String get password => 'Pasfhocal'; + + @override + String get passwordForgotten => 'Pasfhocal dearmadta'; + + @override + String get passwordHasBeenChanged => 'Athraíodh an pasfhocal'; + + @override + String get hideMemberChangesInPublicChats => + 'Cuir athruithe ball i gcomhráite poiblí i bhfolach'; + + @override + String get hideMemberChangesInPublicChatsBody => + 'Ná taispeáin san amlíne comhrá má théann duine isteach i gcomhrá poiblí nó má fhágann sé nó sí é chun inléiteacht a fheabhsú.'; + + @override + String get overview => 'Forbhreathnú'; + + @override + String get notifyMeFor => 'Cuir in iúl dom le haghaidh'; + + @override + String get passwordRecoverySettings => 'Socruithe athshlánaithe pasfhocal'; + + @override + String get passwordRecovery => 'Aisfháil pasfhocail'; + + @override + String get people => 'Daoine'; + + @override + String get pickImage => 'Roghnaigh íomhá'; + + @override + String get pin => 'Biorán'; + + @override + String play(String fileName) { + return 'Seinn $fileName'; + } + + @override + String get pleaseChoose => 'Roghnaigh le do thoil'; + + @override + String get pleaseChooseAPasscode => 'Roghnaigh paschód le do thoil'; + + @override + String get pleaseClickOnLink => + 'Cliceáil ar an nasc sa ríomhphost agus ansin lean ar aghaidh.'; + + @override + String get pleaseEnter4Digits => + 'Iontráil 4 dhigit le do thoil nó fág folamh chun glas aipe a dhíchumasú.'; + + @override + String get pleaseEnterRecoveryKey => + 'Cuir isteach d\'eochair athshlánaithe le do thoil:'; + + @override + String get pleaseEnterYourPassword => 'Iontráil do phasfhocal le do thoil'; + + @override + String get pleaseEnterYourPin => 'Cuir isteach d\'uimhir PIN le do thoil'; + + @override + String get pleaseEnterYourUsername => + 'Cuir isteach d\'ainm úsáideora le do thoil'; + + @override + String get pleaseFollowInstructionsOnWeb => + 'Lean na treoracha ar an suíomh gréasáin agus tapáil \"ar aghaidh\".'; + + @override + String get privacy => 'Príobháideacht'; + + @override + String get publicRooms => 'Seomraí Poiblí'; + + @override + String get pushRules => 'Rialacha na bhfógraí'; + + @override + String get reason => 'Fáth'; + + @override + String get recording => 'Ag Taifeadadh'; + + @override + String redactedBy(String username) { + return 'Arna chur in eagar ag $username'; + } + + @override + String get directChat => 'Comhrá díreach'; + + @override + String redactedByBecause(String username, String reason) { + return 'Athbhreithnithe ag $username mar: \"$reason\"'; + } + + @override + String redactedAnEvent(String username) { + return 'Rinne $username cinsire imeacht'; + } + + @override + String get redactMessage => 'Bain teachtaireacht amach'; + + @override + String get register => 'Cláraigh'; + + @override + String get reject => 'Diúltaigh'; + + @override + String rejectedTheInvitation(String username) { + return 'Dhiúltaigh $username don chuireadh'; + } + + @override + String get rejoin => 'Téigh ar ais isteach'; + + @override + String get removeAllOtherDevices => 'Bain gach gléas eile'; + + @override + String removedBy(String username) { + return 'Bainte de ag $username'; + } + + @override + String get removeDevice => 'Bain gléas'; + + @override + String get unbanFromChat => 'Cuir deireadh an cosc ón gcomhrá'; + + @override + String get removeYourAvatar => 'Bain d\'abhatár'; + + @override + String get replaceRoomWithNewerVersion => + 'Cuir leagan seomra níos nuaí in ionad an tseomra'; + + @override + String get reply => 'Freagair'; + + @override + String get reportMessage => 'Tuairiscigh teachtaireacht'; + + @override + String get translateMessage => 'Translate message'; + + @override + String get translatedMessage => 'Translated message'; + + @override + String get errorTranslatingMessage => + 'An error has occured while translating the message.'; + + @override + String get recoverMessage => 'Recover message'; + + @override + String get recoveredMessage => 'Recovered message'; + + @override + String get errorRecoveringMessage => + 'An error has occured while recovering the message.'; + + @override + String get errorRecoveringMessageNoAdmin => + 'This feature is available on Synapse homeservers only for adminstrators.'; + + @override + String get requestPermission => 'Iarr cead'; + + @override + String get roomHasBeenUpgraded => 'Uasghrádaíodh an seomra'; + + @override + String get roomVersion => 'Leagan seomra'; + + @override + String get saveFile => 'Sábháil comhad'; + + @override + String get retry => 'Retry'; + + @override + String get search => 'Cuardaigh'; + + @override + String get security => 'Slándáil'; + + @override + String get recoveryKey => 'Eochair athshlánaithe'; + + @override + String get recoveryKeyLost => 'Eochair athshlánaithe caillte?'; + + @override + String seenByUser(String username) { + return 'Le feiceáil ag $username'; + } + + @override + String get send => 'Seol'; + + @override + String get sendAMessage => 'Seol teachtaireacht'; + + @override + String get sendAsText => 'Seol mar théacs'; + + @override + String get sendAudio => 'Seol fuaim'; + + @override + String get sendFile => 'Seol comhad'; + + @override + String get sendImage => 'Seol íomhá'; + + @override + String sendImages(int count) { + return 'Seol $count íomhá'; + } + + @override + String get sendMessages => 'Seol teachtaireachtaí'; + + @override + String get sendOriginal => 'Seol an bunchóip'; + + @override + String get sendSticker => 'Seol greamán'; + + @override + String get sendVideo => 'Seol físeán'; + + @override + String sentAFile(String username) { + return '📁 sheol $username comhad'; + } + + @override + String sentAnAudio(String username) { + return '🎤 sheol $username fuaim'; + } + + @override + String sentAPicture(String username) { + return '🖼️ sheol $username pictiúr'; + } + + @override + String sentASticker(String username) { + return '😊 sheol $username greamán'; + } + + @override + String sentAVideo(String username) { + return '🎥 sheol $username físeán'; + } + + @override + String sentCallInformations(String senderName) { + return 'Sheol $senderName faisnéis maidir le glaonna'; + } + + @override + String get separateChatTypes => 'Comhráite Díreacha agus Grúpaí ar Leith'; + + @override + String get setAsCanonicalAlias => 'Socraigh mar phríomh-ailias'; + + @override + String get setCustomEmotes => 'Socraigh straoiseoga saincheaptha'; + + @override + String get setChatDescription => 'Socraigh cur síos ar an gcomhrá'; + + @override + String get setInvitationLink => 'Socraigh nasc cuiridh'; + + @override + String get setPermissionsLevel => 'Socraigh leibhéal ceadanna'; + + @override + String get setStatus => 'Cuir stádas'; + + @override + String get settings => 'Socruithe'; + + @override + String get share => 'Roinn'; + + @override + String sharedTheLocation(String username) { + return 'Roinn $username a suíomh'; + } + + @override + String get shareLocation => 'Roinn suíomh'; + + @override + String get showPassword => 'Taispeáin pasfhocal'; + + @override + String get presenceStyle => 'Láithreacht:'; + + @override + String get hideAvatarsInInvites => 'Hide avatars in invites'; + + @override + String get hideAvatarsInInvitesDescription => + 'Do not show room avatars in invites'; + + @override + String get presencesToggle => + 'Taispeáin teachtaireachtaí stádais ó úsáideoirí eile'; + + @override + String get pureBlackToggle => 'Pure Black'; + + @override + String get singlesignon => 'Sínigh Aonair ar'; + + @override + String get skip => 'Léim'; + + @override + String get sourceCode => 'Cód foinseach'; + + @override + String get spaceIsPublic => 'Tá an spás poiblí'; + + @override + String get spaceName => 'Ainm an spáis'; + + @override + String startedACall(String senderName) { + return 'Thosaigh $senderName glao'; + } + + @override + String get startFirstChat => 'Cuir tús le do chéad chomhrá'; + + @override + String get status => 'Staid'; + + @override + String get statusExampleMessage => 'Conas atá tú inniu?'; + + @override + String get submit => 'Cuir isteach'; + + @override + String get synchronizingPleaseWait => 'Ag sioncrónú... Fan, le do thoil.'; + + @override + String synchronizingPleaseWaitCounter(String percentage) { + return ' Ag sioncronú… ($percentage%)'; + } + + @override + String get systemTheme => 'Córas'; + + @override + String get theyDontMatch => 'Níl siad céanna'; + + @override + String get theyMatch => 'Tá siad céanna'; + + @override + String get title => 'FluffyChat'; + + @override + String get toggleFavorite => 'Scoránaigh mar ceann is fearr leat'; + + @override + String get toggleMuted => 'Scoránaigh mar ciúnaithe'; + + @override + String get toggleUnread => 'Marcáil Léite/Neamhléite'; + + @override + String get tooManyRequestsWarning => + 'An iomarca iarratas. Bain triail eile as níos déanaí!'; + + @override + String get transferFromAnotherDevice => 'Aistriú ó ghléas eile'; + + @override + String get tryToSendAgain => 'Déan iarracht a sheoladh arís'; + + @override + String get unavailable => 'Níl ar fáil'; + + @override + String unbannedUser(String username, String targetName) { + return 'Chuir $username deireadh an cosc $targetName'; + } + + @override + String get unblockDevice => 'Díbhlocáil Gléas'; + + @override + String get unknownDevice => 'Gléas anaithnid'; + + @override + String get unknownEncryptionAlgorithm => 'Algartam criptithe anaithnid'; + + @override + String unknownEvent(String type) { + return 'Imeacht anaithnid \'$type\''; + } + + @override + String get unmuteChat => 'Neamhciúnaigh comhrá'; + + @override + String get unpin => 'Bain biorán'; + + @override + String unreadChats(int unreadCount) { + String _temp0 = intl.Intl.pluralLogic( + unreadCount, + locale: localeName, + other: '$unreadCount comhráite neamhléite', + one: '1 comhrá neamhléite', + ); + return '$_temp0'; + } + + @override + String userAndOthersAreTyping(String username, int count) { + return 'tá $username agus $count daoine eile ag clóscríobh…'; + } + + @override + String userAndUserAreTyping(String username, String username2) { + return 'Tá $username agus $username2 ag clóscríobh…'; + } + + @override + String userIsTyping(String username) { + return 'Tá $username ag clóscríobh…'; + } + + @override + String userLeftTheChat(String username) { + return '🚪 D\'fhág $username an comhrá'; + } + + @override + String get username => 'Ainm úsáideora'; + + @override + String userSentUnknownEvent(String username, String type) { + return 'Sheol $username imeacht $type'; + } + + @override + String get unverified => 'Neamhfhíoraithe'; + + @override + String get verified => 'Deimhnithe'; + + @override + String get verify => 'Deimhnigh'; + + @override + String get verifyStart => 'Tosaigh Fíorú'; + + @override + String get verifySuccess => 'D\'fhíoraigh tú go rathúil!'; + + @override + String get verifyTitle => 'Ag fíorú cuntas eile'; + + @override + String get videoCall => 'Físghlao'; + + @override + String get visibilityOfTheChatHistory => 'Infheictheacht stair na comhrá'; + + @override + String get visibleForAllParticipants => + 'Infheicthe do na rannpháirtithe go léir'; + + @override + String get visibleForEveryone => 'Infheicthe do gach duine'; + + @override + String get voiceMessage => 'Glórphost'; + + @override + String get waitingPartnerAcceptRequest => + 'Ag fanacht le comhpháirtí glacadh leis an iarratas…'; + + @override + String get waitingPartnerEmoji => + 'Ag fanacht le comhpháirtí glacadh leis na straoiseoga…'; + + @override + String get waitingPartnerNumbers => + 'Ag fanacht le comhpháirtí glacadh leis na huimhreacha …'; + + @override + String get wallpaper => 'Cúlbhrat:'; + + @override + String get warning => 'Rabhadh!'; + + @override + String get weSentYouAnEmail => 'Sheolamar ríomhphost chugat'; + + @override + String get whoCanPerformWhichAction => 'Cé atá in ann an gníomh a dhéanamh'; + + @override + String get whoIsAllowedToJoinThisGroup => + 'Cé a bhfuil cead aige/aici dul isteach sa ghrúpa seo'; + + @override + String get whyDoYouWantToReportThis => + 'Cén fáth ar mhaith leat é seo a thuairisciú?'; + + @override + String get wipeChatBackup => + 'An bhfuil fonn ort cúltaca do chomhrá a scriosadh chun eochair athshlánaithe nua a chruthú?'; + + @override + String get withTheseAddressesRecoveryDescription => + 'Leis na seoltaí seo is féidir leat do phasfhocal a athshlánú.'; + + @override + String get writeAMessage => 'Scríobh teachtaireacht…'; + + @override + String get yes => 'Tá'; + + @override + String get you => 'Tú'; + + @override + String get youAreNoLongerParticipatingInThisChat => + 'Níl tú ag glacadh páirte sa chomhrá seo a thuilleadh'; + + @override + String get youHaveBeenBannedFromThisChat => + 'Cuireadh cosc ort ón gcomhrá seo'; + + @override + String get yourPublicKey => 'D\'eochair phoiblí'; + + @override + String get messageInfo => 'Eolas teachtaireachta'; + + @override + String get time => 'Am'; + + @override + String get messageType => 'Cineál Teachtaireachta'; + + @override + String get sender => 'Seoltóir'; + + @override + String get openGallery => 'Oscail gailearaí'; + + @override + String get removeFromSpace => 'Bain as spás'; + + @override + String get addToSpaceDescription => + 'Roghnaigh spás chun an comhrá seo a chur leis.'; + + @override + String get start => 'Tosaigh'; + + @override + String get pleaseEnterRecoveryKeyDescription => + 'Chun do sheanteachtaireachtaí a dhíghlasáil, cuir isteach d\'eochair athshlánaithe a gineadh i seisiún eile. NÍ do phasfhocal í d\'eochair athshlánaithe.'; + + @override + String get publish => 'Foilsigh'; + + @override + String videoWithSize(String size) { + return 'Físeán ($size)'; + } + + @override + String get openChat => 'Oscail Comhrá'; + + @override + String get markAsRead => 'Marcáil mar léite'; + + @override + String get reportUser => 'Déan tuairisc ar úsáideoir'; + + @override + String get dismiss => 'Díbhe'; + + @override + String reactedWith(String sender, String reaction) { + return 'D\'fhreagair $sender le $reaction'; + } + + @override + String get pinMessage => 'PIN go seomra'; + + @override + String get confirmEventUnpin => + 'An bhfuil tú cinnte an t-imeacht a dhíphionnáil go buan?'; + + @override + String get emojis => 'Emojis'; + + @override + String get placeCall => 'Cuir glaoch'; + + @override + String get voiceCall => 'Glao gutha'; + + @override + String get unsupportedAndroidVersion => 'Leagan Android gan tacaíocht'; + + @override + String get unsupportedAndroidVersionLong => + 'Éilíonn an ghné seo leagan Android níos nuaí. Seiceáil le haghaidh nuashonruithe nó tacaíocht Lineage OS.'; + + @override + String get videoCallsBetaWarning => + 'Tabhair faoi deara go bhfuil físglaonna i béite. B\'fhéidir nach bhfeidhmíonn siad ar gach ardán chomh atá súil aige ná ar bith.'; + + @override + String get experimentalVideoCalls => 'Glaonna físe turgnamhacha'; + + @override + String get emailOrUsername => 'Ríomhphost nó ainm úsáideora'; + + @override + String get indexedDbErrorTitle => 'Saincheisteanna mód príobháideach'; + + @override + String get indexedDbErrorLong => + 'Ar an drochuair níl an stóráil teachtaireachta cumasaithe sa mhód príobháideach de réir réamhshocraithe.\nTabhair cuairt le do thoil\n - faoi: config\n - socraithe dom.indexedDB.privateBrowsing.enabled go fíor\nSeachas sin, ní féidir FluffyChat a rith.'; + + @override + String switchToAccount(String number) { + return 'Athraigh go cuntas $number'; + } + + @override + String get nextAccount => 'An chéad chuntas eile'; + + @override + String get previousAccount => 'Cuntas roimhe seo'; + + @override + String get addWidget => 'Cuir giuirléid leis'; + + @override + String get widgetVideo => 'Físeán'; + + @override + String get widgetEtherpad => 'Nóta téacs'; + + @override + String get widgetJitsi => 'Jitsi le chéile'; + + @override + String get widgetCustom => 'Saincheaptha'; + + @override + String get widgetName => 'Ainm'; + + @override + String get widgetUrlError => 'Ní URL bailí é seo.'; + + @override + String get widgetNameError => 'Tabhair ainm taispeána, le do thoil.'; + + @override + String get errorAddingWidget => 'Earráid agus an ghiuirléid á cur leis.'; + + @override + String get youRejectedTheInvitation => 'Dhiúltaigh tú don chuireadh'; + + @override + String get youJoinedTheChat => 'Chuaigh tú isteach sa chomhrá'; + + @override + String get youAcceptedTheInvitation => '👍 Ghlac tú leis an gcuireadh'; + + @override + String youBannedUser(String user) { + return 'Chuir tú cosc ar $user'; + } + + @override + String youHaveWithdrawnTheInvitationFor(String user) { + return 'Tharraing tú siar an cuireadh do $user'; + } + + @override + String youInvitedToBy(String alias) { + return '📩 Tugadh cuireadh duit trí nasc chuig:\n$alias'; + } + + @override + String youInvitedBy(String user) { + return '📩 Thug $user cuireadh duit'; + } + + @override + String invitedBy(String user) { + return '📩 Cuireadh ó $user'; + } + + @override + String youInvitedUser(String user) { + return '📩 Thug tú cuireadh do $user'; + } + + @override + String youKicked(String user) { + return '👞 Chiceáil tú $user'; + } + + @override + String youKickedAndBanned(String user) { + return '🙅 Chiceáil tú agus chuir tú cosc ar $user'; + } + + @override + String youUnbannedUser(String user) { + return 'Unbanned tú $user'; + } + + @override + String hasKnocked(String user) { + return '🚪 Tá $user tar éis cnagadh'; + } + + @override + String get usersMustKnock => 'Ní mór d\'úsáideoirí cnag a chur ar'; + + @override + String get noOneCanJoin => 'Ní féidir le duine ar bith páirt a ghlacadh'; + + @override + String userWouldLikeToChangeTheChat(String user) { + return 'Ba mhaith le $user páirt a ghlacadh sa chomhrá.'; + } + + @override + String get noPublicLinkHasBeenCreatedYet => + 'Níor cruthaíodh aon nasc poiblí go fóill'; + + @override + String get knock => 'Cnoc Mhuire'; + + @override + String get users => 'Úsáideoirí'; + + @override + String get unlockOldMessages => 'Díghlasáil seanteachtaireachtaí'; + + @override + String get storeInSecureStorageDescription => + 'Stóráil an eochair aisghabhála i stóráil slán an ghléis seo.'; + + @override + String get saveKeyManuallyDescription => + 'Sábháil an eochair seo de láimh trí dialóg nó gearrthaisce comhroinnte an chórais a spreagadh.'; + + @override + String get storeInAndroidKeystore => 'Stóráil i Android KeyStore'; + + @override + String get storeInAppleKeyChain => 'Stóráil i Apple KeyChain'; + + @override + String get storeSecurlyOnThisDevice => 'Stóráil go daingean ar an ngléas seo'; + + @override + String countFiles(int count) { + return 'Comhaid $count'; + } + + @override + String get user => 'Úsáideoir'; + + @override + String get custom => 'Saincheaptha'; + + @override + String get foregroundServiceRunning => + 'Tá an fógra seo le feiceáil nuair atá an tseirbhís tulra ag rith.'; + + @override + String get screenSharingTitle => 'comhroinnt scáileáin'; + + @override + String get screenSharingDetail => 'Tá do scáileán á roinnt agat i FuffyChat'; + + @override + String get callingPermissions => 'Ceadanna a ghlaoch'; + + @override + String get callingAccount => 'Cuntas ag glaoch'; + + @override + String get callingAccountDetails => + 'Ceadaíonn FluffyChat an aip dhiailiú android dúchais a úsáid.'; + + @override + String get appearOnTop => 'Le feiceáil ar an mbarr'; + + @override + String get appearOnTopDetails => + 'Ceadaíonn sé don aip a bheith ar bharr (ní gá má tá socrú Fluffychat agat cheana féin mar chuntas glao)'; + + @override + String get otherCallingPermissions => + 'Micreafón, ceamara agus ceadanna FluffyChat eile'; + + @override + String get whyIsThisMessageEncrypted => + 'Cén fáth nach féidir an teachtaireacht seo a léamh?'; + + @override + String get noKeyForThisMessage => + 'Féadfaidh sé seo tarlú má seoladh an teachtaireacht sular shínigh tú isteach ar do chuntas ag an ngléas seo.\n\nIs féidir freisin gur chuir an seoltóir bac ar do ghléas nó go ndeachaigh rud éigin mícheart leis an nasc idirlín.\n\nAn bhfuil tú in ann an teachtaireacht a léamh ar sheisiún eile? Ansin is féidir leat an teachtaireacht a aistriú uaidh! Téigh go Socruithe > Gléasanna agus cinntigh go bhfuil do ghléasanna fíoraithe a chéile. Nuair a osclaíonn tú an seomra an chéad uair eile agus an dá sheisiún sa tulra, déanfar na heochracha a tharchur go huathoibríoch.\n\nNár mhaith leat na heochracha a chailleadh agus tú ag logáil amach nó ag aistriú gléasanna? Déan cinnte go bhfuil an cúltaca comhrá cumasaithe agat sna socruithe.'; + + @override + String get newGroup => 'Grúpa nua'; + + @override + String get newSpace => 'Spás nua'; + + @override + String get enterSpace => 'Iontráil spás'; + + @override + String get enterRoom => 'Iontráil seomra'; + + @override + String get allSpaces => 'Gach spás'; + + @override + String numChats(String number) { + return 'Comhráite $number'; + } + + @override + String get hideUnimportantStateEvents => + 'Folaigh imeachtaí stáit gan tábhacht'; + + @override + String get hidePresences => 'Folaigh Liosta Stádais?'; + + @override + String get doNotShowAgain => 'Ná taispeáin arís'; + + @override + String wasDirectChatDisplayName(String oldDisplayName) { + return 'Comhrá folamh (bhí $oldDisplayName)'; + } + + @override + String get newSpaceDescription => + 'Ligeann spásanna duit do chomhráite a chomhdhlúthú agus pobail phríobháideacha nó phoiblí a thógáil.'; + + @override + String get encryptThisChat => 'Criptigh an comhrá seo'; + + @override + String get disableEncryptionWarning => + 'Ar chúiseanna slándála ní féidir leat criptiú a dhíchumasú i gcomhrá, áit ar cumasaíodh é roimhe seo.'; + + @override + String get sorryThatsNotPossible => 'Tá brón orm... nach féidir a dhéanamh'; + + @override + String get deviceKeys => 'Eochracha gléis:'; + + @override + String get reopenChat => 'Comhrá a athoscailt'; + + @override + String get noBackupWarning => + 'Rabhadh! Gan cúltaca comhrá a chumasú, caillfidh tú rochtain ar do theachtaireachtaí criptithe. Moltar go mór an cúltaca comhrá a chumasú ar dtús sula logálann tú amach.'; + + @override + String get noOtherDevicesFound => 'Níor aimsíodh aon ghléas eile'; + + @override + String fileIsTooBigForServer(String max) { + return 'Ní féidir seol! Ní thacaíonn an freastalaí ach le ceangaltáin suas le $max.'; + } + + @override + String fileHasBeenSavedAt(String path) { + return 'Sábháladh an comhad ag $path'; + } + + @override + String get jumpToLastReadMessage => + 'Léim go dtí an teachtaireacht léite is déanaí'; + + @override + String get readUpToHere => 'Léigh suas go dtí seo'; + + @override + String get jump => 'Léim'; + + @override + String get openLinkInBrowser => 'Oscail nasc sa bhrabhsálaí'; + + @override + String get reportErrorDescription => + '😭 Ó, a mhac go deo. Chuaigh rud éigin mícheart. Más mian leat, is féidir leat an fabht seo a thuairisciú do na forbróirí.'; + + @override + String get report => 'tuairisc'; + + @override + String get signInWithPassword => 'Sínigh isteach le pasfhocal'; + + @override + String get pleaseTryAgainLaterOrChooseDifferentServer => + 'Bain triail eile as níos déanaí nó roghnaigh freastalaí eile.'; + + @override + String signInWith(String provider) { + return 'Sínigh isteach le $provider'; + } + + @override + String get profileNotFound => + 'Níorbh fhéidir an t-úsáideoir a aimsiú ar an bhfreastalaí. B\'fhéidir go bhfuil fadhb nasctha ann nó nach bhfuil an t-úsáideoir ann.'; + + @override + String get setTheme => 'Socraigh téama:'; + + @override + String get setColorTheme => 'Socraigh téama datha:'; + + @override + String get invite => 'Tabhair cuireadh'; + + @override + String get inviteGroupChat => '📨 Tabhair cuireadh comhrá grúpa'; + + @override + String get invitePrivateChat => '📨 Tabhair cuireadh comhrá príobháideach'; + + @override + String get invalidInput => 'Ionchur neamhbhailí!'; + + @override + String wrongPinEntered(int seconds) { + return 'Tháinig biorán mícheart isteach! Bain triail eile as i $seconds soicind...'; + } + + @override + String get pleaseEnterANumber => 'Iontráil uimhir níos mó ná 0'; + + @override + String get archiveRoomDescription => + 'Bogfar an comhrá go dtí an chartlann. Beidh úsáideoirí eile in ann a fheiceáil gur fhág tú an comhrá.'; + + @override + String get roomUpgradeDescription => + 'Déanfar an comhrá a athchruthú ansin leis an leagan seomra nua. Cuirfear in iúl do gach rannpháirtí go gcaithfidh siad aistriú chuig an gcomhrá nua. Is féidir leat tuilleadh eolais a fháil faoi leaganacha seomra ag https://spec.matrix.org/latest/rooms/'; + + @override + String get removeDevicesDescription => + 'Beidh tú logáilte amach as an ngléas seo agus ní bheidh tú in ann teachtaireachtaí a fháil a thuilleadh.'; + + @override + String get banUserDescription => + 'Beidh cosc ar an úsáideoir ón gcomhrá agus ní bheidh sé in ann dul isteach sa chomhrá arís go dtí go mbeidh siad gan chosc.'; + + @override + String get unbanUserDescription => + 'Beidh an t-úsáideoir in ann dul isteach sa chomhrá arís má dhéanann siad iarracht.'; + + @override + String get kickUserDescription => + 'Ciceáiltear an t-úsáideoir as an gcomhrá ach níl cosc air. I gcomhráite poiblí, is féidir leis an úsáideoir teacht ar ais ag am ar bith.'; + + @override + String get makeAdminDescription => + 'Nuair a dhéanann tú an riarachán úsáideora seo, b\'fhéidir nach mbeidh tú in ann é seo a chealú mar go mbeidh na ceadanna céanna acu agus atá agat.'; + + @override + String get pushNotificationsNotAvailable => 'Níl fógraí brú ar fáil'; + + @override + String get learnMore => 'Faigh tuilleadh eolais'; + + @override + String get yourGlobalUserIdIs => 'Is é d\'aitheantas úsáideora domhanda: '; + + @override + String noUsersFoundWithQuery(String query) { + return 'Ar an drochuair ní fhéadfaí aon úsáideoir a aimsiú le \"$query\". Seiceáil le do thoil an ndearna tú typo.'; + } + + @override + String get knocking => 'Cnagadh'; + + @override + String chatCanBeDiscoveredViaSearchOnServer(String server) { + return 'Is féidir comhrá a aimsiú tríd an gcuardach ar $server'; + } + + @override + String get searchChatsRooms => 'Cuardaigh #chats, @users...'; + + @override + String get nothingFound => 'Níor aimsíodh aon rud...'; + + @override + String get groupName => 'Ainm an ghrúpa'; + + @override + String get createGroupAndInviteUsers => + 'Cruthaigh grúpa agus tabhair cuireadh d\'úsáideoirí'; + + @override + String get groupCanBeFoundViaSearch => + 'Is féidir teacht ar ghrúpa trí chuardach'; + + @override + String get wrongRecoveryKey => + 'Tá brón orm... Ní cosúil gurb é seo an eochair aisghabhála ceart.'; + + @override + String get startConversation => 'Tosaigh comhrá'; + + @override + String get commandHint_sendraw => 'Seol json amh'; + + @override + String get databaseMigrationTitle => 'Tá an bunachar sonraí optamaithe'; + + @override + String get databaseMigrationBody => + 'Fan, le do thoil. B\'fhéidir go dtógfaidh sé seo nóiméad.'; + + @override + String get leaveEmptyToClearStatus => 'Fág folamh chun do stádas a ghlanadh.'; + + @override + String get select => 'Roghnaigh'; + + @override + String get searchForUsers => 'Cuardaigh @users...'; + + @override + String get pleaseEnterYourCurrentPassword => + 'Iontráil do phasfhocal reatha le do thoil'; + + @override + String get newPassword => 'Pasfhocal nua'; + + @override + String get pleaseChooseAStrongPassword => 'Roghnaigh pasfhocal láidir'; + + @override + String get passwordsDoNotMatch => 'Ní mheaitseálann pasfhocail'; + + @override + String get passwordIsWrong => 'Tá do phasfhocal iontrála mícheart'; + + @override + String get publicLink => 'Nasc poiblí'; + + @override + String get publicChatAddresses => 'Seoltaí comhrá poiblí'; + + @override + String get createNewAddress => 'Cruthaigh seoladh nua'; + + @override + String get joinSpace => 'Glac páirt sa spás'; + + @override + String get publicSpaces => 'Spásanna poiblí'; + + @override + String get addChatOrSubSpace => 'Cuir comhrá nó fo-spás leis'; + + @override + String get subspace => 'Fospás'; + + @override + String get decline => 'Meath'; + + @override + String get thisDevice => 'An gléas seo:'; + + @override + String get initAppError => 'Tharla earráid agus an feidhmchlár á thosú'; + + @override + String get userRole => 'Ról an úsáideora'; + + @override + String minimumPowerLevel(String level) { + return 'Is é $level an t-íosleibhéal cumhachta.'; + } + + @override + String searchIn(String chat) { + return 'Cuardaigh i gcomhrá \"$chat\"...'; + } + + @override + String get searchMore => 'Cuardaigh tuilleadh...'; + + @override + String get gallery => 'Gailearaí'; + + @override + String get files => 'Comhaid'; + + @override + String databaseBuildErrorBody(String url, String error) { + return 'Ní féidir bunachar sonraí SQlite a thógáil. Déanann an aip iarracht an bunachar sonraí oidhreachta a úsáid anois. Tuairiscigh an earráid seo do na forbróirí ag $url. Is í an teachtaireacht earráide: $error'; + } + + @override + String sessionLostBody(String url, String error) { + return 'Cailltear do sheisiún. Tuairiscigh an earráid seo do na forbróirí ag $url. Is í an teachtaireacht earráide: $error'; + } + + @override + String restoreSessionBody(String url, String error) { + return 'Déanann an aip iarracht anois do sheisiún a chur ar ais ón gcúltaca. Tuairiscigh an earráid seo do na forbróirí ag $url. Is í an teachtaireacht earráide: $error'; + } + + @override + String forwardMessageTo(String roomName) { + return 'Seol teachtaireacht ar aghaidh chuig $roomName?'; + } + + @override + String get sendReadReceipts => 'Seol admhálacha léite'; + + @override + String get sendTypingNotificationsDescription => + 'Is féidir le rannpháirtithe eile i gcomhrá a fheiceáil nuair atá teachtaireacht nua á clóscríobh agat.'; + + @override + String get sendReadReceiptsDescription => + 'Is féidir le rannpháirtithe eile i gcomhrá a fheiceáil nuair a bhíonn teachtaireacht léite agat.'; + + @override + String get formattedMessages => 'Teachtaireachtaí formáidithe'; + + @override + String get formattedMessagesDescription => + 'Taispeáin ábhar saibhir teachtaireachta cosúil le téacs trom ag baint úsáide as marcáil síos.'; + + @override + String get verifyOtherUser => '🔐 Fíoraigh úsáideoir eile'; + + @override + String get verifyOtherUserDescription => + 'Má fhíoraíonn tú úsáideoir eile, is féidir leat a bheith cinnte go bhfuil a fhios agat cé leis a bhfuil tú ag scríobh i ndáiríre. 💪\n\nNuair a thosaíonn tú fíorú, feicfidh tú féin agus an t-úsáideoir eile aníos san aip. Ansin feicfidh tú sraith emojis nó uimhreacha a chaithfidh tú a chur i gcomparáid lena chéile.\n\nIs é an bealach is fearr chun é seo a dhéanamh ná bualadh le chéile nó glao físe a thosú. 👭'; + + @override + String get verifyOtherDevice => '🔐 Fíoraigh gléas eile'; + + @override + String get verifyOtherDeviceDescription => + 'Nuair a fhíoraíonn tú gléas eile, is féidir leis na gléasanna sin eochracha a mhalartú, do shlándáil fhoriomlán a mhéadú. 💪 Nuair a thosaíonn tú fíorú, beidh preabfhuinneog le feiceáil san aip ar an dá ghléas. Ansin feicfidh tú sraith emojis nó uimhreacha a chaithfidh tú a chur i gcomparáid lena chéile. Is fearr an dá ghléas a bheith áisiúil sula dtosaíonn tú ar an bhfíorú. 🤳'; + + @override + String acceptedKeyVerification(String sender) { + return '$sender glacadh le fíorú eochair'; + } + + @override + String canceledKeyVerification(String sender) { + return '$sender cealaithe fíorú eochrach'; + } + + @override + String completedKeyVerification(String sender) { + return '$sender fíorú eochair críochnaithe'; + } + + @override + String isReadyForKeyVerification(String sender) { + return 'Tá $sender réidh le haghaidh fíorú eochair'; + } + + @override + String requestedKeyVerification(String sender) { + return 'D\'iarr $sender fíorú eochrach'; + } + + @override + String startedKeyVerification(String sender) { + return 'Thosaigh $sender fíorú eochrach'; + } + + @override + String get transparent => 'Trédhearcach'; + + @override + String get incomingMessages => 'Teachtaireachtaí isteach'; + + @override + String get stickers => 'Greamáin'; + + @override + String get discover => 'Faigh amach'; + + @override + String get commandHint_ignore => + 'Déan neamhaird d\'aitheantas na maitríse sonraithe'; + + @override + String get commandHint_unignore => 'Unignore an ID maitrís tugtha'; + + @override + String unreadChatsInApp(String appname, String unread) { + return '$appname: $unread comhráite gan léamh'; + } + + @override + String get noDatabaseEncryption => + 'Ní thacaítear le criptiú bunachar sonraí ar an ardán seo'; + + @override + String thereAreCountUsersBlocked(Object count) { + return 'Faoi láthair tá bac curtha ar úsáideoirí $count.'; + } + + @override + String get restricted => 'Srianta'; + + @override + String get knockRestricted => 'Cnoc Mhuire srianta'; + + @override + String goToSpace(Object space) { + return 'Téigh go dtí an spás: $space'; + } + + @override + String get markAsUnread => 'Marcáil mar gan léamh'; + + @override + String userLevel(int level) { + return '$level - Úsáideoir'; + } + + @override + String moderatorLevel(int level) { + return '$level - Modhnóir'; + } + + @override + String adminLevel(int level) { + return '$level - Riarachán'; + } + + @override + String get changeGeneralChatSettings => + 'Athraigh socruithe ginearálta comhrá'; + + @override + String get inviteOtherUsers => + 'Tabhair cuireadh d\'úsáideoirí eile chuig an gcomhrá seo'; + + @override + String get changeTheChatPermissions => 'Athraigh na ceadanna comhrá'; + + @override + String get changeTheVisibilityOfChatHistory => + 'Athraigh infheictheacht stair an chomhrá'; + + @override + String get changeTheCanonicalRoomAlias => + 'Athraigh an príomhsheoladh comhrá poiblí'; + + @override + String get sendRoomNotifications => 'Seol fógraí @room'; + + @override + String get changeTheDescriptionOfTheGroup => + 'Athraigh an cur síos ar an gcomhrá'; + + @override + String get chatPermissionsDescription => + 'Sainmhínigh cén leibhéal cumhachta is gá le haghaidh gníomhartha áirithe sa chomhrá seo. De ghnáth bíonn na leibhéil chumhachta 0, 50 agus 100 ag déanamh ionadaíochta d\'úsáideoirí, do mhodhnóirí agus do riarthóirí, ach is féidir aon ghrádú a dhéanamh.'; + + @override + String updateInstalled(String version) { + return '🎉 Nuashonraigh $version suiteáilte!'; + } + + @override + String get changelog => 'ChangelogName'; + + @override + String get sendCanceled => 'Cealaíodh seoladh'; + + @override + String get loginWithMatrixId => 'Logáil isteach le Matrix-ID'; + + @override + String get discoverHomeservers => 'Faigh amach faoi fhreastalaithe baile'; + + @override + String get whatIsAHomeserver => 'Cad is freastalaí baile ann?'; + + @override + String get homeserverDescription => + 'Stóráiltear do chuid sonraí go léir ar an bhfreastalaí baile, díreach cosúil le soláthraí ríomhphoist. Is féidir leat an freastalaí baile is mian leat a úsáid a roghnú, agus is féidir leat cumarsáid a dhéanamh le gach duine fós. Foghlaim níos mó ag https://matrix.org.'; + + @override + String get doesNotSeemToBeAValidHomeserver => + 'Ní cosúil gur freastalaí baile comhoiriúnach é. URL mícheart?'; + + @override + String get calculatingFileSize => 'Méid an chomhaid á ríomh...'; + + @override + String get prepareSendingAttachment => 'Ullmhaigh an t- iatán á sheoladh...'; + + @override + String get sendingAttachment => 'Iatán á sheoladh...'; + + @override + String get generatingVideoThumbnail => 'Mionsamhail físe á cruthú...'; + + @override + String get compressVideo => 'Físeán á chomhbhrú...'; + + @override + String sendingAttachmentCountOfCount(int index, int length) { + return 'Ceangaltán $index de $length á sheoladh...'; + } + + @override + String serverLimitReached(int seconds) { + return 'Sroicheadh teorainn an fhreastalaí! Ag fanacht $seconds soicind...'; + } + + @override + String get oneOfYourDevicesIsNotVerified => + 'Ní fhíoraítear ceann de do ghléasanna'; + + @override + String get noticeChatBackupDeviceVerification => + 'Nóta: Nuair a nascann tú do ghléasanna go léir leis an gcúltaca comhrá, déantar iad a fhíorú go huathoibríoch.'; + + @override + String get continueText => 'Lean ar aghaidh'; + + @override + String get welcomeText => + 'Hey Hey 👋 Is é seo FluffyChat. Is féidir leat síniú isteach in aon fhreastalaí baile, atá comhoiriúnach leis https://matrix.org. Agus ansin comhrá a dhéanamh le duine ar bith. Is líonra teachtaireachtaí díláraithe ollmhór é!'; + + @override + String get blur => 'Doiléirigh:'; + + @override + String get opacity => 'Teimhneacht:'; + + @override + String get setWallpaper => 'Socraigh cúlbhrat'; + + @override + String get manageAccount => 'Bainistigh cuntas'; + + @override + String get noContactInformationProvided => + 'Ní sholáthraíonn an freastalaí aon fhaisnéis teagmhála bhailí'; + + @override + String get contactServerAdmin => 'Déan teagmháil le admin an fhreastalaí'; + + @override + String get contactServerSecurity => + 'Déan teagmháil le slándáil an fhreastalaí'; + + @override + String get supportPage => 'Leathanach tacaíochta'; + + @override + String get serverInformation => 'Eolas freastalaí:'; + + @override + String get name => 'Ainm'; + + @override + String get version => 'Leagan'; + + @override + String get website => 'Suíomh Gréasáin'; + + @override + String get compress => 'Comhbhrúigh'; + + @override + String get boldText => 'Téacs trom'; + + @override + String get italicText => 'Téacs iodálach'; + + @override + String get strikeThrough => 'Stailc tríd'; + + @override + String get pleaseFillOut => 'Líon amach le do thoil'; + + @override + String get invalidUrl => 'URL neamhbhailí'; + + @override + String get addLink => 'Cuir nasc leis'; + + @override + String get unableToJoinChat => + 'Ní féidir páirt a ghlacadh sa chomhrá. B’fhéidir go bhfuil an comhrá dúnta cheana féin ag an bpáirtí eile.'; + + @override + String get previous => 'Roimhe Seo'; + + @override + String get otherPartyNotLoggedIn => + 'Níl an páirtí eile logáilte isteach faoi láthair agus mar sin ní féidir leo teachtaireachtaí a fháil!'; + + @override + String appWantsToUseForLogin(String server) { + return 'Úsáid \'$server\' chun logáil isteach'; + } + + @override + String get appWantsToUseForLoginDescription => + 'Ligeann tú leis seo don aip agus don suíomh Gréasáin faisnéis a roinnt fút.'; + + @override + String get open => 'Oscail'; + + @override + String get waitingForServer => 'Ag fanacht leis an bhfreastalaí...'; + + @override + String get appIntroduction => + 'Ligeann FluffyChat duit comhrá a dhéanamh le do chairde thar theachtairí éagsúla. Foghlaim tuilleadh ag https://matrix.org nó tapáil *Ar aghaidh*.'; + + @override + String get newChatRequest => '📩 Iarratas comhrá nua'; + + @override + String get contentNotificationSettings => 'Socruithe fógra inneachair'; + + @override + String get generalNotificationSettings => 'Socruithe ginearálta fógra'; + + @override + String get roomNotificationSettings => 'Socruithe fógra seomra'; + + @override + String get userSpecificNotificationSettings => + 'Socruithe fógra sainiúla don úsáideoir'; + + @override + String get otherNotificationSettings => 'Socruithe fógra eile'; + + @override + String get notificationRuleContainsUserName => 'Tá Ainm Úsáideora ann'; + + @override + String get notificationRuleContainsUserNameDescription => + 'Cuireann sé sin in iúl don úsáideoir nuair a bhíonn a ainm úsáideora i dteachtaireacht.'; + + @override + String get notificationRuleMaster => 'Balbhaigh gach fógra'; + + @override + String get notificationRuleMasterDescription => + 'Sáraíonn sé gach riail eile agus díchumasaítear gach fógra.'; + + @override + String get notificationRuleSuppressNotices => + 'Bain Teachtaireachtaí Uathoibrithe'; + + @override + String get notificationRuleSuppressNoticesDescription => + 'Sochtann sé fógraí ó chliaint uathoibrithe amhail róbónna.'; + + @override + String get notificationRuleInviteForMe => 'Tabhair cuireadh Do Mhise'; + + @override + String get notificationRuleInviteForMeDescription => + 'Cuireann sé seo ar an eolas don úsáideoir nuair a thugtar cuireadh dó/di go seomra.'; + + @override + String get notificationRuleMemberEvent => 'Imeacht Ball'; + + @override + String get notificationRuleMemberEventDescription => + 'Sochtann fógraí le haghaidh imeachtaí ballraíochta.'; + + @override + String get notificationRuleIsUserMention => 'Luaigh Úsáideoir'; + + @override + String get notificationRuleIsUserMentionDescription => + 'Cuireann sé sin in iúl don úsáideoir nuair a luaitear go díreach iad i dteachtaireacht.'; + + @override + String get notificationRuleContainsDisplayName => 'Tá Ainm Taispeána ann'; + + @override + String get notificationRuleContainsDisplayNameDescription => + 'Cuireann sé sin in iúl don úsáideoir nuair a bhíonn a ainm taispeána i dteachtaireacht.'; + + @override + String get notificationRuleIsRoomMention => 'Luaigh Seomra'; + + @override + String get notificationRuleIsRoomMentionDescription => + 'Cuireann sé sin in iúl don úsáideoir nuair a luaitear seomra.'; + + @override + String get notificationRuleRoomnotif => 'Fógra Seomra'; + + @override + String get notificationRuleRoomnotifDescription => + 'Cuireann sé seo in iúl don úsáideoir nuair a bhíonn \'@room\' i dteachtaireacht.'; + + @override + String get notificationRuleTombstone => 'Leac uaighe'; + + @override + String get notificationRuleTombstoneDescription => + 'Cuireann sé seo in iúl don úsáideoir faoi theachtaireachtaí díghníomhaithe seomra.'; + + @override + String get notificationRuleReaction => 'Imoibriú'; + + @override + String get notificationRuleReactionDescription => + 'Sochtann fógraí le haghaidh frithghníomhartha.'; + + @override + String get notificationRuleRoomServerAcl => 'Freastalaí Seomra ACL'; + + @override + String get notificationRuleRoomServerAclDescription => + 'Sochtann sé fógraí do liostaí rialaithe rochtana freastalaí seomra (ACL).'; + + @override + String get notificationRuleSuppressEdits => 'Cuir na hEagarthóirí ar ceal'; + + @override + String get notificationRuleSuppressEditsDescription => + 'Sochtann fógraí le haghaidh teachtaireachtaí curtha in eagar.'; + + @override + String get notificationRuleCall => 'Glaoigh'; + + @override + String get notificationRuleCallDescription => + 'Cuireann sé an t-úsáideoir ar an eolas faoi ghlaonna.'; + + @override + String get notificationRuleEncryptedRoomOneToOne => + 'Seomra Duine le Duine Criptithe'; + + @override + String get notificationRuleEncryptedRoomOneToOneDescription => + 'Cuireann sé seo in iúl don úsáideoir faoi theachtaireachtaí i seomraí duine le duine criptithe.'; + + @override + String get notificationRuleRoomOneToOne => 'Seomra duine le duine'; + + @override + String get notificationRuleRoomOneToOneDescription => + 'Cuireann sé seo in iúl don úsáideoir faoi theachtaireachtaí i seomraí duine le duine.'; + + @override + String get notificationRuleMessage => 'Teachtaireacht'; + + @override + String get notificationRuleMessageDescription => + 'Cuireann sé seo in iúl don úsáideoir faoi theachtaireachtaí ginearálta.'; + + @override + String get notificationRuleEncrypted => 'Criptithe'; + + @override + String get notificationRuleEncryptedDescription => + 'Cuireann sé seo in iúl don úsáideoir faoi theachtaireachtaí i seomraí criptithe.'; + + @override + String get notificationRuleJitsi => 'Jitsi'; + + @override + String get notificationRuleJitsiDescription => + 'Cuireann sé seo in iúl don úsáideoir faoi imeachtaí giuirléidí Jitsi.'; + + @override + String get notificationRuleServerAcl => 'Seachtaigh Freastalaí ACL Imeachtaí'; + + @override + String get notificationRuleServerAclDescription => + 'Sochtann fógraí le haghaidh imeachtaí Freastalaí ACL.'; + + @override + String unknownPushRule(String rule) { + return 'Riail bhrú anaithnid \'$rule\''; + } + + @override + String get deletePushRuleCanNotBeUndone => + 'Má scriosann tú an socrú fógra seo, ní féidir é seo a chealú.'; + + @override + String get more => 'Tuilleadh'; + + @override + String get shareKeysWith => 'Roinn na heochracha le...'; + + @override + String get shareKeysWithDescription => + 'Cad iad na gléasanna ar cheart muinín a chur iontu ionas gur féidir leo do chuid teachtaireachtaí a léamh i gcomhráite criptithe?'; + + @override + String get allDevices => 'Gach gléasanna'; + + @override + String get crossVerifiedDevicesIfEnabled => + 'Gléasanna trasfhíoraithe má tá siad cumasaithe'; + + @override + String get crossVerifiedDevices => 'Feistí trasfhíoraithe'; + + @override + String get verifiedDevicesOnly => 'Gléasanna fíoraithe amháin'; + + @override + String get takeAPhoto => 'Glac grianghraf'; + + @override + String get recordAVideo => 'Taifead físeán'; + + @override + String get optionalMessage => 'Teachtaireacht (Roghnach)…'; + + @override + String get notSupportedOnThisDevice => 'Ní thacaítear leis ar an ngléas seo'; + + @override + String get enterNewChat => 'Cuir isteach comhrá nua'; + + @override + String get approve => 'Approve'; + + @override + String get youHaveKnocked => 'You have knocked'; + + @override + String get pleaseWaitUntilInvited => + 'Please wait now, until someone from the room invites you.'; +} diff --git a/lib/generated/l10n/l10n_gl.dart b/lib/generated/l10n/l10n_gl.dart new file mode 100644 index 0000000..167e464 --- /dev/null +++ b/lib/generated/l10n/l10n_gl.dart @@ -0,0 +1,2758 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'l10n.dart'; + +// ignore_for_file: type=lint + +/// The translations for Galician (`gl`). +class L10nGl extends L10n { + L10nGl([String locale = 'gl']) : super(locale); + + @override + String get noSendPermission => 'You can\'t send messages here'; + + @override + String get alwaysUse24HourFormat => 'falso'; + + @override + String get repeatPassword => 'Repite o contrasinal'; + + @override + String get notAnImage => 'Non é un ficheiro de imaxe.'; + + @override + String get setCustomPermissionLevel => 'Set custom permission level'; + + @override + String get setPermissionsLevelDescription => + 'Please choose a predefined role below or enter a custom permission level between 0 and 100.'; + + @override + String get ignoreUser => 'Ignore user'; + + @override + String get normalUser => 'Normal user'; + + @override + String get remove => 'Quitar'; + + @override + String get importNow => 'Importar agora'; + + @override + String get importEmojis => 'Importar Emojis'; + + @override + String get importFromZipFile => 'Importar desde ficheiro .zip'; + + @override + String get exportEmotePack => 'Exportar paquete Emote como .zip'; + + @override + String get replace => 'Substituír'; + + @override + String get about => 'Acerca de'; + + @override + String aboutHomeserver(String homeserver) { + return 'Sobre $homeserver'; + } + + @override + String get accept => 'Aceptar'; + + @override + String acceptedTheInvitation(String username) { + return '👍 $username aceptou o convite'; + } + + @override + String get account => 'Conta'; + + @override + String activatedEndToEndEncryption(String username) { + return '🔐 $username activou a cifraxe extremo-a-extremo'; + } + + @override + String get addEmail => 'Engadir email'; + + @override + String get confirmMatrixId => + 'Confirma o teu ID Matrix para poder eliminar a conta.'; + + @override + String supposedMxid(String mxid) { + return 'Debería ser $mxid'; + } + + @override + String get addChatDescription => 'Engadir descrición da conversa...'; + + @override + String get addToSpace => 'Engadir ao espazo'; + + @override + String get admin => 'Admin'; + + @override + String get alias => 'alias'; + + @override + String get all => 'Todos'; + + @override + String get allChats => 'Todas as conversas'; + + @override + String get commandHint_roomupgrade => + 'Actualizar esta sala á versión de sala indicada'; + + @override + String get commandHint_googly => 'Envía uns ollos desos grandes'; + + @override + String get commandHint_cuddle => 'Envía un agarimo'; + + @override + String get commandHint_hug => 'Envía un abrazo'; + + @override + String googlyEyesContent(String senderName) { + return '$senderName enviouche uns ollos grandes'; + } + + @override + String cuddleContent(String senderName) { + return '$senderName mándache un achuche'; + } + + @override + String hugContent(String senderName) { + return '$senderName abrázate'; + } + + @override + String answeredTheCall(String senderName) { + return '$senderName respondeu á chamada'; + } + + @override + String get anyoneCanJoin => 'Calquera pode unirse'; + + @override + String get appLock => 'Bloqueo da app'; + + @override + String get appLockDescription => + 'Bloquear a app cun código PIN cando non a uses'; + + @override + String get archive => 'Arquivo'; + + @override + String get areGuestsAllowedToJoin => 'Permitir o acceso de convidadas'; + + @override + String get areYouSure => 'Tes a certeza?'; + + @override + String get areYouSureYouWantToLogout => 'Tes a certeza de querer saír?'; + + @override + String get askSSSSSign => + 'Para poder asinar a outra persoa, escribe a túa frase de paso ou chave de recuperación.'; + + @override + String askVerificationRequest(String username) { + return 'Aceptar a solicitude de verificación de $username?'; + } + + @override + String get autoplayImages => 'Reproducir automáticamente adhesivos e emotes'; + + @override + String badServerLoginTypesException(String serverVersions, + String supportedVersions, Object suportedVersions) { + return 'O servidor soporta as seguintes formas de conexión:\n$serverVersions\nPero esta app só soporta:\n$supportedVersions'; + } + + @override + String get sendTypingNotifications => 'Permitir ver que estás escribindo'; + + @override + String get swipeRightToLeftToReply => + 'Despraza hacia a esquerda para responder'; + + @override + String get sendOnEnter => 'Enter para enviar'; + + @override + String badServerVersionsException(String serverVersions, + String supportedVersions, Object serverVerions, Object suportedVersions) { + return 'O servidor soporta as seguintes características:\n$serverVersions\nPero esta app só soporta $supportedVersions'; + } + + @override + String countChatsAndCountParticipants(int chats, int participants) { + return '$chats charlas e $participants participantes'; + } + + @override + String get noMoreChatsFound => 'Non se atopan máis charlas…'; + + @override + String get noChatsFoundHere => + 'Sen charlas por aquí. Comeza unha nova conversa con alguén premendo no botón de abaixo. ⤵️'; + + @override + String get joinedChats => 'Charlas nas que participas'; + + @override + String get unread => 'Sen ler'; + + @override + String get space => 'Espazo'; + + @override + String get spaces => 'Espazos'; + + @override + String get banFromChat => 'Vetar na conversa'; + + @override + String get banned => 'Vetada'; + + @override + String bannedUser(String username, String targetName) { + return '$username vetou a $targetName'; + } + + @override + String get blockDevice => 'Bloquear dispositivo'; + + @override + String get blocked => 'Bloqueado'; + + @override + String get botMessages => 'Mensaxes de Bot'; + + @override + String get cancel => 'Cancelar'; + + @override + String cantOpenUri(String uri) { + return 'Non se pode abrir o URI $uri'; + } + + @override + String get changeDeviceName => 'Cambiar nome do dispositivo'; + + @override + String changedTheChatAvatar(String username) { + return '$username cambiou o avatar da conversa'; + } + + @override + String changedTheChatDescriptionTo(String username, String description) { + return '$username mudou a descrición da conversa a: \'$description\''; + } + + @override + String changedTheChatNameTo(String username, String chatname) { + return '$username mudou o nome da charla a: \'$chatname\''; + } + + @override + String changedTheChatPermissions(String username) { + return '$username mudou os permisos da conversa'; + } + + @override + String changedTheDisplaynameTo(String username, String displayname) { + return '$username cambiou o nome público a: \'$displayname\''; + } + + @override + String changedTheGuestAccessRules(String username) { + return '$username mudou as regras de acceso para convidadas'; + } + + @override + String changedTheGuestAccessRulesTo(String username, String rules) { + return '$username mudou as regras de acceso para convidadas a: $rules'; + } + + @override + String changedTheHistoryVisibility(String username) { + return '$username mudou a visibilidade do historial'; + } + + @override + String changedTheHistoryVisibilityTo(String username, String rules) { + return '$username mudou a visibilidade do historial a: $rules'; + } + + @override + String changedTheJoinRules(String username) { + return '$username mudou as regras de acceso'; + } + + @override + String changedTheJoinRulesTo(String username, String joinRules) { + return '$username mudou as regras de acceso a: $joinRules'; + } + + @override + String changedTheProfileAvatar(String username) { + return '$username mudou o avatar'; + } + + @override + String changedTheRoomAliases(String username) { + return '$username mudou os alias da sala'; + } + + @override + String changedTheRoomInvitationLink(String username) { + return '$username mudou a ligazón de convite'; + } + + @override + String get changePassword => 'Mudar contrasinal'; + + @override + String get changeTheHomeserver => 'Mudar de servidor de inicio'; + + @override + String get changeTheme => 'Cambiar o estilo'; + + @override + String get changeTheNameOfTheGroup => 'Mudar o nome do grupo'; + + @override + String get changeYourAvatar => 'Cambia o avatar'; + + @override + String get channelCorruptedDecryptError => 'A cifraxe está estragada'; + + @override + String get chat => 'Conversa'; + + @override + String get yourChatBackupHasBeenSetUp => + 'Configurouse a copia de apoio da charla.'; + + @override + String get chatBackup => 'Copia de apoio'; + + @override + String get chatBackupDescription => + 'As mensaxes antigas están protexidas cunha chave de recuperación. Pon coidado e non a perdas.'; + + @override + String get chatDetails => 'Detalles da conversa'; + + @override + String get chatHasBeenAddedToThisSpace => + 'Engadiuse a conversa a este espazo'; + + @override + String get chats => 'Conversas'; + + @override + String get chooseAStrongPassword => 'Escolle un contrasinal forte'; + + @override + String get clearArchive => 'Baleirar arquivo'; + + @override + String get close => 'Pechar'; + + @override + String get commandHint_markasdm => + 'Marcar como sala de mensaxe directa para o ID Matrix indicado'; + + @override + String get commandHint_markasgroup => 'Marcar como grupo'; + + @override + String get commandHint_ban => 'Vetar a usuaria indicada desta sala'; + + @override + String get commandHint_clearcache => 'Baleirar caché'; + + @override + String get commandHint_create => + 'Crear un grupo de conversa baleiro\nUsa --no-encryption para desactivar a cifraxe'; + + @override + String get commandHint_discardsession => 'Descartar sesión'; + + @override + String get commandHint_dm => + 'Iniciar unha charla directa\nUsa --no-encryption para desactivar a cifraxe'; + + @override + String get commandHint_html => 'Enviar texto con formato HTML'; + + @override + String get commandHint_invite => 'Convidar á usuaria a esta sala'; + + @override + String get commandHint_join => 'Unirte á sala indicada'; + + @override + String get commandHint_kick => 'Eliminar a usuaria indicada desta sala'; + + @override + String get commandHint_leave => 'Saír desta sala'; + + @override + String get commandHint_me => 'Conta algo sobre ti'; + + @override + String get commandHint_myroomavatar => + 'Establece a túa imaxe para esta sala (por mxc-uri)'; + + @override + String get commandHint_myroomnick => + 'Establece o teu nome público para esta sala'; + + @override + String get commandHint_op => + 'Establecer o nivel de responsabilidade da usuaria (por defecto: 50)'; + + @override + String get commandHint_plain => 'Enviar texto sen formato'; + + @override + String get commandHint_react => 'Enviar resposta como reacción'; + + @override + String get commandHint_send => 'Enviar texto'; + + @override + String get commandHint_unban => 'Retirar veto á usuaria para esta sala'; + + @override + String get commandInvalid => 'Comando non válido'; + + @override + String commandMissing(String command) { + return '$command non é un comando.'; + } + + @override + String get compareEmojiMatch => 'Compara estes emojis'; + + @override + String get compareNumbersMatch => 'Compara estes números'; + + @override + String get configureChat => 'Configurar conversa'; + + @override + String get confirm => 'Confirmar'; + + @override + String get connect => 'Conectar'; + + @override + String get contactHasBeenInvitedToTheGroup => + 'O contacto foi convidado ao grupo'; + + @override + String get containsDisplayName => 'Contén nome público'; + + @override + String get containsUserName => 'Contén nome de usuaria'; + + @override + String get contentHasBeenReported => + 'O contido foi denunciado á administración do servidor'; + + @override + String get copiedToClipboard => 'Copiado ao portapapeis'; + + @override + String get copy => 'Copiar'; + + @override + String get copyToClipboard => 'Copiar ao portapapeis'; + + @override + String couldNotDecryptMessage(String error) { + return 'Non se descifrou a mensaxe: $error'; + } + + @override + String countParticipants(int count) { + return '$count participantes'; + } + + @override + String get create => 'Crear'; + + @override + String createdTheChat(String username) { + return '💬 $username creou a conversa'; + } + + @override + String get createGroup => 'Crear grupo'; + + @override + String get createNewSpace => 'Novo espazo'; + + @override + String get currentlyActive => 'Actualmente activo'; + + @override + String get darkTheme => 'Escuro'; + + @override + String dateAndTimeOfDay(String date, String timeOfDay) { + return '$date, $timeOfDay'; + } + + @override + String dateWithoutYear(String month, String day) { + return '$day-$month'; + } + + @override + String dateWithYear(String year, String month, String day) { + return '$day-$month-$year'; + } + + @override + String get deactivateAccountWarning => + 'Esto desactivará a conta. Esto non ten volta atrás. Estás segura?'; + + @override + String get defaultPermissionLevel => + 'Nivel de permisos por defecto para novas usuarias'; + + @override + String get delete => 'Eliminar'; + + @override + String get deleteAccount => 'Eliminar conta'; + + @override + String get deleteMessage => 'Eliminar mensaxe'; + + @override + String get device => 'Dispositivo'; + + @override + String get deviceId => 'ID do dispositivo'; + + @override + String get devices => 'Dispositivos'; + + @override + String get directChats => 'Conversas Directas'; + + @override + String get allRooms => 'Todas as Conversas en grupo'; + + @override + String get displaynameHasBeenChanged => 'O nome público mudou'; + + @override + String get downloadFile => 'Descargar ficheiro'; + + @override + String get edit => 'Editar'; + + @override + String get editBlockedServers => 'Editar servidores bloqueados'; + + @override + String get chatPermissions => 'Permisos da conversa'; + + @override + String get editDisplayname => 'Editar nome público'; + + @override + String get editRoomAliases => 'Editar alias da sala'; + + @override + String get editRoomAvatar => 'Editar avatar da sala'; + + @override + String get emoteExists => 'Xa existe ese emote!'; + + @override + String get emoteInvalid => 'Atallo do emote non é válido!'; + + @override + String get emoteKeyboardNoRecents => + 'Os emotes usados recentemente aparecerán aquí...'; + + @override + String get emotePacks => 'Paquetes de Emotes para a sala'; + + @override + String get emoteSettings => 'Axustes de Emote'; + + @override + String get globalChatId => 'ID Global da charla'; + + @override + String get accessAndVisibility => 'Acceso e Visibilidade'; + + @override + String get accessAndVisibilityDescription => + 'Quen pode unirse a esta charla e de que xeito e como poden atopala.'; + + @override + String get calls => 'Chamadas'; + + @override + String get customEmojisAndStickers => 'Emojis personais e adhesivos'; + + @override + String get customEmojisAndStickersBody => + 'Engade ou comparte emojis personais e adhesivos que poden usarse nas charlas.'; + + @override + String get emoteShortcode => 'Atallo de Emote'; + + @override + String get emoteWarnNeedToPick => 'Escribe un atallo e asocialle unha imaxe!'; + + @override + String get emptyChat => 'Conversa baleira'; + + @override + String get enableEmotesGlobally => 'Activar paquete emote globalmente'; + + @override + String get enableEncryption => 'Activar cifraxe'; + + @override + String get enableEncryptionWarning => + 'Non poderás desactivar a cifraxe posteriormente, tes certeza?'; + + @override + String get encrypted => 'Cifrado'; + + @override + String get encryption => 'Cifraxe'; + + @override + String get encryptionNotEnabled => 'A cifraxe non está activada'; + + @override + String endedTheCall(String senderName) { + return '$senderName rematou a chamada'; + } + + @override + String get enterAnEmailAddress => 'Escribe un enderezo de email'; + + @override + String get homeserver => 'Servidor de inicio'; + + @override + String get enterYourHomeserver => 'Escribe o teu servidor de inicio'; + + @override + String errorObtainingLocation(String error) { + return 'Erro ao obter a localización: $error'; + } + + @override + String get everythingReady => 'Todo preparado!'; + + @override + String get extremeOffensive => 'Extremadamente ofensivo'; + + @override + String get fileName => 'Nome do ficheiro'; + + @override + String get fluffychat => 'FluffyChat'; + + @override + String get fontSize => 'Tamaño da letra'; + + @override + String get forward => 'Reenviar'; + + @override + String get fromJoining => 'Desde que se una'; + + @override + String get fromTheInvitation => 'Desde o convite'; + + @override + String get goToTheNewRoom => 'Ir á nova sala'; + + @override + String get group => 'Grupo'; + + @override + String get chatDescription => 'Descrición da conversa'; + + @override + String get chatDescriptionHasBeenChanged => + 'Cambiou a descrición da conversa'; + + @override + String get groupIsPublic => 'O grupo é público'; + + @override + String get groups => 'Grupos'; + + @override + String groupWith(String displayname) { + return 'Grupo con $displayname'; + } + + @override + String get guestsAreForbidden => 'Non se permiten convidadas'; + + @override + String get guestsCanJoin => 'Permítense convidadas'; + + @override + String hasWithdrawnTheInvitationFor(String username, String targetName) { + return '$username retirou o convite para $targetName'; + } + + @override + String get help => 'Axuda'; + + @override + String get hideRedactedEvents => 'Agochar eventos editados'; + + @override + String get hideRedactedMessages => 'Agochar mensaxes editadas'; + + @override + String get hideRedactedMessagesBody => + 'Se alguén corrixe unha mensaxe entón esta xa non será visible na charla.'; + + @override + String get hideInvalidOrUnknownMessageFormats => + 'Agochar formatos de mensaxe non válidos ou descoñecidos'; + + @override + String get howOffensiveIsThisContent => 'É moi ofensivo este contido?'; + + @override + String get id => 'ID'; + + @override + String get identity => 'Identidade'; + + @override + String get block => 'Bloquear'; + + @override + String get blockedUsers => 'Usuarias bloqueadas'; + + @override + String get blockListDescription => + 'Podes bloquear usuarias que che molesten. Non recibirás mensaxes nin convites para salas procedentes das usuarias da túa lista persoal de bloqueo.'; + + @override + String get blockUsername => 'Ignorar identificador'; + + @override + String get iHaveClickedOnLink => 'Premín na ligazón'; + + @override + String get incorrectPassphraseOrKey => + 'Frase de paso ou chave de recuperación incorrecta'; + + @override + String get inoffensive => 'Inofensivo'; + + @override + String get inviteContact => 'Convidar contacto'; + + @override + String inviteContactToGroupQuestion(Object contact, Object groupName) { + return 'Queres convidar a $contact para que se una á conversa \"$groupName\"?'; + } + + @override + String inviteContactToGroup(String groupName) { + return 'Convidar contacto a $groupName'; + } + + @override + String get noChatDescriptionYet => + 'Aínda non se escribeu a descrición da conversa.'; + + @override + String get tryAgain => 'Intentar outra vez'; + + @override + String get invalidServerName => 'Nome de servidor non válido'; + + @override + String get invited => 'Convidado'; + + @override + String get redactMessageDescription => + 'A mensaxe vai ser editada para todas as participantes na conversa. Non ten volta atrás.'; + + @override + String get optionalRedactReason => + '(Optativo) Razón para editar a mensaxe...'; + + @override + String invitedUser(String username, String targetName) { + return '📩 $username convidou a $targetName'; + } + + @override + String get invitedUsersOnly => 'Só usuarias convidadas'; + + @override + String get inviteForMe => 'Convite para min'; + + @override + String inviteText(String username, String link) { + return '$username convidoute a FluffyChat.\n1. Visita fluffychat.im e instala a app\n2. Crea unha conta ou Accede\n3. Abre a ligazón do convite: \n $link'; + } + + @override + String get isTyping => 'está escribindo…'; + + @override + String joinedTheChat(String username) { + return '👋 $username uníuse á conversa'; + } + + @override + String get joinRoom => 'Unirse á sala'; + + @override + String kicked(String username, String targetName) { + return '👞 $username expulsou a $targetName'; + } + + @override + String kickedAndBanned(String username, String targetName) { + return '🙅 $username expulsou e vetou a $targetName'; + } + + @override + String get kickFromChat => 'Expulsar da conversa'; + + @override + String lastActiveAgo(String localizedTimeShort) { + return 'Última actividade: $localizedTimeShort'; + } + + @override + String get leave => 'Saír'; + + @override + String get leftTheChat => 'Deixar a conversa'; + + @override + String get license => 'Licenza'; + + @override + String get lightTheme => 'Claro'; + + @override + String loadCountMoreParticipants(int count) { + return 'Cargar $count participantes máis'; + } + + @override + String get dehydrate => 'Exportar sesión e eliminar dispositivo'; + + @override + String get dehydrateWarning => + 'Esta acción non é reversible. Pon coidado en gardar o ficheiro de apoio.'; + + @override + String get dehydrateTor => 'Usuarias TOR: Exportar sesión'; + + @override + String get dehydrateTorLong => + 'Para usuarias de TOR, é recomendable exportar a sesión antes de pechar a xanela.'; + + @override + String get hydrateTor => 'Usuarias TOR: Importar a sesión exportada'; + + @override + String get hydrateTorLong => + 'Exportaches a túa sesión a última vez en TOR? Importaa rápidamente e segue conversando.'; + + @override + String get hydrate => 'Restablecer desde copia de apoio'; + + @override + String get loadingPleaseWait => 'Cargando... Agarda.'; + + @override + String get loadMore => 'Cargar máis…'; + + @override + String get locationDisabledNotice => + 'Os servizos de localización están desactivados. Actívaos para poder compartir a localización.'; + + @override + String get locationPermissionDeniedNotice => + 'Permiso de localización denegado. Concede este permiso para poder compartir a localización.'; + + @override + String get login => 'Acceder'; + + @override + String logInTo(String homeserver) { + return 'Entrar en $homeserver'; + } + + @override + String get logout => 'Pechar sesión'; + + @override + String get memberChanges => 'Cambios de participantes'; + + @override + String get mention => 'Mención'; + + @override + String get messages => 'Mensaxes'; + + @override + String get messagesStyle => 'Mensaxes:'; + + @override + String get moderator => 'Moderadora'; + + @override + String get muteChat => 'Acalar conversa'; + + @override + String get needPantalaimonWarning => + 'Ten en conta que polo de agora precisas Pantalaimon para a cifraxe extremo-a-extremo.'; + + @override + String get newChat => 'Nova conversa'; + + @override + String get newMessageInFluffyChat => '💬 Nova mensaxe en FluffyChat'; + + @override + String get newVerificationRequest => 'Nova solicitude de verificación!'; + + @override + String get next => 'Seguinte'; + + @override + String get no => 'Non'; + + @override + String get noConnectionToTheServer => 'Sen conexión co servidor'; + + @override + String get noEmotesFound => 'Non hai emotes. 😕'; + + @override + String get noEncryptionForPublicRooms => + 'Só podes activar a cifraxe tan pronto como a sala non sexa públicamente accesible.'; + + @override + String get noGoogleServicesWarning => + 'Semella que non tes Firebase Cloud Messaging dispoñible no teu dispositivo. Para recibir notificacións push recomendamos que instales ntfy. Con ntfy ou outro provedor Unified Push podes recibir notificacións push de xeito seguro. Podes descargar ntfy desde a PlayStore ou F-Droid.'; + + @override + String noMatrixServer(String server1, String server2) { + return '$server1 non é un servidor matrix, usar $server2 no seu lugar?'; + } + + @override + String get shareInviteLink => 'Comparte ligazón de convite'; + + @override + String get scanQrCode => 'Escanear código QR'; + + @override + String get none => 'Ningún'; + + @override + String get noPasswordRecoveryDescription => + 'Aínda non engaiches ningún xeito de recuperar o contrasinal.'; + + @override + String get noPermission => 'Sen permiso'; + + @override + String get noRoomsFound => 'Non se atoparon salas…'; + + @override + String get notifications => 'Notificacións'; + + @override + String get notificationsEnabledForThisAccount => + 'Notificacións activadas para a conta'; + + @override + String numUsersTyping(int count) { + return '$count usuarias están escribindo…'; + } + + @override + String get obtainingLocation => 'Obtendo a localización…'; + + @override + String get offensive => 'Ofensivo'; + + @override + String get offline => 'Desconectada'; + + @override + String get ok => 'Ok'; + + @override + String get online => 'En liña'; + + @override + String get onlineKeyBackupEnabled => + 'Copia de Apoio en liña das Chaves activada'; + + @override + String get oopsPushError => + 'Vaites! Desgraciadamente algo fallou ao configurar as notificacións push.'; + + @override + String get oopsSomethingWentWrong => 'Ooooi, algo fallou…'; + + @override + String get openAppToReadMessages => 'Abrir a app e ler mensaxes'; + + @override + String get openCamera => 'Abrir cámara'; + + @override + String get openVideoCamera => 'Abrir a cámara para un vídeo'; + + @override + String get oneClientLoggedOut => 'Un dos teus clientes foi desconectado'; + + @override + String get addAccount => 'Engadir conta'; + + @override + String get editBundlesForAccount => 'Editar os feixes desta conta'; + + @override + String get addToBundle => 'Engadir ao feixe'; + + @override + String get removeFromBundle => 'Eliminar deste feixe'; + + @override + String get bundleName => 'Nome do feixe'; + + @override + String get enableMultiAccounts => + '(BETA) Activar varias contas neste dispositivo'; + + @override + String get openInMaps => 'Abrir en mapas'; + + @override + String get link => 'Ligazón'; + + @override + String get serverRequiresEmail => + 'O servidor precisa validar o teu enderezo de email para rexistrarte.'; + + @override + String get or => 'Ou'; + + @override + String get participant => 'Participante'; + + @override + String get passphraseOrKey => 'frase de paso ou chave de recuperación'; + + @override + String get password => 'Contrasinal'; + + @override + String get passwordForgotten => 'Contrasinal esquecido'; + + @override + String get passwordHasBeenChanged => 'Cambiouse o contrasinal'; + + @override + String get hideMemberChangesInPublicChats => + 'Agochar cambios dos membros nas charlas públicas'; + + @override + String get hideMemberChangesInPublicChatsBody => + 'Non mostrar na cronoloxía se alguén se une ou deixa unha conversa pública, para mellorar a lexibilidade.'; + + @override + String get overview => 'Vista xeral'; + + @override + String get notifyMeFor => 'Notificarme sobre'; + + @override + String get passwordRecoverySettings => + 'Axustes de recuperación do contrasinal'; + + @override + String get passwordRecovery => 'Recuperación do contrasinal'; + + @override + String get people => 'Persoas'; + + @override + String get pickImage => 'Elixe unha imaxe'; + + @override + String get pin => 'Fixar'; + + @override + String play(String fileName) { + return 'Reproducir $fileName'; + } + + @override + String get pleaseChoose => 'Por favor elixe'; + + @override + String get pleaseChooseAPasscode => 'Escolle un código de acceso'; + + @override + String get pleaseClickOnLink => + 'Preme na ligazón do email e segue as instrucións.'; + + @override + String get pleaseEnter4Digits => + 'Escribe 4 díxitos ou deíxao baleiro para non activar o bloqueo.'; + + @override + String get pleaseEnterRecoveryKey => 'Escribe a túa chave de recuperación:'; + + @override + String get pleaseEnterYourPassword => 'Escribe o teu contrasinal'; + + @override + String get pleaseEnterYourPin => 'Escribe o teu pin'; + + @override + String get pleaseEnterYourUsername => 'Escribe o teu nome de usuaria'; + + @override + String get pleaseFollowInstructionsOnWeb => + 'Segue as instruccións do sitio web e toca en seguinte.'; + + @override + String get privacy => 'Privacidade'; + + @override + String get publicRooms => 'Salas públicas'; + + @override + String get pushRules => 'Regras de envío'; + + @override + String get reason => 'Razón'; + + @override + String get recording => 'Gravando'; + + @override + String redactedBy(String username) { + return 'Editada por $username'; + } + + @override + String get directChat => 'Conversa Directa'; + + @override + String redactedByBecause(String username, String reason) { + return 'Editada por $username debido a: \"$reason\"'; + } + + @override + String redactedAnEvent(String username) { + return '$username editou un evento'; + } + + @override + String get redactMessage => 'Eliminar mensaxe'; + + @override + String get register => 'Crear conta'; + + @override + String get reject => 'Rexeitar'; + + @override + String rejectedTheInvitation(String username) { + return '$username rexeitou o convite'; + } + + @override + String get rejoin => 'Volta a unirte'; + + @override + String get removeAllOtherDevices => 'Quitar todos os outros dispositivos'; + + @override + String removedBy(String username) { + return 'Eliminado por $username'; + } + + @override + String get removeDevice => 'Quitar dispositivo'; + + @override + String get unbanFromChat => 'Retirar veto na conversa'; + + @override + String get removeYourAvatar => 'Elimina o avatar'; + + @override + String get replaceRoomWithNewerVersion => 'Substituír sala pola nova versión'; + + @override + String get reply => 'Responder'; + + @override + String get reportMessage => 'Denunciar mensaxe'; + + @override + String get translateMessage => 'Translate message'; + + @override + String get translatedMessage => 'Translated message'; + + @override + String get errorTranslatingMessage => + 'An error has occured while translating the message.'; + + @override + String get recoverMessage => 'Recover message'; + + @override + String get recoveredMessage => 'Recovered message'; + + @override + String get errorRecoveringMessage => + 'An error has occured while recovering the message.'; + + @override + String get errorRecoveringMessageNoAdmin => + 'This feature is available on Synapse homeservers only for adminstrators.'; + + @override + String get requestPermission => 'Solicitar permiso'; + + @override + String get roomHasBeenUpgraded => 'A sala foi actualizada'; + + @override + String get roomVersion => 'Versión da sala'; + + @override + String get saveFile => 'Gardar ficheiro'; + + @override + String get retry => 'Retry'; + + @override + String get search => 'Buscar'; + + @override + String get security => 'Seguridade'; + + @override + String get recoveryKey => 'Chave de recuperación'; + + @override + String get recoveryKeyLost => 'Perdeches a chave de recuperación?'; + + @override + String seenByUser(String username) { + return 'Visto por $username'; + } + + @override + String get send => 'Enviar'; + + @override + String get sendAMessage => 'Enviar unha mensaxe'; + + @override + String get sendAsText => 'Enviar como texto'; + + @override + String get sendAudio => 'Enviar audio'; + + @override + String get sendFile => 'Enviar ficheiro'; + + @override + String get sendImage => 'Enviar imaxe'; + + @override + String sendImages(int count) { + return 'Enviar $count imaxe'; + } + + @override + String get sendMessages => 'Enviar mensaxes'; + + @override + String get sendOriginal => 'Enviar orixinal'; + + @override + String get sendSticker => 'Enviar adhesivo'; + + @override + String get sendVideo => 'Enviar vídeo'; + + @override + String sentAFile(String username) { + return '📁 $username enviou un ficheiro'; + } + + @override + String sentAnAudio(String username) { + return '🎤 $username enviou un audio'; + } + + @override + String sentAPicture(String username) { + return '🖼️ $username enviou unha imaxe'; + } + + @override + String sentASticker(String username) { + return '😊 $username enviou un adhesivo'; + } + + @override + String sentAVideo(String username) { + return '🎥 $username enviou un vídeo'; + } + + @override + String sentCallInformations(String senderName) { + return '$senderName enviou información da chamada'; + } + + @override + String get separateChatTypes => 'Separar Conversas directas e Grupos'; + + @override + String get setAsCanonicalAlias => 'Establecer como alias principal'; + + @override + String get setCustomEmotes => 'Establecer emotes personalizados'; + + @override + String get setChatDescription => 'Escribir descrición da conversa'; + + @override + String get setInvitationLink => 'Establecer ligazón do convite'; + + @override + String get setPermissionsLevel => 'Establecer nivel de permisos'; + + @override + String get setStatus => 'Establecer estado'; + + @override + String get settings => 'Axustes'; + + @override + String get share => 'Compartir'; + + @override + String sharedTheLocation(String username) { + return '$username compartiu a súa localización'; + } + + @override + String get shareLocation => 'Compartir localización'; + + @override + String get showPassword => 'Amosar contrasinal'; + + @override + String get presenceStyle => 'Presenza:'; + + @override + String get hideAvatarsInInvites => 'Hide avatars in invites'; + + @override + String get hideAvatarsInInvitesDescription => + 'Do not show room avatars in invites'; + + @override + String get presencesToggle => 'Mostra mensaxes de estado de outras usuarias'; + + @override + String get pureBlackToggle => 'Pure Black'; + + @override + String get singlesignon => 'Conexión Unificada SSO'; + + @override + String get skip => 'Saltar'; + + @override + String get sourceCode => 'Código fonte'; + + @override + String get spaceIsPublic => 'O Espazo é público'; + + @override + String get spaceName => 'Nome do Espazo'; + + @override + String startedACall(String senderName) { + return '$senderName iniciou unha chamada'; + } + + @override + String get startFirstChat => 'Abre a túa primeira conversa'; + + @override + String get status => 'Estado'; + + @override + String get statusExampleMessage => '¿Que tal estás hoxe?'; + + @override + String get submit => 'Enviar'; + + @override + String get synchronizingPleaseWait => 'Sincronizando... Agarda.'; + + @override + String synchronizingPleaseWaitCounter(String percentage) { + return ' Sincronizando…($percentage%)'; + } + + @override + String get systemTheme => 'Sistema'; + + @override + String get theyDontMatch => 'Non concordan'; + + @override + String get theyMatch => 'Concordan'; + + @override + String get title => 'FluffyChat'; + + @override + String get toggleFavorite => 'Marcar Favorito'; + + @override + String get toggleMuted => 'Cambia Noificacións'; + + @override + String get toggleUnread => 'Marcar como Lido/Non lido'; + + @override + String get tooManyRequestsWarning => + 'Demasiadas solicitudes. Inténtao máis tarde!'; + + @override + String get transferFromAnotherDevice => 'Transferir desde outro dispositivo'; + + @override + String get tryToSendAgain => 'Inténtao outra vez'; + + @override + String get unavailable => 'Non dispoñible'; + + @override + String unbannedUser(String username, String targetName) { + return '$username retirou o veto a $targetName'; + } + + @override + String get unblockDevice => 'Desbloquear dispositivo'; + + @override + String get unknownDevice => 'Dispositivo descoñecido'; + + @override + String get unknownEncryptionAlgorithm => 'Algoritmo de cifraxe descoñecido'; + + @override + String unknownEvent(String type) { + return 'Evento descoñecido \'$type\''; + } + + @override + String get unmuteChat => 'Reactivar notificacións'; + + @override + String get unpin => 'Desafixar'; + + @override + String unreadChats(int unreadCount) { + String _temp0 = intl.Intl.pluralLogic( + unreadCount, + locale: localeName, + other: '$unreadCount conversas sen ler', + one: '1 conversa sen ler', + ); + return '$_temp0'; + } + + @override + String userAndOthersAreTyping(String username, int count) { + return '$username e $count máis están escribindo…'; + } + + @override + String userAndUserAreTyping(String username, String username2) { + return '$username e $username2 están escribindo…'; + } + + @override + String userIsTyping(String username) { + return '$username está escribindo…'; + } + + @override + String userLeftTheChat(String username) { + return '🚪 $username deixou a conversa'; + } + + @override + String get username => 'Nome de usuaria'; + + @override + String userSentUnknownEvent(String username, String type) { + return '$username enviou un evento $type'; + } + + @override + String get unverified => 'Sen verificar'; + + @override + String get verified => 'Verificado'; + + @override + String get verify => 'Verificar'; + + @override + String get verifyStart => 'Comezar verificación'; + + @override + String get verifySuccess => 'Verificaches correctamente!'; + + @override + String get verifyTitle => 'Verificando a outra conta'; + + @override + String get videoCall => 'Chamada de vídeo'; + + @override + String get visibilityOfTheChatHistory => + 'Visibilidade do historial da conversa'; + + @override + String get visibleForAllParticipants => 'Visible para todas as participantes'; + + @override + String get visibleForEveryone => 'Visible para todas'; + + @override + String get voiceMessage => 'Mensaxe de voz'; + + @override + String get waitingPartnerAcceptRequest => + 'Agardando a que a outra parte acepte a solicitude…'; + + @override + String get waitingPartnerEmoji => + 'Agardando a que a outra parte acepte as emoticonas…'; + + @override + String get waitingPartnerNumbers => + 'Agardando a que a outra parte acepte os números…'; + + @override + String get wallpaper => 'Imaxe de fondo:'; + + @override + String get warning => 'Aviso!'; + + @override + String get weSentYouAnEmail => 'Enviamosche un email'; + + @override + String get whoCanPerformWhichAction => + 'Quen pode realizar determinada acción'; + + @override + String get whoIsAllowedToJoinThisGroup => 'Quen se pode unir a este grupo'; + + @override + String get whyDoYouWantToReportThis => 'Por que queres denunciar esto?'; + + @override + String get wipeChatBackup => + 'Queres eliminar a copia de apoio da conversa e crear unha nova chave de recuperación?'; + + @override + String get withTheseAddressesRecoveryDescription => + 'Con estos enderezos podes recuperar o contrasinal.'; + + @override + String get writeAMessage => 'Escribe unha mensaxe…'; + + @override + String get yes => 'Si'; + + @override + String get you => 'Ti'; + + @override + String get youAreNoLongerParticipatingInThisChat => + 'Xa non participas desta conversa'; + + @override + String get youHaveBeenBannedFromThisChat => 'Foches vetada nesta conversa'; + + @override + String get yourPublicKey => 'A túa chave pública'; + + @override + String get messageInfo => 'Info da mensaxe'; + + @override + String get time => 'Hora'; + + @override + String get messageType => 'Tipo de mensaxe'; + + @override + String get sender => 'Remitente'; + + @override + String get openGallery => 'Galería pública'; + + @override + String get removeFromSpace => 'Retirar do espazo'; + + @override + String get addToSpaceDescription => + 'Elixe un espazo ao que engadir esta conversa.'; + + @override + String get start => 'Comezar'; + + @override + String get pleaseEnterRecoveryKeyDescription => + 'Para desbloquear as mensaxes antigas, escribe a chave de recuperación creada nunha sesión existente. A chave de recuperación NON é o teu contrasinal.'; + + @override + String get publish => 'Publicar'; + + @override + String videoWithSize(String size) { + return 'Vídeo ($size)'; + } + + @override + String get openChat => 'Abrir Conversa'; + + @override + String get markAsRead => 'Marcar como lido'; + + @override + String get reportUser => 'Denunciar usuaria'; + + @override + String get dismiss => 'Desbotar'; + + @override + String reactedWith(String sender, String reaction) { + return '$sender reaccionou con $reaction'; + } + + @override + String get pinMessage => 'Fixar na sala'; + + @override + String get confirmEventUnpin => 'Tes a certeza de querer desafixar o evento?'; + + @override + String get emojis => 'Emojis'; + + @override + String get placeCall => 'Chamar'; + + @override + String get voiceCall => 'Chamada de voz'; + + @override + String get unsupportedAndroidVersion => 'Version de Android non soportada'; + + @override + String get unsupportedAndroidVersionLong => + 'Esta característica require unha vesión máis recente de Android. Mira se hai actualizacións ou soporte de LineageOS.'; + + @override + String get videoCallsBetaWarning => + 'Ten en conta que as chamadas de vídeo están en fase beta. Poderían non funcionar correctamente ou non funcionar nalgunhas plataformas.'; + + @override + String get experimentalVideoCalls => 'Chamadas de vídeo en probas'; + + @override + String get emailOrUsername => 'Email ou nome de usuaria'; + + @override + String get indexedDbErrorTitle => 'Problemas no modo privado'; + + @override + String get indexedDbErrorLong => + 'A almacenaxe de mensaxes non está activada por defecto no modo privado.\nMira en\n- about:config\n- establece dom.indexedDB.privateBrowsing.enabled como true\nSe non, non é posible executar FluffyChat.'; + + @override + String switchToAccount(String number) { + return 'Cambiar á conta $number'; + } + + @override + String get nextAccount => 'Conta seguinte'; + + @override + String get previousAccount => 'Conta anterior'; + + @override + String get addWidget => 'Engadir widget'; + + @override + String get widgetVideo => 'Vídeo'; + + @override + String get widgetEtherpad => 'Nota de texto'; + + @override + String get widgetJitsi => 'Jitsi Meet'; + + @override + String get widgetCustom => 'Personalizado'; + + @override + String get widgetName => 'Nome'; + + @override + String get widgetUrlError => 'Non é un URL válido.'; + + @override + String get widgetNameError => 'Escribe un nome público.'; + + @override + String get errorAddingWidget => 'Erro ao engadir o widget.'; + + @override + String get youRejectedTheInvitation => 'Rexeitaches o convite'; + + @override + String get youJoinedTheChat => 'Unícheste á conversa'; + + @override + String get youAcceptedTheInvitation => '👍 Aceptaches o convite'; + + @override + String youBannedUser(String user) { + return 'Vetaches a $user'; + } + + @override + String youHaveWithdrawnTheInvitationFor(String user) { + return 'Retiraches o convite para $user'; + } + + @override + String youInvitedToBy(String alias) { + return '📩 Convidáronte cunha ligazón a:\n$alias'; + } + + @override + String youInvitedBy(String user) { + return '📩 $user convidoute'; + } + + @override + String invitedBy(String user) { + return '📩 Convidada por $user'; + } + + @override + String youInvitedUser(String user) { + return '📩 Convidaches a $user'; + } + + @override + String youKicked(String user) { + return '👞 Expulsaches a $user'; + } + + @override + String youKickedAndBanned(String user) { + return '🙅 Expulsaches e vetaches a $user'; + } + + @override + String youUnbannedUser(String user) { + return 'Retiraches o veto a $user'; + } + + @override + String hasKnocked(String user) { + return '🚪 $user petou na porta'; + } + + @override + String get usersMustKnock => 'As usuarias teñen que pedir entrar'; + + @override + String get noOneCanJoin => 'Ninguén pode unirse'; + + @override + String userWouldLikeToChangeTheChat(String user) { + return '$user quere unirse á charla.'; + } + + @override + String get noPublicLinkHasBeenCreatedYet => + 'Aínda non se creou unha ligazón pública'; + + @override + String get knock => 'Solicitar acceso'; + + @override + String get users => 'Usuarias'; + + @override + String get unlockOldMessages => 'Desbloquear mensaxes antigas'; + + @override + String get storeInSecureStorageDescription => + 'Gardar a chave de recuperación na almacenaxe segura deste dispositivo.'; + + @override + String get saveKeyManuallyDescription => + 'Garda esta chave manualmente usando o sistema para compartir do dispositivo ou portapapeis.'; + + @override + String get storeInAndroidKeystore => 'Gardar en Android KeyStore'; + + @override + String get storeInAppleKeyChain => 'Gardar en Apple KeyChain'; + + @override + String get storeSecurlyOnThisDevice => + 'Gardar de xeito seguro no dispositivo'; + + @override + String countFiles(int count) { + return '$count ficheiros'; + } + + @override + String get user => 'Usuaria'; + + @override + String get custom => 'Personal'; + + @override + String get foregroundServiceRunning => + 'Esta notificación aparece cando se está a executar o servizo en segundo plano.'; + + @override + String get screenSharingTitle => 'compartición da pantalla'; + + @override + String get screenSharingDetail => + 'Estás a compartir a túa pantalla en FluffyChat'; + + @override + String get callingPermissions => 'Permisos de chamada'; + + @override + String get callingAccount => 'Conta que chama'; + + @override + String get callingAccountDetails => + 'Permítelle a FluffyChat usar a app de telefonía nativa de android.'; + + @override + String get appearOnTop => 'Aparecer arriba'; + + @override + String get appearOnTopDetails => + 'Permítelle á app aparecer por enriba (non é preciso se xa configuraches FluffyChat como unha conta para chamadas)'; + + @override + String get otherCallingPermissions => + 'Micrófono, cámara e outros permisos para FluffyChat'; + + @override + String get whyIsThisMessageEncrypted => 'Por que non podo ler esta mensaxe?'; + + @override + String get noKeyForThisMessage => + 'Pode ser que a mensaxe fose enviada antes de que ti accedeses á túa conta neste dispositivo.\n\nTamén é posible que a remitente non validase o teu dispositivo ou tamén que algo fallase na conexión a internet.\n\nPodes ler a mensaxe noutro dispositivo? Entón podes transferila desde el! Vai a Axustes > Dispositivos e comproba que tes tódolos dispositivos verificados. Entón cando abras a sala a próxima vez a sincronización realizarase e as chaves transmitiranse automáticamente.\n\nNon desexas perder as chaves cando pechas sesión ou cambias de dispositivo? Comproba nos axustes que activaches a copia de apoio das conversas.'; + + @override + String get newGroup => 'Novo grupo'; + + @override + String get newSpace => 'Novo espazo'; + + @override + String get enterSpace => 'Entrar no espazo'; + + @override + String get enterRoom => 'Entrar na sala'; + + @override + String get allSpaces => 'Todos os espazos'; + + @override + String numChats(String number) { + return '$number conversas'; + } + + @override + String get hideUnimportantStateEvents => + 'Agochar os eventos de menor relevancia'; + + @override + String get hidePresences => 'Agochar Lista de estados?'; + + @override + String get doNotShowAgain => 'Non mostrar outra vez'; + + @override + String wasDirectChatDisplayName(String oldDisplayName) { + return 'Conversa baleira (era $oldDisplayName)'; + } + + @override + String get newSpaceDescription => + 'Os Espazos permítenche consolidar as túas conversas e construir comunidades públicas ou privadas.'; + + @override + String get encryptThisChat => 'Cifrar esta conversa'; + + @override + String get disableEncryptionWarning => + 'Por razóns de seguridade non podes desactivar a cifraxe dunha conversa onde foi activada previamente.'; + + @override + String get sorryThatsNotPossible => 'Lamentámolo... iso non é posible'; + + @override + String get deviceKeys => 'Chaves do dispositivo:'; + + @override + String get reopenChat => 'Reabrir conversa'; + + @override + String get noBackupWarning => + 'Aviso! Se non activas a copia de apoio da conversa, perderás o acceso ás túas mensaxes cifradas. É moi recomendable activar a copia de apoio da conversa antes de pechar a sesión.'; + + @override + String get noOtherDevicesFound => 'Non se atopan outros dispositivos'; + + @override + String fileIsTooBigForServer(String max) { + return 'Non se puido enviar! O servidor só permite anexos que non superen $max.'; + } + + @override + String fileHasBeenSavedAt(String path) { + return 'Gardouse o ficheiro en $path'; + } + + @override + String get jumpToLastReadMessage => 'Ir á última mensaxe lida'; + + @override + String get readUpToHere => 'Lin ate aquí'; + + @override + String get jump => 'Ir alá'; + + @override + String get openLinkInBrowser => 'Abrir ligazón no navegador'; + + @override + String get reportErrorDescription => + '😭 Vaia! Algo fallou. Se queres, podes informar do problema ás persoas desenvolvedoras.'; + + @override + String get report => 'informar'; + + @override + String get signInWithPassword => 'Accede con contrasinal'; + + @override + String get pleaseTryAgainLaterOrChooseDifferentServer => + 'Inténtao máis tarde ou elixe un servidor diferente.'; + + @override + String signInWith(String provider) { + return 'Accede con $provider'; + } + + @override + String get profileNotFound => + 'Non se atopa a usuaria no servidor. Pode que haxa un problema coa conexión ou que a usuaria non exista.'; + + @override + String get setTheme => 'Establecer decorado:'; + + @override + String get setColorTheme => 'Cor do decorado:'; + + @override + String get invite => 'Convidar'; + + @override + String get inviteGroupChat => '📨 Convidar a conversa en grupo'; + + @override + String get invitePrivateChat => '📨 Convidar a conversa privada'; + + @override + String get invalidInput => 'Contido non válido!'; + + @override + String wrongPinEntered(int seconds) { + return 'PIN incorrecto! Inténtao outra vez en $seconds segundos...'; + } + + @override + String get pleaseEnterANumber => 'Escribe un número maior de cero'; + + @override + String get archiveRoomDescription => + 'Vaise mover a charla ao arquivo. Outras usuarias poderán ver que saíches da conversa.'; + + @override + String get roomUpgradeDescription => + 'Vaise recrear a charla coa nova versión da sala. Todas as participantes recibirán unha notificación para que cambien á nova charla. Podes ler máis información acerca das versións das salas en https://spec.matrix.org/latest/rooms/'; + + @override + String get removeDevicesDescription => + 'Vas pechar a sesión neste dispositivo e xa non poderás recibir mensaxes nel.'; + + @override + String get banUserDescription => + 'Vaise vetar a usuaria na conversa e non poderá entrar outra vez ata que se retire o veto.'; + + @override + String get unbanUserDescription => + 'A usuaria vai poder entrar outra vez na conversa se quere.'; + + @override + String get kickUserDescription => + 'A usuaria foi expulsada pero non vetada. En conversas públicas a usuaria pode volver cando queira.'; + + @override + String get makeAdminDescription => + 'Cando convirtas a esta usuaria en admin non poderás desfacer a acción xa que terá os mesmos permisos ca ti.'; + + @override + String get pushNotificationsNotAvailable => + 'Non están dispoñibles as notificacións push'; + + @override + String get learnMore => 'Saber máis'; + + @override + String get yourGlobalUserIdIs => 'O teu ID-usuaria global é: '; + + @override + String noUsersFoundWithQuery(String query) { + return 'Lamentamos non atopar ningunha usuaria con \"$query\". Comproba se está ben escrito.'; + } + + @override + String get knocking => 'A solicitar'; + + @override + String chatCanBeDiscoveredViaSearchOnServer(String server) { + return 'A charla pode ser atopada ao buscar en $server'; + } + + @override + String get searchChatsRooms => 'Buscar #conversas, @usuarias...'; + + @override + String get nothingFound => 'Non atopamos nada...'; + + @override + String get groupName => 'Nome do grupo'; + + @override + String get createGroupAndInviteUsers => 'Crear un grupo e convidar usuarias'; + + @override + String get groupCanBeFoundViaSearch => 'O grupo pódese atopar ao buscar'; + + @override + String get wrongRecoveryKey => + 'Desculpa... non semella ser o xeito correcto de recuperar a chave.'; + + @override + String get startConversation => 'Iniciar conversa'; + + @override + String get commandHint_sendraw => 'Enviar json sen editar'; + + @override + String get databaseMigrationTitle => 'Base de datos optimizada'; + + @override + String get databaseMigrationBody => 'Agarda, podería levarnos un pouco.'; + + @override + String get leaveEmptyToClearStatus => + 'Deixa baleiro para limpar o teu estado.'; + + @override + String get select => 'Escolle'; + + @override + String get searchForUsers => 'Buscar @persoas...'; + + @override + String get pleaseEnterYourCurrentPassword => 'Escribe o contrasinal actual'; + + @override + String get newPassword => 'Novo contrasinal'; + + @override + String get pleaseChooseAStrongPassword => 'Elixe un contrasinal forte'; + + @override + String get passwordsDoNotMatch => 'Os contrasinais non concordan'; + + @override + String get passwordIsWrong => 'O contrasinal escrito non é correcto'; + + @override + String get publicLink => 'Ligazón pública'; + + @override + String get publicChatAddresses => 'Enderezos públicos da charla'; + + @override + String get createNewAddress => 'Crear novos enderezos'; + + @override + String get joinSpace => 'Únete ao espazo'; + + @override + String get publicSpaces => 'Espazos públicos'; + + @override + String get addChatOrSubSpace => 'Engadir charla ou sub espazo'; + + @override + String get subspace => 'Subespazo'; + + @override + String get decline => 'Desbotar'; + + @override + String get thisDevice => 'Este dispositivo:'; + + @override + String get initAppError => 'Houbo un fallo ao iniciar a app'; + + @override + String get userRole => 'Rol da usuaria'; + + @override + String minimumPowerLevel(String level) { + return '$level é o nivel mínimo de responsabilidade.'; + } + + @override + String searchIn(String chat) { + return 'Buscar na conversa \"$chat\"...'; + } + + @override + String get searchMore => 'Buscar máis...'; + + @override + String get gallery => 'Galería'; + + @override + String get files => 'Ficheiros'; + + @override + String databaseBuildErrorBody(String url, String error) { + return 'Non se puido crear a base de datos SQlite. A app intentará usar a base de datos clásica. Por favor informa deste fallo ás desenvolvedoras en $url. A mensaxe do erro é: $error'; + } + + @override + String sessionLostBody(String url, String error) { + return 'Estragouse a túa sesión. Por favor informa deste fallo ás desenvolvedoras en $url. A mensaxe do erro é: $error'; + } + + @override + String restoreSessionBody(String url, String error) { + return 'A app vai intentar restablecer a sesión desde a copia de apoio. Por favor informa deste erro ás desenvolvedoras en $url. A mensaxe do erro é: $error'; + } + + @override + String forwardMessageTo(String roomName) { + return 'Reenviar a mensaxe a $roomName?'; + } + + @override + String get sendReadReceipts => 'Enviar confirmación de lectura'; + + @override + String get sendTypingNotificationsDescription => + 'As outras participantes da conversa poden ver cando estás a escribir unha mensaxe.'; + + @override + String get sendReadReceiptsDescription => + 'Outras participantes na conversa poden ver cando liches unha mensaxe.'; + + @override + String get formattedMessages => 'Mensaxes con formato'; + + @override + String get formattedMessagesDescription => + 'Mostrar texto enriquecido nas mensaxes como letra grosa usando markdown.'; + + @override + String get verifyOtherUser => '🔐 Verificar outra usuaria'; + + @override + String get verifyOtherUserDescription => + 'Se verificas a outra usuaria, podes ter a certeza de que sabes con quen estás a conversar. 💪\n\nAo iniciar a verificación, ti mais a outra usuaria veredes unha xanela emerxente na app onde aparecerán varios emojis ou números que teredes que comparar entre vós.\n\nO mellor xeito de facelo é en persoa o cunha chamada de vídeo. 👭'; + + @override + String get verifyOtherDevice => '🔐 Verificar outro dispositivo'; + + @override + String get verifyOtherDeviceDescription => + 'Ao verificar outro dispositivo estás compartindo as chaves, aumentando a túa seguridade 💪. Ao iniciar a verificación aparecerá unha xanela emerxente nos dous dispositivos. Nesa xanela verás varios emojis ou números que tes que comparar entre eles. O mellor xeito de facelo é ter os dous dispositivos contigo cando inicias o proceso de verificación. 🤳'; + + @override + String acceptedKeyVerification(String sender) { + return '$sender aceptou a verificación da chave'; + } + + @override + String canceledKeyVerification(String sender) { + return '$sender desbotou a verificación da chave'; + } + + @override + String completedKeyVerification(String sender) { + return '$sender completou a verificación da chave'; + } + + @override + String isReadyForKeyVerification(String sender) { + return '$sender xa pode verificar a chave'; + } + + @override + String requestedKeyVerification(String sender) { + return '$sender solicitou verificar a chave'; + } + + @override + String startedKeyVerification(String sender) { + return '$sender comezou coa verificación da chave'; + } + + @override + String get transparent => 'Transparente'; + + @override + String get incomingMessages => 'Mensaxes recibidas'; + + @override + String get stickers => 'Adhesivos'; + + @override + String get discover => 'Descubrir'; + + @override + String get commandHint_ignore => 'Ignorar o ID matrix indicado'; + + @override + String get commandHint_unignore => 'Non ignorar o ID matrix indicado'; + + @override + String unreadChatsInApp(String appname, String unread) { + return '$appname: $unread charlas sen ler'; + } + + @override + String get noDatabaseEncryption => + 'Nesta plataforma non temos soporte para cifrar a base de datos'; + + @override + String thereAreCountUsersBlocked(Object count) { + return 'Agora mesmo hai $count usuarias bloqueadas.'; + } + + @override + String get restricted => 'Non accesible'; + + @override + String get knockRestricted => 'Peta á porta'; + + @override + String goToSpace(Object space) { + return 'Ir ao espazo: $space'; + } + + @override + String get markAsUnread => 'Marcar como non lido'; + + @override + String userLevel(int level) { + return '$level - Usuaria'; + } + + @override + String moderatorLevel(int level) { + return '$level - Moderadora'; + } + + @override + String adminLevel(int level) { + return '$level - Administradora'; + } + + @override + String get changeGeneralChatSettings => 'Cambiar os axustes xerais da charla'; + + @override + String get inviteOtherUsers => 'Convidar a outras usuarias a esta charla'; + + @override + String get changeTheChatPermissions => 'Cambiar os permisos na charla'; + + @override + String get changeTheVisibilityOfChatHistory => + 'Cambiar a visibilidade do historial da charla'; + + @override + String get changeTheCanonicalRoomAlias => + 'Cambiar o enderezo público principal da charla'; + + @override + String get sendRoomNotifications => 'Enviar notificacións a @room'; + + @override + String get changeTheDescriptionOfTheGroup => 'Cambiar a descrición da charla'; + + @override + String get chatPermissionsDescription => + 'Define que nivel de permisos son necesarios para realizar certas accións nesta charla. Os niveis de permiso 0, 50 e 100 normalmente representan, usuarias, moderadoras e administradoras, pero son posibles outras escalas.'; + + @override + String updateInstalled(String version) { + return '🎉 Instalouse a actualización a $version!'; + } + + @override + String get changelog => 'Novidades na versión'; + + @override + String get sendCanceled => 'Cancelouse o envío'; + + @override + String get loginWithMatrixId => 'Acceder co ID-Matrix'; + + @override + String get discoverHomeservers => 'Atopar servidores'; + + @override + String get whatIsAHomeserver => 'Que é un servidor de inicio?'; + + @override + String get homeserverDescription => + 'Todos os teus datos quedan gardados no servidor de inicio, igual que co teu provedor de correo electrónico. Podes elexir o servidor que queres usar e poderás comunicarte con todos os demais. Aprende máis en https://matrix.org.'; + + @override + String get doesNotSeemToBeAValidHomeserver => + 'Non semella ser un servidor de inicio compatible. É o URL correcto?'; + + @override + String get calculatingFileSize => 'Calculando o tamaño do ficheiro…'; + + @override + String get prepareSendingAttachment => 'Preparando o envío…'; + + @override + String get sendingAttachment => 'Enviando o anexo…'; + + @override + String get generatingVideoThumbnail => 'Creando miniatura do vídeo…'; + + @override + String get compressVideo => 'Comprimindo o vídeo…'; + + @override + String sendingAttachmentCountOfCount(int index, int length) { + return 'Enviando o anexo $index de $length…'; + } + + @override + String serverLimitReached(int seconds) { + return 'Acadouse o límite do servidor! Agarda $seconds segundos…'; + } + + @override + String get oneOfYourDevicesIsNotVerified => + 'Un dos teus dispositivos non está verificado'; + + @override + String get noticeChatBackupDeviceVerification => + 'Nota: Cando conectas todos os teus dispositivos á copia de apoio da conversa quedan verificados automaticamente.'; + + @override + String get continueText => 'Continuar'; + + @override + String get welcomeText => + 'Ola! 👋 Isto é FluffyChat. Podes iniciar sesión en calquera servidor compatible con https://matrix.org. Poderás conversar con calquera. Unha enorme rede de mensaxería descentralizada!'; + + @override + String get blur => 'Néboa:'; + + @override + String get opacity => 'Opacidade:'; + + @override + String get setWallpaper => 'Establecer fondo'; + + @override + String get manageAccount => 'Xestionar conta'; + + @override + String get noContactInformationProvided => + 'O servidor non proporciona información de contacto válida'; + + @override + String get contactServerAdmin => 'Contacto con Admin do servidor'; + + @override + String get contactServerSecurity => 'Contacto con Seguridade do servidor'; + + @override + String get supportPage => 'Páxina de axuda'; + + @override + String get serverInformation => 'Información do servidor:'; + + @override + String get name => 'Nome'; + + @override + String get version => 'Versión'; + + @override + String get website => 'Páxina web'; + + @override + String get compress => 'Comprimir'; + + @override + String get boldText => 'Resaltar texto'; + + @override + String get italicText => 'Cursiva'; + + @override + String get strikeThrough => 'Riscar'; + + @override + String get pleaseFillOut => 'Por favor completa'; + + @override + String get invalidUrl => 'URL non válido'; + + @override + String get addLink => 'Engadir ligazón'; + + @override + String get unableToJoinChat => + 'Non se puido acceder. Pode que a outra parte xa pechase a conversa.'; + + @override + String get previous => 'Anterior'; + + @override + String get otherPartyNotLoggedIn => + 'A outra parte non está conectada neste momento e pode que non reciba as mensaxes!'; + + @override + String appWantsToUseForLogin(String server) { + return 'Usar \'$server\' para acceder'; + } + + @override + String get appWantsToUseForLoginDescription => + 'Por tanto permites que a app e o sitio web compartan información sobre ti.'; + + @override + String get open => 'Abrir'; + + @override + String get waitingForServer => 'Agardando polo servidor…'; + + @override + String get appIntroduction => + 'FluffyChat permíteche laretar coas túas amizades entre diferentes mensaxerías. Coñece máis en https://matrix.org ou toca en *Continuar*.'; + + @override + String get newChatRequest => '📩 Nova solicitude de conversa'; + + @override + String get contentNotificationSettings => + 'Axustes de notificación de contido'; + + @override + String get generalNotificationSettings => 'Axustes xerais das notificacións'; + + @override + String get roomNotificationSettings => 'Axustes de notificacións da sala'; + + @override + String get userSpecificNotificationSettings => + 'Axustes de notificación específicos da usuaria'; + + @override + String get otherNotificationSettings => 'Outros axustes das notificacións'; + + @override + String get notificationRuleContainsUserName => 'Contén nome de usuaria'; + + @override + String get notificationRuleContainsUserNameDescription => + 'Informa á usuaria cando unha mensaxe contén o seu identificador.'; + + @override + String get notificationRuleMaster => 'Acalar todas as notificacións'; + + @override + String get notificationRuleMasterDescription => + 'Sobrescribe todas as outras regras e desactiva todas as notificacións.'; + + @override + String get notificationRuleSuppressNotices => + 'Suprimir mensaxes automatizadas'; + + @override + String get notificationRuleSuppressNoticesDescription => + 'Suprime as notificacións desde clientes automatizados como os robots.'; + + @override + String get notificationRuleInviteForMe => 'Teño un convite'; + + @override + String get notificationRuleInviteForMeDescription => + 'Informa á usuaria de que recibeu o convite para unha sala.'; + + @override + String get notificationRuleMemberEvent => 'Eventos dos participantes'; + + @override + String get notificationRuleMemberEventDescription => + 'Suprime as notificacións dos eventos de participación.'; + + @override + String get notificationRuleIsUserMention => 'Mención da usuaria'; + + @override + String get notificationRuleIsUserMentionDescription => + 'Informa cando se menciona explícitamente a usuaria nunha mensaxe.'; + + @override + String get notificationRuleContainsDisplayName => 'Contén o nome público'; + + @override + String get notificationRuleContainsDisplayNameDescription => + 'Informa á usuaria cando unha mensaxe contén o seu nome público.'; + + @override + String get notificationRuleIsRoomMention => 'Mención da sala'; + + @override + String get notificationRuleIsRoomMentionDescription => + 'Informa á usuaria cando hai unha mención da sala.'; + + @override + String get notificationRuleRoomnotif => 'Notificación da sala'; + + @override + String get notificationRuleRoomnotifDescription => + 'Informa á usuaria cando unha mensaxe contén \'@room\'.'; + + @override + String get notificationRuleTombstone => 'Lápida'; + + @override + String get notificationRuleTombstoneDescription => + 'Informa á usuaria sobre a desactivación de mensaxes na sala.'; + + @override + String get notificationRuleReaction => 'Reacción'; + + @override + String get notificationRuleReactionDescription => + 'Omite as notificacións sobre reaccións.'; + + @override + String get notificationRuleRoomServerAcl => 'ACL da servidor da sala'; + + @override + String get notificationRuleRoomServerAclDescription => + 'Omite notificacións para as listas de control de acceso (ACL) do servidor da sala.'; + + @override + String get notificationRuleSuppressEdits => 'Omite edicións'; + + @override + String get notificationRuleSuppressEditsDescription => + 'Omite as notificacións sobre mensaxes editadas.'; + + @override + String get notificationRuleCall => 'Chamada'; + + @override + String get notificationRuleCallDescription => + 'Informa á usuaria sobre as chamadas.'; + + @override + String get notificationRuleEncryptedRoomOneToOne => + 'Sala cifrada conversa persoal'; + + @override + String get notificationRuleEncryptedRoomOneToOneDescription => + 'Informa á usuaria sobre mensaxes cifradas en salas de conversa persoal.'; + + @override + String get notificationRuleRoomOneToOne => 'Sala de conversa persoal'; + + @override + String get notificationRuleRoomOneToOneDescription => + 'Informa á usuaria sobre mensaxes en salas de conversa persoal.'; + + @override + String get notificationRuleMessage => 'Mensaxe'; + + @override + String get notificationRuleMessageDescription => + 'Informa á usuaria sobre mensaxes xenéricas.'; + + @override + String get notificationRuleEncrypted => 'Salas cifradas'; + + @override + String get notificationRuleEncryptedDescription => + 'Informa á usuaria sobre mensaxes en salas cifradas.'; + + @override + String get notificationRuleJitsi => 'Jitsi'; + + @override + String get notificationRuleJitsiDescription => + 'Informa á usuaria sobre eventos do widget Jitsi.'; + + @override + String get notificationRuleServerAcl => 'Omite eventos do sevidor ACL'; + + @override + String get notificationRuleServerAclDescription => + 'Omite notificación sobre eventos do servidor ACL.'; + + @override + String unknownPushRule(String rule) { + return 'Regra push descoñecida \'$rule\''; + } + + @override + String get deletePushRuleCanNotBeUndone => + 'Se omites este axuste de notificacións non poderás desfacer a acción.'; + + @override + String get more => 'Máis'; + + @override + String get shareKeysWith => 'Compartir chaves con…'; + + @override + String get shareKeysWithDescription => + 'En que dispositivos se pode confiar e poden ler as túas conversas cifradas?'; + + @override + String get allDevices => 'Todos os dispositivos'; + + @override + String get crossVerifiedDevicesIfEnabled => + 'Dispositivos verificados se está activado'; + + @override + String get crossVerifiedDevices => 'Dispositivos verificados'; + + @override + String get verifiedDevicesOnly => 'Só dispositivos verificados'; + + @override + String get takeAPhoto => 'Facer foto'; + + @override + String get recordAVideo => 'Gravar vídeo'; + + @override + String get optionalMessage => '(Optativo) mensaxe…'; + + @override + String get notSupportedOnThisDevice => 'Non compatible co dispositivo'; + + @override + String get enterNewChat => 'Entrar na nova conversa'; + + @override + String get approve => 'Approve'; + + @override + String get youHaveKnocked => 'You have knocked'; + + @override + String get pleaseWaitUntilInvited => + 'Please wait now, until someone from the room invites you.'; +} diff --git a/lib/generated/l10n/l10n_he.dart b/lib/generated/l10n/l10n_he.dart new file mode 100644 index 0000000..1bf3a27 --- /dev/null +++ b/lib/generated/l10n/l10n_he.dart @@ -0,0 +1,2740 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'l10n.dart'; + +// ignore_for_file: type=lint + +/// The translations for Hebrew (`he`). +class L10nHe extends L10n { + L10nHe([String locale = 'he']) : super(locale); + + @override + String get noSendPermission => 'You can\'t send messages here'; + + @override + String get alwaysUse24HourFormat => 'false'; + + @override + String get repeatPassword => 'כתוב שוב את הסיסמה'; + + @override + String get notAnImage => 'Not an image file.'; + + @override + String get setCustomPermissionLevel => 'Set custom permission level'; + + @override + String get setPermissionsLevelDescription => + 'Please choose a predefined role below or enter a custom permission level between 0 and 100.'; + + @override + String get ignoreUser => 'Ignore user'; + + @override + String get normalUser => 'Normal user'; + + @override + String get remove => 'Remove'; + + @override + String get importNow => 'Import now'; + + @override + String get importEmojis => 'Import Emojis'; + + @override + String get importFromZipFile => 'Import from .zip file'; + + @override + String get exportEmotePack => 'Export Emote pack as .zip'; + + @override + String get replace => 'Replace'; + + @override + String get about => 'אודות'; + + @override + String aboutHomeserver(String homeserver) { + return 'About $homeserver'; + } + + @override + String get accept => 'קבל'; + + @override + String acceptedTheInvitation(String username) { + return '$username קיבל את ההזמנה'; + } + + @override + String get account => 'חשבון'; + + @override + String activatedEndToEndEncryption(String username) { + return '$username הפעיל הצפנה מקצה לקצה'; + } + + @override + String get addEmail => 'הוסף מייל'; + + @override + String get confirmMatrixId => + 'Please confirm your Matrix ID in order to delete your account.'; + + @override + String supposedMxid(String mxid) { + return 'This should be $mxid'; + } + + @override + String get addChatDescription => 'Add a chat description...'; + + @override + String get addToSpace => 'הוסף לחלל'; + + @override + String get admin => 'מנהל'; + + @override + String get alias => 'כינוי'; + + @override + String get all => 'הכל'; + + @override + String get allChats => 'כל הצ\'אטים'; + + @override + String get commandHint_roomupgrade => + 'Upgrade this room to the given room version'; + + @override + String get commandHint_googly => 'Send some googly eyes'; + + @override + String get commandHint_cuddle => 'Send a cuddle'; + + @override + String get commandHint_hug => 'Send a hug'; + + @override + String googlyEyesContent(String senderName) { + return '$senderName sends you googly eyes'; + } + + @override + String cuddleContent(String senderName) { + return '$senderName cuddles you'; + } + + @override + String hugContent(String senderName) { + return '$senderName hugs you'; + } + + @override + String answeredTheCall(String senderName) { + return '$senderName ענה לשיחה'; + } + + @override + String get anyoneCanJoin => 'כל אחד יכול להצטרף'; + + @override + String get appLock => 'נעילת אפליקציה'; + + @override + String get appLockDescription => + 'Lock the app when not using with a pin code'; + + @override + String get archive => 'ארכיון'; + + @override + String get areGuestsAllowedToJoin => 'האם משתמשים אורחים מורשים להצטרף'; + + @override + String get areYouSure => 'האם אתה בטוח?'; + + @override + String get areYouSureYouWantToLogout => 'האם אתה בטוח שברצונך לצאת?'; + + @override + String get askSSSSSign => + 'כדי שתוכל לחתום על משתמש אחר , הזן את הסיסמה שלך או את מפתח השחזור.'; + + @override + String askVerificationRequest(String username) { + return 'לקבל בקשת אימות זו מ- $username?'; + } + + @override + String get autoplayImages => 'הפעל אוטומטית מדבקות ואנימציות מונפשים'; + + @override + String badServerLoginTypesException(String serverVersions, + String supportedVersions, Object suportedVersions) { + return 'שרת הבית תומך בסוגי הכניסה:\n$serverVersions\nאבל אפליקציה זו תומכת רק ב:\n$supportedVersions'; + } + + @override + String get sendTypingNotifications => 'Send typing notifications'; + + @override + String get swipeRightToLeftToReply => 'Swipe right to left to reply'; + + @override + String get sendOnEnter => 'שלח בכניסה'; + + @override + String badServerVersionsException(String serverVersions, + String supportedVersions, Object serverVerions, Object suportedVersions) { + return 'שרת הבית תומך בגרסאות:\n$serverVersions\nאבל האפליקציה הזו תומכת רק ב-$supportedVersions'; + } + + @override + String countChatsAndCountParticipants(int chats, int participants) { + return '$chats chats and $participants participants'; + } + + @override + String get noMoreChatsFound => 'No more chats found...'; + + @override + String get noChatsFoundHere => + 'No chats found here yet. Start a new chat with someone by using the button below. ⤵️'; + + @override + String get joinedChats => 'Joined chats'; + + @override + String get unread => 'Unread'; + + @override + String get space => 'Space'; + + @override + String get spaces => 'Spaces'; + + @override + String get banFromChat => 'צאט חסום'; + + @override + String get banned => 'חסום'; + + @override + String bannedUser(String username, String targetName) { + return '$username חסם את $targetName'; + } + + @override + String get blockDevice => 'חסום מכשיר'; + + @override + String get blocked => 'חסום'; + + @override + String get botMessages => 'הודעות בוט'; + + @override + String get cancel => 'ביטול'; + + @override + String cantOpenUri(String uri) { + return 'לא ניתן לפתוח את ה-URI $uri'; + } + + @override + String get changeDeviceName => 'שנה את שם המכשיר'; + + @override + String changedTheChatAvatar(String username) { + return '$username שינה את האווטאר של הצ\'אט'; + } + + @override + String changedTheChatDescriptionTo(String username, String description) { + return '$username שינה את תיאור הצ\'אט ל: \'$description\''; + } + + @override + String changedTheChatNameTo(String username, String chatname) { + return '$username שינה את שם הצ\'אט ל: \'$chatname\''; + } + + @override + String changedTheChatPermissions(String username) { + return '$username שינה את הרשאות הצ\'אט'; + } + + @override + String changedTheDisplaynameTo(String username, String displayname) { + return '$username שינה את שם התצוגה שלו ל: \'$displayname\''; + } + + @override + String changedTheGuestAccessRules(String username) { + return '$username שינה את כללי הגישה לאורחים'; + } + + @override + String changedTheGuestAccessRulesTo(String username, String rules) { + return '$username שינה את כללי הגישה לאורחים ל: $rules'; + } + + @override + String changedTheHistoryVisibility(String username) { + return '$username שינה את נראות ההיסטוריה'; + } + + @override + String changedTheHistoryVisibilityTo(String username, String rules) { + return '$username שינה את נראות ההיסטוריה ל: $rules'; + } + + @override + String changedTheJoinRules(String username) { + return '$username שינה את כללי ההצטרפות'; + } + + @override + String changedTheJoinRulesTo(String username, String joinRules) { + return '$username שינה את כללי ההצטרפות ל: $joinRules'; + } + + @override + String changedTheProfileAvatar(String username) { + return '$username שינה את האווטאר שלו'; + } + + @override + String changedTheRoomAliases(String username) { + return '$username שינה את כינוי החדר'; + } + + @override + String changedTheRoomInvitationLink(String username) { + return '$username שינה את קישור ההזמנה'; + } + + @override + String get changePassword => 'שנה סיסמא'; + + @override + String get changeTheHomeserver => 'שנה את שרת הבית'; + + @override + String get changeTheme => 'שנה את הסגנון שלך'; + + @override + String get changeTheNameOfTheGroup => 'שנה את שם הקבוצה'; + + @override + String get changeYourAvatar => 'שינוי האווטאר שלך'; + + @override + String get channelCorruptedDecryptError => 'ההצפנה נפגמה'; + + @override + String get chat => 'צ׳אט'; + + @override + String get yourChatBackupHasBeenSetUp => 'גיבוי הצ\'אט שלך הוגדר.'; + + @override + String get chatBackup => 'גיבוי צ\'אט'; + + @override + String get chatBackupDescription => + 'גיבוי הצ\'אט שלך מאובטח באמצעות מפתח אבטחה. אנא וודא שאתה לא מאבד אותו.'; + + @override + String get chatDetails => 'פרטי צ\'אט'; + + @override + String get chatHasBeenAddedToThisSpace => 'צ\'אט נוסף למרחב הזה'; + + @override + String get chats => 'צ\'אטים'; + + @override + String get chooseAStrongPassword => 'בחר סיסמה חזקה'; + + @override + String get clearArchive => 'נקה ארכיון'; + + @override + String get close => 'סגור'; + + @override + String get commandHint_markasdm => + 'Mark as direct message room for the giving Matrix ID'; + + @override + String get commandHint_markasgroup => 'Mark as group'; + + @override + String get commandHint_ban => 'חסום את המשתמש הנתון מהחדר הזה'; + + @override + String get commandHint_clearcache => 'נקה מטמון'; + + @override + String get commandHint_create => + 'צור צ\'אט קבוצתי ריק\nהשתמש ב--no-encryption כדי להשבית את ההצפנה'; + + @override + String get commandHint_discardsession => 'התעלם מהסשן'; + + @override + String get commandHint_dm => + 'התחל צ\'אט ישיר\nהשתמש ב--no-encryption כדי להשבית את ההצפנה'; + + @override + String get commandHint_html => 'שלח טקסט בתבנית HTML'; + + @override + String get commandHint_invite => 'הזמן את המשתמש הנתון לחדר זה'; + + @override + String get commandHint_join => 'הצטרף לחדר הנתון'; + + @override + String get commandHint_kick => 'הסר את המשתמש הנתון מהחדר הזה'; + + @override + String get commandHint_leave => 'עזוב את החדר הזה'; + + @override + String get commandHint_me => 'תאר את עצמך'; + + @override + String get commandHint_myroomavatar => + 'הגדר את התמונה שלך לחדר זה (על ידי mxc-uri)'; + + @override + String get commandHint_myroomnick => 'הגדר את שם התצוגה שלך עבור חדר זה'; + + @override + String get commandHint_op => + 'הגדרת רמת צריכת החשמל של המשתמש הנתון (ברירת מחדל: 50)'; + + @override + String get commandHint_plain => 'שלח טקסט לא מעוצב'; + + @override + String get commandHint_react => 'שלח תשובה כתגובה'; + + @override + String get commandHint_send => 'שלח טקסט'; + + @override + String get commandHint_unban => 'בטל את החסימה של המשתמש הנתון מהחדר הזה'; + + @override + String get commandInvalid => 'הפקודה אינה חוקית'; + + @override + String commandMissing(String command) { + return '$command אינו פקודה.'; + } + + @override + String get compareEmojiMatch => + 'השווה וודא שהאימוג\'י הבאים תואמים לאלו של המכשיר השני:'; + + @override + String get compareNumbersMatch => + 'השווה וודא שהמספרים הבאים תואמים לאלה של המכשיר השני:'; + + @override + String get configureChat => 'קביעת תצורה של צ\'אט'; + + @override + String get confirm => 'לאשר'; + + @override + String get connect => 'התחבר'; + + @override + String get contactHasBeenInvitedToTheGroup => 'איש הקשר הוזמן לקבוצה'; + + @override + String get containsDisplayName => 'מכיל שם תצוגה'; + + @override + String get containsUserName => 'מכיל שם משתמש'; + + @override + String get contentHasBeenReported => 'התוכן דווח למנהלי השרת'; + + @override + String get copiedToClipboard => 'הועתק ללוח הגזירים'; + + @override + String get copy => 'העתק'; + + @override + String get copyToClipboard => 'העתק ללוח'; + + @override + String couldNotDecryptMessage(String error) { + return 'לא ניתן לפענח הודעה: $error'; + } + + @override + String countParticipants(int count) { + return '$count משתתפים'; + } + + @override + String get create => 'צור'; + + @override + String createdTheChat(String username) { + return '$username יצר את הצ\'אט'; + } + + @override + String get createGroup => 'Create group'; + + @override + String get createNewSpace => 'חלל חדש'; + + @override + String get currentlyActive => 'פעיל כעת'; + + @override + String get darkTheme => 'כהה'; + + @override + String dateAndTimeOfDay(String date, String timeOfDay) { + return '$date, $timeOfDay'; + } + + @override + String dateWithoutYear(String month, String day) { + return '$month-$day'; + } + + @override + String dateWithYear(String year, String month, String day) { + return '$year-$month-$day'; + } + + @override + String get deactivateAccountWarning => + 'פעולה זו תשבית את חשבון המשתמש שלך. אי אפשר לבטל את זה! האם אתה בטוח?'; + + @override + String get defaultPermissionLevel => 'רמת הרשאת ברירת מחדל'; + + @override + String get delete => 'מחיקה'; + + @override + String get deleteAccount => 'מחק חשבון'; + + @override + String get deleteMessage => 'מחק הודעה'; + + @override + String get device => 'מכשיר'; + + @override + String get deviceId => 'מזהה מכשיר'; + + @override + String get devices => 'התקנים'; + + @override + String get directChats => 'צ\'אטים ישירים'; + + @override + String get allRooms => 'All Group Chats'; + + @override + String get displaynameHasBeenChanged => 'שם התצוגה השתנה'; + + @override + String get downloadFile => 'הורד קובץ'; + + @override + String get edit => 'ערוך'; + + @override + String get editBlockedServers => 'ערוך שרתים חסומים'; + + @override + String get chatPermissions => 'Chat permissions'; + + @override + String get editDisplayname => 'ערוך את שם התצוגה'; + + @override + String get editRoomAliases => 'ערוך כינויים לחדר'; + + @override + String get editRoomAvatar => 'עריכת אווטאר של חדר'; + + @override + String get emoteExists => 'אימוט כבר קיים!'; + + @override + String get emoteInvalid => 'Invalid emote shortcode!'; + + @override + String get emoteKeyboardNoRecents => + 'Recently-used emotes will appear here...'; + + @override + String get emotePacks => 'Emote packs for room'; + + @override + String get emoteSettings => 'Emote Settings'; + + @override + String get globalChatId => 'Global chat ID'; + + @override + String get accessAndVisibility => 'Access and visibility'; + + @override + String get accessAndVisibilityDescription => + 'Who is allowed to join this chat and how the chat can be discovered.'; + + @override + String get calls => 'Calls'; + + @override + String get customEmojisAndStickers => 'Custom emojis and stickers'; + + @override + String get customEmojisAndStickersBody => + 'Add or share custom emojis or stickers which can be used in any chat.'; + + @override + String get emoteShortcode => 'Emote shortcode'; + + @override + String get emoteWarnNeedToPick => + 'You need to pick an emote shortcode and an image!'; + + @override + String get emptyChat => 'צ\'אט ריק'; + + @override + String get enableEmotesGlobally => 'Enable emote pack globally'; + + @override + String get enableEncryption => 'אפשר הצפנה'; + + @override + String get enableEncryptionWarning => + 'לא תוכל לבטל את ההצפנה יותר. האם אתה בטוח?'; + + @override + String get encrypted => 'מוצפן'; + + @override + String get encryption => 'הצפנה'; + + @override + String get encryptionNotEnabled => 'ההצפנה אינה מופעלת'; + + @override + String endedTheCall(String senderName) { + return '$senderName סיים את השיחה'; + } + + @override + String get enterAnEmailAddress => 'הזן כתובת דואר אלקטרוני'; + + @override + String get homeserver => 'שרת בית'; + + @override + String get enterYourHomeserver => 'הזן את שרת הבית שלך'; + + @override + String errorObtainingLocation(String error) { + return 'שגיאה בהשגת מיקום: $error'; + } + + @override + String get everythingReady => 'הכל מוכן!'; + + @override + String get extremeOffensive => 'פוגעני ביותר'; + + @override + String get fileName => 'שם קובץ'; + + @override + String get fluffychat => 'FluffyChat'; + + @override + String get fontSize => 'גודל גופן'; + + @override + String get forward => 'העבר'; + + @override + String get fromJoining => 'מהצטרפות'; + + @override + String get fromTheInvitation => 'מההזמנה'; + + @override + String get goToTheNewRoom => 'עבור לחדר החדש'; + + @override + String get group => 'קבוצה'; + + @override + String get chatDescription => 'Chat description'; + + @override + String get chatDescriptionHasBeenChanged => 'Chat description changed'; + + @override + String get groupIsPublic => 'הקבוצה ציבורית'; + + @override + String get groups => 'קבוצות'; + + @override + String groupWith(String displayname) { + return 'קבוצה עם $displayname'; + } + + @override + String get guestsAreForbidden => 'אורחים אסורים'; + + @override + String get guestsCanJoin => 'אורחים יכולים להצטרף'; + + @override + String hasWithdrawnTheInvitationFor(String username, String targetName) { + return '$username ביטל את ההזמנה עבור $targetName'; + } + + @override + String get help => 'עזרה'; + + @override + String get hideRedactedEvents => 'הסתר אירועים מצונזרים'; + + @override + String get hideRedactedMessages => 'Hide redacted messages'; + + @override + String get hideRedactedMessagesBody => + 'If someone redacts a message, this message won\'t be visible in the chat anymore.'; + + @override + String get hideInvalidOrUnknownMessageFormats => + 'Hide invalid or unknown message formats'; + + @override + String get howOffensiveIsThisContent => 'עד כמה התוכן הזה פוגעני?'; + + @override + String get id => 'מזהה'; + + @override + String get identity => 'זהות'; + + @override + String get block => 'Block'; + + @override + String get blockedUsers => 'Blocked users'; + + @override + String get blockListDescription => + 'You can block users who are disturbing you. You won\'t be able to receive any messages or room invites from the users on your personal block list.'; + + @override + String get blockUsername => 'Ignore username'; + + @override + String get iHaveClickedOnLink => 'לחצתי על הקישור'; + + @override + String get incorrectPassphraseOrKey => 'ביטוי סיסמה או מפתח שחזור שגויים'; + + @override + String get inoffensive => 'לֹא פּוֹגֵעַ'; + + @override + String get inviteContact => 'הזמן איש קשר'; + + @override + String inviteContactToGroupQuestion(Object contact, Object groupName) { + return 'Do you want to invite $contact to the chat \"$groupName\"?'; + } + + @override + String inviteContactToGroup(String groupName) { + return 'הזמן איש קשר אל $groupName'; + } + + @override + String get noChatDescriptionYet => 'No chat description created yet.'; + + @override + String get tryAgain => 'Try again'; + + @override + String get invalidServerName => 'Invalid server name'; + + @override + String get invited => 'הזמין'; + + @override + String get redactMessageDescription => + 'The message will be redacted for all participants in this conversation. This cannot be undone.'; + + @override + String get optionalRedactReason => + '(Optional) Reason for redacting this message...'; + + @override + String invitedUser(String username, String targetName) { + return '$username הזמין את $targetName'; + } + + @override + String get invitedUsersOnly => 'משתמשים מוזמנים בלבד'; + + @override + String get inviteForMe => 'הזמנה בשבילי'; + + @override + String inviteText(String username, String link) { + return '$username הזמין אותך ל-FluffyChat.\n1. התקן את FluffyChat: https://fluffychat.im\n2. הירשם או היכנס\n3. פתח את קישור ההזמנה: $link'; + } + + @override + String get isTyping => 'מקליד/ה…'; + + @override + String joinedTheChat(String username) { + return '$username הצטרף לצ\'אט'; + } + + @override + String get joinRoom => 'הצטרף לחדר'; + + @override + String kicked(String username, String targetName) { + return '$username בעט ב $targetName'; + } + + @override + String kickedAndBanned(String username, String targetName) { + return '$username בעט וחסם $targetName'; + } + + @override + String get kickFromChat => 'בעיטה מהצ\'אט'; + + @override + String lastActiveAgo(String localizedTimeShort) { + return 'פעילות אחרונה: $localizedTimeShort'; + } + + @override + String get leave => 'לעזוב'; + + @override + String get leftTheChat => 'עזב את הצ\'אט'; + + @override + String get license => 'רשיון'; + + @override + String get lightTheme => 'בהיר'; + + @override + String loadCountMoreParticipants(int count) { + return 'טען $count משתתפים נוספים'; + } + + @override + String get dehydrate => 'Export session and wipe device'; + + @override + String get dehydrateWarning => + 'This action cannot be undone. Ensure you safely store the backup file.'; + + @override + String get dehydrateTor => 'TOR Users: Export session'; + + @override + String get dehydrateTorLong => + 'For TOR users, it is recommended to export the session before closing the window.'; + + @override + String get hydrateTor => 'TOR Users: Import session export'; + + @override + String get hydrateTorLong => + 'Did you export your session last time on TOR? Quickly import it and continue chatting.'; + + @override + String get hydrate => 'Restore from backup file'; + + @override + String get loadingPleaseWait => 'טוען אנא המתן.'; + + @override + String get loadMore => 'טען עוד…'; + + @override + String get locationDisabledNotice => + 'שירותי המיקום מושבתים. אנא הפעל אותם כדי לשתף את המיקום שלך.'; + + @override + String get locationPermissionDeniedNotice => + 'הרשאת המיקום נדחתה. אנא אפשר את היכולת לשתף את מיקומך.'; + + @override + String get login => 'כניסה'; + + @override + String logInTo(String homeserver) { + return 'היכנס אל $homeserver'; + } + + @override + String get logout => 'יציאה'; + + @override + String get memberChanges => 'שינויים בחבר'; + + @override + String get mention => 'הזכיר'; + + @override + String get messages => 'הודעות'; + + @override + String get messagesStyle => 'Messages:'; + + @override + String get moderator => 'מנחה'; + + @override + String get muteChat => 'השתקת הצ\'אט'; + + @override + String get needPantalaimonWarning => + 'שים לב שאתה צריך Pantalaimon כדי להשתמש בהצפנה מקצה לקצה לעת עתה.'; + + @override + String get newChat => 'צ\'אט חדש'; + + @override + String get newMessageInFluffyChat => 'הודעה חדשה ב-FluffyChat'; + + @override + String get newVerificationRequest => 'בקשת אימות חדשה!'; + + @override + String get next => 'הבא'; + + @override + String get no => 'לא'; + + @override + String get noConnectionToTheServer => 'אין חיבור לשרת'; + + @override + String get noEmotesFound => 'No emotes found. 😕'; + + @override + String get noEncryptionForPublicRooms => + 'אתה יכול להפעיל הצפנה רק כשהחדר כבר לא נגיש לציבור.'; + + @override + String get noGoogleServicesWarning => + 'נראה שאין לך שירותי גוגל בטלפון שלך. זו החלטה טובה לפרטיות שלך! כדי לקבל התרעות ב- FluffyChat אנו ממליצים להשתמש https://microg.org/ או https://unifiedpush.org/.'; + + @override + String noMatrixServer(String server1, String server2) { + return '$server1 אינו שרת מטריקס, השתמש ב-$server2 במקום זאת?'; + } + + @override + String get shareInviteLink => 'Share invite link'; + + @override + String get scanQrCode => 'סרוק קוד QR'; + + @override + String get none => 'ללא'; + + @override + String get noPasswordRecoveryDescription => + 'עדיין לא הוספת דרך לשחזר את הסיסמה שלך.'; + + @override + String get noPermission => 'אין הרשאה'; + + @override + String get noRoomsFound => 'לא נמצאו חדרים…'; + + @override + String get notifications => 'התראות'; + + @override + String get notificationsEnabledForThisAccount => + 'התראות הופעלו עבור חשבון זה'; + + @override + String numUsersTyping(int count) { + return '$count משתמשים מקלידים…'; + } + + @override + String get obtainingLocation => 'משיג מיקום…'; + + @override + String get offensive => 'פוגעני'; + + @override + String get offline => 'לא מקוון'; + + @override + String get ok => 'Ok'; + + @override + String get online => 'מחובר/ת'; + + @override + String get onlineKeyBackupEnabled => 'גיבוי מפתח מקוון מופעל'; + + @override + String get oopsPushError => 'אופס! למרבה הצער, אירעה שגיאה בעת הגדרת התראות.'; + + @override + String get oopsSomethingWentWrong => 'אופס, משהו השתבש…'; + + @override + String get openAppToReadMessages => 'פתח את האפליקציה לקריאת הודעות'; + + @override + String get openCamera => 'פתח מצלמה'; + + @override + String get openVideoCamera => 'פתח את המצלמה לסרטון'; + + @override + String get oneClientLoggedOut => 'אחד מהמכשירים שלך התנתק'; + + @override + String get addAccount => 'הוסף חשבון'; + + @override + String get editBundlesForAccount => 'ערוך חבילות עבור חשבון זה'; + + @override + String get addToBundle => 'הוסף לחבילה'; + + @override + String get removeFromBundle => 'הסר מחבילה זו'; + + @override + String get bundleName => 'שם החבילה'; + + @override + String get enableMultiAccounts => '(בטא) אפשר ריבוי חשבונות במכשיר זה'; + + @override + String get openInMaps => 'פתיחה במפות'; + + @override + String get link => 'קישור'; + + @override + String get serverRequiresEmail => + 'שרת זה צריך לאמת את כתובת הדואר האלקטרוני שלך לרישום.'; + + @override + String get or => 'או'; + + @override + String get participant => 'משתתף'; + + @override + String get passphraseOrKey => 'ביטוי סיסמה או מפתח שחזור'; + + @override + String get password => 'סיסמה'; + + @override + String get passwordForgotten => 'שכחתי סיסמה'; + + @override + String get passwordHasBeenChanged => 'הסיסמה שונתה'; + + @override + String get hideMemberChangesInPublicChats => + 'Hide member changes in public chats'; + + @override + String get hideMemberChangesInPublicChatsBody => + 'Do not show in the chat timeline if someone joins or leaves a public chat to improve readability.'; + + @override + String get overview => 'Overview'; + + @override + String get notifyMeFor => 'Notify me for'; + + @override + String get passwordRecoverySettings => 'Password recovery settings'; + + @override + String get passwordRecovery => 'שחזור סיסמה'; + + @override + String get people => 'אנשים'; + + @override + String get pickImage => 'בחר תמונה'; + + @override + String get pin => 'קוד pin'; + + @override + String play(String fileName) { + return 'הפעל $fileName'; + } + + @override + String get pleaseChoose => 'אנא בחר'; + + @override + String get pleaseChooseAPasscode => 'אנא בחר קוד גישה'; + + @override + String get pleaseClickOnLink => 'אנא לחץ על הקישור במייל ולאחר מכן המשך.'; + + @override + String get pleaseEnter4Digits => + 'אנא הזן 4 ספרות או השאר ריק כדי להשבית את נעילת האפליקציה.'; + + @override + String get pleaseEnterRecoveryKey => 'Please enter your recovery key:'; + + @override + String get pleaseEnterYourPassword => 'נא הזן את הסיסמה שלך'; + + @override + String get pleaseEnterYourPin => 'אנא הזן את קוד הpin שלך'; + + @override + String get pleaseEnterYourUsername => 'אנא הזן שם משתמש'; + + @override + String get pleaseFollowInstructionsOnWeb => + 'Please follow the instructions on the website and tap on next.'; + + @override + String get privacy => 'Privacy'; + + @override + String get publicRooms => 'Public Rooms'; + + @override + String get pushRules => 'Push rules'; + + @override + String get reason => 'Reason'; + + @override + String get recording => 'Recording'; + + @override + String redactedBy(String username) { + return 'Redacted by $username'; + } + + @override + String get directChat => 'Direct chat'; + + @override + String redactedByBecause(String username, String reason) { + return 'Redacted by $username because: \"$reason\"'; + } + + @override + String redactedAnEvent(String username) { + return '$username redacted an event'; + } + + @override + String get redactMessage => 'Redact message'; + + @override + String get register => 'Register'; + + @override + String get reject => 'Reject'; + + @override + String rejectedTheInvitation(String username) { + return '$username rejected the invitation'; + } + + @override + String get rejoin => 'Rejoin'; + + @override + String get removeAllOtherDevices => 'Remove all other devices'; + + @override + String removedBy(String username) { + return 'Removed by $username'; + } + + @override + String get removeDevice => 'Remove device'; + + @override + String get unbanFromChat => 'Unban from chat'; + + @override + String get removeYourAvatar => 'Remove your avatar'; + + @override + String get replaceRoomWithNewerVersion => 'Replace room with newer version'; + + @override + String get reply => 'Reply'; + + @override + String get reportMessage => 'Report message'; + + @override + String get translateMessage => 'Translate message'; + + @override + String get translatedMessage => 'Translated message'; + + @override + String get errorTranslatingMessage => + 'An error has occured while translating the message.'; + + @override + String get recoverMessage => 'Recover message'; + + @override + String get recoveredMessage => 'Recovered message'; + + @override + String get errorRecoveringMessage => + 'An error has occured while recovering the message.'; + + @override + String get errorRecoveringMessageNoAdmin => + 'This feature is available on Synapse homeservers only for adminstrators.'; + + @override + String get requestPermission => 'Request permission'; + + @override + String get roomHasBeenUpgraded => 'Room has been upgraded'; + + @override + String get roomVersion => 'Room version'; + + @override + String get saveFile => 'Save file'; + + @override + String get retry => 'Retry'; + + @override + String get search => 'Search'; + + @override + String get security => 'Security'; + + @override + String get recoveryKey => 'Recovery key'; + + @override + String get recoveryKeyLost => 'Recovery key lost?'; + + @override + String seenByUser(String username) { + return 'Seen by $username'; + } + + @override + String get send => 'Send'; + + @override + String get sendAMessage => 'Send a message'; + + @override + String get sendAsText => 'Send as text'; + + @override + String get sendAudio => 'Send audio'; + + @override + String get sendFile => 'Send file'; + + @override + String get sendImage => 'Send image'; + + @override + String sendImages(int count) { + return 'Send $count image'; + } + + @override + String get sendMessages => 'Send messages'; + + @override + String get sendOriginal => 'Send original'; + + @override + String get sendSticker => 'Send sticker'; + + @override + String get sendVideo => 'Send video'; + + @override + String sentAFile(String username) { + return '📁 $username sent a file'; + } + + @override + String sentAnAudio(String username) { + return '🎤 $username sent an audio'; + } + + @override + String sentAPicture(String username) { + return '🖼️ $username sent a picture'; + } + + @override + String sentASticker(String username) { + return '😊 $username sent a sticker'; + } + + @override + String sentAVideo(String username) { + return '🎥 $username sent a video'; + } + + @override + String sentCallInformations(String senderName) { + return '$senderName sent call information'; + } + + @override + String get separateChatTypes => 'Separate Direct Chats and Groups'; + + @override + String get setAsCanonicalAlias => 'Set as main alias'; + + @override + String get setCustomEmotes => 'Set custom emotes'; + + @override + String get setChatDescription => 'Set chat description'; + + @override + String get setInvitationLink => 'Set invitation link'; + + @override + String get setPermissionsLevel => 'Set permissions level'; + + @override + String get setStatus => 'Set status'; + + @override + String get settings => 'Settings'; + + @override + String get share => 'Share'; + + @override + String sharedTheLocation(String username) { + return '$username shared their location'; + } + + @override + String get shareLocation => 'Share location'; + + @override + String get showPassword => 'Show password'; + + @override + String get presenceStyle => 'Presence:'; + + @override + String get hideAvatarsInInvites => 'Hide avatars in invites'; + + @override + String get hideAvatarsInInvitesDescription => + 'Do not show room avatars in invites'; + + @override + String get presencesToggle => 'Show status messages from other users'; + + @override + String get pureBlackToggle => 'Pure Black'; + + @override + String get singlesignon => 'Single Sign on'; + + @override + String get skip => 'Skip'; + + @override + String get sourceCode => 'Source code'; + + @override + String get spaceIsPublic => 'Space is public'; + + @override + String get spaceName => 'Space name'; + + @override + String startedACall(String senderName) { + return '$senderName started a call'; + } + + @override + String get startFirstChat => 'Start your first chat'; + + @override + String get status => 'Status'; + + @override + String get statusExampleMessage => 'How are you today?'; + + @override + String get submit => 'Submit'; + + @override + String get synchronizingPleaseWait => 'Synchronizing… Please wait.'; + + @override + String synchronizingPleaseWaitCounter(String percentage) { + return ' Synchronizing… ($percentage%)'; + } + + @override + String get systemTheme => 'System'; + + @override + String get theyDontMatch => 'They Don\'t Match'; + + @override + String get theyMatch => 'They Match'; + + @override + String get title => 'Extera'; + + @override + String get toggleFavorite => 'Toggle Favorite'; + + @override + String get toggleMuted => 'Toggle Muted'; + + @override + String get toggleUnread => 'Mark Read/Unread'; + + @override + String get tooManyRequestsWarning => + 'Too many requests. Please try again later!'; + + @override + String get transferFromAnotherDevice => 'Transfer from another device'; + + @override + String get tryToSendAgain => 'Try to send again'; + + @override + String get unavailable => 'Unavailable'; + + @override + String unbannedUser(String username, String targetName) { + return '$username unbanned $targetName'; + } + + @override + String get unblockDevice => 'Unblock Device'; + + @override + String get unknownDevice => 'Unknown device'; + + @override + String get unknownEncryptionAlgorithm => 'Unknown encryption algorithm'; + + @override + String unknownEvent(String type) { + return 'Unknown event \'$type\''; + } + + @override + String get unmuteChat => 'Unmute chat'; + + @override + String get unpin => 'Unpin'; + + @override + String unreadChats(int unreadCount) { + String _temp0 = intl.Intl.pluralLogic( + unreadCount, + locale: localeName, + other: '$unreadCount unread chats', + one: '1 unread chat', + ); + return '$_temp0'; + } + + @override + String userAndOthersAreTyping(String username, int count) { + return '$username and $count others are typing…'; + } + + @override + String userAndUserAreTyping(String username, String username2) { + return '$username and $username2 are typing…'; + } + + @override + String userIsTyping(String username) { + return '$username is typing…'; + } + + @override + String userLeftTheChat(String username) { + return '🚪 $username left the chat'; + } + + @override + String get username => 'Username'; + + @override + String userSentUnknownEvent(String username, String type) { + return '$username sent a $type event'; + } + + @override + String get unverified => 'Unverified'; + + @override + String get verified => 'Verified'; + + @override + String get verify => 'Verify'; + + @override + String get verifyStart => 'Start Verification'; + + @override + String get verifySuccess => 'You successfully verified!'; + + @override + String get verifyTitle => 'Verifying other account'; + + @override + String get videoCall => 'Video call'; + + @override + String get visibilityOfTheChatHistory => 'Visibility of the chat history'; + + @override + String get visibleForAllParticipants => 'Visible for all participants'; + + @override + String get visibleForEveryone => 'Visible for everyone'; + + @override + String get voiceMessage => 'Voice message'; + + @override + String get waitingPartnerAcceptRequest => + 'Waiting for partner to accept the request…'; + + @override + String get waitingPartnerEmoji => 'Waiting for partner to accept the emoji…'; + + @override + String get waitingPartnerNumbers => + 'Waiting for partner to accept the numbers…'; + + @override + String get wallpaper => 'Wallpaper:'; + + @override + String get warning => 'Warning!'; + + @override + String get weSentYouAnEmail => 'We sent you an email'; + + @override + String get whoCanPerformWhichAction => 'Who can perform which action'; + + @override + String get whoIsAllowedToJoinThisGroup => 'Who is allowed to join this group'; + + @override + String get whyDoYouWantToReportThis => 'Why do you want to report this?'; + + @override + String get wipeChatBackup => + 'Wipe your chat backup to create a new recovery key?'; + + @override + String get withTheseAddressesRecoveryDescription => + 'With these addresses you can recover your password.'; + + @override + String get writeAMessage => 'Write a message…'; + + @override + String get yes => 'Yes'; + + @override + String get you => 'You'; + + @override + String get youAreNoLongerParticipatingInThisChat => + 'You are no longer participating in this chat'; + + @override + String get youHaveBeenBannedFromThisChat => + 'You have been banned from this chat'; + + @override + String get yourPublicKey => 'Your public key'; + + @override + String get messageInfo => 'Message info'; + + @override + String get time => 'Time'; + + @override + String get messageType => 'Message Type'; + + @override + String get sender => 'Sender'; + + @override + String get openGallery => 'Open gallery'; + + @override + String get removeFromSpace => 'Remove from space'; + + @override + String get addToSpaceDescription => 'Select a space to add this chat to it.'; + + @override + String get start => 'Start'; + + @override + String get pleaseEnterRecoveryKeyDescription => + 'To unlock your old messages, please enter your recovery key that has been generated in a previous session. Your recovery key is NOT your password.'; + + @override + String get publish => 'Publish'; + + @override + String videoWithSize(String size) { + return 'Video ($size)'; + } + + @override + String get openChat => 'Open Chat'; + + @override + String get markAsRead => 'Mark as read'; + + @override + String get reportUser => 'Report user'; + + @override + String get dismiss => 'Dismiss'; + + @override + String reactedWith(String sender, String reaction) { + return '$sender reacted with $reaction'; + } + + @override + String get pinMessage => 'Pin to room'; + + @override + String get confirmEventUnpin => + 'Are you sure to permanently unpin the event?'; + + @override + String get emojis => 'Emojis'; + + @override + String get placeCall => 'Place call'; + + @override + String get voiceCall => 'Voice call'; + + @override + String get unsupportedAndroidVersion => 'Unsupported Android version'; + + @override + String get unsupportedAndroidVersionLong => + 'This feature requires a newer Android version. Please check for updates or Lineage OS support.'; + + @override + String get videoCallsBetaWarning => + 'Please note that video calls are currently in beta. They might not work as expected or work at all on all platforms.'; + + @override + String get experimentalVideoCalls => 'Experimental video calls'; + + @override + String get emailOrUsername => 'Email or username'; + + @override + String get indexedDbErrorTitle => 'Private mode issues'; + + @override + String get indexedDbErrorLong => + 'The message storage is unfortunately not enabled in private mode by default.\nPlease visit\n - about:config\n - set dom.indexedDB.privateBrowsing.enabled to true\nOtherwise, it is not possible to run Extera.'; + + @override + String switchToAccount(String number) { + return 'Switch to account $number'; + } + + @override + String get nextAccount => 'Next account'; + + @override + String get previousAccount => 'Previous account'; + + @override + String get addWidget => 'Add widget'; + + @override + String get widgetVideo => 'Video'; + + @override + String get widgetEtherpad => 'Text note'; + + @override + String get widgetJitsi => 'Jitsi Meet'; + + @override + String get widgetCustom => 'Custom'; + + @override + String get widgetName => 'Name'; + + @override + String get widgetUrlError => 'This is not a valid URL.'; + + @override + String get widgetNameError => 'Please provide a display name.'; + + @override + String get errorAddingWidget => 'Error adding the widget.'; + + @override + String get youRejectedTheInvitation => 'You rejected the invitation'; + + @override + String get youJoinedTheChat => 'You joined the chat'; + + @override + String get youAcceptedTheInvitation => '👍 You accepted the invitation'; + + @override + String youBannedUser(String user) { + return 'You banned $user'; + } + + @override + String youHaveWithdrawnTheInvitationFor(String user) { + return 'You have withdrawn the invitation for $user'; + } + + @override + String youInvitedToBy(String alias) { + return '📩 You have been invited via link to:\n$alias'; + } + + @override + String youInvitedBy(String user) { + return '📩 You have been invited by $user'; + } + + @override + String invitedBy(String user) { + return '📩 Invited by $user'; + } + + @override + String youInvitedUser(String user) { + return '📩 You invited $user'; + } + + @override + String youKicked(String user) { + return '👞 You kicked $user'; + } + + @override + String youKickedAndBanned(String user) { + return '🙅 You kicked and banned $user'; + } + + @override + String youUnbannedUser(String user) { + return 'You unbanned $user'; + } + + @override + String hasKnocked(String user) { + return '🚪 $user has knocked'; + } + + @override + String get usersMustKnock => 'Users must knock'; + + @override + String get noOneCanJoin => 'No one can join'; + + @override + String userWouldLikeToChangeTheChat(String user) { + return '$user would like to join the chat.'; + } + + @override + String get noPublicLinkHasBeenCreatedYet => + 'No public link has been created yet'; + + @override + String get knock => 'Knock'; + + @override + String get users => 'Users'; + + @override + String get unlockOldMessages => 'Unlock old messages'; + + @override + String get storeInSecureStorageDescription => + 'Store the recovery key in the secure storage of this device.'; + + @override + String get saveKeyManuallyDescription => + 'Save this key manually by triggering the system share dialog or clipboard.'; + + @override + String get storeInAndroidKeystore => 'Store in Android KeyStore'; + + @override + String get storeInAppleKeyChain => 'Store in Apple KeyChain'; + + @override + String get storeSecurlyOnThisDevice => 'Store securely on this device'; + + @override + String countFiles(int count) { + return '$count files'; + } + + @override + String get user => 'User'; + + @override + String get custom => 'Custom'; + + @override + String get foregroundServiceRunning => + 'This notification appears when the foreground service is running.'; + + @override + String get screenSharingTitle => 'screen sharing'; + + @override + String get screenSharingDetail => 'You are sharing your screen in Extera'; + + @override + String get callingPermissions => 'Calling permissions'; + + @override + String get callingAccount => 'Calling account'; + + @override + String get callingAccountDetails => + 'Allows Extera to use the native android dialer app.'; + + @override + String get appearOnTop => 'Appear on top'; + + @override + String get appearOnTopDetails => + 'Allows the app to appear on top (not needed if you already have Fluffychat setup as a calling account)'; + + @override + String get otherCallingPermissions => + 'Microphone, camera and other Extera permissions'; + + @override + String get whyIsThisMessageEncrypted => 'Why is this message unreadable?'; + + @override + String get noKeyForThisMessage => + 'This can happen if the message was sent before you have signed in to your account at this device.\n\nIt is also possible that the sender has blocked your device or something went wrong with the internet connection.\n\nAre you able to read the message on another session? Then you can transfer the message from it! Go to Settings > Devices and make sure that your devices have verified each other. When you open the room the next time and both sessions are in the foreground, the keys will be transmitted automatically.\n\nDo you not want to lose the keys when logging out or switching devices? Make sure that you have enabled the chat backup in the settings.'; + + @override + String get newGroup => 'New group'; + + @override + String get newSpace => 'New space'; + + @override + String get enterSpace => 'Enter space'; + + @override + String get enterRoom => 'Enter room'; + + @override + String get allSpaces => 'All spaces'; + + @override + String numChats(String number) { + return '$number chats'; + } + + @override + String get hideUnimportantStateEvents => 'Hide unimportant state events'; + + @override + String get hidePresences => 'Hide Status List?'; + + @override + String get doNotShowAgain => 'Do not show again'; + + @override + String wasDirectChatDisplayName(String oldDisplayName) { + return 'Empty chat (was $oldDisplayName)'; + } + + @override + String get newSpaceDescription => + 'Spaces allows you to consolidate your chats and build private or public communities.'; + + @override + String get encryptThisChat => 'Encrypt this chat'; + + @override + String get disableEncryptionWarning => + 'For security reasons you can not disable encryption in a chat, where it has been enabled before.'; + + @override + String get sorryThatsNotPossible => 'Sorry... that is not possible'; + + @override + String get deviceKeys => 'Device keys:'; + + @override + String get reopenChat => 'Reopen chat'; + + @override + String get noBackupWarning => + 'Warning! Without enabling chat backup, you will lose access to your encrypted messages. It is highly recommended to enable the chat backup first before logging out.'; + + @override + String get noOtherDevicesFound => 'No other devices found'; + + @override + String fileIsTooBigForServer(String max) { + return 'Unable to send! The server only supports attachments up to $max.'; + } + + @override + String fileHasBeenSavedAt(String path) { + return 'File has been saved at $path'; + } + + @override + String get jumpToLastReadMessage => 'Jump to last read message'; + + @override + String get readUpToHere => 'Read up to here'; + + @override + String get jump => 'Jump'; + + @override + String get openLinkInBrowser => 'Open link in browser'; + + @override + String get reportErrorDescription => + '😭 Oh no. Something went wrong. If you want, you can report this bug to the developers.'; + + @override + String get report => 'Report'; + + @override + String get signInWithPassword => 'Sign in with password'; + + @override + String get pleaseTryAgainLaterOrChooseDifferentServer => + 'Please try again later or choose a different server.'; + + @override + String signInWith(String provider) { + return 'Sign in with $provider'; + } + + @override + String get profileNotFound => + 'The user could not be found on the server. Maybe there is a connection problem or the user doesn\'t exist.'; + + @override + String get setTheme => 'Set theme:'; + + @override + String get setColorTheme => 'Set color theme:'; + + @override + String get invite => 'Invite'; + + @override + String get inviteGroupChat => '📨 Invite group chat'; + + @override + String get invitePrivateChat => '📨 Invite private chat'; + + @override + String get invalidInput => 'Invalid input!'; + + @override + String wrongPinEntered(int seconds) { + return 'Wrong pin entered! Try again in $seconds seconds...'; + } + + @override + String get pleaseEnterANumber => 'Please enter a number greater than 0'; + + @override + String get archiveRoomDescription => + 'The chat will be moved to the archive. Other users will be able to see that you have left the chat.'; + + @override + String get roomUpgradeDescription => + 'The chat will then be recreated with the new room version. All participants will be notified that they need to switch to the new chat. You can find out more about room versions at https://spec.matrix.org/latest/rooms/'; + + @override + String get removeDevicesDescription => + 'You will be logged out of this device and will no longer be able to receive messages.'; + + @override + String get banUserDescription => + 'The user will be banned from the chat and will not be able to enter the chat again until they are unbanned.'; + + @override + String get unbanUserDescription => + 'The user will be able to enter the chat again if they try.'; + + @override + String get kickUserDescription => + 'The user is kicked out of the chat but not banned. In public chats, the user can rejoin at any time.'; + + @override + String get makeAdminDescription => + 'Once you make this user admin, you may not be able to undo this as they will then have the same permissions as you.'; + + @override + String get pushNotificationsNotAvailable => + 'Push notifications not available'; + + @override + String get learnMore => 'Learn more'; + + @override + String get yourGlobalUserIdIs => 'Your global user-ID is: '; + + @override + String noUsersFoundWithQuery(String query) { + return 'Unfortunately no user could be found with \"$query\". Please check whether you made a typo.'; + } + + @override + String get knocking => 'Knocking'; + + @override + String chatCanBeDiscoveredViaSearchOnServer(String server) { + return 'Chat can be discovered via the search on $server'; + } + + @override + String get searchChatsRooms => 'Search for #chats, @users...'; + + @override + String get nothingFound => 'Nothing found...'; + + @override + String get groupName => 'Group name'; + + @override + String get createGroupAndInviteUsers => 'Create a group and invite users'; + + @override + String get groupCanBeFoundViaSearch => 'Group can be found via search'; + + @override + String get wrongRecoveryKey => + 'Sorry... this does not seem to be the correct recovery key.'; + + @override + String get startConversation => 'Start conversation'; + + @override + String get commandHint_sendraw => 'Send raw json'; + + @override + String get databaseMigrationTitle => 'Database is optimized'; + + @override + String get databaseMigrationBody => 'Please wait. This may take a moment.'; + + @override + String get leaveEmptyToClearStatus => 'Leave empty to clear your status.'; + + @override + String get select => 'Select'; + + @override + String get searchForUsers => 'Search for @users...'; + + @override + String get pleaseEnterYourCurrentPassword => + 'Please enter your current password'; + + @override + String get newPassword => 'New password'; + + @override + String get pleaseChooseAStrongPassword => 'Please choose a strong password'; + + @override + String get passwordsDoNotMatch => 'Passwords do not match'; + + @override + String get passwordIsWrong => 'Your entered password is wrong'; + + @override + String get publicLink => 'Public link'; + + @override + String get publicChatAddresses => 'Public chat addresses'; + + @override + String get createNewAddress => 'Create new address'; + + @override + String get joinSpace => 'Join space'; + + @override + String get publicSpaces => 'Public spaces'; + + @override + String get addChatOrSubSpace => 'Add chat or sub space'; + + @override + String get subspace => 'Subspace'; + + @override + String get decline => 'Decline'; + + @override + String get thisDevice => 'This device:'; + + @override + String get initAppError => 'An error occured while init the app'; + + @override + String get userRole => 'User role'; + + @override + String minimumPowerLevel(String level) { + return '$level is the minimum power level.'; + } + + @override + String searchIn(String chat) { + return 'Search in chat \"$chat\"...'; + } + + @override + String get searchMore => 'Search more...'; + + @override + String get gallery => 'Gallery'; + + @override + String get files => 'Files'; + + @override + String databaseBuildErrorBody(String url, String error) { + return 'Unable to build the SQlite database. The app tries to use the legacy database for now. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String sessionLostBody(String url, String error) { + return 'Your session is lost. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String restoreSessionBody(String url, String error) { + return 'The app now tries to restore your session from the backup. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String forwardMessageTo(String roomName) { + return 'Forward message to $roomName?'; + } + + @override + String get sendReadReceipts => 'Send read receipts'; + + @override + String get sendTypingNotificationsDescription => + 'Other participants in a chat can see when you are typing a new message.'; + + @override + String get sendReadReceiptsDescription => + 'Other participants in a chat can see when you have read a message.'; + + @override + String get formattedMessages => 'Formatted messages'; + + @override + String get formattedMessagesDescription => + 'Display rich message content like bold text using markdown.'; + + @override + String get verifyOtherUser => '🔐 Verify other user'; + + @override + String get verifyOtherUserDescription => + 'If you verify another user, you can be sure that you know who you are really writing to. 💪\n\nWhen you start a verification, you and the other user will see a popup in the app. There you will then see a series of emojis or numbers that you have to compare with each other.\n\nThe best way to do this is to meet up or start a video call. 👭'; + + @override + String get verifyOtherDevice => '🔐 Verify other device'; + + @override + String get verifyOtherDeviceDescription => + 'When you verify another device, those devices can exchange keys, increasing your overall security. 💪 When you start a verification, a popup will appear in the app on both devices. There you will then see a series of emojis or numbers that you have to compare with each other. It\'s best to have both devices handy before you start the verification. 🤳'; + + @override + String acceptedKeyVerification(String sender) { + return '$sender accepted key verification'; + } + + @override + String canceledKeyVerification(String sender) { + return '$sender canceled key verification'; + } + + @override + String completedKeyVerification(String sender) { + return '$sender completed key verification'; + } + + @override + String isReadyForKeyVerification(String sender) { + return '$sender is ready for key verification'; + } + + @override + String requestedKeyVerification(String sender) { + return '$sender requested key verification'; + } + + @override + String startedKeyVerification(String sender) { + return '$sender started key verification'; + } + + @override + String get transparent => 'Transparent'; + + @override + String get incomingMessages => 'Incoming messages'; + + @override + String get stickers => 'Stickers'; + + @override + String get discover => 'Discover'; + + @override + String get commandHint_ignore => 'Ignore the given matrix ID'; + + @override + String get commandHint_unignore => 'Unignore the given matrix ID'; + + @override + String unreadChatsInApp(String appname, String unread) { + return '$appname: $unread unread chats'; + } + + @override + String get noDatabaseEncryption => + 'Database encryption is not supported on this platform'; + + @override + String thereAreCountUsersBlocked(Object count) { + return 'Right now there are $count users blocked.'; + } + + @override + String get restricted => 'Restricted'; + + @override + String get knockRestricted => 'Knock restricted'; + + @override + String goToSpace(Object space) { + return 'Go to space: $space'; + } + + @override + String get markAsUnread => 'Mark as unread'; + + @override + String userLevel(int level) { + return '$level - User'; + } + + @override + String moderatorLevel(int level) { + return '$level - Moderator'; + } + + @override + String adminLevel(int level) { + return '$level - Admin'; + } + + @override + String get changeGeneralChatSettings => 'Change general chat settings'; + + @override + String get inviteOtherUsers => 'Invite other users to this chat'; + + @override + String get changeTheChatPermissions => 'Change the chat permissions'; + + @override + String get changeTheVisibilityOfChatHistory => + 'Change the visibility of the chat history'; + + @override + String get changeTheCanonicalRoomAlias => + 'Change the main public chat address'; + + @override + String get sendRoomNotifications => 'Send a @room notifications'; + + @override + String get changeTheDescriptionOfTheGroup => + 'Change the description of the chat'; + + @override + String get chatPermissionsDescription => + 'Define which power level is necessary for certain actions in this chat. The power levels 0, 50 and 100 are usually representing users, moderators and admins, but any gradation is possible.'; + + @override + String updateInstalled(String version) { + return '🎉 Update $version installed!'; + } + + @override + String get changelog => 'Changelog'; + + @override + String get sendCanceled => 'Sending canceled'; + + @override + String get loginWithMatrixId => 'Login with Matrix-ID'; + + @override + String get discoverHomeservers => 'Discover homeservers'; + + @override + String get whatIsAHomeserver => 'What is a homeserver?'; + + @override + String get homeserverDescription => + 'All your data is stored on the homeserver, just like an email provider. You can choose which homeserver you want to use, while you can still communicate with everyone. Learn more at at https://matrix.org.'; + + @override + String get doesNotSeemToBeAValidHomeserver => + 'Doesn\'t seem to be a compatible homeserver. Wrong URL?'; + + @override + String get calculatingFileSize => 'Calculating file size...'; + + @override + String get prepareSendingAttachment => 'Prepare sending attachment...'; + + @override + String get sendingAttachment => 'Sending attachment...'; + + @override + String get generatingVideoThumbnail => 'Generating video thumbnail...'; + + @override + String get compressVideo => 'Compressing video...'; + + @override + String sendingAttachmentCountOfCount(int index, int length) { + return 'Sending attachment $index of $length...'; + } + + @override + String serverLimitReached(int seconds) { + return 'Server limit reached! Waiting $seconds seconds...'; + } + + @override + String get oneOfYourDevicesIsNotVerified => + 'One of your devices is not verified'; + + @override + String get noticeChatBackupDeviceVerification => + 'Note: When you connect all your devices to the chat backup, they are automatically verified.'; + + @override + String get continueText => 'Continue'; + + @override + String get welcomeText => + 'Hey Hey 👋 This is Extera. You can sign in to any homeserver, which is compatible with https://matrix.org. And then chat with anyone. It\'s a huge decentralized messaging network!'; + + @override + String get blur => 'Blur:'; + + @override + String get opacity => 'Opacity:'; + + @override + String get setWallpaper => 'Set wallpaper'; + + @override + String get manageAccount => 'Manage account'; + + @override + String get noContactInformationProvided => + 'Server does not provide any valid contact information'; + + @override + String get contactServerAdmin => 'Contact server admin'; + + @override + String get contactServerSecurity => 'Contact server security'; + + @override + String get supportPage => 'Support page'; + + @override + String get serverInformation => 'Server information:'; + + @override + String get name => 'Name'; + + @override + String get version => 'Version'; + + @override + String get website => 'Website'; + + @override + String get compress => 'Compress'; + + @override + String get boldText => 'Bold text'; + + @override + String get italicText => 'Italic text'; + + @override + String get strikeThrough => 'Strikethrough'; + + @override + String get pleaseFillOut => 'Please fill out'; + + @override + String get invalidUrl => 'Invalid url'; + + @override + String get addLink => 'Add link'; + + @override + String get unableToJoinChat => + 'Unable to join chat. Maybe the other party has already closed the conversation.'; + + @override + String get previous => 'Previous'; + + @override + String get otherPartyNotLoggedIn => + 'The other party is currently not logged in and therefore cannot receive messages!'; + + @override + String appWantsToUseForLogin(String server) { + return 'Use \'$server\' to log in'; + } + + @override + String get appWantsToUseForLoginDescription => + 'You hereby allow the app and website to share information about you.'; + + @override + String get open => 'Open'; + + @override + String get waitingForServer => 'Waiting for server...'; + + @override + String get appIntroduction => + 'Extera lets you chat with your friends across different messengers. Learn more at https://matrix.org or just tap *Continue*.'; + + @override + String get newChatRequest => '📩 New chat request'; + + @override + String get contentNotificationSettings => 'Content notification settings'; + + @override + String get generalNotificationSettings => 'General notification settings'; + + @override + String get roomNotificationSettings => 'Room notification settings'; + + @override + String get userSpecificNotificationSettings => + 'User specific notification settings'; + + @override + String get otherNotificationSettings => 'Other notification settings'; + + @override + String get notificationRuleContainsUserName => 'Contains User Name'; + + @override + String get notificationRuleContainsUserNameDescription => + 'Notifies the user when a message contains their username.'; + + @override + String get notificationRuleMaster => 'Mute all notifications'; + + @override + String get notificationRuleMasterDescription => + 'Overrides all other rules and disables all notifications.'; + + @override + String get notificationRuleSuppressNotices => 'Suppress Automated Messages'; + + @override + String get notificationRuleSuppressNoticesDescription => + 'Suppresses notifications from automated clients like bots.'; + + @override + String get notificationRuleInviteForMe => 'Invite for Me'; + + @override + String get notificationRuleInviteForMeDescription => + 'Notifies the user when they are invited to a room.'; + + @override + String get notificationRuleMemberEvent => 'Member Event'; + + @override + String get notificationRuleMemberEventDescription => + 'Suppresses notifications for membership events.'; + + @override + String get notificationRuleIsUserMention => 'User Mention'; + + @override + String get notificationRuleIsUserMentionDescription => + 'Notifies the user when they are directly mentioned in a message.'; + + @override + String get notificationRuleContainsDisplayName => 'Contains Display Name'; + + @override + String get notificationRuleContainsDisplayNameDescription => + 'Notifies the user when a message contains their display name.'; + + @override + String get notificationRuleIsRoomMention => 'Room Mention'; + + @override + String get notificationRuleIsRoomMentionDescription => + 'Notifies the user when there is a room mention.'; + + @override + String get notificationRuleRoomnotif => 'Room Notification'; + + @override + String get notificationRuleRoomnotifDescription => + 'Notifies the user when a message contains \'@room\'.'; + + @override + String get notificationRuleTombstone => 'Tombstone'; + + @override + String get notificationRuleTombstoneDescription => + 'Notifies the user about room deactivation messages.'; + + @override + String get notificationRuleReaction => 'Reaction'; + + @override + String get notificationRuleReactionDescription => + 'Suppresses notifications for reactions.'; + + @override + String get notificationRuleRoomServerAcl => 'Room Server ACL'; + + @override + String get notificationRuleRoomServerAclDescription => + 'Suppresses notifications for room server access control lists (ACL).'; + + @override + String get notificationRuleSuppressEdits => 'Suppress Edits'; + + @override + String get notificationRuleSuppressEditsDescription => + 'Suppresses notifications for edited messages.'; + + @override + String get notificationRuleCall => 'Call'; + + @override + String get notificationRuleCallDescription => + 'Notifies the user about calls.'; + + @override + String get notificationRuleEncryptedRoomOneToOne => + 'Encrypted Room One-to-One'; + + @override + String get notificationRuleEncryptedRoomOneToOneDescription => + 'Notifies the user about messages in encrypted one-to-one rooms.'; + + @override + String get notificationRuleRoomOneToOne => 'Room One-to-One'; + + @override + String get notificationRuleRoomOneToOneDescription => + 'Notifies the user about messages in one-to-one rooms.'; + + @override + String get notificationRuleMessage => 'Message'; + + @override + String get notificationRuleMessageDescription => + 'Notifies the user about general messages.'; + + @override + String get notificationRuleEncrypted => 'Encrypted'; + + @override + String get notificationRuleEncryptedDescription => + 'Notifies the user about messages in encrypted rooms.'; + + @override + String get notificationRuleJitsi => 'Jitsi'; + + @override + String get notificationRuleJitsiDescription => + 'Notifies the user about Jitsi widget events.'; + + @override + String get notificationRuleServerAcl => 'Suppress Server ACL Events'; + + @override + String get notificationRuleServerAclDescription => + 'Suppresses notifications for Server ACL events.'; + + @override + String unknownPushRule(String rule) { + return 'Unknown push rule \'$rule\''; + } + + @override + String get deletePushRuleCanNotBeUndone => + 'If you delete this notification setting, this can not be undone.'; + + @override + String get more => 'More'; + + @override + String get shareKeysWith => 'Share keys with...'; + + @override + String get shareKeysWithDescription => + 'Which devices should be trusted so that they can read along your messages in encrypted chats?'; + + @override + String get allDevices => 'All devices'; + + @override + String get crossVerifiedDevicesIfEnabled => + 'Cross verified devices if enabled'; + + @override + String get crossVerifiedDevices => 'Cross verified devices'; + + @override + String get verifiedDevicesOnly => 'Verified devices only'; + + @override + String get takeAPhoto => 'Take a photo'; + + @override + String get recordAVideo => 'Record a video'; + + @override + String get optionalMessage => '(Optional) message...'; + + @override + String get notSupportedOnThisDevice => 'Not supported on this device'; + + @override + String get enterNewChat => 'Enter new chat'; + + @override + String get approve => 'Approve'; + + @override + String get youHaveKnocked => 'You have knocked'; + + @override + String get pleaseWaitUntilInvited => + 'Please wait now, until someone from the room invites you.'; +} diff --git a/lib/generated/l10n/l10n_hi.dart b/lib/generated/l10n/l10n_hi.dart new file mode 100644 index 0000000..e6f95ef --- /dev/null +++ b/lib/generated/l10n/l10n_hi.dart @@ -0,0 +1,2745 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'l10n.dart'; + +// ignore_for_file: type=lint + +/// The translations for Hindi (`hi`). +class L10nHi extends L10n { + L10nHi([String locale = 'hi']) : super(locale); + + @override + String get noSendPermission => 'You can\'t send messages here'; + + @override + String get alwaysUse24HourFormat => 'false'; + + @override + String get repeatPassword => 'पासवर्ड दोहराएं'; + + @override + String get notAnImage => 'कोई छवि फ़ाइल नहीं।'; + + @override + String get setCustomPermissionLevel => 'Set custom permission level'; + + @override + String get setPermissionsLevelDescription => + 'Please choose a predefined role below or enter a custom permission level between 0 and 100.'; + + @override + String get ignoreUser => 'Ignore user'; + + @override + String get normalUser => 'Normal user'; + + @override + String get remove => 'निकालना'; + + @override + String get importNow => 'अभी आयात करें'; + + @override + String get importEmojis => 'इमोजी आयात करें'; + + @override + String get importFromZipFile => '.zip फ़ाइल से आयात करें'; + + @override + String get exportEmotePack => 'इमोट पैक को .zip के रूप में निर्यात करें'; + + @override + String get replace => 'Replace'; + + @override + String get about => 'About'; + + @override + String aboutHomeserver(String homeserver) { + return 'About $homeserver'; + } + + @override + String get accept => 'Accept'; + + @override + String acceptedTheInvitation(String username) { + return '👍 $username accepted the invitation'; + } + + @override + String get account => 'Account'; + + @override + String activatedEndToEndEncryption(String username) { + return '🔐 $username activated end to end encryption'; + } + + @override + String get addEmail => 'Add email'; + + @override + String get confirmMatrixId => + 'Please confirm your Matrix ID in order to delete your account.'; + + @override + String supposedMxid(String mxid) { + return 'This should be $mxid'; + } + + @override + String get addChatDescription => 'Add a chat description...'; + + @override + String get addToSpace => 'Add to space'; + + @override + String get admin => 'Admin'; + + @override + String get alias => 'alias'; + + @override + String get all => 'All'; + + @override + String get allChats => 'All chats'; + + @override + String get commandHint_roomupgrade => + 'Upgrade this room to the given room version'; + + @override + String get commandHint_googly => 'Send some googly eyes'; + + @override + String get commandHint_cuddle => 'Send a cuddle'; + + @override + String get commandHint_hug => 'Send a hug'; + + @override + String googlyEyesContent(String senderName) { + return '$senderName sends you googly eyes'; + } + + @override + String cuddleContent(String senderName) { + return '$senderName cuddles you'; + } + + @override + String hugContent(String senderName) { + return '$senderName hugs you'; + } + + @override + String answeredTheCall(String senderName) { + return '$senderName answered the call'; + } + + @override + String get anyoneCanJoin => 'Anyone can join'; + + @override + String get appLock => 'App lock'; + + @override + String get appLockDescription => + 'Lock the app when not using with a pin code'; + + @override + String get archive => 'Archive'; + + @override + String get areGuestsAllowedToJoin => 'Are guest users allowed to join'; + + @override + String get areYouSure => 'Are you sure?'; + + @override + String get areYouSureYouWantToLogout => 'Are you sure you want to log out?'; + + @override + String get askSSSSSign => + 'To be able to sign the other person, please enter your secure store passphrase or recovery key.'; + + @override + String askVerificationRequest(String username) { + return 'Accept this verification request from $username?'; + } + + @override + String get autoplayImages => + 'Automatically play animated stickers and emotes'; + + @override + String badServerLoginTypesException(String serverVersions, + String supportedVersions, Object suportedVersions) { + return 'The homeserver supports the login types:\n$serverVersions\nBut this app supports only:\n$supportedVersions'; + } + + @override + String get sendTypingNotifications => 'Send typing notifications'; + + @override + String get swipeRightToLeftToReply => 'Swipe right to left to reply'; + + @override + String get sendOnEnter => 'Send on enter'; + + @override + String badServerVersionsException(String serverVersions, + String supportedVersions, Object serverVerions, Object suportedVersions) { + return 'The homeserver supports the Spec versions:\n$serverVersions\nBut this app supports only $supportedVersions'; + } + + @override + String countChatsAndCountParticipants(int chats, int participants) { + return '$chats chats and $participants participants'; + } + + @override + String get noMoreChatsFound => 'No more chats found...'; + + @override + String get noChatsFoundHere => + 'No chats found here yet. Start a new chat with someone by using the button below. ⤵️'; + + @override + String get joinedChats => 'Joined chats'; + + @override + String get unread => 'Unread'; + + @override + String get space => 'Space'; + + @override + String get spaces => 'Spaces'; + + @override + String get banFromChat => 'Ban from chat'; + + @override + String get banned => 'Banned'; + + @override + String bannedUser(String username, String targetName) { + return '$username banned $targetName'; + } + + @override + String get blockDevice => 'Block Device'; + + @override + String get blocked => 'Blocked'; + + @override + String get botMessages => 'Bot messages'; + + @override + String get cancel => 'Cancel'; + + @override + String cantOpenUri(String uri) { + return 'Can\'t open the URI $uri'; + } + + @override + String get changeDeviceName => 'Change device name'; + + @override + String changedTheChatAvatar(String username) { + return '$username changed the chat avatar'; + } + + @override + String changedTheChatDescriptionTo(String username, String description) { + return '$username changed the chat description to: \'$description\''; + } + + @override + String changedTheChatNameTo(String username, String chatname) { + return '$username changed the chat name to: \'$chatname\''; + } + + @override + String changedTheChatPermissions(String username) { + return '$username changed the chat permissions'; + } + + @override + String changedTheDisplaynameTo(String username, String displayname) { + return '$username changed their displayname to: \'$displayname\''; + } + + @override + String changedTheGuestAccessRules(String username) { + return '$username changed the guest access rules'; + } + + @override + String changedTheGuestAccessRulesTo(String username, String rules) { + return '$username changed the guest access rules to: $rules'; + } + + @override + String changedTheHistoryVisibility(String username) { + return '$username changed the history visibility'; + } + + @override + String changedTheHistoryVisibilityTo(String username, String rules) { + return '$username changed the history visibility to: $rules'; + } + + @override + String changedTheJoinRules(String username) { + return '$username changed the join rules'; + } + + @override + String changedTheJoinRulesTo(String username, String joinRules) { + return '$username changed the join rules to: $joinRules'; + } + + @override + String changedTheProfileAvatar(String username) { + return '$username changed their avatar'; + } + + @override + String changedTheRoomAliases(String username) { + return '$username changed the room aliases'; + } + + @override + String changedTheRoomInvitationLink(String username) { + return '$username changed the invitation link'; + } + + @override + String get changePassword => 'Change password'; + + @override + String get changeTheHomeserver => 'Change the homeserver'; + + @override + String get changeTheme => 'Change your style'; + + @override + String get changeTheNameOfTheGroup => 'Change the name of the group'; + + @override + String get changeYourAvatar => 'Change your avatar'; + + @override + String get channelCorruptedDecryptError => + 'The encryption has been corrupted'; + + @override + String get chat => 'Chat'; + + @override + String get yourChatBackupHasBeenSetUp => 'Your chat backup has been set up.'; + + @override + String get chatBackup => 'Chat backup'; + + @override + String get chatBackupDescription => + 'Your old messages are secured with a recovery key. Please make sure you don\'t lose it.'; + + @override + String get chatDetails => 'Chat details'; + + @override + String get chatHasBeenAddedToThisSpace => 'Chat has been added to this space'; + + @override + String get chats => 'Chats'; + + @override + String get chooseAStrongPassword => 'Choose a strong password'; + + @override + String get clearArchive => 'Clear archive'; + + @override + String get close => 'Close'; + + @override + String get commandHint_markasdm => + 'Mark as direct message room for the giving Matrix ID'; + + @override + String get commandHint_markasgroup => 'Mark as group'; + + @override + String get commandHint_ban => 'Ban the given user from this room'; + + @override + String get commandHint_clearcache => 'Clear cache'; + + @override + String get commandHint_create => + 'Create an empty group chat\nUse --no-encryption to disable encryption'; + + @override + String get commandHint_discardsession => 'Discard session'; + + @override + String get commandHint_dm => + 'Start a direct chat\nUse --no-encryption to disable encryption'; + + @override + String get commandHint_html => 'Send HTML-formatted text'; + + @override + String get commandHint_invite => 'Invite the given user to this room'; + + @override + String get commandHint_join => 'Join the given room'; + + @override + String get commandHint_kick => 'Remove the given user from this room'; + + @override + String get commandHint_leave => 'Leave this room'; + + @override + String get commandHint_me => 'Describe yourself'; + + @override + String get commandHint_myroomavatar => + 'Set your picture for this room (by mxc-uri)'; + + @override + String get commandHint_myroomnick => 'Set your display name for this room'; + + @override + String get commandHint_op => + 'Set the given user\'s power level (default: 50)'; + + @override + String get commandHint_plain => 'Send unformatted text'; + + @override + String get commandHint_react => 'Send reply as a reaction'; + + @override + String get commandHint_send => 'Send text'; + + @override + String get commandHint_unban => 'Unban the given user from this room'; + + @override + String get commandInvalid => 'Command invalid'; + + @override + String commandMissing(String command) { + return '$command is not a command.'; + } + + @override + String get compareEmojiMatch => 'Please compare the emojis'; + + @override + String get compareNumbersMatch => 'Please compare the numbers'; + + @override + String get configureChat => 'Configure chat'; + + @override + String get confirm => 'Confirm'; + + @override + String get connect => 'Connect'; + + @override + String get contactHasBeenInvitedToTheGroup => + 'Contact has been invited to the group'; + + @override + String get containsDisplayName => 'Contains display name'; + + @override + String get containsUserName => 'Contains username'; + + @override + String get contentHasBeenReported => + 'The content has been reported to the server admins'; + + @override + String get copiedToClipboard => 'Copied to clipboard'; + + @override + String get copy => 'Copy'; + + @override + String get copyToClipboard => 'Copy to clipboard'; + + @override + String couldNotDecryptMessage(String error) { + return 'Could not decrypt message: $error'; + } + + @override + String countParticipants(int count) { + return '$count participants'; + } + + @override + String get create => 'Create'; + + @override + String createdTheChat(String username) { + return '💬 $username created the chat'; + } + + @override + String get createGroup => 'Create group'; + + @override + String get createNewSpace => 'New space'; + + @override + String get currentlyActive => 'Currently active'; + + @override + String get darkTheme => 'Dark'; + + @override + String dateAndTimeOfDay(String date, String timeOfDay) { + return '$date, $timeOfDay'; + } + + @override + String dateWithoutYear(String month, String day) { + return '$month-$day'; + } + + @override + String dateWithYear(String year, String month, String day) { + return '$year-$month-$day'; + } + + @override + String get deactivateAccountWarning => + 'This will deactivate your user account. This can not be undone! Are you sure?'; + + @override + String get defaultPermissionLevel => 'Default permission level for new users'; + + @override + String get delete => 'Delete'; + + @override + String get deleteAccount => 'Delete account'; + + @override + String get deleteMessage => 'Delete message'; + + @override + String get device => 'Device'; + + @override + String get deviceId => 'Device ID'; + + @override + String get devices => 'Devices'; + + @override + String get directChats => 'Direct Chats'; + + @override + String get allRooms => 'All Group Chats'; + + @override + String get displaynameHasBeenChanged => 'Displayname has been changed'; + + @override + String get downloadFile => 'Download file'; + + @override + String get edit => 'Edit'; + + @override + String get editBlockedServers => 'Edit blocked servers'; + + @override + String get chatPermissions => 'Chat permissions'; + + @override + String get editDisplayname => 'Edit displayname'; + + @override + String get editRoomAliases => 'Edit room aliases'; + + @override + String get editRoomAvatar => 'Edit room avatar'; + + @override + String get emoteExists => 'Emote already exists!'; + + @override + String get emoteInvalid => 'Invalid emote shortcode!'; + + @override + String get emoteKeyboardNoRecents => + 'Recently-used emotes will appear here...'; + + @override + String get emotePacks => 'Emote packs for room'; + + @override + String get emoteSettings => 'Emote Settings'; + + @override + String get globalChatId => 'Global chat ID'; + + @override + String get accessAndVisibility => 'Access and visibility'; + + @override + String get accessAndVisibilityDescription => + 'Who is allowed to join this chat and how the chat can be discovered.'; + + @override + String get calls => 'Calls'; + + @override + String get customEmojisAndStickers => 'Custom emojis and stickers'; + + @override + String get customEmojisAndStickersBody => + 'Add or share custom emojis or stickers which can be used in any chat.'; + + @override + String get emoteShortcode => 'Emote shortcode'; + + @override + String get emoteWarnNeedToPick => + 'You need to pick an emote shortcode and an image!'; + + @override + String get emptyChat => 'Empty chat'; + + @override + String get enableEmotesGlobally => 'Enable emote pack globally'; + + @override + String get enableEncryption => 'Enable encryption'; + + @override + String get enableEncryptionWarning => + 'You won\'t be able to disable the encryption anymore. Are you sure?'; + + @override + String get encrypted => 'Encrypted'; + + @override + String get encryption => 'Encryption'; + + @override + String get encryptionNotEnabled => 'Encryption is not enabled'; + + @override + String endedTheCall(String senderName) { + return '$senderName ended the call'; + } + + @override + String get enterAnEmailAddress => 'Enter an email address'; + + @override + String get homeserver => 'Homeserver'; + + @override + String get enterYourHomeserver => 'Enter your homeserver'; + + @override + String errorObtainingLocation(String error) { + return 'Error obtaining location: $error'; + } + + @override + String get everythingReady => 'Everything ready!'; + + @override + String get extremeOffensive => 'Extremely offensive'; + + @override + String get fileName => 'File name'; + + @override + String get fluffychat => 'Extera'; + + @override + String get fontSize => 'Font size'; + + @override + String get forward => 'Forward'; + + @override + String get fromJoining => 'From joining'; + + @override + String get fromTheInvitation => 'From the invitation'; + + @override + String get goToTheNewRoom => 'Go to the new room'; + + @override + String get group => 'Group'; + + @override + String get chatDescription => 'Chat description'; + + @override + String get chatDescriptionHasBeenChanged => 'Chat description changed'; + + @override + String get groupIsPublic => 'Group is public'; + + @override + String get groups => 'Groups'; + + @override + String groupWith(String displayname) { + return 'Group with $displayname'; + } + + @override + String get guestsAreForbidden => 'Guests are forbidden'; + + @override + String get guestsCanJoin => 'Guests can join'; + + @override + String hasWithdrawnTheInvitationFor(String username, String targetName) { + return '$username has withdrawn the invitation for $targetName'; + } + + @override + String get help => 'Help'; + + @override + String get hideRedactedEvents => 'Hide redacted events'; + + @override + String get hideRedactedMessages => 'Hide redacted messages'; + + @override + String get hideRedactedMessagesBody => + 'If someone redacts a message, this message won\'t be visible in the chat anymore.'; + + @override + String get hideInvalidOrUnknownMessageFormats => + 'Hide invalid or unknown message formats'; + + @override + String get howOffensiveIsThisContent => 'How offensive is this content?'; + + @override + String get id => 'ID'; + + @override + String get identity => 'Identity'; + + @override + String get block => 'Block'; + + @override + String get blockedUsers => 'Blocked users'; + + @override + String get blockListDescription => + 'You can block users who are disturbing you. You won\'t be able to receive any messages or room invites from the users on your personal block list.'; + + @override + String get blockUsername => 'Ignore username'; + + @override + String get iHaveClickedOnLink => 'I have clicked on the link'; + + @override + String get incorrectPassphraseOrKey => 'Incorrect passphrase or recovery key'; + + @override + String get inoffensive => 'Inoffensive'; + + @override + String get inviteContact => 'Invite contact'; + + @override + String inviteContactToGroupQuestion(Object contact, Object groupName) { + return 'Do you want to invite $contact to the chat \"$groupName\"?'; + } + + @override + String inviteContactToGroup(String groupName) { + return 'Invite contact to $groupName'; + } + + @override + String get noChatDescriptionYet => 'No chat description created yet.'; + + @override + String get tryAgain => 'Try again'; + + @override + String get invalidServerName => 'Invalid server name'; + + @override + String get invited => 'Invited'; + + @override + String get redactMessageDescription => + 'The message will be redacted for all participants in this conversation. This cannot be undone.'; + + @override + String get optionalRedactReason => + '(Optional) Reason for redacting this message...'; + + @override + String invitedUser(String username, String targetName) { + return '📩 $username invited $targetName'; + } + + @override + String get invitedUsersOnly => 'Invited users only'; + + @override + String get inviteForMe => 'Invite for me'; + + @override + String inviteText(String username, String link) { + return '$username invited you to Extera.\n1. Visit fluffychat.im and install the app \n2. Sign up or sign in \n3. Open the invite link: \n $link'; + } + + @override + String get isTyping => 'is typing…'; + + @override + String joinedTheChat(String username) { + return '👋 $username joined the chat'; + } + + @override + String get joinRoom => 'Join room'; + + @override + String kicked(String username, String targetName) { + return '👞 $username kicked $targetName'; + } + + @override + String kickedAndBanned(String username, String targetName) { + return '🙅 $username kicked and banned $targetName'; + } + + @override + String get kickFromChat => 'Kick from chat'; + + @override + String lastActiveAgo(String localizedTimeShort) { + return 'Last active: $localizedTimeShort'; + } + + @override + String get leave => 'Leave'; + + @override + String get leftTheChat => 'Left the chat'; + + @override + String get license => 'License'; + + @override + String get lightTheme => 'Light'; + + @override + String loadCountMoreParticipants(int count) { + return 'Load $count more participants'; + } + + @override + String get dehydrate => 'Export session and wipe device'; + + @override + String get dehydrateWarning => + 'This action cannot be undone. Ensure you safely store the backup file.'; + + @override + String get dehydrateTor => 'TOR Users: Export session'; + + @override + String get dehydrateTorLong => + 'For TOR users, it is recommended to export the session before closing the window.'; + + @override + String get hydrateTor => 'TOR Users: Import session export'; + + @override + String get hydrateTorLong => + 'Did you export your session last time on TOR? Quickly import it and continue chatting.'; + + @override + String get hydrate => 'Restore from backup file'; + + @override + String get loadingPleaseWait => 'Loading… Please wait.'; + + @override + String get loadMore => 'Load more…'; + + @override + String get locationDisabledNotice => + 'Location services are disabled. Please enable them to be able to share your location.'; + + @override + String get locationPermissionDeniedNotice => + 'Location permission denied. Please grant them to be able to share your location.'; + + @override + String get login => 'Login'; + + @override + String logInTo(String homeserver) { + return 'Log in to $homeserver'; + } + + @override + String get logout => 'Logout'; + + @override + String get memberChanges => 'Member changes'; + + @override + String get mention => 'Mention'; + + @override + String get messages => 'Messages'; + + @override + String get messagesStyle => 'Messages:'; + + @override + String get moderator => 'Moderator'; + + @override + String get muteChat => 'Mute chat'; + + @override + String get needPantalaimonWarning => + 'Please be aware that you need Pantalaimon to use end-to-end encryption for now.'; + + @override + String get newChat => 'New chat'; + + @override + String get newMessageInFluffyChat => '💬 New message in Extera'; + + @override + String get newVerificationRequest => 'New verification request!'; + + @override + String get next => 'Next'; + + @override + String get no => 'No'; + + @override + String get noConnectionToTheServer => 'No connection to the server'; + + @override + String get noEmotesFound => 'No emotes found. 😕'; + + @override + String get noEncryptionForPublicRooms => + 'You can only activate encryption as soon as the room is no longer publicly accessible.'; + + @override + String get noGoogleServicesWarning => + 'Firebase Cloud Messaging doesn\'t appear to be available on your device. To still receive push notifications, we recommend installing ntfy. With ntfy or another Unified Push provider you can receive push notifications in a data secure way. You can download ntfy from the PlayStore or from F-Droid.'; + + @override + String noMatrixServer(String server1, String server2) { + return '$server1 is no matrix server, use $server2 instead?'; + } + + @override + String get shareInviteLink => 'Share invite link'; + + @override + String get scanQrCode => 'Scan QR code'; + + @override + String get none => 'None'; + + @override + String get noPasswordRecoveryDescription => + 'You have not added a way to recover your password yet.'; + + @override + String get noPermission => 'No permission'; + + @override + String get noRoomsFound => 'No rooms found…'; + + @override + String get notifications => 'Notifications'; + + @override + String get notificationsEnabledForThisAccount => + 'Notifications enabled for this account'; + + @override + String numUsersTyping(int count) { + return '$count users are typing…'; + } + + @override + String get obtainingLocation => 'Obtaining location…'; + + @override + String get offensive => 'Offensive'; + + @override + String get offline => 'Offline'; + + @override + String get ok => 'Ok'; + + @override + String get online => 'Online'; + + @override + String get onlineKeyBackupEnabled => 'Online Key Backup is enabled'; + + @override + String get oopsPushError => + 'Oops! Unfortunately, an error occurred when setting up the push notifications.'; + + @override + String get oopsSomethingWentWrong => 'Oops, something went wrong…'; + + @override + String get openAppToReadMessages => 'Open app to read messages'; + + @override + String get openCamera => 'Open camera'; + + @override + String get openVideoCamera => 'Open camera for a video'; + + @override + String get oneClientLoggedOut => 'One of your clients has been logged out'; + + @override + String get addAccount => 'Add account'; + + @override + String get editBundlesForAccount => 'Edit bundles for this account'; + + @override + String get addToBundle => 'Add to bundle'; + + @override + String get removeFromBundle => 'Remove from this bundle'; + + @override + String get bundleName => 'Bundle name'; + + @override + String get enableMultiAccounts => + '(BETA) Enable multi accounts on this device'; + + @override + String get openInMaps => 'Open in maps'; + + @override + String get link => 'Link'; + + @override + String get serverRequiresEmail => + 'This server needs to validate your email address for registration.'; + + @override + String get or => 'Or'; + + @override + String get participant => 'Participant'; + + @override + String get passphraseOrKey => 'passphrase or recovery key'; + + @override + String get password => 'Password'; + + @override + String get passwordForgotten => 'Password forgotten'; + + @override + String get passwordHasBeenChanged => 'Password has been changed'; + + @override + String get hideMemberChangesInPublicChats => + 'Hide member changes in public chats'; + + @override + String get hideMemberChangesInPublicChatsBody => + 'Do not show in the chat timeline if someone joins or leaves a public chat to improve readability.'; + + @override + String get overview => 'Overview'; + + @override + String get notifyMeFor => 'Notify me for'; + + @override + String get passwordRecoverySettings => 'Password recovery settings'; + + @override + String get passwordRecovery => 'Password recovery'; + + @override + String get people => 'People'; + + @override + String get pickImage => 'Pick an image'; + + @override + String get pin => 'Pin'; + + @override + String play(String fileName) { + return 'Play $fileName'; + } + + @override + String get pleaseChoose => 'Please choose'; + + @override + String get pleaseChooseAPasscode => 'Please choose a pass code'; + + @override + String get pleaseClickOnLink => + 'Please click on the link in the email and then proceed.'; + + @override + String get pleaseEnter4Digits => + 'Please enter 4 digits or leave empty to disable app lock.'; + + @override + String get pleaseEnterRecoveryKey => 'Please enter your recovery key:'; + + @override + String get pleaseEnterYourPassword => 'Please enter your password'; + + @override + String get pleaseEnterYourPin => 'Please enter your pin'; + + @override + String get pleaseEnterYourUsername => 'Please enter your username'; + + @override + String get pleaseFollowInstructionsOnWeb => + 'Please follow the instructions on the website and tap on next.'; + + @override + String get privacy => 'Privacy'; + + @override + String get publicRooms => 'Public Rooms'; + + @override + String get pushRules => 'Push rules'; + + @override + String get reason => 'Reason'; + + @override + String get recording => 'Recording'; + + @override + String redactedBy(String username) { + return 'Redacted by $username'; + } + + @override + String get directChat => 'Direct chat'; + + @override + String redactedByBecause(String username, String reason) { + return 'Redacted by $username because: \"$reason\"'; + } + + @override + String redactedAnEvent(String username) { + return '$username redacted an event'; + } + + @override + String get redactMessage => 'Redact message'; + + @override + String get register => 'Register'; + + @override + String get reject => 'Reject'; + + @override + String rejectedTheInvitation(String username) { + return '$username rejected the invitation'; + } + + @override + String get rejoin => 'Rejoin'; + + @override + String get removeAllOtherDevices => 'Remove all other devices'; + + @override + String removedBy(String username) { + return 'Removed by $username'; + } + + @override + String get removeDevice => 'Remove device'; + + @override + String get unbanFromChat => 'Unban from chat'; + + @override + String get removeYourAvatar => 'Remove your avatar'; + + @override + String get replaceRoomWithNewerVersion => 'Replace room with newer version'; + + @override + String get reply => 'Reply'; + + @override + String get reportMessage => 'Report message'; + + @override + String get translateMessage => 'Translate message'; + + @override + String get translatedMessage => 'Translated message'; + + @override + String get errorTranslatingMessage => + 'An error has occured while translating the message.'; + + @override + String get recoverMessage => 'Recover message'; + + @override + String get recoveredMessage => 'Recovered message'; + + @override + String get errorRecoveringMessage => + 'An error has occured while recovering the message.'; + + @override + String get errorRecoveringMessageNoAdmin => + 'This feature is available on Synapse homeservers only for adminstrators.'; + + @override + String get requestPermission => 'Request permission'; + + @override + String get roomHasBeenUpgraded => 'Room has been upgraded'; + + @override + String get roomVersion => 'Room version'; + + @override + String get saveFile => 'Save file'; + + @override + String get retry => 'Retry'; + + @override + String get search => 'Search'; + + @override + String get security => 'Security'; + + @override + String get recoveryKey => 'Recovery key'; + + @override + String get recoveryKeyLost => 'Recovery key lost?'; + + @override + String seenByUser(String username) { + return 'Seen by $username'; + } + + @override + String get send => 'Send'; + + @override + String get sendAMessage => 'Send a message'; + + @override + String get sendAsText => 'Send as text'; + + @override + String get sendAudio => 'Send audio'; + + @override + String get sendFile => 'Send file'; + + @override + String get sendImage => 'Send image'; + + @override + String sendImages(int count) { + return 'Send $count image'; + } + + @override + String get sendMessages => 'Send messages'; + + @override + String get sendOriginal => 'Send original'; + + @override + String get sendSticker => 'Send sticker'; + + @override + String get sendVideo => 'Send video'; + + @override + String sentAFile(String username) { + return '📁 $username sent a file'; + } + + @override + String sentAnAudio(String username) { + return '🎤 $username sent an audio'; + } + + @override + String sentAPicture(String username) { + return '🖼️ $username sent a picture'; + } + + @override + String sentASticker(String username) { + return '😊 $username sent a sticker'; + } + + @override + String sentAVideo(String username) { + return '🎥 $username sent a video'; + } + + @override + String sentCallInformations(String senderName) { + return '$senderName sent call information'; + } + + @override + String get separateChatTypes => 'Separate Direct Chats and Groups'; + + @override + String get setAsCanonicalAlias => 'Set as main alias'; + + @override + String get setCustomEmotes => 'Set custom emotes'; + + @override + String get setChatDescription => 'Set chat description'; + + @override + String get setInvitationLink => 'Set invitation link'; + + @override + String get setPermissionsLevel => 'Set permissions level'; + + @override + String get setStatus => 'Set status'; + + @override + String get settings => 'Settings'; + + @override + String get share => 'Share'; + + @override + String sharedTheLocation(String username) { + return '$username shared their location'; + } + + @override + String get shareLocation => 'Share location'; + + @override + String get showPassword => 'Show password'; + + @override + String get presenceStyle => 'Presence:'; + + @override + String get hideAvatarsInInvites => 'Hide avatars in invites'; + + @override + String get hideAvatarsInInvitesDescription => + 'Do not show room avatars in invites'; + + @override + String get presencesToggle => 'Show status messages from other users'; + + @override + String get pureBlackToggle => 'Pure Black'; + + @override + String get singlesignon => 'Single Sign on'; + + @override + String get skip => 'Skip'; + + @override + String get sourceCode => 'Source code'; + + @override + String get spaceIsPublic => 'Space is public'; + + @override + String get spaceName => 'Space name'; + + @override + String startedACall(String senderName) { + return '$senderName started a call'; + } + + @override + String get startFirstChat => 'Start your first chat'; + + @override + String get status => 'Status'; + + @override + String get statusExampleMessage => 'How are you today?'; + + @override + String get submit => 'Submit'; + + @override + String get synchronizingPleaseWait => 'Synchronizing… Please wait.'; + + @override + String synchronizingPleaseWaitCounter(String percentage) { + return ' Synchronizing… ($percentage%)'; + } + + @override + String get systemTheme => 'System'; + + @override + String get theyDontMatch => 'They Don\'t Match'; + + @override + String get theyMatch => 'They Match'; + + @override + String get title => 'Extera'; + + @override + String get toggleFavorite => 'Toggle Favorite'; + + @override + String get toggleMuted => 'Toggle Muted'; + + @override + String get toggleUnread => 'Mark Read/Unread'; + + @override + String get tooManyRequestsWarning => + 'Too many requests. Please try again later!'; + + @override + String get transferFromAnotherDevice => 'Transfer from another device'; + + @override + String get tryToSendAgain => 'Try to send again'; + + @override + String get unavailable => 'Unavailable'; + + @override + String unbannedUser(String username, String targetName) { + return '$username unbanned $targetName'; + } + + @override + String get unblockDevice => 'Unblock Device'; + + @override + String get unknownDevice => 'Unknown device'; + + @override + String get unknownEncryptionAlgorithm => 'Unknown encryption algorithm'; + + @override + String unknownEvent(String type) { + return 'Unknown event \'$type\''; + } + + @override + String get unmuteChat => 'Unmute chat'; + + @override + String get unpin => 'Unpin'; + + @override + String unreadChats(int unreadCount) { + String _temp0 = intl.Intl.pluralLogic( + unreadCount, + locale: localeName, + other: '$unreadCount unread chats', + one: '1 unread chat', + ); + return '$_temp0'; + } + + @override + String userAndOthersAreTyping(String username, int count) { + return '$username and $count others are typing…'; + } + + @override + String userAndUserAreTyping(String username, String username2) { + return '$username and $username2 are typing…'; + } + + @override + String userIsTyping(String username) { + return '$username is typing…'; + } + + @override + String userLeftTheChat(String username) { + return '🚪 $username left the chat'; + } + + @override + String get username => 'Username'; + + @override + String userSentUnknownEvent(String username, String type) { + return '$username sent a $type event'; + } + + @override + String get unverified => 'Unverified'; + + @override + String get verified => 'Verified'; + + @override + String get verify => 'Verify'; + + @override + String get verifyStart => 'Start Verification'; + + @override + String get verifySuccess => 'You successfully verified!'; + + @override + String get verifyTitle => 'Verifying other account'; + + @override + String get videoCall => 'Video call'; + + @override + String get visibilityOfTheChatHistory => 'Visibility of the chat history'; + + @override + String get visibleForAllParticipants => 'Visible for all participants'; + + @override + String get visibleForEveryone => 'Visible for everyone'; + + @override + String get voiceMessage => 'Voice message'; + + @override + String get waitingPartnerAcceptRequest => + 'Waiting for partner to accept the request…'; + + @override + String get waitingPartnerEmoji => 'Waiting for partner to accept the emoji…'; + + @override + String get waitingPartnerNumbers => + 'Waiting for partner to accept the numbers…'; + + @override + String get wallpaper => 'Wallpaper:'; + + @override + String get warning => 'Warning!'; + + @override + String get weSentYouAnEmail => 'We sent you an email'; + + @override + String get whoCanPerformWhichAction => 'Who can perform which action'; + + @override + String get whoIsAllowedToJoinThisGroup => 'Who is allowed to join this group'; + + @override + String get whyDoYouWantToReportThis => 'Why do you want to report this?'; + + @override + String get wipeChatBackup => + 'Wipe your chat backup to create a new recovery key?'; + + @override + String get withTheseAddressesRecoveryDescription => + 'With these addresses you can recover your password.'; + + @override + String get writeAMessage => 'Write a message…'; + + @override + String get yes => 'Yes'; + + @override + String get you => 'You'; + + @override + String get youAreNoLongerParticipatingInThisChat => + 'You are no longer participating in this chat'; + + @override + String get youHaveBeenBannedFromThisChat => + 'You have been banned from this chat'; + + @override + String get yourPublicKey => 'Your public key'; + + @override + String get messageInfo => 'Message info'; + + @override + String get time => 'Time'; + + @override + String get messageType => 'Message Type'; + + @override + String get sender => 'Sender'; + + @override + String get openGallery => 'Open gallery'; + + @override + String get removeFromSpace => 'Remove from space'; + + @override + String get addToSpaceDescription => 'Select a space to add this chat to it.'; + + @override + String get start => 'Start'; + + @override + String get pleaseEnterRecoveryKeyDescription => + 'To unlock your old messages, please enter your recovery key that has been generated in a previous session. Your recovery key is NOT your password.'; + + @override + String get publish => 'Publish'; + + @override + String videoWithSize(String size) { + return 'Video ($size)'; + } + + @override + String get openChat => 'Open Chat'; + + @override + String get markAsRead => 'Mark as read'; + + @override + String get reportUser => 'Report user'; + + @override + String get dismiss => 'Dismiss'; + + @override + String reactedWith(String sender, String reaction) { + return '$sender reacted with $reaction'; + } + + @override + String get pinMessage => 'Pin to room'; + + @override + String get confirmEventUnpin => + 'Are you sure to permanently unpin the event?'; + + @override + String get emojis => 'Emojis'; + + @override + String get placeCall => 'Place call'; + + @override + String get voiceCall => 'Voice call'; + + @override + String get unsupportedAndroidVersion => 'Unsupported Android version'; + + @override + String get unsupportedAndroidVersionLong => + 'This feature requires a newer Android version. Please check for updates or Lineage OS support.'; + + @override + String get videoCallsBetaWarning => + 'Please note that video calls are currently in beta. They might not work as expected or work at all on all platforms.'; + + @override + String get experimentalVideoCalls => 'Experimental video calls'; + + @override + String get emailOrUsername => 'Email or username'; + + @override + String get indexedDbErrorTitle => 'Private mode issues'; + + @override + String get indexedDbErrorLong => + 'The message storage is unfortunately not enabled in private mode by default.\nPlease visit\n - about:config\n - set dom.indexedDB.privateBrowsing.enabled to true\nOtherwise, it is not possible to run Extera.'; + + @override + String switchToAccount(String number) { + return 'Switch to account $number'; + } + + @override + String get nextAccount => 'Next account'; + + @override + String get previousAccount => 'Previous account'; + + @override + String get addWidget => 'Add widget'; + + @override + String get widgetVideo => 'Video'; + + @override + String get widgetEtherpad => 'Text note'; + + @override + String get widgetJitsi => 'Jitsi Meet'; + + @override + String get widgetCustom => 'Custom'; + + @override + String get widgetName => 'Name'; + + @override + String get widgetUrlError => 'This is not a valid URL.'; + + @override + String get widgetNameError => 'Please provide a display name.'; + + @override + String get errorAddingWidget => 'Error adding the widget.'; + + @override + String get youRejectedTheInvitation => 'You rejected the invitation'; + + @override + String get youJoinedTheChat => 'You joined the chat'; + + @override + String get youAcceptedTheInvitation => '👍 You accepted the invitation'; + + @override + String youBannedUser(String user) { + return 'You banned $user'; + } + + @override + String youHaveWithdrawnTheInvitationFor(String user) { + return 'You have withdrawn the invitation for $user'; + } + + @override + String youInvitedToBy(String alias) { + return '📩 You have been invited via link to:\n$alias'; + } + + @override + String youInvitedBy(String user) { + return '📩 You have been invited by $user'; + } + + @override + String invitedBy(String user) { + return '📩 Invited by $user'; + } + + @override + String youInvitedUser(String user) { + return '📩 You invited $user'; + } + + @override + String youKicked(String user) { + return '👞 You kicked $user'; + } + + @override + String youKickedAndBanned(String user) { + return '🙅 You kicked and banned $user'; + } + + @override + String youUnbannedUser(String user) { + return 'You unbanned $user'; + } + + @override + String hasKnocked(String user) { + return '🚪 $user has knocked'; + } + + @override + String get usersMustKnock => 'Users must knock'; + + @override + String get noOneCanJoin => 'No one can join'; + + @override + String userWouldLikeToChangeTheChat(String user) { + return '$user would like to join the chat.'; + } + + @override + String get noPublicLinkHasBeenCreatedYet => + 'No public link has been created yet'; + + @override + String get knock => 'Knock'; + + @override + String get users => 'Users'; + + @override + String get unlockOldMessages => 'Unlock old messages'; + + @override + String get storeInSecureStorageDescription => + 'Store the recovery key in the secure storage of this device.'; + + @override + String get saveKeyManuallyDescription => + 'Save this key manually by triggering the system share dialog or clipboard.'; + + @override + String get storeInAndroidKeystore => 'Store in Android KeyStore'; + + @override + String get storeInAppleKeyChain => 'Store in Apple KeyChain'; + + @override + String get storeSecurlyOnThisDevice => 'Store securely on this device'; + + @override + String countFiles(int count) { + return '$count files'; + } + + @override + String get user => 'User'; + + @override + String get custom => 'Custom'; + + @override + String get foregroundServiceRunning => + 'This notification appears when the foreground service is running.'; + + @override + String get screenSharingTitle => 'screen sharing'; + + @override + String get screenSharingDetail => 'You are sharing your screen in Extera'; + + @override + String get callingPermissions => 'Calling permissions'; + + @override + String get callingAccount => 'Calling account'; + + @override + String get callingAccountDetails => + 'Allows Extera to use the native android dialer app.'; + + @override + String get appearOnTop => 'Appear on top'; + + @override + String get appearOnTopDetails => + 'Allows the app to appear on top (not needed if you already have Fluffychat setup as a calling account)'; + + @override + String get otherCallingPermissions => + 'Microphone, camera and other Extera permissions'; + + @override + String get whyIsThisMessageEncrypted => 'Why is this message unreadable?'; + + @override + String get noKeyForThisMessage => + 'This can happen if the message was sent before you have signed in to your account at this device.\n\nIt is also possible that the sender has blocked your device or something went wrong with the internet connection.\n\nAre you able to read the message on another session? Then you can transfer the message from it! Go to Settings > Devices and make sure that your devices have verified each other. When you open the room the next time and both sessions are in the foreground, the keys will be transmitted automatically.\n\nDo you not want to lose the keys when logging out or switching devices? Make sure that you have enabled the chat backup in the settings.'; + + @override + String get newGroup => 'New group'; + + @override + String get newSpace => 'New space'; + + @override + String get enterSpace => 'Enter space'; + + @override + String get enterRoom => 'Enter room'; + + @override + String get allSpaces => 'All spaces'; + + @override + String numChats(String number) { + return '$number chats'; + } + + @override + String get hideUnimportantStateEvents => 'Hide unimportant state events'; + + @override + String get hidePresences => 'Hide Status List?'; + + @override + String get doNotShowAgain => 'Do not show again'; + + @override + String wasDirectChatDisplayName(String oldDisplayName) { + return 'Empty chat (was $oldDisplayName)'; + } + + @override + String get newSpaceDescription => + 'Spaces allows you to consolidate your chats and build private or public communities.'; + + @override + String get encryptThisChat => 'Encrypt this chat'; + + @override + String get disableEncryptionWarning => + 'For security reasons you can not disable encryption in a chat, where it has been enabled before.'; + + @override + String get sorryThatsNotPossible => 'Sorry... that is not possible'; + + @override + String get deviceKeys => 'Device keys:'; + + @override + String get reopenChat => 'Reopen chat'; + + @override + String get noBackupWarning => + 'Warning! Without enabling chat backup, you will lose access to your encrypted messages. It is highly recommended to enable the chat backup first before logging out.'; + + @override + String get noOtherDevicesFound => 'No other devices found'; + + @override + String fileIsTooBigForServer(String max) { + return 'Unable to send! The server only supports attachments up to $max.'; + } + + @override + String fileHasBeenSavedAt(String path) { + return 'File has been saved at $path'; + } + + @override + String get jumpToLastReadMessage => 'Jump to last read message'; + + @override + String get readUpToHere => 'Read up to here'; + + @override + String get jump => 'Jump'; + + @override + String get openLinkInBrowser => 'Open link in browser'; + + @override + String get reportErrorDescription => + '😭 Oh no. Something went wrong. If you want, you can report this bug to the developers.'; + + @override + String get report => 'Report'; + + @override + String get signInWithPassword => 'Sign in with password'; + + @override + String get pleaseTryAgainLaterOrChooseDifferentServer => + 'Please try again later or choose a different server.'; + + @override + String signInWith(String provider) { + return 'Sign in with $provider'; + } + + @override + String get profileNotFound => + 'The user could not be found on the server. Maybe there is a connection problem or the user doesn\'t exist.'; + + @override + String get setTheme => 'Set theme:'; + + @override + String get setColorTheme => 'Set color theme:'; + + @override + String get invite => 'Invite'; + + @override + String get inviteGroupChat => '📨 Invite group chat'; + + @override + String get invitePrivateChat => '📨 Invite private chat'; + + @override + String get invalidInput => 'Invalid input!'; + + @override + String wrongPinEntered(int seconds) { + return 'Wrong pin entered! Try again in $seconds seconds...'; + } + + @override + String get pleaseEnterANumber => 'Please enter a number greater than 0'; + + @override + String get archiveRoomDescription => + 'The chat will be moved to the archive. Other users will be able to see that you have left the chat.'; + + @override + String get roomUpgradeDescription => + 'The chat will then be recreated with the new room version. All participants will be notified that they need to switch to the new chat. You can find out more about room versions at https://spec.matrix.org/latest/rooms/'; + + @override + String get removeDevicesDescription => + 'You will be logged out of this device and will no longer be able to receive messages.'; + + @override + String get banUserDescription => + 'The user will be banned from the chat and will not be able to enter the chat again until they are unbanned.'; + + @override + String get unbanUserDescription => + 'The user will be able to enter the chat again if they try.'; + + @override + String get kickUserDescription => + 'The user is kicked out of the chat but not banned. In public chats, the user can rejoin at any time.'; + + @override + String get makeAdminDescription => + 'Once you make this user admin, you may not be able to undo this as they will then have the same permissions as you.'; + + @override + String get pushNotificationsNotAvailable => + 'Push notifications not available'; + + @override + String get learnMore => 'Learn more'; + + @override + String get yourGlobalUserIdIs => 'Your global user-ID is: '; + + @override + String noUsersFoundWithQuery(String query) { + return 'Unfortunately no user could be found with \"$query\". Please check whether you made a typo.'; + } + + @override + String get knocking => 'Knocking'; + + @override + String chatCanBeDiscoveredViaSearchOnServer(String server) { + return 'Chat can be discovered via the search on $server'; + } + + @override + String get searchChatsRooms => 'Search for #chats, @users...'; + + @override + String get nothingFound => 'Nothing found...'; + + @override + String get groupName => 'Group name'; + + @override + String get createGroupAndInviteUsers => 'Create a group and invite users'; + + @override + String get groupCanBeFoundViaSearch => 'Group can be found via search'; + + @override + String get wrongRecoveryKey => + 'Sorry... this does not seem to be the correct recovery key.'; + + @override + String get startConversation => 'Start conversation'; + + @override + String get commandHint_sendraw => 'Send raw json'; + + @override + String get databaseMigrationTitle => 'Database is optimized'; + + @override + String get databaseMigrationBody => 'Please wait. This may take a moment.'; + + @override + String get leaveEmptyToClearStatus => 'Leave empty to clear your status.'; + + @override + String get select => 'Select'; + + @override + String get searchForUsers => 'Search for @users...'; + + @override + String get pleaseEnterYourCurrentPassword => + 'Please enter your current password'; + + @override + String get newPassword => 'New password'; + + @override + String get pleaseChooseAStrongPassword => 'Please choose a strong password'; + + @override + String get passwordsDoNotMatch => 'Passwords do not match'; + + @override + String get passwordIsWrong => 'Your entered password is wrong'; + + @override + String get publicLink => 'Public link'; + + @override + String get publicChatAddresses => 'Public chat addresses'; + + @override + String get createNewAddress => 'Create new address'; + + @override + String get joinSpace => 'Join space'; + + @override + String get publicSpaces => 'Public spaces'; + + @override + String get addChatOrSubSpace => 'Add chat or sub space'; + + @override + String get subspace => 'Subspace'; + + @override + String get decline => 'Decline'; + + @override + String get thisDevice => 'This device:'; + + @override + String get initAppError => 'An error occured while init the app'; + + @override + String get userRole => 'User role'; + + @override + String minimumPowerLevel(String level) { + return '$level is the minimum power level.'; + } + + @override + String searchIn(String chat) { + return 'Search in chat \"$chat\"...'; + } + + @override + String get searchMore => 'Search more...'; + + @override + String get gallery => 'Gallery'; + + @override + String get files => 'Files'; + + @override + String databaseBuildErrorBody(String url, String error) { + return 'Unable to build the SQlite database. The app tries to use the legacy database for now. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String sessionLostBody(String url, String error) { + return 'Your session is lost. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String restoreSessionBody(String url, String error) { + return 'The app now tries to restore your session from the backup. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String forwardMessageTo(String roomName) { + return 'Forward message to $roomName?'; + } + + @override + String get sendReadReceipts => 'Send read receipts'; + + @override + String get sendTypingNotificationsDescription => + 'Other participants in a chat can see when you are typing a new message.'; + + @override + String get sendReadReceiptsDescription => + 'Other participants in a chat can see when you have read a message.'; + + @override + String get formattedMessages => 'Formatted messages'; + + @override + String get formattedMessagesDescription => + 'Display rich message content like bold text using markdown.'; + + @override + String get verifyOtherUser => '🔐 Verify other user'; + + @override + String get verifyOtherUserDescription => + 'If you verify another user, you can be sure that you know who you are really writing to. 💪\n\nWhen you start a verification, you and the other user will see a popup in the app. There you will then see a series of emojis or numbers that you have to compare with each other.\n\nThe best way to do this is to meet up or start a video call. 👭'; + + @override + String get verifyOtherDevice => '🔐 Verify other device'; + + @override + String get verifyOtherDeviceDescription => + 'When you verify another device, those devices can exchange keys, increasing your overall security. 💪 When you start a verification, a popup will appear in the app on both devices. There you will then see a series of emojis or numbers that you have to compare with each other. It\'s best to have both devices handy before you start the verification. 🤳'; + + @override + String acceptedKeyVerification(String sender) { + return '$sender accepted key verification'; + } + + @override + String canceledKeyVerification(String sender) { + return '$sender canceled key verification'; + } + + @override + String completedKeyVerification(String sender) { + return '$sender completed key verification'; + } + + @override + String isReadyForKeyVerification(String sender) { + return '$sender is ready for key verification'; + } + + @override + String requestedKeyVerification(String sender) { + return '$sender requested key verification'; + } + + @override + String startedKeyVerification(String sender) { + return '$sender started key verification'; + } + + @override + String get transparent => 'Transparent'; + + @override + String get incomingMessages => 'Incoming messages'; + + @override + String get stickers => 'Stickers'; + + @override + String get discover => 'Discover'; + + @override + String get commandHint_ignore => 'Ignore the given matrix ID'; + + @override + String get commandHint_unignore => 'Unignore the given matrix ID'; + + @override + String unreadChatsInApp(String appname, String unread) { + return '$appname: $unread unread chats'; + } + + @override + String get noDatabaseEncryption => + 'Database encryption is not supported on this platform'; + + @override + String thereAreCountUsersBlocked(Object count) { + return 'Right now there are $count users blocked.'; + } + + @override + String get restricted => 'Restricted'; + + @override + String get knockRestricted => 'Knock restricted'; + + @override + String goToSpace(Object space) { + return 'Go to space: $space'; + } + + @override + String get markAsUnread => 'Mark as unread'; + + @override + String userLevel(int level) { + return '$level - User'; + } + + @override + String moderatorLevel(int level) { + return '$level - Moderator'; + } + + @override + String adminLevel(int level) { + return '$level - Admin'; + } + + @override + String get changeGeneralChatSettings => 'Change general chat settings'; + + @override + String get inviteOtherUsers => 'Invite other users to this chat'; + + @override + String get changeTheChatPermissions => 'Change the chat permissions'; + + @override + String get changeTheVisibilityOfChatHistory => + 'Change the visibility of the chat history'; + + @override + String get changeTheCanonicalRoomAlias => + 'Change the main public chat address'; + + @override + String get sendRoomNotifications => 'Send a @room notifications'; + + @override + String get changeTheDescriptionOfTheGroup => + 'Change the description of the chat'; + + @override + String get chatPermissionsDescription => + 'Define which power level is necessary for certain actions in this chat. The power levels 0, 50 and 100 are usually representing users, moderators and admins, but any gradation is possible.'; + + @override + String updateInstalled(String version) { + return '🎉 Update $version installed!'; + } + + @override + String get changelog => 'Changelog'; + + @override + String get sendCanceled => 'Sending canceled'; + + @override + String get loginWithMatrixId => 'Login with Matrix-ID'; + + @override + String get discoverHomeservers => 'Discover homeservers'; + + @override + String get whatIsAHomeserver => 'What is a homeserver?'; + + @override + String get homeserverDescription => + 'All your data is stored on the homeserver, just like an email provider. You can choose which homeserver you want to use, while you can still communicate with everyone. Learn more at at https://matrix.org.'; + + @override + String get doesNotSeemToBeAValidHomeserver => + 'Doesn\'t seem to be a compatible homeserver. Wrong URL?'; + + @override + String get calculatingFileSize => 'Calculating file size...'; + + @override + String get prepareSendingAttachment => 'Prepare sending attachment...'; + + @override + String get sendingAttachment => 'Sending attachment...'; + + @override + String get generatingVideoThumbnail => 'Generating video thumbnail...'; + + @override + String get compressVideo => 'Compressing video...'; + + @override + String sendingAttachmentCountOfCount(int index, int length) { + return 'Sending attachment $index of $length...'; + } + + @override + String serverLimitReached(int seconds) { + return 'Server limit reached! Waiting $seconds seconds...'; + } + + @override + String get oneOfYourDevicesIsNotVerified => + 'One of your devices is not verified'; + + @override + String get noticeChatBackupDeviceVerification => + 'Note: When you connect all your devices to the chat backup, they are automatically verified.'; + + @override + String get continueText => 'Continue'; + + @override + String get welcomeText => + 'Hey Hey 👋 This is Extera. You can sign in to any homeserver, which is compatible with https://matrix.org. And then chat with anyone. It\'s a huge decentralized messaging network!'; + + @override + String get blur => 'Blur:'; + + @override + String get opacity => 'Opacity:'; + + @override + String get setWallpaper => 'Set wallpaper'; + + @override + String get manageAccount => 'Manage account'; + + @override + String get noContactInformationProvided => + 'Server does not provide any valid contact information'; + + @override + String get contactServerAdmin => 'Contact server admin'; + + @override + String get contactServerSecurity => 'Contact server security'; + + @override + String get supportPage => 'Support page'; + + @override + String get serverInformation => 'Server information:'; + + @override + String get name => 'Name'; + + @override + String get version => 'Version'; + + @override + String get website => 'Website'; + + @override + String get compress => 'Compress'; + + @override + String get boldText => 'Bold text'; + + @override + String get italicText => 'Italic text'; + + @override + String get strikeThrough => 'Strikethrough'; + + @override + String get pleaseFillOut => 'Please fill out'; + + @override + String get invalidUrl => 'Invalid url'; + + @override + String get addLink => 'Add link'; + + @override + String get unableToJoinChat => + 'Unable to join chat. Maybe the other party has already closed the conversation.'; + + @override + String get previous => 'Previous'; + + @override + String get otherPartyNotLoggedIn => + 'The other party is currently not logged in and therefore cannot receive messages!'; + + @override + String appWantsToUseForLogin(String server) { + return 'Use \'$server\' to log in'; + } + + @override + String get appWantsToUseForLoginDescription => + 'You hereby allow the app and website to share information about you.'; + + @override + String get open => 'Open'; + + @override + String get waitingForServer => 'Waiting for server...'; + + @override + String get appIntroduction => + 'Extera lets you chat with your friends across different messengers. Learn more at https://matrix.org or just tap *Continue*.'; + + @override + String get newChatRequest => '📩 New chat request'; + + @override + String get contentNotificationSettings => 'Content notification settings'; + + @override + String get generalNotificationSettings => 'General notification settings'; + + @override + String get roomNotificationSettings => 'Room notification settings'; + + @override + String get userSpecificNotificationSettings => + 'User specific notification settings'; + + @override + String get otherNotificationSettings => 'Other notification settings'; + + @override + String get notificationRuleContainsUserName => 'Contains User Name'; + + @override + String get notificationRuleContainsUserNameDescription => + 'Notifies the user when a message contains their username.'; + + @override + String get notificationRuleMaster => 'Mute all notifications'; + + @override + String get notificationRuleMasterDescription => + 'Overrides all other rules and disables all notifications.'; + + @override + String get notificationRuleSuppressNotices => 'Suppress Automated Messages'; + + @override + String get notificationRuleSuppressNoticesDescription => + 'Suppresses notifications from automated clients like bots.'; + + @override + String get notificationRuleInviteForMe => 'Invite for Me'; + + @override + String get notificationRuleInviteForMeDescription => + 'Notifies the user when they are invited to a room.'; + + @override + String get notificationRuleMemberEvent => 'Member Event'; + + @override + String get notificationRuleMemberEventDescription => + 'Suppresses notifications for membership events.'; + + @override + String get notificationRuleIsUserMention => 'User Mention'; + + @override + String get notificationRuleIsUserMentionDescription => + 'Notifies the user when they are directly mentioned in a message.'; + + @override + String get notificationRuleContainsDisplayName => 'Contains Display Name'; + + @override + String get notificationRuleContainsDisplayNameDescription => + 'Notifies the user when a message contains their display name.'; + + @override + String get notificationRuleIsRoomMention => 'Room Mention'; + + @override + String get notificationRuleIsRoomMentionDescription => + 'Notifies the user when there is a room mention.'; + + @override + String get notificationRuleRoomnotif => 'Room Notification'; + + @override + String get notificationRuleRoomnotifDescription => + 'Notifies the user when a message contains \'@room\'.'; + + @override + String get notificationRuleTombstone => 'Tombstone'; + + @override + String get notificationRuleTombstoneDescription => + 'Notifies the user about room deactivation messages.'; + + @override + String get notificationRuleReaction => 'Reaction'; + + @override + String get notificationRuleReactionDescription => + 'Suppresses notifications for reactions.'; + + @override + String get notificationRuleRoomServerAcl => 'Room Server ACL'; + + @override + String get notificationRuleRoomServerAclDescription => + 'Suppresses notifications for room server access control lists (ACL).'; + + @override + String get notificationRuleSuppressEdits => 'Suppress Edits'; + + @override + String get notificationRuleSuppressEditsDescription => + 'Suppresses notifications for edited messages.'; + + @override + String get notificationRuleCall => 'Call'; + + @override + String get notificationRuleCallDescription => + 'Notifies the user about calls.'; + + @override + String get notificationRuleEncryptedRoomOneToOne => + 'Encrypted Room One-to-One'; + + @override + String get notificationRuleEncryptedRoomOneToOneDescription => + 'Notifies the user about messages in encrypted one-to-one rooms.'; + + @override + String get notificationRuleRoomOneToOne => 'Room One-to-One'; + + @override + String get notificationRuleRoomOneToOneDescription => + 'Notifies the user about messages in one-to-one rooms.'; + + @override + String get notificationRuleMessage => 'Message'; + + @override + String get notificationRuleMessageDescription => + 'Notifies the user about general messages.'; + + @override + String get notificationRuleEncrypted => 'Encrypted'; + + @override + String get notificationRuleEncryptedDescription => + 'Notifies the user about messages in encrypted rooms.'; + + @override + String get notificationRuleJitsi => 'Jitsi'; + + @override + String get notificationRuleJitsiDescription => + 'Notifies the user about Jitsi widget events.'; + + @override + String get notificationRuleServerAcl => 'Suppress Server ACL Events'; + + @override + String get notificationRuleServerAclDescription => + 'Suppresses notifications for Server ACL events.'; + + @override + String unknownPushRule(String rule) { + return 'Unknown push rule \'$rule\''; + } + + @override + String get deletePushRuleCanNotBeUndone => + 'If you delete this notification setting, this can not be undone.'; + + @override + String get more => 'More'; + + @override + String get shareKeysWith => 'Share keys with...'; + + @override + String get shareKeysWithDescription => + 'Which devices should be trusted so that they can read along your messages in encrypted chats?'; + + @override + String get allDevices => 'All devices'; + + @override + String get crossVerifiedDevicesIfEnabled => + 'Cross verified devices if enabled'; + + @override + String get crossVerifiedDevices => 'Cross verified devices'; + + @override + String get verifiedDevicesOnly => 'Verified devices only'; + + @override + String get takeAPhoto => 'Take a photo'; + + @override + String get recordAVideo => 'Record a video'; + + @override + String get optionalMessage => '(Optional) message...'; + + @override + String get notSupportedOnThisDevice => 'Not supported on this device'; + + @override + String get enterNewChat => 'Enter new chat'; + + @override + String get approve => 'Approve'; + + @override + String get youHaveKnocked => 'You have knocked'; + + @override + String get pleaseWaitUntilInvited => + 'Please wait now, until someone from the room invites you.'; +} diff --git a/lib/generated/l10n/l10n_hr.dart b/lib/generated/l10n/l10n_hr.dart new file mode 100644 index 0000000..07d7a6a --- /dev/null +++ b/lib/generated/l10n/l10n_hr.dart @@ -0,0 +1,2754 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'l10n.dart'; + +// ignore_for_file: type=lint + +/// The translations for Croatian (`hr`). +class L10nHr extends L10n { + L10nHr([String locale = 'hr']) : super(locale); + + @override + String get noSendPermission => 'You can\'t send messages here'; + + @override + String get alwaysUse24HourFormat => 'true'; + + @override + String get repeatPassword => 'Ponovi lozinku'; + + @override + String get notAnImage => 'Nije slikovna datoteka.'; + + @override + String get setCustomPermissionLevel => 'Set custom permission level'; + + @override + String get setPermissionsLevelDescription => + 'Please choose a predefined role below or enter a custom permission level between 0 and 100.'; + + @override + String get ignoreUser => 'Ignore user'; + + @override + String get normalUser => 'Normal user'; + + @override + String get remove => 'Ukloni'; + + @override + String get importNow => 'Uvezi sada'; + + @override + String get importEmojis => 'Uvezi emoji slike'; + + @override + String get importFromZipFile => 'Uvezi iz .zip datoteke'; + + @override + String get exportEmotePack => 'Izvezi paket emotikona kao .zip'; + + @override + String get replace => 'Zamijeni'; + + @override + String get about => 'Informacije'; + + @override + String aboutHomeserver(String homeserver) { + return 'About $homeserver'; + } + + @override + String get accept => 'Prihvati'; + + @override + String acceptedTheInvitation(String username) { + return '👍 $username je prihvatio/la poziv'; + } + + @override + String get account => 'Račun'; + + @override + String activatedEndToEndEncryption(String username) { + return '🔐 $username je aktivirao/la obostrano šifriranje'; + } + + @override + String get addEmail => 'Dodaj e-mail'; + + @override + String get confirmMatrixId => + 'Za brisanje tvog računa potvrdi svoj Matrix ID.'; + + @override + String supposedMxid(String mxid) { + return 'Trebao bi biti $mxid'; + } + + @override + String get addChatDescription => 'Dodaj opis razgovora …'; + + @override + String get addToSpace => 'Dodaj u prostor'; + + @override + String get admin => 'Administrator'; + + @override + String get alias => 'pseudonim'; + + @override + String get all => 'Svi'; + + @override + String get allChats => 'Svi razgovori'; + + @override + String get commandHint_roomupgrade => + 'Upgrade this room to the given room version'; + + @override + String get commandHint_googly => 'Pošalji kotrljajuće oči'; + + @override + String get commandHint_cuddle => 'Pošalji maženje'; + + @override + String get commandHint_hug => 'Pošalji grljenje'; + + @override + String googlyEyesContent(String senderName) { + return '$senderName ti šalje kotrljajuće oči'; + } + + @override + String cuddleContent(String senderName) { + return '$senderName te mazi'; + } + + @override + String hugContent(String senderName) { + return '$senderName te grli'; + } + + @override + String answeredTheCall(String senderName) { + return '$senderName je odgovorio/la na poziv'; + } + + @override + String get anyoneCanJoin => 'Svatko se može pridružiti'; + + @override + String get appLock => 'Zaključavanje programa'; + + @override + String get appLockDescription => + 'Zaključaj aplikaciju kada je ne koristiš s PIN kodom'; + + @override + String get archive => 'Arhiv'; + + @override + String get areGuestsAllowedToJoin => 'Smiju li se gosti pridružiti'; + + @override + String get areYouSure => 'Stvarno to želiš?'; + + @override + String get areYouSureYouWantToLogout => 'Stvarno se želiš odjaviti?'; + + @override + String get askSSSSSign => + 'Za potpisivanje druge osobe, upiši svoju sigurnosnu lozinku ili ključ za oporavak.'; + + @override + String askVerificationRequest(String username) { + return 'Prihvatiti ovaj zahtjev za potvrđivanje od $username?'; + } + + @override + String get autoplayImages => + 'Automatski pokreni animirane naljepnice i emotikone'; + + @override + String badServerLoginTypesException(String serverVersions, + String supportedVersions, Object suportedVersions) { + return 'Domaći poslužitelj podržava vrste prijave:\n$serverVersions\nMeđutim ovaj program podržava samo:\n$supportedVersions'; + } + + @override + String get sendTypingNotifications => 'Pošalji pismene obavijesti'; + + @override + String get swipeRightToLeftToReply => + 'Za odgovaranje povuci prstom zdesna ulijevo'; + + @override + String get sendOnEnter => 'Pošalji pritiskom tipke enter'; + + @override + String badServerVersionsException(String serverVersions, + String supportedVersions, Object serverVerions, Object suportedVersions) { + return 'Domaći poslužitelj podržava verzije specifikacije:\n$serverVersions\nMeđutim ovaj program podržava samo $supportedVersions'; + } + + @override + String countChatsAndCountParticipants(int chats, int participants) { + return '$chats chats and $participants participants'; + } + + @override + String get noMoreChatsFound => 'No more chats found...'; + + @override + String get noChatsFoundHere => + 'No chats found here yet. Start a new chat with someone by using the button below. ⤵️'; + + @override + String get joinedChats => 'Joined chats'; + + @override + String get unread => 'Unread'; + + @override + String get space => 'Space'; + + @override + String get spaces => 'Spaces'; + + @override + String get banFromChat => 'Isključi iz razgovora'; + + @override + String get banned => 'Isključen'; + + @override + String bannedUser(String username, String targetName) { + return '$username je isključio/la $targetName'; + } + + @override + String get blockDevice => 'Blokiraj uređaj'; + + @override + String get blocked => 'Blokirano'; + + @override + String get botMessages => 'Poruke bota'; + + @override + String get cancel => 'Odustani'; + + @override + String cantOpenUri(String uri) { + return 'URI adresa $uri se ne može otvoriti'; + } + + @override + String get changeDeviceName => 'Promijeni ime uređaja'; + + @override + String changedTheChatAvatar(String username) { + return '$username je promijenio/la avatar razgovora'; + } + + @override + String changedTheChatDescriptionTo(String username, String description) { + return '$username je promijenio/la opis razgovora u: „$description”'; + } + + @override + String changedTheChatNameTo(String username, String chatname) { + return '$username je promijenio/la ime razgovora u: „$chatname”'; + } + + @override + String changedTheChatPermissions(String username) { + return '$username je promijenio/la dozvole razgovora'; + } + + @override + String changedTheDisplaynameTo(String username, String displayname) { + return '$username je promijenio/la ime u: „$displayname”'; + } + + @override + String changedTheGuestAccessRules(String username) { + return '$username je promijenio/la pravila pristupa za goste'; + } + + @override + String changedTheGuestAccessRulesTo(String username, String rules) { + return '$username je promijenio/la pravila pristupa za goste u: $rules'; + } + + @override + String changedTheHistoryVisibility(String username) { + return '$username je promijenio/la vidljivost kronologije'; + } + + @override + String changedTheHistoryVisibilityTo(String username, String rules) { + return '$username je promijenio/la vidljivost kronologije u: $rules'; + } + + @override + String changedTheJoinRules(String username) { + return '$username je promijenio/la pravila pridruživanja'; + } + + @override + String changedTheJoinRulesTo(String username, String joinRules) { + return '$username je promijenio/la pravila pridruživanja u: $joinRules'; + } + + @override + String changedTheProfileAvatar(String username) { + return '$username je promijenio/la svoj avatar'; + } + + @override + String changedTheRoomAliases(String username) { + return '$username je promijenio/la pseudonime soba'; + } + + @override + String changedTheRoomInvitationLink(String username) { + return '$username je promijenio/la poveznicu poziva'; + } + + @override + String get changePassword => 'Promijeni lozinku'; + + @override + String get changeTheHomeserver => 'Promijeni domaćeg poslužitelja'; + + @override + String get changeTheme => 'Promijeni tvoj stil'; + + @override + String get changeTheNameOfTheGroup => 'Promijeni ime grupe'; + + @override + String get changeYourAvatar => 'Promijeni svoj avatar'; + + @override + String get channelCorruptedDecryptError => 'Šifriranje je oštećeno'; + + @override + String get chat => 'Razgovor'; + + @override + String get yourChatBackupHasBeenSetUp => + 'Sigurnosna kopija tvog razgovora je postavljena.'; + + @override + String get chatBackup => 'Sigurnosna kopija razgovora'; + + @override + String get chatBackupDescription => + 'Tvoji su stari razgovori osigurani s ključem za obnavljanje. Pazi da ga ne izgubiš.'; + + @override + String get chatDetails => 'Detalji razgovora'; + + @override + String get chatHasBeenAddedToThisSpace => 'Razgovor je dodan u ovaj prostor'; + + @override + String get chats => 'Razgovori'; + + @override + String get chooseAStrongPassword => 'Odaberi snažnu lozinku'; + + @override + String get clearArchive => 'Isprazni arhiv'; + + @override + String get close => 'Zatvori'; + + @override + String get commandHint_markasdm => + 'Označi kao sobu za izravnu razmjenu poruka za zadani Matrix ID'; + + @override + String get commandHint_markasgroup => 'Označi kao grupu'; + + @override + String get commandHint_ban => 'Isključi navedenog korisnika iz ove sobe'; + + @override + String get commandHint_clearcache => 'Isprazni predmemoriju'; + + @override + String get commandHint_create => + 'Stvori prazan grupni razgovor\nKoristi --no-encryption za deaktiviranje šifriranja'; + + @override + String get commandHint_discardsession => 'Odbaci sesiju'; + + @override + String get commandHint_dm => + 'Započni izravni razgovor\nKoristi --no-encryption za deaktiviranje šifriranja'; + + @override + String get commandHint_html => 'Pošalji HTML formatirani tekst'; + + @override + String get commandHint_invite => 'Pozovi navedenog korisnika u ovu sobu'; + + @override + String get commandHint_join => 'Pridruži se navedenoj sobi'; + + @override + String get commandHint_kick => 'Ukloni navedenog korisnika iz ove sobe'; + + @override + String get commandHint_leave => 'Napusti ovu sobu'; + + @override + String get commandHint_me => 'Opiši se'; + + @override + String get commandHint_myroomavatar => + 'Postavi svoju sliku za ovu sobu (mxc-uri)'; + + @override + String get commandHint_myroomnick => 'Postavi svoje ime za ovu sobu'; + + @override + String get commandHint_op => + 'Postavi razinu prava navedenog korisnika (standardno: 50)'; + + @override + String get commandHint_plain => 'Pošalji neformatirani tekst'; + + @override + String get commandHint_react => 'Pošalji odgovor kao reakciju'; + + @override + String get commandHint_send => 'Pošalji tekst'; + + @override + String get commandHint_unban => + 'Ponovo uključi navedenog korisnika u ovu sobu'; + + @override + String get commandInvalid => 'Naredba nevaljana'; + + @override + String commandMissing(String command) { + return '$command nije naredba.'; + } + + @override + String get compareEmojiMatch => 'Usporedi emoji sličice'; + + @override + String get compareNumbersMatch => 'Usporedi brojeve'; + + @override + String get configureChat => 'Konfiguriraj razgovor'; + + @override + String get confirm => 'Potvrdi'; + + @override + String get connect => 'Spoji'; + + @override + String get contactHasBeenInvitedToTheGroup => 'Kontakt je pozvan u grupu'; + + @override + String get containsDisplayName => 'Sadržava prikazano ime'; + + @override + String get containsUserName => 'Sadrži korisničko ime'; + + @override + String get contentHasBeenReported => + 'Sadržaj je prijavljen administratorima poslužitelja'; + + @override + String get copiedToClipboard => 'Kopirano u međuspremnik'; + + @override + String get copy => 'Kopiraj'; + + @override + String get copyToClipboard => 'Kopiraj u međuspremnik'; + + @override + String couldNotDecryptMessage(String error) { + return 'Neuspjelo dešifriranje poruke: $error'; + } + + @override + String countParticipants(int count) { + return '$count sudionika'; + } + + @override + String get create => 'Stvori'; + + @override + String createdTheChat(String username) { + return '💬 $username je započeo/la razgovor'; + } + + @override + String get createGroup => 'Stvori grupu'; + + @override + String get createNewSpace => 'Novi prostor'; + + @override + String get currentlyActive => 'Trenutačno aktivni'; + + @override + String get darkTheme => 'Tamna'; + + @override + String dateAndTimeOfDay(String date, String timeOfDay) { + return '$date, $timeOfDay'; + } + + @override + String dateWithoutYear(String month, String day) { + return '$day. $month.'; + } + + @override + String dateWithYear(String year, String month, String day) { + return '$day. $month. $year.'; + } + + @override + String get deactivateAccountWarning => + 'Ovo će nepovratno deaktivirati tvoj korisnički račun. Stvarno to želiš?'; + + @override + String get defaultPermissionLevel => 'Standardna razina dozvole'; + + @override + String get delete => 'Izbriši'; + + @override + String get deleteAccount => 'Izbriši račun'; + + @override + String get deleteMessage => 'Izbriši poruku'; + + @override + String get device => 'Uređaj'; + + @override + String get deviceId => 'ID oznaka uređaja'; + + @override + String get devices => 'Uređaji'; + + @override + String get directChats => 'Izravni razgovori'; + + @override + String get allRooms => 'Svi grupni razgovori'; + + @override + String get displaynameHasBeenChanged => 'Prikazno ime je promijenjeno'; + + @override + String get downloadFile => 'Preuzmi datoteku'; + + @override + String get edit => 'Uredi'; + + @override + String get editBlockedServers => 'Uredi blokirane poslužitelje'; + + @override + String get chatPermissions => 'Dozvole za razgovor'; + + @override + String get editDisplayname => 'Uredi prikazano ime'; + + @override + String get editRoomAliases => 'Uredi pseudonime sobe'; + + @override + String get editRoomAvatar => 'Uredi avatar sobe'; + + @override + String get emoteExists => 'Emotikon već postoji!'; + + @override + String get emoteInvalid => 'Neispravna kratica emotikona!'; + + @override + String get emoteKeyboardNoRecents => + 'Ovdje će se pojaviti nedavno korišteni emotikoni …'; + + @override + String get emotePacks => 'Paketi emotikona za sobu'; + + @override + String get emoteSettings => 'Postavke emotikona'; + + @override + String get globalChatId => 'Globalni ID razgovora'; + + @override + String get accessAndVisibility => 'Pristup i vidljivost'; + + @override + String get accessAndVisibilityDescription => + 'Tko se smije pridružiti ovom razgovoru i kako se razgovor može otkriti.'; + + @override + String get calls => 'Pozivi'; + + @override + String get customEmojisAndStickers => 'Prilagođeni emojiji i naljepnice'; + + @override + String get customEmojisAndStickersBody => + 'Dodaj ili dijeli prilagođene emojije ili naljepnice koje se mogu koristiti u bilo kojem razgovoru.'; + + @override + String get emoteShortcode => 'Kratica emotikona'; + + @override + String get emoteWarnNeedToPick => + 'Moraš odabrati jednu kraticu emotikona i sliku!'; + + @override + String get emptyChat => 'Prazan razgovor'; + + @override + String get enableEmotesGlobally => 'Aktiviraj paket emotikona globalno'; + + @override + String get enableEncryption => 'Aktiviraj šifriranje'; + + @override + String get enableEncryptionWarning => + 'Više nećeš moći deaktivirati šifriranje. Stvarno to želiš?'; + + @override + String get encrypted => 'Šifrirano'; + + @override + String get encryption => 'Šifriranje'; + + @override + String get encryptionNotEnabled => 'Šifriranje nije aktivirano'; + + @override + String endedTheCall(String senderName) { + return '$senderName je završio/la poziv'; + } + + @override + String get enterAnEmailAddress => 'Upiši e-adressu'; + + @override + String get homeserver => 'Domaći poslužitelj'; + + @override + String get enterYourHomeserver => 'Upiši svoj domaći poslužitelj'; + + @override + String errorObtainingLocation(String error) { + return 'Greška u dohvaćanju lokacije: $error'; + } + + @override + String get everythingReady => 'Sve je spremno!'; + + @override + String get extremeOffensive => 'Izrazito uvredljiv'; + + @override + String get fileName => 'Ime datoteke'; + + @override + String get fluffychat => 'FluffyChat'; + + @override + String get fontSize => 'Veličina fonta'; + + @override + String get forward => 'Proslijedi'; + + @override + String get fromJoining => 'Od pridruživanja'; + + @override + String get fromTheInvitation => 'Od poziva'; + + @override + String get goToTheNewRoom => 'Idi u novu sobu'; + + @override + String get group => 'Grupiraj'; + + @override + String get chatDescription => 'Opis razgovora'; + + @override + String get chatDescriptionHasBeenChanged => 'Opis razgovora je promijenjen'; + + @override + String get groupIsPublic => 'Grupa je javna'; + + @override + String get groups => 'Grupe'; + + @override + String groupWith(String displayname) { + return 'Grupa s $displayname'; + } + + @override + String get guestsAreForbidden => 'Gosti su zabranjeni'; + + @override + String get guestsCanJoin => 'Gosti se mogu pridružiti'; + + @override + String hasWithdrawnTheInvitationFor(String username, String targetName) { + return '$username je povukao/la poziv za $targetName'; + } + + @override + String get help => 'Pomoć'; + + @override + String get hideRedactedEvents => 'Sakrij promijenjene događaje'; + + @override + String get hideRedactedMessages => 'Sakrij redigirane poruke'; + + @override + String get hideRedactedMessagesBody => + 'Ako netko redigira poruku, ta poruka više neće biti vidljiva u razgovoru.'; + + @override + String get hideInvalidOrUnknownMessageFormats => + 'Sakrij nevažeće ili nepoznate formate poruka'; + + @override + String get howOffensiveIsThisContent => 'Koliko je ovaj sadržaj uvredljiv?'; + + @override + String get id => 'ID'; + + @override + String get identity => 'Identitet'; + + @override + String get block => 'Blokiraj'; + + @override + String get blockedUsers => 'Blokirani korisnici'; + + @override + String get blockListDescription => + 'Možeš blokirati korisnike koji te ometaju. Nećeš moći primati poruke ili pozivnice za sobe od korisnika koji se nalaze u tvom osobnom popisu blokiranih.'; + + @override + String get blockUsername => 'Zanemari korisničko ime'; + + @override + String get iHaveClickedOnLink => 'Pritisnuo/la sam poveznicu'; + + @override + String get incorrectPassphraseOrKey => + 'Neispravna lozinka ili ključ za obnavljanje'; + + @override + String get inoffensive => 'Neuvredljiv'; + + @override + String get inviteContact => 'Pozovi kontakt'; + + @override + String inviteContactToGroupQuestion(Object contact, Object groupName) { + return 'Želiš li pozvati $contact u razgovor grupe „$groupName”?'; + } + + @override + String inviteContactToGroup(String groupName) { + return 'Pozovi kontakt u $groupName'; + } + + @override + String get noChatDescriptionYet => 'Opis razgovora još nije stvoren.'; + + @override + String get tryAgain => 'Pokušaj ponovo'; + + @override + String get invalidServerName => 'Neispravno ime servera'; + + @override + String get invited => 'Pozvan/a'; + + @override + String get redactMessageDescription => + 'Poruka će se redigirati za sve sudionike u ovom razgovoru. To se ne može poništiti.'; + + @override + String get optionalRedactReason => + '(Opcionalno) Razlog za redigiranje ove poruke …'; + + @override + String invitedUser(String username, String targetName) { + return '📩 $username je pozvao/la $targetName'; + } + + @override + String get invitedUsersOnly => 'Samo pozvani korisnici'; + + @override + String get inviteForMe => 'Poziv za mene'; + + @override + String inviteText(String username, String link) { + return '$username te je pozvao/la u FluffyChat. \n1. Posjeti strnicu fluffychat.im i instaliraj aplikaciju \n2. Registriraj ili prijavi se \n3. Otvori poveznicu poziva: \n $link'; + } + + @override + String get isTyping => 'piše …'; + + @override + String joinedTheChat(String username) { + return '👋 $username se pridružio/la razgovoru'; + } + + @override + String get joinRoom => 'Pridruži se sobi'; + + @override + String kicked(String username, String targetName) { + return '👞 $username je izbacio/la $targetName'; + } + + @override + String kickedAndBanned(String username, String targetName) { + return '🙅 $username je izbacio/la i blokirao/la $targetName'; + } + + @override + String get kickFromChat => 'Izbaci iz razgovora'; + + @override + String lastActiveAgo(String localizedTimeShort) { + return 'Zadnja aktivnost: $localizedTimeShort'; + } + + @override + String get leave => 'Napusti'; + + @override + String get leftTheChat => 'Napustio/la je razgovor'; + + @override + String get license => 'Licenca'; + + @override + String get lightTheme => 'Svijetla'; + + @override + String loadCountMoreParticipants(int count) { + return 'Učitaj još $count sudionika'; + } + + @override + String get dehydrate => 'Izvezi sesiju i izbriši uređaj'; + + @override + String get dehydrateWarning => + 'Ovo je nepovratna radnja. Spremi datoteku sigurnosne kopije na sigurno mjeto.'; + + @override + String get dehydrateTor => 'Korisnici TOR-a: izvezite sesiju'; + + @override + String get dehydrateTorLong => + 'Korisnicima TOR-a preporučuje se izvoz sesije prije zatvaranja prozora.'; + + @override + String get hydrateTor => 'Korisnici TOR-a: Uzvezite izvoz sesije'; + + @override + String get hydrateTorLong => + 'Je li zadnji izvoz sesije bio na TOR-u? Brzo ga uvezi i nastavi razgovarati.'; + + @override + String get hydrate => 'Obnovi pomoću sigurnosne kopije'; + + @override + String get loadingPleaseWait => 'Učitava se … Pričekaj.'; + + @override + String get loadMore => 'Učitaj još …'; + + @override + String get locationDisabledNotice => + 'Lokacijske usluge su deaktivirane. Za dijeljenje tvoje lokacije aktiviraj ih.'; + + @override + String get locationPermissionDeniedNotice => + 'Lokacijske dozvole su odbijene. Za dijeljenje tvoje lokacije dozvoli ih.'; + + @override + String get login => 'Prijava'; + + @override + String logInTo(String homeserver) { + return 'Prijavi se na $homeserver'; + } + + @override + String get logout => 'Odjava'; + + @override + String get memberChanges => 'Promjene člana'; + + @override + String get mention => 'Spominjanje'; + + @override + String get messages => 'Poruke'; + + @override + String get messagesStyle => 'Poruke:'; + + @override + String get moderator => 'Voditelj'; + + @override + String get muteChat => 'Isključi zvuk razgovora'; + + @override + String get needPantalaimonWarning => + 'Za trenutačno korištenje obostranog šifriranja trebaš Pantalaimon.'; + + @override + String get newChat => 'Novi razgovor'; + + @override + String get newMessageInFluffyChat => '💬 Nova poruka u FluffyChatu'; + + @override + String get newVerificationRequest => 'Novi zahtjev za potvrđivanje!'; + + @override + String get next => 'Dalje'; + + @override + String get no => 'Ne'; + + @override + String get noConnectionToTheServer => 'Ne postoji veza s poslužiteljem'; + + @override + String get noEmotesFound => 'Nema emotikona. 😕'; + + @override + String get noEncryptionForPublicRooms => + 'Šifriranje možeš aktivirati samo nakon što soba više nije javno dostupna.'; + + @override + String get noGoogleServicesWarning => + 'Čini se da Firebase Cloud Messaging nije dostupan na tvom uređaju. Za daljnje primanje push obavijesti, preporučujemo da instaliraš ntfy. S ntfy ili drugim pružateljem usluge Unified Push možeš primati push obavijesti na podatkovno siguran način. Ntfy možeš preuzeti s PlayStorea ili s F-Droida.'; + + @override + String noMatrixServer(String server1, String server2) { + return '$server1 nije matrix poslužitelj. Da li umjesto njega koristiti $server2?'; + } + + @override + String get shareInviteLink => 'Dijeli poveznicu za poziv'; + + @override + String get scanQrCode => 'Snimi QR kod'; + + @override + String get none => 'Ništa'; + + @override + String get noPasswordRecoveryDescription => + 'Još nisi dodao/la način za obnavljanje lozinke.'; + + @override + String get noPermission => 'Bez dozvole'; + + @override + String get noRoomsFound => 'Nema soba …'; + + @override + String get notifications => 'Obavijesti'; + + @override + String get notificationsEnabledForThisAccount => + 'Obavijesti su aktivirane za ovaj račun'; + + @override + String numUsersTyping(int count) { + return '$count korisnika pišu …'; + } + + @override + String get obtainingLocation => 'Dohvaćanje lokacije …'; + + @override + String get offensive => 'Uvredljiv'; + + @override + String get offline => 'Nepovezano s internetom'; + + @override + String get ok => 'U redu'; + + @override + String get online => 'Povezano s internetom'; + + @override + String get onlineKeyBackupEnabled => + 'Internetski ključ sigurnosnih kopija je aktiviran'; + + @override + String get oopsPushError => + 'Ups! Nažalost se dogodila greška prilikom postavljanja automatskog primanja obavijesti.'; + + @override + String get oopsSomethingWentWrong => 'Ups, dogodila se greška …'; + + @override + String get openAppToReadMessages => 'Za čitanje poruka, otvori program'; + + @override + String get openCamera => 'Otvori kameru'; + + @override + String get openVideoCamera => 'Otvori kameru za video'; + + @override + String get oneClientLoggedOut => 'Jedan od tvojih klijenata je odjavljen'; + + @override + String get addAccount => 'Dodaj račun'; + + @override + String get editBundlesForAccount => 'Uredi pakete za ovaj račun'; + + @override + String get addToBundle => 'Dodaj u paket'; + + @override + String get removeFromBundle => 'Ukloni iz ovog paketa'; + + @override + String get bundleName => 'Ime paketa'; + + @override + String get enableMultiAccounts => + '(BETA) Omogući korištenje više računa na ovom uređaju'; + + @override + String get openInMaps => 'Otvori u kartama'; + + @override + String get link => 'Poveznica'; + + @override + String get serverRequiresEmail => + 'Za registraciju ovaj poslužitelj mora potvrditi tvoju e-mail adresu.'; + + @override + String get or => 'Ili'; + + @override + String get participant => 'Sudionik'; + + @override + String get passphraseOrKey => 'tajni izraz ili ključ za obnavljanje'; + + @override + String get password => 'Lozinka'; + + @override + String get passwordForgotten => 'Zaboravljena lozinka'; + + @override + String get passwordHasBeenChanged => 'Lozinka je promijenjena'; + + @override + String get hideMemberChangesInPublicChats => + 'Sakrij promjene članova u javnim razgovorima'; + + @override + String get hideMemberChangesInPublicChatsBody => + 'Za bolju čitljivosti, na vremenskoj traci razgovora nemoj prikazivati kad se netko pridruži ili napusti javni razgovor.'; + + @override + String get overview => 'Pregled'; + + @override + String get notifyMeFor => 'Obavijesit me za'; + + @override + String get passwordRecoverySettings => 'Postavke za obnavljanje lozinke'; + + @override + String get passwordRecovery => 'Obnavljanje lozinke'; + + @override + String get people => 'Ljudi'; + + @override + String get pickImage => 'Odaberi sliku'; + + @override + String get pin => 'Prikvači'; + + @override + String play(String fileName) { + return 'Sviraj $fileName'; + } + + @override + String get pleaseChoose => 'Odaberi'; + + @override + String get pleaseChooseAPasscode => 'Odaberi lozinku'; + + @override + String get pleaseClickOnLink => + 'Pritisni poveznicu u e-poruci, zatim nastavi.'; + + @override + String get pleaseEnter4Digits => + 'Upiši 4 znamenke ili ostavi prazno, za deaktiviranje zaključavanja programa.'; + + @override + String get pleaseEnterRecoveryKey => 'Upiši svoj ključ za obnavljanje:'; + + @override + String get pleaseEnterYourPassword => 'Upiši svoju lozinku'; + + @override + String get pleaseEnterYourPin => 'Upiši svoj pin'; + + @override + String get pleaseEnterYourUsername => 'Upiši svoje korisničko ime'; + + @override + String get pleaseFollowInstructionsOnWeb => + 'Slijedi upute na web-stranici i dodirni „Dalje”.'; + + @override + String get privacy => 'Privatnost'; + + @override + String get publicRooms => 'Javne sobe'; + + @override + String get pushRules => 'Pravila slanja'; + + @override + String get reason => 'Razlog'; + + @override + String get recording => 'Snimanje'; + + @override + String redactedBy(String username) { + return 'Preuređeno od $username'; + } + + @override + String get directChat => 'Izravni razgovor'; + + @override + String redactedByBecause(String username, String reason) { + return 'Preuređeno od $username zbog: „$reason”'; + } + + @override + String redactedAnEvent(String username) { + return '$username je preuredio/la događaj'; + } + + @override + String get redactMessage => 'Ispravi poruku'; + + @override + String get register => 'Registracija'; + + @override + String get reject => 'Odbij'; + + @override + String rejectedTheInvitation(String username) { + return '$username je odbio/la poziv'; + } + + @override + String get rejoin => 'Ponovo se pridruži'; + + @override + String get removeAllOtherDevices => 'Ukloni sve druge uređaje'; + + @override + String removedBy(String username) { + return 'Uklonjeno od $username'; + } + + @override + String get removeDevice => 'Ukloni uređaj'; + + @override + String get unbanFromChat => 'Ponovo uključi u razgovor'; + + @override + String get removeYourAvatar => 'Ukloni svoj avatar'; + + @override + String get replaceRoomWithNewerVersion => 'Zamijeni sobu s novom verzijom'; + + @override + String get reply => 'Odgovori'; + + @override + String get reportMessage => 'Prijavi poruku'; + + @override + String get translateMessage => 'Translate message'; + + @override + String get translatedMessage => 'Translated message'; + + @override + String get errorTranslatingMessage => + 'An error has occured while translating the message.'; + + @override + String get recoverMessage => 'Recover message'; + + @override + String get recoveredMessage => 'Recovered message'; + + @override + String get errorRecoveringMessage => + 'An error has occured while recovering the message.'; + + @override + String get errorRecoveringMessageNoAdmin => + 'This feature is available on Synapse homeservers only for adminstrators.'; + + @override + String get requestPermission => 'Zatraži dozvolu'; + + @override + String get roomHasBeenUpgraded => 'Soba je nadograđena'; + + @override + String get roomVersion => 'Verzija sobe'; + + @override + String get saveFile => 'Spremi datoteku'; + + @override + String get retry => 'Retry'; + + @override + String get search => 'Traži'; + + @override + String get security => 'Sigurnost'; + + @override + String get recoveryKey => 'Ključ za obnavljanje'; + + @override + String get recoveryKeyLost => 'Izgubio/la si ključ za obnavljanje?'; + + @override + String seenByUser(String username) { + return 'Viđeno od $username'; + } + + @override + String get send => 'Pošalji'; + + @override + String get sendAMessage => 'Pošalji poruku'; + + @override + String get sendAsText => 'Pošalji kao tekst'; + + @override + String get sendAudio => 'Pošalji audio datoteku'; + + @override + String get sendFile => 'Pošalji datoteku'; + + @override + String get sendImage => 'Pošalji sliku'; + + @override + String sendImages(int count) { + return 'Send $count image'; + } + + @override + String get sendMessages => 'Šalji poruke'; + + @override + String get sendOriginal => 'Pošalji original'; + + @override + String get sendSticker => 'Pošalji naljepnicu'; + + @override + String get sendVideo => 'Pošalji video datoteku'; + + @override + String sentAFile(String username) { + return '📁 $username ja poslao/la datoteku'; + } + + @override + String sentAnAudio(String username) { + return '🎤 $username ja poslao/la audio snimku'; + } + + @override + String sentAPicture(String username) { + return '🖼️ $username ja poslao/la sliku'; + } + + @override + String sentASticker(String username) { + return '😊 $username je poslao/la naljepnicu'; + } + + @override + String sentAVideo(String username) { + return '🎥 $username je poslao/la video'; + } + + @override + String sentCallInformations(String senderName) { + return '$senderName je poslao/la podatke poziva'; + } + + @override + String get separateChatTypes => + 'Odvojeni izravni razgovori, grupe i prostori'; + + @override + String get setAsCanonicalAlias => 'Postavi kao glavni pseudonim'; + + @override + String get setCustomEmotes => 'Postavi prilagođene emotikone'; + + @override + String get setChatDescription => 'Postavi opis rzgovora'; + + @override + String get setInvitationLink => 'Pošalji poveznicu poziva'; + + @override + String get setPermissionsLevel => 'Postavi razinu dozvola'; + + @override + String get setStatus => 'Postavi stanje'; + + @override + String get settings => 'Postavke'; + + @override + String get share => 'Dijeli'; + + @override + String sharedTheLocation(String username) { + return '$username je dijelio/la svoje mjesto'; + } + + @override + String get shareLocation => 'Dijeli lokaciju'; + + @override + String get showPassword => 'Pokaži lozinku'; + + @override + String get presenceStyle => 'Prisutnost:'; + + @override + String get hideAvatarsInInvites => 'Hide avatars in invites'; + + @override + String get hideAvatarsInInvitesDescription => + 'Do not show room avatars in invites'; + + @override + String get presencesToggle => 'Prikaži poruke stanja od drugih korisnika'; + + @override + String get pureBlackToggle => 'Pure Black'; + + @override + String get singlesignon => 'Jednokratna prijava'; + + @override + String get skip => 'Preskoči'; + + @override + String get sourceCode => 'Izvorni kȏd'; + + @override + String get spaceIsPublic => 'Prostor je javan'; + + @override + String get spaceName => 'Ime prostora'; + + @override + String startedACall(String senderName) { + return '$senderName ja započeo/la poziv'; + } + + @override + String get startFirstChat => 'Započni svoj prvi razgovor'; + + @override + String get status => 'Stanje'; + + @override + String get statusExampleMessage => 'Kako si danas?'; + + @override + String get submit => 'Pošalji'; + + @override + String get synchronizingPleaseWait => 'Sinkronizira se … Pričekaj.'; + + @override + String synchronizingPleaseWaitCounter(String percentage) { + return ' Synchronizing… ($percentage%)'; + } + + @override + String get systemTheme => 'Sustav'; + + @override + String get theyDontMatch => 'Ne poklapaju se'; + + @override + String get theyMatch => 'Poklapaju se'; + + @override + String get title => 'FluffyChat'; + + @override + String get toggleFavorite => 'Uklj/Isklj favorite'; + + @override + String get toggleMuted => 'Uklj/Isklj isključene'; + + @override + String get toggleUnread => 'Označi kao pročitano/nepročitano'; + + @override + String get tooManyRequestsWarning => + 'Previše zahtjeva. Pokušaj ponovo kasnije!'; + + @override + String get transferFromAnotherDevice => 'Prenesi s jednog drugog uređaja'; + + @override + String get tryToSendAgain => 'Pokušaj ponovo poslati'; + + @override + String get unavailable => 'Nedostupno'; + + @override + String unbannedUser(String username, String targetName) { + return '$username je ponovo uključio/la $targetName'; + } + + @override + String get unblockDevice => 'Deblokiraj uređaj'; + + @override + String get unknownDevice => 'Nepoznat uređaj'; + + @override + String get unknownEncryptionAlgorithm => 'Nepoznat algoritam šifriranja'; + + @override + String unknownEvent(String type) { + return 'Nepoznat događaj „$type”'; + } + + @override + String get unmuteChat => 'Uključi zvuk razgovora'; + + @override + String get unpin => 'Otkvači'; + + @override + String unreadChats(int unreadCount) { + String _temp0 = intl.Intl.pluralLogic( + unreadCount, + locale: localeName, + other: '$unreadCount nepročitanih razgovora', + few: '$unreadCount nepročitana razgovora', + one: '1 nepročitan razgovor', + ); + return '$_temp0'; + } + + @override + String userAndOthersAreTyping(String username, int count) { + return '$username i još $count korisnika pišu …'; + } + + @override + String userAndUserAreTyping(String username, String username2) { + return '$username i $username2 pišu …'; + } + + @override + String userIsTyping(String username) { + return '$username piše …'; + } + + @override + String userLeftTheChat(String username) { + return '🚪 $username je napustio/la razgovor'; + } + + @override + String get username => 'Korisničko ime'; + + @override + String userSentUnknownEvent(String username, String type) { + return '$username ja poslao/la $type događaj'; + } + + @override + String get unverified => 'Nepotvrđeno'; + + @override + String get verified => 'Potvrđeno'; + + @override + String get verify => 'Potvrdi'; + + @override + String get verifyStart => 'Pokreni potvrđivanje'; + + @override + String get verifySuccess => 'Uspješno si potvrdio/la!'; + + @override + String get verifyTitle => 'Potvrđivanje drugog računa'; + + @override + String get videoCall => 'Video poziv'; + + @override + String get visibilityOfTheChatHistory => 'Vidljivost povijesti razgovora'; + + @override + String get visibleForAllParticipants => 'Vidljivo za sve sudionike'; + + @override + String get visibleForEveryone => 'Vidljivo za sve'; + + @override + String get voiceMessage => 'Glasovna poruka'; + + @override + String get waitingPartnerAcceptRequest => + 'Čeka se na sugovornika da prihvati zahtjev …'; + + @override + String get waitingPartnerEmoji => + 'Čeka se na sugovornika da prihvati emoji …'; + + @override + String get waitingPartnerNumbers => + 'Čeka se na sugovornika da prihvati brojeve …'; + + @override + String get wallpaper => 'Pozadina:'; + + @override + String get warning => 'Upozorenje!'; + + @override + String get weSentYouAnEmail => 'Poslali smo ti e-poruku'; + + @override + String get whoCanPerformWhichAction => 'Tko može izvršiti koju radnju'; + + @override + String get whoIsAllowedToJoinThisGroup => 'Tko se smije pridružiti grupi'; + + @override + String get whyDoYouWantToReportThis => 'Zašto želiš ovo prijaviti?'; + + @override + String get wipeChatBackup => + 'Izbrisati sigurnosnu kopiju razgovora za stvaranje novog sigurnosnog ključa za obnavljanje?'; + + @override + String get withTheseAddressesRecoveryDescription => + 'Lozinku možeš obnoviti pomoću ovih adresa.'; + + @override + String get writeAMessage => 'Napiši poruku …'; + + @override + String get yes => 'Da'; + + @override + String get you => 'Ti'; + + @override + String get youAreNoLongerParticipatingInThisChat => + 'Više ne sudjeluješ u ovom razgovoru'; + + @override + String get youHaveBeenBannedFromThisChat => + 'Isključen/a si iz ovog razgovora'; + + @override + String get yourPublicKey => 'Tvoj javni ključ'; + + @override + String get messageInfo => 'Informacija poruke'; + + @override + String get time => 'Vrijeme'; + + @override + String get messageType => 'Vrsta poruke'; + + @override + String get sender => 'Pošiljatelj'; + + @override + String get openGallery => 'Otvori galeriju'; + + @override + String get removeFromSpace => 'Ukloni iz prostora'; + + @override + String get addToSpaceDescription => + 'Odaberi prostor kojem će se ovaj razgovor dodati.'; + + @override + String get start => 'Početak'; + + @override + String get pleaseEnterRecoveryKeyDescription => + 'Za otključavanje starih poruka upiši ključ za obnavljanje koji je generiran u prethodnoj sesiji. Tvoj ključ za obnavljanje NIJE tvoja lozinka.'; + + @override + String get publish => 'Objavi'; + + @override + String videoWithSize(String size) { + return 'Video ($size)'; + } + + @override + String get openChat => 'Otvori razgovor'; + + @override + String get markAsRead => 'Označi kao pročitano'; + + @override + String get reportUser => 'Prijavi korisnika'; + + @override + String get dismiss => 'Odbaci'; + + @override + String reactedWith(String sender, String reaction) { + return '$sender je reagirao/la sa $reaction'; + } + + @override + String get pinMessage => 'Prikvači na sobu'; + + @override + String get confirmEventUnpin => 'Stvarno želiš trajno otkvačiti događaj?'; + + @override + String get emojis => 'Emojiji'; + + @override + String get placeCall => 'Nazovi'; + + @override + String get voiceCall => 'Glasovni poziv'; + + @override + String get unsupportedAndroidVersion => 'Nepodržana Android verzija'; + + @override + String get unsupportedAndroidVersionLong => + 'Ova funkcija zahtijeva noviju verziju Androida. Provjeri, postoje li nove verzije ili podrška za Lineage OS.'; + + @override + String get videoCallsBetaWarning => + 'Napominjemo da se funkcija videopoziva trenutačno nalazi u beta stanju. Možda neće raditi ispravno ili uopće neće raditi na svim platformama.'; + + @override + String get experimentalVideoCalls => 'Eksperimentalni videopozivi'; + + @override + String get emailOrUsername => 'E-mail ili korisničko ime'; + + @override + String get indexedDbErrorTitle => 'Problemi u privatnom modusu'; + + @override + String get indexedDbErrorLong => + 'Spremište poruka nažalost nije standarno uključena u privatnom modusu.\nOtvori stranicu\n - about:config\n - postavi dom.indexedDB.privateBrowsing.enabled na true\nFluffyChat se inače neće moći pokrenuti.'; + + @override + String switchToAccount(String number) { + return 'Prijeđi na račun $number'; + } + + @override + String get nextAccount => 'Sljedeći račun'; + + @override + String get previousAccount => 'Prethodni račun'; + + @override + String get addWidget => 'Dodaj widget'; + + @override + String get widgetVideo => 'Video'; + + @override + String get widgetEtherpad => 'Tekstna bilješka'; + + @override + String get widgetJitsi => 'Jitsi Meet'; + + @override + String get widgetCustom => 'Prilagođeno'; + + @override + String get widgetName => 'Ime'; + + @override + String get widgetUrlError => 'Ovo nije valjan URL.'; + + @override + String get widgetNameError => 'Zadaj prikazno ime.'; + + @override + String get errorAddingWidget => 'Greška prilikom dodavanja widgeta.'; + + @override + String get youRejectedTheInvitation => 'Odbio/la si poziv'; + + @override + String get youJoinedTheChat => 'Pridružio/la si se razgovoru'; + + @override + String get youAcceptedTheInvitation => '👍 Prihvatio/la si poziv'; + + @override + String youBannedUser(String user) { + return 'Isključio/la si korisnika $user'; + } + + @override + String youHaveWithdrawnTheInvitationFor(String user) { + return 'Povukao/la si poziv za korisnika $user'; + } + + @override + String youInvitedToBy(String alias) { + return '📩 Pozvan/a si putem poveznice na:\n$alias'; + } + + @override + String youInvitedBy(String user) { + return '📩 $user te je pozvao/la'; + } + + @override + String invitedBy(String user) { + return '📩 Invited by $user'; + } + + @override + String youInvitedUser(String user) { + return '📩 Pozvao/la si korisnika $user'; + } + + @override + String youKicked(String user) { + return '👞 Izbacio/la si korisnika $user'; + } + + @override + String youKickedAndBanned(String user) { + return '🙅 Izbacio/la si i blokirao/la korisnika $user'; + } + + @override + String youUnbannedUser(String user) { + return 'Ponovo si uključio/la korisnika $user'; + } + + @override + String hasKnocked(String user) { + return '🚪 $user je pokucao/la'; + } + + @override + String get usersMustKnock => 'Korisnici moraju pokucati'; + + @override + String get noOneCanJoin => 'Nitko se ne može pridružiti'; + + @override + String userWouldLikeToChangeTheChat(String user) { + return '$user se želi pridružiti razgovoru.'; + } + + @override + String get noPublicLinkHasBeenCreatedYet => + 'Još nije stvorena nijedna javna poveznica'; + + @override + String get knock => 'Pokucaj'; + + @override + String get users => 'Korisnici'; + + @override + String get unlockOldMessages => 'Otključaj stare poruke'; + + @override + String get storeInSecureStorageDescription => + 'Ključ za obnavljanje spremi u sigurno spremište na ovom uređaju.'; + + @override + String get saveKeyManuallyDescription => + 'Spremi ovaj ključ ručno pokretanjem dijaloga za dijeljenje sustava ili međuspremnika.'; + + @override + String get storeInAndroidKeystore => 'Spremi u Android KeyStore'; + + @override + String get storeInAppleKeyChain => 'Spremi u Apple KeyChain'; + + @override + String get storeSecurlyOnThisDevice => 'Spremi sigurno na ovom uređaju'; + + @override + String countFiles(int count) { + return 'Broj datoteka: $count'; + } + + @override + String get user => 'Korisnik'; + + @override + String get custom => 'Prilagođeno'; + + @override + String get foregroundServiceRunning => + 'Ova se obavijest pojavljuje kada se pokreće usluga u prvom planu.'; + + @override + String get screenSharingTitle => 'dijeljenje ekrana'; + + @override + String get screenSharingDetail => 'Dijeliš svoj ekran u FuffyChatu'; + + @override + String get callingPermissions => 'Dozvole za pozivanje'; + + @override + String get callingAccount => 'Račun za pozivanje'; + + @override + String get callingAccountDetails => + 'Omogućuje FluffyChatu korištenje izvorne Android aplikacije za pozivanje.'; + + @override + String get appearOnTop => 'Prikaz ispred drugih'; + + @override + String get appearOnTopDetails => + 'Omogućuje prikaz aplikacije ispred drugih (nije potrebno ako je FluffyChat već postavljen kao račun za pozivanje)'; + + @override + String get otherCallingPermissions => + 'Mikrofon, kamera i druge FluffyChat dozvole'; + + @override + String get whyIsThisMessageEncrypted => + 'Zašto nije moguće čitati ovu poruku?'; + + @override + String get noKeyForThisMessage => + 'To se može dogoditi ako je poruka poslana prije prijave na tvoj račun na ovom uređaju.\n\nTakođer je moguće da je pošiljatelj blokirao tvoj uređaj ili je došlo do greške s internetskom vezom.\n\nMožeš li pročitati poruku na jednoj drugoj sesiji? U tom slučaju možeš prenijeti poruku iz nje! Idi na Postavke > Uređaji i uvjeri se da su se tvoji uređaji međusobno provjerili. Kada sljedeći put otvoriš sobu i obje sesije su u prednjem planu, ključevi će se automatski prenijeti.\n\nNe želiš izgubiti ključeve kada se odjaviš ili zamijeniš uređaje? Aktiviraj spremanje sigurnosne kopije razgovora u postavkama.'; + + @override + String get newGroup => 'Nova grupa'; + + @override + String get newSpace => 'Novi prostor'; + + @override + String get enterSpace => 'Uđi u prostor'; + + @override + String get enterRoom => 'Uđi u sobu'; + + @override + String get allSpaces => 'Svi prostori'; + + @override + String numChats(String number) { + return '$number razgovora'; + } + + @override + String get hideUnimportantStateEvents => 'Sakrij nevažna stanja događaja'; + + @override + String get hidePresences => 'Sakriti popis stanja?'; + + @override + String get doNotShowAgain => 'Nemoj više prikazivati'; + + @override + String wasDirectChatDisplayName(String oldDisplayName) { + return 'Prazan razgovor (zvao se $oldDisplayName)'; + } + + @override + String get newSpaceDescription => + 'Prostori omogućuju konsolidiranje tvojih razgovora i izgradnju privatne ili javne zajednice.'; + + @override + String get encryptThisChat => 'Šifiraj ovaj razgovor'; + + @override + String get disableEncryptionWarning => + 'Iz sigurnosnih razloga ne možeš deaktivirati šifriranje u razgovoru u kojem je prije bilo aktivirano.'; + + @override + String get sorryThatsNotPossible => 'Žao nam je … to nije moguće'; + + @override + String get deviceKeys => 'Ključevi uređaja:'; + + @override + String get reopenChat => 'Ponovo otvori razgovor'; + + @override + String get noBackupWarning => + 'Upozorenje! Bez aktiviranja spremanja sigurnosne kopije razgovora, izgubit ćeš pristup tvojim šifriranim porukama. Preporučujemo spremanje sigurnosne kopije razgovora prije odjave.'; + + @override + String get noOtherDevicesFound => 'Nijedan drugi uređaj nije pronađen'; + + @override + String fileIsTooBigForServer(String max) { + return 'Neuspjelo slanje! Poslužitelj podržava samo priloge do $max.'; + } + + @override + String fileHasBeenSavedAt(String path) { + return 'Datoteka je spremljena u $path'; + } + + @override + String get jumpToLastReadMessage => 'Skoči na zadnju pročitanu poruku'; + + @override + String get readUpToHere => 'Pročitaj do ovdje'; + + @override + String get jump => 'Skoči'; + + @override + String get openLinkInBrowser => 'Otvori poveznicu u pregledniku'; + + @override + String get reportErrorDescription => + '😭 Joj! Dogodila se greška. Pokušaj ponovo kasnije. Ako želiš, grešku možeš prijaviti programerima.'; + + @override + String get report => 'prijavi'; + + @override + String get signInWithPassword => 'Prijavi se s lozinkom'; + + @override + String get pleaseTryAgainLaterOrChooseDifferentServer => + 'Pokušaj ponovo kasnije ili odaberi jedan drugi poslužitelj.'; + + @override + String signInWith(String provider) { + return 'Prijavi se pomoću $provider'; + } + + @override + String get profileNotFound => + 'Korisnik nije pronađen na poslužitelju. Možda postoji problem s vezom ili korisnik ne postoji.'; + + @override + String get setTheme => 'Postavi temu:'; + + @override + String get setColorTheme => 'Postavi boju teme:'; + + @override + String get invite => 'Pozovi'; + + @override + String get inviteGroupChat => '📨 Pozovi u grupni razgovor'; + + @override + String get invitePrivateChat => '📨 Pozovi u privatni razgovor'; + + @override + String get invalidInput => 'Neispravan unos!'; + + @override + String wrongPinEntered(int seconds) { + return 'Unesen je pogrešan PIN! Pokušaj ponovo za $seconds sekunde …'; + } + + @override + String get pleaseEnterANumber => 'Upiši broj veći od 0'; + + @override + String get archiveRoomDescription => + 'Razgovor će se premjestiti u arhivu. Drugi korisnici će moći vidjeti da si napustio/la razgovor.'; + + @override + String get roomUpgradeDescription => + 'Razgovor će se tada ponovo stvoriti s novom verzijom sobe. Svi sudionici će biti obaviješteni da se moraju prebaciti na novi razgovor. Više o verzijama soba možeš saznati na https://spec.matrix.org/latest/rooms/'; + + @override + String get removeDevicesDescription => + 'Bit ćeš odjavljen/a s ovog uređaja i više nećeš moći primati poruke.'; + + @override + String get banUserDescription => + 'Korisnik će biti isključen iz razgovora i moći će ponovo prisustvovati razgovoru kad ga se deblokira.'; + + @override + String get unbanUserDescription => + 'Korisnik će se ponovo moći pridružiti razgovoru ako pokuša.'; + + @override + String get kickUserDescription => + 'Korisnik je izbačen iz razgovora, ali nije blokiran. U javnim razgovorima se korisnik može ponovo pridružiti u bilo kojem trenutku.'; + + @override + String get makeAdminDescription => + 'Nakon postavljanja ovog korisnika kao administratora, to možda nećeš moći poništiti jer će on tada imati iste dozvole kao i ti.'; + + @override + String get pushNotificationsNotAvailable => + 'Automatsko slanje obavijesti nije dostupno'; + + @override + String get learnMore => 'Saznaj više'; + + @override + String get yourGlobalUserIdIs => 'Tvoj globalni korisnički ID je: '; + + @override + String noUsersFoundWithQuery(String query) { + return 'Nažalost nije pronađen nijedan korisnik s „$query”. Provjeri točnost upisa.'; + } + + @override + String get knocking => 'Kucanje'; + + @override + String chatCanBeDiscoveredViaSearchOnServer(String server) { + return 'Razgovor se može otkriti pretraživanjem servera $server'; + } + + @override + String get searchChatsRooms => 'Traži #chats, @users …'; + + @override + String get nothingFound => 'Ništa nije pronađeno...'; + + @override + String get groupName => 'Ime grupe'; + + @override + String get createGroupAndInviteUsers => 'Stvori grupu i pozovi korisnike'; + + @override + String get groupCanBeFoundViaSearch => 'Grupa se može pronaći putem pretrage'; + + @override + String get wrongRecoveryKey => + 'Oprosti … čini se da ovo nije ispravan ključ za obnavljanje.'; + + @override + String get startConversation => 'Pokreni konverzaciju'; + + @override + String get commandHint_sendraw => 'Pošalji neobrađeni json'; + + @override + String get databaseMigrationTitle => 'Baza podataka je optimirana'; + + @override + String get databaseMigrationBody => 'Pričekaj. Ovo može potrajati.'; + + @override + String get leaveEmptyToClearStatus => + 'Ostavi prazno za brisanje tvog stanja.'; + + @override + String get select => 'Odaberi'; + + @override + String get searchForUsers => 'Traži @users...'; + + @override + String get pleaseEnterYourCurrentPassword => 'Upiši svoju trenutačnu lozinku'; + + @override + String get newPassword => 'Nova lozinka'; + + @override + String get pleaseChooseAStrongPassword => 'Odaberi snažnu lozinku'; + + @override + String get passwordsDoNotMatch => 'Lozinke se ne poklapaju'; + + @override + String get passwordIsWrong => 'Tvoja upisana lozinka je kriva'; + + @override + String get publicLink => 'Javna poveznica'; + + @override + String get publicChatAddresses => 'Adrese javnih razgovora'; + + @override + String get createNewAddress => 'Stvori novu adresu'; + + @override + String get joinSpace => 'Pridruži se prostoru'; + + @override + String get publicSpaces => 'Javni prostori'; + + @override + String get addChatOrSubSpace => 'Dodaj razgovor ili podpodručje'; + + @override + String get subspace => 'Podprostori'; + + @override + String get decline => 'Odbij'; + + @override + String get thisDevice => 'Ovaj uređaj:'; + + @override + String get initAppError => + 'Dogodila se greška prilikom inicijaliziranja aplikacije'; + + @override + String get userRole => 'Korisnička uloga'; + + @override + String minimumPowerLevel(String level) { + return '$level je najmanja razina prava.'; + } + + @override + String searchIn(String chat) { + return 'Traži u razgovoru „$chat”...'; + } + + @override + String get searchMore => 'Traži više...'; + + @override + String get gallery => 'Galerija'; + + @override + String get files => 'Datoteke'; + + @override + String databaseBuildErrorBody(String url, String error) { + return 'Nije moguće izgraditi SQlite bazu podataka. Aplikacija za sada pokušava koristiti staru bazu podataka. Prijavi ovu grešku programerima na $url. Poruka o grešci glasi: $error'; + } + + @override + String sessionLostBody(String url, String error) { + return 'Tvoja je sesija izgubljena. Prijavi ovu grešku programerima na $url. Poruka o grešci glasi: $error'; + } + + @override + String restoreSessionBody(String url, String error) { + return 'Aplikacija sada pokušava obnoviti tvoju sesiju iz sigurnosne kopije. Prijavi ovu grešku programerima na $url. Poruka o grešci glasi: $error'; + } + + @override + String forwardMessageTo(String roomName) { + return 'Proslijediti poruku u sobu $roomName?'; + } + + @override + String get sendReadReceipts => 'Šalji potvrde o čitanju'; + + @override + String get sendTypingNotificationsDescription => + 'Drugi sudionici u razgovoru mogu vidjeti kada pišeš novu poruku.'; + + @override + String get sendReadReceiptsDescription => + 'Drugi sudionici u raygovoru mogu vidjeti kada pročitaš poruku.'; + + @override + String get formattedMessages => 'Formatirane poruke'; + + @override + String get formattedMessagesDescription => + 'Prikaži formatirani sadržaj poruke poput podebljanog teksta koristeći markdown.'; + + @override + String get verifyOtherUser => '🔐 Potvrdi drugog korisnika'; + + @override + String get verifyOtherUserDescription => + 'Ako potvrdiš jednog drugog korisnika, možeš biti siguran/na da znaš kome zapravo pišeš. 💪\n\nKada pokreneš provjeru, vi i drugi korisnik vidjet ćete skočni prozor u aplikaciji. Tamo ćeš tada vidjeti niz emojija ili brojeve koje morate međusobno usporediti.\n\nNajbolji način za to je da se nađete zajedno ili započnete videopoziv. 👭'; + + @override + String get verifyOtherDevice => '🔐 Potvrdi drugi uređaj'; + + @override + String get verifyOtherDeviceDescription => + 'Kada potvrdiš jedan drugi uređaj, ti uređaji mogu razmjenjivati ključeve, povećavajući tvoju ukupnu sigurnost. 💪 Kada pokreneš provjeru, pojavit će se skočni prozor u aplikaciji na oba uređaja. Tamo ćeš tada vidjeti niz emojija ili brojeve koje moraš međusobno usporediti. Najbolje je imati oba uređaja pri ruci prije nego što započneš provjeru. 🤳'; + + @override + String acceptedKeyVerification(String sender) { + return '$sender je prihvatio/la potvrđivanje ključa'; + } + + @override + String canceledKeyVerification(String sender) { + return '$sender je prekinuo/la potvrđivanje ključa'; + } + + @override + String completedKeyVerification(String sender) { + return '$sender je dovršio/la potvrđivanje ključa'; + } + + @override + String isReadyForKeyVerification(String sender) { + return '$sender je spreman/na za potvrđivanje ključa'; + } + + @override + String requestedKeyVerification(String sender) { + return '$sender je zatražio/la potvrđivanje ključa'; + } + + @override + String startedKeyVerification(String sender) { + return '$sender je pokrenuo/la potvrđivanje ključa'; + } + + @override + String get transparent => 'Prozirno'; + + @override + String get incomingMessages => 'Dolazne poruke'; + + @override + String get stickers => 'Naljepnice'; + + @override + String get discover => 'Otkrij'; + + @override + String get commandHint_ignore => 'Zanemari navedeni matrix ID'; + + @override + String get commandHint_unignore => + 'Poništi zanemarivanje navedenog matrix ID-a'; + + @override + String unreadChatsInApp(String appname, String unread) { + return '$appname: Nroj nepročitanih razgovora: $unread'; + } + + @override + String get noDatabaseEncryption => + 'Šifriranje baze podataka nije podržano na ovoj platformi'; + + @override + String thereAreCountUsersBlocked(Object count) { + return 'Broj trenutačno blokiranih korisnika: $count.'; + } + + @override + String get restricted => 'Ograničeni'; + + @override + String get knockRestricted => 'Pokucaj na ograničene sobe'; + + @override + String goToSpace(Object space) { + return 'Go to space: $space'; + } + + @override + String get markAsUnread => 'Mark as unread'; + + @override + String userLevel(int level) { + return '$level - User'; + } + + @override + String moderatorLevel(int level) { + return '$level - Moderator'; + } + + @override + String adminLevel(int level) { + return '$level - Admin'; + } + + @override + String get changeGeneralChatSettings => 'Change general chat settings'; + + @override + String get inviteOtherUsers => 'Invite other users to this chat'; + + @override + String get changeTheChatPermissions => 'Change the chat permissions'; + + @override + String get changeTheVisibilityOfChatHistory => + 'Change the visibility of the chat history'; + + @override + String get changeTheCanonicalRoomAlias => + 'Change the main public chat address'; + + @override + String get sendRoomNotifications => 'Send a @room notifications'; + + @override + String get changeTheDescriptionOfTheGroup => + 'Change the description of the chat'; + + @override + String get chatPermissionsDescription => + 'Define which power level is necessary for certain actions in this chat. The power levels 0, 50 and 100 are usually representing users, moderators and admins, but any gradation is possible.'; + + @override + String updateInstalled(String version) { + return '🎉 Update $version installed!'; + } + + @override + String get changelog => 'Changelog'; + + @override + String get sendCanceled => 'Sending canceled'; + + @override + String get loginWithMatrixId => 'Login with Matrix-ID'; + + @override + String get discoverHomeservers => 'Discover homeservers'; + + @override + String get whatIsAHomeserver => 'What is a homeserver?'; + + @override + String get homeserverDescription => + 'All your data is stored on the homeserver, just like an email provider. You can choose which homeserver you want to use, while you can still communicate with everyone. Learn more at at https://matrix.org.'; + + @override + String get doesNotSeemToBeAValidHomeserver => + 'Doesn\'t seem to be a compatible homeserver. Wrong URL?'; + + @override + String get calculatingFileSize => 'Calculating file size...'; + + @override + String get prepareSendingAttachment => 'Pripremi slanje priloga …'; + + @override + String get sendingAttachment => 'Slanje priloga …'; + + @override + String get generatingVideoThumbnail => 'Generating video thumbnail...'; + + @override + String get compressVideo => 'Compressing video...'; + + @override + String sendingAttachmentCountOfCount(int index, int length) { + return 'Slanje priloga $index od $length …'; + } + + @override + String serverLimitReached(int seconds) { + return 'Server limit reached! Waiting $seconds seconds...'; + } + + @override + String get oneOfYourDevicesIsNotVerified => + 'One of your devices is not verified'; + + @override + String get noticeChatBackupDeviceVerification => + 'Note: When you connect all your devices to the chat backup, they are automatically verified.'; + + @override + String get continueText => 'Continue'; + + @override + String get welcomeText => + 'Hey Hey 👋 This is Extera. You can sign in to any homeserver, which is compatible with https://matrix.org. And then chat with anyone. It\'s a huge decentralized messaging network!'; + + @override + String get blur => 'Blur:'; + + @override + String get opacity => 'Opacity:'; + + @override + String get setWallpaper => 'Set wallpaper'; + + @override + String get manageAccount => 'Manage account'; + + @override + String get noContactInformationProvided => + 'Server does not provide any valid contact information'; + + @override + String get contactServerAdmin => 'Contact server admin'; + + @override + String get contactServerSecurity => 'Contact server security'; + + @override + String get supportPage => 'Support page'; + + @override + String get serverInformation => 'Server information:'; + + @override + String get name => 'Name'; + + @override + String get version => 'Version'; + + @override + String get website => 'Website'; + + @override + String get compress => 'Compress'; + + @override + String get boldText => 'Bold text'; + + @override + String get italicText => 'Italic text'; + + @override + String get strikeThrough => 'Strikethrough'; + + @override + String get pleaseFillOut => 'Please fill out'; + + @override + String get invalidUrl => 'Invalid url'; + + @override + String get addLink => 'Add link'; + + @override + String get unableToJoinChat => + 'Unable to join chat. Maybe the other party has already closed the conversation.'; + + @override + String get previous => 'Previous'; + + @override + String get otherPartyNotLoggedIn => + 'The other party is currently not logged in and therefore cannot receive messages!'; + + @override + String appWantsToUseForLogin(String server) { + return 'Use \'$server\' to log in'; + } + + @override + String get appWantsToUseForLoginDescription => + 'You hereby allow the app and website to share information about you.'; + + @override + String get open => 'Open'; + + @override + String get waitingForServer => 'Waiting for server...'; + + @override + String get appIntroduction => + 'Extera lets you chat with your friends across different messengers. Learn more at https://matrix.org or just tap *Continue*.'; + + @override + String get newChatRequest => '📩 New chat request'; + + @override + String get contentNotificationSettings => 'Content notification settings'; + + @override + String get generalNotificationSettings => 'General notification settings'; + + @override + String get roomNotificationSettings => 'Room notification settings'; + + @override + String get userSpecificNotificationSettings => + 'User specific notification settings'; + + @override + String get otherNotificationSettings => 'Other notification settings'; + + @override + String get notificationRuleContainsUserName => 'Contains User Name'; + + @override + String get notificationRuleContainsUserNameDescription => + 'Notifies the user when a message contains their username.'; + + @override + String get notificationRuleMaster => 'Mute all notifications'; + + @override + String get notificationRuleMasterDescription => + 'Overrides all other rules and disables all notifications.'; + + @override + String get notificationRuleSuppressNotices => 'Suppress Automated Messages'; + + @override + String get notificationRuleSuppressNoticesDescription => + 'Suppresses notifications from automated clients like bots.'; + + @override + String get notificationRuleInviteForMe => 'Invite for Me'; + + @override + String get notificationRuleInviteForMeDescription => + 'Notifies the user when they are invited to a room.'; + + @override + String get notificationRuleMemberEvent => 'Member Event'; + + @override + String get notificationRuleMemberEventDescription => + 'Suppresses notifications for membership events.'; + + @override + String get notificationRuleIsUserMention => 'User Mention'; + + @override + String get notificationRuleIsUserMentionDescription => + 'Notifies the user when they are directly mentioned in a message.'; + + @override + String get notificationRuleContainsDisplayName => 'Contains Display Name'; + + @override + String get notificationRuleContainsDisplayNameDescription => + 'Notifies the user when a message contains their display name.'; + + @override + String get notificationRuleIsRoomMention => 'Room Mention'; + + @override + String get notificationRuleIsRoomMentionDescription => + 'Notifies the user when there is a room mention.'; + + @override + String get notificationRuleRoomnotif => 'Room Notification'; + + @override + String get notificationRuleRoomnotifDescription => + 'Notifies the user when a message contains \'@room\'.'; + + @override + String get notificationRuleTombstone => 'Tombstone'; + + @override + String get notificationRuleTombstoneDescription => + 'Notifies the user about room deactivation messages.'; + + @override + String get notificationRuleReaction => 'Reaction'; + + @override + String get notificationRuleReactionDescription => + 'Suppresses notifications for reactions.'; + + @override + String get notificationRuleRoomServerAcl => 'Room Server ACL'; + + @override + String get notificationRuleRoomServerAclDescription => + 'Suppresses notifications for room server access control lists (ACL).'; + + @override + String get notificationRuleSuppressEdits => 'Suppress Edits'; + + @override + String get notificationRuleSuppressEditsDescription => + 'Suppresses notifications for edited messages.'; + + @override + String get notificationRuleCall => 'Call'; + + @override + String get notificationRuleCallDescription => + 'Notifies the user about calls.'; + + @override + String get notificationRuleEncryptedRoomOneToOne => + 'Encrypted Room One-to-One'; + + @override + String get notificationRuleEncryptedRoomOneToOneDescription => + 'Notifies the user about messages in encrypted one-to-one rooms.'; + + @override + String get notificationRuleRoomOneToOne => 'Room One-to-One'; + + @override + String get notificationRuleRoomOneToOneDescription => + 'Notifies the user about messages in one-to-one rooms.'; + + @override + String get notificationRuleMessage => 'Message'; + + @override + String get notificationRuleMessageDescription => + 'Notifies the user about general messages.'; + + @override + String get notificationRuleEncrypted => 'Encrypted'; + + @override + String get notificationRuleEncryptedDescription => + 'Notifies the user about messages in encrypted rooms.'; + + @override + String get notificationRuleJitsi => 'Jitsi'; + + @override + String get notificationRuleJitsiDescription => + 'Notifies the user about Jitsi widget events.'; + + @override + String get notificationRuleServerAcl => 'Suppress Server ACL Events'; + + @override + String get notificationRuleServerAclDescription => + 'Suppresses notifications for Server ACL events.'; + + @override + String unknownPushRule(String rule) { + return 'Unknown push rule \'$rule\''; + } + + @override + String get deletePushRuleCanNotBeUndone => + 'If you delete this notification setting, this can not be undone.'; + + @override + String get more => 'More'; + + @override + String get shareKeysWith => 'Share keys with...'; + + @override + String get shareKeysWithDescription => + 'Which devices should be trusted so that they can read along your messages in encrypted chats?'; + + @override + String get allDevices => 'All devices'; + + @override + String get crossVerifiedDevicesIfEnabled => + 'Cross verified devices if enabled'; + + @override + String get crossVerifiedDevices => 'Cross verified devices'; + + @override + String get verifiedDevicesOnly => 'Verified devices only'; + + @override + String get takeAPhoto => 'Take a photo'; + + @override + String get recordAVideo => 'Record a video'; + + @override + String get optionalMessage => '(Optional) message...'; + + @override + String get notSupportedOnThisDevice => 'Not supported on this device'; + + @override + String get enterNewChat => 'Enter new chat'; + + @override + String get approve => 'Approve'; + + @override + String get youHaveKnocked => 'You have knocked'; + + @override + String get pleaseWaitUntilInvited => + 'Please wait now, until someone from the room invites you.'; +} diff --git a/lib/generated/l10n/l10n_hu.dart b/lib/generated/l10n/l10n_hu.dart new file mode 100644 index 0000000..1ded382 --- /dev/null +++ b/lib/generated/l10n/l10n_hu.dart @@ -0,0 +1,2756 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'l10n.dart'; + +// ignore_for_file: type=lint + +/// The translations for Hungarian (`hu`). +class L10nHu extends L10n { + L10nHu([String locale = 'hu']) : super(locale); + + @override + String get noSendPermission => 'You can\'t send messages here'; + + @override + String get alwaysUse24HourFormat => 'true'; + + @override + String get repeatPassword => 'Jelszó megismétlése'; + + @override + String get notAnImage => 'Nem kép fájl.'; + + @override + String get setCustomPermissionLevel => 'Set custom permission level'; + + @override + String get setPermissionsLevelDescription => + 'Please choose a predefined role below or enter a custom permission level between 0 and 100.'; + + @override + String get ignoreUser => 'Ignore user'; + + @override + String get normalUser => 'Normal user'; + + @override + String get remove => 'Eltávolítás'; + + @override + String get importNow => 'Importálás most'; + + @override + String get importEmojis => 'Emojik importálása'; + + @override + String get importFromZipFile => 'Importálás zip fájlból'; + + @override + String get exportEmotePack => 'Emojik exportálása zip-be'; + + @override + String get replace => 'Kicserél'; + + @override + String get about => 'Névjegy'; + + @override + String aboutHomeserver(String homeserver) { + return 'About $homeserver'; + } + + @override + String get accept => 'Elfogadás'; + + @override + String acceptedTheInvitation(String username) { + return '👍 $username elfogadta a meghívást'; + } + + @override + String get account => 'Fiók'; + + @override + String activatedEndToEndEncryption(String username) { + return '🔐 $username aktiválta a végpontok közötti titkosítást'; + } + + @override + String get addEmail => 'E-mail-cím hozzáadása'; + + @override + String get confirmMatrixId => 'A fiók törléséhez adja meg a Matrix ID-t.'; + + @override + String supposedMxid(String mxid) { + return '$mxid-nek kell lennie'; + } + + @override + String get addChatDescription => 'Chat leírás hozzáadása...'; + + @override + String get addToSpace => 'Hozzáadás térhez'; + + @override + String get admin => 'Admin'; + + @override + String get alias => 'álnév'; + + @override + String get all => 'Összes'; + + @override + String get allChats => 'Összes csevegés'; + + @override + String get commandHint_roomupgrade => + 'Upgrade this room to the given room version'; + + @override + String get commandHint_googly => 'Gülüszemek küldése'; + + @override + String get commandHint_cuddle => 'Összebújás küldése'; + + @override + String get commandHint_hug => 'Ölelés küldése'; + + @override + String googlyEyesContent(String senderName) { + return '$senderName gülüszemeket küld'; + } + + @override + String cuddleContent(String senderName) { + return '$senderName hozzád bújik'; + } + + @override + String hugContent(String senderName) { + return '$senderName megölelt'; + } + + @override + String answeredTheCall(String senderName) { + return '$senderName felvette a hívást'; + } + + @override + String get anyoneCanJoin => 'Bárki csatlakozhat'; + + @override + String get appLock => 'Alkalmazás zár'; + + @override + String get appLockDescription => + 'Alkalmazás zárolása PIN-kód használat hiányában'; + + @override + String get archive => 'Archívum'; + + @override + String get areGuestsAllowedToJoin => 'Csatlakozhatnak-e vendégek'; + + @override + String get areYouSure => 'Biztos benne?'; + + @override + String get areYouSureYouWantToLogout => 'Biztosan kijelentkezik?'; + + @override + String get askSSSSSign => + 'A másik fél igazolásához meg kell adni a biztonságos tároló jelmondatát vagy a visszaállítási kulcsot.'; + + @override + String askVerificationRequest(String username) { + return 'Elfogadja $username hitelesítési kérelmét?'; + } + + @override + String get autoplayImages => + 'Animált matricák és hangulatjelek automatikus lejátszása'; + + @override + String badServerLoginTypesException(String serverVersions, + String supportedVersions, Object suportedVersions) { + return 'A kiszolgáló a következő bejelentkezéseket támogatja:\n$serverVersions\nDe ez az alkalmazást csak ezeket támogatja:\n$supportedVersions'; + } + + @override + String get sendTypingNotifications => 'Gépelési infó megjelenítése'; + + @override + String get swipeRightToLeftToReply => 'Húzza balra a válaszoláshoz'; + + @override + String get sendOnEnter => 'Küldés Enterrel'; + + @override + String badServerVersionsException(String serverVersions, + String supportedVersions, Object serverVerions, Object suportedVersions) { + return 'A Matrix szerver ezeket a specifikáció verziókat támogatja:\n$serverVersions\nAzonban ez az app csak ezeket: $supportedVersions'; + } + + @override + String countChatsAndCountParticipants(int chats, int participants) { + return '$chats csevegések és $participants résztvevők'; + } + + @override + String get noMoreChatsFound => 'Nincs több csevegés...'; + + @override + String get noChatsFoundHere => + 'Itt még nincs csevegés. Kezdjen újat valakivel a lentebbi gombbal. ⤵️'; + + @override + String get joinedChats => 'Csatlakozott csevegések'; + + @override + String get unread => 'Olvasatlan'; + + @override + String get space => 'Tér'; + + @override + String get spaces => 'Terek'; + + @override + String get banFromChat => 'Kitiltás csevegésből'; + + @override + String get banned => 'Kitiltva'; + + @override + String bannedUser(String username, String targetName) { + return '$username kitiltotta: $targetName'; + } + + @override + String get blockDevice => 'Eszköz blokkolása'; + + @override + String get blocked => 'Blokkolva'; + + @override + String get botMessages => 'Bot üzenetek'; + + @override + String get cancel => 'Mégse'; + + @override + String cantOpenUri(String uri) { + return 'Nem sikerült az URI megnyitása: $uri'; + } + + @override + String get changeDeviceName => 'Eszköznév módosítása'; + + @override + String changedTheChatAvatar(String username) { + return '$username módosította a csevegési profilképét'; + } + + @override + String changedTheChatDescriptionTo(String username, String description) { + return '$username módosította a csevegés leírását erre: \'$description\''; + } + + @override + String changedTheChatNameTo(String username, String chatname) { + return '$username módosította a csevegés nevét erre: \'$chatname\''; + } + + @override + String changedTheChatPermissions(String username) { + return '$username módosította a csevegési engedélyeket'; + } + + @override + String changedTheDisplaynameTo(String username, String displayname) { + return '$username módosította a megjelenített nevét erre: \'$displayname\''; + } + + @override + String changedTheGuestAccessRules(String username) { + return '$username módosította a vendégek hozzáférési szabályokat'; + } + + @override + String changedTheGuestAccessRulesTo(String username, String rules) { + return '$username módosította a vendégek hozzáférési szabályait erre: $rules'; + } + + @override + String changedTheHistoryVisibility(String username) { + return '$username módosította az előzmények láthatóságát'; + } + + @override + String changedTheHistoryVisibilityTo(String username, String rules) { + return '$username módosította az előzmények láthatóságát erre: $rules'; + } + + @override + String changedTheJoinRules(String username) { + return '$username módosított a csatlakozási szabályokat'; + } + + @override + String changedTheJoinRulesTo(String username, String joinRules) { + return '$username módosította a csatlakozási szabályokat erre: $joinRules'; + } + + @override + String changedTheProfileAvatar(String username) { + return '$username módosította a profilképét'; + } + + @override + String changedTheRoomAliases(String username) { + return '$username módosította a szoba álneveit'; + } + + @override + String changedTheRoomInvitationLink(String username) { + return '$username módosította a meghívó hivatkozást'; + } + + @override + String get changePassword => 'Jelszó módosítása'; + + @override + String get changeTheHomeserver => 'Matrix-kiszolgáló váltás'; + + @override + String get changeTheme => 'Stílus módosítása'; + + @override + String get changeTheNameOfTheGroup => 'Csoport nevének módosítása'; + + @override + String get changeYourAvatar => 'Profilkép módosítása'; + + @override + String get channelCorruptedDecryptError => 'A titkosítás megsérült'; + + @override + String get chat => 'Csevegés'; + + @override + String get yourChatBackupHasBeenSetUp => + 'A beszélgetések mentése be lett állítva.'; + + @override + String get chatBackup => 'Beszélgetések mentése'; + + @override + String get chatBackupDescription => + 'A régebbi beszélgetései egy biztonsági kulccsal vannak védve. Bizonyosodjon meg róla, hogy nem veszíti el.'; + + @override + String get chatDetails => 'Csevegés részletei'; + + @override + String get chatHasBeenAddedToThisSpace => + 'A beszélgetés hozzá lett adva ehhez a térhez'; + + @override + String get chats => 'Csevegések'; + + @override + String get chooseAStrongPassword => 'Válasszon egy erős jelszót'; + + @override + String get clearArchive => 'Archívum törlése'; + + @override + String get close => 'Bezárás'; + + @override + String get commandHint_markasdm => + 'Szoba megjelölése mint közvetlen csevegő szoba az adott Matrix ID-nél'; + + @override + String get commandHint_markasgroup => 'Csoportnak jelölés'; + + @override + String get commandHint_ban => 'Felhasználó kitiltása ebből a szobából'; + + @override + String get commandHint_clearcache => 'Gyorsítótár törlése'; + + @override + String get commandHint_create => + 'Egy üres csevegő csoport létrehozása\nA --no-encryption kapcsolóval titkosítatlan szoba hozható létre'; + + @override + String get commandHint_discardsession => 'Munkamenet elvetése'; + + @override + String get commandHint_dm => + 'Közvetlen csevegés indítása\nA --no-encryption kapcsolóval titkosítatlan beszélgetést hozhat létre'; + + @override + String get commandHint_html => 'HTML formázott üzenet küldése'; + + @override + String get commandHint_invite => 'Adott felhasználó meghívása ebbe a szobába'; + + @override + String get commandHint_join => 'Csatlakozás a megadott szobához'; + + @override + String get commandHint_kick => 'A megadott felhasználó kirúgása a szobából'; + + @override + String get commandHint_leave => 'Szoba elhagyása'; + + @override + String get commandHint_me => 'Jellemezd magad'; + + @override + String get commandHint_myroomavatar => + 'Az ebben a szobában megjelenített profilképed megváltoztatása (mxc URI használatával)'; + + @override + String get commandHint_myroomnick => + 'Az ebben a szobában megjelenített neved megváltoztatása'; + + @override + String get commandHint_op => + 'Az adott felhasználó hozzáférési szintjének megadása (alapértelmezett: 50)'; + + @override + String get commandHint_plain => 'Formázatlan szöveg küldése'; + + @override + String get commandHint_react => 'Válasz küldése reakcióként'; + + @override + String get commandHint_send => 'Szöveg küldése'; + + @override + String get commandHint_unban => + 'Adott felhasználó kitiltásának feloldása a szobához'; + + @override + String get commandInvalid => 'Érvénytelen parancs'; + + @override + String commandMissing(String command) { + return '$command nem egy parancs.'; + } + + @override + String get compareEmojiMatch => 'Hasonlítsa össze az emojikat'; + + @override + String get compareNumbersMatch => 'Kérem hasonlítsa össze a számokat'; + + @override + String get configureChat => 'Csevegés konfigurálása'; + + @override + String get confirm => 'Megerősítés'; + + @override + String get connect => 'Csatlakozás'; + + @override + String get contactHasBeenInvitedToTheGroup => + 'Meghívta ismerősét a csoportba'; + + @override + String get containsDisplayName => 'Tartalmazza a megjelenített nevet'; + + @override + String get containsUserName => 'Tartalmazza a felhasználónevet'; + + @override + String get contentHasBeenReported => + 'A tartalom jelentve lett a szerver üzemeltetőinek'; + + @override + String get copiedToClipboard => 'Vágólapra másolva'; + + @override + String get copy => 'Másolás'; + + @override + String get copyToClipboard => 'Vágólapra másolás'; + + @override + String couldNotDecryptMessage(String error) { + return 'Nem sikerült visszafejteni az üzenetet: $error'; + } + + @override + String countParticipants(int count) { + return '$count résztvevő'; + } + + @override + String get create => 'Létrehozás'; + + @override + String createdTheChat(String username) { + return '💬 $username csevegést hozott létre'; + } + + @override + String get createGroup => 'Csoport létrehozása'; + + @override + String get createNewSpace => 'Új tér'; + + @override + String get currentlyActive => 'Jelenleg aktív'; + + @override + String get darkTheme => 'Sötét'; + + @override + String dateAndTimeOfDay(String date, String timeOfDay) { + return '$date, $timeOfDay'; + } + + @override + String dateWithoutYear(String month, String day) { + return '$month. $day.'; + } + + @override + String dateWithYear(String year, String month, String day) { + return '$year. $month. $day.'; + } + + @override + String get deactivateAccountWarning => + 'Ez deaktiválja a felhasználói fiókját. Ez nem vonható vissza! Biztos benne?'; + + @override + String get defaultPermissionLevel => + 'Alapértelmezett hozzáférési szint új felhasználóknak'; + + @override + String get delete => 'Törlés'; + + @override + String get deleteAccount => 'Fiók törlése'; + + @override + String get deleteMessage => 'Üzenet törlése'; + + @override + String get device => 'Eszköz'; + + @override + String get deviceId => 'Eszköz ID'; + + @override + String get devices => 'Eszközök'; + + @override + String get directChats => 'Közvetlen csevegések'; + + @override + String get allRooms => 'Minden csoport csevegés'; + + @override + String get displaynameHasBeenChanged => 'Megjelenítési név megváltozott'; + + @override + String get downloadFile => 'Fájl letöltése'; + + @override + String get edit => 'Szerkeszt'; + + @override + String get editBlockedServers => 'Blokkolt szerverek szerkesztése'; + + @override + String get chatPermissions => 'Csevegés engedélyek'; + + @override + String get editDisplayname => 'Megjelenítési név szerkesztése'; + + @override + String get editRoomAliases => 'Szoba álnevek szerkesztése'; + + @override + String get editRoomAvatar => 'Szoba profilképének szerkesztése'; + + @override + String get emoteExists => 'A hangulatjel már létezik!'; + + @override + String get emoteInvalid => 'Érvénytelen emoji rövidkód!'; + + @override + String get emoteKeyboardNoRecents => + 'Nemrég használt emojik fognak itt megjelenni...'; + + @override + String get emotePacks => 'Emoji csomagok a szobához'; + + @override + String get emoteSettings => 'Emoji Beállítások'; + + @override + String get globalChatId => 'Globális csevegő azonosító'; + + @override + String get accessAndVisibility => 'Hozzáférés és láthatóság'; + + @override + String get accessAndVisibilityDescription => + 'Kinek engedélyezett a csevegéshez való csatlakozás és a csevegést hogyan lehet megtalálni.'; + + @override + String get calls => 'Hívások'; + + @override + String get customEmojisAndStickers => 'Egyedi emotikonok és matricák'; + + @override + String get customEmojisAndStickersBody => + 'Egyedi emotikonok és matricák létrehozása, amelyek bármely csevegésben használhatóak.'; + + @override + String get emoteShortcode => 'Emoji rövidkód'; + + @override + String get emoteWarnNeedToPick => + 'Az emojihoz egy képet és egy rövidkódot kell választani!'; + + @override + String get emptyChat => 'Üres csevegés'; + + @override + String get enableEmotesGlobally => 'Emoji csomag engedélyezése globálisan'; + + @override + String get enableEncryption => 'Titkosítás engedélyezése'; + + @override + String get enableEncryptionWarning => + 'Többé nem fogja tudni kikapcsolni a titkosítást. Biztos benne?'; + + @override + String get encrypted => 'Titkosított'; + + @override + String get encryption => 'Titkosítás'; + + @override + String get encryptionNotEnabled => 'Titkosítás nincs engedélyezve'; + + @override + String endedTheCall(String senderName) { + return '$senderName befejezte a hívást'; + } + + @override + String get enterAnEmailAddress => 'Adjon meg egy email címet'; + + @override + String get homeserver => 'Matrix szerver'; + + @override + String get enterYourHomeserver => 'Adja meg a Matrix-kiszolgálót'; + + @override + String errorObtainingLocation(String error) { + return 'Hiba a tartózkodási hely meghatározása közben: $error'; + } + + @override + String get everythingReady => 'Minden kész!'; + + @override + String get extremeOffensive => 'Rendkívül sértő'; + + @override + String get fileName => 'Fájlnév'; + + @override + String get fluffychat => 'FluffyChat'; + + @override + String get fontSize => 'Betűméret'; + + @override + String get forward => 'Továbbítás'; + + @override + String get fromJoining => 'Csatlakozás óta'; + + @override + String get fromTheInvitation => 'Meghívás óta'; + + @override + String get goToTheNewRoom => 'Új szoba megnyitása'; + + @override + String get group => 'Csoport'; + + @override + String get chatDescription => 'Csevegés leírás'; + + @override + String get chatDescriptionHasBeenChanged => 'Csevegés leírás megváltozott'; + + @override + String get groupIsPublic => 'A csoport nyilvános'; + + @override + String get groups => 'Csoportok'; + + @override + String groupWith(String displayname) { + return 'Csoport $displayname-al'; + } + + @override + String get guestsAreForbidden => 'Nem lehetnek vendégek'; + + @override + String get guestsCanJoin => 'Csatlakozhatnak vendégek'; + + @override + String hasWithdrawnTheInvitationFor(String username, String targetName) { + return '$username visszavonta $targetName meghívását'; + } + + @override + String get help => 'Súgó'; + + @override + String get hideRedactedEvents => 'Visszavont események elrejtése'; + + @override + String get hideRedactedMessages => 'Szerkesztett üzenetek elrejtése'; + + @override + String get hideRedactedMessagesBody => + 'Ha valaki szerkeszti az üzenetét, ez az üzenet nem jelenik meg a csevegés során.'; + + @override + String get hideInvalidOrUnknownMessageFormats => + 'Érvénytelen vagy ismeretlen üzenetformátum elrejtése'; + + @override + String get howOffensiveIsThisContent => 'Mennyire sértő ez a tartalom?'; + + @override + String get id => 'ID'; + + @override + String get identity => 'Azonosító'; + + @override + String get block => 'Blokkolás'; + + @override + String get blockedUsers => 'Blokkolt felhasználók'; + + @override + String get blockListDescription => + 'Az Önt zavaró felhasználókat blokkolhatja. A blokkolt listán található felhasználóktól nem tud fogadni üzenetet vagy szoba meghívást.'; + + @override + String get blockUsername => 'Felhasználónév mellőzése'; + + @override + String get iHaveClickedOnLink => 'Rákattintottam a linkre'; + + @override + String get incorrectPassphraseOrKey => + 'Hibás jelmondat vagy visszaállítási kulcs'; + + @override + String get inoffensive => 'Nem sértő'; + + @override + String get inviteContact => 'Ismerős meghívása'; + + @override + String inviteContactToGroupQuestion(Object contact, Object groupName) { + return 'Meg kívánja hívni $contact-ot a \"$groupName\" csevegő csoportba?'; + } + + @override + String inviteContactToGroup(String groupName) { + return 'Ismerős meghívása a(z) $groupName csoportba'; + } + + @override + String get noChatDescriptionYet => 'Még nincs csevegő szoba leírás.'; + + @override + String get tryAgain => 'Próbálja újra'; + + @override + String get invalidServerName => 'Hibás szerver név'; + + @override + String get invited => 'Meghívott'; + + @override + String get redactMessageDescription => + 'A társalgásban összes résztvevője számára módosításra kerül az üzenet. Ez nem visszavonható.'; + + @override + String get optionalRedactReason => '(Tetszőleges) A szerkesztés oka...'; + + @override + String invitedUser(String username, String targetName) { + return '📩 $username meghívta $targetName-t'; + } + + @override + String get invitedUsersOnly => 'Csak meghívott felhasználók'; + + @override + String get inviteForMe => 'Meghívás nekem'; + + @override + String inviteText(String username, String link) { + return '$username meghívott a FluffyChat-be.\n1. Keresse fel a fluffychat.im oldalt, és telepítse az alkalmazást \n2. Regisztráljon vagy jelentkezzen be \n3. Nyissa meg a meghívó linket: \n $link'; + } + + @override + String get isTyping => 'gépel…'; + + @override + String joinedTheChat(String username) { + return '👋 $username csatlakozott a csevegéshez'; + } + + @override + String get joinRoom => 'Csatlakozás a szobához'; + + @override + String kicked(String username, String targetName) { + return '👞 $username kirúgta $targetName-t'; + } + + @override + String kickedAndBanned(String username, String targetName) { + return '🙅 $username kirúgta és kitiltotta $targetName-t'; + } + + @override + String get kickFromChat => 'Kirúgás a csevegésből'; + + @override + String lastActiveAgo(String localizedTimeShort) { + return 'Utoljára aktív: $localizedTimeShort'; + } + + @override + String get leave => 'Elhagyás'; + + @override + String get leftTheChat => 'Elhagyta a csevegést'; + + @override + String get license => 'Licensz'; + + @override + String get lightTheme => 'Világos'; + + @override + String loadCountMoreParticipants(int count) { + return 'További $count résztvevő betöltése'; + } + + @override + String get dehydrate => 'Munkamenet exportálása és az eszköz törlése'; + + @override + String get dehydrateWarning => + 'Ez nem visszavonható. Bizonyosodjon meg róla, hogy biztonságos helyen tárolja a mentett fájlt.'; + + @override + String get dehydrateTor => 'TOR felhasználók: munkamenet exportálása'; + + @override + String get dehydrateTorLong => + 'TOR felhasználóknak ajánlott a munkamenet exportálása az ablak bezárása előtt.'; + + @override + String get hydrateTor => 'TOR felhasználóknak: munkamenet export importálása'; + + @override + String get hydrateTorLong => + 'Legutóbb TOR segítségével exportálta korábbi munkamenetét? Gyorsan importálja őket vissza, és folytassa a csevegést.'; + + @override + String get hydrate => 'Visszaállítás mentett fájlból'; + + @override + String get loadingPleaseWait => 'Betöltés… Kérem, várjon.'; + + @override + String get loadMore => 'Továbbiak betöltése…'; + + @override + String get locationDisabledNotice => + 'A helymeghatározás ki van kapcsolva. Kérem, kapcsolja be, hogy meg tudja osztani helyzetét.'; + + @override + String get locationPermissionDeniedNotice => + 'A helymeghatározás nem engedélyezett az alkalmazás számára. Kérem engedélyezze, hogy meg tudja osztani helyzetét.'; + + @override + String get login => 'Bejelentkezés'; + + @override + String logInTo(String homeserver) { + return 'Bejelentkezés a(z) $homeserver Matrix-kiszolgálóra'; + } + + @override + String get logout => 'Kijelentkezés'; + + @override + String get memberChanges => 'Tagsági változások'; + + @override + String get mention => 'Megemlítés'; + + @override + String get messages => 'Üzenetek'; + + @override + String get messagesStyle => 'Üzenetek:'; + + @override + String get moderator => 'Moderátor'; + + @override + String get muteChat => 'Csevegés némítása'; + + @override + String get needPantalaimonWarning => + 'Jelenleg a Pantalaimon szükséges a végpontok közötti titkosítás használatához.'; + + @override + String get newChat => 'Új csevegés'; + + @override + String get newMessageInFluffyChat => '💬 Új FluffyChat üzenet'; + + @override + String get newVerificationRequest => 'Új hitelesítési kérelem!'; + + @override + String get next => 'Következő'; + + @override + String get no => 'Nem'; + + @override + String get noConnectionToTheServer => 'Nem elérhető a szerver'; + + @override + String get noEmotesFound => 'Emojik nem elérhetőek. 😕'; + + @override + String get noEncryptionForPublicRooms => + 'Csak akkor kapcsolható be a titkosítás, ha a szoba nem nyilvánosan hozzáférhető.'; + + @override + String get noGoogleServicesWarning => + 'Úgy tűnik a Firebase Cloud Messaging nem elérhető a készülékén. Ha mégis push értesítéseket kíván kapni, javasoljuk a ntfy telepítését. A ntfy vagy más egyéb Egyesített Push szolgáltató esetében úgy kaphat értesítést, hogy adatai biztonságban maradnak. Letöltheti a ntfy-t a PLayStore-ból, vagy F-Droid-ról is.'; + + @override + String noMatrixServer(String server1, String server2) { + return '$server1 nem egy Matrix szerver, használja a $server2 szervert inkább?'; + } + + @override + String get shareInviteLink => 'Meghívó link megosztása'; + + @override + String get scanQrCode => 'QR kód beolvasása'; + + @override + String get none => 'Nincs'; + + @override + String get noPasswordRecoveryDescription => + 'Még nem adott meg semmilyen módot a jelszava visszaállítására.'; + + @override + String get noPermission => 'Nincs engedély'; + + @override + String get noRoomsFound => 'Nem találhatóak szobák…'; + + @override + String get notifications => 'Értesítések'; + + @override + String get notificationsEnabledForThisAccount => + 'Értesítések bekapcsolása ebben a fiókban'; + + @override + String numUsersTyping(int count) { + return '$count felhasználó gépel…'; + } + + @override + String get obtainingLocation => 'Tartózkodási hely lekérése…'; + + @override + String get offensive => 'Sértő'; + + @override + String get offline => 'Offline'; + + @override + String get ok => 'Rendben'; + + @override + String get online => 'Online'; + + @override + String get onlineKeyBackupEnabled => 'Online kulcsmentés engedélyezve'; + + @override + String get oopsPushError => + 'Hoppá! Sajnos hiba lépett fel a push értesítések beállításakor.'; + + @override + String get oopsSomethingWentWrong => 'Hoppá, valami hiba lépett fel…'; + + @override + String get openAppToReadMessages => + 'Alkalmazás megnyitása az üzenetek elolvasásához'; + + @override + String get openCamera => 'Kamera megnyitása'; + + @override + String get openVideoCamera => 'Kamera megnyitása videóhoz'; + + @override + String get oneClientLoggedOut => 'Az egyik kliense kijelentkezett'; + + @override + String get addAccount => 'Fiók hozzáadása'; + + @override + String get editBundlesForAccount => + 'Fiókcsoportok szerkesztése ehhez a fiókhoz'; + + @override + String get addToBundle => 'Hozzáadás fiókcsoporthoz'; + + @override + String get removeFromBundle => 'Eltávolítás a fiókcsoportból'; + + @override + String get bundleName => 'Fiókcsoport neve'; + + @override + String get enableMultiAccounts => '(BÉTA) Több fiók bekapcsolása az eszközön'; + + @override + String get openInMaps => 'Megnyitás térképen'; + + @override + String get link => 'Hivatkozás'; + + @override + String get serverRequiresEmail => + 'Ehhez a szerverhez szükséges az email címének visszaigazolása.'; + + @override + String get or => 'Vagy'; + + @override + String get participant => 'Résztvevő'; + + @override + String get passphraseOrKey => 'jelmondat vagy visszaállítási kulcs'; + + @override + String get password => 'Jelszó'; + + @override + String get passwordForgotten => 'Elfelejtett jelszó'; + + @override + String get passwordHasBeenChanged => 'A jelszó módosításra került'; + + @override + String get hideMemberChangesInPublicChats => + 'Tag változások elrejtése a publikus csevegésben'; + + @override + String get hideMemberChangesInPublicChatsBody => + 'Ne mutassa ha valaki be- vagy kilép a csevegésből az olvashatóság javítása végett.'; + + @override + String get overview => 'Áttekintés'; + + @override + String get notifyMeFor => 'Értesítsen engem'; + + @override + String get passwordRecoverySettings => 'Jelszó-helyreállítási beállítások'; + + @override + String get passwordRecovery => 'Jelszó visszaállítás'; + + @override + String get people => 'Emberek'; + + @override + String get pickImage => 'Kép választása'; + + @override + String get pin => 'Rögzítés'; + + @override + String play(String fileName) { + return '$fileName lejátszása'; + } + + @override + String get pleaseChoose => 'Kérjük válasszon'; + + @override + String get pleaseChooseAPasscode => 'Kérem válasszon egy kódot'; + + @override + String get pleaseClickOnLink => + 'Kérem kattintson a linkre az emailben, és folytassa a műveletet.'; + + @override + String get pleaseEnter4Digits => + 'Írjon be 4 számjegyet, vagy hagyja üresen a zár kikapcsolásához.'; + + @override + String get pleaseEnterRecoveryKey => 'Kérem adja meg a visszaállító kódját:'; + + @override + String get pleaseEnterYourPassword => 'Kérem adja meg jelszavát'; + + @override + String get pleaseEnterYourPin => 'Írja be PIN kódját'; + + @override + String get pleaseEnterYourUsername => 'Adja meg a felhasználónevét'; + + @override + String get pleaseFollowInstructionsOnWeb => + 'Kérem kövesse az instrukciókat az oldalon, és nyomjon a tovább gombra.'; + + @override + String get privacy => 'Adatvédelem'; + + @override + String get publicRooms => 'Nyilvános szobák'; + + @override + String get pushRules => 'Push szabályok'; + + @override + String get reason => 'Indok'; + + @override + String get recording => 'Felvétel'; + + @override + String redactedBy(String username) { + return '$username által szerkesztve'; + } + + @override + String get directChat => 'Közvetlen csevegés'; + + @override + String redactedByBecause(String username, String reason) { + return '$username által szerkesztve, mivel: \"$reason\"'; + } + + @override + String redactedAnEvent(String username) { + return '$username visszavont egy eseményt'; + } + + @override + String get redactMessage => 'Üzenet visszavonása'; + + @override + String get register => 'Regisztráció'; + + @override + String get reject => 'Elutasít'; + + @override + String rejectedTheInvitation(String username) { + return '$username elutasította a meghívást'; + } + + @override + String get rejoin => 'Újra csatlakozás'; + + @override + String get removeAllOtherDevices => 'Minden más eszköz eltávolítása'; + + @override + String removedBy(String username) { + return '$username által törölve'; + } + + @override + String get removeDevice => 'Eszköz eltávolítása'; + + @override + String get unbanFromChat => 'Csevegés kitiltás feloldása'; + + @override + String get removeYourAvatar => 'Profilkép törlése'; + + @override + String get replaceRoomWithNewerVersion => + 'Szoba cserélése egy újabb verzióra'; + + @override + String get reply => 'Válasz'; + + @override + String get reportMessage => 'Üzenet jelentése'; + + @override + String get translateMessage => 'Translate message'; + + @override + String get translatedMessage => 'Translated message'; + + @override + String get errorTranslatingMessage => + 'An error has occured while translating the message.'; + + @override + String get recoverMessage => 'Recover message'; + + @override + String get recoveredMessage => 'Recovered message'; + + @override + String get errorRecoveringMessage => + 'An error has occured while recovering the message.'; + + @override + String get errorRecoveringMessageNoAdmin => + 'This feature is available on Synapse homeservers only for adminstrators.'; + + @override + String get requestPermission => 'Jogosultság igénylése'; + + @override + String get roomHasBeenUpgraded => 'A szoba frissítve lett'; + + @override + String get roomVersion => 'Szoba verzió'; + + @override + String get saveFile => 'Fájl mentése'; + + @override + String get retry => 'Retry'; + + @override + String get search => 'Keresés'; + + @override + String get security => 'Biztonság'; + + @override + String get recoveryKey => 'Visszaállító kulcs'; + + @override + String get recoveryKeyLost => 'Elveszett visszaállító kulcs?'; + + @override + String seenByUser(String username) { + return '$username látta'; + } + + @override + String get send => 'Küldés'; + + @override + String get sendAMessage => 'Üzenet küldése'; + + @override + String get sendAsText => 'Szövegként küldés'; + + @override + String get sendAudio => 'Hangüzenet küldése'; + + @override + String get sendFile => 'Fájl küldése'; + + @override + String get sendImage => 'Kép küldése'; + + @override + String sendImages(int count) { + return 'Send $count image'; + } + + @override + String get sendMessages => 'Üzenetek küldése'; + + @override + String get sendOriginal => 'Eredeti küldése'; + + @override + String get sendSticker => 'Matrica küldése'; + + @override + String get sendVideo => 'Videó küldése'; + + @override + String sentAFile(String username) { + return '📁 $username küldött egy fájlt'; + } + + @override + String sentAnAudio(String username) { + return '🎤 $username hangüzenetet küldött'; + } + + @override + String sentAPicture(String username) { + return '🖼️ $username képüzenetet küldött'; + } + + @override + String sentASticker(String username) { + return '😊 $username matricát küldött'; + } + + @override + String sentAVideo(String username) { + return '🎥 $username videót küldött'; + } + + @override + String sentCallInformations(String senderName) { + return '$senderName hívásinformációt küldött'; + } + + @override + String get separateChatTypes => + 'Csoportok és közvetlen üzenetek elkülönítése'; + + @override + String get setAsCanonicalAlias => 'Beállítás mint alapértelmezett álnév'; + + @override + String get setCustomEmotes => 'Egyéni emojik beállítása'; + + @override + String get setChatDescription => 'Csevegés leírás beállítása'; + + @override + String get setInvitationLink => 'Meghívó hivatkozás beállítása'; + + @override + String get setPermissionsLevel => 'Jogok beállítása'; + + @override + String get setStatus => 'Állapot beállítása'; + + @override + String get settings => 'Beállítások'; + + @override + String get share => 'Megosztás'; + + @override + String sharedTheLocation(String username) { + return '$username megosztotta a pozícióját'; + } + + @override + String get shareLocation => 'Pozíció megosztása'; + + @override + String get showPassword => 'Jelszó mutatása'; + + @override + String get presenceStyle => 'Jelenlét:'; + + @override + String get hideAvatarsInInvites => 'Hide avatars in invites'; + + @override + String get hideAvatarsInInvitesDescription => + 'Do not show room avatars in invites'; + + @override + String get presencesToggle => 'Mások státusz üzenetének megjelenítése'; + + @override + String get pureBlackToggle => 'Pure Black'; + + @override + String get singlesignon => 'Egyszeri bejelentkezés'; + + @override + String get skip => 'Kihagyás'; + + @override + String get sourceCode => 'Forráskód'; + + @override + String get spaceIsPublic => 'A tér publikus'; + + @override + String get spaceName => 'Tér neve'; + + @override + String startedACall(String senderName) { + return '$senderName hívást indított'; + } + + @override + String get startFirstChat => 'Kezdje meg első csevegését'; + + @override + String get status => 'Státusz'; + + @override + String get statusExampleMessage => 'Hogy érzi ma magát?'; + + @override + String get submit => 'Beküldés'; + + @override + String get synchronizingPleaseWait => 'Szinkronizálás...kérem várjon.'; + + @override + String synchronizingPleaseWaitCounter(String percentage) { + return ' Synchronizing… ($percentage%)'; + } + + @override + String get systemTheme => 'Rendszer'; + + @override + String get theyDontMatch => 'Nem egyeznek'; + + @override + String get theyMatch => 'Egyeznek'; + + @override + String get title => 'FluffyChat'; + + @override + String get toggleFavorite => 'Kedvencek mutatása'; + + @override + String get toggleMuted => 'Némítottak mutatása'; + + @override + String get toggleUnread => 'Jelölés olvasottként/olvasatlanként'; + + @override + String get tooManyRequestsWarning => + 'Túl sok egyidejű kérelem. Kérem próbálja meg később!'; + + @override + String get transferFromAnotherDevice => 'Másik eszközről való átköltözés'; + + @override + String get tryToSendAgain => 'Újraküldés megpróbálása'; + + @override + String get unavailable => 'Nem elérhető'; + + @override + String unbannedUser(String username, String targetName) { + return '$username feloldotta $targetName kitiltását'; + } + + @override + String get unblockDevice => 'Eszköz blokkolásának megszüntetése'; + + @override + String get unknownDevice => 'Ismeretlen eszköz'; + + @override + String get unknownEncryptionAlgorithm => 'Ismeretlen titkosítási algoritmus'; + + @override + String unknownEvent(String type) { + return 'Ismeretlen esemény: \'$type\''; + } + + @override + String get unmuteChat => 'Csevegés némítás feloldása'; + + @override + String get unpin => 'Rögzítés megszüntetése'; + + @override + String unreadChats(int unreadCount) { + String _temp0 = intl.Intl.pluralLogic( + unreadCount, + locale: localeName, + other: '$unreadCount olvasatlan csevegés', + one: '1 olvasatlan csevegés', + ); + return '$_temp0'; + } + + @override + String userAndOthersAreTyping(String username, int count) { + return '$username és $count másik résztvevő gépel…'; + } + + @override + String userAndUserAreTyping(String username, String username2) { + return '$username és $username2 gépel…'; + } + + @override + String userIsTyping(String username) { + return '$username gépel…'; + } + + @override + String userLeftTheChat(String username) { + return '🚪 $username elhagyta a csevegést'; + } + + @override + String get username => 'Felhasználónév'; + + @override + String userSentUnknownEvent(String username, String type) { + return '$username $type eseményt küldött'; + } + + @override + String get unverified => 'Nem visszaigazolt'; + + @override + String get verified => 'Visszaigazolt'; + + @override + String get verify => 'Hitelesít'; + + @override + String get verifyStart => 'Hitelesítés megkezdése'; + + @override + String get verifySuccess => 'Sikeres hitelesítés!'; + + @override + String get verifyTitle => 'Másik fiók hitelesítése'; + + @override + String get videoCall => 'Videóhívás'; + + @override + String get visibilityOfTheChatHistory => 'Csevegési előzmény láthatósága'; + + @override + String get visibleForAllParticipants => 'Minden résztvevő számára látható'; + + @override + String get visibleForEveryone => 'Bárki számára látható'; + + @override + String get voiceMessage => 'Hangüzenet'; + + @override + String get waitingPartnerAcceptRequest => + 'Várakozás a partnerre, hogy elfogadja a kérést…'; + + @override + String get waitingPartnerEmoji => + 'Várakozás a partnerre, hogy elfogadja az emojit…'; + + @override + String get waitingPartnerNumbers => + 'Várakozás a partnerre, hogy elfogadja a számokat…'; + + @override + String get wallpaper => 'Háttér:'; + + @override + String get warning => 'Figyelmeztetés!'; + + @override + String get weSentYouAnEmail => 'Küldtünk Önnek egy emailt'; + + @override + String get whoCanPerformWhichAction => 'Ki milyen műveletet végezhet'; + + @override + String get whoIsAllowedToJoinThisGroup => 'Ki csatlakozhat a csoporthoz'; + + @override + String get whyDoYouWantToReportThis => 'Miért kívánja ezt bejelenteni?'; + + @override + String get wipeChatBackup => + 'Le kívánja törölni a chat mentését, hogy létrehozhasson egy új visszaállítási kulcsot?'; + + @override + String get withTheseAddressesRecoveryDescription => + 'Ezekkel a címekkel vissza tudja állítani a jelszavát.'; + + @override + String get writeAMessage => 'Írjon egy üzenetet…'; + + @override + String get yes => 'Igen'; + + @override + String get you => 'Ön'; + + @override + String get youAreNoLongerParticipatingInThisChat => + 'Immáron nem vesz részt ebben a csevegésben'; + + @override + String get youHaveBeenBannedFromThisChat => 'Kitiltották ebből a csevegésből'; + + @override + String get yourPublicKey => 'A publikus kulcsa'; + + @override + String get messageInfo => 'Üzenet információ'; + + @override + String get time => 'Idő'; + + @override + String get messageType => 'Üzenet típus'; + + @override + String get sender => 'Küldő'; + + @override + String get openGallery => 'Galéria megnyitása'; + + @override + String get removeFromSpace => 'Eltávolítás a térről'; + + @override + String get addToSpaceDescription => + 'Válassza ki melyik térhez kívánja hozzáadni a csevegést.'; + + @override + String get start => 'Kezdés'; + + @override + String get pleaseEnterRecoveryKeyDescription => + 'A régi üzenetei feloldásához adja meg a korábban generált visszaállítási jelszavát. A visszaállítási jelszó NEM UGYANAZ mint a jelszó.'; + + @override + String get publish => 'Közzététel'; + + @override + String videoWithSize(String size) { + return 'Videó ($size)'; + } + + @override + String get openChat => 'Csevegés megnyitása'; + + @override + String get markAsRead => 'Olvasottként megjelölés'; + + @override + String get reportUser => 'Felhasználó jelentése'; + + @override + String get dismiss => 'Elvetés'; + + @override + String reactedWith(String sender, String reaction) { + return '$sender a következőt reagálta: $reaction'; + } + + @override + String get pinMessage => 'Kitűzés a szobában'; + + @override + String get confirmEventUnpin => + 'Biztosan végleg le akarja venni a kitűzött eseményt?'; + + @override + String get emojis => 'Emojik'; + + @override + String get placeCall => 'Tér hívás'; + + @override + String get voiceCall => 'Hang hívás'; + + @override + String get unsupportedAndroidVersion => 'Nem támogatott Android verzió'; + + @override + String get unsupportedAndroidVersionLong => + 'Ehhez a funkcióhoz egy újabb Android verzió kell. Kérem ellenőrizze be van e frissítve teljesen készüléke, esetlegesen van e LineageOS támogatás hozzá.'; + + @override + String get videoCallsBetaWarning => + 'Kérem vegye figyelembe, hogy a videó hívások jelenleg béta fázisban vannak. Nem biztos, hogy megfelelően fognak működni, vagy egyáltalán elindulnak egyes platformokon.'; + + @override + String get experimentalVideoCalls => 'Kísérleti videó hívások'; + + @override + String get emailOrUsername => 'Email vagy felhasználónév'; + + @override + String get indexedDbErrorTitle => 'Privát mód problémák'; + + @override + String get indexedDbErrorLong => + 'Sajnos az üzenet mentés alapból nincs bekapcsolva privát módban.\nKeresse meg a\n - about:config\n - állítsa a dom.indexedDB.privateBrowsing.enabled \"true\"-ra\nMáskülönben nem lehetséges a FluffyChat futtatása.'; + + @override + String switchToAccount(String number) { + return 'A $number számú fiókra váltás'; + } + + @override + String get nextAccount => 'Következő fiók'; + + @override + String get previousAccount => 'Előző fiók'; + + @override + String get addWidget => 'Widget hozzáadása'; + + @override + String get widgetVideo => 'Videó'; + + @override + String get widgetEtherpad => 'Szöveges megjegyzés'; + + @override + String get widgetJitsi => 'Jitsi Találkozó'; + + @override + String get widgetCustom => 'Egyéni'; + + @override + String get widgetName => 'Név'; + + @override + String get widgetUrlError => 'Ez nem egy valós cím.'; + + @override + String get widgetNameError => 'Kérem adjon meg egy megjeleníthető nevet.'; + + @override + String get errorAddingWidget => 'Hiba lépett fel a widget hozzáadásánál.'; + + @override + String get youRejectedTheInvitation => 'Visszautasította a meghívást'; + + @override + String get youJoinedTheChat => 'Becsatlakozott a csevegésbe'; + + @override + String get youAcceptedTheInvitation => '👍 Elfogadta a meghívást'; + + @override + String youBannedUser(String user) { + return 'Letitotta $user-t'; + } + + @override + String youHaveWithdrawnTheInvitationFor(String user) { + return 'Visszavonta a meghívást $user-tól'; + } + + @override + String youInvitedToBy(String alias) { + return '📩 Meghívást kapott linken keresztül a következőhöz:\n$alias'; + } + + @override + String youInvitedBy(String user) { + return '📩 Meghívást kapott $user-tól'; + } + + @override + String invitedBy(String user) { + return '📩 Meghívva $user által'; + } + + @override + String youInvitedUser(String user) { + return '📩 Meghívta $user-t'; + } + + @override + String youKicked(String user) { + return '👞 Kirúgta $user-t'; + } + + @override + String youKickedAndBanned(String user) { + return '🙅 Kirúgta és kitiltotta $user-t'; + } + + @override + String youUnbannedUser(String user) { + return 'Levette a letiltást $user-ről'; + } + + @override + String hasKnocked(String user) { + return '🚪 $user bekopogott'; + } + + @override + String get usersMustKnock => 'A felhasználóknak be kell kopogniuk'; + + @override + String get noOneCanJoin => 'Senki sem csatlakozhat'; + + @override + String userWouldLikeToChangeTheChat(String user) { + return '$user szeretne csatlakozni a csevegéshez.'; + } + + @override + String get noPublicLinkHasBeenCreatedYet => + 'Még nem lett létrehozva nyilvános link'; + + @override + String get knock => 'Kopogás'; + + @override + String get users => 'Felhasználók'; + + @override + String get unlockOldMessages => 'Régi üzenetek feloldása'; + + @override + String get storeInSecureStorageDescription => + 'Tárolja a visszaállítási kulcsot az eszköz biztonsági tárjában.'; + + @override + String get saveKeyManuallyDescription => + 'A kulcs manuális mentése rendszer megosztás vagy vágólap másolás segítségével.'; + + @override + String get storeInAndroidKeystore => 'Tárolás az Android KeyStore-ba'; + + @override + String get storeInAppleKeyChain => 'Tárolás az Apple KeyChain-be'; + + @override + String get storeSecurlyOnThisDevice => 'Biztonságos tárolás az eszközön'; + + @override + String countFiles(int count) { + return '$count fájl'; + } + + @override + String get user => 'Felhasználó'; + + @override + String get custom => 'Egyéni'; + + @override + String get foregroundServiceRunning => + 'Ez az értesítés akkor jelenik meg ha az előtéri szolgáltatás fut.'; + + @override + String get screenSharingTitle => 'képernyő megosztás'; + + @override + String get screenSharingDetail => 'Megosztja a képernyőjét a FluffyChat-ben'; + + @override + String get callingPermissions => 'Hívási engedélyek'; + + @override + String get callingAccount => 'Hívási fiók'; + + @override + String get callingAccountDetails => + 'Engedélyezés a FluffyChat számára hogy használja a natív android hívás applikációt.'; + + @override + String get appearOnTop => 'Mindig legfelül jelenik meg'; + + @override + String get appearOnTopDetails => + 'Engedélyezi az app számára, hogy mindig legfelül jelenjen meg (nem szükséges, ha a FluffyChat hívó fiókként lett beállítva)'; + + @override + String get otherCallingPermissions => + 'Mikrofon, kamera, és más egyéb FluffyChat engedélyek'; + + @override + String get whyIsThisMessageEncrypted => 'Miért nem olvasható ez az üzenet?'; + + @override + String get noKeyForThisMessage => + 'Akkor fordulhat elő, ha az üzenet az eszközre való bejelentkezés előtt került küldésre.\n\nAz is elképzelhető, hogy a küldő blokkolta az eszközét, vagy valami probléma lépett fel az internet kapcsolatban.\n\nMás helyen látja az üzenetet? Akkor át tudja másolni ide is! Menjen a Beállítások > Eszközök részbe, és győződjön meg róla, hogy az eszközei megerősítették egymást. Legközelebb amikor ezt a szobát megnyitja, és mind a két kliens az előtérben van, akkor szikronizálódni fognak.\n\nNem akarja elveszíteni a kulcsokat amikor kijelentkezik, vagy eszközt cserél? Győződjön meg róla, hogy bekapcsolta a chat mentést a beállításokban.'; + + @override + String get newGroup => 'Új csoport'; + + @override + String get newSpace => 'Új tér'; + + @override + String get enterSpace => 'Belépés a térre'; + + @override + String get enterRoom => 'Belépés a szobába'; + + @override + String get allSpaces => 'Minden tér'; + + @override + String numChats(String number) { + return '$number csevegés'; + } + + @override + String get hideUnimportantStateEvents => + 'Jelentéktelen esemény státuszok elrejtése'; + + @override + String get hidePresences => 'El kívánja menteni a státusz listát?'; + + @override + String get doNotShowAgain => 'Ne mutassa újra'; + + @override + String wasDirectChatDisplayName(String oldDisplayName) { + return 'Üres csevegés (korábban $oldDisplayName)'; + } + + @override + String get newSpaceDescription => + 'A terek lehetővé teszik a csevegések konszolidációját, ezáltal létrehozva publikus vagy privát közösségeket.'; + + @override + String get encryptThisChat => 'A csevegés titkosítása'; + + @override + String get disableEncryptionWarning => + 'Biztonsági okokból nem kapcsolható ki egy korábban bekapcsolt csevegés titkosítás.'; + + @override + String get sorryThatsNotPossible => 'Ez sajnos nem lehetséges'; + + @override + String get deviceKeys => 'Eszköz kulcsok:'; + + @override + String get reopenChat => 'Csevegés újranyitása'; + + @override + String get noBackupWarning => + 'Figyelem! Ha nem kapcsolja be a csevegés mentést, elveszíti a hozzáférést a tikosított üzeneteihez. Erősen ajánlott a csevegés mentés bekapcsolása kijelentkezés előtt.'; + + @override + String get noOtherDevicesFound => 'Nem található más eszköz'; + + @override + String fileIsTooBigForServer(String max) { + return 'A szerver számára túl nagy a fájl a küldéshez.'; + } + + @override + String fileHasBeenSavedAt(String path) { + return 'A fájl mentésre került a következő elérési úton $path'; + } + + @override + String get jumpToLastReadMessage => 'Az utoljára olvasott üzenethez ugrás'; + + @override + String get readUpToHere => 'Ezidáig elolvasva'; + + @override + String get jump => 'Ugrás'; + + @override + String get openLinkInBrowser => 'Hivatkozás megnyitása böngészőben'; + + @override + String get reportErrorDescription => + '😭 Sajnos valami félresiklott. Ha kívánja jelezheti a bugot a fejlesztőknek.'; + + @override + String get report => 'bejelentés'; + + @override + String get signInWithPassword => 'Bejelentkezés jelszóval'; + + @override + String get pleaseTryAgainLaterOrChooseDifferentServer => + 'Próbálja meg máskor, vagy válasszon másik szervert.'; + + @override + String signInWith(String provider) { + return 'Bejelentkezés a következővel: $provider'; + } + + @override + String get profileNotFound => + 'A felhasználó nem található a szerveren. Lehetséges, hogy csatlakozási problémák adódtak, vagy nem létezik a felhasználó.'; + + @override + String get setTheme => 'Téma beállítása:'; + + @override + String get setColorTheme => 'Szín téma beállítása:'; + + @override + String get invite => 'Meghívás'; + + @override + String get inviteGroupChat => '📨 Meghívó a csoportba'; + + @override + String get invitePrivateChat => '📨 Meghívó csevegéshez'; + + @override + String get invalidInput => 'Hibás bevitel!'; + + @override + String wrongPinEntered(int seconds) { + return 'Hibás pinkód került beírásra. Próbálja újra $seconds mp múlva...'; + } + + @override + String get pleaseEnterANumber => 'Adjon meg egy 0-nál nagyobb számot'; + + @override + String get archiveRoomDescription => + 'A csevegés bekerül az archívumba. Más felhasználók látni fogják, hogy elhagyta a csevegést.'; + + @override + String get roomUpgradeDescription => + 'A csevegés újra elkészül az új verzióval. Minden résztvevő értesítést kap, hogy át kell állniuk az új csevegésre. További információkért a szoba verziókról látogasson el a https://spec.matrix.org/latest/rooms/ címre'; + + @override + String get removeDevicesDescription => + 'Ki fog jelentkezni a készülékről, és többi nem fog tudni fogadni üzeneteket.'; + + @override + String get banUserDescription => + 'A felhasználó kitiltásra kerül a csevegésből, és nem fog tudni visszajönni egészen a kitiltás feloldásáig.'; + + @override + String get unbanUserDescription => + 'A felhasználó vissza tud jönni a csevegésbe ha akar.'; + + @override + String get kickUserDescription => + 'A felhasználó kirúgásra került a csevegésből, de nincs kitiltva. Publikus csevegés esetén a felhasználó bármikor visszatérhet.'; + + @override + String get makeAdminDescription => + 'Miután a felhasználóból admin lesz, nem fogja tudni visszavonni döntését, mivel azonos jogosultsági szinttel fognak rendelkezni.'; + + @override + String get pushNotificationsNotAvailable => 'Push értesítések nem elérhetőek'; + + @override + String get learnMore => 'Tudjon meg többet'; + + @override + String get yourGlobalUserIdIs => 'A globális felhasználó-ID-je: '; + + @override + String noUsersFoundWithQuery(String query) { + return '\"$query\" néven nem található felhasználó. Ellenőrizze nincs e elírás.'; + } + + @override + String get knocking => 'Bekopogás'; + + @override + String chatCanBeDiscoveredViaSearchOnServer(String server) { + return 'Csevegés felfedezhető a $server szerveren történő kereséssel'; + } + + @override + String get searchChatsRooms => 'Keressen #csevegéseket, @felhasználókat...'; + + @override + String get nothingFound => 'Nincs találat...'; + + @override + String get groupName => 'Csoport név'; + + @override + String get createGroupAndInviteUsers => + 'Hozzon létre egy csoportot és hívjon meg felhasználókat'; + + @override + String get groupCanBeFoundViaSearch => + 'Kereséssel megtalálhatja a kívánt csoportot'; + + @override + String get wrongRecoveryKey => + 'Sajnos, úgy tűnik hibásan adta meg a visszaállítási kulcsot.'; + + @override + String get startConversation => 'Beszélgetés indítása'; + + @override + String get commandHint_sendraw => 'Tiszta json küldése'; + + @override + String get databaseMigrationTitle => 'Adatbázis optimalizálása'; + + @override + String get databaseMigrationBody => + 'Kérem várjon. Ez igénybe vehet valamennyi időt.'; + + @override + String get leaveEmptyToClearStatus => 'Hagyja üresen a státusz kitörléséhez.'; + + @override + String get select => 'Kiválaszt'; + + @override + String get searchForUsers => 'Keressen @felhasználókat...'; + + @override + String get pleaseEnterYourCurrentPassword => + 'Kérem adja meg jelenlegi jelszavát'; + + @override + String get newPassword => 'Új jelszó'; + + @override + String get pleaseChooseAStrongPassword => 'Kérem válasszon egy erős jelszót'; + + @override + String get passwordsDoNotMatch => 'A jelszavak nem egyeznek'; + + @override + String get passwordIsWrong => 'A beírt jelszava hibás'; + + @override + String get publicLink => 'Nyilvános hivatkozás'; + + @override + String get publicChatAddresses => 'Nyilvános csevegés címek'; + + @override + String get createNewAddress => 'Új cím létrehozása'; + + @override + String get joinSpace => 'Csatlakozás a térre'; + + @override + String get publicSpaces => 'Nyilvános terek'; + + @override + String get addChatOrSubSpace => 'Csevegés vagy al-tér hozzáadása'; + + @override + String get subspace => 'Al-tér'; + + @override + String get decline => 'Elutasítás'; + + @override + String get thisDevice => 'Ez az eszköz:'; + + @override + String get initAppError => 'Hiba lépett fel az app indítása során'; + + @override + String get userRole => 'Felhasználói szerep'; + + @override + String minimumPowerLevel(String level) { + return '$level a minimum szint.'; + } + + @override + String searchIn(String chat) { + return 'Keresés a csevegésben \"$chat\"...'; + } + + @override + String get searchMore => 'További keresés...'; + + @override + String get gallery => 'Galéria'; + + @override + String get files => 'Fájlok'; + + @override + String databaseBuildErrorBody(String url, String error) { + return 'Nem lehetséges az SQlite adatbázis létrehozása. Az app megpróbálja a régi típusú adatbázist használni. Kérem jelentse a hibát a fejlesztőknek a $url linken. A hiba szövege a következő: $error'; + } + + @override + String sessionLostBody(String url, String error) { + return 'A munkamenete elvesződött. Kérem jelentse ezt a fejlesztőknek a $url címen. A hiba szövege a következő: $error'; + } + + @override + String restoreSessionBody(String url, String error) { + return 'Megpróbálkozunk visszaállítani a munkamenetét egy korábbi mentésből. Kérem jelezze a hibát a fejlesztőknek a $url címen. A hiba szövege a következő: $error'; + } + + @override + String forwardMessageTo(String roomName) { + return 'Üzenet továbbítása a $roomName szobába?'; + } + + @override + String get sendReadReceipts => 'Olvasási igazolás küldése'; + + @override + String get sendTypingNotificationsDescription => + 'A csevegés többi tagja látja amikor gépel.'; + + @override + String get sendReadReceiptsDescription => + 'A csevegés többi tagja látja melyik üzenetet látta.'; + + @override + String get formattedMessages => 'Formázott üzenetek'; + + @override + String get formattedMessagesDescription => + 'Formázott szöveg - mint például félkövér - megjelenítése \"markdown\"-al.'; + + @override + String get verifyOtherUser => '🔐 Más felhasználók igazolása'; + + @override + String get verifyOtherUserDescription => + 'Ha megerősít egy másik felhasználót, akkor teljesen biztos lehet abban kivel cseveg. 💪\n\nA megerősítési folyamat kezdetekor megjelenik egy felugró ablak mindkettejüknél. Ekkor egy emoji vagy szám sor összehasonlítási folyamat veszi kezdetét.\n\nA legpraktikusabb módja ennek, hogy találkozzanak, vagy videó hívás során beszéljék meg. 👭'; + + @override + String get verifyOtherDevice => '🔐 Más eszköz megerősítése'; + + @override + String get verifyOtherDeviceDescription => + 'Amikor egy másik eszközt erősít meg, az eszközök kulcsokat cserélnek egymás között, ezáltal növelve az összbiztonságot. 💪 Amikor megkezdődik a folyamat, mind a két eszközön megjelenik egy felugró üzenet. Emojik és számok sorozata fog megjelenni, amit össze tud hasonlítani a két eszközön. Érdemes tehát mind a két eszközt a közelben tartani. 🤳'; + + @override + String acceptedKeyVerification(String sender) { + return '$sender elfogadta a kulcs megerősítést'; + } + + @override + String canceledKeyVerification(String sender) { + return '$sender nem fogadta el a kulcs megerősítést'; + } + + @override + String completedKeyVerification(String sender) { + return '$sender befejezte a kulcs megerősítést'; + } + + @override + String isReadyForKeyVerification(String sender) { + return '$sender készen áll a kulcs megerősítésre'; + } + + @override + String requestedKeyVerification(String sender) { + return '$sender kulcs megerősítést kér'; + } + + @override + String startedKeyVerification(String sender) { + return '$sender elkezdte a kulcs megerősítést'; + } + + @override + String get transparent => 'Átlátszó'; + + @override + String get incomingMessages => 'Bejövő üzenetek'; + + @override + String get stickers => 'Matrica'; + + @override + String get discover => 'Felfedezés'; + + @override + String get commandHint_ignore => 'Adott matrix ID figyelmen kívül hagyása'; + + @override + String get commandHint_unignore => 'Adott matrix ID figyelembe vétele'; + + @override + String unreadChatsInApp(String appname, String unread) { + return '$appname: $unread olvasatlan csevegések'; + } + + @override + String get noDatabaseEncryption => + 'Adatbázis titkosítása nem támogatott ezen a platformon'; + + @override + String thereAreCountUsersBlocked(Object count) { + return 'Jelenleg $count felhasználó van letiltva.'; + } + + @override + String get restricted => 'Korlátozott'; + + @override + String get knockRestricted => 'Kopogás korlátozva'; + + @override + String goToSpace(Object space) { + return 'Menj a térre: $space'; + } + + @override + String get markAsUnread => 'Olvasatlannak jelölés'; + + @override + String userLevel(int level) { + return '$level - Felhasználó'; + } + + @override + String moderatorLevel(int level) { + return '$level - Moderátor'; + } + + @override + String adminLevel(int level) { + return '$level - Rendszergazda'; + } + + @override + String get changeGeneralChatSettings => + 'Általános csevegés beállítások módosítása'; + + @override + String get inviteOtherUsers => 'Más felhasználók meghívása a csevegésbe'; + + @override + String get changeTheChatPermissions => 'Csevegés engedélyek változtatása'; + + @override + String get changeTheVisibilityOfChatHistory => + 'Csevegési előzmények láthatóságának változtatása'; + + @override + String get changeTheCanonicalRoomAlias => + 'Csevegés fő, nyilvános címének változtatása'; + + @override + String get sendRoomNotifications => '@room értesítés küldése'; + + @override + String get changeTheDescriptionOfTheGroup => + 'Csevegés leírásának változtatása'; + + @override + String get chatPermissionsDescription => + 'Adja meg milyen erősségi szint kell egyes csevegési akciókhoz. A 0, 50 és 100-as szintek általában felhasználókat, moderátorokat és rendszergazdákat jelölnek de bármilyen szintezés lehetséges.'; + + @override + String updateInstalled(String version) { + return '🎉 $version verziójú fejlesztés telepítve!'; + } + + @override + String get changelog => 'Változások'; + + @override + String get sendCanceled => 'Visszavonás küldése'; + + @override + String get loginWithMatrixId => 'Jelentkezzen be Matrix-ID-vel'; + + @override + String get discoverHomeservers => 'Matrix-kiszolgálók felfedezése'; + + @override + String get whatIsAHomeserver => 'Mi az a Matrix-kiszolgáló?'; + + @override + String get homeserverDescription => + 'Az összes adata a Mátrix-kiszolgálón tárolódik, pont mint egy e-mail kiszolgálón. Kiválaszthatja melyik Matrix-kiszolgálót akarja használni, miközben tud kommunikálni mindenkivel. Tudjon meg többet itt: https://matrix.org.'; + + @override + String get doesNotSeemToBeAValidHomeserver => + 'Nem tűnik kompatibilisnak a Mátrix-kiszolgálóval. Helytelen URL?'; + + @override + String get calculatingFileSize => 'Calculating file size...'; + + @override + String get prepareSendingAttachment => 'Prepare sending attachment...'; + + @override + String get sendingAttachment => 'Sending attachment...'; + + @override + String get generatingVideoThumbnail => 'Generating video thumbnail...'; + + @override + String get compressVideo => 'Compressing video...'; + + @override + String sendingAttachmentCountOfCount(int index, int length) { + return 'Sending attachment $index of $length...'; + } + + @override + String serverLimitReached(int seconds) { + return 'Server limit reached! Waiting $seconds seconds...'; + } + + @override + String get oneOfYourDevicesIsNotVerified => + 'One of your devices is not verified'; + + @override + String get noticeChatBackupDeviceVerification => + 'Note: When you connect all your devices to the chat backup, they are automatically verified.'; + + @override + String get continueText => 'Continue'; + + @override + String get welcomeText => + 'Hey Hey 👋 This is Extera. You can sign in to any homeserver, which is compatible with https://matrix.org. And then chat with anyone. It\'s a huge decentralized messaging network!'; + + @override + String get blur => 'Blur:'; + + @override + String get opacity => 'Opacity:'; + + @override + String get setWallpaper => 'Set wallpaper'; + + @override + String get manageAccount => 'Manage account'; + + @override + String get noContactInformationProvided => + 'Server does not provide any valid contact information'; + + @override + String get contactServerAdmin => 'Contact server admin'; + + @override + String get contactServerSecurity => 'Contact server security'; + + @override + String get supportPage => 'Support page'; + + @override + String get serverInformation => 'Server information:'; + + @override + String get name => 'Name'; + + @override + String get version => 'Version'; + + @override + String get website => 'Website'; + + @override + String get compress => 'Compress'; + + @override + String get boldText => 'Bold text'; + + @override + String get italicText => 'Italic text'; + + @override + String get strikeThrough => 'Strikethrough'; + + @override + String get pleaseFillOut => 'Please fill out'; + + @override + String get invalidUrl => 'Invalid url'; + + @override + String get addLink => 'Add link'; + + @override + String get unableToJoinChat => + 'Unable to join chat. Maybe the other party has already closed the conversation.'; + + @override + String get previous => 'Previous'; + + @override + String get otherPartyNotLoggedIn => + 'The other party is currently not logged in and therefore cannot receive messages!'; + + @override + String appWantsToUseForLogin(String server) { + return 'Use \'$server\' to log in'; + } + + @override + String get appWantsToUseForLoginDescription => + 'You hereby allow the app and website to share information about you.'; + + @override + String get open => 'Open'; + + @override + String get waitingForServer => 'Waiting for server...'; + + @override + String get appIntroduction => + 'Extera lets you chat with your friends across different messengers. Learn more at https://matrix.org or just tap *Continue*.'; + + @override + String get newChatRequest => '📩 New chat request'; + + @override + String get contentNotificationSettings => 'Content notification settings'; + + @override + String get generalNotificationSettings => 'General notification settings'; + + @override + String get roomNotificationSettings => 'Room notification settings'; + + @override + String get userSpecificNotificationSettings => + 'User specific notification settings'; + + @override + String get otherNotificationSettings => 'Other notification settings'; + + @override + String get notificationRuleContainsUserName => 'Contains User Name'; + + @override + String get notificationRuleContainsUserNameDescription => + 'Notifies the user when a message contains their username.'; + + @override + String get notificationRuleMaster => 'Mute all notifications'; + + @override + String get notificationRuleMasterDescription => + 'Overrides all other rules and disables all notifications.'; + + @override + String get notificationRuleSuppressNotices => 'Suppress Automated Messages'; + + @override + String get notificationRuleSuppressNoticesDescription => + 'Suppresses notifications from automated clients like bots.'; + + @override + String get notificationRuleInviteForMe => 'Invite for Me'; + + @override + String get notificationRuleInviteForMeDescription => + 'Notifies the user when they are invited to a room.'; + + @override + String get notificationRuleMemberEvent => 'Member Event'; + + @override + String get notificationRuleMemberEventDescription => + 'Suppresses notifications for membership events.'; + + @override + String get notificationRuleIsUserMention => 'User Mention'; + + @override + String get notificationRuleIsUserMentionDescription => + 'Notifies the user when they are directly mentioned in a message.'; + + @override + String get notificationRuleContainsDisplayName => 'Contains Display Name'; + + @override + String get notificationRuleContainsDisplayNameDescription => + 'Notifies the user when a message contains their display name.'; + + @override + String get notificationRuleIsRoomMention => 'Room Mention'; + + @override + String get notificationRuleIsRoomMentionDescription => + 'Notifies the user when there is a room mention.'; + + @override + String get notificationRuleRoomnotif => 'Room Notification'; + + @override + String get notificationRuleRoomnotifDescription => + 'Notifies the user when a message contains \'@room\'.'; + + @override + String get notificationRuleTombstone => 'Tombstone'; + + @override + String get notificationRuleTombstoneDescription => + 'Notifies the user about room deactivation messages.'; + + @override + String get notificationRuleReaction => 'Reaction'; + + @override + String get notificationRuleReactionDescription => + 'Suppresses notifications for reactions.'; + + @override + String get notificationRuleRoomServerAcl => 'Room Server ACL'; + + @override + String get notificationRuleRoomServerAclDescription => + 'Suppresses notifications for room server access control lists (ACL).'; + + @override + String get notificationRuleSuppressEdits => 'Suppress Edits'; + + @override + String get notificationRuleSuppressEditsDescription => + 'Suppresses notifications for edited messages.'; + + @override + String get notificationRuleCall => 'Call'; + + @override + String get notificationRuleCallDescription => + 'Notifies the user about calls.'; + + @override + String get notificationRuleEncryptedRoomOneToOne => + 'Encrypted Room One-to-One'; + + @override + String get notificationRuleEncryptedRoomOneToOneDescription => + 'Notifies the user about messages in encrypted one-to-one rooms.'; + + @override + String get notificationRuleRoomOneToOne => 'Room One-to-One'; + + @override + String get notificationRuleRoomOneToOneDescription => + 'Notifies the user about messages in one-to-one rooms.'; + + @override + String get notificationRuleMessage => 'Message'; + + @override + String get notificationRuleMessageDescription => + 'Notifies the user about general messages.'; + + @override + String get notificationRuleEncrypted => 'Encrypted'; + + @override + String get notificationRuleEncryptedDescription => + 'Notifies the user about messages in encrypted rooms.'; + + @override + String get notificationRuleJitsi => 'Jitsi'; + + @override + String get notificationRuleJitsiDescription => + 'Notifies the user about Jitsi widget events.'; + + @override + String get notificationRuleServerAcl => 'Suppress Server ACL Events'; + + @override + String get notificationRuleServerAclDescription => + 'Suppresses notifications for Server ACL events.'; + + @override + String unknownPushRule(String rule) { + return 'Unknown push rule \'$rule\''; + } + + @override + String get deletePushRuleCanNotBeUndone => + 'If you delete this notification setting, this can not be undone.'; + + @override + String get more => 'More'; + + @override + String get shareKeysWith => 'Share keys with...'; + + @override + String get shareKeysWithDescription => + 'Which devices should be trusted so that they can read along your messages in encrypted chats?'; + + @override + String get allDevices => 'All devices'; + + @override + String get crossVerifiedDevicesIfEnabled => + 'Cross verified devices if enabled'; + + @override + String get crossVerifiedDevices => 'Cross verified devices'; + + @override + String get verifiedDevicesOnly => 'Verified devices only'; + + @override + String get takeAPhoto => 'Take a photo'; + + @override + String get recordAVideo => 'Record a video'; + + @override + String get optionalMessage => '(Optional) message...'; + + @override + String get notSupportedOnThisDevice => 'Not supported on this device'; + + @override + String get enterNewChat => 'Enter new chat'; + + @override + String get approve => 'Approve'; + + @override + String get youHaveKnocked => 'You have knocked'; + + @override + String get pleaseWaitUntilInvited => + 'Please wait now, until someone from the room invites you.'; +} diff --git a/lib/generated/l10n/l10n_ia.dart b/lib/generated/l10n/l10n_ia.dart new file mode 100644 index 0000000..0fe1d46 --- /dev/null +++ b/lib/generated/l10n/l10n_ia.dart @@ -0,0 +1,2745 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'l10n.dart'; + +// ignore_for_file: type=lint + +/// The translations for Interlingua (`ia`). +class L10nIa extends L10n { + L10nIa([String locale = 'ia']) : super(locale); + + @override + String get noSendPermission => 'You can\'t send messages here'; + + @override + String get alwaysUse24HourFormat => 'false'; + + @override + String get repeatPassword => 'Repeter le contrasigno'; + + @override + String get notAnImage => 'Non es un file de imagine.'; + + @override + String get setCustomPermissionLevel => 'Set custom permission level'; + + @override + String get setPermissionsLevelDescription => + 'Please choose a predefined role below or enter a custom permission level between 0 and 100.'; + + @override + String get ignoreUser => 'Ignore user'; + + @override + String get normalUser => 'Normal user'; + + @override + String get remove => 'Remover'; + + @override + String get importNow => 'Importar ora'; + + @override + String get importEmojis => 'Importar emojis'; + + @override + String get importFromZipFile => 'Importar ab un file .zip'; + + @override + String get exportEmotePack => 'Exportar pacchetto de emotes como un .zip'; + + @override + String get replace => 'Reimplaciar'; + + @override + String get about => 'A proposito de'; + + @override + String aboutHomeserver(String homeserver) { + return 'About $homeserver'; + } + + @override + String get accept => 'Acceptar'; + + @override + String acceptedTheInvitation(String username) { + return '👍 $username acceptava tu invitation'; + } + + @override + String get account => 'Conto'; + + @override + String activatedEndToEndEncryption(String username) { + return '🔐 $username activated end to end encryption'; + } + + @override + String get addEmail => 'Adder email'; + + @override + String get confirmMatrixId => + 'Please confirm your Matrix ID in order to delete your account.'; + + @override + String supposedMxid(String mxid) { + return 'Isto deberea esser $mxid'; + } + + @override + String get addChatDescription => 'Add a chat description...'; + + @override + String get addToSpace => 'Add to space'; + + @override + String get admin => 'Admin'; + + @override + String get alias => 'alias'; + + @override + String get all => 'All'; + + @override + String get allChats => 'All chats'; + + @override + String get commandHint_roomupgrade => + 'Upgrade this room to the given room version'; + + @override + String get commandHint_googly => 'Send some googly eyes'; + + @override + String get commandHint_cuddle => 'Send a cuddle'; + + @override + String get commandHint_hug => 'Send a hug'; + + @override + String googlyEyesContent(String senderName) { + return '$senderName sends you googly eyes'; + } + + @override + String cuddleContent(String senderName) { + return '$senderName cuddles you'; + } + + @override + String hugContent(String senderName) { + return '$senderName hugs you'; + } + + @override + String answeredTheCall(String senderName) { + return '$senderName answered the call'; + } + + @override + String get anyoneCanJoin => 'Anyone can join'; + + @override + String get appLock => 'App lock'; + + @override + String get appLockDescription => + 'Lock the app when not using with a pin code'; + + @override + String get archive => 'Archive'; + + @override + String get areGuestsAllowedToJoin => 'Are guest users allowed to join'; + + @override + String get areYouSure => 'Are you sure?'; + + @override + String get areYouSureYouWantToLogout => 'Are you sure you want to log out?'; + + @override + String get askSSSSSign => + 'To be able to sign the other person, please enter your secure store passphrase or recovery key.'; + + @override + String askVerificationRequest(String username) { + return 'Accept this verification request from $username?'; + } + + @override + String get autoplayImages => + 'Automatically play animated stickers and emotes'; + + @override + String badServerLoginTypesException(String serverVersions, + String supportedVersions, Object suportedVersions) { + return 'The homeserver supports the login types:\n$serverVersions\nBut this app supports only:\n$supportedVersions'; + } + + @override + String get sendTypingNotifications => 'Send typing notifications'; + + @override + String get swipeRightToLeftToReply => 'Swipe right to left to reply'; + + @override + String get sendOnEnter => 'Send on enter'; + + @override + String badServerVersionsException(String serverVersions, + String supportedVersions, Object serverVerions, Object suportedVersions) { + return 'The homeserver supports the Spec versions:\n$serverVersions\nBut this app supports only $supportedVersions'; + } + + @override + String countChatsAndCountParticipants(int chats, int participants) { + return '$chats chats and $participants participants'; + } + + @override + String get noMoreChatsFound => 'No more chats found...'; + + @override + String get noChatsFoundHere => + 'No chats found here yet. Start a new chat with someone by using the button below. ⤵️'; + + @override + String get joinedChats => 'Joined chats'; + + @override + String get unread => 'Unread'; + + @override + String get space => 'Space'; + + @override + String get spaces => 'Spaces'; + + @override + String get banFromChat => 'Ban from chat'; + + @override + String get banned => 'Banned'; + + @override + String bannedUser(String username, String targetName) { + return '$username banned $targetName'; + } + + @override + String get blockDevice => 'Block Device'; + + @override + String get blocked => 'Blocked'; + + @override + String get botMessages => 'Bot messages'; + + @override + String get cancel => 'Cancel'; + + @override + String cantOpenUri(String uri) { + return 'Can\'t open the URI $uri'; + } + + @override + String get changeDeviceName => 'Change device name'; + + @override + String changedTheChatAvatar(String username) { + return '$username changed the chat avatar'; + } + + @override + String changedTheChatDescriptionTo(String username, String description) { + return '$username changed the chat description to: \'$description\''; + } + + @override + String changedTheChatNameTo(String username, String chatname) { + return '$username changed the chat name to: \'$chatname\''; + } + + @override + String changedTheChatPermissions(String username) { + return '$username changed the chat permissions'; + } + + @override + String changedTheDisplaynameTo(String username, String displayname) { + return '$username changed their displayname to: \'$displayname\''; + } + + @override + String changedTheGuestAccessRules(String username) { + return '$username changed the guest access rules'; + } + + @override + String changedTheGuestAccessRulesTo(String username, String rules) { + return '$username changed the guest access rules to: $rules'; + } + + @override + String changedTheHistoryVisibility(String username) { + return '$username changed the history visibility'; + } + + @override + String changedTheHistoryVisibilityTo(String username, String rules) { + return '$username changed the history visibility to: $rules'; + } + + @override + String changedTheJoinRules(String username) { + return '$username changed the join rules'; + } + + @override + String changedTheJoinRulesTo(String username, String joinRules) { + return '$username changed the join rules to: $joinRules'; + } + + @override + String changedTheProfileAvatar(String username) { + return '$username changed their avatar'; + } + + @override + String changedTheRoomAliases(String username) { + return '$username changed the room aliases'; + } + + @override + String changedTheRoomInvitationLink(String username) { + return '$username changed the invitation link'; + } + + @override + String get changePassword => 'Change password'; + + @override + String get changeTheHomeserver => 'Change the homeserver'; + + @override + String get changeTheme => 'Change your style'; + + @override + String get changeTheNameOfTheGroup => 'Change the name of the group'; + + @override + String get changeYourAvatar => 'Change your avatar'; + + @override + String get channelCorruptedDecryptError => + 'The encryption has been corrupted'; + + @override + String get chat => 'Chat'; + + @override + String get yourChatBackupHasBeenSetUp => 'Your chat backup has been set up.'; + + @override + String get chatBackup => 'Chat backup'; + + @override + String get chatBackupDescription => + 'Your old messages are secured with a recovery key. Please make sure you don\'t lose it.'; + + @override + String get chatDetails => 'Chat details'; + + @override + String get chatHasBeenAddedToThisSpace => 'Chat has been added to this space'; + + @override + String get chats => 'Chats'; + + @override + String get chooseAStrongPassword => 'Choose a strong password'; + + @override + String get clearArchive => 'Clear archive'; + + @override + String get close => 'Close'; + + @override + String get commandHint_markasdm => + 'Mark as direct message room for the giving Matrix ID'; + + @override + String get commandHint_markasgroup => 'Mark as group'; + + @override + String get commandHint_ban => 'Ban the given user from this room'; + + @override + String get commandHint_clearcache => 'Clear cache'; + + @override + String get commandHint_create => + 'Create an empty group chat\nUse --no-encryption to disable encryption'; + + @override + String get commandHint_discardsession => 'Discard session'; + + @override + String get commandHint_dm => + 'Start a direct chat\nUse --no-encryption to disable encryption'; + + @override + String get commandHint_html => 'Send HTML-formatted text'; + + @override + String get commandHint_invite => 'Invite the given user to this room'; + + @override + String get commandHint_join => 'Join the given room'; + + @override + String get commandHint_kick => 'Remove the given user from this room'; + + @override + String get commandHint_leave => 'Leave this room'; + + @override + String get commandHint_me => 'Describe yourself'; + + @override + String get commandHint_myroomavatar => + 'Set your picture for this room (by mxc-uri)'; + + @override + String get commandHint_myroomnick => 'Set your display name for this room'; + + @override + String get commandHint_op => + 'Set the given user\'s power level (default: 50)'; + + @override + String get commandHint_plain => 'Send unformatted text'; + + @override + String get commandHint_react => 'Send reply as a reaction'; + + @override + String get commandHint_send => 'Send text'; + + @override + String get commandHint_unban => 'Unban the given user from this room'; + + @override + String get commandInvalid => 'Command invalid'; + + @override + String commandMissing(String command) { + return '$command is not a command.'; + } + + @override + String get compareEmojiMatch => 'Please compare the emojis'; + + @override + String get compareNumbersMatch => 'Please compare the numbers'; + + @override + String get configureChat => 'Configure chat'; + + @override + String get confirm => 'Confirm'; + + @override + String get connect => 'Connect'; + + @override + String get contactHasBeenInvitedToTheGroup => + 'Contact has been invited to the group'; + + @override + String get containsDisplayName => 'Contains display name'; + + @override + String get containsUserName => 'Contains username'; + + @override + String get contentHasBeenReported => + 'The content has been reported to the server admins'; + + @override + String get copiedToClipboard => 'Copied to clipboard'; + + @override + String get copy => 'Copy'; + + @override + String get copyToClipboard => 'Copy to clipboard'; + + @override + String couldNotDecryptMessage(String error) { + return 'Could not decrypt message: $error'; + } + + @override + String countParticipants(int count) { + return '$count participants'; + } + + @override + String get create => 'Create'; + + @override + String createdTheChat(String username) { + return '💬 $username created the chat'; + } + + @override + String get createGroup => 'Create group'; + + @override + String get createNewSpace => 'New space'; + + @override + String get currentlyActive => 'Currently active'; + + @override + String get darkTheme => 'Dark'; + + @override + String dateAndTimeOfDay(String date, String timeOfDay) { + return '$date, $timeOfDay'; + } + + @override + String dateWithoutYear(String month, String day) { + return '$month-$day'; + } + + @override + String dateWithYear(String year, String month, String day) { + return '$year-$month-$day'; + } + + @override + String get deactivateAccountWarning => + 'This will deactivate your user account. This can not be undone! Are you sure?'; + + @override + String get defaultPermissionLevel => 'Default permission level for new users'; + + @override + String get delete => 'Delete'; + + @override + String get deleteAccount => 'Delete account'; + + @override + String get deleteMessage => 'Delete message'; + + @override + String get device => 'Device'; + + @override + String get deviceId => 'Device ID'; + + @override + String get devices => 'Devices'; + + @override + String get directChats => 'Direct Chats'; + + @override + String get allRooms => 'All Group Chats'; + + @override + String get displaynameHasBeenChanged => 'Displayname has been changed'; + + @override + String get downloadFile => 'Download file'; + + @override + String get edit => 'Edit'; + + @override + String get editBlockedServers => 'Edit blocked servers'; + + @override + String get chatPermissions => 'Chat permissions'; + + @override + String get editDisplayname => 'Edit displayname'; + + @override + String get editRoomAliases => 'Edit room aliases'; + + @override + String get editRoomAvatar => 'Edit room avatar'; + + @override + String get emoteExists => 'Emote already exists!'; + + @override + String get emoteInvalid => 'Invalid emote shortcode!'; + + @override + String get emoteKeyboardNoRecents => + 'Recently-used emotes will appear here...'; + + @override + String get emotePacks => 'Emote packs for room'; + + @override + String get emoteSettings => 'Emote Settings'; + + @override + String get globalChatId => 'Global chat ID'; + + @override + String get accessAndVisibility => 'Access and visibility'; + + @override + String get accessAndVisibilityDescription => + 'Who is allowed to join this chat and how the chat can be discovered.'; + + @override + String get calls => 'Calls'; + + @override + String get customEmojisAndStickers => 'Custom emojis and stickers'; + + @override + String get customEmojisAndStickersBody => + 'Add or share custom emojis or stickers which can be used in any chat.'; + + @override + String get emoteShortcode => 'Emote shortcode'; + + @override + String get emoteWarnNeedToPick => + 'You need to pick an emote shortcode and an image!'; + + @override + String get emptyChat => 'Empty chat'; + + @override + String get enableEmotesGlobally => 'Enable emote pack globally'; + + @override + String get enableEncryption => 'Enable encryption'; + + @override + String get enableEncryptionWarning => + 'You won\'t be able to disable the encryption anymore. Are you sure?'; + + @override + String get encrypted => 'Encrypted'; + + @override + String get encryption => 'Encryption'; + + @override + String get encryptionNotEnabled => 'Encryption is not enabled'; + + @override + String endedTheCall(String senderName) { + return '$senderName ended the call'; + } + + @override + String get enterAnEmailAddress => 'Enter an email address'; + + @override + String get homeserver => 'Homeserver'; + + @override + String get enterYourHomeserver => 'Enter your homeserver'; + + @override + String errorObtainingLocation(String error) { + return 'Error obtaining location: $error'; + } + + @override + String get everythingReady => 'Everything ready!'; + + @override + String get extremeOffensive => 'Extremely offensive'; + + @override + String get fileName => 'File name'; + + @override + String get fluffychat => 'Extera'; + + @override + String get fontSize => 'Font size'; + + @override + String get forward => 'Forward'; + + @override + String get fromJoining => 'From joining'; + + @override + String get fromTheInvitation => 'From the invitation'; + + @override + String get goToTheNewRoom => 'Go to the new room'; + + @override + String get group => 'Group'; + + @override + String get chatDescription => 'Chat description'; + + @override + String get chatDescriptionHasBeenChanged => 'Chat description changed'; + + @override + String get groupIsPublic => 'Group is public'; + + @override + String get groups => 'Groups'; + + @override + String groupWith(String displayname) { + return 'Group with $displayname'; + } + + @override + String get guestsAreForbidden => 'Guests are forbidden'; + + @override + String get guestsCanJoin => 'Guests can join'; + + @override + String hasWithdrawnTheInvitationFor(String username, String targetName) { + return '$username has withdrawn the invitation for $targetName'; + } + + @override + String get help => 'Help'; + + @override + String get hideRedactedEvents => 'Hide redacted events'; + + @override + String get hideRedactedMessages => 'Hide redacted messages'; + + @override + String get hideRedactedMessagesBody => + 'If someone redacts a message, this message won\'t be visible in the chat anymore.'; + + @override + String get hideInvalidOrUnknownMessageFormats => + 'Hide invalid or unknown message formats'; + + @override + String get howOffensiveIsThisContent => 'How offensive is this content?'; + + @override + String get id => 'ID'; + + @override + String get identity => 'Identity'; + + @override + String get block => 'Block'; + + @override + String get blockedUsers => 'Blocked users'; + + @override + String get blockListDescription => + 'You can block users who are disturbing you. You won\'t be able to receive any messages or room invites from the users on your personal block list.'; + + @override + String get blockUsername => 'Ignore username'; + + @override + String get iHaveClickedOnLink => 'I have clicked on the link'; + + @override + String get incorrectPassphraseOrKey => 'Incorrect passphrase or recovery key'; + + @override + String get inoffensive => 'Inoffensive'; + + @override + String get inviteContact => 'Invite contact'; + + @override + String inviteContactToGroupQuestion(Object contact, Object groupName) { + return 'Do you want to invite $contact to the chat \"$groupName\"?'; + } + + @override + String inviteContactToGroup(String groupName) { + return 'Invite contact to $groupName'; + } + + @override + String get noChatDescriptionYet => 'No chat description created yet.'; + + @override + String get tryAgain => 'Try again'; + + @override + String get invalidServerName => 'Invalid server name'; + + @override + String get invited => 'Invited'; + + @override + String get redactMessageDescription => + 'The message will be redacted for all participants in this conversation. This cannot be undone.'; + + @override + String get optionalRedactReason => + '(Optional) Reason for redacting this message...'; + + @override + String invitedUser(String username, String targetName) { + return '📩 $username invited $targetName'; + } + + @override + String get invitedUsersOnly => 'Invited users only'; + + @override + String get inviteForMe => 'Invite for me'; + + @override + String inviteText(String username, String link) { + return '$username invited you to Extera.\n1. Visit fluffychat.im and install the app \n2. Sign up or sign in \n3. Open the invite link: \n $link'; + } + + @override + String get isTyping => 'is typing…'; + + @override + String joinedTheChat(String username) { + return '👋 $username joined the chat'; + } + + @override + String get joinRoom => 'Join room'; + + @override + String kicked(String username, String targetName) { + return '👞 $username kicked $targetName'; + } + + @override + String kickedAndBanned(String username, String targetName) { + return '🙅 $username kicked and banned $targetName'; + } + + @override + String get kickFromChat => 'Kick from chat'; + + @override + String lastActiveAgo(String localizedTimeShort) { + return 'Last active: $localizedTimeShort'; + } + + @override + String get leave => 'Leave'; + + @override + String get leftTheChat => 'Left the chat'; + + @override + String get license => 'License'; + + @override + String get lightTheme => 'Light'; + + @override + String loadCountMoreParticipants(int count) { + return 'Load $count more participants'; + } + + @override + String get dehydrate => 'Export session and wipe device'; + + @override + String get dehydrateWarning => + 'This action cannot be undone. Ensure you safely store the backup file.'; + + @override + String get dehydrateTor => 'TOR Users: Export session'; + + @override + String get dehydrateTorLong => + 'For TOR users, it is recommended to export the session before closing the window.'; + + @override + String get hydrateTor => 'TOR Users: Import session export'; + + @override + String get hydrateTorLong => + 'Did you export your session last time on TOR? Quickly import it and continue chatting.'; + + @override + String get hydrate => 'Restore from backup file'; + + @override + String get loadingPleaseWait => 'Loading… Please wait.'; + + @override + String get loadMore => 'Load more…'; + + @override + String get locationDisabledNotice => + 'Location services are disabled. Please enable them to be able to share your location.'; + + @override + String get locationPermissionDeniedNotice => + 'Location permission denied. Please grant them to be able to share your location.'; + + @override + String get login => 'Login'; + + @override + String logInTo(String homeserver) { + return 'Log in to $homeserver'; + } + + @override + String get logout => 'Logout'; + + @override + String get memberChanges => 'Member changes'; + + @override + String get mention => 'Mention'; + + @override + String get messages => 'Messages'; + + @override + String get messagesStyle => 'Messages:'; + + @override + String get moderator => 'Moderator'; + + @override + String get muteChat => 'Mute chat'; + + @override + String get needPantalaimonWarning => + 'Please be aware that you need Pantalaimon to use end-to-end encryption for now.'; + + @override + String get newChat => 'New chat'; + + @override + String get newMessageInFluffyChat => '💬 New message in Extera'; + + @override + String get newVerificationRequest => 'New verification request!'; + + @override + String get next => 'Next'; + + @override + String get no => 'No'; + + @override + String get noConnectionToTheServer => 'No connection to the server'; + + @override + String get noEmotesFound => 'No emotes found. 😕'; + + @override + String get noEncryptionForPublicRooms => + 'You can only activate encryption as soon as the room is no longer publicly accessible.'; + + @override + String get noGoogleServicesWarning => + 'Firebase Cloud Messaging doesn\'t appear to be available on your device. To still receive push notifications, we recommend installing ntfy. With ntfy or another Unified Push provider you can receive push notifications in a data secure way. You can download ntfy from the PlayStore or from F-Droid.'; + + @override + String noMatrixServer(String server1, String server2) { + return '$server1 is no matrix server, use $server2 instead?'; + } + + @override + String get shareInviteLink => 'Share invite link'; + + @override + String get scanQrCode => 'Scan QR code'; + + @override + String get none => 'None'; + + @override + String get noPasswordRecoveryDescription => + 'You have not added a way to recover your password yet.'; + + @override + String get noPermission => 'No permission'; + + @override + String get noRoomsFound => 'No rooms found…'; + + @override + String get notifications => 'Notifications'; + + @override + String get notificationsEnabledForThisAccount => + 'Notifications enabled for this account'; + + @override + String numUsersTyping(int count) { + return '$count users are typing…'; + } + + @override + String get obtainingLocation => 'Obtaining location…'; + + @override + String get offensive => 'Offensive'; + + @override + String get offline => 'Offline'; + + @override + String get ok => 'Ok'; + + @override + String get online => 'Online'; + + @override + String get onlineKeyBackupEnabled => 'Online Key Backup is enabled'; + + @override + String get oopsPushError => + 'Oops! Unfortunately, an error occurred when setting up the push notifications.'; + + @override + String get oopsSomethingWentWrong => 'Oops, something went wrong…'; + + @override + String get openAppToReadMessages => 'Open app to read messages'; + + @override + String get openCamera => 'Open camera'; + + @override + String get openVideoCamera => 'Open camera for a video'; + + @override + String get oneClientLoggedOut => 'One of your clients has been logged out'; + + @override + String get addAccount => 'Add account'; + + @override + String get editBundlesForAccount => 'Edit bundles for this account'; + + @override + String get addToBundle => 'Add to bundle'; + + @override + String get removeFromBundle => 'Remove from this bundle'; + + @override + String get bundleName => 'Bundle name'; + + @override + String get enableMultiAccounts => + '(BETA) Enable multi accounts on this device'; + + @override + String get openInMaps => 'Open in maps'; + + @override + String get link => 'Link'; + + @override + String get serverRequiresEmail => + 'This server needs to validate your email address for registration.'; + + @override + String get or => 'Or'; + + @override + String get participant => 'Participant'; + + @override + String get passphraseOrKey => 'passphrase or recovery key'; + + @override + String get password => 'Password'; + + @override + String get passwordForgotten => 'Password forgotten'; + + @override + String get passwordHasBeenChanged => 'Password has been changed'; + + @override + String get hideMemberChangesInPublicChats => + 'Hide member changes in public chats'; + + @override + String get hideMemberChangesInPublicChatsBody => + 'Do not show in the chat timeline if someone joins or leaves a public chat to improve readability.'; + + @override + String get overview => 'Overview'; + + @override + String get notifyMeFor => 'Notify me for'; + + @override + String get passwordRecoverySettings => 'Password recovery settings'; + + @override + String get passwordRecovery => 'Password recovery'; + + @override + String get people => 'People'; + + @override + String get pickImage => 'Pick an image'; + + @override + String get pin => 'Pin'; + + @override + String play(String fileName) { + return 'Play $fileName'; + } + + @override + String get pleaseChoose => 'Please choose'; + + @override + String get pleaseChooseAPasscode => 'Please choose a pass code'; + + @override + String get pleaseClickOnLink => + 'Please click on the link in the email and then proceed.'; + + @override + String get pleaseEnter4Digits => + 'Please enter 4 digits or leave empty to disable app lock.'; + + @override + String get pleaseEnterRecoveryKey => 'Please enter your recovery key:'; + + @override + String get pleaseEnterYourPassword => 'Please enter your password'; + + @override + String get pleaseEnterYourPin => 'Please enter your pin'; + + @override + String get pleaseEnterYourUsername => 'Please enter your username'; + + @override + String get pleaseFollowInstructionsOnWeb => + 'Please follow the instructions on the website and tap on next.'; + + @override + String get privacy => 'Privacy'; + + @override + String get publicRooms => 'Public Rooms'; + + @override + String get pushRules => 'Push rules'; + + @override + String get reason => 'Reason'; + + @override + String get recording => 'Recording'; + + @override + String redactedBy(String username) { + return 'Redacted by $username'; + } + + @override + String get directChat => 'Direct chat'; + + @override + String redactedByBecause(String username, String reason) { + return 'Redacted by $username because: \"$reason\"'; + } + + @override + String redactedAnEvent(String username) { + return '$username redacted an event'; + } + + @override + String get redactMessage => 'Redact message'; + + @override + String get register => 'Register'; + + @override + String get reject => 'Reject'; + + @override + String rejectedTheInvitation(String username) { + return '$username rejected the invitation'; + } + + @override + String get rejoin => 'Rejoin'; + + @override + String get removeAllOtherDevices => 'Remove all other devices'; + + @override + String removedBy(String username) { + return 'Removed by $username'; + } + + @override + String get removeDevice => 'Remove device'; + + @override + String get unbanFromChat => 'Unban from chat'; + + @override + String get removeYourAvatar => 'Remove your avatar'; + + @override + String get replaceRoomWithNewerVersion => 'Replace room with newer version'; + + @override + String get reply => 'Reply'; + + @override + String get reportMessage => 'Report message'; + + @override + String get translateMessage => 'Translate message'; + + @override + String get translatedMessage => 'Translated message'; + + @override + String get errorTranslatingMessage => + 'An error has occured while translating the message.'; + + @override + String get recoverMessage => 'Recover message'; + + @override + String get recoveredMessage => 'Recovered message'; + + @override + String get errorRecoveringMessage => + 'An error has occured while recovering the message.'; + + @override + String get errorRecoveringMessageNoAdmin => + 'This feature is available on Synapse homeservers only for adminstrators.'; + + @override + String get requestPermission => 'Request permission'; + + @override + String get roomHasBeenUpgraded => 'Room has been upgraded'; + + @override + String get roomVersion => 'Room version'; + + @override + String get saveFile => 'Save file'; + + @override + String get retry => 'Retry'; + + @override + String get search => 'Search'; + + @override + String get security => 'Security'; + + @override + String get recoveryKey => 'Recovery key'; + + @override + String get recoveryKeyLost => 'Recovery key lost?'; + + @override + String seenByUser(String username) { + return 'Seen by $username'; + } + + @override + String get send => 'Send'; + + @override + String get sendAMessage => 'Send a message'; + + @override + String get sendAsText => 'Send as text'; + + @override + String get sendAudio => 'Send audio'; + + @override + String get sendFile => 'Send file'; + + @override + String get sendImage => 'Send image'; + + @override + String sendImages(int count) { + return 'Send $count image'; + } + + @override + String get sendMessages => 'Send messages'; + + @override + String get sendOriginal => 'Send original'; + + @override + String get sendSticker => 'Send sticker'; + + @override + String get sendVideo => 'Send video'; + + @override + String sentAFile(String username) { + return '📁 $username sent a file'; + } + + @override + String sentAnAudio(String username) { + return '🎤 $username sent an audio'; + } + + @override + String sentAPicture(String username) { + return '🖼️ $username sent a picture'; + } + + @override + String sentASticker(String username) { + return '😊 $username sent a sticker'; + } + + @override + String sentAVideo(String username) { + return '🎥 $username sent a video'; + } + + @override + String sentCallInformations(String senderName) { + return '$senderName sent call information'; + } + + @override + String get separateChatTypes => 'Separate Direct Chats and Groups'; + + @override + String get setAsCanonicalAlias => 'Set as main alias'; + + @override + String get setCustomEmotes => 'Set custom emotes'; + + @override + String get setChatDescription => 'Set chat description'; + + @override + String get setInvitationLink => 'Set invitation link'; + + @override + String get setPermissionsLevel => 'Set permissions level'; + + @override + String get setStatus => 'Set status'; + + @override + String get settings => 'Settings'; + + @override + String get share => 'Share'; + + @override + String sharedTheLocation(String username) { + return '$username shared their location'; + } + + @override + String get shareLocation => 'Share location'; + + @override + String get showPassword => 'Show password'; + + @override + String get presenceStyle => 'Presence:'; + + @override + String get hideAvatarsInInvites => 'Hide avatars in invites'; + + @override + String get hideAvatarsInInvitesDescription => + 'Do not show room avatars in invites'; + + @override + String get presencesToggle => 'Show status messages from other users'; + + @override + String get pureBlackToggle => 'Pure Black'; + + @override + String get singlesignon => 'Single Sign on'; + + @override + String get skip => 'Skip'; + + @override + String get sourceCode => 'Source code'; + + @override + String get spaceIsPublic => 'Space is public'; + + @override + String get spaceName => 'Space name'; + + @override + String startedACall(String senderName) { + return '$senderName started a call'; + } + + @override + String get startFirstChat => 'Start your first chat'; + + @override + String get status => 'Status'; + + @override + String get statusExampleMessage => 'How are you today?'; + + @override + String get submit => 'Submit'; + + @override + String get synchronizingPleaseWait => 'Synchronizing… Please wait.'; + + @override + String synchronizingPleaseWaitCounter(String percentage) { + return ' Synchronizing… ($percentage%)'; + } + + @override + String get systemTheme => 'System'; + + @override + String get theyDontMatch => 'They Don\'t Match'; + + @override + String get theyMatch => 'They Match'; + + @override + String get title => 'Extera'; + + @override + String get toggleFavorite => 'Toggle Favorite'; + + @override + String get toggleMuted => 'Toggle Muted'; + + @override + String get toggleUnread => 'Mark Read/Unread'; + + @override + String get tooManyRequestsWarning => + 'Too many requests. Please try again later!'; + + @override + String get transferFromAnotherDevice => 'Transfer from another device'; + + @override + String get tryToSendAgain => 'Try to send again'; + + @override + String get unavailable => 'Unavailable'; + + @override + String unbannedUser(String username, String targetName) { + return '$username unbanned $targetName'; + } + + @override + String get unblockDevice => 'Unblock Device'; + + @override + String get unknownDevice => 'Unknown device'; + + @override + String get unknownEncryptionAlgorithm => 'Unknown encryption algorithm'; + + @override + String unknownEvent(String type) { + return 'Unknown event \'$type\''; + } + + @override + String get unmuteChat => 'Unmute chat'; + + @override + String get unpin => 'Unpin'; + + @override + String unreadChats(int unreadCount) { + String _temp0 = intl.Intl.pluralLogic( + unreadCount, + locale: localeName, + other: '$unreadCount unread chats', + one: '1 unread chat', + ); + return '$_temp0'; + } + + @override + String userAndOthersAreTyping(String username, int count) { + return '$username and $count others are typing…'; + } + + @override + String userAndUserAreTyping(String username, String username2) { + return '$username and $username2 are typing…'; + } + + @override + String userIsTyping(String username) { + return '$username is typing…'; + } + + @override + String userLeftTheChat(String username) { + return '🚪 $username left the chat'; + } + + @override + String get username => 'Username'; + + @override + String userSentUnknownEvent(String username, String type) { + return '$username sent a $type event'; + } + + @override + String get unverified => 'Unverified'; + + @override + String get verified => 'Verified'; + + @override + String get verify => 'Verify'; + + @override + String get verifyStart => 'Start Verification'; + + @override + String get verifySuccess => 'You successfully verified!'; + + @override + String get verifyTitle => 'Verifying other account'; + + @override + String get videoCall => 'Video call'; + + @override + String get visibilityOfTheChatHistory => 'Visibility of the chat history'; + + @override + String get visibleForAllParticipants => 'Visible for all participants'; + + @override + String get visibleForEveryone => 'Visible for everyone'; + + @override + String get voiceMessage => 'Voice message'; + + @override + String get waitingPartnerAcceptRequest => + 'Waiting for partner to accept the request…'; + + @override + String get waitingPartnerEmoji => 'Waiting for partner to accept the emoji…'; + + @override + String get waitingPartnerNumbers => + 'Waiting for partner to accept the numbers…'; + + @override + String get wallpaper => 'Wallpaper:'; + + @override + String get warning => 'Warning!'; + + @override + String get weSentYouAnEmail => 'We sent you an email'; + + @override + String get whoCanPerformWhichAction => 'Who can perform which action'; + + @override + String get whoIsAllowedToJoinThisGroup => 'Who is allowed to join this group'; + + @override + String get whyDoYouWantToReportThis => 'Why do you want to report this?'; + + @override + String get wipeChatBackup => + 'Wipe your chat backup to create a new recovery key?'; + + @override + String get withTheseAddressesRecoveryDescription => + 'With these addresses you can recover your password.'; + + @override + String get writeAMessage => 'Write a message…'; + + @override + String get yes => 'Yes'; + + @override + String get you => 'You'; + + @override + String get youAreNoLongerParticipatingInThisChat => + 'You are no longer participating in this chat'; + + @override + String get youHaveBeenBannedFromThisChat => + 'You have been banned from this chat'; + + @override + String get yourPublicKey => 'Your public key'; + + @override + String get messageInfo => 'Message info'; + + @override + String get time => 'Time'; + + @override + String get messageType => 'Message Type'; + + @override + String get sender => 'Sender'; + + @override + String get openGallery => 'Open gallery'; + + @override + String get removeFromSpace => 'Remove from space'; + + @override + String get addToSpaceDescription => 'Select a space to add this chat to it.'; + + @override + String get start => 'Start'; + + @override + String get pleaseEnterRecoveryKeyDescription => + 'To unlock your old messages, please enter your recovery key that has been generated in a previous session. Your recovery key is NOT your password.'; + + @override + String get publish => 'Publish'; + + @override + String videoWithSize(String size) { + return 'Video ($size)'; + } + + @override + String get openChat => 'Open Chat'; + + @override + String get markAsRead => 'Mark as read'; + + @override + String get reportUser => 'Report user'; + + @override + String get dismiss => 'Dismiss'; + + @override + String reactedWith(String sender, String reaction) { + return '$sender reacted with $reaction'; + } + + @override + String get pinMessage => 'Pin to room'; + + @override + String get confirmEventUnpin => + 'Are you sure to permanently unpin the event?'; + + @override + String get emojis => 'Emojis'; + + @override + String get placeCall => 'Place call'; + + @override + String get voiceCall => 'Voice call'; + + @override + String get unsupportedAndroidVersion => 'Unsupported Android version'; + + @override + String get unsupportedAndroidVersionLong => + 'This feature requires a newer Android version. Please check for updates or Lineage OS support.'; + + @override + String get videoCallsBetaWarning => + 'Please note that video calls are currently in beta. They might not work as expected or work at all on all platforms.'; + + @override + String get experimentalVideoCalls => 'Experimental video calls'; + + @override + String get emailOrUsername => 'Email or username'; + + @override + String get indexedDbErrorTitle => 'Private mode issues'; + + @override + String get indexedDbErrorLong => + 'The message storage is unfortunately not enabled in private mode by default.\nPlease visit\n - about:config\n - set dom.indexedDB.privateBrowsing.enabled to true\nOtherwise, it is not possible to run Extera.'; + + @override + String switchToAccount(String number) { + return 'Switch to account $number'; + } + + @override + String get nextAccount => 'Next account'; + + @override + String get previousAccount => 'Previous account'; + + @override + String get addWidget => 'Add widget'; + + @override + String get widgetVideo => 'Video'; + + @override + String get widgetEtherpad => 'Text note'; + + @override + String get widgetJitsi => 'Jitsi Meet'; + + @override + String get widgetCustom => 'Custom'; + + @override + String get widgetName => 'Name'; + + @override + String get widgetUrlError => 'This is not a valid URL.'; + + @override + String get widgetNameError => 'Please provide a display name.'; + + @override + String get errorAddingWidget => 'Error adding the widget.'; + + @override + String get youRejectedTheInvitation => 'You rejected the invitation'; + + @override + String get youJoinedTheChat => 'You joined the chat'; + + @override + String get youAcceptedTheInvitation => '👍 You accepted the invitation'; + + @override + String youBannedUser(String user) { + return 'You banned $user'; + } + + @override + String youHaveWithdrawnTheInvitationFor(String user) { + return 'You have withdrawn the invitation for $user'; + } + + @override + String youInvitedToBy(String alias) { + return '📩 You have been invited via link to:\n$alias'; + } + + @override + String youInvitedBy(String user) { + return '📩 You have been invited by $user'; + } + + @override + String invitedBy(String user) { + return '📩 Invited by $user'; + } + + @override + String youInvitedUser(String user) { + return '📩 You invited $user'; + } + + @override + String youKicked(String user) { + return '👞 You kicked $user'; + } + + @override + String youKickedAndBanned(String user) { + return '🙅 You kicked and banned $user'; + } + + @override + String youUnbannedUser(String user) { + return 'You unbanned $user'; + } + + @override + String hasKnocked(String user) { + return '🚪 $user has knocked'; + } + + @override + String get usersMustKnock => 'Users must knock'; + + @override + String get noOneCanJoin => 'No one can join'; + + @override + String userWouldLikeToChangeTheChat(String user) { + return '$user would like to join the chat.'; + } + + @override + String get noPublicLinkHasBeenCreatedYet => + 'No public link has been created yet'; + + @override + String get knock => 'Knock'; + + @override + String get users => 'Users'; + + @override + String get unlockOldMessages => 'Unlock old messages'; + + @override + String get storeInSecureStorageDescription => + 'Store the recovery key in the secure storage of this device.'; + + @override + String get saveKeyManuallyDescription => + 'Save this key manually by triggering the system share dialog or clipboard.'; + + @override + String get storeInAndroidKeystore => 'Store in Android KeyStore'; + + @override + String get storeInAppleKeyChain => 'Store in Apple KeyChain'; + + @override + String get storeSecurlyOnThisDevice => 'Store securely on this device'; + + @override + String countFiles(int count) { + return '$count files'; + } + + @override + String get user => 'User'; + + @override + String get custom => 'Custom'; + + @override + String get foregroundServiceRunning => + 'This notification appears when the foreground service is running.'; + + @override + String get screenSharingTitle => 'screen sharing'; + + @override + String get screenSharingDetail => 'You are sharing your screen in Extera'; + + @override + String get callingPermissions => 'Calling permissions'; + + @override + String get callingAccount => 'Calling account'; + + @override + String get callingAccountDetails => + 'Allows Extera to use the native android dialer app.'; + + @override + String get appearOnTop => 'Appear on top'; + + @override + String get appearOnTopDetails => + 'Allows the app to appear on top (not needed if you already have Fluffychat setup as a calling account)'; + + @override + String get otherCallingPermissions => + 'Microphone, camera and other Extera permissions'; + + @override + String get whyIsThisMessageEncrypted => 'Why is this message unreadable?'; + + @override + String get noKeyForThisMessage => + 'This can happen if the message was sent before you have signed in to your account at this device.\n\nIt is also possible that the sender has blocked your device or something went wrong with the internet connection.\n\nAre you able to read the message on another session? Then you can transfer the message from it! Go to Settings > Devices and make sure that your devices have verified each other. When you open the room the next time and both sessions are in the foreground, the keys will be transmitted automatically.\n\nDo you not want to lose the keys when logging out or switching devices? Make sure that you have enabled the chat backup in the settings.'; + + @override + String get newGroup => 'New group'; + + @override + String get newSpace => 'New space'; + + @override + String get enterSpace => 'Enter space'; + + @override + String get enterRoom => 'Enter room'; + + @override + String get allSpaces => 'All spaces'; + + @override + String numChats(String number) { + return '$number chats'; + } + + @override + String get hideUnimportantStateEvents => 'Hide unimportant state events'; + + @override + String get hidePresences => 'Hide Status List?'; + + @override + String get doNotShowAgain => 'Do not show again'; + + @override + String wasDirectChatDisplayName(String oldDisplayName) { + return 'Empty chat (was $oldDisplayName)'; + } + + @override + String get newSpaceDescription => + 'Spaces allows you to consolidate your chats and build private or public communities.'; + + @override + String get encryptThisChat => 'Encrypt this chat'; + + @override + String get disableEncryptionWarning => + 'For security reasons you can not disable encryption in a chat, where it has been enabled before.'; + + @override + String get sorryThatsNotPossible => 'Sorry... that is not possible'; + + @override + String get deviceKeys => 'Device keys:'; + + @override + String get reopenChat => 'Reopen chat'; + + @override + String get noBackupWarning => + 'Warning! Without enabling chat backup, you will lose access to your encrypted messages. It is highly recommended to enable the chat backup first before logging out.'; + + @override + String get noOtherDevicesFound => 'No other devices found'; + + @override + String fileIsTooBigForServer(String max) { + return 'Unable to send! The server only supports attachments up to $max.'; + } + + @override + String fileHasBeenSavedAt(String path) { + return 'File has been saved at $path'; + } + + @override + String get jumpToLastReadMessage => 'Jump to last read message'; + + @override + String get readUpToHere => 'Read up to here'; + + @override + String get jump => 'Jump'; + + @override + String get openLinkInBrowser => 'Open link in browser'; + + @override + String get reportErrorDescription => + '😭 Oh no. Something went wrong. If you want, you can report this bug to the developers.'; + + @override + String get report => 'Report'; + + @override + String get signInWithPassword => 'Sign in with password'; + + @override + String get pleaseTryAgainLaterOrChooseDifferentServer => + 'Please try again later or choose a different server.'; + + @override + String signInWith(String provider) { + return 'Sign in with $provider'; + } + + @override + String get profileNotFound => + 'The user could not be found on the server. Maybe there is a connection problem or the user doesn\'t exist.'; + + @override + String get setTheme => 'Set theme:'; + + @override + String get setColorTheme => 'Set color theme:'; + + @override + String get invite => 'Invite'; + + @override + String get inviteGroupChat => '📨 Invite group chat'; + + @override + String get invitePrivateChat => '📨 Invite private chat'; + + @override + String get invalidInput => 'Invalid input!'; + + @override + String wrongPinEntered(int seconds) { + return 'Wrong pin entered! Try again in $seconds seconds...'; + } + + @override + String get pleaseEnterANumber => 'Please enter a number greater than 0'; + + @override + String get archiveRoomDescription => + 'The chat will be moved to the archive. Other users will be able to see that you have left the chat.'; + + @override + String get roomUpgradeDescription => + 'The chat will then be recreated with the new room version. All participants will be notified that they need to switch to the new chat. You can find out more about room versions at https://spec.matrix.org/latest/rooms/'; + + @override + String get removeDevicesDescription => + 'You will be logged out of this device and will no longer be able to receive messages.'; + + @override + String get banUserDescription => + 'The user will be banned from the chat and will not be able to enter the chat again until they are unbanned.'; + + @override + String get unbanUserDescription => + 'The user will be able to enter the chat again if they try.'; + + @override + String get kickUserDescription => + 'The user is kicked out of the chat but not banned. In public chats, the user can rejoin at any time.'; + + @override + String get makeAdminDescription => + 'Once you make this user admin, you may not be able to undo this as they will then have the same permissions as you.'; + + @override + String get pushNotificationsNotAvailable => + 'Push notifications not available'; + + @override + String get learnMore => 'Learn more'; + + @override + String get yourGlobalUserIdIs => 'Your global user-ID is: '; + + @override + String noUsersFoundWithQuery(String query) { + return 'Unfortunately no user could be found with \"$query\". Please check whether you made a typo.'; + } + + @override + String get knocking => 'Knocking'; + + @override + String chatCanBeDiscoveredViaSearchOnServer(String server) { + return 'Chat can be discovered via the search on $server'; + } + + @override + String get searchChatsRooms => 'Search for #chats, @users...'; + + @override + String get nothingFound => 'Nothing found...'; + + @override + String get groupName => 'Group name'; + + @override + String get createGroupAndInviteUsers => 'Create a group and invite users'; + + @override + String get groupCanBeFoundViaSearch => 'Group can be found via search'; + + @override + String get wrongRecoveryKey => + 'Sorry... this does not seem to be the correct recovery key.'; + + @override + String get startConversation => 'Start conversation'; + + @override + String get commandHint_sendraw => 'Send raw json'; + + @override + String get databaseMigrationTitle => 'Database is optimized'; + + @override + String get databaseMigrationBody => 'Please wait. This may take a moment.'; + + @override + String get leaveEmptyToClearStatus => 'Leave empty to clear your status.'; + + @override + String get select => 'Select'; + + @override + String get searchForUsers => 'Search for @users...'; + + @override + String get pleaseEnterYourCurrentPassword => + 'Please enter your current password'; + + @override + String get newPassword => 'New password'; + + @override + String get pleaseChooseAStrongPassword => 'Please choose a strong password'; + + @override + String get passwordsDoNotMatch => 'Passwords do not match'; + + @override + String get passwordIsWrong => 'Your entered password is wrong'; + + @override + String get publicLink => 'Public link'; + + @override + String get publicChatAddresses => 'Public chat addresses'; + + @override + String get createNewAddress => 'Create new address'; + + @override + String get joinSpace => 'Join space'; + + @override + String get publicSpaces => 'Public spaces'; + + @override + String get addChatOrSubSpace => 'Add chat or sub space'; + + @override + String get subspace => 'Subspace'; + + @override + String get decline => 'Decline'; + + @override + String get thisDevice => 'This device:'; + + @override + String get initAppError => 'An error occured while init the app'; + + @override + String get userRole => 'User role'; + + @override + String minimumPowerLevel(String level) { + return '$level is the minimum power level.'; + } + + @override + String searchIn(String chat) { + return 'Search in chat \"$chat\"...'; + } + + @override + String get searchMore => 'Search more...'; + + @override + String get gallery => 'Gallery'; + + @override + String get files => 'Files'; + + @override + String databaseBuildErrorBody(String url, String error) { + return 'Unable to build the SQlite database. The app tries to use the legacy database for now. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String sessionLostBody(String url, String error) { + return 'Your session is lost. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String restoreSessionBody(String url, String error) { + return 'The app now tries to restore your session from the backup. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String forwardMessageTo(String roomName) { + return 'Forward message to $roomName?'; + } + + @override + String get sendReadReceipts => 'Send read receipts'; + + @override + String get sendTypingNotificationsDescription => + 'Other participants in a chat can see when you are typing a new message.'; + + @override + String get sendReadReceiptsDescription => + 'Other participants in a chat can see when you have read a message.'; + + @override + String get formattedMessages => 'Formatted messages'; + + @override + String get formattedMessagesDescription => + 'Display rich message content like bold text using markdown.'; + + @override + String get verifyOtherUser => '🔐 Verify other user'; + + @override + String get verifyOtherUserDescription => + 'If you verify another user, you can be sure that you know who you are really writing to. 💪\n\nWhen you start a verification, you and the other user will see a popup in the app. There you will then see a series of emojis or numbers that you have to compare with each other.\n\nThe best way to do this is to meet up or start a video call. 👭'; + + @override + String get verifyOtherDevice => '🔐 Verify other device'; + + @override + String get verifyOtherDeviceDescription => + 'When you verify another device, those devices can exchange keys, increasing your overall security. 💪 When you start a verification, a popup will appear in the app on both devices. There you will then see a series of emojis or numbers that you have to compare with each other. It\'s best to have both devices handy before you start the verification. 🤳'; + + @override + String acceptedKeyVerification(String sender) { + return '$sender accepted key verification'; + } + + @override + String canceledKeyVerification(String sender) { + return '$sender canceled key verification'; + } + + @override + String completedKeyVerification(String sender) { + return '$sender completed key verification'; + } + + @override + String isReadyForKeyVerification(String sender) { + return '$sender is ready for key verification'; + } + + @override + String requestedKeyVerification(String sender) { + return '$sender requested key verification'; + } + + @override + String startedKeyVerification(String sender) { + return '$sender started key verification'; + } + + @override + String get transparent => 'Transparent'; + + @override + String get incomingMessages => 'Incoming messages'; + + @override + String get stickers => 'Stickers'; + + @override + String get discover => 'Discover'; + + @override + String get commandHint_ignore => 'Ignore the given matrix ID'; + + @override + String get commandHint_unignore => 'Unignore the given matrix ID'; + + @override + String unreadChatsInApp(String appname, String unread) { + return '$appname: $unread unread chats'; + } + + @override + String get noDatabaseEncryption => + 'Database encryption is not supported on this platform'; + + @override + String thereAreCountUsersBlocked(Object count) { + return 'Right now there are $count users blocked.'; + } + + @override + String get restricted => 'Restricted'; + + @override + String get knockRestricted => 'Knock restricted'; + + @override + String goToSpace(Object space) { + return 'Go to space: $space'; + } + + @override + String get markAsUnread => 'Mark as unread'; + + @override + String userLevel(int level) { + return '$level - User'; + } + + @override + String moderatorLevel(int level) { + return '$level - Moderator'; + } + + @override + String adminLevel(int level) { + return '$level - Admin'; + } + + @override + String get changeGeneralChatSettings => 'Change general chat settings'; + + @override + String get inviteOtherUsers => 'Invite other users to this chat'; + + @override + String get changeTheChatPermissions => 'Change the chat permissions'; + + @override + String get changeTheVisibilityOfChatHistory => + 'Change the visibility of the chat history'; + + @override + String get changeTheCanonicalRoomAlias => + 'Change the main public chat address'; + + @override + String get sendRoomNotifications => 'Send a @room notifications'; + + @override + String get changeTheDescriptionOfTheGroup => + 'Change the description of the chat'; + + @override + String get chatPermissionsDescription => + 'Define which power level is necessary for certain actions in this chat. The power levels 0, 50 and 100 are usually representing users, moderators and admins, but any gradation is possible.'; + + @override + String updateInstalled(String version) { + return '🎉 Update $version installed!'; + } + + @override + String get changelog => 'Changelog'; + + @override + String get sendCanceled => 'Sending canceled'; + + @override + String get loginWithMatrixId => 'Login with Matrix-ID'; + + @override + String get discoverHomeservers => 'Discover homeservers'; + + @override + String get whatIsAHomeserver => 'What is a homeserver?'; + + @override + String get homeserverDescription => + 'All your data is stored on the homeserver, just like an email provider. You can choose which homeserver you want to use, while you can still communicate with everyone. Learn more at at https://matrix.org.'; + + @override + String get doesNotSeemToBeAValidHomeserver => + 'Doesn\'t seem to be a compatible homeserver. Wrong URL?'; + + @override + String get calculatingFileSize => 'Calculating file size...'; + + @override + String get prepareSendingAttachment => 'Prepare sending attachment...'; + + @override + String get sendingAttachment => 'Sending attachment...'; + + @override + String get generatingVideoThumbnail => 'Generating video thumbnail...'; + + @override + String get compressVideo => 'Compressing video...'; + + @override + String sendingAttachmentCountOfCount(int index, int length) { + return 'Sending attachment $index of $length...'; + } + + @override + String serverLimitReached(int seconds) { + return 'Server limit reached! Waiting $seconds seconds...'; + } + + @override + String get oneOfYourDevicesIsNotVerified => + 'One of your devices is not verified'; + + @override + String get noticeChatBackupDeviceVerification => + 'Note: When you connect all your devices to the chat backup, they are automatically verified.'; + + @override + String get continueText => 'Continue'; + + @override + String get welcomeText => + 'Hey Hey 👋 This is Extera. You can sign in to any homeserver, which is compatible with https://matrix.org. And then chat with anyone. It\'s a huge decentralized messaging network!'; + + @override + String get blur => 'Blur:'; + + @override + String get opacity => 'Opacity:'; + + @override + String get setWallpaper => 'Set wallpaper'; + + @override + String get manageAccount => 'Manage account'; + + @override + String get noContactInformationProvided => + 'Server does not provide any valid contact information'; + + @override + String get contactServerAdmin => 'Contact server admin'; + + @override + String get contactServerSecurity => 'Contact server security'; + + @override + String get supportPage => 'Support page'; + + @override + String get serverInformation => 'Server information:'; + + @override + String get name => 'Name'; + + @override + String get version => 'Version'; + + @override + String get website => 'Website'; + + @override + String get compress => 'Compress'; + + @override + String get boldText => 'Bold text'; + + @override + String get italicText => 'Italic text'; + + @override + String get strikeThrough => 'Strikethrough'; + + @override + String get pleaseFillOut => 'Please fill out'; + + @override + String get invalidUrl => 'Invalid url'; + + @override + String get addLink => 'Add link'; + + @override + String get unableToJoinChat => + 'Unable to join chat. Maybe the other party has already closed the conversation.'; + + @override + String get previous => 'Previous'; + + @override + String get otherPartyNotLoggedIn => + 'The other party is currently not logged in and therefore cannot receive messages!'; + + @override + String appWantsToUseForLogin(String server) { + return 'Use \'$server\' to log in'; + } + + @override + String get appWantsToUseForLoginDescription => + 'You hereby allow the app and website to share information about you.'; + + @override + String get open => 'Open'; + + @override + String get waitingForServer => 'Waiting for server...'; + + @override + String get appIntroduction => + 'Extera lets you chat with your friends across different messengers. Learn more at https://matrix.org or just tap *Continue*.'; + + @override + String get newChatRequest => '📩 New chat request'; + + @override + String get contentNotificationSettings => 'Content notification settings'; + + @override + String get generalNotificationSettings => 'General notification settings'; + + @override + String get roomNotificationSettings => 'Room notification settings'; + + @override + String get userSpecificNotificationSettings => + 'User specific notification settings'; + + @override + String get otherNotificationSettings => 'Other notification settings'; + + @override + String get notificationRuleContainsUserName => 'Contains User Name'; + + @override + String get notificationRuleContainsUserNameDescription => + 'Notifies the user when a message contains their username.'; + + @override + String get notificationRuleMaster => 'Mute all notifications'; + + @override + String get notificationRuleMasterDescription => + 'Overrides all other rules and disables all notifications.'; + + @override + String get notificationRuleSuppressNotices => 'Suppress Automated Messages'; + + @override + String get notificationRuleSuppressNoticesDescription => + 'Suppresses notifications from automated clients like bots.'; + + @override + String get notificationRuleInviteForMe => 'Invite for Me'; + + @override + String get notificationRuleInviteForMeDescription => + 'Notifies the user when they are invited to a room.'; + + @override + String get notificationRuleMemberEvent => 'Member Event'; + + @override + String get notificationRuleMemberEventDescription => + 'Suppresses notifications for membership events.'; + + @override + String get notificationRuleIsUserMention => 'User Mention'; + + @override + String get notificationRuleIsUserMentionDescription => + 'Notifies the user when they are directly mentioned in a message.'; + + @override + String get notificationRuleContainsDisplayName => 'Contains Display Name'; + + @override + String get notificationRuleContainsDisplayNameDescription => + 'Notifies the user when a message contains their display name.'; + + @override + String get notificationRuleIsRoomMention => 'Room Mention'; + + @override + String get notificationRuleIsRoomMentionDescription => + 'Notifies the user when there is a room mention.'; + + @override + String get notificationRuleRoomnotif => 'Room Notification'; + + @override + String get notificationRuleRoomnotifDescription => + 'Notifies the user when a message contains \'@room\'.'; + + @override + String get notificationRuleTombstone => 'Tombstone'; + + @override + String get notificationRuleTombstoneDescription => + 'Notifies the user about room deactivation messages.'; + + @override + String get notificationRuleReaction => 'Reaction'; + + @override + String get notificationRuleReactionDescription => + 'Suppresses notifications for reactions.'; + + @override + String get notificationRuleRoomServerAcl => 'Room Server ACL'; + + @override + String get notificationRuleRoomServerAclDescription => + 'Suppresses notifications for room server access control lists (ACL).'; + + @override + String get notificationRuleSuppressEdits => 'Suppress Edits'; + + @override + String get notificationRuleSuppressEditsDescription => + 'Suppresses notifications for edited messages.'; + + @override + String get notificationRuleCall => 'Call'; + + @override + String get notificationRuleCallDescription => + 'Notifies the user about calls.'; + + @override + String get notificationRuleEncryptedRoomOneToOne => + 'Encrypted Room One-to-One'; + + @override + String get notificationRuleEncryptedRoomOneToOneDescription => + 'Notifies the user about messages in encrypted one-to-one rooms.'; + + @override + String get notificationRuleRoomOneToOne => 'Room One-to-One'; + + @override + String get notificationRuleRoomOneToOneDescription => + 'Notifies the user about messages in one-to-one rooms.'; + + @override + String get notificationRuleMessage => 'Message'; + + @override + String get notificationRuleMessageDescription => + 'Notifies the user about general messages.'; + + @override + String get notificationRuleEncrypted => 'Encrypted'; + + @override + String get notificationRuleEncryptedDescription => + 'Notifies the user about messages in encrypted rooms.'; + + @override + String get notificationRuleJitsi => 'Jitsi'; + + @override + String get notificationRuleJitsiDescription => + 'Notifies the user about Jitsi widget events.'; + + @override + String get notificationRuleServerAcl => 'Suppress Server ACL Events'; + + @override + String get notificationRuleServerAclDescription => + 'Suppresses notifications for Server ACL events.'; + + @override + String unknownPushRule(String rule) { + return 'Unknown push rule \'$rule\''; + } + + @override + String get deletePushRuleCanNotBeUndone => + 'If you delete this notification setting, this can not be undone.'; + + @override + String get more => 'More'; + + @override + String get shareKeysWith => 'Share keys with...'; + + @override + String get shareKeysWithDescription => + 'Which devices should be trusted so that they can read along your messages in encrypted chats?'; + + @override + String get allDevices => 'All devices'; + + @override + String get crossVerifiedDevicesIfEnabled => + 'Cross verified devices if enabled'; + + @override + String get crossVerifiedDevices => 'Cross verified devices'; + + @override + String get verifiedDevicesOnly => 'Verified devices only'; + + @override + String get takeAPhoto => 'Take a photo'; + + @override + String get recordAVideo => 'Record a video'; + + @override + String get optionalMessage => '(Optional) message...'; + + @override + String get notSupportedOnThisDevice => 'Not supported on this device'; + + @override + String get enterNewChat => 'Enter new chat'; + + @override + String get approve => 'Approve'; + + @override + String get youHaveKnocked => 'You have knocked'; + + @override + String get pleaseWaitUntilInvited => + 'Please wait now, until someone from the room invites you.'; +} diff --git a/lib/generated/l10n/l10n_id.dart b/lib/generated/l10n/l10n_id.dart new file mode 100644 index 0000000..8815af6 --- /dev/null +++ b/lib/generated/l10n/l10n_id.dart @@ -0,0 +1,2760 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'l10n.dart'; + +// ignore_for_file: type=lint + +/// The translations for Indonesian (`id`). +class L10nId extends L10n { + L10nId([String locale = 'id']) : super(locale); + + @override + String get noSendPermission => 'You can\'t send messages here'; + + @override + String get alwaysUse24HourFormat => 'tidak'; + + @override + String get repeatPassword => 'Ulangi kata sandi'; + + @override + String get notAnImage => 'Bukan berkas gambar.'; + + @override + String get setCustomPermissionLevel => 'Set custom permission level'; + + @override + String get setPermissionsLevelDescription => + 'Please choose a predefined role below or enter a custom permission level between 0 and 100.'; + + @override + String get ignoreUser => 'Ignore user'; + + @override + String get normalUser => 'Normal user'; + + @override + String get remove => 'Hapus'; + + @override + String get importNow => 'Impor sekarang'; + + @override + String get importEmojis => 'Impor Emoji'; + + @override + String get importFromZipFile => 'Impor dari berkas .zip'; + + @override + String get exportEmotePack => 'Ekspor paket Emote sebagai .zip'; + + @override + String get replace => 'Ganti'; + + @override + String get about => 'Tentang'; + + @override + String aboutHomeserver(String homeserver) { + return 'Tentang $homeserver'; + } + + @override + String get accept => 'Terima'; + + @override + String acceptedTheInvitation(String username) { + return '👍 $username menerima undangannya'; + } + + @override + String get account => 'Akun'; + + @override + String activatedEndToEndEncryption(String username) { + return '🔐 $username mengaktifkan enkripsi ujung ke ujung'; + } + + @override + String get addEmail => 'Tambah email'; + + @override + String get confirmMatrixId => + 'Mohon konfirmasi ID Matrix Anda untuk menghapus akun Anda.'; + + @override + String supposedMxid(String mxid) { + return 'Ini seharusnya $mxid'; + } + + @override + String get addChatDescription => 'Tambahkan deskripsi obrolan...'; + + @override + String get addToSpace => 'Tambah ke space'; + + @override + String get admin => 'Admin'; + + @override + String get alias => 'alias'; + + @override + String get all => 'Semua'; + + @override + String get allChats => 'Semua obrolan'; + + @override + String get commandHint_roomupgrade => + 'Tingkatkan ruangan ini ke versi ruangan yang ditentukan'; + + @override + String get commandHint_googly => 'Kirim mata googly'; + + @override + String get commandHint_cuddle => 'Kirim berpelukan'; + + @override + String get commandHint_hug => 'Kirim pelukan'; + + @override + String googlyEyesContent(String senderName) { + return '$senderName mengirim mata googly'; + } + + @override + String cuddleContent(String senderName) { + return '$senderName berpelukan dengan kamu'; + } + + @override + String hugContent(String senderName) { + return '$senderName memeluk kamu'; + } + + @override + String answeredTheCall(String senderName) { + return '$senderName menjawab panggilan'; + } + + @override + String get anyoneCanJoin => 'Siapa saja dapat bergabung'; + + @override + String get appLock => 'Kunci aplikasi'; + + @override + String get appLockDescription => + 'Kunci aplikasi ketika tidak digunakan dengan kode PIN'; + + @override + String get archive => 'Arsip'; + + @override + String get areGuestsAllowedToJoin => + 'Apakah pengguna tamu diizinkan untuk bergabung'; + + @override + String get areYouSure => 'Apakah kamu yakin?'; + + @override + String get areYouSureYouWantToLogout => 'Apakah kamu yakin ingin keluar?'; + + @override + String get askSSSSSign => + 'Untuk dapat menandatangani orang lain, silakan masukkan frasa sandi atau kunci pemulihan penyimpanan aman kamu.'; + + @override + String askVerificationRequest(String username) { + return 'Terima permintaan verifikasi dari $username?'; + } + + @override + String get autoplayImages => + 'Mainkan stiker beranimasi dan emote secara otomatis'; + + @override + String badServerLoginTypesException(String serverVersions, + String supportedVersions, Object suportedVersions) { + return 'Homeserver ini mendukung tipe masuk ini:\n$serverVersions\nTetapi aplikasi ini mendukung:\n$supportedVersions'; + } + + @override + String get sendTypingNotifications => 'Kirim notifikasi pengetikan'; + + @override + String get swipeRightToLeftToReply => + 'Usap dari kanan ke kiri untuk membalas'; + + @override + String get sendOnEnter => 'Kirim dengan enter'; + + @override + String badServerVersionsException(String serverVersions, + String supportedVersions, Object serverVerions, Object suportedVersions) { + return 'Homeserver ini mendukung versi Spec ini:\n$serverVersions\nTetapi aplikasi ini hanya mendukung $supportedVersions'; + } + + @override + String countChatsAndCountParticipants(int chats, int participants) { + return '$chats chat dan $participants anggota'; + } + + @override + String get noMoreChatsFound => 'Tidak ada chat lagi yang ditemukan...'; + + @override + String get noChatsFoundHere => + 'Belum ada chat di sini. Mulai chat baru dengan seseorang menggunakan tombol di bawah. ⤵️'; + + @override + String get joinedChats => 'Bergabung chat'; + + @override + String get unread => 'Tidak dibaca'; + + @override + String get space => 'Space'; + + @override + String get spaces => 'Space'; + + @override + String get banFromChat => 'Cekal dari obrolan'; + + @override + String get banned => 'Dicekal'; + + @override + String bannedUser(String username, String targetName) { + return '$username mencekal $targetName'; + } + + @override + String get blockDevice => 'Blokir Perangkat'; + + @override + String get blocked => 'Diblokir'; + + @override + String get botMessages => 'Pesan bot'; + + @override + String get cancel => 'Batal'; + + @override + String cantOpenUri(String uri) { + return 'Tidak bisa membuka URI ini $uri'; + } + + @override + String get changeDeviceName => 'Ganti nama perangkat'; + + @override + String changedTheChatAvatar(String username) { + return '$username mengubah avatar obrolan'; + } + + @override + String changedTheChatDescriptionTo(String username, String description) { + return '$username mengubah deskripsi obrolan ke: \'$description\''; + } + + @override + String changedTheChatNameTo(String username, String chatname) { + return '$username mengubah nama obrolan ke: \'$chatname\''; + } + + @override + String changedTheChatPermissions(String username) { + return '$username mengubah izin obrolan'; + } + + @override + String changedTheDisplaynameTo(String username, String displayname) { + return '$username mengubah nama tampilan ke: \'$displayname\''; + } + + @override + String changedTheGuestAccessRules(String username) { + return '$username mengubah aturan akses tamu'; + } + + @override + String changedTheGuestAccessRulesTo(String username, String rules) { + return '$username mengubah aturan akses tamu ke: $rules'; + } + + @override + String changedTheHistoryVisibility(String username) { + return '$username mengubah visibilitas sejarah'; + } + + @override + String changedTheHistoryVisibilityTo(String username, String rules) { + return '$username mengubah visibilitas sejarah ke: $rules'; + } + + @override + String changedTheJoinRules(String username) { + return '$username mengubah aturan bergabung'; + } + + @override + String changedTheJoinRulesTo(String username, String joinRules) { + return '$username mengubah aturan bergabung ke: $joinRules'; + } + + @override + String changedTheProfileAvatar(String username) { + return '$username mengubah avatarnya'; + } + + @override + String changedTheRoomAliases(String username) { + return '$username mengubah alias ruangan'; + } + + @override + String changedTheRoomInvitationLink(String username) { + return '$username mengubah tautan undangan'; + } + + @override + String get changePassword => 'Ubah kata sandi'; + + @override + String get changeTheHomeserver => 'Ubah homeserver'; + + @override + String get changeTheme => 'Ubah tema'; + + @override + String get changeTheNameOfTheGroup => 'Ubah nama grup'; + + @override + String get changeYourAvatar => 'Ubah avatarmu'; + + @override + String get channelCorruptedDecryptError => 'Enkripsi telah rusak'; + + @override + String get chat => 'Obrolan'; + + @override + String get yourChatBackupHasBeenSetUp => + 'Cadangan obrolanmu telah disiapkan.'; + + @override + String get chatBackup => 'Cadangan obrolan'; + + @override + String get chatBackupDescription => + 'Pesan lamamu diamankan dengan sebuah kunci pemulihan. Pastikan kamu tidak menghilangkannya.'; + + @override + String get chatDetails => 'Detail obrolan'; + + @override + String get chatHasBeenAddedToThisSpace => + 'Obrolan telah ditambahkan ke space ini'; + + @override + String get chats => 'Obrolan'; + + @override + String get chooseAStrongPassword => 'Pilih kata sandi yang kuat'; + + @override + String get clearArchive => 'Bersihkan arsip'; + + @override + String get close => 'Tutup'; + + @override + String get commandHint_markasdm => + 'Tandai sebagai ruangan pesan langsung untuk ID Matrix yang ditentukan'; + + @override + String get commandHint_markasgroup => 'Tandai sebagai grup'; + + @override + String get commandHint_ban => + 'Cekal pengguna yang dicantumkan dari ruangan ini'; + + @override + String get commandHint_clearcache => 'Bersihkan tembolok'; + + @override + String get commandHint_create => + 'Buat sebuah grup obrolan kosong\nGunakan --no-encryption untuk menonaktifkan enkripsi'; + + @override + String get commandHint_discardsession => 'Buang sesi'; + + @override + String get commandHint_dm => + 'Mulai sebuah obrolan langsung\nGunakan --no-encryption untuk menonaktifkan enkripsi'; + + @override + String get commandHint_html => 'Kirim teks yang diformat dengan HTML'; + + @override + String get commandHint_invite => + 'Undang pengguna yang dicantum ke ruangan ini'; + + @override + String get commandHint_join => 'Gabung ke ruangan yang dicantum'; + + @override + String get commandHint_kick => + 'Keluarkan pengguna yang dicantum dari ruangan ini'; + + @override + String get commandHint_leave => 'Tinggalkan ruangan ini'; + + @override + String get commandHint_me => 'Jelaskan dirimu'; + + @override + String get commandHint_myroomavatar => + 'Tetapkan gambarmu untuk ruangan ini (oleh uri-mxc)'; + + @override + String get commandHint_myroomnick => + 'Tetapkan nama tampilanmu untuk ruangan ini'; + + @override + String get commandHint_op => + 'Tetapkan tingkat kekuatan pengguna yang dicantum (default: 50)'; + + @override + String get commandHint_plain => 'Kirim teks yang tidak diformat'; + + @override + String get commandHint_react => 'Kirim balasan sebagai reaksi'; + + @override + String get commandHint_send => 'Kirim teks'; + + @override + String get commandHint_unban => + 'Hilangkan cekalan untuk pengguna yang dicantumkan dari ruangan ini'; + + @override + String get commandInvalid => 'Perintah tidak valid'; + + @override + String commandMissing(String command) { + return '$command bukan sebuah perintah.'; + } + + @override + String get compareEmojiMatch => 'Bandingkan emoji'; + + @override + String get compareNumbersMatch => 'Bandingkan angka'; + + @override + String get configureChat => 'Konfigurasi obrolan'; + + @override + String get confirm => 'Konfirmasi'; + + @override + String get connect => 'Hubungkan'; + + @override + String get contactHasBeenInvitedToTheGroup => 'Kontak telah diundang ke grup'; + + @override + String get containsDisplayName => 'Berisi nama tampilan'; + + @override + String get containsUserName => 'Berisi nama pengguna'; + + @override + String get contentHasBeenReported => + 'Konten telah dilaporkan ke admin server'; + + @override + String get copiedToClipboard => 'Disalin ke papan klip'; + + @override + String get copy => 'Salin'; + + @override + String get copyToClipboard => 'Salin ke papan klip'; + + @override + String couldNotDecryptMessage(String error) { + return 'Tidak dapat mendekripsikan pesan: $error'; + } + + @override + String countParticipants(int count) { + return '$count anggota'; + } + + @override + String get create => 'Buat'; + + @override + String createdTheChat(String username) { + return '💬 $username membuat obrolan ini'; + } + + @override + String get createGroup => 'Buat grup'; + + @override + String get createNewSpace => 'Space baru'; + + @override + String get currentlyActive => 'Aktif'; + + @override + String get darkTheme => 'Gelap'; + + @override + String dateAndTimeOfDay(String date, String timeOfDay) { + return '$timeOfDay, $date'; + } + + @override + String dateWithoutYear(String month, String day) { + return '$day-$month'; + } + + @override + String dateWithYear(String year, String month, String day) { + return '$day-$month-$year'; + } + + @override + String get deactivateAccountWarning => + 'Ini akan menonaktifkan akun penggunamu. Ini tidak bisa dibatalkan! Apakah kamu yakin?'; + + @override + String get defaultPermissionLevel => 'Level izin bawaan untuk pengguna baru'; + + @override + String get delete => 'Hapus'; + + @override + String get deleteAccount => 'Hapus akun'; + + @override + String get deleteMessage => 'Hapus pesan'; + + @override + String get device => 'Perangkat'; + + @override + String get deviceId => 'ID Perangkat'; + + @override + String get devices => 'Perangkat'; + + @override + String get directChats => 'Chat Langsung'; + + @override + String get allRooms => 'Semua Percakapan Grup'; + + @override + String get displaynameHasBeenChanged => 'Nama tampilan telah diubah'; + + @override + String get downloadFile => 'Unduh berkas'; + + @override + String get edit => 'Sunting'; + + @override + String get editBlockedServers => 'Edit server yang diblokir'; + + @override + String get chatPermissions => 'Perizinan obrolan'; + + @override + String get editDisplayname => 'Edit nama tampilan'; + + @override + String get editRoomAliases => 'Edit alias ruangan'; + + @override + String get editRoomAvatar => 'Edit avatar ruangan'; + + @override + String get emoteExists => 'Emote sudah ada!'; + + @override + String get emoteInvalid => 'Shortcode emote tidak valid!'; + + @override + String get emoteKeyboardNoRecents => + 'Emote yang telah digunakan akan muncul di sini...'; + + @override + String get emotePacks => 'Paket emote untuk ruangan'; + + @override + String get emoteSettings => 'Pengaturan Emote'; + + @override + String get globalChatId => 'ID obrolan global'; + + @override + String get accessAndVisibility => 'Akses dan keterlihatan'; + + @override + String get accessAndVisibilityDescription => + 'Siapa yang diperbolehkan bergabung ke obrolan ini dan bagaimana obrolannya dapat ditemukan.'; + + @override + String get calls => 'Panggilan'; + + @override + String get customEmojisAndStickers => 'Emoji dan stiker kustom'; + + @override + String get customEmojisAndStickersBody => + 'Tambakan atau bagikan emoji atau stiker kustom yang dapat digunakan dalam obrolan apa pun.'; + + @override + String get emoteShortcode => 'Shortcode emote'; + + @override + String get emoteWarnNeedToPick => + 'Kamu harus memilih shortcode emote dan gambar!'; + + @override + String get emptyChat => 'Chat kosong'; + + @override + String get enableEmotesGlobally => 'Aktifkan paket emote secara global'; + + @override + String get enableEncryption => 'Aktifkan enkripsi'; + + @override + String get enableEncryptionWarning => + 'Kamu tidak akan bisa menonaktifkan enkripsi. Apakah kamu yakin?'; + + @override + String get encrypted => 'Terenkripsi'; + + @override + String get encryption => 'Enkripsi'; + + @override + String get encryptionNotEnabled => 'Enkripsi tidak diaktifkan'; + + @override + String endedTheCall(String senderName) { + return '$senderName mengakhiri panggilan'; + } + + @override + String get enterAnEmailAddress => 'Masukkan alamat email'; + + @override + String get homeserver => 'Homeserver'; + + @override + String get enterYourHomeserver => 'Masukkan homeserver-mu'; + + @override + String errorObtainingLocation(String error) { + return 'Gagal mendapat lokasi: $error'; + } + + @override + String get everythingReady => 'Semua siap!'; + + @override + String get extremeOffensive => 'Sangat menyinggung'; + + @override + String get fileName => 'Nama file'; + + @override + String get fluffychat => 'FluffyChat'; + + @override + String get fontSize => 'Ukuran font'; + + @override + String get forward => 'Teruskan'; + + @override + String get fromJoining => 'Dari bergabung'; + + @override + String get fromTheInvitation => 'Dari undangan'; + + @override + String get goToTheNewRoom => 'Pergi ke ruangan yang baru'; + + @override + String get group => 'Grup'; + + @override + String get chatDescription => 'Deskripsi obrolan'; + + @override + String get chatDescriptionHasBeenChanged => 'Deskripsi obrolan diubah'; + + @override + String get groupIsPublic => 'Grup bersifat publik'; + + @override + String get groups => 'Grup'; + + @override + String groupWith(String displayname) { + return 'Grup dengan $displayname'; + } + + @override + String get guestsAreForbidden => 'Tamu dilarang'; + + @override + String get guestsCanJoin => 'Tamu bisa bergabung'; + + @override + String hasWithdrawnTheInvitationFor(String username, String targetName) { + return '$username telah mencabut undangan untuk $targetName'; + } + + @override + String get help => 'Bantuan'; + + @override + String get hideRedactedEvents => 'Sembunyikan peristiwa yang dihapus'; + + @override + String get hideRedactedMessages => 'Sembunyikan pesan yang dihapus'; + + @override + String get hideRedactedMessagesBody => + 'Jika seseorang menghapus pesan, pesannya tidak akan terlihat lagi dalam obrolan.'; + + @override + String get hideInvalidOrUnknownMessageFormats => + 'Sembunyikan format pesan yang tidak valid atau tidak diketahui'; + + @override + String get howOffensiveIsThisContent => 'Seberapa menyinggungnya konten ini?'; + + @override + String get id => 'ID'; + + @override + String get identity => 'Identitas'; + + @override + String get block => 'Blokir'; + + @override + String get blockedUsers => 'Pengguna yang terblokir'; + + @override + String get blockListDescription => + 'Kamu bisa memblokir pengguna yang sedang menganggumu. Kamu tidak akan mendapatkan pesan atau undangan ruangan dari pengguna dalam daftar blokiran pribadimu.'; + + @override + String get blockUsername => 'Abaikan nama pengguna'; + + @override + String get iHaveClickedOnLink => 'Saya sudah klik tautannya'; + + @override + String get incorrectPassphraseOrKey => + 'Frasa sandi atau kunci pemulihan yang salah'; + + @override + String get inoffensive => 'Tidak menyinggung'; + + @override + String get inviteContact => 'Undang kontak'; + + @override + String inviteContactToGroupQuestion(Object contact, Object groupName) { + return 'Apakah kamu ingin mengundang $contact ke obrolan \"$groupName\"?'; + } + + @override + String inviteContactToGroup(String groupName) { + return 'Undang kontak ke $groupName'; + } + + @override + String get noChatDescriptionYet => 'Deskripsi obrolan belum dibuat.'; + + @override + String get tryAgain => 'Coba ulang'; + + @override + String get invalidServerName => 'Nama server tidak valid'; + + @override + String get invited => 'Diundang'; + + @override + String get redactMessageDescription => + 'Pesan akan dihilangkan untuk semua anggota dalam percakapan ini. Ini tidak dapat diurungkan.'; + + @override + String get optionalRedactReason => + '(Opsional) Alasan menghilangkan pesan ini...'; + + @override + String invitedUser(String username, String targetName) { + return '📩 $username mengundang $targetName'; + } + + @override + String get invitedUsersOnly => 'Pengguna yang diundang saja'; + + @override + String get inviteForMe => 'Undangan untuk saya'; + + @override + String inviteText(String username, String link) { + return '$username mengundang kamu ke FluffyChat. \n1. Kunjungi fluffychat.im dan instal aplikasi\n2. Daftar atau masuk \n3. Buka tautan undangan: \n $link'; + } + + @override + String get isTyping => 'sedang mengetik…'; + + @override + String joinedTheChat(String username) { + return '👋 $username telah bergabung dengan obrolan'; + } + + @override + String get joinRoom => 'Bergabung dengan ruangan'; + + @override + String kicked(String username, String targetName) { + return '👞 $username mengeluarkan $targetName'; + } + + @override + String kickedAndBanned(String username, String targetName) { + return '🙅 $username mengeluarkan dan mencekal $targetName'; + } + + @override + String get kickFromChat => 'Keluarkan dari obrolan'; + + @override + String lastActiveAgo(String localizedTimeShort) { + return 'Terakhir aktif: $localizedTimeShort'; + } + + @override + String get leave => 'Tinggalkan'; + + @override + String get leftTheChat => 'Keluar dari obrolan'; + + @override + String get license => 'Lisensi'; + + @override + String get lightTheme => 'Terang'; + + @override + String loadCountMoreParticipants(int count) { + return 'Muat $count anggota'; + } + + @override + String get dehydrate => 'Ekspor sesi dan bersihkan perangkat'; + + @override + String get dehydrateWarning => + 'Tindakan ini tidak dapat diurungkan. Pastikan kamu telah menyimpan file cadangan dengan aman.'; + + @override + String get dehydrateTor => 'Pengguna Tor: Ekspor sesi'; + + @override + String get dehydrateTorLong => + 'Pengguna Tor disarankan untuk mengekspor sesi sebelum menutup jendela.'; + + @override + String get hydrateTor => 'Pengguna Tor: Impor eksporan sesi'; + + @override + String get hydrateTorLong => + 'Apakah kamu mengekspor sesimu terakhir kali di Tor? Impor dengan cepat dan lanjut mengobrol.'; + + @override + String get hydrate => 'Pulihkan dari file cadangan'; + + @override + String get loadingPleaseWait => 'Memuat… Mohon tunggu.'; + + @override + String get loadMore => 'Muat lebih banyak…'; + + @override + String get locationDisabledNotice => + 'Layanan lokasi dinonaktifkan. Mohon diaktifkan untuk bisa membagikan lokasimu.'; + + @override + String get locationPermissionDeniedNotice => + 'Izin lokasi ditolak. Mohon memberikan izin untuk bisa membagikan lokasimu.'; + + @override + String get login => 'Masuk'; + + @override + String logInTo(String homeserver) { + return 'Masuk ke $homeserver'; + } + + @override + String get logout => 'Keluar'; + + @override + String get memberChanges => 'Perubahan anggota'; + + @override + String get mention => 'Sebutkan'; + + @override + String get messages => 'Pesan'; + + @override + String get messagesStyle => 'Pesan:'; + + @override + String get moderator => 'Moderator'; + + @override + String get muteChat => 'Bisukan obrolan'; + + @override + String get needPantalaimonWarning => + 'Perlu diketahui bahwa kamu memerlukan Pantalaimon untuk menggunakan enkripsi ujung-ke-ujung untuk saat ini.'; + + @override + String get newChat => 'Chat baru'; + + @override + String get newMessageInFluffyChat => '💬 Pesan baru di FluffyChat'; + + @override + String get newVerificationRequest => 'Permintaan verifikasi baru!'; + + @override + String get next => 'Lanjut'; + + @override + String get no => 'Tidak'; + + @override + String get noConnectionToTheServer => 'Tidak ada koneksi ke server'; + + @override + String get noEmotesFound => 'Tidak ada emote yang ditemukan. 😕'; + + @override + String get noEncryptionForPublicRooms => + 'Kamu hanya bisa mengaktifkan enkripsi setelah ruangan tidak lagi dapat diakses secara publik.'; + + @override + String get noGoogleServicesWarning => + 'Perpesanan Awan Firebase sepertinya tidak tersedia di perangkatmu. Untuk dapat menerima notifikasi dorongan, kami menyarankan memasang ntfy. Dengan ntfy atau penyedia UnifiedPush lainnya, kamu bisa menerima notifikasi dorongan dengan cara yang aman. Kamu bisa mengunduh ntfy dari Play Store atau F-Droid.'; + + @override + String noMatrixServer(String server1, String server2) { + return '$server1 itu bukan server Matrix, gunakan $server2 saja?'; + } + + @override + String get shareInviteLink => 'Bagikan tautan undangan'; + + @override + String get scanQrCode => 'Pindai kode QR'; + + @override + String get none => 'Tidak Ada'; + + @override + String get noPasswordRecoveryDescription => + 'Kamu belum menambahkan cara untuk memulihkan kata sandimu.'; + + @override + String get noPermission => 'Tidak ada izin'; + + @override + String get noRoomsFound => 'Tidak ada ruangan yang ditemukan…'; + + @override + String get notifications => 'Notifikasi'; + + @override + String get notificationsEnabledForThisAccount => + 'Notifikasi diaktifkan untuk akun ini'; + + @override + String numUsersTyping(int count) { + return '$count pengguna sedang mengetik…'; + } + + @override + String get obtainingLocation => 'Mendapatkan lokasi…'; + + @override + String get offensive => 'Menyinggung'; + + @override + String get offline => 'Offline'; + + @override + String get ok => 'Ok'; + + @override + String get online => 'Online'; + + @override + String get onlineKeyBackupEnabled => 'Cadangan Kunci Online dinyalakan'; + + @override + String get oopsPushError => + 'Ups! Sayangnya, terjadi kesalahan saat mengatur pemberitahuan push.'; + + @override + String get oopsSomethingWentWrong => 'Ups, ada yang salah…'; + + @override + String get openAppToReadMessages => 'Buka aplikasi untuk membaca pesan'; + + @override + String get openCamera => 'Buka kamera'; + + @override + String get openVideoCamera => 'Buka kamera untuk merekam video'; + + @override + String get oneClientLoggedOut => 'Salah satu klienmu telah keluar'; + + @override + String get addAccount => 'Tambah akun'; + + @override + String get editBundlesForAccount => 'Edit bundel untuk akun ini'; + + @override + String get addToBundle => 'Tambah ke bundel'; + + @override + String get removeFromBundle => 'Hilangkan dari bundel ini'; + + @override + String get bundleName => 'Nama bundel'; + + @override + String get enableMultiAccounts => + '(BETA) Aktifkan multi-akun di perangkat ini'; + + @override + String get openInMaps => 'Buka di peta'; + + @override + String get link => 'Tautan'; + + @override + String get serverRequiresEmail => + 'Server ini harus memvalidasi alamat email kamu untuk registrasi.'; + + @override + String get or => 'Atau'; + + @override + String get participant => 'Peserta'; + + @override + String get passphraseOrKey => 'frasa sandi atau kunci pemulihan'; + + @override + String get password => 'Kata sandi'; + + @override + String get passwordForgotten => 'Lupa kata sandi'; + + @override + String get passwordHasBeenChanged => 'Kata sandi telah diubah'; + + @override + String get hideMemberChangesInPublicChats => + 'Sembunyikan perubahan anggota dalam obrolan publik'; + + @override + String get hideMemberChangesInPublicChatsBody => + 'Jangan tampilkan dalam lini masa obrolan jika seseorang bergabung atau keluar dari obrolan untuk meningkatkan keterlihatan.'; + + @override + String get overview => 'Ikhtisar'; + + @override + String get notifyMeFor => 'Beri tahu aku untuk'; + + @override + String get passwordRecoverySettings => 'Pengaturan pemulihan kata sandi'; + + @override + String get passwordRecovery => 'Pemulihan kata sandi'; + + @override + String get people => 'Orang-orang'; + + @override + String get pickImage => 'Pilih gambar'; + + @override + String get pin => 'Pin'; + + @override + String play(String fileName) { + return 'Mainkan $fileName'; + } + + @override + String get pleaseChoose => 'Mohon pilih'; + + @override + String get pleaseChooseAPasscode => 'Mohon pilih kode sandi'; + + @override + String get pleaseClickOnLink => 'Mohon klik tautan di email dan lanjut.'; + + @override + String get pleaseEnter4Digits => + 'Mohon masukkan 4 digit atau tinggalkan kosong untuk menonaktifkan kunci aplikasi.'; + + @override + String get pleaseEnterRecoveryKey => 'Mohon masukkan kunci pemulihanmu:'; + + @override + String get pleaseEnterYourPassword => 'Mohon masukkan kata sandimu'; + + @override + String get pleaseEnterYourPin => 'Masukkan pin'; + + @override + String get pleaseEnterYourUsername => 'Mohon masukkan nama penggunamu'; + + @override + String get pleaseFollowInstructionsOnWeb => + 'Mohon ikuti petunjuk di situs web dan tekan lanjut.'; + + @override + String get privacy => 'Privasi'; + + @override + String get publicRooms => 'Ruangan Publik'; + + @override + String get pushRules => 'Aturan push'; + + @override + String get reason => 'Alasan'; + + @override + String get recording => 'Merekam'; + + @override + String redactedBy(String username) { + return 'Dihilangkan oleh $username'; + } + + @override + String get directChat => 'Chat langsung'; + + @override + String redactedByBecause(String username, String reason) { + return 'Dihilangkan oleh $username karena: \"$reason\"'; + } + + @override + String redactedAnEvent(String username) { + return '$username menghapus sebuah peristiwa'; + } + + @override + String get redactMessage => 'Hapus pesan'; + + @override + String get register => 'Daftar'; + + @override + String get reject => 'Tolak'; + + @override + String rejectedTheInvitation(String username) { + return '$username menolak undangannya'; + } + + @override + String get rejoin => 'Gabung kembali'; + + @override + String get removeAllOtherDevices => 'Hapus semua perangkat lain'; + + @override + String removedBy(String username) { + return 'Dihapus oleh $username'; + } + + @override + String get removeDevice => 'Hapus perangkat'; + + @override + String get unbanFromChat => 'Hilangkan cekalan dari obrolan'; + + @override + String get removeYourAvatar => 'Hapus avatarmu'; + + @override + String get replaceRoomWithNewerVersion => + 'Menggantikan ruangan dengan versi baru'; + + @override + String get reply => 'Balas'; + + @override + String get reportMessage => 'Laporkan pesan'; + + @override + String get translateMessage => 'Translate message'; + + @override + String get translatedMessage => 'Translated message'; + + @override + String get errorTranslatingMessage => + 'An error has occured while translating the message.'; + + @override + String get recoverMessage => 'Recover message'; + + @override + String get recoveredMessage => 'Recovered message'; + + @override + String get errorRecoveringMessage => + 'An error has occured while recovering the message.'; + + @override + String get errorRecoveringMessageNoAdmin => + 'This feature is available on Synapse homeservers only for adminstrators.'; + + @override + String get requestPermission => 'Minta izin'; + + @override + String get roomHasBeenUpgraded => 'Ruangan telah ditingkatkan'; + + @override + String get roomVersion => 'Versi ruangan'; + + @override + String get saveFile => 'Simpan file'; + + @override + String get retry => 'Retry'; + + @override + String get search => 'Cari'; + + @override + String get security => 'Keamanan'; + + @override + String get recoveryKey => 'Kunci pemulihan'; + + @override + String get recoveryKeyLost => 'Kunci pemulihan hilang?'; + + @override + String seenByUser(String username) { + return 'Dilihat oleh $username'; + } + + @override + String get send => 'Kirim'; + + @override + String get sendAMessage => 'Kirim pesan'; + + @override + String get sendAsText => 'Kirim sebagai teks'; + + @override + String get sendAudio => 'Kirim suara'; + + @override + String get sendFile => 'Kirim file'; + + @override + String get sendImage => 'Kirim gambar'; + + @override + String sendImages(int count) { + return 'Kirim $count gambar'; + } + + @override + String get sendMessages => 'Kirim pesan'; + + @override + String get sendOriginal => 'Kirim yang asli'; + + @override + String get sendSticker => 'Kirim stiker'; + + @override + String get sendVideo => 'Kirim video'; + + @override + String sentAFile(String username) { + return '📁 $username mengirim file'; + } + + @override + String sentAnAudio(String username) { + return '🎤 $username mengirim suara'; + } + + @override + String sentAPicture(String username) { + return '🖼️ $username mengirim gambar'; + } + + @override + String sentASticker(String username) { + return '😊 $username mengirim stiker'; + } + + @override + String sentAVideo(String username) { + return '🎥 $username mengirim video'; + } + + @override + String sentCallInformations(String senderName) { + return '$senderName mengirim informasi panggilan'; + } + + @override + String get separateChatTypes => 'Pisahkan Pesan Langsung dan Grup'; + + @override + String get setAsCanonicalAlias => 'Atur sebagai alias utama'; + + @override + String get setCustomEmotes => 'Tetapkan emote kustom'; + + @override + String get setChatDescription => 'Lihat deskripsi obrolan'; + + @override + String get setInvitationLink => 'Tetapkan tautan undangan'; + + @override + String get setPermissionsLevel => 'Tetapkan level izin'; + + @override + String get setStatus => 'Tetapkan status'; + + @override + String get settings => 'Pengaturan'; + + @override + String get share => 'Bagikan'; + + @override + String sharedTheLocation(String username) { + return '$username membagikan lokasinya'; + } + + @override + String get shareLocation => 'Bagikan lokasi'; + + @override + String get showPassword => 'Tampilkan kata sandi'; + + @override + String get presenceStyle => 'Presensi:'; + + @override + String get hideAvatarsInInvites => 'Hide avatars in invites'; + + @override + String get hideAvatarsInInvitesDescription => + 'Do not show room avatars in invites'; + + @override + String get presencesToggle => 'Tampilkan pesan status dari pengguna lain'; + + @override + String get pureBlackToggle => 'Pure Black'; + + @override + String get singlesignon => 'Login Masuk Tunggal'; + + @override + String get skip => 'Lewat'; + + @override + String get sourceCode => 'Kode sumber'; + + @override + String get spaceIsPublic => 'Space publik'; + + @override + String get spaceName => 'Nama space'; + + @override + String startedACall(String senderName) { + return '$senderName memulai panggilan'; + } + + @override + String get startFirstChat => 'Mulai obrolan pertamamu'; + + @override + String get status => 'Status'; + + @override + String get statusExampleMessage => 'Apa kabar hari ini?'; + + @override + String get submit => 'Kirim'; + + @override + String get synchronizingPleaseWait => 'Menyinkronkan... Mohon tunggu.'; + + @override + String synchronizingPleaseWaitCounter(String percentage) { + return ' Sinkronisasi… ($percentage%)'; + } + + @override + String get systemTheme => 'Sistem'; + + @override + String get theyDontMatch => 'Tidak Cocok'; + + @override + String get theyMatch => 'Cocok'; + + @override + String get title => 'FluffyChat'; + + @override + String get toggleFavorite => 'Beralih Favorit'; + + @override + String get toggleMuted => 'Beralih Bisuan'; + + @override + String get toggleUnread => 'Tandai Baca/Belum Dibaca'; + + @override + String get tooManyRequestsWarning => + 'Terlalu banyak permintaan. Coba lagi nanti!'; + + @override + String get transferFromAnotherDevice => 'Transfer dari perangkat lain'; + + @override + String get tryToSendAgain => 'Coba kirim lagi'; + + @override + String get unavailable => 'Tidak tersedia'; + + @override + String unbannedUser(String username, String targetName) { + return '$username menghilangkan cekalan $targetName'; + } + + @override + String get unblockDevice => 'Hilangkan Pemblokiran Perangkat'; + + @override + String get unknownDevice => 'Perangkat tidak dikenal'; + + @override + String get unknownEncryptionAlgorithm => 'Algoritma enkripsi tidak dikenal'; + + @override + String unknownEvent(String type) { + return 'Peristiwa tidak dikenal \'$type\''; + } + + @override + String get unmuteChat => 'Bunyikan obrolan'; + + @override + String get unpin => 'Lepaskan pin'; + + @override + String unreadChats(int unreadCount) { + String _temp0 = intl.Intl.pluralLogic( + unreadCount, + locale: localeName, + other: '$unreadCount obrolan belum dibaca', + one: '1 obrolan belum dibaca', + ); + return '$_temp0'; + } + + @override + String userAndOthersAreTyping(String username, int count) { + return '$username dan $count lainnya sedang mengetik…'; + } + + @override + String userAndUserAreTyping(String username, String username2) { + return '$username dan $username2 sedang mengetik…'; + } + + @override + String userIsTyping(String username) { + return '$username sedang mengetik…'; + } + + @override + String userLeftTheChat(String username) { + return '🚪 $username keluar dari obrolan'; + } + + @override + String get username => 'Nama Pengguna'; + + @override + String userSentUnknownEvent(String username, String type) { + return '$username mengirim peristiwa $type'; + } + + @override + String get unverified => 'Tidak terverifikasi'; + + @override + String get verified => 'Terverifikasi'; + + @override + String get verify => 'Verifikasi'; + + @override + String get verifyStart => 'Mulai Verifikasi'; + + @override + String get verifySuccess => 'Kamu berhasil memverifikasi!'; + + @override + String get verifyTitle => 'Memverifikasi akun lain'; + + @override + String get videoCall => 'Panggilan video'; + + @override + String get visibilityOfTheChatHistory => 'Visibilitas sejarah obrolan'; + + @override + String get visibleForAllParticipants => 'Terlihat untuk semua anggota'; + + @override + String get visibleForEveryone => 'Terlihat untuk semua orang'; + + @override + String get voiceMessage => 'Pesan suara'; + + @override + String get waitingPartnerAcceptRequest => + 'Menunggu pengguna untuk menerima permintaan…'; + + @override + String get waitingPartnerEmoji => 'Menunggu pengguna untuk menerima emoji…'; + + @override + String get waitingPartnerNumbers => 'Menunggu pengguna untuk menerima angka…'; + + @override + String get wallpaper => 'Latar belakang:'; + + @override + String get warning => 'Peringatan!'; + + @override + String get weSentYouAnEmail => 'Kami mengirim kamu sebuah email'; + + @override + String get whoCanPerformWhichAction => + 'Siapa yang dapat melakukan tindakan apa'; + + @override + String get whoIsAllowedToJoinThisGroup => + 'Siapa yang dapat bergabung ke grup ini'; + + @override + String get whyDoYouWantToReportThis => 'Kenapa kamu ingin melaporkannya?'; + + @override + String get wipeChatBackup => + 'Hapus cadangan obrolan untuk membuat kunci pemulihan baru?'; + + @override + String get withTheseAddressesRecoveryDescription => + 'Dengan alamat ini kamu bisa memulihkan kata sandimu.'; + + @override + String get writeAMessage => 'Tulis pesan…'; + + @override + String get yes => 'Ya'; + + @override + String get you => 'Kamu'; + + @override + String get youAreNoLongerParticipatingInThisChat => + 'Kamu tidak berpartisipasi lagi di obrolan ini'; + + @override + String get youHaveBeenBannedFromThisChat => + 'Kamu telah dicekal dari obrolan ini'; + + @override + String get yourPublicKey => 'Kunci publikmu'; + + @override + String get messageInfo => 'Informasi pesan'; + + @override + String get time => 'Waktu'; + + @override + String get messageType => 'Tipe Pesan'; + + @override + String get sender => 'Pengirim'; + + @override + String get openGallery => 'Buka galeri'; + + @override + String get removeFromSpace => 'Hilangkan dari space'; + + @override + String get addToSpaceDescription => + 'Pilih sebuah space untuk menambahkan obrolan ke spacenya.'; + + @override + String get start => 'Mulai'; + + @override + String get pleaseEnterRecoveryKeyDescription => + 'Untuk mengakses pesan lamamu, mohon masukkan kunci pemulihanmu yang telah dibuat di sesi sebelumnya. Kunci pemulihanmu BUKAN kata sandimu.'; + + @override + String get publish => 'Publikasi'; + + @override + String videoWithSize(String size) { + return 'Video ($size)'; + } + + @override + String get openChat => 'Buka Chat'; + + @override + String get markAsRead => 'Tandai sebagai dibaca'; + + @override + String get reportUser => 'Laporkan pengguna'; + + @override + String get dismiss => 'Abaikan'; + + @override + String reactedWith(String sender, String reaction) { + return '$sender bereaksi dengan $reaction'; + } + + @override + String get pinMessage => 'Sematkan ke ruangan'; + + @override + String get confirmEventUnpin => + 'Apakah kamu yakin untuk melepaskan pin peristiwa ini secara permanen?'; + + @override + String get emojis => 'Emoji'; + + @override + String get placeCall => 'Lakukan panggilan'; + + @override + String get voiceCall => 'Panggilan suara'; + + @override + String get unsupportedAndroidVersion => 'Versi Android tidak didukung'; + + @override + String get unsupportedAndroidVersionLong => + 'Fitur ini memerlukan versi Android yang baru. Mohon periksa untuk pembaruan atau dukungan LineageOS.'; + + @override + String get videoCallsBetaWarning => + 'Dicatat bahwa panggilan video sedang dalam beta. Fitur ini mungkin tidak berkerja dengan benar atau tidak berkerja sama sekali pada semua platform.'; + + @override + String get experimentalVideoCalls => 'Panggilan video eksperimental'; + + @override + String get emailOrUsername => 'Email atau nama pengguna'; + + @override + String get indexedDbErrorTitle => 'Masalah dengan mode privat'; + + @override + String get indexedDbErrorLong => + 'Penyimpanan pesan sayangnya tidak diaktifkan dalam mode privat secara default.\nMohon kunjungi\n- about:config\n- tetapkan dom.indexedDB.privateBrowsing.enabled ke true\nJika tidak ditetapkan, FluffyChat tidak akan dapat dijalankan.'; + + @override + String switchToAccount(String number) { + return 'Ganti ke akun $number'; + } + + @override + String get nextAccount => 'Akun berikutnya'; + + @override + String get previousAccount => 'Akun sebelumnya'; + + @override + String get addWidget => 'Tambahkan widget'; + + @override + String get widgetVideo => 'Video'; + + @override + String get widgetEtherpad => 'Catatan teks'; + + @override + String get widgetJitsi => 'Jitsi Meet'; + + @override + String get widgetCustom => 'Kustom'; + + @override + String get widgetName => 'Nama'; + + @override + String get widgetUrlError => 'Ini bukan URL yang valid.'; + + @override + String get widgetNameError => 'Mohon sediakan sebuah nama tampilan.'; + + @override + String get errorAddingWidget => 'Terjadi kesalahan menambahkan widget.'; + + @override + String get youRejectedTheInvitation => 'Kamu menolak undangannya'; + + @override + String get youJoinedTheChat => 'Kamu bergabung ke obrolan'; + + @override + String get youAcceptedTheInvitation => '👍 Kamu menerima undangannya'; + + @override + String youBannedUser(String user) { + return 'Kamu mencekal $user'; + } + + @override + String youHaveWithdrawnTheInvitationFor(String user) { + return 'Kamu telah membatalkan undangan untuk $user'; + } + + @override + String youInvitedToBy(String alias) { + return '📩 Kamu telah diundang melalui surel ke:\n$alias'; + } + + @override + String youInvitedBy(String user) { + return '📩 Kamu telah diundang oleh $user'; + } + + @override + String invitedBy(String user) { + return '📩 Diundang oleh $user'; + } + + @override + String youInvitedUser(String user) { + return '📩 Kamu mengundang $user'; + } + + @override + String youKicked(String user) { + return '👞 Kamu mengeluarkan $user'; + } + + @override + String youKickedAndBanned(String user) { + return '🙅 Kamu mengeluarkan dan mencekal $user'; + } + + @override + String youUnbannedUser(String user) { + return 'Kamu membatalkan cekalan $user'; + } + + @override + String hasKnocked(String user) { + return '🚪 $user telah dikeluarkan'; + } + + @override + String get usersMustKnock => 'Pengguna harus mengetuk'; + + @override + String get noOneCanJoin => 'Tidak ada siapa pun yang dapat bergabung'; + + @override + String userWouldLikeToChangeTheChat(String user) { + return '$user ingin bergabung dengan obrolan.'; + } + + @override + String get noPublicLinkHasBeenCreatedYet => + 'Belum ada tautan publik yang dibuat'; + + @override + String get knock => 'Ketuk'; + + @override + String get users => 'Pengguna'; + + @override + String get unlockOldMessages => 'Akses pesan lama'; + + @override + String get storeInSecureStorageDescription => + 'Simpan kunci pemulihan di penyimpanan aman perangkat ini.'; + + @override + String get saveKeyManuallyDescription => + 'Simpan kunci ini secara manual dengan memicu dialog pembagian atau papan klip sistem.'; + + @override + String get storeInAndroidKeystore => 'Simpan di Android KeyStore'; + + @override + String get storeInAppleKeyChain => 'Simpan di Apple KeyChain'; + + @override + String get storeSecurlyOnThisDevice => 'Simpan secara aman di perangkat ini'; + + @override + String countFiles(int count) { + return '$count file'; + } + + @override + String get user => 'Pengguna'; + + @override + String get custom => 'Kustom'; + + @override + String get foregroundServiceRunning => + 'Notifikasi ini ditampilkan ketika layanan latar depan berjalan.'; + + @override + String get screenSharingTitle => 'membagikan layar'; + + @override + String get screenSharingDetail => 'Kamu membagikan layarmu di FluffyChat'; + + @override + String get callingPermissions => 'Perizinan panggilan'; + + @override + String get callingAccount => 'Akun pemanggilan'; + + @override + String get callingAccountDetails => + 'Memperbolehkan FluffyChat untuk menggunakan aplikasi penelepon Android bawaan.'; + + @override + String get appearOnTop => 'Tampilkan di atas'; + + @override + String get appearOnTopDetails => + 'Memperbolehkan aplikasi untuk ditampilkan di atas (tidak dibutuhkan jika kamu memiliki FluffyChat ditetapkan sebagai akun pemanggilan)'; + + @override + String get otherCallingPermissions => + 'Mikrofon, kamera dan perizinan FluffyChat lainnya'; + + @override + String get whyIsThisMessageEncrypted => + 'Mengapa pesan ini tidak bisa dibaca?'; + + @override + String get noKeyForThisMessage => + 'Hal ini bisa terjadi jika pesan dikirim sebelum kamu masuk ke akunmu di perangkat ini.\n\nMungkin juga pengirim telah memblokir perangkatmu atau ada yang tidak beres dengan koneksi internet.\n\nApakah kamu bisa membaca pesan pada sesi lain? Maka kamu bisa mentransfer pesan dari sesi tersebut! Buka Pengaturan > Perangkat dan pastikan bahwa perangkat Anda telah ditandatangani secara silang. Ketika kamu membuka ruangan di lain waktu dan kedua sesi berada di latar depan, kunci akan ditransmisikan secara otomatis.\n\nApakah kamu tidak mau kehilangan kunci saat keluar atau berpindah perangkat? Pastikan bahwa kamu telah mengaktifkan cadangan obrolan dalam pengaturan.'; + + @override + String get newGroup => 'Grup baru'; + + @override + String get newSpace => 'Space baru'; + + @override + String get enterSpace => 'Masuk space'; + + @override + String get enterRoom => 'Masuk ruangan'; + + @override + String get allSpaces => 'Semua space'; + + @override + String numChats(String number) { + return '$number obrolan'; + } + + @override + String get hideUnimportantStateEvents => + 'Sembunyikan peristiwa keadaan yang tidak penting'; + + @override + String get hidePresences => 'Sembunyikan Daftar Status?'; + + @override + String get doNotShowAgain => 'Jangan tampilkan lagi'; + + @override + String wasDirectChatDisplayName(String oldDisplayName) { + return 'Obrolan kosong (sebelumnya $oldDisplayName)'; + } + + @override + String get newSpaceDescription => + 'Fitur space bisa membantu untuk memisahkan obrolanmu dan membuat komunitas pribadi atau publik.'; + + @override + String get encryptThisChat => 'Enkripsi obrolan ini'; + + @override + String get disableEncryptionWarning => + 'Demi keamanan kamu tidak bisa menonaktifkan enkripsi dalam sebuah obrolan di mana sebelumbya sudah diaktifkan.'; + + @override + String get sorryThatsNotPossible => 'Maaf... itu tidak mungkin'; + + @override + String get deviceKeys => 'Kunci perangkat:'; + + @override + String get reopenChat => 'Buka obrolan lagi'; + + @override + String get noBackupWarning => + 'Peringatan! Tanpa mengaktifkan cadangan percakapan, kamu akan kehilangan akses ke pesan terenkripsimu. Disarankan untuk mengaktifkan cadangan percakapan terlebih dahulu sebelum keluar dari akun.'; + + @override + String get noOtherDevicesFound => 'Tidak ada perangkat lain yang ditemukan'; + + @override + String fileIsTooBigForServer(String max) { + return 'Tidak dapat mengirim! Server hanya mendukung lampiran sampai dengan $max.'; + } + + @override + String fileHasBeenSavedAt(String path) { + return 'Berkas telah disimpan di $path'; + } + + @override + String get jumpToLastReadMessage => 'Pergi ke pesan terakhir dibaca'; + + @override + String get readUpToHere => 'Baca sampai sini'; + + @override + String get jump => 'Lompat'; + + @override + String get openLinkInBrowser => 'Buka tautan dalam peramban'; + + @override + String get reportErrorDescription => + '😭 Aduh. Ada yang salah. Jika kamu mau, kamu bisa melaporkan kutu ini kepada para pengembang.'; + + @override + String get report => 'laporkan'; + + @override + String get signInWithPassword => 'Masuk dengan kata sandi'; + + @override + String get pleaseTryAgainLaterOrChooseDifferentServer => + 'Silakan coba lagi nanti atau pilih server yang lain.'; + + @override + String signInWith(String provider) { + return 'Masuk dengan $provider'; + } + + @override + String get profileNotFound => + 'Pengguna ini tidak dapat ditemukan di server. Mungkin ada masalah koneksi atau penggunanya tidak ada.'; + + @override + String get setTheme => 'Atur tema:'; + + @override + String get setColorTheme => 'Atur tema warna:'; + + @override + String get invite => 'Undang'; + + @override + String get inviteGroupChat => '📨 Undang percakapan grup'; + + @override + String get invitePrivateChat => '📨 Undang percakapan privat'; + + @override + String get invalidInput => 'Masukan tidak valid!'; + + @override + String wrongPinEntered(int seconds) { + return 'PIN yang dimasukkan salah! Coba lagi dalam $seconds detik...'; + } + + @override + String get pleaseEnterANumber => 'Silakan masukkan angka lebih dari 0'; + + @override + String get archiveRoomDescription => + 'Percakapan akan dipindahkan ke arsip. Pengguna lain akan melihat bahwa kamu telah meninggalkan percakapan.'; + + @override + String get roomUpgradeDescription => + 'Percakapannya akan dibuat ulang dengan versi ruangan yang baru. Semua anggota akan diberi tahu bahwa mereka harus ganti ke percakapan yang baru. Kamu bisa mempelajari lebih lanjut tentang versi ruangan di https://spec.matrix.org/latest/rooms/'; + + @override + String get removeDevicesDescription => + 'Kamu akan dikeluarkan dari perangkat ini dan tidak akan dapat menerima pesan lagi.'; + + @override + String get banUserDescription => + 'Pengguna akan dicekal dari percakapan dan tidak akan dapat memasuki percakapan lagi sampai dibatalkan cekalannya.'; + + @override + String get unbanUserDescription => + 'Pengguna akan dapat memasuki percakapannya lagi jika dicoba.'; + + @override + String get kickUserDescription => + 'Pengguna ini dikeluarkan dari percakapan tetapi tidak dicekal. Dalam percakapan publik, penggunanya dapat bergabung ulang kapan pun.'; + + @override + String get makeAdminDescription => + 'Setelah kamu membuat pengguna ini admin, kamu tidak akan dapat mengurungkan ini karena penggunanya akan memiliki perizinan yang sama seperti kamu.'; + + @override + String get pushNotificationsNotAvailable => + 'Notifikasi dorongan tidak tersedia'; + + @override + String get learnMore => 'Pelajari lebih lanjut'; + + @override + String get yourGlobalUserIdIs => 'ID pengguna globalmu adalah: '; + + @override + String noUsersFoundWithQuery(String query) { + return 'Sayangnya tidak ada pengguna yang dapat ditemukan dengan \"$query\". Silakan periksa jika ada tipo.'; + } + + @override + String get knocking => 'Mengetuk'; + + @override + String chatCanBeDiscoveredViaSearchOnServer(String server) { + return 'Obrolan dapat ditemukan melalui pencarian di $server'; + } + + @override + String get searchChatsRooms => 'Cari #percakapan, @pengguna...'; + + @override + String get nothingFound => 'Tidak ada yang ditemukan...'; + + @override + String get groupName => 'Nama grup'; + + @override + String get createGroupAndInviteUsers => + 'Buat sebuah grup dan undang pengguna'; + + @override + String get groupCanBeFoundViaSearch => 'Grup dapat dicari melalui pencarian'; + + @override + String get wrongRecoveryKey => + 'Maaf... ini sepertinya bukan kunci pemulihan yang benar.'; + + @override + String get startConversation => 'Mulai percakapan'; + + @override + String get commandHint_sendraw => 'Kirim JSON mentah'; + + @override + String get databaseMigrationTitle => 'Basis data sudah dioptimalkan'; + + @override + String get databaseMigrationBody => + 'Silakan tunggu. Ini dapat membutuhkan beberapa waktu.'; + + @override + String get leaveEmptyToClearStatus => + 'Tinggalkan kosong untuk menghapus statusmu.'; + + @override + String get select => 'Pilih'; + + @override + String get searchForUsers => 'Cari @pengguna...'; + + @override + String get pleaseEnterYourCurrentPassword => + 'Silakan masukkan kata sandimu saat ini'; + + @override + String get newPassword => 'Kata sandi baru'; + + @override + String get pleaseChooseAStrongPassword => + 'Silakan pilih kata sandi yang kuat'; + + @override + String get passwordsDoNotMatch => 'Kata sandi tidak cocok'; + + @override + String get passwordIsWrong => 'Kata sandi yang kamu masukkan salah'; + + @override + String get publicLink => 'Tautan publik'; + + @override + String get publicChatAddresses => 'Alamat obrolan umum'; + + @override + String get createNewAddress => 'Buat alamat baru'; + + @override + String get joinSpace => 'Bergabung ke space'; + + @override + String get publicSpaces => 'Space publik'; + + @override + String get addChatOrSubSpace => 'Tambahkan percakapan atau subspace'; + + @override + String get subspace => 'Subspace'; + + @override + String get decline => 'Tolak'; + + @override + String get thisDevice => 'Perangkat ini:'; + + @override + String get initAppError => 'Terjadi kesalahan saat init aplikasi'; + + @override + String get userRole => 'Peran pengguna'; + + @override + String minimumPowerLevel(String level) { + return '$level adalah tingkat daya minimum.'; + } + + @override + String searchIn(String chat) { + return 'Cari dalam obrolan \"$chat\"...'; + } + + @override + String get searchMore => 'Cari lebih banyak...'; + + @override + String get gallery => 'Galeri'; + + @override + String get files => 'Berkas'; + + @override + String databaseBuildErrorBody(String url, String error) { + return 'Tidak dapat membangun basis data SQLite. Aplikasi mencoba menggunakan basis data lawas untuk sekarang. Silakan laporkan kesalahan ini kepada pengembang di $url. Pesan kesalahannya adalah: $error'; + } + + @override + String sessionLostBody(String url, String error) { + return 'Sesimu hilang. Silakan laporkan kesalahan ini kepada pengembang di $url. Pesan kesalahannya adalah: $error'; + } + + @override + String restoreSessionBody(String url, String error) { + return 'Aplikasi sekarang mencoba memulihkan sesimu dari cadangan. Silakan laporkan kesalahan ini kepada pengembang di $url. Pesan kesalahannya adalah: $error'; + } + + @override + String forwardMessageTo(String roomName) { + return 'Teruskan pesan ke $roomName?'; + } + + @override + String get sendReadReceipts => 'Kirim laporan dibaca'; + + @override + String get sendTypingNotificationsDescription => + 'Anggota lain dalam percakapan dapat melihat ketika kamu sedang mengetik sebuah pesan baru.'; + + @override + String get sendReadReceiptsDescription => + 'Anggota lain dalam percakapan dapat melihat ketika kamu membaca sebuah pesan.'; + + @override + String get formattedMessages => 'Pesan yang diformat'; + + @override + String get formattedMessagesDescription => + 'Tampilkan konten pesan kaya seperti teks tebal menggunakan Markdown.'; + + @override + String get verifyOtherUser => '🔐 Verifikasi pengguna lain'; + + @override + String get verifyOtherUserDescription => + 'Jika kamu memverifikasi pengguna lain, kamu bisa yakin bahwa kamu tahu kepada siapa sebenarnya kamu menulis pesan kepadanya. 💪\n\nSaat kamu memulai verifikasi, kamu dan pengguna lain akan melihat pemberitahuan di aplikasi. Di sana kemudian akan melihat serangkaian emoji atau angka yang harus dibandingkan satu sama lain.\n\nCara terbaik untuk melakukannya adalah dengan bertemu secara langsung atau memulai panggilan video. 👭'; + + @override + String get verifyOtherDevice => '🔐 Verifikasi perangkat lain'; + + @override + String get verifyOtherDeviceDescription => + 'Saat kamu memverifikasi perangkat lain, perangkat tersebut dapat bertukar kunci, sehingga meningkatkan keamananmu secara keseluruhan. 💪 Saat Anda memulai verifikasi, sebuah pemberitahuan akan muncul di aplikasi pada kedua perangkat. Di situ kemudian akan melihat serangkaian emoji atau angka yang harus dibandingkan satu sama lain. Sebaiknya siapkan kedua perangkat sebelum kamu memulai verifikasi. 🤳'; + + @override + String acceptedKeyVerification(String sender) { + return '$sender menerima verifikasi kunci'; + } + + @override + String canceledKeyVerification(String sender) { + return '$sender membatalkan verifikasi kunci'; + } + + @override + String completedKeyVerification(String sender) { + return '$sender menyelesaikan verifikasi kunci'; + } + + @override + String isReadyForKeyVerification(String sender) { + return '$sender siap untuk verifikasi kunci'; + } + + @override + String requestedKeyVerification(String sender) { + return '$sender meminta verifikasi kunci'; + } + + @override + String startedKeyVerification(String sender) { + return '$sender memulai verifikasi kunci'; + } + + @override + String get transparent => 'Transparan'; + + @override + String get incomingMessages => 'Pesan masuk'; + + @override + String get stickers => 'Stiker'; + + @override + String get discover => 'Jelajahi'; + + @override + String get commandHint_ignore => 'Abaikan ID Matrix yang diberikan'; + + @override + String get commandHint_unignore => + 'Batalkan pengabaian ID Matrix yang diberikan'; + + @override + String unreadChatsInApp(String appname, String unread) { + return '$appname: $unread obrolan belum dibaca'; + } + + @override + String get noDatabaseEncryption => + 'Enkripsi basis data tidak didukung di platform ini'; + + @override + String thereAreCountUsersBlocked(Object count) { + return 'Saat ini ada $count pengguna yang diblokir.'; + } + + @override + String get restricted => 'Dibatasi'; + + @override + String get knockRestricted => 'Ketukan dibatasi'; + + @override + String goToSpace(Object space) { + return 'Pergi ke space: $space'; + } + + @override + String get markAsUnread => 'Tandai sebagai belum dibaca'; + + @override + String userLevel(int level) { + return '$level - Pengguna'; + } + + @override + String moderatorLevel(int level) { + return '$level - Moderator'; + } + + @override + String adminLevel(int level) { + return '$level - Admin'; + } + + @override + String get changeGeneralChatSettings => 'Ubah pengaturan chat umum'; + + @override + String get inviteOtherUsers => 'Undang pengguna lain ke chat ini'; + + @override + String get changeTheChatPermissions => 'Ubah perizinan chat'; + + @override + String get changeTheVisibilityOfChatHistory => + 'Ubah keterlihatan riwayat chat'; + + @override + String get changeTheCanonicalRoomAlias => 'Ubah alamat chat publik utama'; + + @override + String get sendRoomNotifications => 'Kirim notifikasi @room'; + + @override + String get changeTheDescriptionOfTheGroup => 'Ubah deskripsi chat'; + + @override + String get chatPermissionsDescription => + 'Tentukan tingkat kekuasaan yang diperlukan untuk tindakan tertentu dalam chat ini. Tingkat kekuasaan 0, 50 dan 100 biasanya mewakili pengguna, moderator dan admin, tetapi gradasi apa pun dimungkinkan.'; + + @override + String updateInstalled(String version) { + return '🎉 Pembaruan $version terpasang!'; + } + + @override + String get changelog => 'Catatan perubahan'; + + @override + String get sendCanceled => 'Pengiriman dibatalkan'; + + @override + String get loginWithMatrixId => 'Masuk dengan ID Matrix'; + + @override + String get discoverHomeservers => 'Jelajahi homeserver'; + + @override + String get whatIsAHomeserver => 'Apa itu homeserver?'; + + @override + String get homeserverDescription => + 'Semua data Anda disimpan di dalam server, seperti halnya penyedia email. Anda dapat memilih homeserver mana yang ingin Anda gunakan, sementara Anda masih dapat berkomunikasi dengan semua orang. Pelajari lebih lanjut di https://matrix.org.'; + + @override + String get doesNotSeemToBeAValidHomeserver => + 'Sepertinya bukan homeserver yang kompatibel. URL salah?'; + + @override + String get calculatingFileSize => 'Menghitung ukuran berkas...'; + + @override + String get prepareSendingAttachment => 'Menyiapkan pengiriman lampiran...'; + + @override + String get sendingAttachment => 'Mengirim lampiran...'; + + @override + String get generatingVideoThumbnail => 'Membuat gambar kecil video...'; + + @override + String get compressVideo => 'Mengompres video...'; + + @override + String sendingAttachmentCountOfCount(int index, int length) { + return 'Mengirim lampiran $index dari $length...'; + } + + @override + String serverLimitReached(int seconds) { + return 'Batasan server tercapai! Menunggu $seconds detik...'; + } + + @override + String get oneOfYourDevicesIsNotVerified => + 'Salah satu perangkat Anda tidak terverifikasi'; + + @override + String get noticeChatBackupDeviceVerification => + 'Catatan: Ketika Anda menghubungkan semua perangkat Anda ke cadangan chat, mereka akan diverifikasi secara otomatis.'; + + @override + String get continueText => 'Lanjutkan'; + + @override + String get welcomeText => + 'Halo 👋 Ini FluffyChat. Kamu bisa masuk ke homeserver mana pun, yang kompatibel dengan https://matrix.org. Lalu, chat dengan siapa pun. Ini merupakan jaringan perpesanan besar yang terdesentralisasi!'; + + @override + String get blur => 'Buram:'; + + @override + String get opacity => 'Opasitas:'; + + @override + String get setWallpaper => 'Atur later belakang'; + + @override + String get manageAccount => 'Kelola akun'; + + @override + String get noContactInformationProvided => + 'Server tidak menyediakan informasi kontak valid apa pun'; + + @override + String get contactServerAdmin => 'Hubungi admin server'; + + @override + String get contactServerSecurity => 'Hubungi keamanan server'; + + @override + String get supportPage => 'Laman dukungan'; + + @override + String get serverInformation => 'Informasi server:'; + + @override + String get name => 'Nama'; + + @override + String get version => 'Versi'; + + @override + String get website => 'Situs Web'; + + @override + String get compress => 'Kompres'; + + @override + String get boldText => 'Teks tebal'; + + @override + String get italicText => 'Teks miring'; + + @override + String get strikeThrough => 'Coret'; + + @override + String get pleaseFillOut => 'Silakan isi'; + + @override + String get invalidUrl => 'URL tidak valid'; + + @override + String get addLink => 'Tambahkan tautan'; + + @override + String get unableToJoinChat => + 'Tidak dapat bergabung dalam chat. Mungkin pihak lain telah menutup percakapan.'; + + @override + String get previous => 'Sebelumnya'; + + @override + String get otherPartyNotLoggedIn => + 'Pihak lain belum masuk dan tidak dapat menerima pesan!'; + + @override + String appWantsToUseForLogin(String server) { + return 'Gunakan \'$server\' untuk masuk'; + } + + @override + String get appWantsToUseForLoginDescription => + 'Anda memperbolehkan aplikasi dan situs web membagikan informasi tentang Anda.'; + + @override + String get open => 'Buka'; + + @override + String get waitingForServer => 'Menunggu server...'; + + @override + String get appIntroduction => + 'FluffyChat memungkinkanmu untuk mengobrol dengan teman-temanmu di berbagai perpesanan. Pelajari lebih lanjut di https://matrix.org atau ketuk *Lanjutkan* saja.'; + + @override + String get newChatRequest => '📩 Permintaan pesan baru'; + + @override + String get contentNotificationSettings => 'Pengaturan notifikasi konten'; + + @override + String get generalNotificationSettings => 'Pengaturan notifikasi umum'; + + @override + String get roomNotificationSettings => 'Pengaturan notifikasi ruangan'; + + @override + String get userSpecificNotificationSettings => + 'Pengaturan notifikasi spesifik pengguna'; + + @override + String get otherNotificationSettings => 'Pengaturan notifikasi lainnya'; + + @override + String get notificationRuleContainsUserName => 'Berisi Nama Pengguna'; + + @override + String get notificationRuleContainsUserNameDescription => + 'Memberi tahu pengguna ketika pesan memiliki nama penggunanya.'; + + @override + String get notificationRuleMaster => 'Bisukan semua notifikasi'; + + @override + String get notificationRuleMasterDescription => + 'Menimpa peraturan lainnya dan menonaktifkan semua notifikasi.'; + + @override + String get notificationRuleSuppressNotices => 'Dimakan Pesan Terautomasi'; + + @override + String get notificationRuleSuppressNoticesDescription => + 'Mendiamkan notifikasi dari klien terautomasi seperti bot.'; + + @override + String get notificationRuleInviteForMe => 'Undang untuk Aku'; + + @override + String get notificationRuleInviteForMeDescription => + 'Memberi tahu pengguna ketika diundang ke ruangan.'; + + @override + String get notificationRuleMemberEvent => 'Peristiwa Anggota'; + + @override + String get notificationRuleMemberEventDescription => + 'Mendiamkan notifikasi peristiwa keanggotaan.'; + + @override + String get notificationRuleIsUserMention => 'Sebutan Pengguna'; + + @override + String get notificationRuleIsUserMentionDescription => + 'Memberi tahu pengguna ketika disebut secara langsung dalam pesan.'; + + @override + String get notificationRuleContainsDisplayName => 'Berisi Nama Tampilan'; + + @override + String get notificationRuleContainsDisplayNameDescription => + 'Memberi tahu pengguna ketika pesan berisi nama tampilannya.'; + + @override + String get notificationRuleIsRoomMention => 'Sebutan Ruangan'; + + @override + String get notificationRuleIsRoomMentionDescription => + 'Memberi tahu pengguna ketika ada sebutan ruangan.'; + + @override + String get notificationRuleRoomnotif => 'Notifikasi Ruangan'; + + @override + String get notificationRuleRoomnotifDescription => + 'Memberi tahu pengguna ketika pesan berisi \'@room\'.'; + + @override + String get notificationRuleTombstone => 'Nisan'; + + @override + String get notificationRuleTombstoneDescription => + 'Memberi tahu pengguna tentang pesan deaktivasi ruangan.'; + + @override + String get notificationRuleReaction => 'Reaksi'; + + @override + String get notificationRuleReactionDescription => + 'Mendiamkan notifikasi reaksi.'; + + @override + String get notificationRuleRoomServerAcl => 'ACL Server Ruangan'; + + @override + String get notificationRuleRoomServerAclDescription => + 'Mendiamkan notifikasi daftar kontrol akses server ruangan (ACL).'; + + @override + String get notificationRuleSuppressEdits => 'Diamkan Penyuntingan'; + + @override + String get notificationRuleSuppressEditsDescription => + 'Mendiamkan notifikasi pesan tersunting.'; + + @override + String get notificationRuleCall => 'Panggilan'; + + @override + String get notificationRuleCallDescription => + 'Memberi tahu pengguna tentang panggilan.'; + + @override + String get notificationRuleEncryptedRoomOneToOne => + 'Ruangan Terenkripsi Satu ke Satu'; + + @override + String get notificationRuleEncryptedRoomOneToOneDescription => + 'Memberi tahu pengguna tentang pesan dalam ruangan satu ke satu.'; + + @override + String get notificationRuleRoomOneToOne => 'Ruangan Satu ke Satu'; + + @override + String get notificationRuleRoomOneToOneDescription => + 'Memberi tahu pengguna tentang pesan dalam ruangan satu ke satu.'; + + @override + String get notificationRuleMessage => 'Pesan'; + + @override + String get notificationRuleMessageDescription => + 'Memberi tahu pengguna tentang pesan umum.'; + + @override + String get notificationRuleEncrypted => 'Terenkripsi'; + + @override + String get notificationRuleEncryptedDescription => + 'Memberi tahu pengguna tentang pesan dalam ruangan terenkripsi.'; + + @override + String get notificationRuleJitsi => 'Jitsi'; + + @override + String get notificationRuleJitsiDescription => + 'Memberi tahu pengguna tentang peristiwa widget Jitsi.'; + + @override + String get notificationRuleServerAcl => 'Diamkan Peristiwa ACL Server'; + + @override + String get notificationRuleServerAclDescription => + 'Mendiamkan notifikasi peristiwa ACL server.'; + + @override + String unknownPushRule(String rule) { + return 'Aturan dorongan \'$rule\' tidak diketahui'; + } + + @override + String get deletePushRuleCanNotBeUndone => + 'Jika kamu menghapus pengaturan notifikasi ini, maka tidak dapat diurungkan.'; + + @override + String get more => 'Tambahan'; + + @override + String get shareKeysWith => 'Bagikan kunci dengan...'; + + @override + String get shareKeysWithDescription => + 'Perangkat apa saja yang dipercayai supaya mereka bisa membaca bersama dengan pesanmu dalam obrolan terenkripsi?'; + + @override + String get allDevices => 'Semua perangkat'; + + @override + String get crossVerifiedDevicesIfEnabled => + 'Verifikasi silang perangkat jika diaktifkan'; + + @override + String get crossVerifiedDevices => 'Perangkat terverifikasi silang'; + + @override + String get verifiedDevicesOnly => 'Perangkat terverifikasi saja'; + + @override + String get takeAPhoto => 'Ambil foto'; + + @override + String get recordAVideo => 'Rekam video'; + + @override + String get optionalMessage => 'Pesan (opsional)...'; + + @override + String get notSupportedOnThisDevice => 'Tidak didukung pada perangkat ini'; + + @override + String get enterNewChat => 'Masuk ke obrolan baru'; + + @override + String get approve => 'Approve'; + + @override + String get youHaveKnocked => 'You have knocked'; + + @override + String get pleaseWaitUntilInvited => + 'Please wait now, until someone from the room invites you.'; +} diff --git a/lib/generated/l10n/l10n_ie.dart b/lib/generated/l10n/l10n_ie.dart new file mode 100644 index 0000000..aea6782 --- /dev/null +++ b/lib/generated/l10n/l10n_ie.dart @@ -0,0 +1,2744 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'l10n.dart'; + +// ignore_for_file: type=lint + +/// The translations for Interlingue Occidental (`ie`). +class L10nIe extends L10n { + L10nIe([String locale = 'ie']) : super(locale); + + @override + String get noSendPermission => 'You can\'t send messages here'; + + @override + String get alwaysUse24HourFormat => 'false'; + + @override + String get repeatPassword => 'Repetir li contrasigne'; + + @override + String get notAnImage => 'Not an image file.'; + + @override + String get setCustomPermissionLevel => 'Set custom permission level'; + + @override + String get setPermissionsLevelDescription => + 'Please choose a predefined role below or enter a custom permission level between 0 and 100.'; + + @override + String get ignoreUser => 'Ignore user'; + + @override + String get normalUser => 'Normal user'; + + @override + String get remove => 'Remover'; + + @override + String get importNow => 'Import now'; + + @override + String get importEmojis => 'Import Emojis'; + + @override + String get importFromZipFile => 'Import from .zip file'; + + @override + String get exportEmotePack => 'Export Emote pack as .zip'; + + @override + String get replace => 'Replace'; + + @override + String get about => 'Pri'; + + @override + String aboutHomeserver(String homeserver) { + return 'About $homeserver'; + } + + @override + String get accept => 'Acceptar'; + + @override + String acceptedTheInvitation(String username) { + return '$username ha acceptat li invitation'; + } + + @override + String get account => 'Conto'; + + @override + String activatedEndToEndEncryption(String username) { + return '🔐 $username activated end to end encryption'; + } + + @override + String get addEmail => 'Adjunter e-post'; + + @override + String get confirmMatrixId => + 'Ples confirmar vor Matrix ID por destructer vor conto.'; + + @override + String supposedMxid(String mxid) { + return 'To deve esser $mxid'; + } + + @override + String get addChatDescription => 'Add a chat description...'; + + @override + String get addToSpace => 'Adjunter al spacie'; + + @override + String get admin => 'Administrator'; + + @override + String get alias => 'pseudonim'; + + @override + String get all => 'Omni'; + + @override + String get allChats => 'Omni conversationes'; + + @override + String get commandHint_roomupgrade => + 'Upgrade this room to the given room version'; + + @override + String get commandHint_googly => 'Send some googly eyes'; + + @override + String get commandHint_cuddle => 'Send a cuddle'; + + @override + String get commandHint_hug => 'Send a hug'; + + @override + String googlyEyesContent(String senderName) { + return '$senderName sends you googly eyes'; + } + + @override + String cuddleContent(String senderName) { + return '$senderName cuddles you'; + } + + @override + String hugContent(String senderName) { + return '$senderName hugs you'; + } + + @override + String answeredTheCall(String senderName) { + return '$senderName answered the call'; + } + + @override + String get anyoneCanJoin => 'Alquí posse adherer se'; + + @override + String get appLock => 'App lock'; + + @override + String get appLockDescription => + 'Lock the app when not using with a pin code'; + + @override + String get archive => 'Archive'; + + @override + String get areGuestsAllowedToJoin => 'Are guest users allowed to join'; + + @override + String get areYouSure => 'Esque vu es cert?'; + + @override + String get areYouSureYouWantToLogout => 'Esque vu vole cluder li session?'; + + @override + String get askSSSSSign => + 'To be able to sign the other person, please enter your secure store passphrase or recovery key.'; + + @override + String askVerificationRequest(String username) { + return 'Esque acceptar ti demanda de verification de $username?'; + } + + @override + String get autoplayImages => 'Automaticmen reproducter animat images'; + + @override + String badServerLoginTypesException(String serverVersions, + String supportedVersions, Object suportedVersions) { + return 'Li hem-servitor supporta ti tipes de autentication:\n$serverVersions\nMa ti-ci application supporta solmen:\n$supportedVersions'; + } + + @override + String get sendTypingNotifications => 'Send typing notifications'; + + @override + String get swipeRightToLeftToReply => 'Swipe right to left to reply'; + + @override + String get sendOnEnter => 'Inviar per Enter'; + + @override + String badServerVersionsException(String serverVersions, + String supportedVersions, Object serverVerions, Object suportedVersions) { + return 'Li hem-servitor supporta ti versiones de specification:\n$serverVersions\nMa ti-ci application supporta solmen $supportedVersions'; + } + + @override + String countChatsAndCountParticipants(int chats, int participants) { + return '$chats chats and $participants participants'; + } + + @override + String get noMoreChatsFound => 'No more chats found...'; + + @override + String get noChatsFoundHere => + 'No chats found here yet. Start a new chat with someone by using the button below. ⤵️'; + + @override + String get joinedChats => 'Joined chats'; + + @override + String get unread => 'Unread'; + + @override + String get space => 'Space'; + + @override + String get spaces => 'Spaces'; + + @override + String get banFromChat => 'Bannir del conversation'; + + @override + String get banned => 'Bannit'; + + @override + String bannedUser(String username, String targetName) { + return '$username ha bannit $targetName'; + } + + @override + String get blockDevice => 'Blocar li aparate'; + + @override + String get blocked => 'Blocat'; + + @override + String get botMessages => 'Missages de robots'; + + @override + String get cancel => 'Anullar'; + + @override + String cantOpenUri(String uri) { + return 'Ne successat aperter li adresse $uri'; + } + + @override + String get changeDeviceName => 'Cambiar li nómine de aparate'; + + @override + String changedTheChatAvatar(String username) { + return '$username changed the chat avatar'; + } + + @override + String changedTheChatDescriptionTo(String username, String description) { + return '$username changed the chat description to: \'$description\''; + } + + @override + String changedTheChatNameTo(String username, String chatname) { + return '$username changed the chat name to: \'$chatname\''; + } + + @override + String changedTheChatPermissions(String username) { + return '$username changed the chat permissions'; + } + + @override + String changedTheDisplaynameTo(String username, String displayname) { + return '$username changed their displayname to: \'$displayname\''; + } + + @override + String changedTheGuestAccessRules(String username) { + return '$username changed the guest access rules'; + } + + @override + String changedTheGuestAccessRulesTo(String username, String rules) { + return '$username changed the guest access rules to: $rules'; + } + + @override + String changedTheHistoryVisibility(String username) { + return '$username changed the history visibility'; + } + + @override + String changedTheHistoryVisibilityTo(String username, String rules) { + return '$username changed the history visibility to: $rules'; + } + + @override + String changedTheJoinRules(String username) { + return '$username changed the join rules'; + } + + @override + String changedTheJoinRulesTo(String username, String joinRules) { + return '$username changed the join rules to: $joinRules'; + } + + @override + String changedTheProfileAvatar(String username) { + return '$username changed their avatar'; + } + + @override + String changedTheRoomAliases(String username) { + return '$username changed the room aliases'; + } + + @override + String changedTheRoomInvitationLink(String username) { + return '$username changed the invitation link'; + } + + @override + String get changePassword => 'Cambiar li contrasigne'; + + @override + String get changeTheHomeserver => 'Cambiar li hem-servitor'; + + @override + String get changeTheme => 'Cambiar li stil'; + + @override + String get changeTheNameOfTheGroup => 'Change the name of the group'; + + @override + String get changeYourAvatar => 'Cambiar vor avatar'; + + @override + String get channelCorruptedDecryptError => + 'The encryption has been corrupted'; + + @override + String get chat => 'Conversation'; + + @override + String get yourChatBackupHasBeenSetUp => 'Your chat backup has been set up.'; + + @override + String get chatBackup => 'Archive de conversation'; + + @override + String get chatBackupDescription => + 'Your old messages are secured with a recovery key. Please make sure you don\'t lose it.'; + + @override + String get chatDetails => 'Detallies del conversation'; + + @override + String get chatHasBeenAddedToThisSpace => 'Chat has been added to this space'; + + @override + String get chats => 'Conversationes'; + + @override + String get chooseAStrongPassword => 'Choose a strong password'; + + @override + String get clearArchive => 'Vacuar li archive'; + + @override + String get close => 'Cluder'; + + @override + String get commandHint_markasdm => + 'Mark as direct message room for the giving Matrix ID'; + + @override + String get commandHint_markasgroup => 'Marcar quam gruppe'; + + @override + String get commandHint_ban => 'Ban the given user from this room'; + + @override + String get commandHint_clearcache => 'Vacuar li cache'; + + @override + String get commandHint_create => + 'Create an empty group chat\nUse --no-encryption to disable encryption'; + + @override + String get commandHint_discardsession => 'Discard session'; + + @override + String get commandHint_dm => + 'Start a direct chat\nUse --no-encryption to disable encryption'; + + @override + String get commandHint_html => 'Inviar contenete HTML'; + + @override + String get commandHint_invite => 'Invite the given user to this room'; + + @override + String get commandHint_join => 'Join the given room'; + + @override + String get commandHint_kick => 'Remove the given user from this room'; + + @override + String get commandHint_leave => 'Forlassar ti chambre'; + + @override + String get commandHint_me => 'Ples descrir vos'; + + @override + String get commandHint_myroomavatar => + 'Set your picture for this room (by mxc-uri)'; + + @override + String get commandHint_myroomnick => 'Set your display name for this room'; + + @override + String get commandHint_op => + 'Set the given user\'s power level (default: 50)'; + + @override + String get commandHint_plain => 'Inviar textu sin formate'; + + @override + String get commandHint_react => 'Send reply as a reaction'; + + @override + String get commandHint_send => 'Inviar li textu'; + + @override + String get commandHint_unban => 'Unban the given user from this room'; + + @override + String get commandInvalid => 'Comande es ínvalid'; + + @override + String commandMissing(String command) { + return '$command is not a command.'; + } + + @override + String get compareEmojiMatch => 'Please compare the emojis'; + + @override + String get compareNumbersMatch => 'Please compare the numbers'; + + @override + String get configureChat => 'Configurar li conversation'; + + @override + String get confirm => 'Confirmar'; + + @override + String get connect => 'Conexer'; + + @override + String get contactHasBeenInvitedToTheGroup => + 'Contact has been invited to the group'; + + @override + String get containsDisplayName => 'Contene li visibil nómine'; + + @override + String get containsUserName => 'Contene li nómine'; + + @override + String get contentHasBeenReported => + 'The content has been reported to the server admins'; + + @override + String get copiedToClipboard => 'Copiat al Paperiere'; + + @override + String get copy => 'Copiar'; + + @override + String get copyToClipboard => 'Copiar al Paperiere'; + + @override + String couldNotDecryptMessage(String error) { + return 'Could not decrypt message: $error'; + } + + @override + String countParticipants(int count) { + return '$count participantes'; + } + + @override + String get create => 'Crear'; + + @override + String createdTheChat(String username) { + return '💬 $username created the chat'; + } + + @override + String get createGroup => 'Create group'; + + @override + String get createNewSpace => 'Crear un spacie'; + + @override + String get currentlyActive => 'Activ actualmen'; + + @override + String get darkTheme => 'Obscur'; + + @override + String dateAndTimeOfDay(String date, String timeOfDay) { + return '$date, $timeOfDay'; + } + + @override + String dateWithoutYear(String month, String day) { + return '$day.$month'; + } + + @override + String dateWithYear(String year, String month, String day) { + return '$day.$month.$year'; + } + + @override + String get deactivateAccountWarning => + 'This will deactivate your user account. This can not be undone! Are you sure?'; + + @override + String get defaultPermissionLevel => 'Default permission level for new users'; + + @override + String get delete => 'Remover'; + + @override + String get deleteAccount => 'Destructer li conto'; + + @override + String get deleteMessage => 'Remover li missage'; + + @override + String get device => 'Aparate'; + + @override + String get deviceId => 'ID de aparate'; + + @override + String get devices => 'Aparates'; + + @override + String get directChats => 'Direct conversationes'; + + @override + String get allRooms => 'All Group Chats'; + + @override + String get displaynameHasBeenChanged => 'Displayname has been changed'; + + @override + String get downloadFile => 'Descargar li file'; + + @override + String get edit => 'Redacter'; + + @override + String get editBlockedServers => 'Modificar blocat servitores'; + + @override + String get chatPermissions => 'Chat permissions'; + + @override + String get editDisplayname => 'Redacter li visibil nómine'; + + @override + String get editRoomAliases => 'Modificar pseudonimos del chambre'; + + @override + String get editRoomAvatar => 'Modificar li avatar del chambre'; + + @override + String get emoteExists => 'Emotion ja existe!'; + + @override + String get emoteInvalid => 'Invalid emote shortcode!'; + + @override + String get emoteKeyboardNoRecents => + 'Recently-used emotes will appear here...'; + + @override + String get emotePacks => 'Emote packs for room'; + + @override + String get emoteSettings => 'Parametres de emotiones'; + + @override + String get globalChatId => 'Global chat ID'; + + @override + String get accessAndVisibility => 'Access and visibility'; + + @override + String get accessAndVisibilityDescription => + 'Who is allowed to join this chat and how the chat can be discovered.'; + + @override + String get calls => 'Calls'; + + @override + String get customEmojisAndStickers => 'Custom emojis and stickers'; + + @override + String get customEmojisAndStickersBody => + 'Add or share custom emojis or stickers which can be used in any chat.'; + + @override + String get emoteShortcode => 'Curt-code de emotion'; + + @override + String get emoteWarnNeedToPick => + 'You need to pick an emote shortcode and an image!'; + + @override + String get emptyChat => 'Vacui conversation'; + + @override + String get enableEmotesGlobally => 'Enable emote pack globally'; + + @override + String get enableEncryption => 'Activar li ciffration'; + + @override + String get enableEncryptionWarning => + 'You won\'t be able to disable the encryption anymore. Are you sure?'; + + @override + String get encrypted => 'Ciffrat'; + + @override + String get encryption => 'Ciffration'; + + @override + String get encryptionNotEnabled => 'Encryption is not enabled'; + + @override + String endedTheCall(String senderName) { + return '$senderName ended the call'; + } + + @override + String get enterAnEmailAddress => 'Enter an email address'; + + @override + String get homeserver => 'Hem-servitor'; + + @override + String get enterYourHomeserver => 'Provide vor hem-servitor'; + + @override + String errorObtainingLocation(String error) { + return 'Error obtaining location: $error'; + } + + @override + String get everythingReady => 'Omni es pret!'; + + @override + String get extremeOffensive => 'Extremmen offensiv'; + + @override + String get fileName => 'Nómine de file'; + + @override + String get fluffychat => 'FluffyChat'; + + @override + String get fontSize => 'Dimension de fonde'; + + @override + String get forward => 'Avan'; + + @override + String get fromJoining => 'Pro adhesion'; + + @override + String get fromTheInvitation => 'Pro invitation'; + + @override + String get goToTheNewRoom => 'Go to the new room'; + + @override + String get group => 'Gruppe'; + + @override + String get chatDescription => 'Chat description'; + + @override + String get chatDescriptionHasBeenChanged => 'Chat description changed'; + + @override + String get groupIsPublic => 'Gruppe es public'; + + @override + String get groups => 'Gruppes'; + + @override + String groupWith(String displayname) { + return 'Gruppe con $displayname'; + } + + @override + String get guestsAreForbidden => 'Guests are forbidden'; + + @override + String get guestsCanJoin => 'Guests can join'; + + @override + String hasWithdrawnTheInvitationFor(String username, String targetName) { + return '$username has withdrawn the invitation for $targetName'; + } + + @override + String get help => 'Auxilie'; + + @override + String get hideRedactedEvents => 'Hide redacted events'; + + @override + String get hideRedactedMessages => 'Hide redacted messages'; + + @override + String get hideRedactedMessagesBody => + 'If someone redacts a message, this message won\'t be visible in the chat anymore.'; + + @override + String get hideInvalidOrUnknownMessageFormats => + 'Hide invalid or unknown message formats'; + + @override + String get howOffensiveIsThisContent => 'How offensive is this content?'; + + @override + String get id => 'ID'; + + @override + String get identity => 'Identitá'; + + @override + String get block => 'Block'; + + @override + String get blockedUsers => 'Blocked users'; + + @override + String get blockListDescription => + 'You can block users who are disturbing you. You won\'t be able to receive any messages or room invites from the users on your personal block list.'; + + @override + String get blockUsername => 'Ignore username'; + + @override + String get iHaveClickedOnLink => 'I have clicked on the link'; + + @override + String get incorrectPassphraseOrKey => 'Incorrect passphrase or recovery key'; + + @override + String get inoffensive => 'Ínoffensiv'; + + @override + String get inviteContact => 'Invitar un contacte'; + + @override + String inviteContactToGroupQuestion(Object contact, Object groupName) { + return 'Do you want to invite $contact to the chat \"$groupName\"?'; + } + + @override + String inviteContactToGroup(String groupName) { + return 'Invite contact to $groupName'; + } + + @override + String get noChatDescriptionYet => 'No chat description created yet.'; + + @override + String get tryAgain => 'Try again'; + + @override + String get invalidServerName => 'Invalid server name'; + + @override + String get invited => 'Invitat'; + + @override + String get redactMessageDescription => + 'The message will be redacted for all participants in this conversation. This cannot be undone.'; + + @override + String get optionalRedactReason => + '(Optional) Reason for redacting this message...'; + + @override + String invitedUser(String username, String targetName) { + return '$username invitat $targetName'; + } + + @override + String get invitedUsersOnly => 'Solmen invitat usatores'; + + @override + String get inviteForMe => 'Invitationes por me'; + + @override + String inviteText(String username, String link) { + return '$username invited you to Extera.\n1. Visit fluffychat.im and install the app \n2. Sign up or sign in \n3. Open the invite link: \n $link'; + } + + @override + String get isTyping => 'tippa…'; + + @override + String joinedTheChat(String username) { + return '👋 $username joined the chat'; + } + + @override + String get joinRoom => 'Adherer al chambre'; + + @override + String kicked(String username, String targetName) { + return '👞 $username kicked $targetName'; + } + + @override + String kickedAndBanned(String username, String targetName) { + return '🙅 $username kicked and banned $targetName'; + } + + @override + String get kickFromChat => 'Kick from chat'; + + @override + String lastActiveAgo(String localizedTimeShort) { + return 'Ultim activité: $localizedTimeShort'; + } + + @override + String get leave => 'Forlassar'; + + @override + String get leftTheChat => 'Surtit ex li conversation'; + + @override + String get license => 'Licentie'; + + @override + String get lightTheme => 'Lucid'; + + @override + String loadCountMoreParticipants(int count) { + return 'Load $count more participants'; + } + + @override + String get dehydrate => 'Export session and wipe device'; + + @override + String get dehydrateWarning => + 'This action cannot be undone. Ensure you safely store the backup file.'; + + @override + String get dehydrateTor => 'TOR Users: Export session'; + + @override + String get dehydrateTorLong => + 'For TOR users, it is recommended to export the session before closing the window.'; + + @override + String get hydrateTor => 'TOR Users: Import session export'; + + @override + String get hydrateTorLong => + 'Did you export your session last time on TOR? Quickly import it and continue chatting.'; + + @override + String get hydrate => 'Restore from backup file'; + + @override + String get loadingPleaseWait => 'Cargante... ples atender.'; + + @override + String get loadMore => 'Cargar plu…'; + + @override + String get locationDisabledNotice => + 'Location services are disabled. Please enable them to be able to share your location.'; + + @override + String get locationPermissionDeniedNotice => + 'Location permission denied. Please grant them to be able to share your location.'; + + @override + String get login => 'Aperter li session'; + + @override + String logInTo(String homeserver) { + return 'Log in to $homeserver'; + } + + @override + String get logout => 'Cluder li session'; + + @override + String get memberChanges => 'Cambios inter membres'; + + @override + String get mention => 'Mentionar'; + + @override + String get messages => 'Missages'; + + @override + String get messagesStyle => 'Messages:'; + + @override + String get moderator => 'Moderator'; + + @override + String get muteChat => 'Assurdar li conversation'; + + @override + String get needPantalaimonWarning => + 'Please be aware that you need Pantalaimon to use end-to-end encryption for now.'; + + @override + String get newChat => 'Crear un conversation'; + + @override + String get newMessageInFluffyChat => '💬 New message in Extera'; + + @override + String get newVerificationRequest => 'Nov demanda de verification!'; + + @override + String get next => 'Sequent'; + + @override + String get no => 'No'; + + @override + String get noConnectionToTheServer => 'No connection to the server'; + + @override + String get noEmotesFound => 'No emotes found. 😕'; + + @override + String get noEncryptionForPublicRooms => + 'You can only activate encryption as soon as the room is no longer publicly accessible.'; + + @override + String get noGoogleServicesWarning => + 'Firebase Cloud Messaging doesn\'t appear to be available on your device. To still receive push notifications, we recommend installing ntfy. With ntfy or another Unified Push provider you can receive push notifications in a data secure way. You can download ntfy from the PlayStore or from F-Droid.'; + + @override + String noMatrixServer(String server1, String server2) { + return '$server1 is no matrix server, use $server2 instead?'; + } + + @override + String get shareInviteLink => 'Share invite link'; + + @override + String get scanQrCode => 'Scannar un code QR'; + + @override + String get none => 'Null'; + + @override + String get noPasswordRecoveryDescription => + 'You have not added a way to recover your password yet.'; + + @override + String get noPermission => 'Sin permission'; + + @override + String get noRoomsFound => 'Null chambres trovat…'; + + @override + String get notifications => 'Notificationes'; + + @override + String get notificationsEnabledForThisAccount => + 'Notifications enabled for this account'; + + @override + String numUsersTyping(int count) { + return '$count users are typing…'; + } + + @override + String get obtainingLocation => 'Obtenente li localisation…'; + + @override + String get offensive => 'Offensiv'; + + @override + String get offline => 'For del rete'; + + @override + String get ok => 'OK'; + + @override + String get online => 'In li rete'; + + @override + String get onlineKeyBackupEnabled => 'Online Key Backup is enabled'; + + @override + String get oopsPushError => + 'Oops! Unfortunately, an error occurred when setting up the push notifications.'; + + @override + String get oopsSomethingWentWrong => 'Oops, something went wrong…'; + + @override + String get openAppToReadMessages => 'Open app to read messages'; + + @override + String get openCamera => 'Aperter li cámera'; + + @override + String get openVideoCamera => 'Open camera for a video'; + + @override + String get oneClientLoggedOut => 'One of your clients has been logged out'; + + @override + String get addAccount => 'Adjunter un conto'; + + @override + String get editBundlesForAccount => 'Edit bundles for this account'; + + @override + String get addToBundle => 'Add to bundle'; + + @override + String get removeFromBundle => 'Remove from this bundle'; + + @override + String get bundleName => 'Bundle name'; + + @override + String get enableMultiAccounts => + '(BETA) Enable multi accounts on this device'; + + @override + String get openInMaps => 'Aperter in mappas'; + + @override + String get link => 'Ligament'; + + @override + String get serverRequiresEmail => + 'This server needs to validate your email address for registration.'; + + @override + String get or => 'O'; + + @override + String get participant => 'Participante'; + + @override + String get passphraseOrKey => 'passphrase or recovery key'; + + @override + String get password => 'Contrasigne'; + + @override + String get passwordForgotten => 'Li contrasigne esset obliviat'; + + @override + String get passwordHasBeenChanged => 'Password has been changed'; + + @override + String get hideMemberChangesInPublicChats => + 'Hide member changes in public chats'; + + @override + String get hideMemberChangesInPublicChatsBody => + 'Do not show in the chat timeline if someone joins or leaves a public chat to improve readability.'; + + @override + String get overview => 'Overview'; + + @override + String get notifyMeFor => 'Notify me for'; + + @override + String get passwordRecoverySettings => 'Password recovery settings'; + + @override + String get passwordRecovery => 'Reganiar li contrasigne'; + + @override + String get people => 'Homes'; + + @override + String get pickImage => 'Pick an image'; + + @override + String get pin => 'Fixar'; + + @override + String play(String fileName) { + return 'Reproducter $fileName'; + } + + @override + String get pleaseChoose => 'Ples selecter'; + + @override + String get pleaseChooseAPasscode => 'Please choose a pass code'; + + @override + String get pleaseClickOnLink => + 'Please click on the link in the email and then proceed.'; + + @override + String get pleaseEnter4Digits => + 'Please enter 4 digits or leave empty to disable app lock.'; + + @override + String get pleaseEnterRecoveryKey => 'Please enter your recovery key:'; + + @override + String get pleaseEnterYourPassword => 'Please enter your password'; + + @override + String get pleaseEnterYourPin => 'Please enter your pin'; + + @override + String get pleaseEnterYourUsername => 'Please enter your username'; + + @override + String get pleaseFollowInstructionsOnWeb => + 'Please follow the instructions on the website and tap on next.'; + + @override + String get privacy => 'Privatie'; + + @override + String get publicRooms => 'Public chambres'; + + @override + String get pushRules => 'Regules de push-notificationes'; + + @override + String get reason => 'Cause'; + + @override + String get recording => 'Registrante'; + + @override + String redactedBy(String username) { + return 'Redacted by $username'; + } + + @override + String get directChat => 'Direct chat'; + + @override + String redactedByBecause(String username, String reason) { + return 'Redacted by $username because: \"$reason\"'; + } + + @override + String redactedAnEvent(String username) { + return '$username redacted an event'; + } + + @override + String get redactMessage => 'Redacter li missage'; + + @override + String get register => 'Inregistrar se'; + + @override + String get reject => 'Refuser'; + + @override + String rejectedTheInvitation(String username) { + return '$username rejected the invitation'; + } + + @override + String get rejoin => 'Re-adherer'; + + @override + String get removeAllOtherDevices => 'Remove all other devices'; + + @override + String removedBy(String username) { + return 'Removed by $username'; + } + + @override + String get removeDevice => 'Remover li aparate'; + + @override + String get unbanFromChat => 'Unban from chat'; + + @override + String get removeYourAvatar => 'Remove your avatar'; + + @override + String get replaceRoomWithNewerVersion => 'Replace room with newer version'; + + @override + String get reply => 'Responder'; + + @override + String get reportMessage => 'Raportar li missage'; + + @override + String get translateMessage => 'Translate message'; + + @override + String get translatedMessage => 'Translated message'; + + @override + String get errorTranslatingMessage => + 'An error has occured while translating the message.'; + + @override + String get recoverMessage => 'Recover message'; + + @override + String get recoveredMessage => 'Recovered message'; + + @override + String get errorRecoveringMessage => + 'An error has occured while recovering the message.'; + + @override + String get errorRecoveringMessageNoAdmin => + 'This feature is available on Synapse homeservers only for adminstrators.'; + + @override + String get requestPermission => 'Demandar li permission'; + + @override + String get roomHasBeenUpgraded => 'Room has been upgraded'; + + @override + String get roomVersion => 'Version del chambre'; + + @override + String get saveFile => 'Gardar li file'; + + @override + String get retry => 'Retry'; + + @override + String get search => 'Sercha'; + + @override + String get security => 'Securitá'; + + @override + String get recoveryKey => 'Clave de regania'; + + @override + String get recoveryKeyLost => 'Recovery key lost?'; + + @override + String seenByUser(String username) { + return 'Seen by $username'; + } + + @override + String get send => 'Inviar'; + + @override + String get sendAMessage => 'Send a message'; + + @override + String get sendAsText => 'Send as text'; + + @override + String get sendAudio => 'Inviar audio'; + + @override + String get sendFile => 'Inviar un file'; + + @override + String get sendImage => 'Inviar un image'; + + @override + String sendImages(int count) { + return 'Send $count image'; + } + + @override + String get sendMessages => 'Inviar missages'; + + @override + String get sendOriginal => 'Inviar li originale'; + + @override + String get sendSticker => 'Inviar un nota adhesiv'; + + @override + String get sendVideo => 'Inviar video'; + + @override + String sentAFile(String username) { + return '📁 $username sent a file'; + } + + @override + String sentAnAudio(String username) { + return '🎤 $username sent an audio'; + } + + @override + String sentAPicture(String username) { + return '🖼️ $username sent a picture'; + } + + @override + String sentASticker(String username) { + return '😊 $username sent a sticker'; + } + + @override + String sentAVideo(String username) { + return '🎥 $username sent a video'; + } + + @override + String sentCallInformations(String senderName) { + return '$senderName sent call information'; + } + + @override + String get separateChatTypes => 'Separate Direct Chats and Groups'; + + @override + String get setAsCanonicalAlias => 'Set as main alias'; + + @override + String get setCustomEmotes => 'Set custom emotes'; + + @override + String get setChatDescription => 'Set chat description'; + + @override + String get setInvitationLink => 'Set invitation link'; + + @override + String get setPermissionsLevel => 'Set permissions level'; + + @override + String get setStatus => 'Assignar li statu'; + + @override + String get settings => 'Parametres'; + + @override + String get share => 'Partir'; + + @override + String sharedTheLocation(String username) { + return '$username shared their location'; + } + + @override + String get shareLocation => 'Partir un localisation'; + + @override + String get showPassword => 'Monstrar li contrasigne'; + + @override + String get presenceStyle => 'Presence:'; + + @override + String get hideAvatarsInInvites => 'Hide avatars in invites'; + + @override + String get hideAvatarsInInvitesDescription => + 'Do not show room avatars in invites'; + + @override + String get presencesToggle => 'Show status messages from other users'; + + @override + String get pureBlackToggle => 'Pure Black'; + + @override + String get singlesignon => 'Single Sign on'; + + @override + String get skip => 'Omisser'; + + @override + String get sourceCode => 'Code de fonte'; + + @override + String get spaceIsPublic => 'Space is public'; + + @override + String get spaceName => 'Nómine de spacie'; + + @override + String startedACall(String senderName) { + return '$senderName started a call'; + } + + @override + String get startFirstChat => 'Start your first chat'; + + @override + String get status => 'Statu'; + + @override + String get statusExampleMessage => 'How are you today?'; + + @override + String get submit => 'Inviar'; + + @override + String get synchronizingPleaseWait => 'Synchronizing… Please wait.'; + + @override + String synchronizingPleaseWaitCounter(String percentage) { + return ' Synchronizing… ($percentage%)'; + } + + @override + String get systemTheme => 'Del sistema'; + + @override + String get theyDontMatch => 'They Don\'t Match'; + + @override + String get theyMatch => 'Corresponde'; + + @override + String get title => 'FluffyChat'; + + @override + String get toggleFavorite => 'Toggle Favorite'; + + @override + String get toggleMuted => 'Toggle Muted'; + + @override + String get toggleUnread => 'Marcar quam (ín)leet'; + + @override + String get tooManyRequestsWarning => + 'Too many requests. Please try again later!'; + + @override + String get transferFromAnotherDevice => 'Transfer from another device'; + + @override + String get tryToSendAgain => 'Try to send again'; + + @override + String get unavailable => 'Índisponibil'; + + @override + String unbannedUser(String username, String targetName) { + return '$username unbanned $targetName'; + } + + @override + String get unblockDevice => 'Deblocar li aparate'; + + @override + String get unknownDevice => 'Ínconosset aparate'; + + @override + String get unknownEncryptionAlgorithm => 'Unknown encryption algorithm'; + + @override + String unknownEvent(String type) { + return 'Unknown event \'$type\''; + } + + @override + String get unmuteChat => 'Unmute chat'; + + @override + String get unpin => 'Defixar'; + + @override + String unreadChats(int unreadCount) { + String _temp0 = intl.Intl.pluralLogic( + unreadCount, + locale: localeName, + other: '$unreadCount unread chats', + one: '1 unread chat', + ); + return '$_temp0'; + } + + @override + String userAndOthersAreTyping(String username, int count) { + return '$username and $count others are typing…'; + } + + @override + String userAndUserAreTyping(String username, String username2) { + return '$username and $username2 are typing…'; + } + + @override + String userIsTyping(String username) { + return '$username is typing…'; + } + + @override + String userLeftTheChat(String username) { + return '🚪 $username left the chat'; + } + + @override + String get username => 'Nómine de usator'; + + @override + String userSentUnknownEvent(String username, String type) { + return '$username sent a $type event'; + } + + @override + String get unverified => 'Ínverificat'; + + @override + String get verified => 'Verificat'; + + @override + String get verify => 'Verificar'; + + @override + String get verifyStart => 'Iniciar li verification'; + + @override + String get verifySuccess => 'You successfully verified!'; + + @override + String get verifyTitle => 'Verifying other account'; + + @override + String get videoCall => 'Videotelefonada'; + + @override + String get visibilityOfTheChatHistory => 'Visibility of the chat history'; + + @override + String get visibleForAllParticipants => 'Visible for all participants'; + + @override + String get visibleForEveryone => 'Visible for everyone'; + + @override + String get voiceMessage => 'Voce-missage'; + + @override + String get waitingPartnerAcceptRequest => + 'Waiting for partner to accept the request…'; + + @override + String get waitingPartnerEmoji => 'Waiting for partner to accept the emoji…'; + + @override + String get waitingPartnerNumbers => + 'Waiting for partner to accept the numbers…'; + + @override + String get wallpaper => 'Tapete'; + + @override + String get warning => 'Avise!'; + + @override + String get weSentYouAnEmail => 'We sent you an email'; + + @override + String get whoCanPerformWhichAction => 'Who can perform which action'; + + @override + String get whoIsAllowedToJoinThisGroup => 'Who is allowed to join this group'; + + @override + String get whyDoYouWantToReportThis => 'Why do you want to report this?'; + + @override + String get wipeChatBackup => + 'Wipe your chat backup to create a new recovery key?'; + + @override + String get withTheseAddressesRecoveryDescription => + 'With these addresses you can recover your password.'; + + @override + String get writeAMessage => 'Write a message…'; + + @override + String get yes => 'Yes'; + + @override + String get you => 'Vu'; + + @override + String get youAreNoLongerParticipatingInThisChat => + 'You are no longer participating in this chat'; + + @override + String get youHaveBeenBannedFromThisChat => + 'You have been banned from this chat'; + + @override + String get yourPublicKey => 'Your public key'; + + @override + String get messageInfo => 'Information pri li missage'; + + @override + String get time => 'Hora'; + + @override + String get messageType => 'Tip de missage'; + + @override + String get sender => 'Autor'; + + @override + String get openGallery => 'Aperter li galerie'; + + @override + String get removeFromSpace => 'Remove from space'; + + @override + String get addToSpaceDescription => 'Select a space to add this chat to it.'; + + @override + String get start => 'Iniciar'; + + @override + String get pleaseEnterRecoveryKeyDescription => + 'To unlock your old messages, please enter your recovery key that has been generated in a previous session. Your recovery key is NOT your password.'; + + @override + String get publish => 'Publicar'; + + @override + String videoWithSize(String size) { + return 'Video ($size)'; + } + + @override + String get openChat => 'Aperter li conversation'; + + @override + String get markAsRead => 'Mark as read'; + + @override + String get reportUser => 'Raportar li usator'; + + @override + String get dismiss => 'Demisser'; + + @override + String reactedWith(String sender, String reaction) { + return '$sender reacted with $reaction'; + } + + @override + String get pinMessage => 'Pin to room'; + + @override + String get confirmEventUnpin => + 'Are you sure to permanently unpin the event?'; + + @override + String get emojis => 'Emoji'; + + @override + String get placeCall => 'Place call'; + + @override + String get voiceCall => 'Telefonada'; + + @override + String get unsupportedAndroidVersion => 'Unsupported Android version'; + + @override + String get unsupportedAndroidVersionLong => + 'This feature requires a newer Android version. Please check for updates or Lineage OS support.'; + + @override + String get videoCallsBetaWarning => + 'Please note that video calls are currently in beta. They might not work as expected or work at all on all platforms.'; + + @override + String get experimentalVideoCalls => 'Experimental video calls'; + + @override + String get emailOrUsername => 'Email or username'; + + @override + String get indexedDbErrorTitle => 'Private mode issues'; + + @override + String get indexedDbErrorLong => + 'The message storage is unfortunately not enabled in private mode by default.\nPlease visit\n - about:config\n - set dom.indexedDB.privateBrowsing.enabled to true\nOtherwise, it is not possible to run Extera.'; + + @override + String switchToAccount(String number) { + return 'Switch to account $number'; + } + + @override + String get nextAccount => 'Sequent conto'; + + @override + String get previousAccount => 'Precedent conto'; + + @override + String get addWidget => 'Adjunter un widget'; + + @override + String get widgetVideo => 'Video'; + + @override + String get widgetEtherpad => 'Textual nota'; + + @override + String get widgetJitsi => 'Jitsi Meet'; + + @override + String get widgetCustom => 'Personalisat'; + + @override + String get widgetName => 'Nómine'; + + @override + String get widgetUrlError => 'This is not a valid URL.'; + + @override + String get widgetNameError => 'Please provide a display name.'; + + @override + String get errorAddingWidget => 'Error adding the widget.'; + + @override + String get youRejectedTheInvitation => 'You rejected the invitation'; + + @override + String get youJoinedTheChat => 'You joined the chat'; + + @override + String get youAcceptedTheInvitation => '👍 You accepted the invitation'; + + @override + String youBannedUser(String user) { + return 'You banned $user'; + } + + @override + String youHaveWithdrawnTheInvitationFor(String user) { + return 'You have withdrawn the invitation for $user'; + } + + @override + String youInvitedToBy(String alias) { + return '📩 You have been invited via link to:\n$alias'; + } + + @override + String youInvitedBy(String user) { + return '📩 You have been invited by $user'; + } + + @override + String invitedBy(String user) { + return '📩 Invited by $user'; + } + + @override + String youInvitedUser(String user) { + return '📩 You invited $user'; + } + + @override + String youKicked(String user) { + return '👞 You kicked $user'; + } + + @override + String youKickedAndBanned(String user) { + return '🙅 You kicked and banned $user'; + } + + @override + String youUnbannedUser(String user) { + return 'You unbanned $user'; + } + + @override + String hasKnocked(String user) { + return '🚪 $user has knocked'; + } + + @override + String get usersMustKnock => 'Users must knock'; + + @override + String get noOneCanJoin => 'No one can join'; + + @override + String userWouldLikeToChangeTheChat(String user) { + return '$user would like to join the chat.'; + } + + @override + String get noPublicLinkHasBeenCreatedYet => + 'No public link has been created yet'; + + @override + String get knock => 'Knock'; + + @override + String get users => 'Usatores'; + + @override + String get unlockOldMessages => 'Unlock old messages'; + + @override + String get storeInSecureStorageDescription => + 'Store the recovery key in the secure storage of this device.'; + + @override + String get saveKeyManuallyDescription => + 'Save this key manually by triggering the system share dialog or clipboard.'; + + @override + String get storeInAndroidKeystore => 'Store in Android KeyStore'; + + @override + String get storeInAppleKeyChain => 'Store in Apple KeyChain'; + + @override + String get storeSecurlyOnThisDevice => 'Store securely on this device'; + + @override + String countFiles(int count) { + return '$count files'; + } + + @override + String get user => 'Usator'; + + @override + String get custom => 'Personalisat'; + + @override + String get foregroundServiceRunning => + 'This notification appears when the foreground service is running.'; + + @override + String get screenSharingTitle => 'partir li ecran'; + + @override + String get screenSharingDetail => 'You are sharing your screen in Extera'; + + @override + String get callingPermissions => 'Permissiones de telefonada'; + + @override + String get callingAccount => 'Conto telefonante'; + + @override + String get callingAccountDetails => + 'Allows Extera to use the native android dialer app.'; + + @override + String get appearOnTop => 'Appear on top'; + + @override + String get appearOnTopDetails => + 'Allows the app to appear on top (not needed if you already have Fluffychat setup as a calling account)'; + + @override + String get otherCallingPermissions => + 'Microphone, camera and other Extera permissions'; + + @override + String get whyIsThisMessageEncrypted => 'Why is this message unreadable?'; + + @override + String get noKeyForThisMessage => + 'This can happen if the message was sent before you have signed in to your account at this device.\n\nIt is also possible that the sender has blocked your device or something went wrong with the internet connection.\n\nAre you able to read the message on another session? Then you can transfer the message from it! Go to Settings > Devices and make sure that your devices have verified each other. When you open the room the next time and both sessions are in the foreground, the keys will be transmitted automatically.\n\nDo you not want to lose the keys when logging out or switching devices? Make sure that you have enabled the chat backup in the settings.'; + + @override + String get newGroup => 'Crear un gruppe'; + + @override + String get newSpace => 'Crear un spacie'; + + @override + String get enterSpace => 'Intrar li spacie'; + + @override + String get enterRoom => 'Intrar li chambre'; + + @override + String get allSpaces => 'Omni spacies'; + + @override + String numChats(String number) { + return '$number conversationes'; + } + + @override + String get hideUnimportantStateEvents => 'Hide unimportant state events'; + + @override + String get hidePresences => 'Hide Status List?'; + + @override + String get doNotShowAgain => 'Do not show again'; + + @override + String wasDirectChatDisplayName(String oldDisplayName) { + return 'Empty chat (was $oldDisplayName)'; + } + + @override + String get newSpaceDescription => + 'Spaces allows you to consolidate your chats and build private or public communities.'; + + @override + String get encryptThisChat => 'Encrypt this chat'; + + @override + String get disableEncryptionWarning => + 'For security reasons you can not disable encryption in a chat, where it has been enabled before.'; + + @override + String get sorryThatsNotPossible => 'Sorry... that is not possible'; + + @override + String get deviceKeys => 'Device keys:'; + + @override + String get reopenChat => 'Reopen chat'; + + @override + String get noBackupWarning => + 'Warning! Without enabling chat backup, you will lose access to your encrypted messages. It is highly recommended to enable the chat backup first before logging out.'; + + @override + String get noOtherDevicesFound => 'No other devices found'; + + @override + String fileIsTooBigForServer(String max) { + return 'Unable to send! The server only supports attachments up to $max.'; + } + + @override + String fileHasBeenSavedAt(String path) { + return 'File has been saved at $path'; + } + + @override + String get jumpToLastReadMessage => 'Jump to last read message'; + + @override + String get readUpToHere => 'Read up to here'; + + @override + String get jump => 'Jump'; + + @override + String get openLinkInBrowser => 'Open link in browser'; + + @override + String get reportErrorDescription => + '😭 Oh no. Something went wrong. If you want, you can report this bug to the developers.'; + + @override + String get report => 'Report'; + + @override + String get signInWithPassword => 'Sign in with password'; + + @override + String get pleaseTryAgainLaterOrChooseDifferentServer => + 'Please try again later or choose a different server.'; + + @override + String signInWith(String provider) { + return 'Sign in with $provider'; + } + + @override + String get profileNotFound => + 'The user could not be found on the server. Maybe there is a connection problem or the user doesn\'t exist.'; + + @override + String get setTheme => 'Set theme:'; + + @override + String get setColorTheme => 'Set color theme:'; + + @override + String get invite => 'Invite'; + + @override + String get inviteGroupChat => '📨 Invite group chat'; + + @override + String get invitePrivateChat => '📨 Invite private chat'; + + @override + String get invalidInput => 'Invalid input!'; + + @override + String wrongPinEntered(int seconds) { + return 'Wrong pin entered! Try again in $seconds seconds...'; + } + + @override + String get pleaseEnterANumber => 'Please enter a number greater than 0'; + + @override + String get archiveRoomDescription => + 'The chat will be moved to the archive. Other users will be able to see that you have left the chat.'; + + @override + String get roomUpgradeDescription => + 'The chat will then be recreated with the new room version. All participants will be notified that they need to switch to the new chat. You can find out more about room versions at https://spec.matrix.org/latest/rooms/'; + + @override + String get removeDevicesDescription => + 'You will be logged out of this device and will no longer be able to receive messages.'; + + @override + String get banUserDescription => + 'The user will be banned from the chat and will not be able to enter the chat again until they are unbanned.'; + + @override + String get unbanUserDescription => + 'The user will be able to enter the chat again if they try.'; + + @override + String get kickUserDescription => + 'The user is kicked out of the chat but not banned. In public chats, the user can rejoin at any time.'; + + @override + String get makeAdminDescription => + 'Once you make this user admin, you may not be able to undo this as they will then have the same permissions as you.'; + + @override + String get pushNotificationsNotAvailable => + 'Push notifications not available'; + + @override + String get learnMore => 'Learn more'; + + @override + String get yourGlobalUserIdIs => 'Your global user-ID is: '; + + @override + String noUsersFoundWithQuery(String query) { + return 'Unfortunately no user could be found with \"$query\". Please check whether you made a typo.'; + } + + @override + String get knocking => 'Knocking'; + + @override + String chatCanBeDiscoveredViaSearchOnServer(String server) { + return 'Chat can be discovered via the search on $server'; + } + + @override + String get searchChatsRooms => 'Search for #chats, @users...'; + + @override + String get nothingFound => 'Nothing found...'; + + @override + String get groupName => 'Group name'; + + @override + String get createGroupAndInviteUsers => 'Create a group and invite users'; + + @override + String get groupCanBeFoundViaSearch => 'Group can be found via search'; + + @override + String get wrongRecoveryKey => + 'Sorry... this does not seem to be the correct recovery key.'; + + @override + String get startConversation => 'Start conversation'; + + @override + String get commandHint_sendraw => 'Send raw json'; + + @override + String get databaseMigrationTitle => 'Database is optimized'; + + @override + String get databaseMigrationBody => 'Please wait. This may take a moment.'; + + @override + String get leaveEmptyToClearStatus => 'Leave empty to clear your status.'; + + @override + String get select => 'Select'; + + @override + String get searchForUsers => 'Search for @users...'; + + @override + String get pleaseEnterYourCurrentPassword => + 'Please enter your current password'; + + @override + String get newPassword => 'New password'; + + @override + String get pleaseChooseAStrongPassword => 'Please choose a strong password'; + + @override + String get passwordsDoNotMatch => 'Passwords do not match'; + + @override + String get passwordIsWrong => 'Your entered password is wrong'; + + @override + String get publicLink => 'Public link'; + + @override + String get publicChatAddresses => 'Public chat addresses'; + + @override + String get createNewAddress => 'Create new address'; + + @override + String get joinSpace => 'Join space'; + + @override + String get publicSpaces => 'Public spaces'; + + @override + String get addChatOrSubSpace => 'Add chat or sub space'; + + @override + String get subspace => 'Subspace'; + + @override + String get decline => 'Decline'; + + @override + String get thisDevice => 'This device:'; + + @override + String get initAppError => 'An error occured while init the app'; + + @override + String get userRole => 'User role'; + + @override + String minimumPowerLevel(String level) { + return '$level is the minimum power level.'; + } + + @override + String searchIn(String chat) { + return 'Search in chat \"$chat\"...'; + } + + @override + String get searchMore => 'Search more...'; + + @override + String get gallery => 'Gallery'; + + @override + String get files => 'Files'; + + @override + String databaseBuildErrorBody(String url, String error) { + return 'Unable to build the SQlite database. The app tries to use the legacy database for now. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String sessionLostBody(String url, String error) { + return 'Your session is lost. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String restoreSessionBody(String url, String error) { + return 'The app now tries to restore your session from the backup. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String forwardMessageTo(String roomName) { + return 'Forward message to $roomName?'; + } + + @override + String get sendReadReceipts => 'Send read receipts'; + + @override + String get sendTypingNotificationsDescription => + 'Other participants in a chat can see when you are typing a new message.'; + + @override + String get sendReadReceiptsDescription => + 'Other participants in a chat can see when you have read a message.'; + + @override + String get formattedMessages => 'Formatted messages'; + + @override + String get formattedMessagesDescription => + 'Display rich message content like bold text using markdown.'; + + @override + String get verifyOtherUser => '🔐 Verify other user'; + + @override + String get verifyOtherUserDescription => + 'If you verify another user, you can be sure that you know who you are really writing to. 💪\n\nWhen you start a verification, you and the other user will see a popup in the app. There you will then see a series of emojis or numbers that you have to compare with each other.\n\nThe best way to do this is to meet up or start a video call. 👭'; + + @override + String get verifyOtherDevice => '🔐 Verify other device'; + + @override + String get verifyOtherDeviceDescription => + 'When you verify another device, those devices can exchange keys, increasing your overall security. 💪 When you start a verification, a popup will appear in the app on both devices. There you will then see a series of emojis or numbers that you have to compare with each other. It\'s best to have both devices handy before you start the verification. 🤳'; + + @override + String acceptedKeyVerification(String sender) { + return '$sender accepted key verification'; + } + + @override + String canceledKeyVerification(String sender) { + return '$sender canceled key verification'; + } + + @override + String completedKeyVerification(String sender) { + return '$sender completed key verification'; + } + + @override + String isReadyForKeyVerification(String sender) { + return '$sender is ready for key verification'; + } + + @override + String requestedKeyVerification(String sender) { + return '$sender requested key verification'; + } + + @override + String startedKeyVerification(String sender) { + return '$sender started key verification'; + } + + @override + String get transparent => 'Transparent'; + + @override + String get incomingMessages => 'Incoming messages'; + + @override + String get stickers => 'Stickers'; + + @override + String get discover => 'Discover'; + + @override + String get commandHint_ignore => 'Ignore the given matrix ID'; + + @override + String get commandHint_unignore => 'Unignore the given matrix ID'; + + @override + String unreadChatsInApp(String appname, String unread) { + return '$appname: $unread unread chats'; + } + + @override + String get noDatabaseEncryption => + 'Database encryption is not supported on this platform'; + + @override + String thereAreCountUsersBlocked(Object count) { + return 'Right now there are $count users blocked.'; + } + + @override + String get restricted => 'Restricted'; + + @override + String get knockRestricted => 'Knock restricted'; + + @override + String goToSpace(Object space) { + return 'Go to space: $space'; + } + + @override + String get markAsUnread => 'Mark as unread'; + + @override + String userLevel(int level) { + return '$level - User'; + } + + @override + String moderatorLevel(int level) { + return '$level - Moderator'; + } + + @override + String adminLevel(int level) { + return '$level - Admin'; + } + + @override + String get changeGeneralChatSettings => 'Change general chat settings'; + + @override + String get inviteOtherUsers => 'Invite other users to this chat'; + + @override + String get changeTheChatPermissions => 'Change the chat permissions'; + + @override + String get changeTheVisibilityOfChatHistory => + 'Change the visibility of the chat history'; + + @override + String get changeTheCanonicalRoomAlias => + 'Change the main public chat address'; + + @override + String get sendRoomNotifications => 'Send a @room notifications'; + + @override + String get changeTheDescriptionOfTheGroup => + 'Change the description of the chat'; + + @override + String get chatPermissionsDescription => + 'Define which power level is necessary for certain actions in this chat. The power levels 0, 50 and 100 are usually representing users, moderators and admins, but any gradation is possible.'; + + @override + String updateInstalled(String version) { + return '🎉 Update $version installed!'; + } + + @override + String get changelog => 'Changelog'; + + @override + String get sendCanceled => 'Sending canceled'; + + @override + String get loginWithMatrixId => 'Login with Matrix-ID'; + + @override + String get discoverHomeservers => 'Discover homeservers'; + + @override + String get whatIsAHomeserver => 'What is a homeserver?'; + + @override + String get homeserverDescription => + 'All your data is stored on the homeserver, just like an email provider. You can choose which homeserver you want to use, while you can still communicate with everyone. Learn more at at https://matrix.org.'; + + @override + String get doesNotSeemToBeAValidHomeserver => + 'Doesn\'t seem to be a compatible homeserver. Wrong URL?'; + + @override + String get calculatingFileSize => 'Calculating file size...'; + + @override + String get prepareSendingAttachment => 'Prepare sending attachment...'; + + @override + String get sendingAttachment => 'Sending attachment...'; + + @override + String get generatingVideoThumbnail => 'Generating video thumbnail...'; + + @override + String get compressVideo => 'Compressing video...'; + + @override + String sendingAttachmentCountOfCount(int index, int length) { + return 'Sending attachment $index of $length...'; + } + + @override + String serverLimitReached(int seconds) { + return 'Server limit reached! Waiting $seconds seconds...'; + } + + @override + String get oneOfYourDevicesIsNotVerified => + 'One of your devices is not verified'; + + @override + String get noticeChatBackupDeviceVerification => + 'Note: When you connect all your devices to the chat backup, they are automatically verified.'; + + @override + String get continueText => 'Continue'; + + @override + String get welcomeText => + 'Hey Hey 👋 This is Extera. You can sign in to any homeserver, which is compatible with https://matrix.org. And then chat with anyone. It\'s a huge decentralized messaging network!'; + + @override + String get blur => 'Blur:'; + + @override + String get opacity => 'Opacity:'; + + @override + String get setWallpaper => 'Set wallpaper'; + + @override + String get manageAccount => 'Manage account'; + + @override + String get noContactInformationProvided => + 'Server does not provide any valid contact information'; + + @override + String get contactServerAdmin => 'Contact server admin'; + + @override + String get contactServerSecurity => 'Contact server security'; + + @override + String get supportPage => 'Support page'; + + @override + String get serverInformation => 'Server information:'; + + @override + String get name => 'Name'; + + @override + String get version => 'Version'; + + @override + String get website => 'Website'; + + @override + String get compress => 'Compress'; + + @override + String get boldText => 'Bold text'; + + @override + String get italicText => 'Italic text'; + + @override + String get strikeThrough => 'Strikethrough'; + + @override + String get pleaseFillOut => 'Please fill out'; + + @override + String get invalidUrl => 'Invalid url'; + + @override + String get addLink => 'Add link'; + + @override + String get unableToJoinChat => + 'Unable to join chat. Maybe the other party has already closed the conversation.'; + + @override + String get previous => 'Previous'; + + @override + String get otherPartyNotLoggedIn => + 'The other party is currently not logged in and therefore cannot receive messages!'; + + @override + String appWantsToUseForLogin(String server) { + return 'Use \'$server\' to log in'; + } + + @override + String get appWantsToUseForLoginDescription => + 'You hereby allow the app and website to share information about you.'; + + @override + String get open => 'Open'; + + @override + String get waitingForServer => 'Waiting for server...'; + + @override + String get appIntroduction => + 'Extera lets you chat with your friends across different messengers. Learn more at https://matrix.org or just tap *Continue*.'; + + @override + String get newChatRequest => '📩 New chat request'; + + @override + String get contentNotificationSettings => 'Content notification settings'; + + @override + String get generalNotificationSettings => 'General notification settings'; + + @override + String get roomNotificationSettings => 'Room notification settings'; + + @override + String get userSpecificNotificationSettings => + 'User specific notification settings'; + + @override + String get otherNotificationSettings => 'Other notification settings'; + + @override + String get notificationRuleContainsUserName => 'Contains User Name'; + + @override + String get notificationRuleContainsUserNameDescription => + 'Notifies the user when a message contains their username.'; + + @override + String get notificationRuleMaster => 'Mute all notifications'; + + @override + String get notificationRuleMasterDescription => + 'Overrides all other rules and disables all notifications.'; + + @override + String get notificationRuleSuppressNotices => 'Suppress Automated Messages'; + + @override + String get notificationRuleSuppressNoticesDescription => + 'Suppresses notifications from automated clients like bots.'; + + @override + String get notificationRuleInviteForMe => 'Invite for Me'; + + @override + String get notificationRuleInviteForMeDescription => + 'Notifies the user when they are invited to a room.'; + + @override + String get notificationRuleMemberEvent => 'Member Event'; + + @override + String get notificationRuleMemberEventDescription => + 'Suppresses notifications for membership events.'; + + @override + String get notificationRuleIsUserMention => 'User Mention'; + + @override + String get notificationRuleIsUserMentionDescription => + 'Notifies the user when they are directly mentioned in a message.'; + + @override + String get notificationRuleContainsDisplayName => 'Contains Display Name'; + + @override + String get notificationRuleContainsDisplayNameDescription => + 'Notifies the user when a message contains their display name.'; + + @override + String get notificationRuleIsRoomMention => 'Room Mention'; + + @override + String get notificationRuleIsRoomMentionDescription => + 'Notifies the user when there is a room mention.'; + + @override + String get notificationRuleRoomnotif => 'Room Notification'; + + @override + String get notificationRuleRoomnotifDescription => + 'Notifies the user when a message contains \'@room\'.'; + + @override + String get notificationRuleTombstone => 'Tombstone'; + + @override + String get notificationRuleTombstoneDescription => + 'Notifies the user about room deactivation messages.'; + + @override + String get notificationRuleReaction => 'Reaction'; + + @override + String get notificationRuleReactionDescription => + 'Suppresses notifications for reactions.'; + + @override + String get notificationRuleRoomServerAcl => 'Room Server ACL'; + + @override + String get notificationRuleRoomServerAclDescription => + 'Suppresses notifications for room server access control lists (ACL).'; + + @override + String get notificationRuleSuppressEdits => 'Suppress Edits'; + + @override + String get notificationRuleSuppressEditsDescription => + 'Suppresses notifications for edited messages.'; + + @override + String get notificationRuleCall => 'Call'; + + @override + String get notificationRuleCallDescription => + 'Notifies the user about calls.'; + + @override + String get notificationRuleEncryptedRoomOneToOne => + 'Encrypted Room One-to-One'; + + @override + String get notificationRuleEncryptedRoomOneToOneDescription => + 'Notifies the user about messages in encrypted one-to-one rooms.'; + + @override + String get notificationRuleRoomOneToOne => 'Room One-to-One'; + + @override + String get notificationRuleRoomOneToOneDescription => + 'Notifies the user about messages in one-to-one rooms.'; + + @override + String get notificationRuleMessage => 'Message'; + + @override + String get notificationRuleMessageDescription => + 'Notifies the user about general messages.'; + + @override + String get notificationRuleEncrypted => 'Encrypted'; + + @override + String get notificationRuleEncryptedDescription => + 'Notifies the user about messages in encrypted rooms.'; + + @override + String get notificationRuleJitsi => 'Jitsi'; + + @override + String get notificationRuleJitsiDescription => + 'Notifies the user about Jitsi widget events.'; + + @override + String get notificationRuleServerAcl => 'Suppress Server ACL Events'; + + @override + String get notificationRuleServerAclDescription => + 'Suppresses notifications for Server ACL events.'; + + @override + String unknownPushRule(String rule) { + return 'Unknown push rule \'$rule\''; + } + + @override + String get deletePushRuleCanNotBeUndone => + 'If you delete this notification setting, this can not be undone.'; + + @override + String get more => 'More'; + + @override + String get shareKeysWith => 'Share keys with...'; + + @override + String get shareKeysWithDescription => + 'Which devices should be trusted so that they can read along your messages in encrypted chats?'; + + @override + String get allDevices => 'All devices'; + + @override + String get crossVerifiedDevicesIfEnabled => + 'Cross verified devices if enabled'; + + @override + String get crossVerifiedDevices => 'Cross verified devices'; + + @override + String get verifiedDevicesOnly => 'Verified devices only'; + + @override + String get takeAPhoto => 'Take a photo'; + + @override + String get recordAVideo => 'Record a video'; + + @override + String get optionalMessage => '(Optional) message...'; + + @override + String get notSupportedOnThisDevice => 'Not supported on this device'; + + @override + String get enterNewChat => 'Enter new chat'; + + @override + String get approve => 'Approve'; + + @override + String get youHaveKnocked => 'You have knocked'; + + @override + String get pleaseWaitUntilInvited => + 'Please wait now, until someone from the room invites you.'; +} diff --git a/lib/generated/l10n/l10n_it.dart b/lib/generated/l10n/l10n_it.dart new file mode 100644 index 0000000..d7aefb1 --- /dev/null +++ b/lib/generated/l10n/l10n_it.dart @@ -0,0 +1,2776 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'l10n.dart'; + +// ignore_for_file: type=lint + +/// The translations for Italian (`it`). +class L10nIt extends L10n { + L10nIt([String locale = 'it']) : super(locale); + + @override + String get noSendPermission => 'You can\'t send messages here'; + + @override + String get alwaysUse24HourFormat => 'disattivato'; + + @override + String get repeatPassword => 'Ripeti password'; + + @override + String get notAnImage => 'Non è un file immagine.'; + + @override + String get setCustomPermissionLevel => 'Set custom permission level'; + + @override + String get setPermissionsLevelDescription => + 'Please choose a predefined role below or enter a custom permission level between 0 and 100.'; + + @override + String get ignoreUser => 'Ignore user'; + + @override + String get normalUser => 'Normal user'; + + @override + String get remove => 'Rimuovi'; + + @override + String get importNow => 'Importa ora'; + + @override + String get importEmojis => 'Importa Emoji'; + + @override + String get importFromZipFile => 'Importa da file .zip'; + + @override + String get exportEmotePack => 'Esporta pack di Emote come .zip'; + + @override + String get replace => 'Sostituisci'; + + @override + String get about => 'Informazioni'; + + @override + String aboutHomeserver(String homeserver) { + return 'Informazioni su $homeserver'; + } + + @override + String get accept => 'Accetta'; + + @override + String acceptedTheInvitation(String username) { + return '👍 $username ha accettato l\'invito'; + } + + @override + String get account => 'Account'; + + @override + String activatedEndToEndEncryption(String username) { + return '🔐 $username ha abilitato la crittografia end to end'; + } + + @override + String get addEmail => 'Aggiungi e-mail'; + + @override + String get confirmMatrixId => + 'Per eliminare il tuo account, conferma il tuo Matrix ID.'; + + @override + String supposedMxid(String mxid) { + return 'Dovrebbe essere $mxid'; + } + + @override + String get addChatDescription => 'Aggiungi una descrizione chat...'; + + @override + String get addToSpace => 'Aggiungi a uno spazio'; + + @override + String get admin => 'Amministratore'; + + @override + String get alias => 'alias'; + + @override + String get all => 'Tutto'; + + @override + String get allChats => 'Tutte le chat'; + + @override + String get commandHint_roomupgrade => + 'Upgrade this room to the given room version'; + + @override + String get commandHint_googly => 'Invia degli occhi finti'; + + @override + String get commandHint_cuddle => 'Invia una coccola'; + + @override + String get commandHint_hug => 'Invia un abbraccio'; + + @override + String googlyEyesContent(String senderName) { + return '$senderName ti ha inviato degli occhi finti'; + } + + @override + String cuddleContent(String senderName) { + return '$senderName ti coccola'; + } + + @override + String hugContent(String senderName) { + return '$senderName ti abbraccia'; + } + + @override + String answeredTheCall(String senderName) { + return '$senderName ha risposto alla chiamata'; + } + + @override + String get anyoneCanJoin => 'Tutti possono partecipare'; + + @override + String get appLock => 'Blocco dell\'app'; + + @override + String get appLockDescription => + 'Blocca l\'app con un codice PIN quando non è in uso'; + + @override + String get archive => 'Archivia'; + + @override + String get areGuestsAllowedToJoin => 'Gli utenti ospiti possono partecipare'; + + @override + String get areYouSure => 'Sei sicuro/a?'; + + @override + String get areYouSureYouWantToLogout => 'Sei sicuro/a di voler uscire?'; + + @override + String get askSSSSSign => + 'Per far accedere l\'altra persona, per favore inserisci la tua frase segreta o chiave di recupero.'; + + @override + String askVerificationRequest(String username) { + return 'Accettare questa richiesta di verifica da $username?'; + } + + @override + String get autoplayImages => + 'Riproduci automaticamente adesivi ed emote animati'; + + @override + String badServerLoginTypesException(String serverVersions, + String supportedVersions, Object suportedVersions) { + return 'L\'homeserver supporta i tipi di accesso:\n$serverVersions\nMa questa applicazione supporta solo:\n$supportedVersions'; + } + + @override + String get sendTypingNotifications => 'Invia notifiche di scrittura'; + + @override + String get swipeRightToLeftToReply => + 'Scorri da destra a sinistra per rispondere'; + + @override + String get sendOnEnter => 'Invia quando premi Invio'; + + @override + String badServerVersionsException(String serverVersions, + String supportedVersions, Object serverVerions, Object suportedVersions) { + return 'L\'homeserver supporta le versioni Spec:\n$serverVersions\nMa questa applicazione supporta solo $supportedVersions'; + } + + @override + String countChatsAndCountParticipants(int chats, int participants) { + return '$chats chat e $participants partecipanti'; + } + + @override + String get noMoreChatsFound => 'Non sono state trovate altre chat...'; + + @override + String get noChatsFoundHere => + 'Nessuna chat trovata. Inizia una nuova chat con qualcuno usando il pulsante qui sotto. ⤵️'; + + @override + String get joinedChats => 'Chat a cui partecipi'; + + @override + String get unread => 'Non letti'; + + @override + String get space => 'Spazio'; + + @override + String get spaces => 'Spazi'; + + @override + String get banFromChat => 'Bandisci dalla chat'; + + @override + String get banned => 'Bandito'; + + @override + String bannedUser(String username, String targetName) { + return '$username ha bandito $targetName'; + } + + @override + String get blockDevice => 'Blocca dispositivo'; + + @override + String get blocked => 'Bloccato'; + + @override + String get botMessages => 'Messaggi bot'; + + @override + String get cancel => 'Annulla'; + + @override + String cantOpenUri(String uri) { + return 'Impossibile aprire l\'URI $uri'; + } + + @override + String get changeDeviceName => 'Cambia nome dispositivo'; + + @override + String changedTheChatAvatar(String username) { + return '$username ha cambiato l\'avatar della discussione'; + } + + @override + String changedTheChatDescriptionTo(String username, String description) { + return '$username ha cambiato la descrizione della chat in: \'$description\''; + } + + @override + String changedTheChatNameTo(String username, String chatname) { + return '$username ha cambiato il nome della discussione in: \'$chatname\''; + } + + @override + String changedTheChatPermissions(String username) { + return '$username ha cambiato i permessi della chat'; + } + + @override + String changedTheDisplaynameTo(String username, String displayname) { + return '$username ha cambiato nome in: \'$displayname\''; + } + + @override + String changedTheGuestAccessRules(String username) { + return '$username ha cambiato le regole di accesso per ospiti'; + } + + @override + String changedTheGuestAccessRulesTo(String username, String rules) { + return '$username ha cambiato le regole di accesso per ospiti con: $rules'; + } + + @override + String changedTheHistoryVisibility(String username) { + return '$username ha cambiato la visibilità della cronologia'; + } + + @override + String changedTheHistoryVisibilityTo(String username, String rules) { + return '$username ha cambiato la visibilità della cronologia in: $rules'; + } + + @override + String changedTheJoinRules(String username) { + return '$username ha cambiato le regole per unirsi'; + } + + @override + String changedTheJoinRulesTo(String username, String joinRules) { + return '$username ha cambiato le regole per unirsi in: $joinRules'; + } + + @override + String changedTheProfileAvatar(String username) { + return '$username ha cambiato il suo avatar'; + } + + @override + String changedTheRoomAliases(String username) { + return '$username ha modificato gli alias della stanza'; + } + + @override + String changedTheRoomInvitationLink(String username) { + return '$username ha cambiato il link di invito'; + } + + @override + String get changePassword => 'Cambia la password'; + + @override + String get changeTheHomeserver => 'Cambia il server principale'; + + @override + String get changeTheme => 'Cambia il tuo stile'; + + @override + String get changeTheNameOfTheGroup => 'Cambia il nome del gruppo'; + + @override + String get changeYourAvatar => 'Cambia il tuo avatar'; + + @override + String get channelCorruptedDecryptError => 'La crittografia è corrotta'; + + @override + String get chat => 'Chat'; + + @override + String get yourChatBackupHasBeenSetUp => + 'Il tuo backup delle chat è stato configurato.'; + + @override + String get chatBackup => 'Backup delle discussioni'; + + @override + String get chatBackupDescription => + 'I tuoi vecchi messaggi sono protetti da una chiave di sicurezza. Assicurati di non perderla.'; + + @override + String get chatDetails => 'Dettagli chat'; + + @override + String get chatHasBeenAddedToThisSpace => + 'La chat è stata aggiunta a questo spazio'; + + @override + String get chats => 'Discussioni'; + + @override + String get chooseAStrongPassword => 'Scegli una password complessa'; + + @override + String get clearArchive => 'Cancella archivio'; + + @override + String get close => 'Chiudi'; + + @override + String get commandHint_markasdm => + 'Contrassegna questo Matrix ID come stanza di messaggi diretti'; + + @override + String get commandHint_markasgroup => 'Segna come gruppo'; + + @override + String get commandHint_ban => 'Banna l\'utente specificato da questa stanza'; + + @override + String get commandHint_clearcache => 'Pulisci cache'; + + @override + String get commandHint_create => + 'Crea una chat di gruppo vuota\nUtilizza --no-encryption per disattivare la criptazione'; + + @override + String get commandHint_discardsession => 'Scarta sessione'; + + @override + String get commandHint_dm => + 'Avvia una chat diretta\nUsa --no-encryption per disabilitare la crittografia'; + + @override + String get commandHint_html => 'Invia testo formattato in HTML'; + + @override + String get commandHint_invite => 'Invia l utente fornito in questa stanza'; + + @override + String get commandHint_join => 'Unisciti alla stanza fornita'; + + @override + String get commandHint_kick => 'Rimuovi l\'utente fornito da questa stanza'; + + @override + String get commandHint_leave => 'Abbandona questa stanza'; + + @override + String get commandHint_me => 'Descriviti'; + + @override + String get commandHint_myroomavatar => + 'Importa la foto profilo per questa stanza ( mxc-uri)'; + + @override + String get commandHint_myroomnick => + 'Imposta il nome visualizzato per questa stanza'; + + @override + String get commandHint_op => + 'Imposta il livello di privilegi dell\'utente specificato (predefinito: 50)'; + + @override + String get commandHint_plain => 'Invia testo non formattato'; + + @override + String get commandHint_react => 'Rispondi con una reazione'; + + @override + String get commandHint_send => 'Invia testo'; + + @override + String get commandHint_unban => 'Sbanna l\'utente fornito da questa stanza'; + + @override + String get commandInvalid => 'Comando non valido'; + + @override + String commandMissing(String command) { + return '$command non è un comando.'; + } + + @override + String get compareEmojiMatch => 'Per favore confronta gli emoji'; + + @override + String get compareNumbersMatch => 'Per favore confronta i numeri'; + + @override + String get configureChat => 'Configura la discussione'; + + @override + String get confirm => 'Conferma'; + + @override + String get connect => 'Connetti'; + + @override + String get contactHasBeenInvitedToTheGroup => + 'Il contatto è stato invitato nel gruppo'; + + @override + String get containsDisplayName => 'Contiene nome visibile'; + + @override + String get containsUserName => 'Contiene nome utente'; + + @override + String get contentHasBeenReported => + 'Il contenuto è stato segnalato agli amministratori del server'; + + @override + String get copiedToClipboard => 'Copiato negli Appunti'; + + @override + String get copy => 'Copia'; + + @override + String get copyToClipboard => 'Copia negli appunti'; + + @override + String couldNotDecryptMessage(String error) { + return 'Impossibile decriptare messaggio: $error'; + } + + @override + String countParticipants(int count) { + return '$count partecipanti'; + } + + @override + String get create => 'Crea'; + + @override + String createdTheChat(String username) { + return '💬 $username ha creato la chat'; + } + + @override + String get createGroup => 'Crea gruppo'; + + @override + String get createNewSpace => 'Nuovo spazio'; + + @override + String get currentlyActive => 'Attualmente attivo'; + + @override + String get darkTheme => 'Scuro'; + + @override + String dateAndTimeOfDay(String date, String timeOfDay) { + return '$date, $timeOfDay'; + } + + @override + String dateWithoutYear(String month, String day) { + return '$day/$month'; + } + + @override + String dateWithYear(String year, String month, String day) { + return '$day/$month/$year'; + } + + @override + String get deactivateAccountWarning => + 'Disabiliterà il tuo account. Non puoi tornare indietro! Sei sicuro/a?'; + + @override + String get defaultPermissionLevel => + 'Livello di autorizzazione predefinito per i nuovi utenti'; + + @override + String get delete => 'Cancella'; + + @override + String get deleteAccount => 'Elimina l\'account'; + + @override + String get deleteMessage => 'Elimina il messaggio'; + + @override + String get device => 'Dispositivo'; + + @override + String get deviceId => 'ID del dispositivo'; + + @override + String get devices => 'Dispositivi'; + + @override + String get directChats => 'Chat dirette'; + + @override + String get allRooms => 'Tutte le chat di gruppo'; + + @override + String get displaynameHasBeenChanged => 'Il nominativo è stato cambiato'; + + @override + String get downloadFile => 'Scarica il file'; + + @override + String get edit => 'Modifica'; + + @override + String get editBlockedServers => 'Modifica i server bloccati'; + + @override + String get chatPermissions => 'Permessi della chat'; + + @override + String get editDisplayname => 'Modifica il nominativo'; + + @override + String get editRoomAliases => 'Modifica gli alias della stanza'; + + @override + String get editRoomAvatar => 'Modifica l\'avatar della stanza'; + + @override + String get emoteExists => 'L\'emote già esiste!'; + + @override + String get emoteInvalid => 'Shortcode emote invalido!'; + + @override + String get emoteKeyboardNoRecents => + 'Le emoticon recentemente usate appariranno qui...'; + + @override + String get emotePacks => 'Pacchetti emotes della stanza'; + + @override + String get emoteSettings => 'Impostazioni emote'; + + @override + String get globalChatId => 'ID chat globale'; + + @override + String get accessAndVisibility => 'Accesso e visibilità'; + + @override + String get accessAndVisibilityDescription => + 'Chi è autorizzato a partecipare a questa chat e come è possibile scoprirla.'; + + @override + String get calls => 'Chiamate'; + + @override + String get customEmojisAndStickers => 'Emoji e adesivi personalizzati'; + + @override + String get customEmojisAndStickersBody => + 'Aggiungi o condividi emoji o adesivi personalizzati che possono essere utilizzati in qualsiasi chat.'; + + @override + String get emoteShortcode => 'Scorciatoia emote'; + + @override + String get emoteWarnNeedToPick => + 'Devi scegliere una scorciatoia emote e aggiungere un immagine!'; + + @override + String get emptyChat => 'Discussione vuota'; + + @override + String get enableEmotesGlobally => 'Abilita i pacchetti emotes globalmente'; + + @override + String get enableEncryption => 'Abilita la crittografia'; + + @override + String get enableEncryptionWarning => + 'Non potrai disabilitare la crittografia in futuro. Sei sicuro?'; + + @override + String get encrypted => 'Crittografato'; + + @override + String get encryption => 'Crittografia'; + + @override + String get encryptionNotEnabled => 'Crittografia non abilitata'; + + @override + String endedTheCall(String senderName) { + return '$senderName è entrato in chiamata'; + } + + @override + String get enterAnEmailAddress => 'Inserisci un indirizzo e-mail'; + + @override + String get homeserver => 'Homeserver'; + + @override + String get enterYourHomeserver => 'Inserisci il tuo server principale'; + + @override + String errorObtainingLocation(String error) { + return 'Errore cercando di ottenere la posizione: $error'; + } + + @override + String get everythingReady => 'Tutto pronto!'; + + @override + String get extremeOffensive => 'Estremamente offensivo'; + + @override + String get fileName => 'Nome del file'; + + @override + String get fluffychat => 'FluffyChat'; + + @override + String get fontSize => 'Dimensione carattere'; + + @override + String get forward => 'Inoltra'; + + @override + String get fromJoining => 'Dall\'adesione'; + + @override + String get fromTheInvitation => 'Dall\'invito'; + + @override + String get goToTheNewRoom => 'Vai nella nuova stanza'; + + @override + String get group => 'Gruppo'; + + @override + String get chatDescription => 'Descrizione della chat'; + + @override + String get chatDescriptionHasBeenChanged => 'Descrizione della chat cambiata'; + + @override + String get groupIsPublic => 'Il gruppo è pubblico'; + + @override + String get groups => 'Gruppi'; + + @override + String groupWith(String displayname) { + return 'Gruppo con $displayname'; + } + + @override + String get guestsAreForbidden => 'Gli ospiti sono vietati'; + + @override + String get guestsCanJoin => 'Gli ospiti possono partecipare'; + + @override + String hasWithdrawnTheInvitationFor(String username, String targetName) { + return '$username ha ritirato l\'invito per $targetName'; + } + + @override + String get help => 'Aiuto'; + + @override + String get hideRedactedEvents => 'Nascondi gli eventi eliminati'; + + @override + String get hideRedactedMessages => 'Mostra i messaggi rimossi'; + + @override + String get hideRedactedMessagesBody => + 'Se qualcuno rimuove un messaggio, il messaggio non sarà più visibile nella chat.'; + + @override + String get hideInvalidOrUnknownMessageFormats => + 'Nascondi formati di messaggi non validi o sconosciuti'; + + @override + String get howOffensiveIsThisContent => + 'Quanto è offensivo questo contenuto?'; + + @override + String get id => 'ID'; + + @override + String get identity => 'Identità'; + + @override + String get block => 'Blocca'; + + @override + String get blockedUsers => 'Utenti bloccati'; + + @override + String get blockListDescription => + 'Puoi bloccare gli utenti che ti disturbano. Non sarai più in grado di ricevere messaggi o inviti alle stanze dalle persone che hai bloccato.'; + + @override + String get blockUsername => 'Nome utente da ignorare'; + + @override + String get iHaveClickedOnLink => 'Ho cliccato sul collegamento'; + + @override + String get incorrectPassphraseOrKey => + 'Frase segrata o chiave di ripristino errate'; + + @override + String get inoffensive => 'Inoffensivo'; + + @override + String get inviteContact => 'Invita contatto'; + + @override + String inviteContactToGroupQuestion(Object contact, Object groupName) { + return 'Vuoi invitare $contact nella chat \"$groupName\"?'; + } + + @override + String inviteContactToGroup(String groupName) { + return 'Invita un contatto a $groupName'; + } + + @override + String get noChatDescriptionYet => + 'La descrizione della chat non è ancora stata creata.'; + + @override + String get tryAgain => 'Riprova'; + + @override + String get invalidServerName => 'Nome server non valido'; + + @override + String get invited => 'Invitato/a'; + + @override + String get redactMessageDescription => + 'Questo messaggio sarà rimosso per tutti i partecipanti di questa conversazione. Questa operazione non può essere annullata.'; + + @override + String get optionalRedactReason => + '(Opzionale) Ragione per rimuovere questo messaggio...'; + + @override + String invitedUser(String username, String targetName) { + return '📩 $username ha invitato $targetName'; + } + + @override + String get invitedUsersOnly => 'Solo utenti invitati'; + + @override + String get inviteForMe => 'Invita per me'; + + @override + String inviteText(String username, String link) { + return '$username ti ha invitato/a a FluffyChat.\n1. Visita fluffychat.im e installa l\'applicazione\n2. Iscriviti o accedi\n3. Apri il collegamento di invito: \n $link'; + } + + @override + String get isTyping => 'sta scrivendo…'; + + @override + String joinedTheChat(String username) { + return '👋 $username si è unito/a alla chat'; + } + + @override + String get joinRoom => 'Unisciti alla stanza'; + + @override + String kicked(String username, String targetName) { + return '👞 $username ha espulso $targetName'; + } + + @override + String kickedAndBanned(String username, String targetName) { + return '🙅 $username ha espulso e bandito $targetName'; + } + + @override + String get kickFromChat => 'Espelli dalla chat'; + + @override + String lastActiveAgo(String localizedTimeShort) { + return 'Ultima attività: $localizedTimeShort'; + } + + @override + String get leave => 'Abbandona'; + + @override + String get leftTheChat => 'Ha abbandonato la chat'; + + @override + String get license => 'Licenza'; + + @override + String get lightTheme => 'Chiaro'; + + @override + String loadCountMoreParticipants(int count) { + return 'Carica altri $count partecipanti'; + } + + @override + String get dehydrate => 'Esporta la sessione e cancella il dispositivo'; + + @override + String get dehydrateWarning => + 'Questa azione non può essere annullata. Assicurarsi di aver salvato il file di backup.'; + + @override + String get dehydrateTor => 'Utenti TOR: Esporta la sessione'; + + @override + String get dehydrateTorLong => + 'Per gli utenti TOR, è raccomandato esportare la sessione prima di chiudere la finestra.'; + + @override + String get hydrateTor => 'Utenti TOR: Importa l\'esportazione della sessione'; + + @override + String get hydrateTorLong => + 'Hai esportato la tua sessione l\'ultima volta con TOR? Importala velocemente e continua a chattare.'; + + @override + String get hydrate => 'Ripristina dal file di backup'; + + @override + String get loadingPleaseWait => 'Caricamento… Attendere prego.'; + + @override + String get loadMore => 'Carica di più…'; + + @override + String get locationDisabledNotice => + 'I servizi di localizzazione sono disabilitati. Per favore abilitali per poter condividere la tua posizione.'; + + @override + String get locationPermissionDeniedNotice => + 'Permesso per accedere alla posizione negato. Per favore concedilo per essere in grado di condividere la tua posizione.'; + + @override + String get login => 'Accedi'; + + @override + String logInTo(String homeserver) { + return 'Accedi a $homeserver'; + } + + @override + String get logout => 'Esci'; + + @override + String get memberChanges => 'Cambiamenti di membri'; + + @override + String get mention => 'Menzione'; + + @override + String get messages => 'Messaggi'; + + @override + String get messagesStyle => 'Messaggi:'; + + @override + String get moderator => 'Moderatore'; + + @override + String get muteChat => 'Silenzia discussione'; + + @override + String get needPantalaimonWarning => + 'Tieni presente che per ora hai bisogno di Pantalaimon per utilizzare la crittografia dall\'inizio alla fine.'; + + @override + String get newChat => 'Nuova discussione'; + + @override + String get newMessageInFluffyChat => '💬 Nuovo messaggio in FluffyChat'; + + @override + String get newVerificationRequest => 'Nuova richiesta di verifica!'; + + @override + String get next => 'Avanti'; + + @override + String get no => 'No'; + + @override + String get noConnectionToTheServer => 'Nessuna connessione al server'; + + @override + String get noEmotesFound => 'Nessun emote trovato. 😕'; + + @override + String get noEncryptionForPublicRooms => + 'Puoi attivare la crittografia solo quando la stanza non è più accessibile pubblicamente.'; + + @override + String get noGoogleServicesWarning => + 'Firebase Cloud Messaging non sembra essere disponibile sul tuo dispositivo. Per continuare a ricevere notifiche push, ti consigliamo di installare ntfy. Con ntfy o un altro provider Unified Push puoi ricevere notifiche push in modo sicuro per i dati. Puoi scaricare ntfy dal PlayStore o da F-Droid.'; + + @override + String noMatrixServer(String server1, String server2) { + return '$server1 non è un server matrix, vuoi invece usare $server2?'; + } + + @override + String get shareInviteLink => 'Condividi link d\'invito'; + + @override + String get scanQrCode => 'Scansiona codice QR'; + + @override + String get none => 'Nessuno'; + + @override + String get noPasswordRecoveryDescription => + 'Non hai ancora aggiunto un modo per recuperare la tua password.'; + + @override + String get noPermission => 'Nessuna autorizzazione'; + + @override + String get noRoomsFound => 'Nessuna stanza trovata…'; + + @override + String get notifications => 'Notifiche'; + + @override + String get notificationsEnabledForThisAccount => + 'Notifiche abilitate per questo account'; + + @override + String numUsersTyping(int count) { + return '$count utenti stanno scrivendo…'; + } + + @override + String get obtainingLocation => 'Ottengo la posizione…'; + + @override + String get offensive => 'Offensivo'; + + @override + String get offline => 'Fuori linea'; + + @override + String get ok => 'Ok'; + + @override + String get online => 'In linea'; + + @override + String get onlineKeyBackupEnabled => + 'Il backup delle chiavi in linea è abilitato'; + + @override + String get oopsPushError => + 'Ops! Purtroppo si è verificato un errore durante l\'impostazione delle notifiche push.'; + + @override + String get oopsSomethingWentWrong => 'Ops, qualcosa è andato storto…'; + + @override + String get openAppToReadMessages => 'Apri l\'app per leggere i messaggi'; + + @override + String get openCamera => 'Apri fotocamera'; + + @override + String get openVideoCamera => 'Apri la fotocamera per un video'; + + @override + String get oneClientLoggedOut => 'Uno dei tuoi client è stato disconnesso'; + + @override + String get addAccount => 'Aggiungi account'; + + @override + String get editBundlesForAccount => 'Modifica i bundle per questo account'; + + @override + String get addToBundle => 'Aggiungi al bundle'; + + @override + String get removeFromBundle => 'Rimuovi da questo bundle'; + + @override + String get bundleName => 'Nome del bundle'; + + @override + String get enableMultiAccounts => + '(BETA) Abilita account multipli su questo dispositivo'; + + @override + String get openInMaps => 'Apri in maps'; + + @override + String get link => 'Link'; + + @override + String get serverRequiresEmail => + 'Questo server ha bisogno di validare la tua email per la registrazione.'; + + @override + String get or => 'O'; + + @override + String get participant => 'Partecipante'; + + @override + String get passphraseOrKey => 'frase segreta o chiave di recupero'; + + @override + String get password => 'Password'; + + @override + String get passwordForgotten => 'Password dimenticata'; + + @override + String get passwordHasBeenChanged => 'La password è stata cambiata'; + + @override + String get hideMemberChangesInPublicChats => + 'Nascondi le modifiche dei membri nelle chat pubbliche'; + + @override + String get hideMemberChangesInPublicChatsBody => + 'Per migliorare la leggibilità, non mostrare nella cronologia della chat se qualcuno si unisce o abbandona una chat pubblica.'; + + @override + String get overview => 'Panoramica'; + + @override + String get notifyMeFor => 'Avvisami per'; + + @override + String get passwordRecoverySettings => 'Impostazioni di recupero password'; + + @override + String get passwordRecovery => 'Recupero della password'; + + @override + String get people => 'Persone'; + + @override + String get pickImage => 'Scegli un\'immagine'; + + @override + String get pin => 'Fissa'; + + @override + String play(String fileName) { + return 'Riproduci $fileName'; + } + + @override + String get pleaseChoose => 'Si prega di scegliere'; + + @override + String get pleaseChooseAPasscode => + 'Si prega di scegliere un codice di accesso'; + + @override + String get pleaseClickOnLink => + 'Clicca sul collegamenti nell\'e-mail e poi procedi.'; + + @override + String get pleaseEnter4Digits => + 'Inserisci 4 cifre o lascia vuoto per disabilitare il blocco dell\'app.'; + + @override + String get pleaseEnterRecoveryKey => + 'Per favore inserisci la tua chiave di recupero:'; + + @override + String get pleaseEnterYourPassword => 'Inserisci la tua password'; + + @override + String get pleaseEnterYourPin => 'Per favore inserisci il tuo PIN'; + + @override + String get pleaseEnterYourUsername => 'Inserisci il tuo nome utente'; + + @override + String get pleaseFollowInstructionsOnWeb => + 'Segui le istruzioni sul sito web e tocca Avanti.'; + + @override + String get privacy => 'Privacy'; + + @override + String get publicRooms => 'Stanze pubbliche'; + + @override + String get pushRules => 'Regole notifiche'; + + @override + String get reason => 'Motivo'; + + @override + String get recording => 'Registrazione'; + + @override + String redactedBy(String username) { + return 'Rimosso da $username'; + } + + @override + String get directChat => 'Chat diretta'; + + @override + String redactedByBecause(String username, String reason) { + return 'Rimosso da $username per: \"$reason\"'; + } + + @override + String redactedAnEvent(String username) { + return '$username ha eliminato un evento'; + } + + @override + String get redactMessage => 'Elimina un messaggio'; + + @override + String get register => 'Registrati'; + + @override + String get reject => 'Rifiuta'; + + @override + String rejectedTheInvitation(String username) { + return '$username ha rifiutato l\'invito'; + } + + @override + String get rejoin => 'Riunisciti'; + + @override + String get removeAllOtherDevices => 'Rimuovi tutti gli altri dispositivi'; + + @override + String removedBy(String username) { + return 'Rimosso da $username'; + } + + @override + String get removeDevice => 'Rimuovi il dispositivo'; + + @override + String get unbanFromChat => 'Rimuovi il ban dalla chat'; + + @override + String get removeYourAvatar => 'Rimuovi il tuo avatar'; + + @override + String get replaceRoomWithNewerVersion => + 'Sostituisci la stanza con la versione più recente'; + + @override + String get reply => 'Rispondi'; + + @override + String get reportMessage => 'Segnala il messaggio'; + + @override + String get translateMessage => 'Translate message'; + + @override + String get translatedMessage => 'Translated message'; + + @override + String get errorTranslatingMessage => + 'An error has occured while translating the message.'; + + @override + String get recoverMessage => 'Recover message'; + + @override + String get recoveredMessage => 'Recovered message'; + + @override + String get errorRecoveringMessage => + 'An error has occured while recovering the message.'; + + @override + String get errorRecoveringMessageNoAdmin => + 'This feature is available on Synapse homeservers only for adminstrators.'; + + @override + String get requestPermission => 'Richiedi l\'autorizzazione'; + + @override + String get roomHasBeenUpgraded => 'La stanza è stata aggiornata'; + + @override + String get roomVersion => 'Versione della stanza'; + + @override + String get saveFile => 'Salva file'; + + @override + String get retry => 'Retry'; + + @override + String get search => 'Cerca'; + + @override + String get security => 'Sicurezza'; + + @override + String get recoveryKey => 'Chiave di recupero'; + + @override + String get recoveryKeyLost => 'Chiave di recupero smarrita?'; + + @override + String seenByUser(String username) { + return 'Visto da $username'; + } + + @override + String get send => 'Invia'; + + @override + String get sendAMessage => 'Invia un messaggio'; + + @override + String get sendAsText => 'Invia come testo'; + + @override + String get sendAudio => 'Invia un file audio'; + + @override + String get sendFile => 'Invia un file'; + + @override + String get sendImage => 'Invia un\'immagine'; + + @override + String sendImages(int count) { + return 'Invia $count immagine'; + } + + @override + String get sendMessages => 'Invia messaggi'; + + @override + String get sendOriginal => 'Invia l\'originale'; + + @override + String get sendSticker => 'Invia adesivo'; + + @override + String get sendVideo => 'Invia un video'; + + @override + String sentAFile(String username) { + return '📁 $username ha inviato un file'; + } + + @override + String sentAnAudio(String username) { + return '🎤 $username ha inviato un file audio'; + } + + @override + String sentAPicture(String username) { + return '🖼️ $username ha inviato un\'immagine'; + } + + @override + String sentASticker(String username) { + return '😊 $username ha inviato un adesivo'; + } + + @override + String sentAVideo(String username) { + return '🎥 $username ha inviato un video'; + } + + @override + String sentCallInformations(String senderName) { + return '$senderName ha inviato informazioni sulla chiamata'; + } + + @override + String get separateChatTypes => 'Separare le chat dirette e i gruppi'; + + @override + String get setAsCanonicalAlias => 'Imposta come alias principale'; + + @override + String get setCustomEmotes => 'Imposta emoticon personalizzate'; + + @override + String get setChatDescription => 'Imposta la descrizione della chat'; + + @override + String get setInvitationLink => 'Imposta il collegamento di invito'; + + @override + String get setPermissionsLevel => 'Imposta il livello di autorizzazione'; + + @override + String get setStatus => 'Imposta lo stato'; + + @override + String get settings => 'Impostazioni'; + + @override + String get share => 'Condividi'; + + @override + String sharedTheLocation(String username) { + return '$username ha condiviso la sua posizione'; + } + + @override + String get shareLocation => 'Condividi posizione'; + + @override + String get showPassword => 'Mostra la password'; + + @override + String get presenceStyle => 'Presenza:'; + + @override + String get hideAvatarsInInvites => 'Hide avatars in invites'; + + @override + String get hideAvatarsInInvitesDescription => + 'Do not show room avatars in invites'; + + @override + String get presencesToggle => 'Mostra i messaggi di stato di altri utenti'; + + @override + String get pureBlackToggle => 'Pure Black'; + + @override + String get singlesignon => 'Accesso singolo'; + + @override + String get skip => 'Ignora'; + + @override + String get sourceCode => 'Codice sorgente'; + + @override + String get spaceIsPublic => 'Lo spazio è pubblico'; + + @override + String get spaceName => 'Nome dello spazio'; + + @override + String startedACall(String senderName) { + return '$senderName ha iniziato una chiamata'; + } + + @override + String get startFirstChat => 'Inizia la tua prima chat'; + + @override + String get status => 'Stato'; + + @override + String get statusExampleMessage => 'Come stai oggi?'; + + @override + String get submit => 'Invia'; + + @override + String get synchronizingPleaseWait => 'Sincronizzazione... Attendere prego.'; + + @override + String synchronizingPleaseWaitCounter(String percentage) { + return ' Sincronizzazione… ($percentage%)'; + } + + @override + String get systemTheme => 'Sistema'; + + @override + String get theyDontMatch => 'Non corrispondono'; + + @override + String get theyMatch => 'Corrispondono'; + + @override + String get title => 'FluffyChat'; + + @override + String get toggleFavorite => 'Attiva/disattiva preferito'; + + @override + String get toggleMuted => 'Attiva/disattiva il silenziatore'; + + @override + String get toggleUnread => 'Segna come letto / non letto'; + + @override + String get tooManyRequestsWarning => + 'Troppe richieste. Per favore riprova più tardi!'; + + @override + String get transferFromAnotherDevice => + 'Trasferimento da un altro dispositivo'; + + @override + String get tryToSendAgain => 'Prova a inviare di nuovo'; + + @override + String get unavailable => 'Non disponibile'; + + @override + String unbannedUser(String username, String targetName) { + return '$username ha rimosso il bando di $targetName'; + } + + @override + String get unblockDevice => 'Sblocca il dispositivo'; + + @override + String get unknownDevice => 'Dispositivo sconosciuto'; + + @override + String get unknownEncryptionAlgorithm => + 'Algoritmo di crittografia sconosciuto'; + + @override + String unknownEvent(String type) { + return 'Evento sconosciuto \'$type\''; + } + + @override + String get unmuteChat => 'Riattiva l\'audio della discussione'; + + @override + String get unpin => 'Rimuovi'; + + @override + String unreadChats(int unreadCount) { + String _temp0 = intl.Intl.pluralLogic( + unreadCount, + locale: localeName, + other: '$unreadCount discussioni non lette', + one: '1 discussione non letta', + ); + return '$_temp0'; + } + + @override + String userAndOthersAreTyping(String username, int count) { + return '$username e $count altri stanno scrivendo…'; + } + + @override + String userAndUserAreTyping(String username, String username2) { + return '$username e $username2 stanno scrivendo…'; + } + + @override + String userIsTyping(String username) { + return '$username sta scrivendo…'; + } + + @override + String userLeftTheChat(String username) { + return '🚪 $username ha abbandonato la chat'; + } + + @override + String get username => 'Nome utente'; + + @override + String userSentUnknownEvent(String username, String type) { + return '$username ha inviato un evento $type'; + } + + @override + String get unverified => 'Non verificato'; + + @override + String get verified => 'Verificato'; + + @override + String get verify => 'Verifica'; + + @override + String get verifyStart => 'Avvia la verifica'; + + @override + String get verifySuccess => 'Hai verificato con successo!'; + + @override + String get verifyTitle => 'Verifica dell\'altro account'; + + @override + String get videoCall => 'Videochiamata'; + + @override + String get visibilityOfTheChatHistory => + 'Visibilità della cronologia della discussione'; + + @override + String get visibleForAllParticipants => 'Visibile a tutti i partecipanti'; + + @override + String get visibleForEveryone => 'Visibile a tutti'; + + @override + String get voiceMessage => 'Messaggio vocale'; + + @override + String get waitingPartnerAcceptRequest => + 'In attesa che il partner accetti la richiesta…'; + + @override + String get waitingPartnerEmoji => + 'In attesa che il partner accetti l\'emoji…'; + + @override + String get waitingPartnerNumbers => + 'In attesa che il partner accetti i numeri…'; + + @override + String get wallpaper => 'Immagine di sfondo:'; + + @override + String get warning => 'Attenzione!'; + + @override + String get weSentYouAnEmail => 'Ti abbiamo inviato un\'e-mail'; + + @override + String get whoCanPerformWhichAction => 'Chi può eseguire quale azione'; + + @override + String get whoIsAllowedToJoinThisGroup => + 'Chi è autorizzato a unirsi a questo gruppo'; + + @override + String get whyDoYouWantToReportThis => 'Perché vuoi segnalarlo?'; + + @override + String get wipeChatBackup => + 'Cancellare il backup della discussione per creare una nuova chiave di ripristino?'; + + @override + String get withTheseAddressesRecoveryDescription => + 'Con questi indirizzi puoi recuperare la tua password se necessario.'; + + @override + String get writeAMessage => 'Scrivi un messaggio…'; + + @override + String get yes => 'Sì'; + + @override + String get you => 'Tu'; + + @override + String get youAreNoLongerParticipatingInThisChat => + 'Non stai più partecipando a questa chat'; + + @override + String get youHaveBeenBannedFromThisChat => + 'Sei stato/a bandito/a da questa chat'; + + @override + String get yourPublicKey => 'La tua chiave pubblica'; + + @override + String get messageInfo => 'Informazioni del messaggio'; + + @override + String get time => 'Tempo'; + + @override + String get messageType => 'Tipo del Messaggio'; + + @override + String get sender => 'Mittente'; + + @override + String get openGallery => 'Apri la galleria'; + + @override + String get removeFromSpace => 'Rimuovi dallo spazio'; + + @override + String get addToSpaceDescription => + 'Seleziona una spazio a cui aggiungere questa chat.'; + + @override + String get start => 'Inizio'; + + @override + String get pleaseEnterRecoveryKeyDescription => + 'Per sbloccare i tuoi vecchi messaggi, per favore inserisci la tua chiave di recupero che è stata generata nella tua sessione precedente. La tua chiave di recupero NON è la tua password.'; + + @override + String get publish => 'Pubblicare'; + + @override + String videoWithSize(String size) { + return 'Video ($size)'; + } + + @override + String get openChat => 'Apri la Chat'; + + @override + String get markAsRead => 'Segna come letto'; + + @override + String get reportUser => 'Segnala utente'; + + @override + String get dismiss => 'Chiudi'; + + @override + String reactedWith(String sender, String reaction) { + return '$sender ha reagito con $reaction'; + } + + @override + String get pinMessage => 'Fissa alla stanza'; + + @override + String get confirmEventUnpin => + 'Sei sicuro di voler permanentemente sfissare l\'evento?'; + + @override + String get emojis => 'Emoji'; + + @override + String get placeCall => 'Fai una chiamata'; + + @override + String get voiceCall => 'Chiamata vocale'; + + @override + String get unsupportedAndroidVersion => 'Versione di Android non supportata'; + + @override + String get unsupportedAndroidVersionLong => + 'Questa funzionalità richiede una versione di Android più recente. Si prega di verificare la presenza di aggiornamenti o supporto per Lineage OS.'; + + @override + String get videoCallsBetaWarning => + 'Nota che le video chiamate sono attualmente in beta. Potrebbero non funzionare come previsto o non funzionare del tutto su alcune piattaforme.'; + + @override + String get experimentalVideoCalls => 'Video chiamate sperimentali'; + + @override + String get emailOrUsername => 'Email o nome utente'; + + @override + String get indexedDbErrorTitle => 'Problemi con la modalità privata'; + + @override + String get indexedDbErrorLong => + 'Sfortunatamente l\'archiviazione dei messaggi non è abilitata in modalità privata per impostazione predefinita.\nPer favore visita\n - about:config\n - imposta dom.indexedDB.privateBrowsing.enabled su true\nAltrimenti, non è possibile eseguire FluffyChat.'; + + @override + String switchToAccount(String number) { + return 'Passa all\'account $number'; + } + + @override + String get nextAccount => 'Account successivo'; + + @override + String get previousAccount => 'Account precedente'; + + @override + String get addWidget => 'Aggiungi widget'; + + @override + String get widgetVideo => 'Video'; + + @override + String get widgetEtherpad => 'Nota di testo'; + + @override + String get widgetJitsi => 'Jitsi Meet'; + + @override + String get widgetCustom => 'Personalizzati'; + + @override + String get widgetName => 'Nome'; + + @override + String get widgetUrlError => 'Questo non è un URL valido.'; + + @override + String get widgetNameError => 'Per favore fornire un nome da visualizzare.'; + + @override + String get errorAddingWidget => 'Errore aggiungendo il widget.'; + + @override + String get youRejectedTheInvitation => 'Hai rifiutato l\'invito'; + + @override + String get youJoinedTheChat => 'Sei entrato/a nella chat'; + + @override + String get youAcceptedTheInvitation => '👍 Hai accettato l\'invito'; + + @override + String youBannedUser(String user) { + return 'Hai bannato $user'; + } + + @override + String youHaveWithdrawnTheInvitationFor(String user) { + return 'Hai revocato l\'invito per $user'; + } + + @override + String youInvitedToBy(String alias) { + return '📩 Sei stato invitato tramite link in:\n$alias'; + } + + @override + String youInvitedBy(String user) { + return '📩 Sei stato invitato/a da $user'; + } + + @override + String invitedBy(String user) { + return '📩 Invitato da $user'; + } + + @override + String youInvitedUser(String user) { + return '📩 Hai invitato $user'; + } + + @override + String youKicked(String user) { + return '👞 Hai rimosso $user'; + } + + @override + String youKickedAndBanned(String user) { + return '🙅 Hai rimosso e bannato $user'; + } + + @override + String youUnbannedUser(String user) { + return 'Hai sbannato $user'; + } + + @override + String hasKnocked(String user) { + return '🚪 $user ha bussato'; + } + + @override + String get usersMustKnock => 'Gli utenti devono bussare'; + + @override + String get noOneCanJoin => 'Nessuno può unirsi'; + + @override + String userWouldLikeToChangeTheChat(String user) { + return '$user vorrebbe unirsi alla chat.'; + } + + @override + String get noPublicLinkHasBeenCreatedYet => + 'Non è stato ancora creato alcun link pubblico'; + + @override + String get knock => 'Bussa'; + + @override + String get users => 'Utenti'; + + @override + String get unlockOldMessages => 'Sblocca i vecchi messaggi'; + + @override + String get storeInSecureStorageDescription => + 'Salva la chiave di recupero nell\'archivio sicuro di questo dispositivo.'; + + @override + String get saveKeyManuallyDescription => + 'Salva questa chiave manualmente attivando la finestra di condivisione o gli appunti.'; + + @override + String get storeInAndroidKeystore => 'Salva nel KeyStore di Android'; + + @override + String get storeInAppleKeyChain => 'Salva nel portachiavi di Apple'; + + @override + String get storeSecurlyOnThisDevice => + 'Salva in modo sicuro su questo dispositivo'; + + @override + String countFiles(int count) { + return '$count file'; + } + + @override + String get user => 'Utente'; + + @override + String get custom => 'Personalizzato'; + + @override + String get foregroundServiceRunning => + 'Questa notifica viene mostrata quando il servizio in primo piano è in esecuzione.'; + + @override + String get screenSharingTitle => 'condivisione schermo'; + + @override + String get screenSharingDetail => + 'Stai condividendo il tuo schermo in FuffyChat'; + + @override + String get callingPermissions => 'Permessi di chiamata'; + + @override + String get callingAccount => 'Account di chiamata'; + + @override + String get callingAccountDetails => + 'Dai l\'autorizzazione a FluffyChat di usare l\'app di composizione Android nativa.'; + + @override + String get appearOnTop => 'Appare in alto'; + + @override + String get appearOnTopDetails => + 'Permetti all\'app di apparire in alto (non necessario se hai già impostato Fluffychat come account di chiamata)'; + + @override + String get otherCallingPermissions => + 'Microfono, fotocamera e altri permessi di FluffyChat'; + + @override + String get whyIsThisMessageEncrypted => + 'Perché questo messaggio è illeggibile?'; + + @override + String get noKeyForThisMessage => + 'Questo può accadere se il messaggio è stato inviato prima che hai fatto l\'accesso in questo dispositivo.\n\nÈ anche possibile che il mittente abbia bloccato il tuo dispositivo o che qualcosa sia andato storto con la tua connessione ad internet.\n\nSei in grado di leggere il messaggio su altre sessioni? Allora puoi trasferire il messaggio da lì! Vai su Impostazioni > Dispositivi e verifica che i tuoi dispositivi siano verificati l\'un l\'altro. Quando aprirai la stanza la prossima volta ed entrambe le sessioni sono in primo piano, le chiavi saranno trasmesse automaticamente.\n\nNon vuoi perdere le chiavi quando ti disconnetti o cambi dispositivo? Assicurati di aver attivato il backup delle chat nelle impostazioni.'; + + @override + String get newGroup => 'Nuovo gruppo'; + + @override + String get newSpace => 'Nuovo spazio'; + + @override + String get enterSpace => 'Unirsi allo spazio'; + + @override + String get enterRoom => 'Unirsi alla stanza'; + + @override + String get allSpaces => 'Tutti gli spazi'; + + @override + String numChats(String number) { + return '$number chat'; + } + + @override + String get hideUnimportantStateEvents => + 'Nascondi gli eventi di stato non importanti'; + + @override + String get hidePresences => 'Nascondere l\'elenco degli stati?'; + + @override + String get doNotShowAgain => 'Non mostrare più'; + + @override + String wasDirectChatDisplayName(String oldDisplayName) { + return 'Chat vuota (era $oldDisplayName)'; + } + + @override + String get newSpaceDescription => + 'Gli spazi ti permettono di consolidare le tue chat e di creare comunità private o pubbliche.'; + + @override + String get encryptThisChat => 'Cifra questa chat'; + + @override + String get disableEncryptionWarning => + 'Per motivi di sicurezza non puoi disabilitare la crittografia in una chat, se era stata abilitata in precedenza.'; + + @override + String get sorryThatsNotPossible => 'Scusa... questo non è possibile'; + + @override + String get deviceKeys => 'Chiavi del dispositivo:'; + + @override + String get reopenChat => 'Riapri la chat'; + + @override + String get noBackupWarning => + 'Attenzione! Senza abilitare il backup della chat, perderai l\'accesso ai tuoi messaggi crittografati. Si consiglia vivamente di abilitare il backup della chat prima di disconnettersi.'; + + @override + String get noOtherDevicesFound => 'Nessun altro dispositivo trovato'; + + @override + String fileIsTooBigForServer(String max) { + return 'Impossibile inviare! Il server supporta solo allegati fino a $max.'; + } + + @override + String fileHasBeenSavedAt(String path) { + return 'Il file è stato salvato in $path'; + } + + @override + String get jumpToLastReadMessage => 'Salta all\'ultimo messaggio letto'; + + @override + String get readUpToHere => 'Letto fino a qui'; + + @override + String get jump => 'Salta'; + + @override + String get openLinkInBrowser => 'Apri il collegamento nel browser'; + + @override + String get reportErrorDescription => + '😭 Oh no. Qualcosa è andato storto. Se vuoi, puoi segnalare questo bug agli sviluppatori.'; + + @override + String get report => 'segnala'; + + @override + String get signInWithPassword => 'Accedi con la password'; + + @override + String get pleaseTryAgainLaterOrChooseDifferentServer => + 'Per favore riprova più tardi o scegli un server diverso.'; + + @override + String signInWith(String provider) { + return 'Accedi con $provider'; + } + + @override + String get profileNotFound => + 'Impossibile trovare l\'utente sul server. Forse c\'è un problema di connessione oppure l\'utente non esiste.'; + + @override + String get setTheme => 'Imposta tema:'; + + @override + String get setColorTheme => 'Imposta tema colore:'; + + @override + String get invite => 'Invitare'; + + @override + String get inviteGroupChat => '📨 Invita a una chat di gruppo'; + + @override + String get invitePrivateChat => '📨 Invita a una chat privata'; + + @override + String get invalidInput => 'Contenuto non valido!'; + + @override + String wrongPinEntered(int seconds) { + return 'È stato inserito il pin sbagliato! Riprova tra $seconds secondi...'; + } + + @override + String get pleaseEnterANumber => + 'Per favore inserisci un numero maggiore di 0'; + + @override + String get archiveRoomDescription => + 'Questa chat sarà archiviata. Gli altri utenti saranno in grado di vedere che hai abbandonato la chat.'; + + @override + String get roomUpgradeDescription => + 'Questa chat sarà ricreata con la nuova versione della stanza. Tutti i partecipanti saranno avvertiti che devono passare alla nuova chat. Puoi leggere di più riguardo le versioni delle stanze su https://spec.matrix.org/latest/rooms/'; + + @override + String get removeDevicesDescription => + 'Sarai disconnesso da questo dispositivo e non potrai più ricevere messaggi.'; + + @override + String get banUserDescription => + 'L\'utente sarà bannato dalla chat e non sarà in grado di rientrare finché non verrà sbannato.'; + + @override + String get unbanUserDescription => 'L\'utente potrà rientrare nella chat.'; + + @override + String get kickUserDescription => + 'L\'utente è stato rimosso, ma non bannato. Nelle chat pubbliche, l\'utente potrà rientrare quando vuole.'; + + @override + String get makeAdminDescription => + 'Una volta che fai questo utente amministratore, potresti non essere in grado di rimuoverlo, in quanto avrà i tuoi stessi privilegi.'; + + @override + String get pushNotificationsNotAvailable => 'Notifiche push non disponibili'; + + @override + String get learnMore => 'Scopri di più'; + + @override + String get yourGlobalUserIdIs => 'Il tuo ID dell\'utente globale è: '; + + @override + String noUsersFoundWithQuery(String query) { + return 'Sfortunatamente non è stato trovato nessun utente con \"$query\". Per favore controlla se hai fatto un errore di battitura.'; + } + + @override + String get knocking => 'Bussare'; + + @override + String chatCanBeDiscoveredViaSearchOnServer(String server) { + return 'La chat può essere trovata tramite la ricerca su $server'; + } + + @override + String get searchChatsRooms => 'Cerca per #chat, @utenti...'; + + @override + String get nothingFound => 'Non è stato trovato nulla...'; + + @override + String get groupName => 'Nome gruppo'; + + @override + String get createGroupAndInviteUsers => 'Crea un gruppo e invita gli utenti'; + + @override + String get groupCanBeFoundViaSearch => 'Il gruppo può essere cercato'; + + @override + String get wrongRecoveryKey => + 'Mi dispiace... questa non sembra essere la chiave di recupero corretta.'; + + @override + String get startConversation => 'Inizia una conversazione'; + + @override + String get commandHint_sendraw => 'Manda un json grezzo'; + + @override + String get databaseMigrationTitle => 'Il database è ottimizzato'; + + @override + String get databaseMigrationBody => + 'Attendere prego. L\'operazione potrebbe richiedere un momento.'; + + @override + String get leaveEmptyToClearStatus => + 'Lascia vuoto per cancellare il tuo stato.'; + + @override + String get select => 'Seleziona'; + + @override + String get searchForUsers => 'Cerca @utenti...'; + + @override + String get pleaseEnterYourCurrentPassword => + 'Per favore inserisci la tua password attuale'; + + @override + String get newPassword => 'Nuova password'; + + @override + String get pleaseChooseAStrongPassword => + 'Per favore scegli una password forte'; + + @override + String get passwordsDoNotMatch => 'Le password non corrispondono'; + + @override + String get passwordIsWrong => 'La password inserita è sbagliata'; + + @override + String get publicLink => 'Link pubblico'; + + @override + String get publicChatAddresses => 'Indirizzi di chat pubblici'; + + @override + String get createNewAddress => 'Crea un nuovo indirizzo'; + + @override + String get joinSpace => 'Unisciti allo spazio'; + + @override + String get publicSpaces => 'Spazio pubblico'; + + @override + String get addChatOrSubSpace => 'Aggiungi chat o sottospazio'; + + @override + String get subspace => 'Sottospazio'; + + @override + String get decline => 'Declina'; + + @override + String get thisDevice => 'Questo dispositivo:'; + + @override + String get initAppError => + 'Si è verificato un errore durante l\'inizializzazione dell\'app'; + + @override + String get userRole => 'Ruolo utente'; + + @override + String minimumPowerLevel(String level) { + return '$level è il livello minimo di privilegi.'; + } + + @override + String searchIn(String chat) { + return 'Cerca nella chat \"$chat\"...'; + } + + @override + String get searchMore => 'Cerca di più...'; + + @override + String get gallery => 'Galleria'; + + @override + String get files => 'File'; + + @override + String databaseBuildErrorBody(String url, String error) { + return 'Impossibile costruire il database SQlite. L\'applicazione proverà ad usare il database legacy per ora. Per favore segnala questo errore agli sviluppatori su $url. Il messaggio di errore è: $error'; + } + + @override + String sessionLostBody(String url, String error) { + return 'La tua sessione è andata persa. Segnala questo errore agli sviluppatori all\'indirizzo $url. Il messaggio di errore è: $error'; + } + + @override + String restoreSessionBody(String url, String error) { + return 'L\'app ora tenta di ripristinare la sessione dal backup. Segnala questo errore agli sviluppatori all\'indirizzo $url. Il messaggio di errore è: $error'; + } + + @override + String forwardMessageTo(String roomName) { + return 'Inoltra messaggio in $roomName?'; + } + + @override + String get sendReadReceipts => 'Invia ricevute di lettura'; + + @override + String get sendTypingNotificationsDescription => + 'Gli altri partecipanti alla chat possono vedere quando stai scrivendo un nuovo messaggio.'; + + @override + String get sendReadReceiptsDescription => + 'Gli altri partecipanti alla chat possono vedere quando hai letto un messaggio.'; + + @override + String get formattedMessages => 'Messaggi formattati'; + + @override + String get formattedMessagesDescription => + 'Visualizza contenuti di messaggi complessi, come testo in grassetto, utilizzando il markdown.'; + + @override + String get verifyOtherUser => '🔐 Verifica altro utente'; + + @override + String get verifyOtherUserDescription => + 'Se verifichi un altro utente, puoi essere certo di sapere a chi stai realmente scrivendo. 💪\n\nQuando inizi una verifica, tu e l\'altro utente vedrete un popup nell\'app. Lì vedrai una serie di emoji o numeri che dovrai confrontare tra loro.\n\nIl modo migliore per farlo è incontrarsi o avviare una videochiamata. 👭'; + + @override + String get verifyOtherDevice => '🔐 Verifica altro dispositivo'; + + @override + String get verifyOtherDeviceDescription => + 'Quando verifichi un altro dispositivo, questi dispositivi possono scambiarsi le chiavi, aumentando la tua sicurezza complessiva. 💪 Quando inizi una verifica, apparirà un popup nell\'app su entrambi i dispositivi. Lì vedrai una serie di emoji o numeri che dovrai confrontare tra loro. È meglio avere entrambi i dispositivi a portata di mano prima di iniziare la verifica. 🤳'; + + @override + String acceptedKeyVerification(String sender) { + return '$sender ha accettato la verifica della chiave'; + } + + @override + String canceledKeyVerification(String sender) { + return '$sender ha annullato la verifica della chiave'; + } + + @override + String completedKeyVerification(String sender) { + return '$sender ha completato la verifica della chiave'; + } + + @override + String isReadyForKeyVerification(String sender) { + return '$sender è pronto per la verifica della chiave'; + } + + @override + String requestedKeyVerification(String sender) { + return '$sender ha richiesto la verifica della chiave'; + } + + @override + String startedKeyVerification(String sender) { + return '$sender ha avviato la verifica della chiave'; + } + + @override + String get transparent => 'Trasparente'; + + @override + String get incomingMessages => 'Messaggi in arrivo'; + + @override + String get stickers => 'Adesivi'; + + @override + String get discover => 'Scopri'; + + @override + String get commandHint_ignore => 'Ignora il Matrix ID fornito'; + + @override + String get commandHint_unignore => 'Ignora il Matrix ID specificato'; + + @override + String unreadChatsInApp(String appname, String unread) { + return '$appname: $unread chat non lette'; + } + + @override + String get noDatabaseEncryption => + 'La crittografia del database non è supportata su questa piattaforma'; + + @override + String thereAreCountUsersBlocked(Object count) { + return 'Al momento ci sono $count utenti bloccati.'; + } + + @override + String get restricted => 'Limitato'; + + @override + String get knockRestricted => 'Limitato al bussare'; + + @override + String goToSpace(Object space) { + return 'Vai allo spazio: $space'; + } + + @override + String get markAsUnread => 'Contrassegna come non letto'; + + @override + String userLevel(int level) { + return '$level - Utente'; + } + + @override + String moderatorLevel(int level) { + return '$level - Moderatore'; + } + + @override + String adminLevel(int level) { + return '$level - Amministratore'; + } + + @override + String get changeGeneralChatSettings => + 'Modifica le impostazioni generali della chat'; + + @override + String get inviteOtherUsers => 'Invita altri utenti a questa chat'; + + @override + String get changeTheChatPermissions => 'Cambia i permessi della chat'; + + @override + String get changeTheVisibilityOfChatHistory => + 'Cambia la visibilità della cronologia chat'; + + @override + String get changeTheCanonicalRoomAlias => + 'Cambia l\'indirizzo principale della chat pubblica'; + + @override + String get sendRoomNotifications => 'Invia notifiche alla @stanza'; + + @override + String get changeTheDescriptionOfTheGroup => + 'Cambia la descrizione della chat'; + + @override + String get chatPermissionsDescription => + 'Definisci quale livello di privilegi è necessario per determinate azioni in questa chat. I livelli di privilegi 0, 50 e 100 rappresentano solitamente utenti, moderatori e amministratori, ma qualsiasi valore intermedio è possibile.'; + + @override + String updateInstalled(String version) { + return '🎉 Aggiornamento $version installato!'; + } + + @override + String get changelog => 'Registro delle modifiche'; + + @override + String get sendCanceled => 'Invio annullato'; + + @override + String get loginWithMatrixId => 'Accedi con il Matrix ID'; + + @override + String get discoverHomeservers => 'Scopri gli homeserver'; + + @override + String get whatIsAHomeserver => 'Cos\'è un homeserver?'; + + @override + String get homeserverDescription => + 'Tutti i tuoi dati sono archiviati sull\'homeserver, proprio come un provider di posta elettronica. Puoi scegliere quale homeserver vuoi usare, mentre puoi comunque comunicare con tutti. Scopri di più su https://matrix.org.'; + + @override + String get doesNotSeemToBeAValidHomeserver => + 'Non sembra essere un homeserver compatibile. URL sbagliato?'; + + @override + String get calculatingFileSize => 'Calcolo della dimensione del file...'; + + @override + String get prepareSendingAttachment => + 'Preparazione per l\'invio dell\'allegato...'; + + @override + String get sendingAttachment => 'Invio allegato...'; + + @override + String get generatingVideoThumbnail => 'Generazione miniatura video...'; + + @override + String get compressVideo => 'Compressione video...'; + + @override + String sendingAttachmentCountOfCount(int index, int length) { + return 'Invio dell\'allegato $index di $length...'; + } + + @override + String serverLimitReached(int seconds) { + return 'Limite server raggiunto! Attendere $seconds secondi...'; + } + + @override + String get oneOfYourDevicesIsNotVerified => + 'Uno dei tuoi dispositivi non è verificato'; + + @override + String get noticeChatBackupDeviceVerification => + 'Nota: quando colleghi tutti i tuoi dispositivi al backup della chat, vengono verificati automaticamente.'; + + @override + String get continueText => 'Continua'; + + @override + String get welcomeText => + 'Hey Hey 👋 Questa è FluffyChat. Puoi accedere a qualsiasi homeserver compatibile con https://matrix.org. E poi chattare con chiunque. È un\'enorme rete di messaggistica decentralizzata!'; + + @override + String get blur => 'Sfocatura:'; + + @override + String get opacity => 'Opacità:'; + + @override + String get setWallpaper => 'Imposta sfondo'; + + @override + String get manageAccount => 'Gestisci account'; + + @override + String get noContactInformationProvided => + 'Il server non fornisce alcuna informazione di contatto valida'; + + @override + String get contactServerAdmin => 'Contatta l\'amministratore del server'; + + @override + String get contactServerSecurity => 'Contatta la sicurezza del server'; + + @override + String get supportPage => 'Pagina di supporto'; + + @override + String get serverInformation => 'Informazioni sul server:'; + + @override + String get name => 'Nome'; + + @override + String get version => 'Versione'; + + @override + String get website => 'Sito web'; + + @override + String get compress => 'Comprimere'; + + @override + String get boldText => 'Testo in grassetto'; + + @override + String get italicText => 'Testo in corsivo'; + + @override + String get strikeThrough => 'Barrato'; + + @override + String get pleaseFillOut => 'Si prega di compilare'; + + @override + String get invalidUrl => 'URL non valido'; + + @override + String get addLink => 'Aggiungi collegamento'; + + @override + String get unableToJoinChat => + 'Impossibile partecipare alla chat. Forse l\'altra parte ha già chiuso la conversazione.'; + + @override + String get previous => 'Precedente'; + + @override + String get otherPartyNotLoggedIn => + 'L\'altra parte non è attualmente connessa e quindi non può ricevere messaggi!'; + + @override + String appWantsToUseForLogin(String server) { + return 'Usa \'$server\' per accedere'; + } + + @override + String get appWantsToUseForLoginDescription => + 'Con la presente consenti all\'app e al sito web di condividere informazioni su di te.'; + + @override + String get open => 'Apri'; + + @override + String get waitingForServer => 'In attesa del server...'; + + @override + String get appIntroduction => + 'FluffyChat ti consente di chattare con i tuoi amici attraverso diverse app di messaggistica. Ulteriori informazioni su https://matrix.org o semplicemente tocca *Continua*.'; + + @override + String get newChatRequest => '📩 Nuova richiesta di chat'; + + @override + String get contentNotificationSettings => + 'Impostazioni del contenuto di notifica'; + + @override + String get generalNotificationSettings => 'Impostazioni di notifica generale'; + + @override + String get roomNotificationSettings => + 'Impostazioni di notifica della stanza'; + + @override + String get userSpecificNotificationSettings => + 'Impostazioni di notifica specifiche dell\'utente'; + + @override + String get otherNotificationSettings => 'Altre impostazioni di notifica'; + + @override + String get notificationRuleContainsUserName => 'Contiene il nome utente'; + + @override + String get notificationRuleContainsUserNameDescription => + 'Notifica l\'utente quando un messaggio contiene il proprio nome utente.'; + + @override + String get notificationRuleMaster => 'Silenzia tutte le notifiche'; + + @override + String get notificationRuleMasterDescription => + 'Sovrascive tutte le altre regole e disabilita tutte le notifiche.'; + + @override + String get notificationRuleSuppressNotices => + 'Silenziare i messaggi automatizzati'; + + @override + String get notificationRuleSuppressNoticesDescription => + 'Silenzia le notifiche da client automatizzati come i bot.'; + + @override + String get notificationRuleInviteForMe => 'Inviti per me'; + + @override + String get notificationRuleInviteForMeDescription => + 'Notifica l\'utente quando è invitato in una stanza.'; + + @override + String get notificationRuleMemberEvent => 'Eventi per i membri'; + + @override + String get notificationRuleMemberEventDescription => + 'Silenzia le notifiche per gli eventi dei membri.'; + + @override + String get notificationRuleIsUserMention => 'Menzioni dell\'utente'; + + @override + String get notificationRuleIsUserMentionDescription => + 'Notifica l\'utente quando viene menzionato direttamente in un messaggio.'; + + @override + String get notificationRuleContainsDisplayName => + 'Contiene nome visualizzato'; + + @override + String get notificationRuleContainsDisplayNameDescription => + 'Notifica l\'utente quando un messaggio contiene il proprio nome visualizzato.'; + + @override + String get notificationRuleIsRoomMention => 'Menzioni della stanza'; + + @override + String get notificationRuleIsRoomMentionDescription => + 'Notifica l\'utente quando c\'è una menzione della stanza.'; + + @override + String get notificationRuleRoomnotif => 'Notifiche della stanza'; + + @override + String get notificationRuleRoomnotifDescription => + 'Notifica l\'utente quando un messaggio contiene \'@room\'.'; + + @override + String get notificationRuleTombstone => 'Tombstone'; + + @override + String get notificationRuleTombstoneDescription => + 'Notifica all\'utente i messaggi di disattivazione della stanza.'; + + @override + String get notificationRuleReaction => 'Reazioni'; + + @override + String get notificationRuleReactionDescription => + 'Silenzia le notifiche per le reazioni.'; + + @override + String get notificationRuleRoomServerAcl => 'ACL del server della stanza'; + + @override + String get notificationRuleRoomServerAclDescription => + 'Silenzia le notifiche per gli elenchi di controllo degli accessi del server della stanza (ACL).'; + + @override + String get notificationRuleSuppressEdits => 'Silenzia le modifiche'; + + @override + String get notificationRuleSuppressEditsDescription => + 'Silenzia le notifiche per i messaggi modificati.'; + + @override + String get notificationRuleCall => 'Chiamate'; + + @override + String get notificationRuleCallDescription => + 'Notifica all\'utente le chiamate.'; + + @override + String get notificationRuleEncryptedRoomOneToOne => + 'Stanze crittografate One-to-One'; + + @override + String get notificationRuleEncryptedRoomOneToOneDescription => + 'Notifica all\'utente i messaggi in stanze crittografate one-to-one.'; + + @override + String get notificationRuleRoomOneToOne => 'Stanze One-to-One'; + + @override + String get notificationRuleRoomOneToOneDescription => + 'Notifica all\'utente i messaggi nelle stanze one-to-one.'; + + @override + String get notificationRuleMessage => 'Messaggi'; + + @override + String get notificationRuleMessageDescription => + 'Notifica all\'utente i messaggi generali.'; + + @override + String get notificationRuleEncrypted => 'Crittografate'; + + @override + String get notificationRuleEncryptedDescription => + 'Notifica all\'utente i messaggi nelle stanze crittografate.'; + + @override + String get notificationRuleJitsi => 'Jitsi'; + + @override + String get notificationRuleJitsiDescription => + 'Notifica all\'utente gli eventi del widget Jitsi.'; + + @override + String get notificationRuleServerAcl => + 'Silenziare gli eventi ACL del server'; + + @override + String get notificationRuleServerAclDescription => + 'Silenzia le notifiche per gli eventi ACL del server.'; + + @override + String unknownPushRule(String rule) { + return 'Regola push \'$rule\' sconosciuta'; + } + + @override + String get deletePushRuleCanNotBeUndone => + 'Se si elimina questa impostazione di notifica, questo non può essere annullato.'; + + @override + String get more => 'Di più'; + + @override + String get shareKeysWith => 'Condividi le chiavi con...'; + + @override + String get shareKeysWithDescription => + 'Quali dispositivi dovrebbero essere fidati in modo che possano leggere i tuoi messaggi in chat crittografate?'; + + @override + String get allDevices => 'Tutti i dispositivi'; + + @override + String get crossVerifiedDevicesIfEnabled => + 'Verifica incrociata dei dispositivi, se abilitata'; + + @override + String get crossVerifiedDevices => 'Dispositivi con verifica incrociata'; + + @override + String get verifiedDevicesOnly => 'Solo dispositivi verificati'; + + @override + String get takeAPhoto => 'Take a photo'; + + @override + String get recordAVideo => 'Record a video'; + + @override + String get optionalMessage => '(Optional) message...'; + + @override + String get notSupportedOnThisDevice => 'Not supported on this device'; + + @override + String get enterNewChat => 'Enter new chat'; + + @override + String get approve => 'Approve'; + + @override + String get youHaveKnocked => 'You have knocked'; + + @override + String get pleaseWaitUntilInvited => + 'Please wait now, until someone from the room invites you.'; +} diff --git a/lib/generated/l10n/l10n_ja.dart b/lib/generated/l10n/l10n_ja.dart new file mode 100644 index 0000000..bfcbd9b --- /dev/null +++ b/lib/generated/l10n/l10n_ja.dart @@ -0,0 +1,2714 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'l10n.dart'; + +// ignore_for_file: type=lint + +/// The translations for Japanese (`ja`). +class L10nJa extends L10n { + L10nJa([String locale = 'ja']) : super(locale); + + @override + String get noSendPermission => 'You can\'t send messages here'; + + @override + String get alwaysUse24HourFormat => 'false'; + + @override + String get repeatPassword => 'パスワードを繰り返そ'; + + @override + String get notAnImage => 'Not an image file.'; + + @override + String get setCustomPermissionLevel => 'Set custom permission level'; + + @override + String get setPermissionsLevelDescription => + 'Please choose a predefined role below or enter a custom permission level between 0 and 100.'; + + @override + String get ignoreUser => 'Ignore user'; + + @override + String get normalUser => 'Normal user'; + + @override + String get remove => '消去'; + + @override + String get importNow => 'Import now'; + + @override + String get importEmojis => 'Import Emojis'; + + @override + String get importFromZipFile => 'Import from .zip file'; + + @override + String get exportEmotePack => 'Export Emote pack as .zip'; + + @override + String get replace => 'Replace'; + + @override + String get about => 'このアプリについて'; + + @override + String aboutHomeserver(String homeserver) { + return 'About $homeserver'; + } + + @override + String get accept => '承諾する'; + + @override + String acceptedTheInvitation(String username) { + return '👍$usernameが招待を承諾しました'; + } + + @override + String get account => 'アカウント'; + + @override + String activatedEndToEndEncryption(String username) { + return '🔐$usernameがエンドツーエンド暗号化を有効にしました'; + } + + @override + String get addEmail => 'Eメールを追加'; + + @override + String get confirmMatrixId => 'アカウントを削除するには、Matrix IDを確認してください。'; + + @override + String supposedMxid(String mxid) { + return 'This should be $mxid'; + } + + @override + String get addChatDescription => 'Add a chat description...'; + + @override + String get addToSpace => 'スペースに追加'; + + @override + String get admin => '管理者'; + + @override + String get alias => 'エイリアス'; + + @override + String get all => 'すべて'; + + @override + String get allChats => 'すべて会話'; + + @override + String get commandHint_roomupgrade => + 'Upgrade this room to the given room version'; + + @override + String get commandHint_googly => 'ぎょろ目を送る'; + + @override + String get commandHint_cuddle => 'Send a cuddle'; + + @override + String get commandHint_hug => 'ハグを送る'; + + @override + String googlyEyesContent(String senderName) { + return '$senderName sends you googly eyes'; + } + + @override + String cuddleContent(String senderName) { + return '$senderName cuddles you'; + } + + @override + String hugContent(String senderName) { + return '$senderName hugs you'; + } + + @override + String answeredTheCall(String senderName) { + return '$senderNameは通話に出ました'; + } + + @override + String get anyoneCanJoin => '誰でも参加できる'; + + @override + String get appLock => 'アプリのロック'; + + @override + String get appLockDescription => + 'Lock the app when not using with a pin code'; + + @override + String get archive => 'アーカイブ'; + + @override + String get areGuestsAllowedToJoin => 'ゲストユーザーの参加を許可する'; + + @override + String get areYouSure => 'これでよろしいですか?'; + + @override + String get areYouSureYouWantToLogout => 'ログアウトしてよろしいですか?'; + + @override + String get askSSSSSign => '他の人を署名するためにはパスフレーズやリカバリーキーを入力してください。'; + + @override + String askVerificationRequest(String username) { + return '$usernameの検証リクエストを承認しますか?'; + } + + @override + String get autoplayImages => 'GIFを自動的に再生する'; + + @override + String badServerLoginTypesException(String serverVersions, + String supportedVersions, Object suportedVersions) { + return 'ホームサーバーでサポートされているログインタイプ:\n$serverVersions\nアプリがサポートしているログインタイプ:\n$supportedVersions'; + } + + @override + String get sendTypingNotifications => 'Send typing notifications'; + + @override + String get swipeRightToLeftToReply => 'Swipe right to left to reply'; + + @override + String get sendOnEnter => 'Enterで送信'; + + @override + String badServerVersionsException(String serverVersions, + String supportedVersions, Object serverVerions, Object suportedVersions) { + return 'ホームサーバーでサポートされているバージョン:\n$serverVersions\nアプリでは$supportedVersionsしかサポートされていません'; + } + + @override + String countChatsAndCountParticipants(int chats, int participants) { + return '$chats chats and $participants participants'; + } + + @override + String get noMoreChatsFound => 'No more chats found...'; + + @override + String get noChatsFoundHere => + 'No chats found here yet. Start a new chat with someone by using the button below. ⤵️'; + + @override + String get joinedChats => 'Joined chats'; + + @override + String get unread => 'Unread'; + + @override + String get space => 'Space'; + + @override + String get spaces => 'Spaces'; + + @override + String get banFromChat => 'チャットからBANする'; + + @override + String get banned => 'BANされています'; + + @override + String bannedUser(String username, String targetName) { + return '$usernameが$targetNameをBANしました'; + } + + @override + String get blockDevice => 'デバイスをブロックする'; + + @override + String get blocked => 'ブロックしました'; + + @override + String get botMessages => 'ボットメッセージ'; + + @override + String get cancel => 'キャンセル'; + + @override + String cantOpenUri(String uri) { + return 'URIが開けません $uri'; + } + + @override + String get changeDeviceName => 'デバイス名を変更'; + + @override + String changedTheChatAvatar(String username) { + return '$usernameがチャットアバターを変更しました'; + } + + @override + String changedTheChatDescriptionTo(String username, String description) { + return '$usernameがチャットの説明を「$description」に変更しました'; + } + + @override + String changedTheChatNameTo(String username, String chatname) { + return '$usernameがチャットの名前を「$chatname」に変更しました'; + } + + @override + String changedTheChatPermissions(String username) { + return '$usernameがチャットの権限を変更しました'; + } + + @override + String changedTheDisplaynameTo(String username, String displayname) { + return '$usernameが表示名を「$displayname」に変更しました'; + } + + @override + String changedTheGuestAccessRules(String username) { + return '$usernameがゲストのアクセスルールを変更しました'; + } + + @override + String changedTheGuestAccessRulesTo(String username, String rules) { + return '$usernameがゲストのアクセスルールを$rulesに変更しました'; + } + + @override + String changedTheHistoryVisibility(String username) { + return '$usernameが履歴の表示設定を変更しました'; + } + + @override + String changedTheHistoryVisibilityTo(String username, String rules) { + return '$usernameが履歴の表示設定を$rulesに変更しました'; + } + + @override + String changedTheJoinRules(String username) { + return '$usernameが参加ルールを変更しました'; + } + + @override + String changedTheJoinRulesTo(String username, String joinRules) { + return '$usernameが参加ルールを$joinRulesに変更しました'; + } + + @override + String changedTheProfileAvatar(String username) { + return '$usernameがアバターを変更しました'; + } + + @override + String changedTheRoomAliases(String username) { + return '$usernameが部屋のエイリアスを変更しました'; + } + + @override + String changedTheRoomInvitationLink(String username) { + return '$usernameが招待リンクを変更しました'; + } + + @override + String get changePassword => 'パスワードを変更'; + + @override + String get changeTheHomeserver => 'ホームサーバーの変更'; + + @override + String get changeTheme => 'スタイルを変更する'; + + @override + String get changeTheNameOfTheGroup => 'グループの名前を変更する'; + + @override + String get changeYourAvatar => 'アバタるを変化しする'; + + @override + String get channelCorruptedDecryptError => '暗号が破損しています'; + + @override + String get chat => 'チャット'; + + @override + String get yourChatBackupHasBeenSetUp => 'チャットバックアップを設定ました。'; + + @override + String get chatBackup => 'チャットのバックアップ'; + + @override + String get chatBackupDescription => '古いメッセージはリカバリーキーで保護されます。紛失しないようにご注意ください。'; + + @override + String get chatDetails => 'チャットの詳細'; + + @override + String get chatHasBeenAddedToThisSpace => 'このスペースにチャットが追加されました'; + + @override + String get chats => 'チャット'; + + @override + String get chooseAStrongPassword => '強いパスワードを選択してください'; + + @override + String get clearArchive => 'アーカイブを消去'; + + @override + String get close => '閉じる'; + + @override + String get commandHint_markasdm => 'ダイレクトメッセージの部屋としてマークする'; + + @override + String get commandHint_markasgroup => 'グループとしてマーク'; + + @override + String get commandHint_ban => 'このユーザーを禁止する'; + + @override + String get commandHint_clearcache => 'キャッシュをクリアする'; + + @override + String get commandHint_create => + '空のグループチャットを作成\n暗号化を無効にするには、--no-encryption を使用'; + + @override + String get commandHint_discardsession => 'セッションを破棄'; + + @override + String get commandHint_dm => + 'ダイレクトチャットを開始する\n暗号化を無効にするには、--no-encryptionを使用してください'; + + @override + String get commandHint_html => 'HTML形式のテキストを送信'; + + @override + String get commandHint_invite => '指定したユーザーをこの部屋に招待'; + + @override + String get commandHint_join => '指定した部屋に参加'; + + @override + String get commandHint_kick => 'Remove the given user from this room'; + + @override + String get commandHint_leave => 'この部屋を退出'; + + @override + String get commandHint_me => 'Describe yourself'; + + @override + String get commandHint_myroomavatar => 'この部屋の写真を設定する (mxc-uriで)'; + + @override + String get commandHint_myroomnick => 'この部屋の表示名を設定する'; + + @override + String get commandHint_op => + 'Set the given user\'s power level (default: 50)'; + + @override + String get commandHint_plain => '書式設定されていないテキストを送信する'; + + @override + String get commandHint_react => 'リアクションとして返信を送信する'; + + @override + String get commandHint_send => 'テキストを送信'; + + @override + String get commandHint_unban => 'Unban the given user from this room'; + + @override + String get commandInvalid => 'コマンドが無効'; + + @override + String commandMissing(String command) { + return '$command はコマンドではありません。'; + } + + @override + String get compareEmojiMatch => '表示されている絵文字が他のデバイスで表示されているものと一致するか確認してください:'; + + @override + String get compareNumbersMatch => '表示されている数字が他のデバイスで表示されているものと一致するか確認してください:'; + + @override + String get configureChat => 'チャットの設定'; + + @override + String get confirm => '確認'; + + @override + String get connect => '接続'; + + @override + String get contactHasBeenInvitedToTheGroup => '連絡先に登録された人が招待されました'; + + @override + String get containsDisplayName => '表示名を含んでいます'; + + @override + String get containsUserName => 'ユーザー名を含んでいます'; + + @override + String get contentHasBeenReported => 'サーバー管理者に通報されました'; + + @override + String get copiedToClipboard => 'クリップボードにコピーされました'; + + @override + String get copy => 'コピー'; + + @override + String get copyToClipboard => 'クリップボードにコピー'; + + @override + String couldNotDecryptMessage(String error) { + return 'メッセージを解読できませんでした: $error'; + } + + @override + String countParticipants(int count) { + return '$count名の参加者'; + } + + @override + String get create => '作成'; + + @override + String createdTheChat(String username) { + return '💬 $usernameがチャットを作成しました'; + } + + @override + String get createGroup => 'Create group'; + + @override + String get createNewSpace => '新しいスペース'; + + @override + String get currentlyActive => '現在アクティブです'; + + @override + String get darkTheme => 'ダーク'; + + @override + String dateAndTimeOfDay(String date, String timeOfDay) { + return '$date, $timeOfDay'; + } + + @override + String dateWithoutYear(String month, String day) { + return '$month-$day'; + } + + @override + String dateWithYear(String year, String month, String day) { + return '$year/$month/$day'; + } + + @override + String get deactivateAccountWarning => + 'あなたのアカウントを無効化します。この操作は元に戻せません!よろしいですか?'; + + @override + String get defaultPermissionLevel => 'デフォルトの権限レベル'; + + @override + String get delete => '削除'; + + @override + String get deleteAccount => 'アカウントの削除'; + + @override + String get deleteMessage => 'メッセージの削除'; + + @override + String get device => 'デバイス'; + + @override + String get deviceId => 'デバイスID'; + + @override + String get devices => 'デバイス'; + + @override + String get directChats => 'ダイレクトチャット'; + + @override + String get allRooms => 'All Group Chats'; + + @override + String get displaynameHasBeenChanged => '表示名が変更されました'; + + @override + String get downloadFile => 'ファイルのダウンロード'; + + @override + String get edit => '編集'; + + @override + String get editBlockedServers => 'ブロックしたサーバーを編集'; + + @override + String get chatPermissions => 'Chat permissions'; + + @override + String get editDisplayname => '表示名を編集'; + + @override + String get editRoomAliases => 'ルームエイリアスを編集'; + + @override + String get editRoomAvatar => '部屋のアバターを編集する'; + + @override + String get emoteExists => 'Emoteはすでに存在します!'; + + @override + String get emoteInvalid => '不正なEmoteショートコード!'; + + @override + String get emoteKeyboardNoRecents => + 'Recently-used emotes will appear here...'; + + @override + String get emotePacks => '部屋のEmoteパック'; + + @override + String get emoteSettings => 'Emote設定'; + + @override + String get globalChatId => 'Global chat ID'; + + @override + String get accessAndVisibility => 'Access and visibility'; + + @override + String get accessAndVisibilityDescription => + 'Who is allowed to join this chat and how the chat can be discovered.'; + + @override + String get calls => 'Calls'; + + @override + String get customEmojisAndStickers => 'Custom emojis and stickers'; + + @override + String get customEmojisAndStickersBody => + 'Add or share custom emojis or stickers which can be used in any chat.'; + + @override + String get emoteShortcode => 'Emoteショートコード'; + + @override + String get emoteWarnNeedToPick => 'Emoteショートコードと画像を選択してください!'; + + @override + String get emptyChat => '空のチャット'; + + @override + String get enableEmotesGlobally => 'emoteをグローバルに有効にする'; + + @override + String get enableEncryption => '暗号化を有効にする'; + + @override + String get enableEncryptionWarning => '一度暗号化を有効にするともとに戻せません。よろしいですか?'; + + @override + String get encrypted => '暗号化'; + + @override + String get encryption => '暗号化'; + + @override + String get encryptionNotEnabled => '暗号化されていません'; + + @override + String endedTheCall(String senderName) { + return '$senderNameは通話を切断しました'; + } + + @override + String get enterAnEmailAddress => 'メールアドレスを入力してください'; + + @override + String get homeserver => 'ホームサーバー'; + + @override + String get enterYourHomeserver => 'ホームサーバーを入力してください'; + + @override + String errorObtainingLocation(String error) { + return '位置情報の取得中にエラーが発生しました: $error'; + } + + @override + String get everythingReady => 'すべての準備は完了しました!'; + + @override + String get extremeOffensive => 'とても攻撃的'; + + @override + String get fileName => 'ファイル名'; + + @override + String get fluffychat => 'FluffyChat'; + + @override + String get fontSize => 'フォントサイズ'; + + @override + String get forward => '進む'; + + @override + String get fromJoining => '参加時点から閲覧可能'; + + @override + String get fromTheInvitation => '招待時点から閲覧可能'; + + @override + String get goToTheNewRoom => '新規ルームへ'; + + @override + String get group => 'グループ'; + + @override + String get chatDescription => 'Chat description'; + + @override + String get chatDescriptionHasBeenChanged => 'Chat description changed'; + + @override + String get groupIsPublic => 'グループは公開されています'; + + @override + String get groups => 'グループ'; + + @override + String groupWith(String displayname) { + return '$displaynameとグループを作成する'; + } + + @override + String get guestsAreForbidden => 'ゲストは許可されていません'; + + @override + String get guestsCanJoin => 'ゲストが許可されています'; + + @override + String hasWithdrawnTheInvitationFor(String username, String targetName) { + return '$targetNameの招待を$usernameが取り下げました'; + } + + @override + String get help => 'ヘルプ'; + + @override + String get hideRedactedEvents => '編集済みイベントを非表示にする'; + + @override + String get hideRedactedMessages => 'Hide redacted messages'; + + @override + String get hideRedactedMessagesBody => + 'If someone redacts a message, this message won\'t be visible in the chat anymore.'; + + @override + String get hideInvalidOrUnknownMessageFormats => + 'Hide invalid or unknown message formats'; + + @override + String get howOffensiveIsThisContent => 'どのくらい攻撃的でしたか?'; + + @override + String get id => 'ID'; + + @override + String get identity => 'アイデンティティ'; + + @override + String get block => 'Block'; + + @override + String get blockedUsers => 'Blocked users'; + + @override + String get blockListDescription => + 'You can block users who are disturbing you. You won\'t be able to receive any messages or room invites from the users on your personal block list.'; + + @override + String get blockUsername => 'Ignore username'; + + @override + String get iHaveClickedOnLink => 'リンクをクリックしました'; + + @override + String get incorrectPassphraseOrKey => 'パスフレーズかリカバリーキーが間違っています'; + + @override + String get inoffensive => '非攻撃的'; + + @override + String get inviteContact => '連絡先から招待する'; + + @override + String inviteContactToGroupQuestion(Object contact, Object groupName) { + return 'Do you want to invite $contact to the chat \"$groupName\"?'; + } + + @override + String inviteContactToGroup(String groupName) { + return '連絡先から$groupNameに招待する'; + } + + @override + String get noChatDescriptionYet => 'No chat description created yet.'; + + @override + String get tryAgain => 'Try again'; + + @override + String get invalidServerName => 'Invalid server name'; + + @override + String get invited => '招待されました'; + + @override + String get redactMessageDescription => + 'The message will be redacted for all participants in this conversation. This cannot be undone.'; + + @override + String get optionalRedactReason => + '(Optional) Reason for redacting this message...'; + + @override + String invitedUser(String username, String targetName) { + return '📩 $username が $targetName を招待しました'; + } + + @override + String get invitedUsersOnly => '招待されたユーザーのみ'; + + @override + String get inviteForMe => '自分への招待'; + + @override + String inviteText(String username, String link) { + return '$usernameがFluffyChatにあなたを招待しました. \n1. FluffyChatをインストールしてください: https://fluffychat.im \n2. 新しくアカウントを作成するかサインインしてください\n3. 招待リンクを開いてください: $link'; + } + + @override + String get isTyping => 'が入力しています…'; + + @override + String joinedTheChat(String username) { + return '👋 $username がチャットに参加しました'; + } + + @override + String get joinRoom => '部屋に参加'; + + @override + String kicked(String username, String targetName) { + return '👞 $username は $targetName をキックしました'; + } + + @override + String kickedAndBanned(String username, String targetName) { + return '🙅 $username が $targetName をキックしブロックしました'; + } + + @override + String get kickFromChat => 'チャットからキックする'; + + @override + String lastActiveAgo(String localizedTimeShort) { + return '最終アクティブ: $localizedTimeShort'; + } + + @override + String get leave => '退室する'; + + @override + String get leftTheChat => '退室しました'; + + @override + String get license => 'ライセンス'; + + @override + String get lightTheme => 'ライト'; + + @override + String loadCountMoreParticipants(int count) { + return 'あと$count名参加者を読み込む'; + } + + @override + String get dehydrate => 'セッションのエクスポートとデバイスの消去'; + + @override + String get dehydrateWarning => 'この操作は元に戻せません。バックアップファイルを安全に保存してください。'; + + @override + String get dehydrateTor => 'TOR ユーザー: セッションをエクスポート'; + + @override + String get dehydrateTorLong => + 'TOR ユーザーの場合、ウィンドウを閉じる前にセッションをエクスポートすることをお勧めします。'; + + @override + String get hydrateTor => 'TOR ユーザー: セッションのエクスポートをインポート'; + + @override + String get hydrateTorLong => + '前回、TOR でセッションをエクスポートしましたか?すぐにインポートしてチャットを続けましょう。'; + + @override + String get hydrate => 'バックアップファイルから復元'; + + @override + String get loadingPleaseWait => '読み込み中…お待ちください。'; + + @override + String get loadMore => '更に読み込む…'; + + @override + String get locationDisabledNotice => + '位置情報サービスが無効になっています。位置情報を共有できるようにするには、位置情報サービスを有効にしてください。'; + + @override + String get locationPermissionDeniedNotice => + '位置情報の権限が拒否されました。位置情報を共有できるように許可してください。'; + + @override + String get login => 'ログイン'; + + @override + String logInTo(String homeserver) { + return '$homeserverにログインする'; + } + + @override + String get logout => 'ログアウト'; + + @override + String get memberChanges => 'メンバーの変更'; + + @override + String get mention => 'メンション'; + + @override + String get messages => 'メッセージ'; + + @override + String get messagesStyle => 'Messages:'; + + @override + String get moderator => 'モデレータ'; + + @override + String get muteChat => 'チャットのミュート'; + + @override + String get needPantalaimonWarning => + '現時点では、エンドツーエンドの暗号化を使用するにはPantalaimonが必要であることに注意してください。'; + + @override + String get newChat => '新規チャット'; + + @override + String get newMessageInFluffyChat => '💬 FluffyChatに新しいメッセージがあります'; + + @override + String get newVerificationRequest => '認証リクエスト!'; + + @override + String get next => '次へ'; + + @override + String get no => 'いいえ'; + + @override + String get noConnectionToTheServer => 'サーバーに接続できません'; + + @override + String get noEmotesFound => 'Emoteは見つかりませんでした😕'; + + @override + String get noEncryptionForPublicRooms => 'ルームを非公開にした後暗号化を有効にできます。'; + + @override + String get noGoogleServicesWarning => + 'あなたのスマホにはGoogleサービスがないようですね。プライバシーを保護するための良い選択です!プッシュ通知を受け取るには https://microg.org/ または https://unifiedpush.org/ を使うことをお勧めします。'; + + @override + String noMatrixServer(String server1, String server2) { + return '$server1 はMatrixのサーバーではありません。代わりに $server2 を使用しますか?'; + } + + @override + String get shareInviteLink => 'Share invite link'; + + @override + String get scanQrCode => 'QRコードをスキャン'; + + @override + String get none => 'なし'; + + @override + String get noPasswordRecoveryDescription => 'パスワードを回復する方法をまだ追加していません。'; + + @override + String get noPermission => '権限がありません'; + + @override + String get noRoomsFound => '部屋は見つかりませんでした…'; + + @override + String get notifications => '通知'; + + @override + String get notificationsEnabledForThisAccount => 'このアカウントでは通知が有効です'; + + @override + String numUsersTyping(int count) { + return '$count人が入力中…'; + } + + @override + String get obtainingLocation => '位置情報を取得しています…'; + + @override + String get offensive => '攻撃的'; + + @override + String get offline => 'オフライン'; + + @override + String get ok => 'OK'; + + @override + String get online => 'オンライン'; + + @override + String get onlineKeyBackupEnabled => 'オンライン鍵バックアップは使用されています'; + + @override + String get oopsPushError => 'おっと!残念ながら、プッシュ通知の設定中にエラーが発生しました。'; + + @override + String get oopsSomethingWentWrong => 'おっと、何かがうまくいきませんでした…'; + + @override + String get openAppToReadMessages => 'アプリを開いてメッセージを確認してください'; + + @override + String get openCamera => 'カメラを開く'; + + @override + String get openVideoCamera => 'ビデオ用にカメラを開く'; + + @override + String get oneClientLoggedOut => 'クライアントの 1つがログアウトしました'; + + @override + String get addAccount => 'アカウントを追加'; + + @override + String get editBundlesForAccount => 'このアカウントのバンドルを編集'; + + @override + String get addToBundle => 'バンドルに追加'; + + @override + String get removeFromBundle => 'このバンドルから削除'; + + @override + String get bundleName => 'バンドル名'; + + @override + String get enableMultiAccounts => '(ベータ版) このデバイスで複数のアカウントを有効にする'; + + @override + String get openInMaps => 'Open in maps'; + + @override + String get link => 'リンク'; + + @override + String get serverRequiresEmail => 'このサーバーは、登録のためにメールアドレスを検証する必要があります。'; + + @override + String get or => 'または'; + + @override + String get participant => '参加者'; + + @override + String get passphraseOrKey => 'パスフレーズかリカバリーキー'; + + @override + String get password => 'パスワード'; + + @override + String get passwordForgotten => 'パスワードを忘れた'; + + @override + String get passwordHasBeenChanged => 'パスワードが変更されました'; + + @override + String get hideMemberChangesInPublicChats => + 'Hide member changes in public chats'; + + @override + String get hideMemberChangesInPublicChatsBody => + 'Do not show in the chat timeline if someone joins or leaves a public chat to improve readability.'; + + @override + String get overview => 'Overview'; + + @override + String get notifyMeFor => 'Notify me for'; + + @override + String get passwordRecoverySettings => 'Password recovery settings'; + + @override + String get passwordRecovery => 'パスワードリカバリー'; + + @override + String get people => '人々'; + + @override + String get pickImage => '画像を選択してください'; + + @override + String get pin => 'ピン'; + + @override + String play(String fileName) { + return '$fileNameを再生する'; + } + + @override + String get pleaseChoose => '選択してください'; + + @override + String get pleaseChooseAPasscode => 'パスコードを選んでください'; + + @override + String get pleaseClickOnLink => 'メールのリンクから進めてください。'; + + @override + String get pleaseEnter4Digits => 'アプリのロック用に4桁の数字を入力してください。空欄の場合は無効になります。'; + + @override + String get pleaseEnterRecoveryKey => 'リカバリーキーを入力してください。'; + + @override + String get pleaseEnterYourPassword => 'パスワードを入力してください'; + + @override + String get pleaseEnterYourPin => 'PINを入力してください'; + + @override + String get pleaseEnterYourUsername => 'ユーザー名を入力してください'; + + @override + String get pleaseFollowInstructionsOnWeb => 'ウェブサイトにあるやり方を見てから次をタップしてください。'; + + @override + String get privacy => 'プライバシー'; + + @override + String get publicRooms => '公開された部屋'; + + @override + String get pushRules => 'ルールを追加する'; + + @override + String get reason => '理由'; + + @override + String get recording => '録音中'; + + @override + String redactedBy(String username) { + return 'Redacted by $username'; + } + + @override + String get directChat => 'Direct chat'; + + @override + String redactedByBecause(String username, String reason) { + return 'Redacted by $username because: \"$reason\"'; + } + + @override + String redactedAnEvent(String username) { + return '$usernameがイベントを編集しました'; + } + + @override + String get redactMessage => 'メッセージを書く'; + + @override + String get register => '登録'; + + @override + String get reject => '拒否'; + + @override + String rejectedTheInvitation(String username) { + return '$usernameは招待を拒否しました'; + } + + @override + String get rejoin => '再参加'; + + @override + String get removeAllOtherDevices => '他のデバイスをすべて削除'; + + @override + String removedBy(String username) { + return '$usernameによって削除されました'; + } + + @override + String get removeDevice => 'デバイスの削除'; + + @override + String get unbanFromChat => 'チャットからのブロックを解除する'; + + @override + String get removeYourAvatar => 'アバターを削除する'; + + @override + String get replaceRoomWithNewerVersion => '部屋を新しいバージョンに変更する'; + + @override + String get reply => '返信'; + + @override + String get reportMessage => 'メッセージを通報'; + + @override + String get translateMessage => 'Translate message'; + + @override + String get translatedMessage => 'Translated message'; + + @override + String get errorTranslatingMessage => + 'An error has occured while translating the message.'; + + @override + String get recoverMessage => 'Recover message'; + + @override + String get recoveredMessage => 'Recovered message'; + + @override + String get errorRecoveringMessage => + 'An error has occured while recovering the message.'; + + @override + String get errorRecoveringMessageNoAdmin => + 'This feature is available on Synapse homeservers only for adminstrators.'; + + @override + String get requestPermission => '権限を要求する'; + + @override + String get roomHasBeenUpgraded => '部屋はアップグレードされました'; + + @override + String get roomVersion => 'ルームバージョン'; + + @override + String get saveFile => 'ファイルを保存'; + + @override + String get retry => 'Retry'; + + @override + String get search => '検索'; + + @override + String get security => 'セキュリティ'; + + @override + String get recoveryKey => 'リカバリーキー'; + + @override + String get recoveryKeyLost => 'リカバリーキーを紛失した場合'; + + @override + String seenByUser(String username) { + return '$usernameが既読'; + } + + @override + String get send => '送信'; + + @override + String get sendAMessage => 'メッセージを送信'; + + @override + String get sendAsText => 'テキストとして送信'; + + @override + String get sendAudio => '音声の送信'; + + @override + String get sendFile => 'ファイルを送信'; + + @override + String get sendImage => '画像の送信'; + + @override + String sendImages(int count) { + return 'Send $count image'; + } + + @override + String get sendMessages => 'メッセージを送る'; + + @override + String get sendOriginal => 'オリジナルの送信'; + + @override + String get sendSticker => 'ステッカーを送る'; + + @override + String get sendVideo => '動画を送信'; + + @override + String sentAFile(String username) { + return '📁 $usernameはファイルを送信しました'; + } + + @override + String sentAnAudio(String username) { + return '🎤 $usernameは音声を送信しました'; + } + + @override + String sentAPicture(String username) { + return '🖼️ $usernameは画像を送信しました'; + } + + @override + String sentASticker(String username) { + return '😊 $usernameはステッカーを送信しました'; + } + + @override + String sentAVideo(String username) { + return '🎥 $usernameは動画を送信しました'; + } + + @override + String sentCallInformations(String senderName) { + return '$senderNameは通話情報を送信しました'; + } + + @override + String get separateChatTypes => 'Separate Direct Chats and Groups'; + + @override + String get setAsCanonicalAlias => 'メインエイリアスに設定'; + + @override + String get setCustomEmotes => 'カスタムエモートの設定'; + + @override + String get setChatDescription => 'Set chat description'; + + @override + String get setInvitationLink => '招待リンクを設定する'; + + @override + String get setPermissionsLevel => '権限レベルをセット'; + + @override + String get setStatus => 'ステータスの設定'; + + @override + String get settings => '設定'; + + @override + String get share => '共有'; + + @override + String sharedTheLocation(String username) { + return '$usernameは現在地を共有しました'; + } + + @override + String get shareLocation => '位置情報の共有'; + + @override + String get showPassword => 'パスワードを表示'; + + @override + String get presenceStyle => 'Presence:'; + + @override + String get hideAvatarsInInvites => 'Hide avatars in invites'; + + @override + String get hideAvatarsInInvitesDescription => + 'Do not show room avatars in invites'; + + @override + String get presencesToggle => 'Show status messages from other users'; + + @override + String get pureBlackToggle => 'Pure Black'; + + @override + String get singlesignon => 'シングルサインオン'; + + @override + String get skip => 'スキップ'; + + @override + String get sourceCode => 'ソースコード'; + + @override + String get spaceIsPublic => 'スペースは公開されています'; + + @override + String get spaceName => 'スペース名'; + + @override + String startedACall(String senderName) { + return '$senderNameは通話を開始しました'; + } + + @override + String get startFirstChat => '最初のチャットを開始する'; + + @override + String get status => 'ステータス'; + + @override + String get statusExampleMessage => 'お元気ですか?'; + + @override + String get submit => '送信'; + + @override + String get synchronizingPleaseWait => '同期中...お待ちください。'; + + @override + String synchronizingPleaseWaitCounter(String percentage) { + return ' Synchronizing… ($percentage%)'; + } + + @override + String get systemTheme => 'システム'; + + @override + String get theyDontMatch => '違います'; + + @override + String get theyMatch => '一致しています'; + + @override + String get title => 'FluffyChat'; + + @override + String get toggleFavorite => 'お気に入り切り替え'; + + @override + String get toggleMuted => 'ミュート切り替え'; + + @override + String get toggleUnread => '既読/未読にマーク'; + + @override + String get tooManyRequestsWarning => 'リクエストが多すぎます。また後で試してみてください!'; + + @override + String get transferFromAnotherDevice => '違うデバイスから移行する'; + + @override + String get tryToSendAgain => '送信し直してみる'; + + @override + String get unavailable => '不在'; + + @override + String unbannedUser(String username, String targetName) { + return '$usernameが$targetNameのBANを解除しました'; + } + + @override + String get unblockDevice => 'デバイスをブロック解除する'; + + @override + String get unknownDevice => '未知デバイス'; + + @override + String get unknownEncryptionAlgorithm => '未知の暗号化アルゴリズム'; + + @override + String unknownEvent(String type) { + return '未知のイベント\'$type\''; + } + + @override + String get unmuteChat => 'チャットをミュート解除する'; + + @override + String get unpin => 'ピンを外す'; + + @override + String unreadChats(int unreadCount) { + String _temp0 = intl.Intl.pluralLogic( + unreadCount, + locale: localeName, + other: '$unreadCount件の未読メッセージ', + one: '1件の未読メッセージ', + ); + return '$_temp0'; + } + + @override + String userAndOthersAreTyping(String username, int count) { + return '$usernameと他$count名が入力しています…'; + } + + @override + String userAndUserAreTyping(String username, String username2) { + return '$usernameと$username2が入力しています…'; + } + + @override + String userIsTyping(String username) { + return '$usernameが入力しています…'; + } + + @override + String userLeftTheChat(String username) { + return '🚪 $usernameはチャットから退室しました'; + } + + @override + String get username => 'ユーザー名'; + + @override + String userSentUnknownEvent(String username, String type) { + return '$usernameは$typeイベントを送信しました'; + } + + @override + String get unverified => '未検証'; + + @override + String get verified => '検証済み'; + + @override + String get verify => '確認'; + + @override + String get verifyStart => '確認を始める'; + + @override + String get verifySuccess => '確認が完了しました!'; + + @override + String get verifyTitle => '他のアカウントを確認中'; + + @override + String get videoCall => '音声通話'; + + @override + String get visibilityOfTheChatHistory => 'チャット履歴の表示'; + + @override + String get visibleForAllParticipants => 'すべての参加者が閲覧可能'; + + @override + String get visibleForEveryone => 'すべての人が閲覧可能'; + + @override + String get voiceMessage => 'ボイスメッセージ'; + + @override + String get waitingPartnerAcceptRequest => 'パートナーのリクエスト承諾待ちです...'; + + @override + String get waitingPartnerEmoji => 'パートナーの絵文字承諾待ちです...'; + + @override + String get waitingPartnerNumbers => 'パートナーの数字承諾待ちです…'; + + @override + String get wallpaper => '壁紙'; + + @override + String get warning => '警告!'; + + @override + String get weSentYouAnEmail => 'あなたにメールを送信しました'; + + @override + String get whoCanPerformWhichAction => '誰がどの操作を実行できるか'; + + @override + String get whoIsAllowedToJoinThisGroup => '誰がこのチャットに入れますか'; + + @override + String get whyDoYouWantToReportThis => 'これを通報する理由'; + + @override + String get wipeChatBackup => 'チャットのバックアップを消去して、新しいリカバリーキーを作りますか?'; + + @override + String get withTheseAddressesRecoveryDescription => + 'これらのアドレスを使用すると、パスワードを回復することができます。'; + + @override + String get writeAMessage => 'メッセージを入力してください…'; + + @override + String get yes => 'はい'; + + @override + String get you => 'あなた'; + + @override + String get youAreNoLongerParticipatingInThisChat => 'あなたはもうこのチャットの参加者ではありません'; + + @override + String get youHaveBeenBannedFromThisChat => 'チャットからBANされてしまいました'; + + @override + String get yourPublicKey => 'あなたの公開鍵'; + + @override + String get messageInfo => 'メッセージの情報'; + + @override + String get time => '時間'; + + @override + String get messageType => 'メッセージの種類'; + + @override + String get sender => '送信者'; + + @override + String get openGallery => 'ギャラリーを開く'; + + @override + String get removeFromSpace => 'スペースから削除'; + + @override + String get addToSpaceDescription => 'このチャットを追加するスペースを選択してください。'; + + @override + String get start => '開始'; + + @override + String get pleaseEnterRecoveryKeyDescription => + '古いメッセージを解除するには、以前のセッションで生成されたリカバリーキーを入力してください。リカバリーキーはパスワードではありません。'; + + @override + String get publish => '公開'; + + @override + String videoWithSize(String size) { + return 'ビデオ ($size)'; + } + + @override + String get openChat => 'チャットを開く'; + + @override + String get markAsRead => '既読にする'; + + @override + String get reportUser => 'ユーザーを報告'; + + @override + String get dismiss => 'Dismiss'; + + @override + String reactedWith(String sender, String reaction) { + return '$sender が $reaction で反応しました'; + } + + @override + String get pinMessage => '部屋にピン留めする'; + + @override + String get confirmEventUnpin => 'イベントの固定を完全に解除してもよろしいですか?'; + + @override + String get emojis => '絵文字'; + + @override + String get placeCall => '電話をかける'; + + @override + String get voiceCall => '音声通話'; + + @override + String get unsupportedAndroidVersion => 'サポートされていないAndroidのバージョン'; + + @override + String get unsupportedAndroidVersionLong => + 'この機能を利用するには、より新しいAndroidのバージョンが必要です。アップデートまたはLineage OSのサポートをご確認ください。'; + + @override + String get videoCallsBetaWarning => + 'ビデオ通話は、現在ベータ版であることにご注意ください。すべてのプラットフォームで期待通りに動作しない、あるいはまったく動作しない可能性があります。'; + + @override + String get experimentalVideoCalls => '実験的なビデオ通話'; + + @override + String get emailOrUsername => 'メールアドレスまたはユーザー名'; + + @override + String get indexedDbErrorTitle => 'プライベートモードに関する問題'; + + @override + String get indexedDbErrorLong => + 'The message storage is unfortunately not enabled in private mode by default.\nPlease visit\n - about:config\n - set dom.indexedDB.privateBrowsing.enabled to true\nOtherwise, it is not possible to run Extera.'; + + @override + String switchToAccount(String number) { + return 'アカウント $number に切り替える'; + } + + @override + String get nextAccount => '次のアカウント'; + + @override + String get previousAccount => '前のアカウント'; + + @override + String get addWidget => 'ウィジェットを追加'; + + @override + String get widgetVideo => '動画'; + + @override + String get widgetEtherpad => 'Text note'; + + @override + String get widgetJitsi => 'Jitsi Meet'; + + @override + String get widgetCustom => 'カスタム'; + + @override + String get widgetName => '名称'; + + @override + String get widgetUrlError => '有効なURLではありません。'; + + @override + String get widgetNameError => '表示名を入力してください。'; + + @override + String get errorAddingWidget => 'ウィジェットの追加中にエラーが発生しました。'; + + @override + String get youRejectedTheInvitation => '招待を拒否しました'; + + @override + String get youJoinedTheChat => 'チャットに参加しました'; + + @override + String get youAcceptedTheInvitation => '👍 招待を承諾しました'; + + @override + String youBannedUser(String user) { + return '$user を禁止しました'; + } + + @override + String youHaveWithdrawnTheInvitationFor(String user) { + return '$user への招待を取り下げました'; + } + + @override + String youInvitedToBy(String alias) { + return '📩 You have been invited via link to:\n$alias'; + } + + @override + String youInvitedBy(String user) { + return '📩 $user から招待されました'; + } + + @override + String invitedBy(String user) { + return '📩 Invited by $user'; + } + + @override + String youInvitedUser(String user) { + return '📩 $user を招待しました'; + } + + @override + String youKicked(String user) { + return '👞 $user をキックしました'; + } + + @override + String youKickedAndBanned(String user) { + return '🙅 $user をキックしてブロックしました'; + } + + @override + String youUnbannedUser(String user) { + return '$user の禁止を解除しました'; + } + + @override + String hasKnocked(String user) { + return '🚪 $user has knocked'; + } + + @override + String get usersMustKnock => 'Users must knock'; + + @override + String get noOneCanJoin => 'No one can join'; + + @override + String userWouldLikeToChangeTheChat(String user) { + return '$user would like to join the chat.'; + } + + @override + String get noPublicLinkHasBeenCreatedYet => + 'No public link has been created yet'; + + @override + String get knock => 'Knock'; + + @override + String get users => 'ユーザー'; + + @override + String get unlockOldMessages => '古いメッセージのロックを解除する'; + + @override + String get storeInSecureStorageDescription => 'このデバイスの安全なストレージにリカバリーキーを保存。'; + + @override + String get saveKeyManuallyDescription => + 'Save this key manually by triggering the system share dialog or clipboard.'; + + @override + String get storeInAndroidKeystore => 'Android KeyStoreに保存する'; + + @override + String get storeInAppleKeyChain => 'Apple KeyChainに保存'; + + @override + String get storeSecurlyOnThisDevice => 'このデバイスに安全に保管する'; + + @override + String countFiles(int count) { + return '$count個のファイル'; + } + + @override + String get user => 'ユーザー'; + + @override + String get custom => 'カスタム'; + + @override + String get foregroundServiceRunning => 'この通知は、フォアグラウンド サービスの実行中に表示されます。'; + + @override + String get screenSharingTitle => '画面共有'; + + @override + String get screenSharingDetail => 'FuffyChatで画面を共有しています'; + + @override + String get callingPermissions => '通話の権限'; + + @override + String get callingAccount => '通話アカウント'; + + @override + String get callingAccountDetails => + 'Allows Extera to use the native android dialer app.'; + + @override + String get appearOnTop => 'Appear on top'; + + @override + String get appearOnTopDetails => + 'アプリをトップに表示できるようにする(すでに通話アカウントとしてFluffychatを設定している場合は必要ありません)'; + + @override + String get otherCallingPermissions => 'マイク、カメラ、その他FluffyChatの権限'; + + @override + String get whyIsThisMessageEncrypted => 'このメッセージが読めない理由'; + + @override + String get noKeyForThisMessage => + 'This can happen if the message was sent before you have signed in to your account at this device.\n\nIt is also possible that the sender has blocked your device or something went wrong with the internet connection.\n\nAre you able to read the message on another session? Then you can transfer the message from it! Go to Settings > Devices and make sure that your devices have verified each other. When you open the room the next time and both sessions are in the foreground, the keys will be transmitted automatically.\n\nDo you not want to lose the keys when logging out or switching devices? Make sure that you have enabled the chat backup in the settings.'; + + @override + String get newGroup => '新しいグループ'; + + @override + String get newSpace => '新しいスペース'; + + @override + String get enterSpace => 'スペースに入る'; + + @override + String get enterRoom => '部屋に入る'; + + @override + String get allSpaces => 'すべてのスペース'; + + @override + String numChats(String number) { + return '$number チャット'; + } + + @override + String get hideUnimportantStateEvents => '重要でない状態イベントを非表示にする'; + + @override + String get hidePresences => 'Hide Status List?'; + + @override + String get doNotShowAgain => '今後表示しない'; + + @override + String wasDirectChatDisplayName(String oldDisplayName) { + return '空のチャット (以前は $oldDisplayName)'; + } + + @override + String get newSpaceDescription => + 'Spaces allows you to consolidate your chats and build private or public communities.'; + + @override + String get encryptThisChat => 'このチャットを暗号化する'; + + @override + String get disableEncryptionWarning => + 'セキュリティ上の理由から、以前は暗号化が有効だったチャットで暗号化を無効にすることはできません。'; + + @override + String get sorryThatsNotPossible => '申し訳ありません...それは不可能です'; + + @override + String get deviceKeys => 'デバイスキー:'; + + @override + String get reopenChat => 'チャットを再開する'; + + @override + String get noBackupWarning => + '警告!チャットのバックアップを有効にしないと、暗号化されたメッセージにアクセスできなくなります。ログアウトする前に、まずチャットのバックアップを有効にすることを強くお勧めします。'; + + @override + String get noOtherDevicesFound => '他のデバイスが見つかりません'; + + @override + String fileIsTooBigForServer(String max) { + return 'Unable to send! The server only supports attachments up to $max.'; + } + + @override + String fileHasBeenSavedAt(String path) { + return 'File has been saved at $path'; + } + + @override + String get jumpToLastReadMessage => 'Jump to last read message'; + + @override + String get readUpToHere => 'Read up to here'; + + @override + String get jump => 'Jump'; + + @override + String get openLinkInBrowser => 'Open link in browser'; + + @override + String get reportErrorDescription => + '😭 Oh no. Something went wrong. If you want, you can report this bug to the developers.'; + + @override + String get report => 'Report'; + + @override + String get signInWithPassword => 'パスワードでログイン'; + + @override + String get pleaseTryAgainLaterOrChooseDifferentServer => + 'Please try again later or choose a different server.'; + + @override + String signInWith(String provider) { + return '$providerでログイン'; + } + + @override + String get profileNotFound => + 'The user could not be found on the server. Maybe there is a connection problem or the user doesn\'t exist.'; + + @override + String get setTheme => 'Set theme:'; + + @override + String get setColorTheme => 'Set color theme:'; + + @override + String get invite => 'Invite'; + + @override + String get inviteGroupChat => '📨 Invite group chat'; + + @override + String get invitePrivateChat => '📨 Invite private chat'; + + @override + String get invalidInput => 'Invalid input!'; + + @override + String wrongPinEntered(int seconds) { + return 'Wrong pin entered! Try again in $seconds seconds...'; + } + + @override + String get pleaseEnterANumber => 'Please enter a number greater than 0'; + + @override + String get archiveRoomDescription => + 'The chat will be moved to the archive. Other users will be able to see that you have left the chat.'; + + @override + String get roomUpgradeDescription => + 'The chat will then be recreated with the new room version. All participants will be notified that they need to switch to the new chat. You can find out more about room versions at https://spec.matrix.org/latest/rooms/'; + + @override + String get removeDevicesDescription => + 'You will be logged out of this device and will no longer be able to receive messages.'; + + @override + String get banUserDescription => + 'The user will be banned from the chat and will not be able to enter the chat again until they are unbanned.'; + + @override + String get unbanUserDescription => + 'The user will be able to enter the chat again if they try.'; + + @override + String get kickUserDescription => + 'The user is kicked out of the chat but not banned. In public chats, the user can rejoin at any time.'; + + @override + String get makeAdminDescription => + 'Once you make this user admin, you may not be able to undo this as they will then have the same permissions as you.'; + + @override + String get pushNotificationsNotAvailable => + 'Push notifications not available'; + + @override + String get learnMore => 'Learn more'; + + @override + String get yourGlobalUserIdIs => 'Your global user-ID is: '; + + @override + String noUsersFoundWithQuery(String query) { + return 'Unfortunately no user could be found with \"$query\". Please check whether you made a typo.'; + } + + @override + String get knocking => 'Knocking'; + + @override + String chatCanBeDiscoveredViaSearchOnServer(String server) { + return 'Chat can be discovered via the search on $server'; + } + + @override + String get searchChatsRooms => 'Search for #chats, @users...'; + + @override + String get nothingFound => 'Nothing found...'; + + @override + String get groupName => 'Group name'; + + @override + String get createGroupAndInviteUsers => 'Create a group and invite users'; + + @override + String get groupCanBeFoundViaSearch => 'Group can be found via search'; + + @override + String get wrongRecoveryKey => + 'Sorry... this does not seem to be the correct recovery key.'; + + @override + String get startConversation => 'Start conversation'; + + @override + String get commandHint_sendraw => 'Send raw json'; + + @override + String get databaseMigrationTitle => 'Database is optimized'; + + @override + String get databaseMigrationBody => 'Please wait. This may take a moment.'; + + @override + String get leaveEmptyToClearStatus => 'Leave empty to clear your status.'; + + @override + String get select => 'Select'; + + @override + String get searchForUsers => 'Search for @users...'; + + @override + String get pleaseEnterYourCurrentPassword => + 'Please enter your current password'; + + @override + String get newPassword => 'New password'; + + @override + String get pleaseChooseAStrongPassword => 'Please choose a strong password'; + + @override + String get passwordsDoNotMatch => 'Passwords do not match'; + + @override + String get passwordIsWrong => 'Your entered password is wrong'; + + @override + String get publicLink => 'Public link'; + + @override + String get publicChatAddresses => 'Public chat addresses'; + + @override + String get createNewAddress => 'Create new address'; + + @override + String get joinSpace => 'Join space'; + + @override + String get publicSpaces => 'Public spaces'; + + @override + String get addChatOrSubSpace => 'Add chat or sub space'; + + @override + String get subspace => 'Subspace'; + + @override + String get decline => 'Decline'; + + @override + String get thisDevice => 'This device:'; + + @override + String get initAppError => 'An error occured while init the app'; + + @override + String get userRole => 'User role'; + + @override + String minimumPowerLevel(String level) { + return '$level is the minimum power level.'; + } + + @override + String searchIn(String chat) { + return 'Search in chat \"$chat\"...'; + } + + @override + String get searchMore => 'Search more...'; + + @override + String get gallery => 'Gallery'; + + @override + String get files => 'Files'; + + @override + String databaseBuildErrorBody(String url, String error) { + return 'Unable to build the SQlite database. The app tries to use the legacy database for now. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String sessionLostBody(String url, String error) { + return 'Your session is lost. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String restoreSessionBody(String url, String error) { + return 'The app now tries to restore your session from the backup. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String forwardMessageTo(String roomName) { + return 'Forward message to $roomName?'; + } + + @override + String get sendReadReceipts => 'Send read receipts'; + + @override + String get sendTypingNotificationsDescription => + 'Other participants in a chat can see when you are typing a new message.'; + + @override + String get sendReadReceiptsDescription => + 'Other participants in a chat can see when you have read a message.'; + + @override + String get formattedMessages => 'Formatted messages'; + + @override + String get formattedMessagesDescription => + 'Display rich message content like bold text using markdown.'; + + @override + String get verifyOtherUser => '🔐 Verify other user'; + + @override + String get verifyOtherUserDescription => + 'If you verify another user, you can be sure that you know who you are really writing to. 💪\n\nWhen you start a verification, you and the other user will see a popup in the app. There you will then see a series of emojis or numbers that you have to compare with each other.\n\nThe best way to do this is to meet up or start a video call. 👭'; + + @override + String get verifyOtherDevice => '🔐 Verify other device'; + + @override + String get verifyOtherDeviceDescription => + 'When you verify another device, those devices can exchange keys, increasing your overall security. 💪 When you start a verification, a popup will appear in the app on both devices. There you will then see a series of emojis or numbers that you have to compare with each other. It\'s best to have both devices handy before you start the verification. 🤳'; + + @override + String acceptedKeyVerification(String sender) { + return '$sender accepted key verification'; + } + + @override + String canceledKeyVerification(String sender) { + return '$sender canceled key verification'; + } + + @override + String completedKeyVerification(String sender) { + return '$sender completed key verification'; + } + + @override + String isReadyForKeyVerification(String sender) { + return '$sender is ready for key verification'; + } + + @override + String requestedKeyVerification(String sender) { + return '$sender requested key verification'; + } + + @override + String startedKeyVerification(String sender) { + return '$sender started key verification'; + } + + @override + String get transparent => 'Transparent'; + + @override + String get incomingMessages => 'Incoming messages'; + + @override + String get stickers => 'Stickers'; + + @override + String get discover => 'Discover'; + + @override + String get commandHint_ignore => 'Ignore the given matrix ID'; + + @override + String get commandHint_unignore => 'Unignore the given matrix ID'; + + @override + String unreadChatsInApp(String appname, String unread) { + return '$appname: $unread unread chats'; + } + + @override + String get noDatabaseEncryption => + 'Database encryption is not supported on this platform'; + + @override + String thereAreCountUsersBlocked(Object count) { + return 'Right now there are $count users blocked.'; + } + + @override + String get restricted => 'Restricted'; + + @override + String get knockRestricted => 'Knock restricted'; + + @override + String goToSpace(Object space) { + return 'Go to space: $space'; + } + + @override + String get markAsUnread => 'Mark as unread'; + + @override + String userLevel(int level) { + return '$level - User'; + } + + @override + String moderatorLevel(int level) { + return '$level - Moderator'; + } + + @override + String adminLevel(int level) { + return '$level - Admin'; + } + + @override + String get changeGeneralChatSettings => 'Change general chat settings'; + + @override + String get inviteOtherUsers => 'Invite other users to this chat'; + + @override + String get changeTheChatPermissions => 'Change the chat permissions'; + + @override + String get changeTheVisibilityOfChatHistory => + 'Change the visibility of the chat history'; + + @override + String get changeTheCanonicalRoomAlias => + 'Change the main public chat address'; + + @override + String get sendRoomNotifications => 'Send a @room notifications'; + + @override + String get changeTheDescriptionOfTheGroup => + 'Change the description of the chat'; + + @override + String get chatPermissionsDescription => + 'Define which power level is necessary for certain actions in this chat. The power levels 0, 50 and 100 are usually representing users, moderators and admins, but any gradation is possible.'; + + @override + String updateInstalled(String version) { + return '🎉 Update $version installed!'; + } + + @override + String get changelog => 'Changelog'; + + @override + String get sendCanceled => 'Sending canceled'; + + @override + String get loginWithMatrixId => 'Login with Matrix-ID'; + + @override + String get discoverHomeservers => 'Discover homeservers'; + + @override + String get whatIsAHomeserver => 'What is a homeserver?'; + + @override + String get homeserverDescription => + 'All your data is stored on the homeserver, just like an email provider. You can choose which homeserver you want to use, while you can still communicate with everyone. Learn more at at https://matrix.org.'; + + @override + String get doesNotSeemToBeAValidHomeserver => + 'Doesn\'t seem to be a compatible homeserver. Wrong URL?'; + + @override + String get calculatingFileSize => 'Calculating file size...'; + + @override + String get prepareSendingAttachment => 'Prepare sending attachment...'; + + @override + String get sendingAttachment => 'Sending attachment...'; + + @override + String get generatingVideoThumbnail => 'Generating video thumbnail...'; + + @override + String get compressVideo => 'Compressing video...'; + + @override + String sendingAttachmentCountOfCount(int index, int length) { + return 'Sending attachment $index of $length...'; + } + + @override + String serverLimitReached(int seconds) { + return 'Server limit reached! Waiting $seconds seconds...'; + } + + @override + String get oneOfYourDevicesIsNotVerified => + 'One of your devices is not verified'; + + @override + String get noticeChatBackupDeviceVerification => + 'Note: When you connect all your devices to the chat backup, they are automatically verified.'; + + @override + String get continueText => 'Continue'; + + @override + String get welcomeText => + 'Hey Hey 👋 This is Extera. You can sign in to any homeserver, which is compatible with https://matrix.org. And then chat with anyone. It\'s a huge decentralized messaging network!'; + + @override + String get blur => 'Blur:'; + + @override + String get opacity => 'Opacity:'; + + @override + String get setWallpaper => 'Set wallpaper'; + + @override + String get manageAccount => 'Manage account'; + + @override + String get noContactInformationProvided => + 'Server does not provide any valid contact information'; + + @override + String get contactServerAdmin => 'Contact server admin'; + + @override + String get contactServerSecurity => 'Contact server security'; + + @override + String get supportPage => 'Support page'; + + @override + String get serverInformation => 'Server information:'; + + @override + String get name => 'Name'; + + @override + String get version => 'Version'; + + @override + String get website => 'Website'; + + @override + String get compress => 'Compress'; + + @override + String get boldText => 'Bold text'; + + @override + String get italicText => 'Italic text'; + + @override + String get strikeThrough => 'Strikethrough'; + + @override + String get pleaseFillOut => 'Please fill out'; + + @override + String get invalidUrl => 'Invalid url'; + + @override + String get addLink => 'Add link'; + + @override + String get unableToJoinChat => + 'Unable to join chat. Maybe the other party has already closed the conversation.'; + + @override + String get previous => 'Previous'; + + @override + String get otherPartyNotLoggedIn => + 'The other party is currently not logged in and therefore cannot receive messages!'; + + @override + String appWantsToUseForLogin(String server) { + return 'Use \'$server\' to log in'; + } + + @override + String get appWantsToUseForLoginDescription => + 'You hereby allow the app and website to share information about you.'; + + @override + String get open => 'Open'; + + @override + String get waitingForServer => 'Waiting for server...'; + + @override + String get appIntroduction => + 'Extera lets you chat with your friends across different messengers. Learn more at https://matrix.org or just tap *Continue*.'; + + @override + String get newChatRequest => '📩 New chat request'; + + @override + String get contentNotificationSettings => 'Content notification settings'; + + @override + String get generalNotificationSettings => 'General notification settings'; + + @override + String get roomNotificationSettings => 'Room notification settings'; + + @override + String get userSpecificNotificationSettings => + 'User specific notification settings'; + + @override + String get otherNotificationSettings => 'Other notification settings'; + + @override + String get notificationRuleContainsUserName => 'Contains User Name'; + + @override + String get notificationRuleContainsUserNameDescription => + 'Notifies the user when a message contains their username.'; + + @override + String get notificationRuleMaster => 'Mute all notifications'; + + @override + String get notificationRuleMasterDescription => + 'Overrides all other rules and disables all notifications.'; + + @override + String get notificationRuleSuppressNotices => 'Suppress Automated Messages'; + + @override + String get notificationRuleSuppressNoticesDescription => + 'Suppresses notifications from automated clients like bots.'; + + @override + String get notificationRuleInviteForMe => 'Invite for Me'; + + @override + String get notificationRuleInviteForMeDescription => + 'Notifies the user when they are invited to a room.'; + + @override + String get notificationRuleMemberEvent => 'Member Event'; + + @override + String get notificationRuleMemberEventDescription => + 'Suppresses notifications for membership events.'; + + @override + String get notificationRuleIsUserMention => 'User Mention'; + + @override + String get notificationRuleIsUserMentionDescription => + 'Notifies the user when they are directly mentioned in a message.'; + + @override + String get notificationRuleContainsDisplayName => 'Contains Display Name'; + + @override + String get notificationRuleContainsDisplayNameDescription => + 'Notifies the user when a message contains their display name.'; + + @override + String get notificationRuleIsRoomMention => 'Room Mention'; + + @override + String get notificationRuleIsRoomMentionDescription => + 'Notifies the user when there is a room mention.'; + + @override + String get notificationRuleRoomnotif => 'Room Notification'; + + @override + String get notificationRuleRoomnotifDescription => + 'Notifies the user when a message contains \'@room\'.'; + + @override + String get notificationRuleTombstone => 'Tombstone'; + + @override + String get notificationRuleTombstoneDescription => + 'Notifies the user about room deactivation messages.'; + + @override + String get notificationRuleReaction => 'Reaction'; + + @override + String get notificationRuleReactionDescription => + 'Suppresses notifications for reactions.'; + + @override + String get notificationRuleRoomServerAcl => 'Room Server ACL'; + + @override + String get notificationRuleRoomServerAclDescription => + 'Suppresses notifications for room server access control lists (ACL).'; + + @override + String get notificationRuleSuppressEdits => 'Suppress Edits'; + + @override + String get notificationRuleSuppressEditsDescription => + 'Suppresses notifications for edited messages.'; + + @override + String get notificationRuleCall => 'Call'; + + @override + String get notificationRuleCallDescription => + 'Notifies the user about calls.'; + + @override + String get notificationRuleEncryptedRoomOneToOne => + 'Encrypted Room One-to-One'; + + @override + String get notificationRuleEncryptedRoomOneToOneDescription => + 'Notifies the user about messages in encrypted one-to-one rooms.'; + + @override + String get notificationRuleRoomOneToOne => 'Room One-to-One'; + + @override + String get notificationRuleRoomOneToOneDescription => + 'Notifies the user about messages in one-to-one rooms.'; + + @override + String get notificationRuleMessage => 'Message'; + + @override + String get notificationRuleMessageDescription => + 'Notifies the user about general messages.'; + + @override + String get notificationRuleEncrypted => 'Encrypted'; + + @override + String get notificationRuleEncryptedDescription => + 'Notifies the user about messages in encrypted rooms.'; + + @override + String get notificationRuleJitsi => 'Jitsi'; + + @override + String get notificationRuleJitsiDescription => + 'Notifies the user about Jitsi widget events.'; + + @override + String get notificationRuleServerAcl => 'Suppress Server ACL Events'; + + @override + String get notificationRuleServerAclDescription => + 'Suppresses notifications for Server ACL events.'; + + @override + String unknownPushRule(String rule) { + return 'Unknown push rule \'$rule\''; + } + + @override + String get deletePushRuleCanNotBeUndone => + 'If you delete this notification setting, this can not be undone.'; + + @override + String get more => 'More'; + + @override + String get shareKeysWith => 'Share keys with...'; + + @override + String get shareKeysWithDescription => + 'Which devices should be trusted so that they can read along your messages in encrypted chats?'; + + @override + String get allDevices => 'All devices'; + + @override + String get crossVerifiedDevicesIfEnabled => + 'Cross verified devices if enabled'; + + @override + String get crossVerifiedDevices => 'Cross verified devices'; + + @override + String get verifiedDevicesOnly => 'Verified devices only'; + + @override + String get takeAPhoto => 'Take a photo'; + + @override + String get recordAVideo => 'Record a video'; + + @override + String get optionalMessage => '(Optional) message...'; + + @override + String get notSupportedOnThisDevice => 'Not supported on this device'; + + @override + String get enterNewChat => 'Enter new chat'; + + @override + String get approve => 'Approve'; + + @override + String get youHaveKnocked => 'You have knocked'; + + @override + String get pleaseWaitUntilInvited => + 'Please wait now, until someone from the room invites you.'; +} diff --git a/lib/generated/l10n/l10n_ka.dart b/lib/generated/l10n/l10n_ka.dart new file mode 100644 index 0000000..290b724 --- /dev/null +++ b/lib/generated/l10n/l10n_ka.dart @@ -0,0 +1,2747 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'l10n.dart'; + +// ignore_for_file: type=lint + +/// The translations for Georgian (`ka`). +class L10nKa extends L10n { + L10nKa([String locale = 'ka']) : super(locale); + + @override + String get noSendPermission => 'You can\'t send messages here'; + + @override + String get alwaysUse24HourFormat => 'false'; + + @override + String get repeatPassword => 'გაიმეორეთ პაროლი'; + + @override + String get notAnImage => 'ფაილი არაა სურათი.'; + + @override + String get setCustomPermissionLevel => 'Set custom permission level'; + + @override + String get setPermissionsLevelDescription => + 'Please choose a predefined role below or enter a custom permission level between 0 and 100.'; + + @override + String get ignoreUser => 'Ignore user'; + + @override + String get normalUser => 'Normal user'; + + @override + String get remove => 'წაშლა'; + + @override + String get importNow => 'იმპორტი'; + + @override + String get importEmojis => 'ემოჯის იმპორტი'; + + @override + String get importFromZipFile => 'იმპორტი .zip ფაილიდან'; + + @override + String get exportEmotePack => 'ემოციების .zip ფაილში ექსპორტი'; + + @override + String get replace => 'ჩანაცვლება'; + + @override + String get about => 'შესახებ'; + + @override + String aboutHomeserver(String homeserver) { + return 'About $homeserver'; + } + + @override + String get accept => 'თანხმობა'; + + @override + String acceptedTheInvitation(String username) { + return '👍 $username მიიღო მოწვევა'; + } + + @override + String get account => 'ანგარიში'; + + @override + String activatedEndToEndEncryption(String username) { + return '🔐 $username გააქტიურა end to end დაშიფვრა'; + } + + @override + String get addEmail => 'ელ.ფოსტის დამატება'; + + @override + String get confirmMatrixId => + 'გთხოვთ, დაადასტუროთ თქვენი Matrix ID ანგარიშის წაშლისათვის.'; + + @override + String supposedMxid(String mxid) { + return 'ეს უნდა იყოს $mxid'; + } + + @override + String get addChatDescription => 'ჩატის აღწერილობის დამატება...'; + + @override + String get addToSpace => 'სივრცეში დამატება'; + + @override + String get admin => 'ადმინი'; + + @override + String get alias => 'მეტსახელი'; + + @override + String get all => 'ყველა'; + + @override + String get allChats => 'ყველა ჩატი'; + + @override + String get commandHint_roomupgrade => + 'Upgrade this room to the given room version'; + + @override + String get commandHint_googly => 'გამოშტერილი თვალების გაგზავნა'; + + @override + String get commandHint_cuddle => 'ჩახუტების გაგზავნა'; + + @override + String get commandHint_hug => 'მეგობრული ჩახუტვის გაგზავნა'; + + @override + String googlyEyesContent(String senderName) { + return '$senderName გამოშტერილ თვალებს გიგზავნის'; + } + + @override + String cuddleContent(String senderName) { + return '$senderName გეხუტება'; + } + + @override + String hugContent(String senderName) { + return '$senderName მეგობრულად გეხუტება'; + } + + @override + String answeredTheCall(String senderName) { + return '$senderName უპასუხა ზარს'; + } + + @override + String get anyoneCanJoin => 'ყველას შეუძლია გაწევრიანება'; + + @override + String get appLock => 'აპლიკაციის ბლოკირება'; + + @override + String get appLockDescription => + 'პინკოდის გამოყენების გარეშე აპლიკაციის ბლოკირება'; + + @override + String get archive => 'არქივი'; + + @override + String get areGuestsAllowedToJoin => + 'შეუძლიათ თუ არა სტუმარ მომხმარებლებს გაწევრიანება'; + + @override + String get areYouSure => 'დარწმუნებული ხართ?'; + + @override + String get areYouSureYouWantToLogout => + 'დარწმუნებული ხართ, რომ გამოსვლა გსურთ?'; + + @override + String get askSSSSSign => + 'სხვა მომხმარებლის დადასტურებლად, გთხოვთ, ჩაწეროთ თქვენი ან საიდუმლო ფრაზა, ან აღდგენის გასაღები.'; + + @override + String askVerificationRequest(String username) { + return 'მიიღებთ $username დადასტურების მოთხოვნას?'; + } + + @override + String get autoplayImages => + 'ანიმირებული სტიკერებისა და ემოჯების ავტომატური ჩართვა'; + + @override + String badServerLoginTypesException(String serverVersions, + String supportedVersions, Object suportedVersions) { + return 'ამ სერვერს აქვს შესვლის მეთოდების მხარდაჭერა:\n$serverVersions\nმაგრამ ამ აპლიკაციას აქვს მხარდაჭერა მხოლოდ:\n$supportedVersions'; + } + + @override + String get sendTypingNotifications => 'წერის შეტყობინების გაგზავნა'; + + @override + String get swipeRightToLeftToReply => 'Swipe right to left to reply'; + + @override + String get sendOnEnter => 'გაგზავნა enter-ის დაჭერისას'; + + @override + String badServerVersionsException(String serverVersions, + String supportedVersions, Object serverVerions, Object suportedVersions) { + return 'The homeserver supports the Spec versions:\n$serverVersions\nBut this app supports only $supportedVersions'; + } + + @override + String countChatsAndCountParticipants(int chats, int participants) { + return '$chats chats and $participants participants'; + } + + @override + String get noMoreChatsFound => 'No more chats found...'; + + @override + String get noChatsFoundHere => + 'No chats found here yet. Start a new chat with someone by using the button below. ⤵️'; + + @override + String get joinedChats => 'Joined chats'; + + @override + String get unread => 'Unread'; + + @override + String get space => 'Space'; + + @override + String get spaces => 'Spaces'; + + @override + String get banFromChat => 'ჩატიდან გაგდება და ბლოკირება'; + + @override + String get banned => 'დაბლოკილია'; + + @override + String bannedUser(String username, String targetName) { + return '$username დაბლოკა $targetName'; + } + + @override + String get blockDevice => 'მოწყობილების ბლოკირება'; + + @override + String get blocked => 'დაბლოკილია'; + + @override + String get botMessages => 'ბოტის შეტყობინებები'; + + @override + String get cancel => 'გაუქმება'; + + @override + String cantOpenUri(String uri) { + return 'ვერ იხსნება ბმული $uri'; + } + + @override + String get changeDeviceName => 'მოწყობილების გადარქმევა'; + + @override + String changedTheChatAvatar(String username) { + return '$username ჩატის ფოტო შეცვალა'; + } + + @override + String changedTheChatDescriptionTo(String username, String description) { + return '$username ჩატის ახალი აღწერილობა დააყენა: \'$description\''; + } + + @override + String changedTheChatNameTo(String username, String chatname) { + return '$username ჩატი გადაარქვა: \'$chatname\''; + } + + @override + String changedTheChatPermissions(String username) { + return '$username ჩატის უფლებები შეცვალა'; + } + + @override + String changedTheDisplaynameTo(String username, String displayname) { + return '$username შეცვალა ნაჩვენები სახელი: \'$displayname\''; + } + + @override + String changedTheGuestAccessRules(String username) { + return '$username შეცვალა სტუმრების წვდომის წესები'; + } + + @override + String changedTheGuestAccessRulesTo(String username, String rules) { + return '$username შეცვალა სტუმრების წვდომის წესები: $rules'; + } + + @override + String changedTheHistoryVisibility(String username) { + return '$username შეცვალა ისტორიის ხილვადობა'; + } + + @override + String changedTheHistoryVisibilityTo(String username, String rules) { + return '$username შეცვალა ისტორიის ხილვადობა: $rules'; + } + + @override + String changedTheJoinRules(String username) { + return '$username გაწევრიანების წესები შეცვალა'; + } + + @override + String changedTheJoinRulesTo(String username, String joinRules) { + return '$username გაწევრიანების წესები შეცვალა: $joinRules'; + } + + @override + String changedTheProfileAvatar(String username) { + return '$username შეცვალა პროფილის ფოტო'; + } + + @override + String changedTheRoomAliases(String username) { + return '$username ოთახის მეტსახელები შეცვალა'; + } + + @override + String changedTheRoomInvitationLink(String username) { + return '$username მოწვევის ბმული შეცვალა'; + } + + @override + String get changePassword => 'პაროლის შეცვლა'; + + @override + String get changeTheHomeserver => 'სახლის სერვერის შეცვლა'; + + @override + String get changeTheme => 'სტილის შეცვლა'; + + @override + String get changeTheNameOfTheGroup => 'ჯგუფის გადარქმევა'; + + @override + String get changeYourAvatar => 'პროფილის ფოტოს შეცვლა'; + + @override + String get channelCorruptedDecryptError => 'დაშიფვრა დაზიანდა'; + + @override + String get chat => 'ჩატი'; + + @override + String get yourChatBackupHasBeenSetUp => + 'თქვენი ჩატის სარეზერვო საშუალება კონფიგურირებული იქნა.'; + + @override + String get chatBackup => 'ჩატის სარეზერვო საშუალება'; + + @override + String get chatBackupDescription => + 'თქვენი ძველი შეტყობინებები დაცულია აღდგების გასაღებით. არ დაკარგოთ ის.'; + + @override + String get chatDetails => 'ჩატის დეტალები'; + + @override + String get chatHasBeenAddedToThisSpace => 'ჩატი დაემატა ამ სივრცეს'; + + @override + String get chats => 'ჩატები'; + + @override + String get chooseAStrongPassword => 'ძლიერი პაროლი აარჩიეთ'; + + @override + String get clearArchive => 'არქივის გაწმენდა'; + + @override + String get close => 'დახურვა'; + + @override + String get commandHint_markasdm => + 'Mark as direct message room for the giving Matrix ID'; + + @override + String get commandHint_markasgroup => 'აღნიშვნა, როგორც ჯგუფის'; + + @override + String get commandHint_ban => 'მოცემული მომხმარებლის ბლოკირება ამ ოთახში'; + + @override + String get commandHint_clearcache => '­ქეშის გაწმენდა'; + + @override + String get commandHint_create => + 'ცარიელი ჯგუფური ჩატის შექმნა\nგამოიყენეთ --no-encryption გაშიფვრის გასათიშად'; + + @override + String get commandHint_discardsession => 'სესიის გაუქმება'; + + @override + String get commandHint_dm => + 'პირდაპირი ჩატის დაწყება\nგამოიყენეთ --no-encryption გაშიფვრის გასათიშად'; + + @override + String get commandHint_html => 'HTML ფორმატირებული ტექსტის გაგზავნა'; + + @override + String get commandHint_invite => 'მოცემული მომხმარებლის მოწვევა ამ ოთახში'; + + @override + String get commandHint_join => 'მოცემულ ოთახში გაწევრიანება'; + + @override + String get commandHint_kick => 'მოცემული მომხმარებლის წაშლა ამ ოთახიდან'; + + @override + String get commandHint_leave => 'ამ ოთახიდან გასვლა'; + + @override + String get commandHint_me => 'აღწერეთ თქვენი თავი'; + + @override + String get commandHint_myroomavatar => + 'თქვენი ფოტოს დაყენება ამ ოთახისათვის(mxc-uri-ს დახმარებით)'; + + @override + String get commandHint_myroomnick => + 'ამ ოთახისათვის ნაჩვენები სახელის დაყენება'; + + @override + String get commandHint_op => + 'მოცემული მომხმარებლისათვის უფლებების დონის დაყენება (ჩვეულებრივ: 50)'; + + @override + String get commandHint_plain => 'არაფორმატირებული ტექსტის გაგზავნა'; + + @override + String get commandHint_react => 'რეაქციის სახით პასუხის გაგზავნა'; + + @override + String get commandHint_send => 'ტექსტის გაგზავნა'; + + @override + String get commandHint_unban => 'ამ ოთახში მომხმარებლისგან ბლოკის მოხსნა'; + + @override + String get commandInvalid => 'არასწორი ბრძანება'; + + @override + String commandMissing(String command) { + return '$command არაა ბრძანება.'; + } + + @override + String get compareEmojiMatch => 'გთხოვთ, შეადაროთ ეს ემოჯი'; + + @override + String get compareNumbersMatch => 'გთხოვთ, შეადაროთ ეს რიცხვები'; + + @override + String get configureChat => 'ჩატის კონფიგურაცია'; + + @override + String get confirm => 'დადასტურება'; + + @override + String get connect => 'დაკავშირება'; + + @override + String get contactHasBeenInvitedToTheGroup => 'კონტაქტი მოწვეული იქნა ჯგუფში'; + + @override + String get containsDisplayName => 'ნაჩვენებ სახელს შეიცავს'; + + @override + String get containsUserName => 'შეიცავს სახელს'; + + @override + String get contentHasBeenReported => + 'ეს კონტენტი გაგზავნილ იქნა სერვერის ადმინისტრატორებთან'; + + @override + String get copiedToClipboard => 'კოპირებულია ბუფერში'; + + @override + String get copy => 'კოპირება'; + + @override + String get copyToClipboard => 'კოპირება ბუფერში'; + + @override + String couldNotDecryptMessage(String error) { + return 'შეტყობინების გაშიფვრის შეცდომა: $error'; + } + + @override + String countParticipants(int count) { + return '$count მონაწილე'; + } + + @override + String get create => 'შექმნა'; + + @override + String createdTheChat(String username) { + return '💬 $username შექმნა ჩატი'; + } + + @override + String get createGroup => 'ჯგუფის შექმნა'; + + @override + String get createNewSpace => 'ახალი სივრცე'; + + @override + String get currentlyActive => 'ახლა აქტიურია'; + + @override + String get darkTheme => 'ბნელი'; + + @override + String dateAndTimeOfDay(String date, String timeOfDay) { + return '$date, $timeOfDay'; + } + + @override + String dateWithoutYear(String month, String day) { + return '$day-$month'; + } + + @override + String dateWithYear(String year, String month, String day) { + return '$day-$month-$year'; + } + + @override + String get deactivateAccountWarning => + 'ეს გააუქმებს თქვენს ანგარიშს. ამის გაუქმება შეუძლებელია. დარწმუნებული ხართ?'; + + @override + String get defaultPermissionLevel => 'ნაგულისხმევი უფლების დონე'; + + @override + String get delete => 'წაშლა'; + + @override + String get deleteAccount => 'ანგარიშის წაშლა'; + + @override + String get deleteMessage => 'შეტყობინების წაშლა'; + + @override + String get device => 'მოწყობილება'; + + @override + String get deviceId => 'მოწყობილების ID'; + + @override + String get devices => 'მოწყობილებები'; + + @override + String get directChats => 'პირდაპირი ჩატები'; + + @override + String get allRooms => 'ყველა ჯგუფური ჩატები'; + + @override + String get displaynameHasBeenChanged => 'ნაჩვენები სახელი შეიცვალა'; + + @override + String get downloadFile => 'ფაილის ჩატვირთვა'; + + @override + String get edit => 'რედაქტირება'; + + @override + String get editBlockedServers => 'ბლოკირებული სერვერების რედაქტირება'; + + @override + String get chatPermissions => 'ჩატის უფლებები'; + + @override + String get editDisplayname => 'ნაჩვენები სახელის შეცვლა'; + + @override + String get editRoomAliases => 'ოთახის მეტსახელების შეცვლა'; + + @override + String get editRoomAvatar => 'ოთახის ფოტოს შეცვლა'; + + @override + String get emoteExists => 'ეს ემოცია უკვე არსებობს!'; + + @override + String get emoteInvalid => 'ემოციის არასწორი მოკლე კოდი!'; + + @override + String get emoteKeyboardNoRecents => + 'Recently-used emotes will appear here...'; + + @override + String get emotePacks => 'Emote packs for room'; + + @override + String get emoteSettings => 'ემოციების პარამეტრები'; + + @override + String get globalChatId => 'გლობალური ჩატის ID'; + + @override + String get accessAndVisibility => 'Access and visibility'; + + @override + String get accessAndVisibilityDescription => + 'Who is allowed to join this chat and how the chat can be discovered.'; + + @override + String get calls => 'Calls'; + + @override + String get customEmojisAndStickers => 'Custom emojis and stickers'; + + @override + String get customEmojisAndStickersBody => + 'Add or share custom emojis or stickers which can be used in any chat.'; + + @override + String get emoteShortcode => 'Emote shortcode'; + + @override + String get emoteWarnNeedToPick => + 'You need to pick an emote shortcode and an image!'; + + @override + String get emptyChat => 'Empty chat'; + + @override + String get enableEmotesGlobally => 'Enable emote pack globally'; + + @override + String get enableEncryption => 'Enable encryption'; + + @override + String get enableEncryptionWarning => + 'You won\'t be able to disable the encryption anymore. Are you sure?'; + + @override + String get encrypted => 'Encrypted'; + + @override + String get encryption => 'Encryption'; + + @override + String get encryptionNotEnabled => 'Encryption is not enabled'; + + @override + String endedTheCall(String senderName) { + return '$senderName ended the call'; + } + + @override + String get enterAnEmailAddress => 'Enter an email address'; + + @override + String get homeserver => 'Homeserver'; + + @override + String get enterYourHomeserver => 'Enter your homeserver'; + + @override + String errorObtainingLocation(String error) { + return 'Error obtaining location: $error'; + } + + @override + String get everythingReady => 'Everything ready!'; + + @override + String get extremeOffensive => 'Extremely offensive'; + + @override + String get fileName => 'File name'; + + @override + String get fluffychat => 'Extera'; + + @override + String get fontSize => 'Font size'; + + @override + String get forward => 'Forward'; + + @override + String get fromJoining => 'From joining'; + + @override + String get fromTheInvitation => 'From the invitation'; + + @override + String get goToTheNewRoom => 'Go to the new room'; + + @override + String get group => 'Group'; + + @override + String get chatDescription => 'Chat description'; + + @override + String get chatDescriptionHasBeenChanged => 'Chat description changed'; + + @override + String get groupIsPublic => 'Group is public'; + + @override + String get groups => 'Groups'; + + @override + String groupWith(String displayname) { + return 'Group with $displayname'; + } + + @override + String get guestsAreForbidden => 'Guests are forbidden'; + + @override + String get guestsCanJoin => 'Guests can join'; + + @override + String hasWithdrawnTheInvitationFor(String username, String targetName) { + return '$username has withdrawn the invitation for $targetName'; + } + + @override + String get help => 'Help'; + + @override + String get hideRedactedEvents => 'Hide redacted events'; + + @override + String get hideRedactedMessages => 'Hide redacted messages'; + + @override + String get hideRedactedMessagesBody => + 'If someone redacts a message, this message won\'t be visible in the chat anymore.'; + + @override + String get hideInvalidOrUnknownMessageFormats => + 'Hide invalid or unknown message formats'; + + @override + String get howOffensiveIsThisContent => 'How offensive is this content?'; + + @override + String get id => 'ID'; + + @override + String get identity => 'Identity'; + + @override + String get block => 'Block'; + + @override + String get blockedUsers => 'Blocked users'; + + @override + String get blockListDescription => + 'You can block users who are disturbing you. You won\'t be able to receive any messages or room invites from the users on your personal block list.'; + + @override + String get blockUsername => 'Ignore username'; + + @override + String get iHaveClickedOnLink => 'I have clicked on the link'; + + @override + String get incorrectPassphraseOrKey => 'Incorrect passphrase or recovery key'; + + @override + String get inoffensive => 'Inoffensive'; + + @override + String get inviteContact => 'Invite contact'; + + @override + String inviteContactToGroupQuestion(Object contact, Object groupName) { + return 'Do you want to invite $contact to the chat \"$groupName\"?'; + } + + @override + String inviteContactToGroup(String groupName) { + return 'Invite contact to $groupName'; + } + + @override + String get noChatDescriptionYet => 'No chat description created yet.'; + + @override + String get tryAgain => 'Try again'; + + @override + String get invalidServerName => 'Invalid server name'; + + @override + String get invited => 'Invited'; + + @override + String get redactMessageDescription => + 'The message will be redacted for all participants in this conversation. This cannot be undone.'; + + @override + String get optionalRedactReason => + '(Optional) Reason for redacting this message...'; + + @override + String invitedUser(String username, String targetName) { + return '📩 $username invited $targetName'; + } + + @override + String get invitedUsersOnly => 'Invited users only'; + + @override + String get inviteForMe => 'Invite for me'; + + @override + String inviteText(String username, String link) { + return '$username invited you to Extera.\n1. Visit fluffychat.im and install the app \n2. Sign up or sign in \n3. Open the invite link: \n $link'; + } + + @override + String get isTyping => 'is typing…'; + + @override + String joinedTheChat(String username) { + return '👋 $username joined the chat'; + } + + @override + String get joinRoom => 'Join room'; + + @override + String kicked(String username, String targetName) { + return '👞 $username kicked $targetName'; + } + + @override + String kickedAndBanned(String username, String targetName) { + return '🙅 $username kicked and banned $targetName'; + } + + @override + String get kickFromChat => 'Kick from chat'; + + @override + String lastActiveAgo(String localizedTimeShort) { + return 'Last active: $localizedTimeShort'; + } + + @override + String get leave => 'Leave'; + + @override + String get leftTheChat => 'Left the chat'; + + @override + String get license => 'License'; + + @override + String get lightTheme => 'Light'; + + @override + String loadCountMoreParticipants(int count) { + return 'Load $count more participants'; + } + + @override + String get dehydrate => 'Export session and wipe device'; + + @override + String get dehydrateWarning => + 'This action cannot be undone. Ensure you safely store the backup file.'; + + @override + String get dehydrateTor => 'TOR Users: Export session'; + + @override + String get dehydrateTorLong => + 'For TOR users, it is recommended to export the session before closing the window.'; + + @override + String get hydrateTor => 'TOR Users: Import session export'; + + @override + String get hydrateTorLong => + 'Did you export your session last time on TOR? Quickly import it and continue chatting.'; + + @override + String get hydrate => 'Restore from backup file'; + + @override + String get loadingPleaseWait => 'Loading… Please wait.'; + + @override + String get loadMore => 'Load more…'; + + @override + String get locationDisabledNotice => + 'Location services are disabled. Please enable them to be able to share your location.'; + + @override + String get locationPermissionDeniedNotice => + 'Location permission denied. Please grant them to be able to share your location.'; + + @override + String get login => 'Login'; + + @override + String logInTo(String homeserver) { + return 'Log in to $homeserver'; + } + + @override + String get logout => 'Logout'; + + @override + String get memberChanges => 'Member changes'; + + @override + String get mention => 'Mention'; + + @override + String get messages => 'Messages'; + + @override + String get messagesStyle => 'Messages:'; + + @override + String get moderator => 'Moderator'; + + @override + String get muteChat => 'Mute chat'; + + @override + String get needPantalaimonWarning => + 'Please be aware that you need Pantalaimon to use end-to-end encryption for now.'; + + @override + String get newChat => 'New chat'; + + @override + String get newMessageInFluffyChat => '💬 New message in Extera'; + + @override + String get newVerificationRequest => 'New verification request!'; + + @override + String get next => 'Next'; + + @override + String get no => 'No'; + + @override + String get noConnectionToTheServer => 'No connection to the server'; + + @override + String get noEmotesFound => 'No emotes found. 😕'; + + @override + String get noEncryptionForPublicRooms => + 'You can only activate encryption as soon as the room is no longer publicly accessible.'; + + @override + String get noGoogleServicesWarning => + 'Firebase Cloud Messaging doesn\'t appear to be available on your device. To still receive push notifications, we recommend installing ntfy. With ntfy or another Unified Push provider you can receive push notifications in a data secure way. You can download ntfy from the PlayStore or from F-Droid.'; + + @override + String noMatrixServer(String server1, String server2) { + return '$server1 is no matrix server, use $server2 instead?'; + } + + @override + String get shareInviteLink => 'Share invite link'; + + @override + String get scanQrCode => 'Scan QR code'; + + @override + String get none => 'None'; + + @override + String get noPasswordRecoveryDescription => + 'You have not added a way to recover your password yet.'; + + @override + String get noPermission => 'No permission'; + + @override + String get noRoomsFound => 'No rooms found…'; + + @override + String get notifications => 'Notifications'; + + @override + String get notificationsEnabledForThisAccount => + 'Notifications enabled for this account'; + + @override + String numUsersTyping(int count) { + return '$count users are typing…'; + } + + @override + String get obtainingLocation => 'Obtaining location…'; + + @override + String get offensive => 'Offensive'; + + @override + String get offline => 'Offline'; + + @override + String get ok => 'Ok'; + + @override + String get online => 'Online'; + + @override + String get onlineKeyBackupEnabled => 'Online Key Backup is enabled'; + + @override + String get oopsPushError => + 'Oops! Unfortunately, an error occurred when setting up the push notifications.'; + + @override + String get oopsSomethingWentWrong => 'Oops, something went wrong…'; + + @override + String get openAppToReadMessages => 'Open app to read messages'; + + @override + String get openCamera => 'Open camera'; + + @override + String get openVideoCamera => 'Open camera for a video'; + + @override + String get oneClientLoggedOut => 'One of your clients has been logged out'; + + @override + String get addAccount => 'Add account'; + + @override + String get editBundlesForAccount => 'Edit bundles for this account'; + + @override + String get addToBundle => 'Add to bundle'; + + @override + String get removeFromBundle => 'Remove from this bundle'; + + @override + String get bundleName => 'Bundle name'; + + @override + String get enableMultiAccounts => + '(BETA) Enable multi accounts on this device'; + + @override + String get openInMaps => 'Open in maps'; + + @override + String get link => 'Link'; + + @override + String get serverRequiresEmail => + 'This server needs to validate your email address for registration.'; + + @override + String get or => 'Or'; + + @override + String get participant => 'Participant'; + + @override + String get passphraseOrKey => 'passphrase or recovery key'; + + @override + String get password => 'Password'; + + @override + String get passwordForgotten => 'Password forgotten'; + + @override + String get passwordHasBeenChanged => 'Password has been changed'; + + @override + String get hideMemberChangesInPublicChats => + 'Hide member changes in public chats'; + + @override + String get hideMemberChangesInPublicChatsBody => + 'Do not show in the chat timeline if someone joins or leaves a public chat to improve readability.'; + + @override + String get overview => 'Overview'; + + @override + String get notifyMeFor => 'Notify me for'; + + @override + String get passwordRecoverySettings => 'Password recovery settings'; + + @override + String get passwordRecovery => 'Password recovery'; + + @override + String get people => 'People'; + + @override + String get pickImage => 'Pick an image'; + + @override + String get pin => 'Pin'; + + @override + String play(String fileName) { + return 'Play $fileName'; + } + + @override + String get pleaseChoose => 'Please choose'; + + @override + String get pleaseChooseAPasscode => 'Please choose a pass code'; + + @override + String get pleaseClickOnLink => + 'Please click on the link in the email and then proceed.'; + + @override + String get pleaseEnter4Digits => + 'Please enter 4 digits or leave empty to disable app lock.'; + + @override + String get pleaseEnterRecoveryKey => 'Please enter your recovery key:'; + + @override + String get pleaseEnterYourPassword => 'Please enter your password'; + + @override + String get pleaseEnterYourPin => 'Please enter your pin'; + + @override + String get pleaseEnterYourUsername => 'Please enter your username'; + + @override + String get pleaseFollowInstructionsOnWeb => + 'Please follow the instructions on the website and tap on next.'; + + @override + String get privacy => 'Privacy'; + + @override + String get publicRooms => 'Public Rooms'; + + @override + String get pushRules => 'Push rules'; + + @override + String get reason => 'Reason'; + + @override + String get recording => 'Recording'; + + @override + String redactedBy(String username) { + return 'Redacted by $username'; + } + + @override + String get directChat => 'Direct chat'; + + @override + String redactedByBecause(String username, String reason) { + return 'Redacted by $username because: \"$reason\"'; + } + + @override + String redactedAnEvent(String username) { + return '$username redacted an event'; + } + + @override + String get redactMessage => 'Redact message'; + + @override + String get register => 'Register'; + + @override + String get reject => 'Reject'; + + @override + String rejectedTheInvitation(String username) { + return '$username rejected the invitation'; + } + + @override + String get rejoin => 'Rejoin'; + + @override + String get removeAllOtherDevices => 'Remove all other devices'; + + @override + String removedBy(String username) { + return 'Removed by $username'; + } + + @override + String get removeDevice => 'Remove device'; + + @override + String get unbanFromChat => 'Unban from chat'; + + @override + String get removeYourAvatar => 'Remove your avatar'; + + @override + String get replaceRoomWithNewerVersion => 'Replace room with newer version'; + + @override + String get reply => 'Reply'; + + @override + String get reportMessage => 'Report message'; + + @override + String get translateMessage => 'Translate message'; + + @override + String get translatedMessage => 'Translated message'; + + @override + String get errorTranslatingMessage => + 'An error has occured while translating the message.'; + + @override + String get recoverMessage => 'Recover message'; + + @override + String get recoveredMessage => 'Recovered message'; + + @override + String get errorRecoveringMessage => + 'An error has occured while recovering the message.'; + + @override + String get errorRecoveringMessageNoAdmin => + 'This feature is available on Synapse homeservers only for adminstrators.'; + + @override + String get requestPermission => 'Request permission'; + + @override + String get roomHasBeenUpgraded => 'Room has been upgraded'; + + @override + String get roomVersion => 'Room version'; + + @override + String get saveFile => 'Save file'; + + @override + String get retry => 'Retry'; + + @override + String get search => 'Search'; + + @override + String get security => 'Security'; + + @override + String get recoveryKey => 'Recovery key'; + + @override + String get recoveryKeyLost => 'Recovery key lost?'; + + @override + String seenByUser(String username) { + return 'Seen by $username'; + } + + @override + String get send => 'Send'; + + @override + String get sendAMessage => 'Send a message'; + + @override + String get sendAsText => 'Send as text'; + + @override + String get sendAudio => 'Send audio'; + + @override + String get sendFile => 'Send file'; + + @override + String get sendImage => 'Send image'; + + @override + String sendImages(int count) { + return 'Send $count image'; + } + + @override + String get sendMessages => 'Send messages'; + + @override + String get sendOriginal => 'Send original'; + + @override + String get sendSticker => 'Send sticker'; + + @override + String get sendVideo => 'Send video'; + + @override + String sentAFile(String username) { + return '📁 $username sent a file'; + } + + @override + String sentAnAudio(String username) { + return '🎤 $username sent an audio'; + } + + @override + String sentAPicture(String username) { + return '🖼️ $username sent a picture'; + } + + @override + String sentASticker(String username) { + return '😊 $username sent a sticker'; + } + + @override + String sentAVideo(String username) { + return '🎥 $username sent a video'; + } + + @override + String sentCallInformations(String senderName) { + return '$senderName sent call information'; + } + + @override + String get separateChatTypes => 'Separate Direct Chats and Groups'; + + @override + String get setAsCanonicalAlias => 'Set as main alias'; + + @override + String get setCustomEmotes => 'Set custom emotes'; + + @override + String get setChatDescription => 'Set chat description'; + + @override + String get setInvitationLink => 'Set invitation link'; + + @override + String get setPermissionsLevel => 'Set permissions level'; + + @override + String get setStatus => 'Set status'; + + @override + String get settings => 'Settings'; + + @override + String get share => 'Share'; + + @override + String sharedTheLocation(String username) { + return '$username shared their location'; + } + + @override + String get shareLocation => 'Share location'; + + @override + String get showPassword => 'Show password'; + + @override + String get presenceStyle => 'Presence:'; + + @override + String get hideAvatarsInInvites => 'Hide avatars in invites'; + + @override + String get hideAvatarsInInvitesDescription => + 'Do not show room avatars in invites'; + + @override + String get presencesToggle => 'Show status messages from other users'; + + @override + String get pureBlackToggle => 'Pure Black'; + + @override + String get singlesignon => 'Single Sign on'; + + @override + String get skip => 'Skip'; + + @override + String get sourceCode => 'Source code'; + + @override + String get spaceIsPublic => 'Space is public'; + + @override + String get spaceName => 'Space name'; + + @override + String startedACall(String senderName) { + return '$senderName started a call'; + } + + @override + String get startFirstChat => 'Start your first chat'; + + @override + String get status => 'Status'; + + @override + String get statusExampleMessage => 'How are you today?'; + + @override + String get submit => 'Submit'; + + @override + String get synchronizingPleaseWait => 'Synchronizing… Please wait.'; + + @override + String synchronizingPleaseWaitCounter(String percentage) { + return ' Synchronizing… ($percentage%)'; + } + + @override + String get systemTheme => 'System'; + + @override + String get theyDontMatch => 'They Don\'t Match'; + + @override + String get theyMatch => 'They Match'; + + @override + String get title => 'Extera'; + + @override + String get toggleFavorite => 'Toggle Favorite'; + + @override + String get toggleMuted => 'Toggle Muted'; + + @override + String get toggleUnread => 'Mark Read/Unread'; + + @override + String get tooManyRequestsWarning => + 'Too many requests. Please try again later!'; + + @override + String get transferFromAnotherDevice => 'Transfer from another device'; + + @override + String get tryToSendAgain => 'Try to send again'; + + @override + String get unavailable => 'Unavailable'; + + @override + String unbannedUser(String username, String targetName) { + return '$username unbanned $targetName'; + } + + @override + String get unblockDevice => 'Unblock Device'; + + @override + String get unknownDevice => 'Unknown device'; + + @override + String get unknownEncryptionAlgorithm => 'Unknown encryption algorithm'; + + @override + String unknownEvent(String type) { + return 'Unknown event \'$type\''; + } + + @override + String get unmuteChat => 'Unmute chat'; + + @override + String get unpin => 'Unpin'; + + @override + String unreadChats(int unreadCount) { + String _temp0 = intl.Intl.pluralLogic( + unreadCount, + locale: localeName, + other: '$unreadCount unread chats', + one: '1 unread chat', + ); + return '$_temp0'; + } + + @override + String userAndOthersAreTyping(String username, int count) { + return '$username and $count others are typing…'; + } + + @override + String userAndUserAreTyping(String username, String username2) { + return '$username and $username2 are typing…'; + } + + @override + String userIsTyping(String username) { + return '$username is typing…'; + } + + @override + String userLeftTheChat(String username) { + return '🚪 $username left the chat'; + } + + @override + String get username => 'Username'; + + @override + String userSentUnknownEvent(String username, String type) { + return '$username sent a $type event'; + } + + @override + String get unverified => 'Unverified'; + + @override + String get verified => 'Verified'; + + @override + String get verify => 'Verify'; + + @override + String get verifyStart => 'Start Verification'; + + @override + String get verifySuccess => 'You successfully verified!'; + + @override + String get verifyTitle => 'Verifying other account'; + + @override + String get videoCall => 'Video call'; + + @override + String get visibilityOfTheChatHistory => 'Visibility of the chat history'; + + @override + String get visibleForAllParticipants => 'Visible for all participants'; + + @override + String get visibleForEveryone => 'Visible for everyone'; + + @override + String get voiceMessage => 'Voice message'; + + @override + String get waitingPartnerAcceptRequest => + 'Waiting for partner to accept the request…'; + + @override + String get waitingPartnerEmoji => 'Waiting for partner to accept the emoji…'; + + @override + String get waitingPartnerNumbers => + 'Waiting for partner to accept the numbers…'; + + @override + String get wallpaper => 'Wallpaper:'; + + @override + String get warning => 'Warning!'; + + @override + String get weSentYouAnEmail => 'We sent you an email'; + + @override + String get whoCanPerformWhichAction => 'Who can perform which action'; + + @override + String get whoIsAllowedToJoinThisGroup => 'Who is allowed to join this group'; + + @override + String get whyDoYouWantToReportThis => 'Why do you want to report this?'; + + @override + String get wipeChatBackup => + 'Wipe your chat backup to create a new recovery key?'; + + @override + String get withTheseAddressesRecoveryDescription => + 'With these addresses you can recover your password.'; + + @override + String get writeAMessage => 'Write a message…'; + + @override + String get yes => 'Yes'; + + @override + String get you => 'You'; + + @override + String get youAreNoLongerParticipatingInThisChat => + 'You are no longer participating in this chat'; + + @override + String get youHaveBeenBannedFromThisChat => + 'You have been banned from this chat'; + + @override + String get yourPublicKey => 'Your public key'; + + @override + String get messageInfo => 'Message info'; + + @override + String get time => 'Time'; + + @override + String get messageType => 'Message Type'; + + @override + String get sender => 'Sender'; + + @override + String get openGallery => 'Open gallery'; + + @override + String get removeFromSpace => 'Remove from space'; + + @override + String get addToSpaceDescription => 'Select a space to add this chat to it.'; + + @override + String get start => 'Start'; + + @override + String get pleaseEnterRecoveryKeyDescription => + 'To unlock your old messages, please enter your recovery key that has been generated in a previous session. Your recovery key is NOT your password.'; + + @override + String get publish => 'Publish'; + + @override + String videoWithSize(String size) { + return 'Video ($size)'; + } + + @override + String get openChat => 'Open Chat'; + + @override + String get markAsRead => 'Mark as read'; + + @override + String get reportUser => 'Report user'; + + @override + String get dismiss => 'Dismiss'; + + @override + String reactedWith(String sender, String reaction) { + return '$sender reacted with $reaction'; + } + + @override + String get pinMessage => 'Pin to room'; + + @override + String get confirmEventUnpin => + 'Are you sure to permanently unpin the event?'; + + @override + String get emojis => 'Emojis'; + + @override + String get placeCall => 'Place call'; + + @override + String get voiceCall => 'Voice call'; + + @override + String get unsupportedAndroidVersion => 'Unsupported Android version'; + + @override + String get unsupportedAndroidVersionLong => + 'This feature requires a newer Android version. Please check for updates or Lineage OS support.'; + + @override + String get videoCallsBetaWarning => + 'Please note that video calls are currently in beta. They might not work as expected or work at all on all platforms.'; + + @override + String get experimentalVideoCalls => 'Experimental video calls'; + + @override + String get emailOrUsername => 'Email or username'; + + @override + String get indexedDbErrorTitle => 'Private mode issues'; + + @override + String get indexedDbErrorLong => + 'The message storage is unfortunately not enabled in private mode by default.\nPlease visit\n - about:config\n - set dom.indexedDB.privateBrowsing.enabled to true\nOtherwise, it is not possible to run Extera.'; + + @override + String switchToAccount(String number) { + return 'Switch to account $number'; + } + + @override + String get nextAccount => 'Next account'; + + @override + String get previousAccount => 'Previous account'; + + @override + String get addWidget => 'Add widget'; + + @override + String get widgetVideo => 'Video'; + + @override + String get widgetEtherpad => 'Text note'; + + @override + String get widgetJitsi => 'Jitsi Meet'; + + @override + String get widgetCustom => 'Custom'; + + @override + String get widgetName => 'Name'; + + @override + String get widgetUrlError => 'This is not a valid URL.'; + + @override + String get widgetNameError => 'Please provide a display name.'; + + @override + String get errorAddingWidget => 'Error adding the widget.'; + + @override + String get youRejectedTheInvitation => 'You rejected the invitation'; + + @override + String get youJoinedTheChat => 'You joined the chat'; + + @override + String get youAcceptedTheInvitation => '👍 You accepted the invitation'; + + @override + String youBannedUser(String user) { + return 'You banned $user'; + } + + @override + String youHaveWithdrawnTheInvitationFor(String user) { + return 'You have withdrawn the invitation for $user'; + } + + @override + String youInvitedToBy(String alias) { + return '📩 You have been invited via link to:\n$alias'; + } + + @override + String youInvitedBy(String user) { + return '📩 You have been invited by $user'; + } + + @override + String invitedBy(String user) { + return '📩 Invited by $user'; + } + + @override + String youInvitedUser(String user) { + return '📩 You invited $user'; + } + + @override + String youKicked(String user) { + return '👞 You kicked $user'; + } + + @override + String youKickedAndBanned(String user) { + return '🙅 You kicked and banned $user'; + } + + @override + String youUnbannedUser(String user) { + return 'You unbanned $user'; + } + + @override + String hasKnocked(String user) { + return '🚪 $user has knocked'; + } + + @override + String get usersMustKnock => 'Users must knock'; + + @override + String get noOneCanJoin => 'No one can join'; + + @override + String userWouldLikeToChangeTheChat(String user) { + return '$user would like to join the chat.'; + } + + @override + String get noPublicLinkHasBeenCreatedYet => + 'No public link has been created yet'; + + @override + String get knock => 'Knock'; + + @override + String get users => 'Users'; + + @override + String get unlockOldMessages => 'Unlock old messages'; + + @override + String get storeInSecureStorageDescription => + 'Store the recovery key in the secure storage of this device.'; + + @override + String get saveKeyManuallyDescription => + 'Save this key manually by triggering the system share dialog or clipboard.'; + + @override + String get storeInAndroidKeystore => 'Store in Android KeyStore'; + + @override + String get storeInAppleKeyChain => 'Store in Apple KeyChain'; + + @override + String get storeSecurlyOnThisDevice => 'Store securely on this device'; + + @override + String countFiles(int count) { + return '$count files'; + } + + @override + String get user => 'User'; + + @override + String get custom => 'Custom'; + + @override + String get foregroundServiceRunning => + 'This notification appears when the foreground service is running.'; + + @override + String get screenSharingTitle => 'screen sharing'; + + @override + String get screenSharingDetail => 'You are sharing your screen in Extera'; + + @override + String get callingPermissions => 'Calling permissions'; + + @override + String get callingAccount => 'Calling account'; + + @override + String get callingAccountDetails => + 'Allows Extera to use the native android dialer app.'; + + @override + String get appearOnTop => 'Appear on top'; + + @override + String get appearOnTopDetails => + 'Allows the app to appear on top (not needed if you already have Fluffychat setup as a calling account)'; + + @override + String get otherCallingPermissions => + 'Microphone, camera and other Extera permissions'; + + @override + String get whyIsThisMessageEncrypted => 'Why is this message unreadable?'; + + @override + String get noKeyForThisMessage => + 'This can happen if the message was sent before you have signed in to your account at this device.\n\nIt is also possible that the sender has blocked your device or something went wrong with the internet connection.\n\nAre you able to read the message on another session? Then you can transfer the message from it! Go to Settings > Devices and make sure that your devices have verified each other. When you open the room the next time and both sessions are in the foreground, the keys will be transmitted automatically.\n\nDo you not want to lose the keys when logging out or switching devices? Make sure that you have enabled the chat backup in the settings.'; + + @override + String get newGroup => 'New group'; + + @override + String get newSpace => 'New space'; + + @override + String get enterSpace => 'Enter space'; + + @override + String get enterRoom => 'Enter room'; + + @override + String get allSpaces => 'All spaces'; + + @override + String numChats(String number) { + return '$number chats'; + } + + @override + String get hideUnimportantStateEvents => 'Hide unimportant state events'; + + @override + String get hidePresences => 'Hide Status List?'; + + @override + String get doNotShowAgain => 'Do not show again'; + + @override + String wasDirectChatDisplayName(String oldDisplayName) { + return 'Empty chat (was $oldDisplayName)'; + } + + @override + String get newSpaceDescription => + 'Spaces allows you to consolidate your chats and build private or public communities.'; + + @override + String get encryptThisChat => 'Encrypt this chat'; + + @override + String get disableEncryptionWarning => + 'For security reasons you can not disable encryption in a chat, where it has been enabled before.'; + + @override + String get sorryThatsNotPossible => 'Sorry... that is not possible'; + + @override + String get deviceKeys => 'Device keys:'; + + @override + String get reopenChat => 'Reopen chat'; + + @override + String get noBackupWarning => + 'Warning! Without enabling chat backup, you will lose access to your encrypted messages. It is highly recommended to enable the chat backup first before logging out.'; + + @override + String get noOtherDevicesFound => 'No other devices found'; + + @override + String fileIsTooBigForServer(String max) { + return 'Unable to send! The server only supports attachments up to $max.'; + } + + @override + String fileHasBeenSavedAt(String path) { + return 'File has been saved at $path'; + } + + @override + String get jumpToLastReadMessage => 'Jump to last read message'; + + @override + String get readUpToHere => 'Read up to here'; + + @override + String get jump => 'Jump'; + + @override + String get openLinkInBrowser => 'Open link in browser'; + + @override + String get reportErrorDescription => + '😭 Oh no. Something went wrong. If you want, you can report this bug to the developers.'; + + @override + String get report => 'Report'; + + @override + String get signInWithPassword => 'Sign in with password'; + + @override + String get pleaseTryAgainLaterOrChooseDifferentServer => + 'Please try again later or choose a different server.'; + + @override + String signInWith(String provider) { + return 'Sign in with $provider'; + } + + @override + String get profileNotFound => + 'The user could not be found on the server. Maybe there is a connection problem or the user doesn\'t exist.'; + + @override + String get setTheme => 'Set theme:'; + + @override + String get setColorTheme => 'Set color theme:'; + + @override + String get invite => 'Invite'; + + @override + String get inviteGroupChat => '📨 Invite group chat'; + + @override + String get invitePrivateChat => '📨 Invite private chat'; + + @override + String get invalidInput => 'Invalid input!'; + + @override + String wrongPinEntered(int seconds) { + return 'Wrong pin entered! Try again in $seconds seconds...'; + } + + @override + String get pleaseEnterANumber => 'Please enter a number greater than 0'; + + @override + String get archiveRoomDescription => + 'The chat will be moved to the archive. Other users will be able to see that you have left the chat.'; + + @override + String get roomUpgradeDescription => + 'The chat will then be recreated with the new room version. All participants will be notified that they need to switch to the new chat. You can find out more about room versions at https://spec.matrix.org/latest/rooms/'; + + @override + String get removeDevicesDescription => + 'You will be logged out of this device and will no longer be able to receive messages.'; + + @override + String get banUserDescription => + 'The user will be banned from the chat and will not be able to enter the chat again until they are unbanned.'; + + @override + String get unbanUserDescription => + 'The user will be able to enter the chat again if they try.'; + + @override + String get kickUserDescription => + 'The user is kicked out of the chat but not banned. In public chats, the user can rejoin at any time.'; + + @override + String get makeAdminDescription => + 'Once you make this user admin, you may not be able to undo this as they will then have the same permissions as you.'; + + @override + String get pushNotificationsNotAvailable => + 'Push notifications not available'; + + @override + String get learnMore => 'Learn more'; + + @override + String get yourGlobalUserIdIs => 'Your global user-ID is: '; + + @override + String noUsersFoundWithQuery(String query) { + return 'Unfortunately no user could be found with \"$query\". Please check whether you made a typo.'; + } + + @override + String get knocking => 'Knocking'; + + @override + String chatCanBeDiscoveredViaSearchOnServer(String server) { + return 'Chat can be discovered via the search on $server'; + } + + @override + String get searchChatsRooms => 'Search for #chats, @users...'; + + @override + String get nothingFound => 'Nothing found...'; + + @override + String get groupName => 'Group name'; + + @override + String get createGroupAndInviteUsers => 'Create a group and invite users'; + + @override + String get groupCanBeFoundViaSearch => 'Group can be found via search'; + + @override + String get wrongRecoveryKey => + 'Sorry... this does not seem to be the correct recovery key.'; + + @override + String get startConversation => 'Start conversation'; + + @override + String get commandHint_sendraw => 'Send raw json'; + + @override + String get databaseMigrationTitle => 'Database is optimized'; + + @override + String get databaseMigrationBody => 'Please wait. This may take a moment.'; + + @override + String get leaveEmptyToClearStatus => 'Leave empty to clear your status.'; + + @override + String get select => 'Select'; + + @override + String get searchForUsers => 'Search for @users...'; + + @override + String get pleaseEnterYourCurrentPassword => + 'Please enter your current password'; + + @override + String get newPassword => 'New password'; + + @override + String get pleaseChooseAStrongPassword => 'Please choose a strong password'; + + @override + String get passwordsDoNotMatch => 'Passwords do not match'; + + @override + String get passwordIsWrong => 'Your entered password is wrong'; + + @override + String get publicLink => 'Public link'; + + @override + String get publicChatAddresses => 'Public chat addresses'; + + @override + String get createNewAddress => 'Create new address'; + + @override + String get joinSpace => 'Join space'; + + @override + String get publicSpaces => 'Public spaces'; + + @override + String get addChatOrSubSpace => 'Add chat or sub space'; + + @override + String get subspace => 'Subspace'; + + @override + String get decline => 'Decline'; + + @override + String get thisDevice => 'This device:'; + + @override + String get initAppError => 'An error occured while init the app'; + + @override + String get userRole => 'User role'; + + @override + String minimumPowerLevel(String level) { + return '$level is the minimum power level.'; + } + + @override + String searchIn(String chat) { + return 'Search in chat \"$chat\"...'; + } + + @override + String get searchMore => 'Search more...'; + + @override + String get gallery => 'Gallery'; + + @override + String get files => 'Files'; + + @override + String databaseBuildErrorBody(String url, String error) { + return 'Unable to build the SQlite database. The app tries to use the legacy database for now. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String sessionLostBody(String url, String error) { + return 'Your session is lost. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String restoreSessionBody(String url, String error) { + return 'The app now tries to restore your session from the backup. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String forwardMessageTo(String roomName) { + return 'Forward message to $roomName?'; + } + + @override + String get sendReadReceipts => 'Send read receipts'; + + @override + String get sendTypingNotificationsDescription => + 'Other participants in a chat can see when you are typing a new message.'; + + @override + String get sendReadReceiptsDescription => + 'Other participants in a chat can see when you have read a message.'; + + @override + String get formattedMessages => 'Formatted messages'; + + @override + String get formattedMessagesDescription => + 'Display rich message content like bold text using markdown.'; + + @override + String get verifyOtherUser => '🔐 Verify other user'; + + @override + String get verifyOtherUserDescription => + 'If you verify another user, you can be sure that you know who you are really writing to. 💪\n\nWhen you start a verification, you and the other user will see a popup in the app. There you will then see a series of emojis or numbers that you have to compare with each other.\n\nThe best way to do this is to meet up or start a video call. 👭'; + + @override + String get verifyOtherDevice => '🔐 Verify other device'; + + @override + String get verifyOtherDeviceDescription => + 'When you verify another device, those devices can exchange keys, increasing your overall security. 💪 When you start a verification, a popup will appear in the app on both devices. There you will then see a series of emojis or numbers that you have to compare with each other. It\'s best to have both devices handy before you start the verification. 🤳'; + + @override + String acceptedKeyVerification(String sender) { + return '$sender accepted key verification'; + } + + @override + String canceledKeyVerification(String sender) { + return '$sender canceled key verification'; + } + + @override + String completedKeyVerification(String sender) { + return '$sender completed key verification'; + } + + @override + String isReadyForKeyVerification(String sender) { + return '$sender is ready for key verification'; + } + + @override + String requestedKeyVerification(String sender) { + return '$sender requested key verification'; + } + + @override + String startedKeyVerification(String sender) { + return '$sender started key verification'; + } + + @override + String get transparent => 'Transparent'; + + @override + String get incomingMessages => 'Incoming messages'; + + @override + String get stickers => 'Stickers'; + + @override + String get discover => 'Discover'; + + @override + String get commandHint_ignore => 'Ignore the given matrix ID'; + + @override + String get commandHint_unignore => 'Unignore the given matrix ID'; + + @override + String unreadChatsInApp(String appname, String unread) { + return '$appname: $unread unread chats'; + } + + @override + String get noDatabaseEncryption => + 'Database encryption is not supported on this platform'; + + @override + String thereAreCountUsersBlocked(Object count) { + return 'Right now there are $count users blocked.'; + } + + @override + String get restricted => 'Restricted'; + + @override + String get knockRestricted => 'Knock restricted'; + + @override + String goToSpace(Object space) { + return 'Go to space: $space'; + } + + @override + String get markAsUnread => 'Mark as unread'; + + @override + String userLevel(int level) { + return '$level - User'; + } + + @override + String moderatorLevel(int level) { + return '$level - Moderator'; + } + + @override + String adminLevel(int level) { + return '$level - Admin'; + } + + @override + String get changeGeneralChatSettings => 'Change general chat settings'; + + @override + String get inviteOtherUsers => 'Invite other users to this chat'; + + @override + String get changeTheChatPermissions => 'Change the chat permissions'; + + @override + String get changeTheVisibilityOfChatHistory => + 'Change the visibility of the chat history'; + + @override + String get changeTheCanonicalRoomAlias => + 'Change the main public chat address'; + + @override + String get sendRoomNotifications => 'Send a @room notifications'; + + @override + String get changeTheDescriptionOfTheGroup => + 'Change the description of the chat'; + + @override + String get chatPermissionsDescription => + 'Define which power level is necessary for certain actions in this chat. The power levels 0, 50 and 100 are usually representing users, moderators and admins, but any gradation is possible.'; + + @override + String updateInstalled(String version) { + return '🎉 Update $version installed!'; + } + + @override + String get changelog => 'Changelog'; + + @override + String get sendCanceled => 'Sending canceled'; + + @override + String get loginWithMatrixId => 'Login with Matrix-ID'; + + @override + String get discoverHomeservers => 'Discover homeservers'; + + @override + String get whatIsAHomeserver => 'What is a homeserver?'; + + @override + String get homeserverDescription => + 'All your data is stored on the homeserver, just like an email provider. You can choose which homeserver you want to use, while you can still communicate with everyone. Learn more at at https://matrix.org.'; + + @override + String get doesNotSeemToBeAValidHomeserver => + 'Doesn\'t seem to be a compatible homeserver. Wrong URL?'; + + @override + String get calculatingFileSize => 'Calculating file size...'; + + @override + String get prepareSendingAttachment => 'Prepare sending attachment...'; + + @override + String get sendingAttachment => 'Sending attachment...'; + + @override + String get generatingVideoThumbnail => 'Generating video thumbnail...'; + + @override + String get compressVideo => 'Compressing video...'; + + @override + String sendingAttachmentCountOfCount(int index, int length) { + return 'Sending attachment $index of $length...'; + } + + @override + String serverLimitReached(int seconds) { + return 'Server limit reached! Waiting $seconds seconds...'; + } + + @override + String get oneOfYourDevicesIsNotVerified => + 'One of your devices is not verified'; + + @override + String get noticeChatBackupDeviceVerification => + 'Note: When you connect all your devices to the chat backup, they are automatically verified.'; + + @override + String get continueText => 'Continue'; + + @override + String get welcomeText => + 'Hey Hey 👋 This is Extera. You can sign in to any homeserver, which is compatible with https://matrix.org. And then chat with anyone. It\'s a huge decentralized messaging network!'; + + @override + String get blur => 'Blur:'; + + @override + String get opacity => 'Opacity:'; + + @override + String get setWallpaper => 'Set wallpaper'; + + @override + String get manageAccount => 'Manage account'; + + @override + String get noContactInformationProvided => + 'Server does not provide any valid contact information'; + + @override + String get contactServerAdmin => 'Contact server admin'; + + @override + String get contactServerSecurity => 'Contact server security'; + + @override + String get supportPage => 'Support page'; + + @override + String get serverInformation => 'Server information:'; + + @override + String get name => 'Name'; + + @override + String get version => 'Version'; + + @override + String get website => 'Website'; + + @override + String get compress => 'Compress'; + + @override + String get boldText => 'Bold text'; + + @override + String get italicText => 'Italic text'; + + @override + String get strikeThrough => 'Strikethrough'; + + @override + String get pleaseFillOut => 'Please fill out'; + + @override + String get invalidUrl => 'Invalid url'; + + @override + String get addLink => 'Add link'; + + @override + String get unableToJoinChat => + 'Unable to join chat. Maybe the other party has already closed the conversation.'; + + @override + String get previous => 'Previous'; + + @override + String get otherPartyNotLoggedIn => + 'The other party is currently not logged in and therefore cannot receive messages!'; + + @override + String appWantsToUseForLogin(String server) { + return 'Use \'$server\' to log in'; + } + + @override + String get appWantsToUseForLoginDescription => + 'You hereby allow the app and website to share information about you.'; + + @override + String get open => 'Open'; + + @override + String get waitingForServer => 'Waiting for server...'; + + @override + String get appIntroduction => + 'Extera lets you chat with your friends across different messengers. Learn more at https://matrix.org or just tap *Continue*.'; + + @override + String get newChatRequest => '📩 New chat request'; + + @override + String get contentNotificationSettings => 'Content notification settings'; + + @override + String get generalNotificationSettings => 'General notification settings'; + + @override + String get roomNotificationSettings => 'Room notification settings'; + + @override + String get userSpecificNotificationSettings => + 'User specific notification settings'; + + @override + String get otherNotificationSettings => 'Other notification settings'; + + @override + String get notificationRuleContainsUserName => 'Contains User Name'; + + @override + String get notificationRuleContainsUserNameDescription => + 'Notifies the user when a message contains their username.'; + + @override + String get notificationRuleMaster => 'Mute all notifications'; + + @override + String get notificationRuleMasterDescription => + 'Overrides all other rules and disables all notifications.'; + + @override + String get notificationRuleSuppressNotices => 'Suppress Automated Messages'; + + @override + String get notificationRuleSuppressNoticesDescription => + 'Suppresses notifications from automated clients like bots.'; + + @override + String get notificationRuleInviteForMe => 'Invite for Me'; + + @override + String get notificationRuleInviteForMeDescription => + 'Notifies the user when they are invited to a room.'; + + @override + String get notificationRuleMemberEvent => 'Member Event'; + + @override + String get notificationRuleMemberEventDescription => + 'Suppresses notifications for membership events.'; + + @override + String get notificationRuleIsUserMention => 'User Mention'; + + @override + String get notificationRuleIsUserMentionDescription => + 'Notifies the user when they are directly mentioned in a message.'; + + @override + String get notificationRuleContainsDisplayName => 'Contains Display Name'; + + @override + String get notificationRuleContainsDisplayNameDescription => + 'Notifies the user when a message contains their display name.'; + + @override + String get notificationRuleIsRoomMention => 'Room Mention'; + + @override + String get notificationRuleIsRoomMentionDescription => + 'Notifies the user when there is a room mention.'; + + @override + String get notificationRuleRoomnotif => 'Room Notification'; + + @override + String get notificationRuleRoomnotifDescription => + 'Notifies the user when a message contains \'@room\'.'; + + @override + String get notificationRuleTombstone => 'Tombstone'; + + @override + String get notificationRuleTombstoneDescription => + 'Notifies the user about room deactivation messages.'; + + @override + String get notificationRuleReaction => 'Reaction'; + + @override + String get notificationRuleReactionDescription => + 'Suppresses notifications for reactions.'; + + @override + String get notificationRuleRoomServerAcl => 'Room Server ACL'; + + @override + String get notificationRuleRoomServerAclDescription => + 'Suppresses notifications for room server access control lists (ACL).'; + + @override + String get notificationRuleSuppressEdits => 'Suppress Edits'; + + @override + String get notificationRuleSuppressEditsDescription => + 'Suppresses notifications for edited messages.'; + + @override + String get notificationRuleCall => 'Call'; + + @override + String get notificationRuleCallDescription => + 'Notifies the user about calls.'; + + @override + String get notificationRuleEncryptedRoomOneToOne => + 'Encrypted Room One-to-One'; + + @override + String get notificationRuleEncryptedRoomOneToOneDescription => + 'Notifies the user about messages in encrypted one-to-one rooms.'; + + @override + String get notificationRuleRoomOneToOne => 'Room One-to-One'; + + @override + String get notificationRuleRoomOneToOneDescription => + 'Notifies the user about messages in one-to-one rooms.'; + + @override + String get notificationRuleMessage => 'Message'; + + @override + String get notificationRuleMessageDescription => + 'Notifies the user about general messages.'; + + @override + String get notificationRuleEncrypted => 'Encrypted'; + + @override + String get notificationRuleEncryptedDescription => + 'Notifies the user about messages in encrypted rooms.'; + + @override + String get notificationRuleJitsi => 'Jitsi'; + + @override + String get notificationRuleJitsiDescription => + 'Notifies the user about Jitsi widget events.'; + + @override + String get notificationRuleServerAcl => 'Suppress Server ACL Events'; + + @override + String get notificationRuleServerAclDescription => + 'Suppresses notifications for Server ACL events.'; + + @override + String unknownPushRule(String rule) { + return 'Unknown push rule \'$rule\''; + } + + @override + String get deletePushRuleCanNotBeUndone => + 'If you delete this notification setting, this can not be undone.'; + + @override + String get more => 'More'; + + @override + String get shareKeysWith => 'Share keys with...'; + + @override + String get shareKeysWithDescription => + 'Which devices should be trusted so that they can read along your messages in encrypted chats?'; + + @override + String get allDevices => 'All devices'; + + @override + String get crossVerifiedDevicesIfEnabled => + 'Cross verified devices if enabled'; + + @override + String get crossVerifiedDevices => 'Cross verified devices'; + + @override + String get verifiedDevicesOnly => 'Verified devices only'; + + @override + String get takeAPhoto => 'Take a photo'; + + @override + String get recordAVideo => 'Record a video'; + + @override + String get optionalMessage => '(Optional) message...'; + + @override + String get notSupportedOnThisDevice => 'Not supported on this device'; + + @override + String get enterNewChat => 'Enter new chat'; + + @override + String get approve => 'Approve'; + + @override + String get youHaveKnocked => 'You have knocked'; + + @override + String get pleaseWaitUntilInvited => + 'Please wait now, until someone from the room invites you.'; +} diff --git a/lib/generated/l10n/l10n_ko.dart b/lib/generated/l10n/l10n_ko.dart new file mode 100644 index 0000000..a9fb27a --- /dev/null +++ b/lib/generated/l10n/l10n_ko.dart @@ -0,0 +1,2683 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'l10n.dart'; + +// ignore_for_file: type=lint + +/// The translations for Korean (`ko`). +class L10nKo extends L10n { + L10nKo([String locale = 'ko']) : super(locale); + + @override + String get noSendPermission => 'You can\'t send messages here'; + + @override + String get alwaysUse24HourFormat => 'false'; + + @override + String get repeatPassword => '비밀번호 다시 입력'; + + @override + String get notAnImage => '이미지 파일이 아닙니다.'; + + @override + String get setCustomPermissionLevel => 'Set custom permission level'; + + @override + String get setPermissionsLevelDescription => + 'Please choose a predefined role below or enter a custom permission level between 0 and 100.'; + + @override + String get ignoreUser => 'Ignore user'; + + @override + String get normalUser => 'Normal user'; + + @override + String get remove => '지우기'; + + @override + String get importNow => '지금 불러오기'; + + @override + String get importEmojis => '이모지 불러오기'; + + @override + String get importFromZipFile => '.zip 파일에서 불러오기'; + + @override + String get exportEmotePack => '.zip 파일로 이모트 내보내기'; + + @override + String get replace => '대체'; + + @override + String get about => '소개'; + + @override + String aboutHomeserver(String homeserver) { + return '$homeserver의 대해서'; + } + + @override + String get accept => '수락'; + + @override + String acceptedTheInvitation(String username) { + return '👍 $username님이 초대를 수락함'; + } + + @override + String get account => '계정'; + + @override + String activatedEndToEndEncryption(String username) { + return '🔐 $username님이 종단간 암호화를 활성화함'; + } + + @override + String get addEmail => '이메일 추가'; + + @override + String get confirmMatrixId => '계정을 삭제하려면 Matrix ID를 입력해 주세요.'; + + @override + String supposedMxid(String mxid) { + return '$mxid 이어야 함'; + } + + @override + String get addChatDescription => '채팅 설명 추가하기...'; + + @override + String get addToSpace => '스페이스에 추가'; + + @override + String get admin => '운영자'; + + @override + String get alias => '별명'; + + @override + String get all => '모두'; + + @override + String get allChats => '모든 채팅'; + + @override + String get commandHint_roomupgrade => + 'Upgrade this room to the given room version'; + + @override + String get commandHint_googly => '왕눈이 눈알 보내기'; + + @override + String get commandHint_cuddle => '미소 보내기'; + + @override + String get commandHint_hug => '허그 보내기'; + + @override + String googlyEyesContent(String senderName) { + return '$senderName 님이 왕눈이 눈알을 보냈습니다'; + } + + @override + String cuddleContent(String senderName) { + return '$senderName 님이 당신에게 미소짓습니다'; + } + + @override + String hugContent(String senderName) { + return '$senderName님이 당신을 허그합니다'; + } + + @override + String answeredTheCall(String senderName) { + return '$senderName님이 전화에 응답했습니다'; + } + + @override + String get anyoneCanJoin => '누구나 참가할 수 있음'; + + @override + String get appLock => '앱 잠금'; + + @override + String get appLockDescription => '앱을 사용하지 않을 때 pin으로 잠금'; + + @override + String get archive => '저장'; + + @override + String get areGuestsAllowedToJoin => '게스트 유저의 참가 여부'; + + @override + String get areYouSure => '확실한가요?'; + + @override + String get areYouSureYouWantToLogout => '로그아웃하고 싶은 것이 확실한가요?'; + + @override + String get askSSSSSign => '다른 사람을 서명하기 위해서, 저장 비밀번호나 복구 키를 입력해주세요.'; + + @override + String askVerificationRequest(String username) { + return '$username님의 인증 요청을 수락할까요?'; + } + + @override + String get autoplayImages => '자동으로 움직이는 스티커와 이모트 재생'; + + @override + String badServerLoginTypesException(String serverVersions, + String supportedVersions, Object suportedVersions) { + return '홈서버가 지원하는 로그인 유형:\n$serverVersions\n하지만 이 앱에서 지원하는 것은:\n$supportedVersions'; + } + + @override + String get sendTypingNotifications => '입력 알림 보내기'; + + @override + String get swipeRightToLeftToReply => '오른쪽에서 왼쪽으로 스와이프해서 답장'; + + @override + String get sendOnEnter => '엔터로 보내기'; + + @override + String badServerVersionsException(String serverVersions, + String supportedVersions, Object serverVerions, Object suportedVersions) { + return '이 홈서버가 지원하는 Spec 버전:\n$serverVersions\n하지만 이 앱은 $supportedVersions만 지원합니다'; + } + + @override + String countChatsAndCountParticipants(int chats, int participants) { + return '$chats 채팅과 $participants 참여자'; + } + + @override + String get noMoreChatsFound => '채팅을 찾을 수 없습니다...'; + + @override + String get noChatsFoundHere => + '대화가 발견되지 않았습니다. 아래 버튼을 사용하여 새 대화를 시작해 보세요. ⤵️'; + + @override + String get joinedChats => '참가한 채팅'; + + @override + String get unread => '읽지 않은'; + + @override + String get space => '스페이스'; + + @override + String get spaces => '스페이스'; + + @override + String get banFromChat => '채팅에서 영구 추방'; + + @override + String get banned => '영구 추방됨'; + + @override + String bannedUser(String username, String targetName) { + return '$username님이 $targetName님을 영구 추방함'; + } + + @override + String get blockDevice => '기기 차단'; + + @override + String get blocked => '차단됨'; + + @override + String get botMessages => '봇 메시지'; + + @override + String get cancel => '취소'; + + @override + String cantOpenUri(String uri) { + return 'URI $uri를 열 수 없습니다'; + } + + @override + String get changeDeviceName => '기기 이름 바꾸기'; + + @override + String changedTheChatAvatar(String username) { + return '$username님이 채팅 아바타를 바꿈'; + } + + @override + String changedTheChatDescriptionTo(String username, String description) { + return '$username님이 채팅 설명을 \'$description\' 으로 변경함'; + } + + @override + String changedTheChatNameTo(String username, String chatname) { + return '$username님이 채팅 이름을 \'$chatname\' 으로 바꿈'; + } + + @override + String changedTheChatPermissions(String username) { + return '$username님이 채팅 권한을 바꿈'; + } + + @override + String changedTheDisplaynameTo(String username, String displayname) { + return '$username님이 닉네임을 \'$displayname\' 로 바꿈'; + } + + @override + String changedTheGuestAccessRules(String username) { + return '$username님이 게스트 접근 규칙을 변경함'; + } + + @override + String changedTheGuestAccessRulesTo(String username, String rules) { + return '$username님이 게스트 접근 규칙을 $rules 로 변경함'; + } + + @override + String changedTheHistoryVisibility(String username) { + return '$username님이 대화 기록 설정을 변경함'; + } + + @override + String changedTheHistoryVisibilityTo(String username, String rules) { + return '$username님이 대화 기록 설정을 $rules 로 바꿈'; + } + + @override + String changedTheJoinRules(String username) { + return '$username님이 참가 규칙을 바꿈'; + } + + @override + String changedTheJoinRulesTo(String username, String joinRules) { + return '$username님이 참가 규칙을 $joinRules 로 바꿈'; + } + + @override + String changedTheProfileAvatar(String username) { + return '$username님이 자신의 아바타를 바꿈'; + } + + @override + String changedTheRoomAliases(String username) { + return '$username님이 방 별명을 바꿈'; + } + + @override + String changedTheRoomInvitationLink(String username) { + return '$username님이 초대 링크를 바꿈'; + } + + @override + String get changePassword => '비밀번호 바꾸기'; + + @override + String get changeTheHomeserver => '홈서버 바꾸기'; + + @override + String get changeTheme => '스타일 바꾸기'; + + @override + String get changeTheNameOfTheGroup => '채팅의 이름 바꾸기'; + + @override + String get changeYourAvatar => '아바타 바꾸기'; + + @override + String get channelCorruptedDecryptError => '암호화가 손상되었습니다'; + + @override + String get chat => '채팅'; + + @override + String get yourChatBackupHasBeenSetUp => '당신의 채팅 백업이 설정되었습니다.'; + + @override + String get chatBackup => '채팅 백업'; + + @override + String get chatBackupDescription => + '당신의 오래된 메시지는 보안 키로 보호됩니다. 이 키를 잃어버리지 마세요.'; + + @override + String get chatDetails => '채팅 정보'; + + @override + String get chatHasBeenAddedToThisSpace => '이 스페이스에 채팅이 추가되었습니다'; + + @override + String get chats => '채팅'; + + @override + String get chooseAStrongPassword => '안전한 비밀번호를 설정하세요'; + + @override + String get clearArchive => '저장 지우기'; + + @override + String get close => '닫기'; + + @override + String get commandHint_markasdm => 'Matrix ID를 위한 다이렉트 메시지 방으로 표시'; + + @override + String get commandHint_markasgroup => '그룹 채팅으로 만들기'; + + @override + String get commandHint_ban => '이 방에서 주어진 유저 영구 추방하기'; + + @override + String get commandHint_clearcache => '캐시 지우기'; + + @override + String get commandHint_create => + '빈 그룹 채팅을 생성\n--no-encryption을 사용해 암호화를 비활성화'; + + @override + String get commandHint_discardsession => '세션 삭제'; + + @override + String get commandHint_dm => '다이렉트 채팅 시작\t\n--no-encryption을 사용해 암호화 비활성화'; + + @override + String get commandHint_html => 'HTML 형식의 문자 보내기'; + + @override + String get commandHint_invite => '주어진 유저 이 룸에 초대하기'; + + @override + String get commandHint_join => '주어진 방 참가하기'; + + @override + String get commandHint_kick => '주어진 유저 방에서 삭제하기'; + + @override + String get commandHint_leave => '이 룸 나가기'; + + @override + String get commandHint_me => '자신을 소개하세요'; + + @override + String get commandHint_myroomavatar => '이 방의 사진 설정하기 (by mxc-uri)'; + + @override + String get commandHint_myroomnick => '이 방의 표시 이름 설정하기'; + + @override + String get commandHint_op => '주어진 유저의 권한 레벨 설정 (기본:50)'; + + @override + String get commandHint_plain => '형식이 지정되지 않은 문자 보내기'; + + @override + String get commandHint_react => '답장 반응으로 보내기'; + + @override + String get commandHint_send => '문자 보내기'; + + @override + String get commandHint_unban => '주어진 유저를 이 방에서 영구추방 해제하기'; + + @override + String get commandInvalid => '잘못된 명령어'; + + @override + String commandMissing(String command) { + return '$command 는 명령어가 아닙니다.'; + } + + @override + String get compareEmojiMatch => '아래의 이모지가 일치하는지 비교하세요'; + + @override + String get compareNumbersMatch => '아래의 숫자가 일치하는지 비교하세요'; + + @override + String get configureChat => '채팅 설정'; + + @override + String get confirm => '확인'; + + @override + String get connect => '연결'; + + @override + String get contactHasBeenInvitedToTheGroup => '연락처가 채팅에 초대되었습니다'; + + @override + String get containsDisplayName => '내 닉네임 포함'; + + @override + String get containsUserName => '내 아이디 포함'; + + @override + String get contentHasBeenReported => '콘텐츠가 서버 운영자에게 신고되었습니다'; + + @override + String get copiedToClipboard => '클립보드에 복사됨'; + + @override + String get copy => '복사'; + + @override + String get copyToClipboard => '클립보드에 복사'; + + @override + String couldNotDecryptMessage(String error) { + return '메시지 복호화할 수 없음: $error'; + } + + @override + String countParticipants(int count) { + return '$count 참여자'; + } + + @override + String get create => '생성'; + + @override + String createdTheChat(String username) { + return '💬 $username님이 채팅을 생성함'; + } + + @override + String get createGroup => '새 그룹 채팅'; + + @override + String get createNewSpace => '새로운 스페이스'; + + @override + String get currentlyActive => '현재 활동 중'; + + @override + String get darkTheme => '다크'; + + @override + String dateAndTimeOfDay(String date, String timeOfDay) { + return '$date, $timeOfDay'; + } + + @override + String dateWithoutYear(String month, String day) { + return '$month-$day'; + } + + @override + String dateWithYear(String year, String month, String day) { + return '$year-$month-$day'; + } + + @override + String get deactivateAccountWarning => + '이것은 당신의 계정을 비활성화할 것입니다. 이것은 되돌릴 수 없습니다! 확실한가요?'; + + @override + String get defaultPermissionLevel => '새로 참가하는 유저들의 기본 권한 레벨'; + + @override + String get delete => '삭제'; + + @override + String get deleteAccount => '계정 삭제'; + + @override + String get deleteMessage => '메시지 삭제'; + + @override + String get device => '기기'; + + @override + String get deviceId => '기기 ID'; + + @override + String get devices => '기기'; + + @override + String get directChats => '다이렉트 채팅'; + + @override + String get allRooms => '모든 그룹 채팅'; + + @override + String get displaynameHasBeenChanged => '표시 이름이 변경되었습니다'; + + @override + String get downloadFile => '파일 다운로드'; + + @override + String get edit => '수정'; + + @override + String get editBlockedServers => '차단된 서버 수정'; + + @override + String get chatPermissions => '채팅 권한'; + + @override + String get editDisplayname => '표시 이름 수정'; + + @override + String get editRoomAliases => '방 별명 수정'; + + @override + String get editRoomAvatar => '방 아바타 수정'; + + @override + String get emoteExists => '이모트가 이미 존재합니다!'; + + @override + String get emoteInvalid => '올바르지 않은 이모트 단축키!'; + + @override + String get emoteKeyboardNoRecents => '최근 사용한 이모트가 여기 나타납니다...'; + + @override + String get emotePacks => '방을 위한 이모트 팩'; + + @override + String get emoteSettings => '이모트 설정'; + + @override + String get globalChatId => '글로벌 채팅 ID'; + + @override + String get accessAndVisibility => '채팅 가입과 대화 기록'; + + @override + String get accessAndVisibilityDescription => + '채팅에 참가 할 수 있는 사람과 채팅을 볼 수 있는 범위'; + + @override + String get calls => '전화'; + + @override + String get customEmojisAndStickers => '커스텀 이모지와 스티커'; + + @override + String get customEmojisAndStickersBody => + '모든 채팅에서 사용할 수있는 커스텀 이모지와 스티커를 추가하거나 공유합니다.'; + + @override + String get emoteShortcode => '이모트 단축키'; + + @override + String get emoteWarnNeedToPick => '이모트 단축키와 이미지를 골라야 합니다!'; + + @override + String get emptyChat => '빈 채팅'; + + @override + String get enableEmotesGlobally => '이모트 팩 항상 사용하기'; + + @override + String get enableEncryption => '암호화 사용'; + + @override + String get enableEncryptionWarning => '당신은 다시 암호화를 비활성화할 수 없습니다. 확실한가요?'; + + @override + String get encrypted => '암호화됨'; + + @override + String get encryption => '암호화'; + + @override + String get encryptionNotEnabled => '암호화가 비활성화됨'; + + @override + String endedTheCall(String senderName) { + return '$senderName 이 통화를 종료했습니다'; + } + + @override + String get enterAnEmailAddress => '이메일 주소 입력'; + + @override + String get homeserver => '홈서버'; + + @override + String get enterYourHomeserver => '당신의 홈서버를 입력하세요'; + + @override + String errorObtainingLocation(String error) { + return '위치 얻는 중 오류: $error'; + } + + @override + String get everythingReady => '모든 것이 준비됐어요!'; + + @override + String get extremeOffensive => '매우 공격적임'; + + @override + String get fileName => '파일 이름'; + + @override + String get fluffychat => 'FluffyChat'; + + @override + String get fontSize => '폰트 크기'; + + @override + String get forward => '전달'; + + @override + String get fromJoining => '참가시점 이후로'; + + @override + String get fromTheInvitation => '초대받은 후부터'; + + @override + String get goToTheNewRoom => '새로운 방 가기'; + + @override + String get group => '그룹 채팅'; + + @override + String get chatDescription => '채팅 설명'; + + @override + String get chatDescriptionHasBeenChanged => '채팅 설명 변경됨'; + + @override + String get groupIsPublic => '그룹 채팅 공개'; + + @override + String get groups => '그룹 채팅'; + + @override + String groupWith(String displayname) { + return '$displayname님과의 그룹'; + } + + @override + String get guestsAreForbidden => '게스트가 들어올 수 없음'; + + @override + String get guestsCanJoin => '게스트가 참가할 수 있음'; + + @override + String hasWithdrawnTheInvitationFor(String username, String targetName) { + return '$username님이 $targetName님에 대한 초대를 철회함'; + } + + @override + String get help => '도움'; + + @override + String get hideRedactedEvents => '지워진 이벤트 숨기기'; + + @override + String get hideRedactedMessages => '삭제된 메시지 숨기기'; + + @override + String get hideRedactedMessagesBody => '누군가가 메시지를 삭제하면 메시지를 더 이상 볼 수 없습니다.'; + + @override + String get hideInvalidOrUnknownMessageFormats => '잘못되거나 알 수 없는 메시지 형식 숨김'; + + @override + String get howOffensiveIsThisContent => '이 콘텐츠가 얼마나 모욕적인가요?'; + + @override + String get id => 'ID'; + + @override + String get identity => '신원'; + + @override + String get block => '차단'; + + @override + String get blockedUsers => '차단된 유저'; + + @override + String get blockListDescription => + '당신은 당신을 방해하는 유저들을 차단할 수 있습니다. 당신은 당신의 개인 차단 목록에 있는 어떠한 유저의 메시지와 방 초대도 받지 않을것 입니다.'; + + @override + String get blockUsername => '유저 이름 무시'; + + @override + String get iHaveClickedOnLink => '링크를 클릭했어요'; + + @override + String get incorrectPassphraseOrKey => '올바르지 않은 복구 키나 비밀번호'; + + @override + String get inoffensive => '모욕적이지 않음'; + + @override + String get inviteContact => '연락처 초대'; + + @override + String inviteContactToGroupQuestion(Object contact, Object groupName) { + return '$contact 를 \"$groupName\"에 초대할까요?'; + } + + @override + String inviteContactToGroup(String groupName) { + return '연락처를 $groupName에 초대'; + } + + @override + String get noChatDescriptionYet => '채팅 설명이 아직 추가되지 않음.'; + + @override + String get tryAgain => '다시 시도하기'; + + @override + String get invalidServerName => '잘못된 서버 이름'; + + @override + String get invited => '초대됨'; + + @override + String get redactMessageDescription => + '메시지는 이 대화의 모든 참여자에게 삭제될 것 입니다. 되돌릴 수 없습니다.'; + + @override + String get optionalRedactReason => '(선택) 이 메시지를 편집하는 이유...'; + + @override + String invitedUser(String username, String targetName) { + return '📩 $username님이 $targetName님을 초대함'; + } + + @override + String get invitedUsersOnly => '초대된 유저만'; + + @override + String get inviteForMe => '초대됨'; + + @override + String inviteText(String username, String link) { + return '$username님이 당신을 FluffyChat에 초대했습니다.\n1. FluffyChat 설치: https://fluffychat.im \n2. 가입하거나 로그인 \n3. 초대 링크 열기: \n $link'; + } + + @override + String get isTyping => '입력 중…'; + + @override + String joinedTheChat(String username) { + return '👋 $username님이 채팅에 참가함'; + } + + @override + String get joinRoom => '방 참가하기'; + + @override + String kicked(String username, String targetName) { + return '👞 $username님이 $targetName님을 추방함'; + } + + @override + String kickedAndBanned(String username, String targetName) { + return '🙅 $username님이 $targetName님을 추방하고 차단함'; + } + + @override + String get kickFromChat => '채팅에서 추방'; + + @override + String lastActiveAgo(String localizedTimeShort) { + return '마지막 활동: $localizedTimeShort'; + } + + @override + String get leave => '나가기'; + + @override + String get leftTheChat => '채팅을 나갔습니다'; + + @override + String get license => '라이선스'; + + @override + String get lightTheme => '라이트'; + + @override + String loadCountMoreParticipants(int count) { + return '$count명의 참가자 더 표시'; + } + + @override + String get dehydrate => '세션을 내보내고 기기 초기화 하기'; + + @override + String get dehydrateWarning => '이 동작은 되돌릴 수 없습니다. 백업 파일을 꼭 안전하게 보관하세요.'; + + @override + String get dehydrateTor => 'TOR 사용자: 세션 내보내기'; + + @override + String get dehydrateTorLong => 'TOR 사용자들은 창을 닫기 전에 세션을 내보내는것이 권장됩니다.'; + + @override + String get hydrateTor => 'TOR 사용자: 내보낸 세션 불러오기'; + + @override + String get hydrateTorLong => '지난 TOR 이용에서 세션을 내보내셨나요? 빠르게 불러오고 채팅을 계속하세요.'; + + @override + String get hydrate => '백업 파일로부터 가져오기'; + + @override + String get loadingPleaseWait => '로딩 중... 기다려 주세요.'; + + @override + String get loadMore => '더 불러오기…'; + + @override + String get locationDisabledNotice => '위치 서비스가 비활성화되었습니다. 위치를 공유하려면 활성화시켜주세요.'; + + @override + String get locationPermissionDeniedNotice => + '위치 권한이 거부되었습니다. 위치를 공유하기 위해서 허용해주세요.'; + + @override + String get login => '로그인'; + + @override + String logInTo(String homeserver) { + return '$homeserver 에 로그인'; + } + + @override + String get logout => '로그아웃'; + + @override + String get memberChanges => '참가자 변경'; + + @override + String get mention => '멘션'; + + @override + String get messages => '메시지'; + + @override + String get messagesStyle => '메세지:'; + + @override + String get moderator => '관리자'; + + @override + String get muteChat => '채팅 음소거'; + + @override + String get needPantalaimonWarning => + '지금 종단간 암호화를 사용하기 위해서는 Pantalaimon이 필요하다는 것을 알아주세요.'; + + @override + String get newChat => '새 채팅'; + + @override + String get newMessageInFluffyChat => '💬 FluffyChat에서 새로운 메시지'; + + @override + String get newVerificationRequest => '새로운 확인 요청!'; + + @override + String get next => '다음'; + + @override + String get no => '아니요'; + + @override + String get noConnectionToTheServer => '서버에 연결 없음'; + + @override + String get noEmotesFound => '이모트 발견되지 않음. 😕'; + + @override + String get noEncryptionForPublicRooms => + '당신은 방이 공개적으로 접근 가능하지 않을 때만 암호화를 켤 수 있습니다.'; + + @override + String get noGoogleServicesWarning => + '이 휴대폰에 Firebase Cloud Messaging 서비스가 없는 것 같습니다. FluffyChat에서 푸시 알림을 받으려면 ntfy 사용을 추천합니다. ntfy 혹은 다른 푸시 알림 제공자를 사용하면 알림을 보안적인 방법으로 받을 수 있습니다. ntfy는 PlayStore와 F-Droid에서 설치 가능합니다.'; + + @override + String noMatrixServer(String server1, String server2) { + return '$server1은 matrix 서버가 아닙니다, $server2를 대신 사용할까요?'; + } + + @override + String get shareInviteLink => '초대 링크 공유'; + + @override + String get scanQrCode => 'QR 코드 스캔'; + + @override + String get none => '없음'; + + @override + String get noPasswordRecoveryDescription => '당신은 비밀번호를 복구할 방법을 추가하지 않았습니다.'; + + @override + String get noPermission => '권한 없음'; + + @override + String get noRoomsFound => '아무 방도 발견되지 않았어요…'; + + @override + String get notifications => '알림'; + + @override + String get notificationsEnabledForThisAccount => '이 계정에서 알림이 활성화되었습니다'; + + @override + String numUsersTyping(int count) { + return '$count명이 입력 중…'; + } + + @override + String get obtainingLocation => '위치 얻는 중…'; + + @override + String get offensive => '모욕적임'; + + @override + String get offline => '오프라인'; + + @override + String get ok => '확인'; + + @override + String get online => '온라인'; + + @override + String get onlineKeyBackupEnabled => '온라인 키 백업이 활성화됨'; + + @override + String get oopsPushError => '앗! 안타깝게도, 푸시 알림을 설정하는 중 오류가 발생했습니다.'; + + @override + String get oopsSomethingWentWrong => '앗, 무언가가 잘못되었습니다…'; + + @override + String get openAppToReadMessages => '앱을 열어서 메시지를 읽으세요'; + + @override + String get openCamera => '카메라 열기'; + + @override + String get openVideoCamera => '영상용 카메라 열기'; + + @override + String get oneClientLoggedOut => '당신의 클라이언트 중 하나가 로그아웃 됨'; + + @override + String get addAccount => '계정 추가'; + + @override + String get editBundlesForAccount => '이 계정의 번들 수정'; + + @override + String get addToBundle => '번들에 추가'; + + @override + String get removeFromBundle => '이 번들에서 삭제'; + + @override + String get bundleName => '번들 이름'; + + @override + String get enableMultiAccounts => '(베타) 이 기기에서 다중 계정 활성화'; + + @override + String get openInMaps => '지도에서 열기'; + + @override + String get link => '링크'; + + @override + String get serverRequiresEmail => '이 서버는 가입을 위해 당신의 이메일을 확인해야 합니다.'; + + @override + String get or => '이나'; + + @override + String get participant => '참여자'; + + @override + String get passphraseOrKey => '비밀번호나 복구 키'; + + @override + String get password => '비밀번호'; + + @override + String get passwordForgotten => '비밀번호 까먹음'; + + @override + String get passwordHasBeenChanged => '비밀번호가 변경됨'; + + @override + String get hideMemberChangesInPublicChats => '공개 채팅에서의 참가자 변화 숨김'; + + @override + String get hideMemberChangesInPublicChatsBody => + '공개 채팅에 누군가가 참가하거나 떠날때 타임라인에 표시하지 않습니다.'; + + @override + String get overview => '개요'; + + @override + String get notifyMeFor => '나에게 알림'; + + @override + String get passwordRecoverySettings => '비밀번호 복구 설정'; + + @override + String get passwordRecovery => '비밀번호 복구'; + + @override + String get people => '사람들'; + + @override + String get pickImage => '이미지 고르기'; + + @override + String get pin => '고정'; + + @override + String play(String fileName) { + return '$fileName 재생'; + } + + @override + String get pleaseChoose => '선택해주세요'; + + @override + String get pleaseChooseAPasscode => '비밀번호를 골라주세요'; + + @override + String get pleaseClickOnLink => '이메일의 링크를 클릭하고 진행해주세요.'; + + @override + String get pleaseEnter4Digits => '4자리 숫자를 입력하거나 앱 잠금을 사용하지 않도록 하려면 비워두세요.'; + + @override + String get pleaseEnterRecoveryKey => '당신의 복구키를 입력하세요:'; + + @override + String get pleaseEnterYourPassword => '비밀번호를 입력해주세요'; + + @override + String get pleaseEnterYourPin => 'PIN을 입력해주세요'; + + @override + String get pleaseEnterYourUsername => '유저 이름을 입력해주세요'; + + @override + String get pleaseFollowInstructionsOnWeb => '웹사이트의 가이드를 따르고 다음 버튼을 눌러주세요.'; + + @override + String get privacy => '프라이버시'; + + @override + String get publicRooms => '공개 방'; + + @override + String get pushRules => '푸시 규칙'; + + @override + String get reason => '이유'; + + @override + String get recording => '녹음'; + + @override + String redactedBy(String username) { + return '$username님이 삭제함'; + } + + @override + String get directChat => '다이렉트 채팅'; + + @override + String redactedByBecause(String username, String reason) { + return '$username님이 삭제함. 사유: \"$reason\"'; + } + + @override + String redactedAnEvent(String username) { + return '$username님이 이벤트를 지움'; + } + + @override + String get redactMessage => '메시지 지우기'; + + @override + String get register => '가입'; + + @override + String get reject => '거절'; + + @override + String rejectedTheInvitation(String username) { + return '$username님이 초대를 거절함'; + } + + @override + String get rejoin => '다시 참가'; + + @override + String get removeAllOtherDevices => '모든 다른 기기에서 지우기'; + + @override + String removedBy(String username) { + return '$username에 의해 지워짐'; + } + + @override + String get removeDevice => '기기 삭제'; + + @override + String get unbanFromChat => '채팅에서 영구추방 해제됨'; + + @override + String get removeYourAvatar => '아바타 지우기'; + + @override + String get replaceRoomWithNewerVersion => '방 새로운 버전으로 대체하기'; + + @override + String get reply => '답장'; + + @override + String get reportMessage => '메시지 신고'; + + @override + String get translateMessage => 'Translate message'; + + @override + String get translatedMessage => 'Translated message'; + + @override + String get errorTranslatingMessage => + 'An error has occured while translating the message.'; + + @override + String get recoverMessage => 'Recover message'; + + @override + String get recoveredMessage => 'Recovered message'; + + @override + String get errorRecoveringMessage => + 'An error has occured while recovering the message.'; + + @override + String get errorRecoveringMessageNoAdmin => + 'This feature is available on Synapse homeservers only for adminstrators.'; + + @override + String get requestPermission => '권한 요청'; + + @override + String get roomHasBeenUpgraded => '방이 업그레이드되었습니다'; + + @override + String get roomVersion => '방 버전'; + + @override + String get saveFile => '파일 저장'; + + @override + String get retry => 'Retry'; + + @override + String get search => '검색'; + + @override + String get security => '보안'; + + @override + String get recoveryKey => '복구키'; + + @override + String get recoveryKeyLost => '복구키를 분실하셨나요?'; + + @override + String seenByUser(String username) { + return '$username님이 읽음'; + } + + @override + String get send => '보내기'; + + @override + String get sendAMessage => '메시지 보내기'; + + @override + String get sendAsText => '텍스트로 보내기'; + + @override + String get sendAudio => '오디오 보내기'; + + @override + String get sendFile => '파일 보내기'; + + @override + String get sendImage => '이미지 보내기'; + + @override + String sendImages(int count) { + return '이미지 $count개 보내기'; + } + + @override + String get sendMessages => '메시지 보내기'; + + @override + String get sendOriginal => '원본 보내기'; + + @override + String get sendSticker => '스티커 보내기'; + + @override + String get sendVideo => '영상 보내기'; + + @override + String sentAFile(String username) { + return '📁 $username님이 파일을 보냄'; + } + + @override + String sentAnAudio(String username) { + return '🎤 $username님이 오디오를 보냄'; + } + + @override + String sentAPicture(String username) { + return '🖼️ $username님이 사진을 보냄'; + } + + @override + String sentASticker(String username) { + return '😊 $username님이 스티커를 보냄'; + } + + @override + String sentAVideo(String username) { + return '🎥 $username님이 영상을 보냄'; + } + + @override + String sentCallInformations(String senderName) { + return '$senderName 이 통화 정보 보냄'; + } + + @override + String get separateChatTypes => '다이렉트 채팅과 그룹 채팅 분리'; + + @override + String get setAsCanonicalAlias => '주 별명으로 설정'; + + @override + String get setCustomEmotes => '맞춤 이모트 설정'; + + @override + String get setChatDescription => '채팅 설명 설정'; + + @override + String get setInvitationLink => '초대 링크 설정'; + + @override + String get setPermissionsLevel => '권한 레벨 설정'; + + @override + String get setStatus => '상태 설정'; + + @override + String get settings => '설정'; + + @override + String get share => '공유'; + + @override + String sharedTheLocation(String username) { + return '$username님이 위치를 공유함'; + } + + @override + String get shareLocation => '위치 보내기'; + + @override + String get showPassword => '비밀번호 보이기'; + + @override + String get presenceStyle => '상태:'; + + @override + String get hideAvatarsInInvites => 'Hide avatars in invites'; + + @override + String get hideAvatarsInInvitesDescription => + 'Do not show room avatars in invites'; + + @override + String get presencesToggle => '다른 유저의 상태 메시지 표시'; + + @override + String get pureBlackToggle => 'Pure Black'; + + @override + String get singlesignon => '단일 계정 로그인(SSO)'; + + @override + String get skip => '스킵'; + + @override + String get sourceCode => '소스 코드'; + + @override + String get spaceIsPublic => '스페이스 공개'; + + @override + String get spaceName => '스페이스 이름'; + + @override + String startedACall(String senderName) { + return '$senderName 가 통화 시작함'; + } + + @override + String get startFirstChat => '첫 번째 채팅을 시작하기'; + + @override + String get status => '상태'; + + @override + String get statusExampleMessage => '오늘은 어떤 기분인가요?'; + + @override + String get submit => '제출'; + + @override + String get synchronizingPleaseWait => '동기화 중... 기다려주세요.'; + + @override + String synchronizingPleaseWaitCounter(String percentage) { + return ' 동기화중… ($percentage%)'; + } + + @override + String get systemTheme => '시스템'; + + @override + String get theyDontMatch => '일치하지 않습니다'; + + @override + String get theyMatch => '일치합니다'; + + @override + String get title => 'FluffyChat'; + + @override + String get toggleFavorite => '즐겨찾기 토글'; + + @override + String get toggleMuted => '음소거 토글'; + + @override + String get toggleUnread => '메시지 안/읽음 으로 표시'; + + @override + String get tooManyRequestsWarning => '너무 많은 요청. 잠시 후에 다시 시도해주세요!'; + + @override + String get transferFromAnotherDevice => '다른 기기에서 가져오기'; + + @override + String get tryToSendAgain => '다시 보내도록 시도'; + + @override + String get unavailable => '사용할 수 없음'; + + @override + String unbannedUser(String username, String targetName) { + return '$username님이 $targetName님에대한 영구추방을 해제함'; + } + + @override + String get unblockDevice => '기기 차단 해제'; + + @override + String get unknownDevice => '알 수 없는 기기'; + + @override + String get unknownEncryptionAlgorithm => '알 수 없는 암호화 알고리즘'; + + @override + String unknownEvent(String type) { + return '알 수 없는 이벤트 \'$type\''; + } + + @override + String get unmuteChat => '음소거 해제'; + + @override + String get unpin => '고정 해제'; + + @override + String unreadChats(int unreadCount) { + String _temp0 = intl.Intl.pluralLogic( + unreadCount, + locale: localeName, + other: '$unreadCount 개', + one: '읽지 않은 채팅 1', + ); + return '$_temp0'; + } + + @override + String userAndOthersAreTyping(String username, int count) { + return '$username님 + $count명이 입력 중…'; + } + + @override + String userAndUserAreTyping(String username, String username2) { + return '$username님과 $username2님이 입력 중…'; + } + + @override + String userIsTyping(String username) { + return '$username님이 입력 중…'; + } + + @override + String userLeftTheChat(String username) { + return '🚪 $username님이 채팅을 나감'; + } + + @override + String get username => '유저 이름'; + + @override + String userSentUnknownEvent(String username, String type) { + return '$username님이 $type 이벤트 보냄'; + } + + @override + String get unverified => '확인되지 않음'; + + @override + String get verified => '확인됨'; + + @override + String get verify => '확인'; + + @override + String get verifyStart => '확인 시작'; + + @override + String get verifySuccess => '성공적으로 확인했어요!'; + + @override + String get verifyTitle => '다른 계정 확인 중'; + + @override + String get videoCall => '영상 통화'; + + @override + String get visibilityOfTheChatHistory => '대화 기록 설정'; + + @override + String get visibleForAllParticipants => '모든 참가자에게 보임'; + + @override + String get visibleForEveryone => '모두에게 보임'; + + @override + String get voiceMessage => '음성 메시지'; + + @override + String get waitingPartnerAcceptRequest => '상대가 요청을 수락하길 기다리는 중…'; + + @override + String get waitingPartnerEmoji => '상대가 이모지를 수락하길 기다리는 중…'; + + @override + String get waitingPartnerNumbers => '상대가 숫자를 수락하길 기다리는 중…'; + + @override + String get wallpaper => '배경:'; + + @override + String get warning => '경고!'; + + @override + String get weSentYouAnEmail => '우리가 당신에게 이메일을 보냈습니다'; + + @override + String get whoCanPerformWhichAction => '누가 어떤 행동을 할 수 있는지'; + + @override + String get whoIsAllowedToJoinThisGroup => '참가 제한 설정'; + + @override + String get whyDoYouWantToReportThis => '왜 이것을 신고하려고 하나요?'; + + @override + String get wipeChatBackup => '새로운 복구키를 생성하기 위해 채팅 백업을 초기화할까요?'; + + @override + String get withTheseAddressesRecoveryDescription => + '이 주소로 당신의 비밀번호를 복구할 수 있습니다.'; + + @override + String get writeAMessage => '메시지 작성…'; + + @override + String get yes => '확인'; + + @override + String get you => '당신'; + + @override + String get youAreNoLongerParticipatingInThisChat => + '당신은 더 이상 이 채팅에 참여하지 않습니다'; + + @override + String get youHaveBeenBannedFromThisChat => '당신은 이 채팅에서 영구 추방되었습니다'; + + @override + String get yourPublicKey => '당신의 공개 키'; + + @override + String get messageInfo => '메시지 정보'; + + @override + String get time => '시간'; + + @override + String get messageType => '메시지 유형'; + + @override + String get sender => '발신자'; + + @override + String get openGallery => '갤러리 열기'; + + @override + String get removeFromSpace => '스페이스에서 삭제'; + + @override + String get addToSpaceDescription => '이 채팅을 추가할 스페이스를 선택하세요.'; + + @override + String get start => '시작'; + + @override + String get pleaseEnterRecoveryKeyDescription => + '오래된 메시지를 잠금 해제하려면, 이전 세션에서 생성된 복호화 키를 입력하세요. 복호화 키는 비밀번호가 아닙니다.'; + + @override + String get publish => '공개'; + + @override + String videoWithSize(String size) { + return '영상 ($size)'; + } + + @override + String get openChat => '채팅 열기'; + + @override + String get markAsRead => '읽음으로 표시하기'; + + @override + String get reportUser => '유저 신고'; + + @override + String get dismiss => '닫기'; + + @override + String reactedWith(String sender, String reaction) { + return '$sender가 $reaction로 반응함'; + } + + @override + String get pinMessage => '방에 고정'; + + @override + String get confirmEventUnpin => '이벤트를 영구적으로 고정 해제할 것이 확실한가요?'; + + @override + String get emojis => '이모지'; + + @override + String get placeCall => '전화 걸기'; + + @override + String get voiceCall => '음성 통화'; + + @override + String get unsupportedAndroidVersion => '지원되지 않는 안드로이드 버전'; + + @override + String get unsupportedAndroidVersionLong => + '이 기능은 새로운 안드로이드 버전을 요구합니다. Lineage OS 지원이나 업데이트를 확인해주세요.'; + + @override + String get videoCallsBetaWarning => + '영상 통화는 베타임을 확인해주세요. 의도한 대로 작동하지 않거나 모든 플랫폼에서 작동하지 않을 수 있습니다.'; + + @override + String get experimentalVideoCalls => '실험적인 영상 통화'; + + @override + String get emailOrUsername => '이메일이나 유저 이름'; + + @override + String get indexedDbErrorTitle => '사생활 보호 모드의 문제'; + + @override + String get indexedDbErrorLong => + '메시지 저장은 기본적으로 사생활 보호 모드에서 사용할 수 없습니다.\n- about:config 로 이동\n- dom.indexedDB.privateBrowsing.enabled 를 true로 설정\n그렇지 않으면 FluffyChat을 실행할 수 없습니다.'; + + @override + String switchToAccount(String number) { + return '계정 $number로 전환'; + } + + @override + String get nextAccount => '다음 계정'; + + @override + String get previousAccount => '이전 계정'; + + @override + String get addWidget => '위젯 추가'; + + @override + String get widgetVideo => '영상'; + + @override + String get widgetEtherpad => '텍스트 메모'; + + @override + String get widgetJitsi => 'Jitsi Meet'; + + @override + String get widgetCustom => '사용자 정의'; + + @override + String get widgetName => '이름'; + + @override + String get widgetUrlError => '유효한 URL이 아닙니다.'; + + @override + String get widgetNameError => '표시 이름을 입력하세요.'; + + @override + String get errorAddingWidget => '위젯 추가중 오류 발생.'; + + @override + String get youRejectedTheInvitation => '초대를 거부했습니다'; + + @override + String get youJoinedTheChat => '채팅에 참가하였습니다'; + + @override + String get youAcceptedTheInvitation => '👍 초대를 수락했습니다'; + + @override + String youBannedUser(String user) { + return '$user님을 영구 추방함'; + } + + @override + String youHaveWithdrawnTheInvitationFor(String user) { + return '$user님에 대한 초대를 철회함'; + } + + @override + String youInvitedToBy(String alias) { + return '📩 링크를 통해 초대되셨습니다:\n$alias'; + } + + @override + String youInvitedBy(String user) { + return '📩 $user님에 의해 초대되었습니다'; + } + + @override + String invitedBy(String user) { + return '📩 $user님이 나를 초대함'; + } + + @override + String youInvitedUser(String user) { + return '📩 $user님을 초대했습니다'; + } + + @override + String youKicked(String user) { + return '👞 $user님을 추방했습니다'; + } + + @override + String youKickedAndBanned(String user) { + return '🙅 $user님을 영구 추방했습니다'; + } + + @override + String youUnbannedUser(String user) { + return '$user님의 영구 추방을 해제했습니다'; + } + + @override + String hasKnocked(String user) { + return '🚪 $user님이 참가를 요청했습니다'; + } + + @override + String get usersMustKnock => '유저들이 참가를 허가받아야함'; + + @override + String get noOneCanJoin => '아무도 참가할 수 없음'; + + @override + String userWouldLikeToChangeTheChat(String user) { + return '$user님이 참가를 희망합니다.'; + } + + @override + String get noPublicLinkHasBeenCreatedYet => '공개 링크가 아직 생성되지 않았음'; + + @override + String get knock => '참가 요청'; + + @override + String get users => '유저'; + + @override + String get unlockOldMessages => '오래된 메시지 잠금 해제하기'; + + @override + String get storeInSecureStorageDescription => '이 기기의 보안 스토리지에 복구키를 저장합니다.'; + + @override + String get saveKeyManuallyDescription => '공유나 클립보드를 이용해 수동으로 키를 저장합니다.'; + + @override + String get storeInAndroidKeystore => 'Android KeyStore에 저장하기'; + + @override + String get storeInAppleKeyChain => 'Apple KeyChain에 저장하기'; + + @override + String get storeSecurlyOnThisDevice => '이 기기에 안전하게 저장'; + + @override + String countFiles(int count) { + return '$count개의 파일'; + } + + @override + String get user => '유저'; + + @override + String get custom => '커스텀'; + + @override + String get foregroundServiceRunning => '이 알림은 백그라운드 서비스가 실행중일때 표시됩니다.'; + + @override + String get screenSharingTitle => '화면 공유'; + + @override + String get screenSharingDetail => 'FluffyChat에 당신의 화면을 공유하는중'; + + @override + String get callingPermissions => '통화 권한'; + + @override + String get callingAccount => '통화 계정'; + + @override + String get callingAccountDetails => 'FluffyChat이 android 전화앱을 사용 할 수 있도록 허가.'; + + @override + String get appearOnTop => '상단에 표시'; + + @override + String get appearOnTopDetails => + '앱이 상단에 표시되도록 허용 (이미 FluffyChat을 통화 계정으로 설정한 경우에는 필요하지 않음)'; + + @override + String get otherCallingPermissions => '마이크, 카메라 그리고 다름 FluffyChat 권한'; + + @override + String get whyIsThisMessageEncrypted => '왜 이 메시지를 읽을 수 없나요?'; + + @override + String get noKeyForThisMessage => + '이것은 이 메시지가 당신이 이 기기를 서명하기 전에 발송되었기 때문에 일어났을 수 있습니다.\n\n이것은 또한 발송자가 당신의 기기를 차단하였거나 혹은 인터넷 연결이 잘못되었을 수 있습니다.\n\n다른 세션에서 이 메시지를 읽을 수 있나요? 그렇다면 그 메시지를 옮길 수 있습니다! 설정 > 기기로 가서 기기를 서로 증명하세요. 다음번에 방을 열었을 때 두 세션이 모두 작동중이라면, 키가 자동으로 옮겨질것입니다.\n\n로그아웃하거나 기기를 바꿀 때 키를 잃고싶지 않으신가요? 설정에서 채팅 백업을 사용중인지 확인하세요.'; + + @override + String get newGroup => '새 그룹 채팅'; + + @override + String get newSpace => '새 스페이스'; + + @override + String get enterSpace => '스페이스에 입장'; + + @override + String get enterRoom => '방에 입장'; + + @override + String get allSpaces => '모든 스페이스'; + + @override + String numChats(String number) { + return '$number개의 채팅'; + } + + @override + String get hideUnimportantStateEvents => '중요하지 않은 상태 이벤트 숨기기'; + + @override + String get hidePresences => '상태 목록을 숨길까요?'; + + @override + String get doNotShowAgain => '다시 보지 않기'; + + @override + String wasDirectChatDisplayName(String oldDisplayName) { + return '빈 채팅 (전 $oldDisplayName)'; + } + + @override + String get newSpaceDescription => + '스페이스를 사용하면 채팅을 통합하고 비공개 또는 공개 커뮤니티를 구축할 수 있습니다.'; + + @override + String get encryptThisChat => '이 채팅을 암호화'; + + @override + String get disableEncryptionWarning => + '보안상의 이유로 암호화가 활성화된 채팅에서 암호화를 비활성화 할 수 없습니다.'; + + @override + String get sorryThatsNotPossible => '죄송합니다...그것은 불가능합니다'; + + @override + String get deviceKeys => '기기 키:'; + + @override + String get reopenChat => '채팅 다시 열기'; + + @override + String get noBackupWarning => + '경고! 채팅 백업을 켜지 않을경우, 당신은 암호화된 메시지에 대한 접근권한을 잃을것 입니다. 로그아웃 하기 전에 채팅을 백업하는것이 강력히 권장됩니다.'; + + @override + String get noOtherDevicesFound => '다른 기기 발견되지 않음'; + + @override + String fileIsTooBigForServer(String max) { + return '전송에 실패했습니다. 서버는 $max가 넘는 파일을 지원하지 않습니다.'; + } + + @override + String fileHasBeenSavedAt(String path) { + return '$path에 파일 저장됨'; + } + + @override + String get jumpToLastReadMessage => '마지막으로 읽은 메시지로 이동'; + + @override + String get readUpToHere => '여기까지 읽음'; + + @override + String get jump => '점프'; + + @override + String get openLinkInBrowser => '브라우저에서 링크 열기'; + + @override + String get reportErrorDescription => + '😭 이런. 무언가 잘못되었습니다. 원한다면, 개발자에게 버그를 신고할 수 있습니다.'; + + @override + String get report => '신고'; + + @override + String get signInWithPassword => '비밀번호로 로그인'; + + @override + String get pleaseTryAgainLaterOrChooseDifferentServer => + '나중에 다시 시도하거나 다른 서버를 선택하십시오.'; + + @override + String signInWith(String provider) { + return '$provider로 로그인'; + } + + @override + String get profileNotFound => + '유저를 서버에서 찾을 수 있습니다. 연결 문제가 있거나 유저가 존재하지 않을 수 있습니다.'; + + @override + String get setTheme => '테마 설정:'; + + @override + String get setColorTheme => '색상 테마 설정:'; + + @override + String get invite => '초대'; + + @override + String get inviteGroupChat => '📨 그룹 채팅에 초대'; + + @override + String get invitePrivateChat => '📨 비공개 채팅에 초대'; + + @override + String get invalidInput => '잘못된 입력!'; + + @override + String wrongPinEntered(int seconds) { + return '잘못된 pin입니다! $seconds초 후에 다시 시도하세요...'; + } + + @override + String get pleaseEnterANumber => '0보다 큰 숫자를 입력하세요'; + + @override + String get archiveRoomDescription => + '채팅이 보관함으로 이동합니다. 다른 유저들은 당신이 떠난다는것을 볼 수 있습니다.'; + + @override + String get roomUpgradeDescription => + '채팅이 새로운 방 버전으로 다시 생성됩니다. 모든 참가자는 새로운 채팅으로 전환해야합니다. https://spec.matrix.org/latest/rooms/ 에서 방 버전에 대해 자세히 알아볼 수 있습니다.'; + + @override + String get removeDevicesDescription => '이 기기에서 로그아웃되며 더 이상 메시지를 받을 수 없습니다.'; + + @override + String get banUserDescription => + '유저는 채팅에서 영구 추방되며 추방 해제 전까지 채팅을 다시 입력할 수 없습니다.'; + + @override + String get unbanUserDescription => '유저가 다시 채팅을 입력할 수 있습니다.'; + + @override + String get kickUserDescription => + '유저는 채팅에서 추방되지만 영구 추방되지 않습니다. 공개 채팅의 경우, 언제든 유저가 다시 참가할 수 있습니다.'; + + @override + String get makeAdminDescription => + '유저를 한 번 관리자로 만들면, 당신과 같은 권한을 가지기때문에 권한 회수가 불가능합니다.'; + + @override + String get pushNotificationsNotAvailable => '푸시 알림 사용 불가'; + + @override + String get learnMore => '더 알아보기'; + + @override + String get yourGlobalUserIdIs => '글로벌 유저 ID: '; + + @override + String noUsersFoundWithQuery(String query) { + return '안타깝게도 \"$query\"로 유저를 찾을 수 없습니다. 오타가 없는지 확인하십시오.'; + } + + @override + String get knocking => '참가 요청중'; + + @override + String chatCanBeDiscoveredViaSearchOnServer(String server) { + return '채팅은 $server 에서 검색하여 찾을 수 있습니다.'; + } + + @override + String get searchChatsRooms => '#chats, @users 검색...'; + + @override + String get nothingFound => '아무것도 찾지 못했습니다...'; + + @override + String get groupName => '그룹 채팅 이름'; + + @override + String get createGroupAndInviteUsers => '그룹 채팅을 생성하고 유저를 초대'; + + @override + String get groupCanBeFoundViaSearch => '검색으로 그룹 채팅을 찾을 수 있음'; + + @override + String get wrongRecoveryKey => '죄송합니다... 올바른 복구키가 아닌것 같습니다.'; + + @override + String get startConversation => '대화 시작'; + + @override + String get commandHint_sendraw => 'raw json 전송'; + + @override + String get databaseMigrationTitle => '데이터베이스가 최적화됨'; + + @override + String get databaseMigrationBody => '잠시만 기다리세요. 시간이 걸릴 수 있습니다.'; + + @override + String get leaveEmptyToClearStatus => '비워서 상태를 지우세요.'; + + @override + String get select => '선택'; + + @override + String get searchForUsers => '@users 검색...'; + + @override + String get pleaseEnterYourCurrentPassword => '현재 비밀번호 입력'; + + @override + String get newPassword => '새 비밀번호'; + + @override + String get pleaseChooseAStrongPassword => '강력한 비밀번호를 사용하세요'; + + @override + String get passwordsDoNotMatch => '비밀번호가 일치하지 않습니다'; + + @override + String get passwordIsWrong => '비밀번호가 틀립니다'; + + @override + String get publicLink => '공개 링크'; + + @override + String get publicChatAddresses => '공개 채팅 주소'; + + @override + String get createNewAddress => '새 주소 만들기'; + + @override + String get joinSpace => '스페이스 참가'; + + @override + String get publicSpaces => '공개 스페이스들'; + + @override + String get addChatOrSubSpace => '채팅 또는 하위 스페이스 추가'; + + @override + String get subspace => '하위 스페이스'; + + @override + String get decline => '거절'; + + @override + String get thisDevice => '이 기기:'; + + @override + String get initAppError => '앱 초기화중 오류 발생'; + + @override + String get userRole => '유저 역할'; + + @override + String minimumPowerLevel(String level) { + return '$level은 최소 권한 레벨입니다.'; + } + + @override + String searchIn(String chat) { + return '$chat에서 검색...'; + } + + @override + String get searchMore => '더 검색...'; + + @override + String get gallery => '갤러리'; + + @override + String get files => '파일'; + + @override + String databaseBuildErrorBody(String url, String error) { + return 'SQlite 데이터베이스를 구축할 수 없습니다. 현재 레거시 데이터베이스 사용을 시도중입니다. $url 에서 개발자에게 오류를 신고하세요. 오류 메시지는 다음과 같습니다: $error'; + } + + @override + String sessionLostBody(String url, String error) { + return '세션을 잃었습니다. $url 에서 개발자에게 오류를 신고하세요. 오류 메시지는 다음과 같습니다: $error'; + } + + @override + String restoreSessionBody(String url, String error) { + return '앱이 백업에서 세션을 복원하려 시도중입니다. $url 에서 개발자에게 오류를 신고하세요. 오류 메시지는 다음과 같습니다: $error'; + } + + @override + String forwardMessageTo(String roomName) { + return '$roomName에 메시지를 전달할까요?'; + } + + @override + String get sendReadReceipts => '읽음 확인 보내기'; + + @override + String get sendTypingNotificationsDescription => + '채팅의 다른 참가자들이 당신이 새 메시지를 입력중인것을 볼 수 있습니다.'; + + @override + String get sendReadReceiptsDescription => + '채팅의 다른 참가자들이 당신이 메시지를 읽었는지 볼 수 있습니다.'; + + @override + String get formattedMessages => '형식이 지정된 메시지'; + + @override + String get formattedMessagesDescription => '마크다운을 이용한 볼드등의 서식이 있는 메시지를 봅니다.'; + + @override + String get verifyOtherUser => '🔐 다른 유저 확인'; + + @override + String get verifyOtherUserDescription => + '다른 유저를 확인하면, 당신은 당신이 누구에게 말하고있는지 알 수 있습니다. 💪\n\n확인을 시작할 때, 다른 유저는 앱에서 팝업을 볼 수 있습니다. 당신은 그런 다음 서로 비교해야 이모지 또는 숫자의 목록을 볼 수 있습니다.\n\n이 작업을 수행하는 가장 좋은 방법은 직접 만나거나 영상통화를 하는것입니다. 👭'; + + @override + String get verifyOtherDevice => '🔐 다른 기기를 확인'; + + @override + String get verifyOtherDeviceDescription => + '다른 장치를 확인하면, 장치와 키를 교환하고, 전반적인 보안을 증가시킵니다. 💪 확인을 시작하면 팝업은 두 장치에 나타납니다. 그런 다음 서로 비교해야 이모지 또는 숫자의 목록를 볼 수 있습니다. 확인을 시작하기 전에 모든 장치를 준비하세요. 🤳'; + + @override + String acceptedKeyVerification(String sender) { + return '$sender가 키 검증을 수락함'; + } + + @override + String canceledKeyVerification(String sender) { + return '$sender가 키 검증을 취소함'; + } + + @override + String completedKeyVerification(String sender) { + return '$sender가 키 검증을 완료함'; + } + + @override + String isReadyForKeyVerification(String sender) { + return '$sender가 키 검증 준비를 완료함'; + } + + @override + String requestedKeyVerification(String sender) { + return '$sender가 키 검증을 요청함'; + } + + @override + String startedKeyVerification(String sender) { + return '$sender가 키 검증을 시작함'; + } + + @override + String get transparent => '투명'; + + @override + String get incomingMessages => '메시지 수신함'; + + @override + String get stickers => '스티커'; + + @override + String get discover => '탐색'; + + @override + String get commandHint_ignore => '주어진 matrix ID를 무시'; + + @override + String get commandHint_unignore => '주어진 matrix ID 무시 해제'; + + @override + String unreadChatsInApp(String appname, String unread) { + return '$appname: $unread개의 읽지 않은 채팅'; + } + + @override + String get noDatabaseEncryption => '데이터베이스 암호화는 이 플랫폼에서 지원되지 않음'; + + @override + String thereAreCountUsersBlocked(Object count) { + return '$count명의 차단된 유저가 있습니다.'; + } + + @override + String get restricted => '스페이스 멤버로 제한'; + + @override + String get knockRestricted => '스페이스 멤버만 참가 요청 가능'; + + @override + String goToSpace(Object space) { + return '스페이스로: $space'; + } + + @override + String get markAsUnread => '읽지 않음으로 표시'; + + @override + String userLevel(int level) { + return '$level - 유저'; + } + + @override + String moderatorLevel(int level) { + return '$level - 관리자'; + } + + @override + String adminLevel(int level) { + return '$level - 운영자'; + } + + @override + String get changeGeneralChatSettings => '일반 채팅 설정 번경하기'; + + @override + String get inviteOtherUsers => '다른 사용자를 이 채팅에 초대하기'; + + @override + String get changeTheChatPermissions => '채팅 권한 바꾸기'; + + @override + String get changeTheVisibilityOfChatHistory => '채팅 기록 표시 여부 바꾸기'; + + @override + String get changeTheCanonicalRoomAlias => '메인 공개 채팅 주소 바꾸기'; + + @override + String get sendRoomNotifications => '@room 알림 보내기'; + + @override + String get changeTheDescriptionOfTheGroup => '채팅 설명 바꾸기'; + + @override + String get chatPermissionsDescription => + '이 채팅에서 특정 작업에 요구할 권한 레벨을 정의합니다. 권한 레벨 0, 50, 100은 일반적으로 유저, 관리자, 운영자를 나타내지만, 모든 숫자가 가능합니다.'; + + @override + String updateInstalled(String version) { + return '🎉 $version 업데이트가 설치되었습니다!'; + } + + @override + String get changelog => '변경 기록'; + + @override + String get sendCanceled => '전송 최소됨'; + + @override + String get loginWithMatrixId => 'Matrix-ID로 로그인'; + + @override + String get discoverHomeservers => '홈서버 찾아보기'; + + @override + String get whatIsAHomeserver => '홈서버가 무엇인가요?'; + + @override + String get homeserverDescription => + '당신의 모든 데이터는 이메일과 흡사하게 당신의 홈서버에 저장됩니다. 당신이 소통하고 싶은 사람들과 다른 서버를 사용해도 무관하니 당신이 원하는 홈서버를 선택해도 됩니다. https://matrix.org에서 자세히 알아보세요.'; + + @override + String get doesNotSeemToBeAValidHomeserver => + '호환되는 홈서버가 아닌 것 같습니다. URL을 올바르게 입력됐나요?'; + + @override + String get calculatingFileSize => '파일 크기 계산 중...'; + + @override + String get prepareSendingAttachment => '첨부된 파일 전송 준비 중...'; + + @override + String get sendingAttachment => '첨부된 파일 전송 중...'; + + @override + String get generatingVideoThumbnail => '영상 썸네일 만드는 중...'; + + @override + String get compressVideo => '영상 압축 중...'; + + @override + String sendingAttachmentCountOfCount(int index, int length) { + return '첨부파일 $length개중 $index번째 전송 중...'; + } + + @override + String serverLimitReached(int seconds) { + return '서버 한도에 도달했습니다! $seconds초 기다리는 중...'; + } + + @override + String get oneOfYourDevicesIsNotVerified => '당신의 기기 중 하나가 인증되지 않았음'; + + @override + String get noticeChatBackupDeviceVerification => + '참고: 모든 기기에 채팅 백업을 설정하면 자동으로 서로 인증됩니다.'; + + @override + String get continueText => '계속하기'; + + @override + String get welcomeText => + '안녕하세요 👋 FluffyChat이에요. 당신은 htpps://matrix.org와 호환되는 모든 홈서버를 사용할 수 있어요. 그리고 모두와 대화해보세요. 거대한 분산 대화망이니까요!'; + + @override + String get blur => '블러:'; + + @override + String get opacity => '불투명:'; + + @override + String get setWallpaper => '배경화면 설정하기'; + + @override + String get manageAccount => '계정 관리하기'; + + @override + String get noContactInformationProvided => '서버가 유효한 연락처 정보를 제공하지 않음'; + + @override + String get contactServerAdmin => '서버 관리자에게 연락하기'; + + @override + String get contactServerSecurity => '서버 보안 관리자에게 연락하기'; + + @override + String get supportPage => '지원 페이지'; + + @override + String get serverInformation => '서버 정보:'; + + @override + String get name => '이름'; + + @override + String get version => '버전'; + + @override + String get website => '웹사이트'; + + @override + String get compress => '압축'; + + @override + String get boldText => '두꺼운 글꼴'; + + @override + String get italicText => '기울어진 글꼴'; + + @override + String get strikeThrough => '취소선'; + + @override + String get pleaseFillOut => '작성해주세요'; + + @override + String get invalidUrl => '유효하지 않은 url'; + + @override + String get addLink => '링크 추가'; + + @override + String get unableToJoinChat => '채팅에 참가할 수 없습니다. 다른 구성원이 이미 대화를 종료했을 수 있습니다.'; + + @override + String get previous => '이전'; + + @override + String get otherPartyNotLoggedIn => '다른 구성원이 현재 로그인하지 않아 메시지를 수신하지 못합니다!'; + + @override + String appWantsToUseForLogin(String server) { + return '\'$server\'로 로그인'; + } + + @override + String get appWantsToUseForLoginDescription => '웹사이트와 당신에 대한 정보를 공유하게됩니다.'; + + @override + String get open => '열기'; + + @override + String get waitingForServer => '서버를 기다리는중...'; + + @override + String get appIntroduction => + 'FluffyChat는 다른 메신저들을 사용하는 친구들과도 채팅할 수 있습니다. https://matrix.org에 방문하거나 *계속*을 눌러 자세한 정보를 확인하세요.'; + + @override + String get newChatRequest => '📩 새 채팅 요청'; + + @override + String get contentNotificationSettings => '콘텐츠 알림 설정'; + + @override + String get generalNotificationSettings => '일반 알림 설정'; + + @override + String get roomNotificationSettings => '채팅방 알림 설정'; + + @override + String get userSpecificNotificationSettings => + 'User specific notification settings'; + + @override + String get otherNotificationSettings => '기타 알림 설정'; + + @override + String get notificationRuleContainsUserName => '유저 이름을 포함함'; + + @override + String get notificationRuleContainsUserNameDescription => + '메시지가 유저의 이름을 포함할때 알림합니다.'; + + @override + String get notificationRuleMaster => '모든 알림 음소거'; + + @override + String get notificationRuleMasterDescription => '모든 규칙을 무시하고 모든 알림을 비활성화합니다.'; + + @override + String get notificationRuleSuppressNotices => '자동화된 메시지 무시'; + + @override + String get notificationRuleSuppressNoticesDescription => + '봇을 비롯한 자동화된 메시지로부터 발생하는 알림을 무시합니다.'; + + @override + String get notificationRuleInviteForMe => '초대를 받음'; + + @override + String get notificationRuleInviteForMeDescription => '채팅방에 초대받았을 때 알림합니다.'; + + @override + String get notificationRuleMemberEvent => '멤버 이벤트'; + + @override + String get notificationRuleMemberEventDescription => + '멤버 이벤트로 발생하는 알림을 무시합니다.'; + + @override + String get notificationRuleIsUserMention => '유저가 멘션됨'; + + @override + String get notificationRuleIsUserMentionDescription => + '유저가 메시지에 멘션됐을 때 알림합니다.'; + + @override + String get notificationRuleContainsDisplayName => '표시 이름을 포함함'; + + @override + String get notificationRuleContainsDisplayNameDescription => + '메시지에 표시 이름이 포함되면 알림합니다.'; + + @override + String get notificationRuleIsRoomMention => '방 멘션'; + + @override + String get notificationRuleIsRoomMentionDescription => '방 멘션이 있을경우 알림합니다.'; + + @override + String get notificationRuleRoomnotif => '방 알림'; + + @override + String get notificationRuleRoomnotifDescription => + '메시지가 \'@room\'을 포함하면 알림합니다.'; + + @override + String get notificationRuleTombstone => '비활성화'; + + @override + String get notificationRuleTombstoneDescription => '채팅방 비활성화 메시지를 알림합니다.'; + + @override + String get notificationRuleReaction => '반응'; + + @override + String get notificationRuleReactionDescription => '반응으로 발생하는 알림을 무시합니다.'; + + @override + String get notificationRuleRoomServerAcl => '채팅방 서버 ACL'; + + @override + String get notificationRuleRoomServerAclDescription => + '채팅방 서버의 접근 권한(ACL)으로부터 오는 알림을 무시합니다.'; + + @override + String get notificationRuleSuppressEdits => '수정 음소거'; + + @override + String get notificationRuleSuppressEditsDescription => + '수정된 메시지로부터 오는 알림을 무시합니다.'; + + @override + String get notificationRuleCall => '전화'; + + @override + String get notificationRuleCallDescription => + 'Notifies the user about calls.'; + + @override + String get notificationRuleEncryptedRoomOneToOne => + 'Encrypted Room One-to-One'; + + @override + String get notificationRuleEncryptedRoomOneToOneDescription => + 'Notifies the user about messages in encrypted one-to-one rooms.'; + + @override + String get notificationRuleRoomOneToOne => 'Room One-to-One'; + + @override + String get notificationRuleRoomOneToOneDescription => + 'Notifies the user about messages in one-to-one rooms.'; + + @override + String get notificationRuleMessage => 'Message'; + + @override + String get notificationRuleMessageDescription => + 'Notifies the user about general messages.'; + + @override + String get notificationRuleEncrypted => 'Encrypted'; + + @override + String get notificationRuleEncryptedDescription => + 'Notifies the user about messages in encrypted rooms.'; + + @override + String get notificationRuleJitsi => 'Jitsi'; + + @override + String get notificationRuleJitsiDescription => + 'Notifies the user about Jitsi widget events.'; + + @override + String get notificationRuleServerAcl => 'Suppress Server ACL Events'; + + @override + String get notificationRuleServerAclDescription => + 'Suppresses notifications for Server ACL events.'; + + @override + String unknownPushRule(String rule) { + return 'Unknown push rule \'$rule\''; + } + + @override + String get deletePushRuleCanNotBeUndone => + 'If you delete this notification setting, this can not be undone.'; + + @override + String get more => 'More'; + + @override + String get shareKeysWith => 'Share keys with...'; + + @override + String get shareKeysWithDescription => + 'Which devices should be trusted so that they can read along your messages in encrypted chats?'; + + @override + String get allDevices => 'All devices'; + + @override + String get crossVerifiedDevicesIfEnabled => + 'Cross verified devices if enabled'; + + @override + String get crossVerifiedDevices => 'Cross verified devices'; + + @override + String get verifiedDevicesOnly => 'Verified devices only'; + + @override + String get takeAPhoto => 'Take a photo'; + + @override + String get recordAVideo => 'Record a video'; + + @override + String get optionalMessage => '(Optional) message...'; + + @override + String get notSupportedOnThisDevice => 'Not supported on this device'; + + @override + String get enterNewChat => 'Enter new chat'; + + @override + String get approve => 'Approve'; + + @override + String get youHaveKnocked => 'You have knocked'; + + @override + String get pleaseWaitUntilInvited => + 'Please wait now, until someone from the room invites you.'; +} diff --git a/lib/generated/l10n/l10n_lt.dart b/lib/generated/l10n/l10n_lt.dart new file mode 100644 index 0000000..1fee135 --- /dev/null +++ b/lib/generated/l10n/l10n_lt.dart @@ -0,0 +1,2751 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'l10n.dart'; + +// ignore_for_file: type=lint + +/// The translations for Lithuanian (`lt`). +class L10nLt extends L10n { + L10nLt([String locale = 'lt']) : super(locale); + + @override + String get noSendPermission => 'You can\'t send messages here'; + + @override + String get alwaysUse24HourFormat => 'false'; + + @override + String get repeatPassword => 'Pakartokite slaptažodį'; + + @override + String get notAnImage => 'Not an image file.'; + + @override + String get setCustomPermissionLevel => 'Set custom permission level'; + + @override + String get setPermissionsLevelDescription => + 'Please choose a predefined role below or enter a custom permission level between 0 and 100.'; + + @override + String get ignoreUser => 'Ignore user'; + + @override + String get normalUser => 'Normal user'; + + @override + String get remove => 'Pašalinti'; + + @override + String get importNow => 'Import now'; + + @override + String get importEmojis => 'Import Emojis'; + + @override + String get importFromZipFile => 'Import from .zip file'; + + @override + String get exportEmotePack => 'Export Emote pack as .zip'; + + @override + String get replace => 'Replace'; + + @override + String get about => 'Apie'; + + @override + String aboutHomeserver(String homeserver) { + return 'About $homeserver'; + } + + @override + String get accept => 'Sutinku'; + + @override + String acceptedTheInvitation(String username) { + return '👍 $username priėmė kvietimą'; + } + + @override + String get account => 'Paskyra'; + + @override + String activatedEndToEndEncryption(String username) { + return '🔐 $username aktyvavo visapusį šifravimą'; + } + + @override + String get addEmail => 'Pridėti el. paštą'; + + @override + String get confirmMatrixId => + 'Norėdami ištrinti savo paskyrą, patvirtinkite savo Matrix ID.'; + + @override + String supposedMxid(String mxid) { + return 'Tai turėtų būti $mxid'; + } + + @override + String get addChatDescription => 'Add a chat description...'; + + @override + String get addToSpace => 'Pridėti į erdvę'; + + @override + String get admin => 'Administratorius'; + + @override + String get alias => 'slapyvardis'; + + @override + String get all => 'Visi'; + + @override + String get allChats => 'Visi pokalbiai'; + + @override + String get commandHint_roomupgrade => + 'Upgrade this room to the given room version'; + + @override + String get commandHint_googly => 'Send some googly eyes'; + + @override + String get commandHint_cuddle => 'Send a cuddle'; + + @override + String get commandHint_hug => 'Send a hug'; + + @override + String googlyEyesContent(String senderName) { + return '$senderName sends you googly eyes'; + } + + @override + String cuddleContent(String senderName) { + return '$senderName cuddles you'; + } + + @override + String hugContent(String senderName) { + return '$senderName hugs you'; + } + + @override + String answeredTheCall(String senderName) { + return '$senderName atsiliepė į skambutį'; + } + + @override + String get anyoneCanJoin => 'Bet kas gali prisijungti'; + + @override + String get appLock => 'Programos užraktas'; + + @override + String get appLockDescription => + 'Lock the app when not using with a pin code'; + + @override + String get archive => 'Archyvas'; + + @override + String get areGuestsAllowedToJoin => 'Ar svečiams leidžiama prisijungti'; + + @override + String get areYouSure => 'Ar esate tikri?'; + + @override + String get areYouSureYouWantToLogout => 'Ar tikrai norite atsijungti?'; + + @override + String get askSSSSSign => + 'Kad galėtumėte prijungti kitą asmenį, įveskite savo saugyklos slaptafrazę arba atkūrimo raktą.'; + + @override + String askVerificationRequest(String username) { + return 'Priimti šią patvirtinimo užklausą iš $username?'; + } + + @override + String get autoplayImages => + 'Automatiškai leisti animuotus lipdukus ir jaustukus'; + + @override + String badServerLoginTypesException(String serverVersions, + String supportedVersions, Object suportedVersions) { + return 'Namų serveris palaiko šiuos prisijungimo tipus:\n$serverVersions\nTačiau ši programa palaiko tik:\n$supportedVersions'; + } + + @override + String get sendTypingNotifications => 'Send typing notifications'; + + @override + String get swipeRightToLeftToReply => 'Swipe right to left to reply'; + + @override + String get sendOnEnter => 'Išsiųsti paspaudus Enter'; + + @override + String badServerVersionsException(String serverVersions, + String supportedVersions, Object serverVerions, Object suportedVersions) { + return 'Namų serveris palaiko spec. versijas:\n$serverVersions\nTačiau ši programa palaiko tik $supportedVersions'; + } + + @override + String countChatsAndCountParticipants(int chats, int participants) { + return '$chats chats and $participants participants'; + } + + @override + String get noMoreChatsFound => 'No more chats found...'; + + @override + String get noChatsFoundHere => + 'No chats found here yet. Start a new chat with someone by using the button below. ⤵️'; + + @override + String get joinedChats => 'Joined chats'; + + @override + String get unread => 'Unread'; + + @override + String get space => 'Space'; + + @override + String get spaces => 'Spaces'; + + @override + String get banFromChat => 'Užblokuoti iš pokalbio'; + + @override + String get banned => 'Užblokuotas'; + + @override + String bannedUser(String username, String targetName) { + return '$username užblokavo $targetName'; + } + + @override + String get blockDevice => 'Blokuoti įrenginį'; + + @override + String get blocked => 'Užblokuotas'; + + @override + String get botMessages => 'Botų žinutės'; + + @override + String get cancel => 'Atšaukti'; + + @override + String cantOpenUri(String uri) { + return 'Nepavyksta atidaryti URI $uri'; + } + + @override + String get changeDeviceName => 'Pakeisti įrenginio vardą'; + + @override + String changedTheChatAvatar(String username) { + return '$username pakeitė pokalbio avatarą'; + } + + @override + String changedTheChatDescriptionTo(String username, String description) { + return '$username pakeitė pokalbio aprašymą į: \'$description\''; + } + + @override + String changedTheChatNameTo(String username, String chatname) { + return '$username pakeitė pokalbio pavadinimą į: \'$chatname\''; + } + + @override + String changedTheChatPermissions(String username) { + return '$username pakeitė pokalbių leidimus'; + } + + @override + String changedTheDisplaynameTo(String username, String displayname) { + return '$username pakeitė rodomą vardą į: \'$displayname\''; + } + + @override + String changedTheGuestAccessRules(String username) { + return '$username pakeitė svečio prieigos taisykles'; + } + + @override + String changedTheGuestAccessRulesTo(String username, String rules) { + return '$username pakeitė svečio prieigos taisykles į: $rules'; + } + + @override + String changedTheHistoryVisibility(String username) { + return '$username pakeitė istorijos matomumą'; + } + + @override + String changedTheHistoryVisibilityTo(String username, String rules) { + return '$username pakeitė istorijos matomumą į: $rules'; + } + + @override + String changedTheJoinRules(String username) { + return '$username pakeitė prisijungimo taisykles'; + } + + @override + String changedTheJoinRulesTo(String username, String joinRules) { + return '$username pakeitė prisijungimo taisykles į: $joinRules'; + } + + @override + String changedTheProfileAvatar(String username) { + return '$username pakeitė savo avatarą'; + } + + @override + String changedTheRoomAliases(String username) { + return '$username pakeitė kambario pseudonimus'; + } + + @override + String changedTheRoomInvitationLink(String username) { + return '$username pakeitė pakvietimo nuorodą'; + } + + @override + String get changePassword => 'Keisti slaptažodį'; + + @override + String get changeTheHomeserver => 'Pakeisti namų serverį'; + + @override + String get changeTheme => 'Keisti savo stilių'; + + @override + String get changeTheNameOfTheGroup => 'Keisti grupės pavadinimą'; + + @override + String get changeYourAvatar => 'Keisti savo avatarą'; + + @override + String get channelCorruptedDecryptError => 'Šifravimas buvo sugadintas'; + + @override + String get chat => 'Pokalbis'; + + @override + String get yourChatBackupHasBeenSetUp => + 'Jūsų pokalbio atsarginė kopija buvo nustatyta.'; + + @override + String get chatBackup => 'Pokalbio atsargine kopija'; + + @override + String get chatBackupDescription => + 'Jūsų senos žinutės yra apsaugotos atkūrimo raktu. Pasirūpinkite, kad jo neprarastumėte.'; + + @override + String get chatDetails => 'Pokalbio detalės'; + + @override + String get chatHasBeenAddedToThisSpace => + 'Pokalbis buvo pridėtas prie šios erdvės'; + + @override + String get chats => 'Pokalbiai'; + + @override + String get chooseAStrongPassword => 'Pasirinkite saugų slaptažodį'; + + @override + String get clearArchive => 'Išvalyti archyvą'; + + @override + String get close => 'Uždaryti'; + + @override + String get commandHint_markasdm => + 'Pažymėti kaip tiesioginio pokalbio kambarį'; + + @override + String get commandHint_markasgroup => 'Pažymėti kaip grupę'; + + @override + String get commandHint_ban => 'Užblokuoti vartotoją šiame kambaryje'; + + @override + String get commandHint_clearcache => 'Išvalyti laikiną talpyklą'; + + @override + String get commandHint_create => + 'Sukurti tuščią grupinį pokalbį\nNaudokite --no-encryption kad išjungti šifravimą'; + + @override + String get commandHint_discardsession => 'Atmesti sesiją'; + + @override + String get commandHint_dm => + 'Pradėti tiesioginį pokalbį\nNaudokite --no-encryption kad išjungti šifravimą'; + + @override + String get commandHint_html => 'Siųsti tekstą HTML formatu'; + + @override + String get commandHint_invite => 'Pakviesti vartotoją į šitą kambarį'; + + @override + String get commandHint_join => 'Prisijungti prie nurodyto kambario'; + + @override + String get commandHint_kick => 'Pašalinti vartotoja iš šito kambario'; + + @override + String get commandHint_leave => 'Palikti pokalbių kambarį'; + + @override + String get commandHint_me => 'Apibūdinkite save'; + + @override + String get commandHint_myroomavatar => + 'Nustatyti savo nuotrauką šiame kambaryje (su mxc-uri)'; + + @override + String get commandHint_myroomnick => + 'Nustatyti savo rodomą vardą šiame kambaryje'; + + @override + String get commandHint_op => + 'Nustatyti naudotojo galios lygį (numatytasis: 50)'; + + @override + String get commandHint_plain => 'Siųsti neformatuotą tekstą'; + + @override + String get commandHint_react => 'Siųsti atsakymą kaip reakciją'; + + @override + String get commandHint_send => 'Siųsti tekstą'; + + @override + String get commandHint_unban => 'Atblokuoti vartotoją šiame kambaryje'; + + @override + String get commandInvalid => 'Neteisinga komanda'; + + @override + String commandMissing(String command) { + return '$command nėra komanda.'; + } + + @override + String get compareEmojiMatch => 'Palyginkite jaustukus'; + + @override + String get compareNumbersMatch => 'Palyginkite skaičius'; + + @override + String get configureChat => 'Konfigūruoti pokalbį'; + + @override + String get confirm => 'Patvirtinti'; + + @override + String get connect => 'Prisijungti'; + + @override + String get contactHasBeenInvitedToTheGroup => + 'Kontaktas buvo pakviestas į grupę'; + + @override + String get containsDisplayName => 'Turi rodomą vardą'; + + @override + String get containsUserName => 'Turi vartotojo vardą'; + + @override + String get contentHasBeenReported => + 'Apie turinį pranešta serverio administratoriams'; + + @override + String get copiedToClipboard => 'Nukopijuota į iškarpinę'; + + @override + String get copy => 'Kopijuoti'; + + @override + String get copyToClipboard => 'Koipjuoti į iškarpinę'; + + @override + String couldNotDecryptMessage(String error) { + return 'Nepavyko iššifruoti pranešimo: $error'; + } + + @override + String countParticipants(int count) { + return '$count dalyviai'; + } + + @override + String get create => 'Sukurti'; + + @override + String createdTheChat(String username) { + return '💬 $username sukūrė pokalbį'; + } + + @override + String get createGroup => 'Create group'; + + @override + String get createNewSpace => 'Nauja erdvė'; + + @override + String get currentlyActive => 'Šiuo metu aktyvus'; + + @override + String get darkTheme => 'Tamsi'; + + @override + String dateAndTimeOfDay(String date, String timeOfDay) { + return '$date, $timeOfDay'; + } + + @override + String dateWithoutYear(String month, String day) { + return '$month-$day'; + } + + @override + String dateWithYear(String year, String month, String day) { + return '$year-$month-$day'; + } + + @override + String get deactivateAccountWarning => + 'Tai deaktyvuos jūsų vartotojo paskyrą. Tai negali būti atšaukta! Ar jūs tuo tikri?'; + + @override + String get defaultPermissionLevel => 'Numatytasis teisių lygis'; + + @override + String get delete => 'Ištrinti'; + + @override + String get deleteAccount => 'Panaikinti paskyra'; + + @override + String get deleteMessage => 'Ištrinti žinutę'; + + @override + String get device => 'Įrenginys'; + + @override + String get deviceId => 'Įrenginio ID'; + + @override + String get devices => 'Įrenginiai'; + + @override + String get directChats => 'Tiesioginiai pokalbiai'; + + @override + String get allRooms => 'All Group Chats'; + + @override + String get displaynameHasBeenChanged => 'Rodomas vardas buvo pakeistas'; + + @override + String get downloadFile => 'Atsisiųsti failą'; + + @override + String get edit => 'Redaguoti'; + + @override + String get editBlockedServers => 'Redaguoti blokuotus serverius'; + + @override + String get chatPermissions => 'Chat permissions'; + + @override + String get editDisplayname => 'Redaguoti rodomą vardą'; + + @override + String get editRoomAliases => 'Redaguoti kambario pseudonimus'; + + @override + String get editRoomAvatar => 'Redaguoti kambario avatarą'; + + @override + String get emoteExists => 'Jaustukas jau egzistuoja!'; + + @override + String get emoteInvalid => 'Neteisingas jaustuko trumpasis kodas!'; + + @override + String get emoteKeyboardNoRecents => + 'Recently-used emotes will appear here...'; + + @override + String get emotePacks => 'Jaustukų paketai kambariui'; + + @override + String get emoteSettings => 'Jaustukų nustatymai'; + + @override + String get globalChatId => 'Global chat ID'; + + @override + String get accessAndVisibility => 'Access and visibility'; + + @override + String get accessAndVisibilityDescription => + 'Who is allowed to join this chat and how the chat can be discovered.'; + + @override + String get calls => 'Calls'; + + @override + String get customEmojisAndStickers => 'Custom emojis and stickers'; + + @override + String get customEmojisAndStickersBody => + 'Add or share custom emojis or stickers which can be used in any chat.'; + + @override + String get emoteShortcode => 'Jaustuko trumpasis kodas'; + + @override + String get emoteWarnNeedToPick => + 'Turite pasirinkti jaustuko trumpąjį kodą ir paveiksliuką!'; + + @override + String get emptyChat => 'Tuščias pokalbis'; + + @override + String get enableEmotesGlobally => 'Įgalinti jaustukų paketą visur'; + + @override + String get enableEncryption => 'Aktyvuoti šifravimą'; + + @override + String get enableEncryptionWarning => + 'Šifravimo nebegalėsite išjungti. Ar jūs tuo tikri?'; + + @override + String get encrypted => 'Užšifruotas'; + + @override + String get encryption => 'Šifravimas'; + + @override + String get encryptionNotEnabled => 'Šifravimas aktyvuotas'; + + @override + String endedTheCall(String senderName) { + return '$senderName baigė skambutį'; + } + + @override + String get enterAnEmailAddress => 'Įveskite el. pašto adresą'; + + @override + String get homeserver => 'Namų serveris'; + + @override + String get enterYourHomeserver => 'Įveskite namų serverį'; + + @override + String errorObtainingLocation(String error) { + return 'Klaida nustatant vietą: $error'; + } + + @override + String get everythingReady => 'Viskas paruošta!'; + + @override + String get extremeOffensive => 'Itin įžeidžiantis'; + + @override + String get fileName => 'Failo vardas'; + + @override + String get fluffychat => 'FluffyChat'; + + @override + String get fontSize => 'Šrifto dydis'; + + @override + String get forward => 'Toliau'; + + @override + String get fromJoining => 'Nuo prisijungimo'; + + @override + String get fromTheInvitation => 'Nuo pakvietimo'; + + @override + String get goToTheNewRoom => 'Eiti į naują kambarį'; + + @override + String get group => 'Grupė'; + + @override + String get chatDescription => 'Chat description'; + + @override + String get chatDescriptionHasBeenChanged => 'Chat description changed'; + + @override + String get groupIsPublic => 'Grupė yra vieša'; + + @override + String get groups => 'Grupės'; + + @override + String groupWith(String displayname) { + return 'Grupė su $displayname'; + } + + @override + String get guestsAreForbidden => 'Svečiams draudžiama'; + + @override + String get guestsCanJoin => 'Svečiai gali prisijungti'; + + @override + String hasWithdrawnTheInvitationFor(String username, String targetName) { + return '$username atšaukė $targetName kvietimą'; + } + + @override + String get help => 'Pagalba'; + + @override + String get hideRedactedEvents => 'Slėpti pašalintus įvykius'; + + @override + String get hideRedactedMessages => 'Hide redacted messages'; + + @override + String get hideRedactedMessagesBody => + 'If someone redacts a message, this message won\'t be visible in the chat anymore.'; + + @override + String get hideInvalidOrUnknownMessageFormats => + 'Hide invalid or unknown message formats'; + + @override + String get howOffensiveIsThisContent => 'Kiek įžeižiantis šis turinys?'; + + @override + String get id => 'ID'; + + @override + String get identity => 'Tapatybė'; + + @override + String get block => 'Block'; + + @override + String get blockedUsers => 'Blocked users'; + + @override + String get blockListDescription => + 'You can block users who are disturbing you. You won\'t be able to receive any messages or room invites from the users on your personal block list.'; + + @override + String get blockUsername => 'Ignore username'; + + @override + String get iHaveClickedOnLink => 'Aš paspaudžiau nuorodą'; + + @override + String get incorrectPassphraseOrKey => + 'Neteisinga slaptafrazė arba atkūrimo raktas'; + + @override + String get inoffensive => 'Neįžeidžiantis'; + + @override + String get inviteContact => 'Pakviesti kontaktą'; + + @override + String inviteContactToGroupQuestion(Object contact, Object groupName) { + return 'Do you want to invite $contact to the chat \"$groupName\"?'; + } + + @override + String inviteContactToGroup(String groupName) { + return 'Pakviesti kontaktą į $groupName'; + } + + @override + String get noChatDescriptionYet => 'No chat description created yet.'; + + @override + String get tryAgain => 'Try again'; + + @override + String get invalidServerName => 'Invalid server name'; + + @override + String get invited => 'Pakviestas'; + + @override + String get redactMessageDescription => + 'The message will be redacted for all participants in this conversation. This cannot be undone.'; + + @override + String get optionalRedactReason => + '(Optional) Reason for redacting this message...'; + + @override + String invitedUser(String username, String targetName) { + return '📩 $username pakvietė $targetName'; + } + + @override + String get invitedUsersOnly => 'Tik pakviesti vartotojai'; + + @override + String get inviteForMe => 'Pakvietimas man'; + + @override + String inviteText(String username, String link) { + return '$username pakvietė jus prisijungti prie FluffyChat. \n1. Įdiekite FluffyChat: https://fluffychat.im \n2. Prisiregistruokite arba prisijunkite \n3. Atidarykite pakvietimo nuorodą: $link'; + } + + @override + String get isTyping => 'rašo…'; + + @override + String joinedTheChat(String username) { + return '👋 $username prisijungė prie pokalbio'; + } + + @override + String get joinRoom => 'Prisijungti prie kambario'; + + @override + String kicked(String username, String targetName) { + return '👞 $username išmetė $targetName'; + } + + @override + String kickedAndBanned(String username, String targetName) { + return '🙅 $username išmetė ir užblokavo $targetName'; + } + + @override + String get kickFromChat => 'Išmesti iš pokalbio'; + + @override + String lastActiveAgo(String localizedTimeShort) { + return 'Paskutinis aktyvumas: $localizedTimeShort'; + } + + @override + String get leave => 'Palikti'; + + @override + String get leftTheChat => 'Paliko pokalbį'; + + @override + String get license => 'Licencija'; + + @override + String get lightTheme => 'Šviesi'; + + @override + String loadCountMoreParticipants(int count) { + return 'Įkelti dar $count dalyvius'; + } + + @override + String get dehydrate => 'Eksportuoti sesiją ir išvalyti įrenginį'; + + @override + String get dehydrateWarning => + 'Šio veiksmo negalima atšaukti. Įsitikinkite, kad saugiai saugote atsarginę kopiją.'; + + @override + String get dehydrateTor => 'TOR Naudotojai: Eksportuoti sesiją'; + + @override + String get dehydrateTorLong => + 'TOR naudotojams rekomenduojama eksportuoti sesiją prieš uždarant langą.'; + + @override + String get hydrateTor => 'TOR Naudotojai: Importuoti sesijos eksportą'; + + @override + String get hydrateTorLong => + 'Ar paskutinį kartą eksportavote savo sesiją naudodami TOR? Greitai ją importuokite ir tęskite pokalbį.'; + + @override + String get hydrate => 'Atkurti iš atsarginės kopijos failo'; + + @override + String get loadingPleaseWait => 'Kraunama… Prašome palaukti.'; + + @override + String get loadMore => 'Rodyti daugiau…'; + + @override + String get locationDisabledNotice => + 'Vietos nustatymo paslaugos yra išjungtos. Kad galėtumėte bendrinti savo buvimo vietą, įjunkite jas.'; + + @override + String get locationPermissionDeniedNotice => + 'Vietos leidimas atmestas. Suteikite leidimą kad galėtumėte bendrinti savo vietą.'; + + @override + String get login => 'Prisijungti'; + + @override + String logInTo(String homeserver) { + return 'Prisijungti prie $homeserver'; + } + + @override + String get logout => 'Atsijungti'; + + @override + String get memberChanges => 'Narių pokyčiai'; + + @override + String get mention => 'Paminėti'; + + @override + String get messages => 'Žinutės'; + + @override + String get messagesStyle => 'Messages:'; + + @override + String get moderator => 'Moderatorius'; + + @override + String get muteChat => 'Nutildyti pokalbį'; + + @override + String get needPantalaimonWarning => + 'Atminkite, kad norint naudoti end-to-end šifravimą, reikalingas Pantalaimon.'; + + @override + String get newChat => 'Naujas pokalbis'; + + @override + String get newMessageInFluffyChat => '💬 Nauja žinutė FluffyChat\'e'; + + @override + String get newVerificationRequest => 'Nauja patvirtinimo užklausa!'; + + @override + String get next => 'Toliau'; + + @override + String get no => 'Ne'; + + @override + String get noConnectionToTheServer => 'Nėra ryšio su serveriu'; + + @override + String get noEmotesFound => 'Nerasta jaustukų. 😕'; + + @override + String get noEncryptionForPublicRooms => + 'Šifravimą galite suaktyvinti tik tada, kai kambarys nebebus viešai pasiekiamas.'; + + @override + String get noGoogleServicesWarning => + 'Atrodo, kad jūsų telefone nėra Google Services. Tai geras sprendimas jūsų privatumui! Norėdami gauti tiesioginius pranešimus FluffyChat, rekomenduojame naudoti https://microg.org/ arba https://unifiedpush.org/.'; + + @override + String noMatrixServer(String server1, String server2) { + return '$server1 nėra Matrix serveris, ar vietoj jo naudoti $server2?'; + } + + @override + String get shareInviteLink => 'Share invite link'; + + @override + String get scanQrCode => 'Nuskanuokite QR kodą'; + + @override + String get none => 'Nė vienas'; + + @override + String get noPasswordRecoveryDescription => + 'Dar nepridėjote slaptažodžio atkūrimo būdo.'; + + @override + String get noPermission => 'Nėra leidimo'; + + @override + String get noRoomsFound => 'Nerasta kambarių…'; + + @override + String get notifications => 'Pranešimai'; + + @override + String get notificationsEnabledForThisAccount => + 'Pranešimai aktyvuoti šitai paskyrai'; + + @override + String numUsersTyping(int count) { + return '$count vartotojai rašo…'; + } + + @override + String get obtainingLocation => 'Gaunama vieta…'; + + @override + String get offensive => 'Agresyvus'; + + @override + String get offline => 'Neprisijungta'; + + @override + String get ok => 'OK'; + + @override + String get online => 'Prisijungta'; + + @override + String get onlineKeyBackupEnabled => + 'Internetinė atsarginė raktų kopija įjungta'; + + @override + String get oopsPushError => + 'Oi! Deja, nustatant tiesioginius pranešimus įvyko klaida.'; + + @override + String get oopsSomethingWentWrong => 'Oi, kažkas nutiko ne taip…'; + + @override + String get openAppToReadMessages => + 'Atidarykite programėlę, kad perskaityti žinutes'; + + @override + String get openCamera => 'Atidarykite kamerą'; + + @override + String get openVideoCamera => 'Atidarykite kamerą vaizdo įrašui'; + + @override + String get oneClientLoggedOut => 'Vienas iš jūsų klientų atsijungė'; + + @override + String get addAccount => 'Pridėti paskyrą'; + + @override + String get editBundlesForAccount => 'Redaguoti šios paskyros paketus'; + + @override + String get addToBundle => 'Pridėti prie paketų'; + + @override + String get removeFromBundle => 'Pašalinkite iš šio paketo'; + + @override + String get bundleName => 'Paketo vardas'; + + @override + String get enableMultiAccounts => + '(BETA) Įgalinkite kelias paskyras šiame įrenginyje'; + + @override + String get openInMaps => 'Atidaryti žemėlapiuose'; + + @override + String get link => 'Nuoroda'; + + @override + String get serverRequiresEmail => + 'Šis serveris turi patvirtinti jūsų el. pašto adresą registracijai.'; + + @override + String get or => 'Arba'; + + @override + String get participant => 'Dalyvis'; + + @override + String get passphraseOrKey => 'Slapta frazė arba atkūrimo raktas'; + + @override + String get password => 'Slaptažodis'; + + @override + String get passwordForgotten => 'Slaptažodis užmirštas'; + + @override + String get passwordHasBeenChanged => 'Slaptažodis pakeistas'; + + @override + String get hideMemberChangesInPublicChats => + 'Hide member changes in public chats'; + + @override + String get hideMemberChangesInPublicChatsBody => + 'Do not show in the chat timeline if someone joins or leaves a public chat to improve readability.'; + + @override + String get overview => 'Overview'; + + @override + String get notifyMeFor => 'Notify me for'; + + @override + String get passwordRecoverySettings => 'Password recovery settings'; + + @override + String get passwordRecovery => 'Slaptažodžio atkūrimas'; + + @override + String get people => 'Žmonės'; + + @override + String get pickImage => 'Pasirinkite paveiksliuką'; + + @override + String get pin => 'Prisegti'; + + @override + String play(String fileName) { + return 'Groti $fileName'; + } + + @override + String get pleaseChoose => 'Prašome pasirinkti'; + + @override + String get pleaseChooseAPasscode => 'Pasirinkite slaptą kodą'; + + @override + String get pleaseClickOnLink => + 'Paspauskite nuorodą el. pašte ir tęskite toliau.'; + + @override + String get pleaseEnter4Digits => + 'Įveskite 4 skaitmenis arba palikite tuščią, jei norite išjungti programėlės užraktą.'; + + @override + String get pleaseEnterRecoveryKey => 'Įveskite savo atkūrimo raktą:'; + + @override + String get pleaseEnterYourPassword => 'Įveskite savo slaptažodį'; + + @override + String get pleaseEnterYourPin => 'Įveskite savo PIN kodą'; + + @override + String get pleaseEnterYourUsername => 'Įveskite savo vartotojo vardą'; + + @override + String get pleaseFollowInstructionsOnWeb => + 'Vadovaukitės svetainėje pateiktais nurodymais ir bakstelėkite Toliau.'; + + @override + String get privacy => 'Privatumas'; + + @override + String get publicRooms => 'Vieši kambariai'; + + @override + String get pushRules => 'Tiesioginių pranešimų taisyklės'; + + @override + String get reason => 'Priežastis'; + + @override + String get recording => 'Įrašymas'; + + @override + String redactedBy(String username) { + return 'Redacted by $username'; + } + + @override + String get directChat => 'Direct chat'; + + @override + String redactedByBecause(String username, String reason) { + return 'Redacted by $username because: \"$reason\"'; + } + + @override + String redactedAnEvent(String username) { + return '$username pašalino įvykį'; + } + + @override + String get redactMessage => 'Pašalinti žinutę'; + + @override + String get register => 'Registruotis'; + + @override + String get reject => 'Atmesti'; + + @override + String rejectedTheInvitation(String username) { + return '$username atmetė kvietimą'; + } + + @override + String get rejoin => 'Vėl prisijungti'; + + @override + String get removeAllOtherDevices => 'Pašalinti visus kitus įrenginius'; + + @override + String removedBy(String username) { + return 'Pašalino vartotojas $username'; + } + + @override + String get removeDevice => 'Pašalinti įrenginį'; + + @override + String get unbanFromChat => 'Atblokuoti pokalbyje'; + + @override + String get removeYourAvatar => 'Pašalinti savo avatarą'; + + @override + String get replaceRoomWithNewerVersion => 'Pakeisti kambarį naujesne versija'; + + @override + String get reply => 'Atsakyti'; + + @override + String get reportMessage => 'Pranešti apie žinutę'; + + @override + String get translateMessage => 'Translate message'; + + @override + String get translatedMessage => 'Translated message'; + + @override + String get errorTranslatingMessage => + 'An error has occured while translating the message.'; + + @override + String get recoverMessage => 'Recover message'; + + @override + String get recoveredMessage => 'Recovered message'; + + @override + String get errorRecoveringMessage => + 'An error has occured while recovering the message.'; + + @override + String get errorRecoveringMessageNoAdmin => + 'This feature is available on Synapse homeservers only for adminstrators.'; + + @override + String get requestPermission => 'Prašyti leidimo'; + + @override + String get roomHasBeenUpgraded => 'Kambarys buvo atnaujintas'; + + @override + String get roomVersion => 'Kambario versija'; + + @override + String get saveFile => 'Išsaugoti failą'; + + @override + String get retry => 'Retry'; + + @override + String get search => 'Ieškoti'; + + @override + String get security => 'Apsauga'; + + @override + String get recoveryKey => 'Atkūrimo raktas'; + + @override + String get recoveryKeyLost => 'Pamestas atkūrimo raktas?'; + + @override + String seenByUser(String username) { + return 'Matė $username'; + } + + @override + String get send => 'Siųsti'; + + @override + String get sendAMessage => 'Siųsti žinutę'; + + @override + String get sendAsText => 'Siųsti kaip tekstą'; + + @override + String get sendAudio => 'Siųsti garso įrašą'; + + @override + String get sendFile => 'Sųsti bylą'; + + @override + String get sendImage => 'Siųsti paveiksliuką'; + + @override + String sendImages(int count) { + return 'Send $count image'; + } + + @override + String get sendMessages => 'Siųsti žinutes'; + + @override + String get sendOriginal => 'Siųsti originalą'; + + @override + String get sendSticker => 'Siųsti lipduką'; + + @override + String get sendVideo => 'Siųsti video'; + + @override + String sentAFile(String username) { + return '📁 $username atsiuntė failą'; + } + + @override + String sentAnAudio(String username) { + return '🎤 $username atsiuntė garso įrašą'; + } + + @override + String sentAPicture(String username) { + return '🖼️ $username atsiuntė nuotrauką'; + } + + @override + String sentASticker(String username) { + return '😊 $username atsiuntė lipduką'; + } + + @override + String sentAVideo(String username) { + return '🎥 $username atsiuntė vaizdo įrašą'; + } + + @override + String sentCallInformations(String senderName) { + return '$senderName išsiuntė skambučio informaciją'; + } + + @override + String get separateChatTypes => 'Atskirti tiesioginius pokalbius ir grupes'; + + @override + String get setAsCanonicalAlias => 'Nustatyti kaip pagrindinį slapyvardį'; + + @override + String get setCustomEmotes => 'Nustatyti pasirinktinius jaustukus'; + + @override + String get setChatDescription => 'Set chat description'; + + @override + String get setInvitationLink => 'Nustatyti pakvietimo nuorodą'; + + @override + String get setPermissionsLevel => 'Nustatyti leidimų lygį'; + + @override + String get setStatus => 'Nustatyti būseną'; + + @override + String get settings => 'Nustatytmai'; + + @override + String get share => 'Bendrinti'; + + @override + String sharedTheLocation(String username) { + return '$username bendrino savo vietą'; + } + + @override + String get shareLocation => 'Bendrinti vietą'; + + @override + String get showPassword => 'Rodyti slaptažodį'; + + @override + String get presenceStyle => 'Presence:'; + + @override + String get hideAvatarsInInvites => 'Hide avatars in invites'; + + @override + String get hideAvatarsInInvitesDescription => + 'Do not show room avatars in invites'; + + @override + String get presencesToggle => 'Show status messages from other users'; + + @override + String get pureBlackToggle => 'Pure Black'; + + @override + String get singlesignon => 'Vienkartinis prisijungimas'; + + @override + String get skip => 'Praleisti'; + + @override + String get sourceCode => 'Programinis kodas'; + + @override + String get spaceIsPublic => 'Erdvė yra vieša'; + + @override + String get spaceName => 'Erdvės pavadinimas'; + + @override + String startedACall(String senderName) { + return '$senderName pradėjo skambutį'; + } + + @override + String get startFirstChat => 'Start your first chat'; + + @override + String get status => 'Būsena'; + + @override + String get statusExampleMessage => 'Kaip sekasi šiandien?'; + + @override + String get submit => 'Pateikti'; + + @override + String get synchronizingPleaseWait => 'Sinchronizuojama… Prašome palaukti.'; + + @override + String synchronizingPleaseWaitCounter(String percentage) { + return ' Synchronizing… ($percentage%)'; + } + + @override + String get systemTheme => 'Sistema'; + + @override + String get theyDontMatch => 'Jie nesutampa'; + + @override + String get theyMatch => 'Jie sutampa'; + + @override + String get title => 'FluffyChat'; + + @override + String get toggleFavorite => 'Perjungti parankinius'; + + @override + String get toggleMuted => 'Perjungti nutildytą'; + + @override + String get toggleUnread => 'Pažymėti kaip skaitytą/neskaitytą'; + + @override + String get tooManyRequestsWarning => + 'Per daug užklausų. Pabandykite dar kartą vėliau!'; + + @override + String get transferFromAnotherDevice => 'Perkėlimas iš kito įrenginio'; + + @override + String get tryToSendAgain => 'Pabandykite išsiųsti dar kartą'; + + @override + String get unavailable => 'Nepasiekiamas'; + + @override + String unbannedUser(String username, String targetName) { + return '$username atblokavo $targetName'; + } + + @override + String get unblockDevice => 'Atblokuoti įrenginį'; + + @override + String get unknownDevice => 'Nežinomas įrenginys'; + + @override + String get unknownEncryptionAlgorithm => 'Nežinomas šifravimo algoritmas'; + + @override + String unknownEvent(String type) { + return 'Nežinomas įvykis \'$type\''; + } + + @override + String get unmuteChat => 'Įjungti pokalbio garsą'; + + @override + String get unpin => 'Atsegti'; + + @override + String unreadChats(int unreadCount) { + String _temp0 = intl.Intl.pluralLogic( + unreadCount, + locale: localeName, + other: '$unreadCount neperskaityti pokalbiai', + one: '1 unread chat', + ); + return '$_temp0'; + } + + @override + String userAndOthersAreTyping(String username, int count) { + return '$username ir dar $count kiti rašo…'; + } + + @override + String userAndUserAreTyping(String username, String username2) { + return '$username ir $username2 rašo…'; + } + + @override + String userIsTyping(String username) { + return '$username rašo…'; + } + + @override + String userLeftTheChat(String username) { + return '🚪 $username paliko pokalbį'; + } + + @override + String get username => 'Vartotojo vardas'; + + @override + String userSentUnknownEvent(String username, String type) { + return '$username išsiuntė $type įvykį'; + } + + @override + String get unverified => 'Nepatvirtinta'; + + @override + String get verified => 'Patvirtinta'; + + @override + String get verify => 'Patvirtinti'; + + @override + String get verifyStart => 'Pradėti patvirtinimą'; + + @override + String get verifySuccess => 'Jūs sėkmingai patvirtinote!'; + + @override + String get verifyTitle => 'Patvirtinama kita paskyra'; + + @override + String get videoCall => 'Vaizdo skambutis'; + + @override + String get visibilityOfTheChatHistory => 'Pokalbių istorijos matomumas'; + + @override + String get visibleForAllParticipants => 'Matoma visiems dalyviams'; + + @override + String get visibleForEveryone => 'Matoma visiems'; + + @override + String get voiceMessage => 'Balso žinutė'; + + @override + String get waitingPartnerAcceptRequest => + 'Laukiama, kol dalyvis priims užklausą…'; + + @override + String get waitingPartnerEmoji => 'Laukiama, kol dalyvis priims jaustukus…'; + + @override + String get waitingPartnerNumbers => 'Laukiama, kol dalyvis priims skaičius…'; + + @override + String get wallpaper => 'Užsklanda'; + + @override + String get warning => 'Įspėjimas!'; + + @override + String get weSentYouAnEmail => 'Išsiuntėme jums el. laišką'; + + @override + String get whoCanPerformWhichAction => 'Kas gali atlikti kokį veiksmą'; + + @override + String get whoIsAllowedToJoinThisGroup => + 'Kam leidžiama prisijungti prie šios grupės'; + + @override + String get whyDoYouWantToReportThis => 'Kodėl norite apie tai pranešti?'; + + @override + String get wipeChatBackup => + 'Ištrinti atsarginę pokalbių kopiją, kad sukurti naują atkūrimo raktą?'; + + @override + String get withTheseAddressesRecoveryDescription => + 'Naudodami šiuos adresus galite atkurti savo slaptažodį.'; + + @override + String get writeAMessage => 'Rašyti žinutę…'; + + @override + String get yes => 'Taip'; + + @override + String get you => 'Jūs'; + + @override + String get youAreNoLongerParticipatingInThisChat => + 'Jūs nebedalyvaujate šiame pokalbyje'; + + @override + String get youHaveBeenBannedFromThisChat => + 'Jums buvo uždrausta dalyvauti šiame pokalbyje'; + + @override + String get yourPublicKey => 'Jūsų viešasis raktas'; + + @override + String get messageInfo => 'Žinutės informacija'; + + @override + String get time => 'Laikas'; + + @override + String get messageType => 'Žinutės tipas'; + + @override + String get sender => 'Siuntėjas'; + + @override + String get openGallery => 'Atverti galeriją'; + + @override + String get removeFromSpace => 'Pašalinti iš erdvės'; + + @override + String get addToSpaceDescription => + 'Pasirinkite erdvę, kad prie jos pridėtumėte šį pokalbį.'; + + @override + String get start => 'Pradžia'; + + @override + String get pleaseEnterRecoveryKeyDescription => + 'Norėdami atrakinti senas žinutes, įveskite atkūrimo raktą, kuris buvo sukurtas ankstesnės sesijos metu. Atkūrimo raktas NĖRA jūsų slaptažodis.'; + + @override + String get publish => 'Paskelbti'; + + @override + String videoWithSize(String size) { + return 'Vaizdo įrašas ($size)'; + } + + @override + String get openChat => 'Atverti pokalbį'; + + @override + String get markAsRead => 'Žymėti kaip skaitytą'; + + @override + String get reportUser => 'Pranešti apie vartotoją'; + + @override + String get dismiss => 'Atsisakyti'; + + @override + String reactedWith(String sender, String reaction) { + return '$sender sureagavo su $reaction'; + } + + @override + String get pinMessage => 'Prisegti prie kambario'; + + @override + String get confirmEventUnpin => + 'Ar tikrai norite visam laikui atsegti įvykį?'; + + @override + String get emojis => 'Jaustukai'; + + @override + String get placeCall => 'Skambinti'; + + @override + String get voiceCall => 'Balso skambutis'; + + @override + String get unsupportedAndroidVersion => 'Nepalaikoma Android versija'; + + @override + String get unsupportedAndroidVersionLong => + 'Šiai funkcijai reikalinga naujesnė Android versija. Patikrinkite, ar nėra naujinimų arba Lineage OS palaikymo.'; + + @override + String get videoCallsBetaWarning => + 'Atminkite, kad vaizdo skambučiai šiuo metu yra beta versijos. Jie gali neveikti taip kaip tikėtasi, arba iš viso neveikti visose platformose.'; + + @override + String get experimentalVideoCalls => 'Eksperimentiniai vaizdo skambučiai'; + + @override + String get emailOrUsername => 'El. paštas arba vartotojo vardas'; + + @override + String get indexedDbErrorTitle => 'Privataus režimo problemos'; + + @override + String get indexedDbErrorLong => + 'Deja, pagal numatytuosius nustatymus žinučių saugojimas privačiame režime nėra įjungtas.\nPrašome apsilankyti\n - about:config\n - nustatykite dom.indexedDB.privateBrowsing.enabled į true\nPriešingu atveju FluffyChat paleisti neįmanoma.'; + + @override + String switchToAccount(String number) { + return 'Perjungti paskyrą į $number'; + } + + @override + String get nextAccount => 'Kita paskyra'; + + @override + String get previousAccount => 'Ankstesnė paskyra'; + + @override + String get addWidget => 'Pridėti programėlę'; + + @override + String get widgetVideo => 'Video'; + + @override + String get widgetEtherpad => 'Teksto pastaba'; + + @override + String get widgetJitsi => 'Jitsi Meet'; + + @override + String get widgetCustom => 'Pasirinktinis'; + + @override + String get widgetName => 'Vardas'; + + @override + String get widgetUrlError => 'Netinkamas URL.'; + + @override + String get widgetNameError => 'Pateikite rodomą vardą.'; + + @override + String get errorAddingWidget => 'Pridedant valdiklį įvyko klaida.'; + + @override + String get youRejectedTheInvitation => 'Jūs atmetėte kvietimą'; + + @override + String get youJoinedTheChat => 'Jūs prisijungėte prie pokalbio'; + + @override + String get youAcceptedTheInvitation => '👍 Jūs priėmėte kvietimą'; + + @override + String youBannedUser(String user) { + return 'Jūs užblokavote $user'; + } + + @override + String youHaveWithdrawnTheInvitationFor(String user) { + return 'Jūs atšaukėte kvietimą $user'; + } + + @override + String youInvitedToBy(String alias) { + return '📩 You have been invited via link to:\n$alias'; + } + + @override + String youInvitedBy(String user) { + return '📩 Jus pakvietė $user'; + } + + @override + String invitedBy(String user) { + return '📩 Invited by $user'; + } + + @override + String youInvitedUser(String user) { + return '📩 Pakvietėte $user'; + } + + @override + String youKicked(String user) { + return '👞 Jūs išmetėte $user'; + } + + @override + String youKickedAndBanned(String user) { + return '🙅 Jūs išmetėte ir užblokavote $user'; + } + + @override + String youUnbannedUser(String user) { + return 'Jūs atblokavote $user'; + } + + @override + String hasKnocked(String user) { + return '🚪 $user has knocked'; + } + + @override + String get usersMustKnock => 'Users must knock'; + + @override + String get noOneCanJoin => 'No one can join'; + + @override + String userWouldLikeToChangeTheChat(String user) { + return '$user would like to join the chat.'; + } + + @override + String get noPublicLinkHasBeenCreatedYet => + 'No public link has been created yet'; + + @override + String get knock => 'Knock'; + + @override + String get users => 'Vartotojai'; + + @override + String get unlockOldMessages => 'Atrakinti senas žinutes'; + + @override + String get storeInSecureStorageDescription => + 'Atkūrimo raktą laikyti saugioje šio prietaiso saugykloje.'; + + @override + String get saveKeyManuallyDescription => + 'Įrašykite šį raktą rankiniu būdu, įjungę sistemos bendrinimo dialogo langą arba iškarpinę.'; + + @override + String get storeInAndroidKeystore => 'Saugoti Android raktų saugykloje'; + + @override + String get storeInAppleKeyChain => 'Saugoti Apple raktų grandinėje'; + + @override + String get storeSecurlyOnThisDevice => 'Saugiai laikyti šiame prietaise'; + + @override + String countFiles(int count) { + return '$count failai'; + } + + @override + String get user => 'Vartotojas'; + + @override + String get custom => 'Pasirinktinis'; + + @override + String get foregroundServiceRunning => + 'Šis pranešimas rodomas, kai veikia pirmojo plano paslauga.'; + + @override + String get screenSharingTitle => 'ekrano bendrinimas'; + + @override + String get screenSharingDetail => 'Bendrinate savo ekraną per FuffyChat'; + + @override + String get callingPermissions => 'Skambinimo leidimai'; + + @override + String get callingAccount => 'Skambinimo paskyra'; + + @override + String get callingAccountDetails => + 'Leidžia FluffyChat naudoti vietinę Android rinkiklio programą.'; + + @override + String get appearOnTop => 'Rodyti viršuje'; + + @override + String get appearOnTopDetails => + 'Leidžia programėlę rodyti viršuje (nebūtina, jei jau esate nustatę Fluffychat kaip skambinimo paskyrą)'; + + @override + String get otherCallingPermissions => + 'Mikrofonas, kamera ir kiti FluffyChat leidimai'; + + @override + String get whyIsThisMessageEncrypted => 'Kodėl ši žinutė neperskaitoma?'; + + @override + String get noKeyForThisMessage => + 'Taip gali atsitikti, jei žinutė buvo išsiųsta prieš prisijungiant prie paskyros šiame prietaise.\n\nTaip pat gali būti, kad siuntėjas užblokavo jūsų prietaisą arba kažkas sutriko su interneto ryšiu.\n\nAr galite perskaityti žinutę kitoje sesijoje? Tada galite perkelti žinutę iš jos! Eikite į Nustatymai > Prietaisai ir įsitikinkite, kad jūsų prietaisai patvirtino vienas kitą. Kai kitą kartą atidarysite kambarį ir abi sesijos bus pirmame plane, raktai bus perduoti automatiškai.\n\nNenorite prarasti raktų atsijungdami arba keisdami įrenginius? Įsitikinkite, kad nustatymuose įjungėte pokalbių atsarginę kopiją.'; + + @override + String get newGroup => 'Nauja grupė'; + + @override + String get newSpace => 'Nauja erdvė'; + + @override + String get enterSpace => 'Įeiti į erdvę'; + + @override + String get enterRoom => 'Įeiti į kambarį'; + + @override + String get allSpaces => 'Visos erdvės'; + + @override + String numChats(String number) { + return '$number pokalbiai'; + } + + @override + String get hideUnimportantStateEvents => 'Slėpti nesvarbius būsenos įvykius'; + + @override + String get hidePresences => 'Hide Status List?'; + + @override + String get doNotShowAgain => 'Do not show again'; + + @override + String wasDirectChatDisplayName(String oldDisplayName) { + return 'Empty chat (was $oldDisplayName)'; + } + + @override + String get newSpaceDescription => + 'Spaces allows you to consolidate your chats and build private or public communities.'; + + @override + String get encryptThisChat => 'Encrypt this chat'; + + @override + String get disableEncryptionWarning => + 'For security reasons you can not disable encryption in a chat, where it has been enabled before.'; + + @override + String get sorryThatsNotPossible => 'Sorry... that is not possible'; + + @override + String get deviceKeys => 'Device keys:'; + + @override + String get reopenChat => 'Reopen chat'; + + @override + String get noBackupWarning => + 'Warning! Without enabling chat backup, you will lose access to your encrypted messages. It is highly recommended to enable the chat backup first before logging out.'; + + @override + String get noOtherDevicesFound => 'No other devices found'; + + @override + String fileIsTooBigForServer(String max) { + return 'Unable to send! The server only supports attachments up to $max.'; + } + + @override + String fileHasBeenSavedAt(String path) { + return 'File has been saved at $path'; + } + + @override + String get jumpToLastReadMessage => 'Jump to last read message'; + + @override + String get readUpToHere => 'Read up to here'; + + @override + String get jump => 'Jump'; + + @override + String get openLinkInBrowser => 'Open link in browser'; + + @override + String get reportErrorDescription => + '😭 Oh no. Something went wrong. If you want, you can report this bug to the developers.'; + + @override + String get report => 'Report'; + + @override + String get signInWithPassword => 'Sign in with password'; + + @override + String get pleaseTryAgainLaterOrChooseDifferentServer => + 'Please try again later or choose a different server.'; + + @override + String signInWith(String provider) { + return 'Sign in with $provider'; + } + + @override + String get profileNotFound => + 'The user could not be found on the server. Maybe there is a connection problem or the user doesn\'t exist.'; + + @override + String get setTheme => 'Set theme:'; + + @override + String get setColorTheme => 'Set color theme:'; + + @override + String get invite => 'Invite'; + + @override + String get inviteGroupChat => '📨 Invite group chat'; + + @override + String get invitePrivateChat => '📨 Invite private chat'; + + @override + String get invalidInput => 'Invalid input!'; + + @override + String wrongPinEntered(int seconds) { + return 'Wrong pin entered! Try again in $seconds seconds...'; + } + + @override + String get pleaseEnterANumber => 'Please enter a number greater than 0'; + + @override + String get archiveRoomDescription => + 'The chat will be moved to the archive. Other users will be able to see that you have left the chat.'; + + @override + String get roomUpgradeDescription => + 'The chat will then be recreated with the new room version. All participants will be notified that they need to switch to the new chat. You can find out more about room versions at https://spec.matrix.org/latest/rooms/'; + + @override + String get removeDevicesDescription => + 'You will be logged out of this device and will no longer be able to receive messages.'; + + @override + String get banUserDescription => + 'The user will be banned from the chat and will not be able to enter the chat again until they are unbanned.'; + + @override + String get unbanUserDescription => + 'The user will be able to enter the chat again if they try.'; + + @override + String get kickUserDescription => + 'The user is kicked out of the chat but not banned. In public chats, the user can rejoin at any time.'; + + @override + String get makeAdminDescription => + 'Once you make this user admin, you may not be able to undo this as they will then have the same permissions as you.'; + + @override + String get pushNotificationsNotAvailable => + 'Push notifications not available'; + + @override + String get learnMore => 'Learn more'; + + @override + String get yourGlobalUserIdIs => 'Your global user-ID is: '; + + @override + String noUsersFoundWithQuery(String query) { + return 'Unfortunately no user could be found with \"$query\". Please check whether you made a typo.'; + } + + @override + String get knocking => 'Knocking'; + + @override + String chatCanBeDiscoveredViaSearchOnServer(String server) { + return 'Chat can be discovered via the search on $server'; + } + + @override + String get searchChatsRooms => 'Search for #chats, @users...'; + + @override + String get nothingFound => 'Nothing found...'; + + @override + String get groupName => 'Group name'; + + @override + String get createGroupAndInviteUsers => 'Create a group and invite users'; + + @override + String get groupCanBeFoundViaSearch => 'Group can be found via search'; + + @override + String get wrongRecoveryKey => + 'Sorry... this does not seem to be the correct recovery key.'; + + @override + String get startConversation => 'Start conversation'; + + @override + String get commandHint_sendraw => 'Send raw json'; + + @override + String get databaseMigrationTitle => 'Database is optimized'; + + @override + String get databaseMigrationBody => 'Please wait. This may take a moment.'; + + @override + String get leaveEmptyToClearStatus => 'Leave empty to clear your status.'; + + @override + String get select => 'Select'; + + @override + String get searchForUsers => 'Search for @users...'; + + @override + String get pleaseEnterYourCurrentPassword => + 'Please enter your current password'; + + @override + String get newPassword => 'New password'; + + @override + String get pleaseChooseAStrongPassword => 'Please choose a strong password'; + + @override + String get passwordsDoNotMatch => 'Passwords do not match'; + + @override + String get passwordIsWrong => 'Your entered password is wrong'; + + @override + String get publicLink => 'Public link'; + + @override + String get publicChatAddresses => 'Public chat addresses'; + + @override + String get createNewAddress => 'Create new address'; + + @override + String get joinSpace => 'Join space'; + + @override + String get publicSpaces => 'Public spaces'; + + @override + String get addChatOrSubSpace => 'Add chat or sub space'; + + @override + String get subspace => 'Subspace'; + + @override + String get decline => 'Decline'; + + @override + String get thisDevice => 'This device:'; + + @override + String get initAppError => 'An error occured while init the app'; + + @override + String get userRole => 'User role'; + + @override + String minimumPowerLevel(String level) { + return '$level is the minimum power level.'; + } + + @override + String searchIn(String chat) { + return 'Search in chat \"$chat\"...'; + } + + @override + String get searchMore => 'Search more...'; + + @override + String get gallery => 'Gallery'; + + @override + String get files => 'Files'; + + @override + String databaseBuildErrorBody(String url, String error) { + return 'Unable to build the SQlite database. The app tries to use the legacy database for now. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String sessionLostBody(String url, String error) { + return 'Your session is lost. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String restoreSessionBody(String url, String error) { + return 'The app now tries to restore your session from the backup. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String forwardMessageTo(String roomName) { + return 'Forward message to $roomName?'; + } + + @override + String get sendReadReceipts => 'Send read receipts'; + + @override + String get sendTypingNotificationsDescription => + 'Other participants in a chat can see when you are typing a new message.'; + + @override + String get sendReadReceiptsDescription => + 'Other participants in a chat can see when you have read a message.'; + + @override + String get formattedMessages => 'Formatted messages'; + + @override + String get formattedMessagesDescription => + 'Display rich message content like bold text using markdown.'; + + @override + String get verifyOtherUser => '🔐 Verify other user'; + + @override + String get verifyOtherUserDescription => + 'If you verify another user, you can be sure that you know who you are really writing to. 💪\n\nWhen you start a verification, you and the other user will see a popup in the app. There you will then see a series of emojis or numbers that you have to compare with each other.\n\nThe best way to do this is to meet up or start a video call. 👭'; + + @override + String get verifyOtherDevice => '🔐 Verify other device'; + + @override + String get verifyOtherDeviceDescription => + 'When you verify another device, those devices can exchange keys, increasing your overall security. 💪 When you start a verification, a popup will appear in the app on both devices. There you will then see a series of emojis or numbers that you have to compare with each other. It\'s best to have both devices handy before you start the verification. 🤳'; + + @override + String acceptedKeyVerification(String sender) { + return '$sender accepted key verification'; + } + + @override + String canceledKeyVerification(String sender) { + return '$sender canceled key verification'; + } + + @override + String completedKeyVerification(String sender) { + return '$sender completed key verification'; + } + + @override + String isReadyForKeyVerification(String sender) { + return '$sender is ready for key verification'; + } + + @override + String requestedKeyVerification(String sender) { + return '$sender requested key verification'; + } + + @override + String startedKeyVerification(String sender) { + return '$sender started key verification'; + } + + @override + String get transparent => 'Transparent'; + + @override + String get incomingMessages => 'Incoming messages'; + + @override + String get stickers => 'Stickers'; + + @override + String get discover => 'Discover'; + + @override + String get commandHint_ignore => 'Ignore the given matrix ID'; + + @override + String get commandHint_unignore => 'Unignore the given matrix ID'; + + @override + String unreadChatsInApp(String appname, String unread) { + return '$appname: $unread unread chats'; + } + + @override + String get noDatabaseEncryption => + 'Database encryption is not supported on this platform'; + + @override + String thereAreCountUsersBlocked(Object count) { + return 'Right now there are $count users blocked.'; + } + + @override + String get restricted => 'Restricted'; + + @override + String get knockRestricted => 'Knock restricted'; + + @override + String goToSpace(Object space) { + return 'Go to space: $space'; + } + + @override + String get markAsUnread => 'Mark as unread'; + + @override + String userLevel(int level) { + return '$level - User'; + } + + @override + String moderatorLevel(int level) { + return '$level - Moderator'; + } + + @override + String adminLevel(int level) { + return '$level - Admin'; + } + + @override + String get changeGeneralChatSettings => 'Change general chat settings'; + + @override + String get inviteOtherUsers => 'Invite other users to this chat'; + + @override + String get changeTheChatPermissions => 'Change the chat permissions'; + + @override + String get changeTheVisibilityOfChatHistory => + 'Change the visibility of the chat history'; + + @override + String get changeTheCanonicalRoomAlias => + 'Change the main public chat address'; + + @override + String get sendRoomNotifications => 'Send a @room notifications'; + + @override + String get changeTheDescriptionOfTheGroup => + 'Change the description of the chat'; + + @override + String get chatPermissionsDescription => + 'Define which power level is necessary for certain actions in this chat. The power levels 0, 50 and 100 are usually representing users, moderators and admins, but any gradation is possible.'; + + @override + String updateInstalled(String version) { + return '🎉 Update $version installed!'; + } + + @override + String get changelog => 'Changelog'; + + @override + String get sendCanceled => 'Sending canceled'; + + @override + String get loginWithMatrixId => 'Login with Matrix-ID'; + + @override + String get discoverHomeservers => 'Discover homeservers'; + + @override + String get whatIsAHomeserver => 'What is a homeserver?'; + + @override + String get homeserverDescription => + 'All your data is stored on the homeserver, just like an email provider. You can choose which homeserver you want to use, while you can still communicate with everyone. Learn more at at https://matrix.org.'; + + @override + String get doesNotSeemToBeAValidHomeserver => + 'Doesn\'t seem to be a compatible homeserver. Wrong URL?'; + + @override + String get calculatingFileSize => 'Calculating file size...'; + + @override + String get prepareSendingAttachment => 'Prepare sending attachment...'; + + @override + String get sendingAttachment => 'Sending attachment...'; + + @override + String get generatingVideoThumbnail => 'Generating video thumbnail...'; + + @override + String get compressVideo => 'Compressing video...'; + + @override + String sendingAttachmentCountOfCount(int index, int length) { + return 'Sending attachment $index of $length...'; + } + + @override + String serverLimitReached(int seconds) { + return 'Server limit reached! Waiting $seconds seconds...'; + } + + @override + String get oneOfYourDevicesIsNotVerified => + 'One of your devices is not verified'; + + @override + String get noticeChatBackupDeviceVerification => + 'Note: When you connect all your devices to the chat backup, they are automatically verified.'; + + @override + String get continueText => 'Continue'; + + @override + String get welcomeText => + 'Hey Hey 👋 This is Extera. You can sign in to any homeserver, which is compatible with https://matrix.org. And then chat with anyone. It\'s a huge decentralized messaging network!'; + + @override + String get blur => 'Blur:'; + + @override + String get opacity => 'Opacity:'; + + @override + String get setWallpaper => 'Set wallpaper'; + + @override + String get manageAccount => 'Manage account'; + + @override + String get noContactInformationProvided => + 'Server does not provide any valid contact information'; + + @override + String get contactServerAdmin => 'Contact server admin'; + + @override + String get contactServerSecurity => 'Contact server security'; + + @override + String get supportPage => 'Support page'; + + @override + String get serverInformation => 'Server information:'; + + @override + String get name => 'Name'; + + @override + String get version => 'Version'; + + @override + String get website => 'Website'; + + @override + String get compress => 'Compress'; + + @override + String get boldText => 'Bold text'; + + @override + String get italicText => 'Italic text'; + + @override + String get strikeThrough => 'Strikethrough'; + + @override + String get pleaseFillOut => 'Please fill out'; + + @override + String get invalidUrl => 'Invalid url'; + + @override + String get addLink => 'Add link'; + + @override + String get unableToJoinChat => + 'Unable to join chat. Maybe the other party has already closed the conversation.'; + + @override + String get previous => 'Previous'; + + @override + String get otherPartyNotLoggedIn => + 'The other party is currently not logged in and therefore cannot receive messages!'; + + @override + String appWantsToUseForLogin(String server) { + return 'Use \'$server\' to log in'; + } + + @override + String get appWantsToUseForLoginDescription => + 'You hereby allow the app and website to share information about you.'; + + @override + String get open => 'Open'; + + @override + String get waitingForServer => 'Waiting for server...'; + + @override + String get appIntroduction => + 'Extera lets you chat with your friends across different messengers. Learn more at https://matrix.org or just tap *Continue*.'; + + @override + String get newChatRequest => '📩 New chat request'; + + @override + String get contentNotificationSettings => 'Content notification settings'; + + @override + String get generalNotificationSettings => 'General notification settings'; + + @override + String get roomNotificationSettings => 'Room notification settings'; + + @override + String get userSpecificNotificationSettings => + 'User specific notification settings'; + + @override + String get otherNotificationSettings => 'Other notification settings'; + + @override + String get notificationRuleContainsUserName => 'Contains User Name'; + + @override + String get notificationRuleContainsUserNameDescription => + 'Notifies the user when a message contains their username.'; + + @override + String get notificationRuleMaster => 'Mute all notifications'; + + @override + String get notificationRuleMasterDescription => + 'Overrides all other rules and disables all notifications.'; + + @override + String get notificationRuleSuppressNotices => 'Suppress Automated Messages'; + + @override + String get notificationRuleSuppressNoticesDescription => + 'Suppresses notifications from automated clients like bots.'; + + @override + String get notificationRuleInviteForMe => 'Invite for Me'; + + @override + String get notificationRuleInviteForMeDescription => + 'Notifies the user when they are invited to a room.'; + + @override + String get notificationRuleMemberEvent => 'Member Event'; + + @override + String get notificationRuleMemberEventDescription => + 'Suppresses notifications for membership events.'; + + @override + String get notificationRuleIsUserMention => 'User Mention'; + + @override + String get notificationRuleIsUserMentionDescription => + 'Notifies the user when they are directly mentioned in a message.'; + + @override + String get notificationRuleContainsDisplayName => 'Contains Display Name'; + + @override + String get notificationRuleContainsDisplayNameDescription => + 'Notifies the user when a message contains their display name.'; + + @override + String get notificationRuleIsRoomMention => 'Room Mention'; + + @override + String get notificationRuleIsRoomMentionDescription => + 'Notifies the user when there is a room mention.'; + + @override + String get notificationRuleRoomnotif => 'Room Notification'; + + @override + String get notificationRuleRoomnotifDescription => + 'Notifies the user when a message contains \'@room\'.'; + + @override + String get notificationRuleTombstone => 'Tombstone'; + + @override + String get notificationRuleTombstoneDescription => + 'Notifies the user about room deactivation messages.'; + + @override + String get notificationRuleReaction => 'Reaction'; + + @override + String get notificationRuleReactionDescription => + 'Suppresses notifications for reactions.'; + + @override + String get notificationRuleRoomServerAcl => 'Room Server ACL'; + + @override + String get notificationRuleRoomServerAclDescription => + 'Suppresses notifications for room server access control lists (ACL).'; + + @override + String get notificationRuleSuppressEdits => 'Suppress Edits'; + + @override + String get notificationRuleSuppressEditsDescription => + 'Suppresses notifications for edited messages.'; + + @override + String get notificationRuleCall => 'Call'; + + @override + String get notificationRuleCallDescription => + 'Notifies the user about calls.'; + + @override + String get notificationRuleEncryptedRoomOneToOne => + 'Encrypted Room One-to-One'; + + @override + String get notificationRuleEncryptedRoomOneToOneDescription => + 'Notifies the user about messages in encrypted one-to-one rooms.'; + + @override + String get notificationRuleRoomOneToOne => 'Room One-to-One'; + + @override + String get notificationRuleRoomOneToOneDescription => + 'Notifies the user about messages in one-to-one rooms.'; + + @override + String get notificationRuleMessage => 'Message'; + + @override + String get notificationRuleMessageDescription => + 'Notifies the user about general messages.'; + + @override + String get notificationRuleEncrypted => 'Encrypted'; + + @override + String get notificationRuleEncryptedDescription => + 'Notifies the user about messages in encrypted rooms.'; + + @override + String get notificationRuleJitsi => 'Jitsi'; + + @override + String get notificationRuleJitsiDescription => + 'Notifies the user about Jitsi widget events.'; + + @override + String get notificationRuleServerAcl => 'Suppress Server ACL Events'; + + @override + String get notificationRuleServerAclDescription => + 'Suppresses notifications for Server ACL events.'; + + @override + String unknownPushRule(String rule) { + return 'Unknown push rule \'$rule\''; + } + + @override + String get deletePushRuleCanNotBeUndone => + 'If you delete this notification setting, this can not be undone.'; + + @override + String get more => 'More'; + + @override + String get shareKeysWith => 'Share keys with...'; + + @override + String get shareKeysWithDescription => + 'Which devices should be trusted so that they can read along your messages in encrypted chats?'; + + @override + String get allDevices => 'All devices'; + + @override + String get crossVerifiedDevicesIfEnabled => + 'Cross verified devices if enabled'; + + @override + String get crossVerifiedDevices => 'Cross verified devices'; + + @override + String get verifiedDevicesOnly => 'Verified devices only'; + + @override + String get takeAPhoto => 'Take a photo'; + + @override + String get recordAVideo => 'Record a video'; + + @override + String get optionalMessage => '(Optional) message...'; + + @override + String get notSupportedOnThisDevice => 'Not supported on this device'; + + @override + String get enterNewChat => 'Enter new chat'; + + @override + String get approve => 'Approve'; + + @override + String get youHaveKnocked => 'You have knocked'; + + @override + String get pleaseWaitUntilInvited => + 'Please wait now, until someone from the room invites you.'; +} diff --git a/lib/generated/l10n/l10n_lv.dart b/lib/generated/l10n/l10n_lv.dart new file mode 100644 index 0000000..13b78d9 --- /dev/null +++ b/lib/generated/l10n/l10n_lv.dart @@ -0,0 +1,2763 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'l10n.dart'; + +// ignore_for_file: type=lint + +/// The translations for Latvian (`lv`). +class L10nLv extends L10n { + L10nLv([String locale = 'lv']) : super(locale); + + @override + String get noSendPermission => 'You can\'t send messages here'; + + @override + String get alwaysUse24HourFormat => 'nē'; + + @override + String get repeatPassword => 'Atkārtot paroli'; + + @override + String get notAnImage => 'Nav attēla datne.'; + + @override + String get setCustomPermissionLevel => 'Set custom permission level'; + + @override + String get setPermissionsLevelDescription => + 'Please choose a predefined role below or enter a custom permission level between 0 and 100.'; + + @override + String get ignoreUser => 'Ignore user'; + + @override + String get normalUser => 'Normal user'; + + @override + String get remove => 'Noņemt'; + + @override + String get importNow => 'Ievietot tagad'; + + @override + String get importEmojis => 'Ievietot emocijzīmes'; + + @override + String get importFromZipFile => 'Ievietot no .zip datnes'; + + @override + String get exportEmotePack => 'Izgūt emociju paku kā .zip'; + + @override + String get replace => 'Aizstāt'; + + @override + String get about => 'Par'; + + @override + String aboutHomeserver(String homeserver) { + return 'Par $homeserver'; + } + + @override + String get accept => 'Pieņemt'; + + @override + String acceptedTheInvitation(String username) { + return '👍 $username pieņēma uzaicinājumu'; + } + + @override + String get account => 'Konts'; + + @override + String activatedEndToEndEncryption(String username) { + return '🔐 $username iespējoja pilnīgu šifrēšanu'; + } + + @override + String get addEmail => 'Pievienot e-pasta adresi'; + + @override + String get confirmMatrixId => + 'Lūgums apliecināt savu Matrix Id, lai varētu izdzēst savu kontu.'; + + @override + String supposedMxid(String mxid) { + return 'Tam būtu jābūt $mxid'; + } + + @override + String get addChatDescription => 'Pievienot tērzēšanas aprakstu...'; + + @override + String get addToSpace => 'Pievienot vietai'; + + @override + String get admin => 'Pārvaldītājs'; + + @override + String get alias => 'aizstājvārds'; + + @override + String get all => 'Viss'; + + @override + String get allChats => 'Visas tērzēšanas'; + + @override + String get commandHint_roomupgrade => + 'Uzlabot šo istabu uz norādīto istabas versiju'; + + @override + String get commandHint_googly => 'Nosūtīt izbolītu acu pāri'; + + @override + String get commandHint_cuddle => 'Nosūtīt samīļojienu'; + + @override + String get commandHint_hug => 'Nosūtīt apskāvienu'; + + @override + String googlyEyesContent(String senderName) { + return '$senderName sūta izbolītas acis'; + } + + @override + String cuddleContent(String senderName) { + return '$senderName samīļo Tevi'; + } + + @override + String hugContent(String senderName) { + return '$senderName apskauj Tevi'; + } + + @override + String answeredTheCall(String senderName) { + return '$senderName atbildēja uz zvanu'; + } + + @override + String get anyoneCanJoin => 'Ikviens var pievienoties'; + + @override + String get appLock => 'Lietotnes aizslēgšana'; + + @override + String get appLockDescription => + 'Aizslēgt lietotni, kad tā netiek izmantota, ar PIN kodu'; + + @override + String get archive => 'Arhīvs'; + + @override + String get areGuestsAllowedToJoin => + 'Vai vieslietotājiem ir ļauts pievienoties'; + + @override + String get areYouSure => 'Vai tiešām?'; + + @override + String get areYouSureYouWantToLogout => 'Vai tiešām atteikties?'; + + @override + String get askSSSSSign => + 'Lai varētu parakstīt otru cilvēku, lūgums ievadīt savu drošo krātuves paroles vārdkopu vai atkopes atslēgu.'; + + @override + String askVerificationRequest(String username) { + return 'Pieņemt apliecināšanas pieprasījumu no $username?'; + } + + @override + String get autoplayImages => + 'Automātiski atskaņot animētas uzlīmes un emocijas'; + + @override + String badServerLoginTypesException(String serverVersions, + String supportedVersions, Object suportedVersions) { + return 'Mājasserveris nodrošina pieteikšanās veidus:\n$serverVersions\nSavukārt, šī lietotne atbalsta tikai:\n$supportedVersions'; + } + + @override + String get sendTypingNotifications => 'Nosūtīt rakstīšanas paziņojumus'; + + @override + String get swipeRightToLeftToReply => + 'Pavilkt no labās puses uz kreiso, lai atbildētu'; + + @override + String get sendOnEnter => 'Nosūtīt ar Enter'; + + @override + String badServerVersionsException(String serverVersions, + String supportedVersions, Object serverVerions, Object suportedVersions) { + return 'Mājasserveris nodrošina specifikācijas versijas:\n$serverVersions\nSavukārt, lietotne atbalsta tikai $supportedVersions'; + } + + @override + String countChatsAndCountParticipants(int chats, int participants) { + return '$chats tērzēšanas un $participants dalībnieki'; + } + + @override + String get noMoreChatsFound => 'Vairs netika atrasta neviena tērzēšana...'; + + @override + String get noChatsFoundHere => + 'Šeit vēl nav tērzēšanu. Jauna saruna ar kādu ir uzsākama ar zemāk esošo pogu. ⤵️'; + + @override + String get joinedChats => 'Tērzēšanas, kurās piedalos'; + + @override + String get unread => 'Nelasītas'; + + @override + String get space => 'Vieta'; + + @override + String get spaces => 'Vietas'; + + @override + String get banFromChat => 'Izslēgt no tērzēšanas'; + + @override + String get banned => 'Izslēgts'; + + @override + String bannedUser(String username, String targetName) { + return '$username izslēdza $targetName'; + } + + @override + String get blockDevice => 'Liegt ierīci'; + + @override + String get blocked => 'Liegta'; + + @override + String get botMessages => 'Robotprogrammatūras ziņas'; + + @override + String get cancel => 'Atcelt'; + + @override + String cantOpenUri(String uri) { + return 'Nevar atvērt adresi $uri'; + } + + @override + String get changeDeviceName => 'Mainīt ierīces nosaukumu'; + + @override + String changedTheChatAvatar(String username) { + return '$username nomainīja tērzēšanas attēlu'; + } + + @override + String changedTheChatDescriptionTo(String username, String description) { + return '$username nomainīja tērzēšanas aprakstu uz \'$description\''; + } + + @override + String changedTheChatNameTo(String username, String chatname) { + return '$username nomainīja tērzēšanas nosaukumu uz \'$chatname\''; + } + + @override + String changedTheChatPermissions(String username) { + return '$username nomainīja tērzēšanas atļaujas'; + } + + @override + String changedTheDisplaynameTo(String username, String displayname) { + return '$username nomainīja savu attēlojamo vārdu uz \'$displayname\''; + } + + @override + String changedTheGuestAccessRules(String username) { + return '$username nomainīja viesu piekļuves nosacījumus'; + } + + @override + String changedTheGuestAccessRulesTo(String username, String rules) { + return '$username nomainīja viesu piekļuves nosacījumus uz $rules'; + } + + @override + String changedTheHistoryVisibility(String username) { + return '$username mainīja vēstures redzamību'; + } + + @override + String changedTheHistoryVisibilityTo(String username, String rules) { + return '$username nomainīja vēstures redzamību uz $rules'; + } + + @override + String changedTheJoinRules(String username) { + return '$username nomainīja pievienošanās nosacījumus'; + } + + @override + String changedTheJoinRulesTo(String username, String joinRules) { + return '$username nomainīja pievienošanās nosacījumus uz $joinRules'; + } + + @override + String changedTheProfileAvatar(String username) { + return '$username nomainīja savu attēlu'; + } + + @override + String changedTheRoomAliases(String username) { + return '$username nomainīja istabas aizstājvārdus'; + } + + @override + String changedTheRoomInvitationLink(String username) { + return '$username nomainīja uzaicinājuma saiti'; + } + + @override + String get changePassword => 'Nomainīt paroli'; + + @override + String get changeTheHomeserver => 'Mainīt mājasserveri'; + + @override + String get changeTheme => 'Mainīt izskatu'; + + @override + String get changeTheNameOfTheGroup => 'Mainīt kopas nosaukumu'; + + @override + String get changeYourAvatar => 'Mainīt savu attēlu'; + + @override + String get channelCorruptedDecryptError => 'Šifrēšana tika bojāta'; + + @override + String get chat => 'Tērzēšana'; + + @override + String get yourChatBackupHasBeenSetUp => + 'Tērzēšanu rezerves kopēšana tika iestatīta.'; + + @override + String get chatBackup => 'Tērzēšanu rezerves kopēšana'; + + @override + String get chatBackupDescription => + 'Iepriekšējās ziņas ir aizsargātas ar atkopes atslēgu. Lūgums nodrošināt, ka tā netiek pazaudēta.'; + + @override + String get chatDetails => 'Tērzēšanas izvērsums'; + + @override + String get chatHasBeenAddedToThisSpace => + 'Šai vietai tika pievienota tērzēšana'; + + @override + String get chats => 'Tērzēšanas'; + + @override + String get chooseAStrongPassword => 'Jāizvēlas droša parole'; + + @override + String get clearArchive => 'Iztīrīt arhīvu'; + + @override + String get close => 'Aizvērt'; + + @override + String get commandHint_markasdm => + 'Atzīmēt kā tiešo ziņu istabu norādītajam Matrix Id'; + + @override + String get commandHint_markasgroup => 'Atzīmēt kā kopu'; + + @override + String get commandHint_ban => 'Izslēgt norādīto lietotāju no šīs istabas'; + + @override + String get commandHint_clearcache => 'Iztīrīt kešatmiņu'; + + @override + String get commandHint_create => + 'Izveidot tukšu kopas tērzēšanu\nLai atspējotu šifrēšanu, jāizmanto --no-encryption'; + + @override + String get commandHint_discardsession => 'Atmest sesiju'; + + @override + String get commandHint_dm => + 'Uzsākt tiešu tērzēšanu\nLai atspējotu šifrēšanu, jāizmanto --no-encryption'; + + @override + String get commandHint_html => 'Nosūtīt ar HTML formatētu tekstu'; + + @override + String get commandHint_invite => 'Uzaicināt norādīto lietotāju šajā istabā'; + + @override + String get commandHint_join => 'Pievienoties norādītajai istabai'; + + @override + String get commandHint_kick => 'Noņemt norādīto lietotāju no šīs istabas'; + + @override + String get commandHint_leave => 'Pamest šo istabu'; + + @override + String get commandHint_me => 'Apraksti sevi'; + + @override + String get commandHint_myroomavatar => + 'Iestatīt savu attēlu šajā istabā (ar mxc-uri)'; + + @override + String get commandHint_myroomnick => + 'Iestatīt savu attēlojamo vārdu šajā istabā'; + + @override + String get commandHint_op => + 'Iestatīt norādītā lietotāja pilnvaru līmeni (noklusējums: 50)'; + + @override + String get commandHint_plain => 'Nosūtīt neformatētu tekstu'; + + @override + String get commandHint_react => 'Nosūtīt atbildi kā reakciju'; + + @override + String get commandHint_send => 'Nosūtīt tekstu'; + + @override + String get commandHint_unban => + 'Atcelt norādītā lietotāja izslēgšanu no šīs istabas'; + + @override + String get commandInvalid => 'Nederīga komanda'; + + @override + String commandMissing(String command) { + return '$command nav komanda.'; + } + + @override + String get compareEmojiMatch => 'Lūgums salīdzināt emocijzīmes'; + + @override + String get compareNumbersMatch => 'Lūgums salīdzināt skaitļus'; + + @override + String get configureChat => 'Konfigurēt tērzēšanu'; + + @override + String get confirm => 'Apstiprināt'; + + @override + String get connect => 'Savienot'; + + @override + String get contactHasBeenInvitedToTheGroup => + 'Kontaktpersona tika uzaicināta kopā'; + + @override + String get containsDisplayName => 'Satur attēlojamo vārdu'; + + @override + String get containsUserName => 'Satur lietotājvārdu'; + + @override + String get contentHasBeenReported => + 'Par saturu tika ziņos servera pārvaldītājiem'; + + @override + String get copiedToClipboard => 'Ievietots starpliktuvē'; + + @override + String get copy => 'Ievietot starpliktuvē'; + + @override + String get copyToClipboard => 'Ievietot starpliktuvē'; + + @override + String couldNotDecryptMessage(String error) { + return 'Nevarēja atšifrēt ziņu: $error'; + } + + @override + String countParticipants(int count) { + return '$count dalībnieki'; + } + + @override + String get create => 'Izveidot'; + + @override + String createdTheChat(String username) { + return '💬 $username izveidoja tērzēšanu'; + } + + @override + String get createGroup => 'Izveidot kopu'; + + @override + String get createNewSpace => 'Jauna vieta'; + + @override + String get currentlyActive => 'Pašreiz darbīgi'; + + @override + String get darkTheme => 'Tumšs'; + + @override + String dateAndTimeOfDay(String date, String timeOfDay) { + return '$date, $timeOfDay'; + } + + @override + String dateWithoutYear(String month, String day) { + return '$day.$month.'; + } + + @override + String dateWithYear(String year, String month, String day) { + return '$day.$month.$year.'; + } + + @override + String get deactivateAccountWarning => + 'Tas atspējos Tavu lietotāja kontu. To nevar atdarīt. Vai tiešām?'; + + @override + String get defaultPermissionLevel => + 'Noklusējuma atļauju līmenis jauniem lietotājiem'; + + @override + String get delete => 'Izdzēst'; + + @override + String get deleteAccount => 'Izdzēst kontu'; + + @override + String get deleteMessage => 'Izdzēst ziņu'; + + @override + String get device => 'Ierīce'; + + @override + String get deviceId => 'Ierīces Id'; + + @override + String get devices => 'Ierīces'; + + @override + String get directChats => 'Tiešās tērzēšanas'; + + @override + String get allRooms => 'Visas kopu tērzēšanas'; + + @override + String get displaynameHasBeenChanged => 'Attēlojamais vārds tika nomainīts'; + + @override + String get downloadFile => 'Lejupielādēt datni'; + + @override + String get edit => 'Labot'; + + @override + String get editBlockedServers => 'Labot liegtos serverus'; + + @override + String get chatPermissions => 'Tērzēšanas atļaujas'; + + @override + String get editDisplayname => 'Labot attēlojamo vārdu'; + + @override + String get editRoomAliases => 'Labot istabu aizstājvārdus'; + + @override + String get editRoomAvatar => 'Labot istabas attēlu'; + + @override + String get emoteExists => 'Emocija jau pastāv.'; + + @override + String get emoteInvalid => 'Nederīgs emocijas īskods.'; + + @override + String get emoteKeyboardNoRecents => + 'Nesen izmantotās emocijas parādīsies šeit...'; + + @override + String get emotePacks => 'Emociju pakas istabai'; + + @override + String get emoteSettings => 'Emociju iestatījumi'; + + @override + String get globalChatId => 'Vispārējais tērzēšanas Id'; + + @override + String get accessAndVisibility => 'Piekļuve un redzamība'; + + @override + String get accessAndVisibilityDescription => + 'Kam ir ļauts pievienoties šai tērzēšanai un kā tērzēšana var tikt atklāta.'; + + @override + String get calls => 'Zvani'; + + @override + String get customEmojisAndStickers => 'Pielāgotas emocijzīmes un uzlīmes'; + + @override + String get customEmojisAndStickersBody => + 'Pievienot vai kopīgot pielāgotas emocijzīmes vai uzlīmes, kas var tikt izmantotas jebkurā tērzēšanā.'; + + @override + String get emoteShortcode => 'Emocijas īskods'; + + @override + String get emoteWarnNeedToPick => + 'Nepieciešams izvēlēties emocijas īskodu un attēlu.'; + + @override + String get emptyChat => 'Tukša tērzēšana'; + + @override + String get enableEmotesGlobally => 'Iespējot kā vispārēju emociju paku'; + + @override + String get enableEncryption => 'Iespējot šifrēšanu'; + + @override + String get enableEncryptionWarning => + 'Vairs nebūs iespējams atspējot šifrēšanu. Vai tiešām to darīt?'; + + @override + String get encrypted => 'Šifrēta'; + + @override + String get encryption => 'Šifrēšana'; + + @override + String get encryptionNotEnabled => 'Šifrēšana nav iespējota'; + + @override + String endedTheCall(String senderName) { + return '$senderName beidza zvanu'; + } + + @override + String get enterAnEmailAddress => 'Jāievada e-pasta adrese'; + + @override + String get homeserver => 'Mājasserveris'; + + @override + String get enterYourHomeserver => 'Jāievada mājasserveris'; + + @override + String errorObtainingLocation(String error) { + return 'Kļūda atrašanās vietas iegūšanā: $error'; + } + + @override + String get everythingReady => 'Viss ir gatavs!'; + + @override + String get extremeOffensive => 'Īpaši aizskarošs'; + + @override + String get fileName => 'Datnes nosaukums'; + + @override + String get fluffychat => 'FluffyChat'; + + @override + String get fontSize => 'Fonta izmērs'; + + @override + String get forward => 'Pārsūtīt'; + + @override + String get fromJoining => 'No pievienošanās'; + + @override + String get fromTheInvitation => 'No uzaicinājuma'; + + @override + String get goToTheNewRoom => 'Doties uz jauno istabu'; + + @override + String get group => 'Kopa'; + + @override + String get chatDescription => 'Tērzēšanas apraksts'; + + @override + String get chatDescriptionHasBeenChanged => + 'Tērzēšanas apraksts ir mainījies'; + + @override + String get groupIsPublic => 'Kopa ir publiska'; + + @override + String get groups => 'Kopas'; + + @override + String groupWith(String displayname) { + return 'Kopa ar $displayname'; + } + + @override + String get guestsAreForbidden => 'Viesi nav ļauti'; + + @override + String get guestsCanJoin => 'Viesi var pievienoties'; + + @override + String hasWithdrawnTheInvitationFor(String username, String targetName) { + return '$username atsauca uzaicinājumu $targetName'; + } + + @override + String get help => 'Palīdzība'; + + @override + String get hideRedactedEvents => 'Paslēpt labošanas notikumus'; + + @override + String get hideRedactedMessages => 'Paslēpt labošanas ziņas'; + + @override + String get hideRedactedMessagesBody => + 'Ja kāds labo ziņu, tā vairs nebūs redzama tērzēšanā.'; + + @override + String get hideInvalidOrUnknownMessageFormats => + 'Paslēpt nederīgus vai nezināmus ziņu formātus'; + + @override + String get howOffensiveIsThisContent => 'Cik aizskarošs ir šis saturs?'; + + @override + String get id => 'Id'; + + @override + String get identity => 'Identitāte'; + + @override + String get block => 'Izslēgt'; + + @override + String get blockedUsers => 'Atslēgtie lietotāji'; + + @override + String get blockListDescription => + 'Ir iespējams atslēgt traucējošus lietotājus. Nebūs iespējams saņem jebkādas ziņas vai uzaicinājumus uz istabām no lietotājiem, kas ir personīgajā izslēgšanas sarakstā.'; + + @override + String get blockUsername => 'Neņemt vērā lietotājvārdu'; + + @override + String get iHaveClickedOnLink => 'Es uzklikšķināju uz saites'; + + @override + String get incorrectPassphraseOrKey => + 'Nepareiza paroles vārdkopa vai atkopes atslēga'; + + @override + String get inoffensive => 'Nav aizskarošs'; + + @override + String get inviteContact => 'Uzaicināt kontaktpersonu'; + + @override + String inviteContactToGroupQuestion(Object contact, Object groupName) { + return 'Vai vēlies uzaicināt $contact uz tērzēšanu \"$groupName\"?'; + } + + @override + String inviteContactToGroup(String groupName) { + return 'Uzaicināt kontaktpersonu $groupName'; + } + + @override + String get noChatDescriptionYet => 'Tērzēšanas apraksts vēl nav izveidots.'; + + @override + String get tryAgain => 'Jāmēģina vēlreiz'; + + @override + String get invalidServerName => 'Nederīgs servera nosaukums'; + + @override + String get invited => 'Uzaicināts'; + + @override + String get redactMessageDescription => + 'Ziņa tiks labota visiem šīs sarunas dalībniekiem. To nevar atdarīt.'; + + @override + String get optionalRedactReason => '(Pēc izvēles) Ziņas labošanas iemesls...'; + + @override + String invitedUser(String username, String targetName) { + return '📩 $username uzaicināja $targetName'; + } + + @override + String get invitedUsersOnly => 'Tikai uzaicināti lietotāji'; + + @override + String get inviteForMe => 'Uzaicinājums man'; + + @override + String inviteText(String username, String link) { + return '$username uzaicināja pievienoties FluffyChat.\n1. Jāapmeklē fluffychat.im un jāuzstāda lietotne \n2. Jāizveido konts vai jāpiesakās \n3. Jāatver uzaicinājuma saite: \n $link'; + } + + @override + String get isTyping => 'raksta…'; + + @override + String joinedTheChat(String username) { + return '👋 $username pievienojās tērzēšanai'; + } + + @override + String get joinRoom => 'Pievienoties istabai'; + + @override + String kicked(String username, String targetName) { + return '👞 $username izmeta $targetName'; + } + + @override + String kickedAndBanned(String username, String targetName) { + return '🙅 $username izmeta $targetName un liedza piekļuvi'; + } + + @override + String get kickFromChat => 'Izmest no tērzēšanas'; + + @override + String lastActiveAgo(String localizedTimeShort) { + return 'Pēdējoreiz tiešsaistē: $localizedTimeShort'; + } + + @override + String get leave => 'Pamest'; + + @override + String get leftTheChat => 'Pameta tērzēšanu'; + + @override + String get license => 'Licence'; + + @override + String get lightTheme => 'Gaišs'; + + @override + String loadCountMoreParticipants(int count) { + return 'Ielādēt vēl $count dalībniekus'; + } + + @override + String get dehydrate => 'Izgūt sesiju un iztīrīt ierīci'; + + @override + String get dehydrateWarning => + 'Šī darbība nav atdarāma. Jānodrošina, ka rezerves kopijas datne tiek droši uzglabāta.'; + + @override + String get dehydrateTor => 'TOR lietotāji: izgūt sesiju'; + + @override + String get dehydrateTorLong => + 'TOR lietotājiem ir ieteicams izgūt sesiju pirms loga aizvēršanas.'; + + @override + String get hydrateTor => 'TOR lietotāji: ievietot sesijas izguvi'; + + @override + String get hydrateTorLong => + 'Vai sesija pēdējoreiz tika izgūta TOR? Ātri ievieto to un turpini tērzēšanu!'; + + @override + String get hydrate => 'Atjaunot no rezerves kopijas datnes'; + + @override + String get loadingPleaseWait => 'Ielādē... Lūgums uzgaidīt.'; + + @override + String get loadMore => 'Ielādēt vēl…'; + + @override + String get locationDisabledNotice => + 'Atrašanās vietas pakalpojumi ir atspējoti. Lūgums tos iespējot, lai būtu iespējams kopīgot savu atrašanās vietu.'; + + @override + String get locationPermissionDeniedNotice => + 'Atrašanās vietas atļauja noliegta. Lūgums nodrošināt to, lai būtu iespējams kopīgot savu atrašanās vietu.'; + + @override + String get login => 'Pieteikties'; + + @override + String logInTo(String homeserver) { + return 'PIeteikties $homeserver'; + } + + @override + String get logout => 'Atteikties'; + + @override + String get memberChanges => 'Dalībnieku izmaiņas'; + + @override + String get mention => 'Pieminēt'; + + @override + String get messages => 'Ziņas'; + + @override + String get messagesStyle => 'Ziņas:'; + + @override + String get moderator => 'Moderators'; + + @override + String get muteChat => 'Apklusināt tērzēšanu'; + + @override + String get needPantalaimonWarning => + 'Lūgums ņemt vērā, ka pagaidām ir nepieciešams Pantalaimon, lai izmantotu pilnīgu šifrēšanu.'; + + @override + String get newChat => 'Jauna tērzēšana'; + + @override + String get newMessageInFluffyChat => '💬 Jauna ziņa FluffyChat'; + + @override + String get newVerificationRequest => 'Jauns apliecināšanas pieprasījums.'; + + @override + String get next => 'Nākamais'; + + @override + String get no => 'Nē'; + + @override + String get noConnectionToTheServer => 'Nav savienojuma ar serveri'; + + @override + String get noEmotesFound => 'Netika atrasta neviena emocija. 😕'; + + @override + String get noEncryptionForPublicRooms => + 'Šifrēšanu var iespējot tikai tad, kad istaba vairs nav publiski pieejama.'; + + @override + String get noGoogleServicesWarning => + 'Izskatās, ka Firebase mākoņziņojumapmaiņa nav pieejama šajā ierīcē. Lai joprojām saņemtu pašpiegādes paziņojumus, mēs iesakām uzstādīt ntfy. Ar ntfy vai citu Vienotās pašpiegādes nodrošinātāju ir iespējams saņemt pašpiegādes paziņojumus drošā veidā. ntfy var lejupielādēt no PlayStore vai F-Droid.'; + + @override + String noMatrixServer(String server1, String server2) { + return '$server1 nav Matrix serveris, tā vietā izmantot $server2?'; + } + + @override + String get shareInviteLink => 'Kopīgot uzaicinājuma saiti'; + + @override + String get scanQrCode => 'Nolasīt kvadrātkodu'; + + @override + String get none => 'Neviens'; + + @override + String get noPasswordRecoveryDescription => + 'Vēl nav pievienots paroles atjaunošanas veids.'; + + @override + String get noPermission => 'Nav atļaujas'; + + @override + String get noRoomsFound => 'Istabas netika atrastas…'; + + @override + String get notifications => 'Paziņojumi'; + + @override + String get notificationsEnabledForThisAccount => + 'Paziņojumi iespējoti šim kontam'; + + @override + String numUsersTyping(int count) { + return '$count lietotāji raksta…'; + } + + @override + String get obtainingLocation => 'Iegūst atrašanās vietu…'; + + @override + String get offensive => 'Aizskarošs'; + + @override + String get offline => 'Bezsaistē'; + + @override + String get ok => 'Labi'; + + @override + String get online => 'Tiešsaistē'; + + @override + String get onlineKeyBackupEnabled => + 'Tiešsaistes atslēgas rezerves kopēšana ir iespējota'; + + @override + String get oopsPushError => + 'Ups! Diemžēl atgadījās kļūda pašpiegādes paziņojumu iestatīšanas laikā.'; + + @override + String get oopsSomethingWentWrong => 'Ups! Kaut kas nogāja greizi…'; + + @override + String get openAppToReadMessages => 'Atvērt lietotni, lai lasītu ziņas'; + + @override + String get openCamera => 'Atvērt kameru'; + + @override + String get openVideoCamera => 'Atvērt kameru video uzņemšanai'; + + @override + String get oneClientLoggedOut => 'Viens no klientiem ir atteicies'; + + @override + String get addAccount => 'Pievienot kontu'; + + @override + String get editBundlesForAccount => 'Labot šī konta komplektus'; + + @override + String get addToBundle => 'Pievienot komplektam'; + + @override + String get removeFromBundle => 'Noņemt no šī komplekta'; + + @override + String get bundleName => 'Komplekta nosaukums'; + + @override + String get enableMultiAccounts => + '(BETA) Iespējot vairākus kontus šajā ierīcē'; + + @override + String get openInMaps => 'Atvērt kartēs'; + + @override + String get link => 'Saite'; + + @override + String get serverRequiresEmail => + 'Šim serverim ir nepieciešams pārbaudīt Tavu e-pasta adresi reģistrācijai.'; + + @override + String get or => 'Vai'; + + @override + String get participant => 'Dalībnieks'; + + @override + String get passphraseOrKey => 'paroles vārdkopa vai atkopes atslēga'; + + @override + String get password => 'Parole'; + + @override + String get passwordForgotten => 'Aizmirsta parole'; + + @override + String get passwordHasBeenChanged => 'Parole tikai nomainīta'; + + @override + String get hideMemberChangesInPublicChats => + 'Paslēpt dalībnieku izmaiņas publiskajās tērzēšanās'; + + @override + String get hideMemberChangesInPublicChatsBody => + 'Nerādīt tērzēšanas plūsmā, ja kāds pievienojas publiskai tērzēšanai vai pamet to, lai uzlabotu lasāmību.'; + + @override + String get overview => 'Pārskats'; + + @override + String get notifyMeFor => 'Paziņot man par'; + + @override + String get passwordRecoverySettings => 'Paroles atkopes iestatījumi'; + + @override + String get passwordRecovery => 'Paroles atkope'; + + @override + String get people => 'Cilvēki'; + + @override + String get pickImage => 'Izvēlēties attēlu'; + + @override + String get pin => 'PIN'; + + @override + String play(String fileName) { + return 'Atskaņot $fileName'; + } + + @override + String get pleaseChoose => 'Lūgums izvēlēties'; + + @override + String get pleaseChooseAPasscode => 'Lūgums izvēlēties piekļuves kodu'; + + @override + String get pleaseClickOnLink => + 'Lūgums klikšķināt uz saites e-pastā un tad turpināt.'; + + @override + String get pleaseEnter4Digits => + 'Lūgums ievadīt 4 ciparus vai atstāt tukšu, lai atspējotu lietotnes slēgu.'; + + @override + String get pleaseEnterRecoveryKey => 'Lūgums ievadīt savu atkopes atslēgu:'; + + @override + String get pleaseEnterYourPassword => 'Lūgums ievadīt savu paroli'; + + @override + String get pleaseEnterYourPin => 'Lūgums ievadīt savu PIN'; + + @override + String get pleaseEnterYourUsername => 'Lūgums ievadīt savu lietotājvārdu'; + + @override + String get pleaseFollowInstructionsOnWeb => + 'Lūgums sekot norādēm tīmekļvietnē un piesist \"Nākamais\".'; + + @override + String get privacy => 'Privātums'; + + @override + String get publicRooms => 'Publiskas istabas'; + + @override + String get pushRules => 'Pašpiegādes nosacījumi'; + + @override + String get reason => 'Iemesls'; + + @override + String get recording => 'Ieraksta'; + + @override + String redactedBy(String username) { + return 'Laboja $username'; + } + + @override + String get directChat => 'Tiešā tērzēšana'; + + @override + String redactedByBecause(String username, String reason) { + return 'Laboja $username, jo: \"$reason\"'; + } + + @override + String redactedAnEvent(String username) { + return '$username laboja notikumu'; + } + + @override + String get redactMessage => 'Labot ziņu'; + + @override + String get register => 'Reģistrēties'; + + @override + String get reject => 'Noraidīt'; + + @override + String rejectedTheInvitation(String username) { + return '$username noraidīja uzaicinājumu'; + } + + @override + String get rejoin => 'Pievienoties atkārtoti'; + + @override + String get removeAllOtherDevices => 'Noņemt visas pārējās ierīces'; + + @override + String removedBy(String username) { + return 'Noņēma $username'; + } + + @override + String get removeDevice => 'Noņemt ierīci'; + + @override + String get unbanFromChat => 'Atcelt liegumu tērzēšanā'; + + @override + String get removeYourAvatar => 'Noņemt savu attēlu'; + + @override + String get replaceRoomWithNewerVersion => + 'Aizvietot istabu ar jaunāku versiju'; + + @override + String get reply => 'Atbildēt'; + + @override + String get reportMessage => 'Ziņot par ziņu'; + + @override + String get translateMessage => 'Translate message'; + + @override + String get translatedMessage => 'Translated message'; + + @override + String get errorTranslatingMessage => + 'An error has occured while translating the message.'; + + @override + String get recoverMessage => 'Recover message'; + + @override + String get recoveredMessage => 'Recovered message'; + + @override + String get errorRecoveringMessage => + 'An error has occured while recovering the message.'; + + @override + String get errorRecoveringMessageNoAdmin => + 'This feature is available on Synapse homeservers only for adminstrators.'; + + @override + String get requestPermission => 'Pieprasīt atļauju'; + + @override + String get roomHasBeenUpgraded => 'Istaba tika atjaunināta'; + + @override + String get roomVersion => 'Istabas versija'; + + @override + String get saveFile => 'Saglabāt datni'; + + @override + String get retry => 'Retry'; + + @override + String get search => 'Meklēt'; + + @override + String get security => 'Drošība'; + + @override + String get recoveryKey => 'Atkopes atslēga'; + + @override + String get recoveryKeyLost => 'Pazaudēta atkopes atslēga?'; + + @override + String seenByUser(String username) { + return '$username redzēja'; + } + + @override + String get send => 'Nosūtīt'; + + @override + String get sendAMessage => 'Nosūtīt ziņu'; + + @override + String get sendAsText => 'Nosūtīt kā tekstu'; + + @override + String get sendAudio => 'Nosūtīt skaņu'; + + @override + String get sendFile => 'Nosūtīt datni'; + + @override + String get sendImage => 'Nosūtīt attēlu'; + + @override + String sendImages(int count) { + return 'Nosūtīt $count attēlu(s)'; + } + + @override + String get sendMessages => 'Nosūtīt ziņas'; + + @override + String get sendOriginal => 'Nosūtīt sākotnējo'; + + @override + String get sendSticker => 'Nosūtīt uzlīmi'; + + @override + String get sendVideo => 'Nosūtīt video'; + + @override + String sentAFile(String username) { + return '📁 $username nosūtīja datni'; + } + + @override + String sentAnAudio(String username) { + return '🎤 $username nosūtīja skaņu'; + } + + @override + String sentAPicture(String username) { + return '🖼️ $username nosūtīja attēlu'; + } + + @override + String sentASticker(String username) { + return '😊 $username nosūtīja uzlīmi'; + } + + @override + String sentAVideo(String username) { + return '🎥 $username nosūtīja video'; + } + + @override + String sentCallInformations(String senderName) { + return '$senderName nosūtīja informāciju par zvanu'; + } + + @override + String get separateChatTypes => 'Atdalīt tiešās tērzēšanas un kopas'; + + @override + String get setAsCanonicalAlias => 'Iestatīt kā galveno aizstājvārdu'; + + @override + String get setCustomEmotes => 'Iestatīt pielāgotas emocijas'; + + @override + String get setChatDescription => 'Iestatīt tērzēšanas aprakstu'; + + @override + String get setInvitationLink => 'Iestatīt uzaicinājumu saiti'; + + @override + String get setPermissionsLevel => 'Iestatīt atļauju līmeni'; + + @override + String get setStatus => 'Iestatīt stāvokli'; + + @override + String get settings => 'Iestatījumi'; + + @override + String get share => 'Kopīgot'; + + @override + String sharedTheLocation(String username) { + return '$username kopīgoja savu atrašanās vietu'; + } + + @override + String get shareLocation => 'Kopīgot atrašanās vietu'; + + @override + String get showPassword => 'Rādīt paroli'; + + @override + String get presenceStyle => 'Klātesamība:'; + + @override + String get hideAvatarsInInvites => 'Hide avatars in invites'; + + @override + String get hideAvatarsInInvitesDescription => + 'Do not show room avatars in invites'; + + @override + String get presencesToggle => 'Rādīt citu lietotāju stāvokļa ziņas'; + + @override + String get pureBlackToggle => 'Pure Black'; + + @override + String get singlesignon => 'Vienotā pieteikšanās'; + + @override + String get skip => 'Izlaist'; + + @override + String get sourceCode => 'Pirmkods'; + + @override + String get spaceIsPublic => 'Vieta ir publiska'; + + @override + String get spaceName => 'Vietas nosaukums'; + + @override + String startedACall(String senderName) { + return '$senderName uzsāka zvanu'; + } + + @override + String get startFirstChat => 'Uzsāc savu pirmo tērzēšanu'; + + @override + String get status => 'Stāvoklis'; + + @override + String get statusExampleMessage => 'Kā Tev šodien klājas?'; + + @override + String get submit => 'Iesniegt'; + + @override + String get synchronizingPleaseWait => 'Sinhronizē... Lūgums uzgaidīt.'; + + @override + String synchronizingPleaseWaitCounter(String percentage) { + return ' Sinhronizē... ($percentage%)'; + } + + @override + String get systemTheme => 'Sistēmas'; + + @override + String get theyDontMatch => 'Tās nesakrīt'; + + @override + String get theyMatch => 'Tās sakrīt'; + + @override + String get title => 'FluffyChat'; + + @override + String get toggleFavorite => 'Pārslēgt iecienīto'; + + @override + String get toggleMuted => 'Pārslēgt apklusināšanu'; + + @override + String get toggleUnread => 'Atzīmēt kā lasītu/nelasītu'; + + @override + String get tooManyRequestsWarning => + 'Pārāk daudz pieprasījumu. Lūgums vēlāk mēģināt vēlreiz.'; + + @override + String get transferFromAnotherDevice => 'Pārnest no citas ierīces'; + + @override + String get tryToSendAgain => 'Mēģināt nosūtīt vēlreiz'; + + @override + String get unavailable => 'Nav pieejams'; + + @override + String unbannedUser(String username, String targetName) { + return '$username atcēla $targetName piekļuves liegumu'; + } + + @override + String get unblockDevice => 'Atslēgt ierīci'; + + @override + String get unknownDevice => 'Nezināma ierīce'; + + @override + String get unknownEncryptionAlgorithm => 'Nezināms šifrēšanas algoritms'; + + @override + String unknownEvent(String type) { + return 'Nezināms notikums \'$type\''; + } + + @override + String get unmuteChat => 'Atcelt tērzēšanas apklusināšanu'; + + @override + String get unpin => 'Atspraust'; + + @override + String unreadChats(int unreadCount) { + String _temp0 = intl.Intl.pluralLogic( + unreadCount, + locale: localeName, + other: '$unreadCount nelasītas tērzēšanas', + one: '$unreadCount nelasīta tērzēšana', + zero: '$unreadCount nelasītu tērzēšanu', + ); + return '$_temp0'; + } + + @override + String userAndOthersAreTyping(String username, int count) { + return '$username un $count citi raksta…'; + } + + @override + String userAndUserAreTyping(String username, String username2) { + return '$username un $username2 raksta…'; + } + + @override + String userIsTyping(String username) { + return '$username raksta…'; + } + + @override + String userLeftTheChat(String username) { + return '🚪 $username pameta tērzēšanu'; + } + + @override + String get username => 'Lietotājvārds'; + + @override + String userSentUnknownEvent(String username, String type) { + return '$username nosūtīja notikumu $type'; + } + + @override + String get unverified => 'Neapliecināta'; + + @override + String get verified => 'Apliecināta'; + + @override + String get verify => 'Apliecināt'; + + @override + String get verifyStart => 'Uzsākt apliecināšanu'; + + @override + String get verifySuccess => 'Apliecināšana bija sekmīga.'; + + @override + String get verifyTitle => 'Apliecina citu kontu'; + + @override + String get videoCall => 'Videozvans'; + + @override + String get visibilityOfTheChatHistory => 'Tērzēšanas vēstures redzamība'; + + @override + String get visibleForAllParticipants => 'Redzama visiem dalībniekiem'; + + @override + String get visibleForEveryone => 'Redzama visiem'; + + @override + String get voiceMessage => 'Balss ziņa'; + + @override + String get waitingPartnerAcceptRequest => + 'Gaida, līdz biedrs apstiprinās pieprasījumu…'; + + @override + String get waitingPartnerEmoji => + 'Gaida, līdz biedrs apstiprinās emocijzīmi…'; + + @override + String get waitingPartnerNumbers => + 'Gaida, līdz biedrs apstiprinās skaitļus…'; + + @override + String get wallpaper => 'Ekrāntapete:'; + + @override + String get warning => 'Uzmanību!'; + + @override + String get weSentYouAnEmail => 'Mēs nosūtīja e-pasta ziņu'; + + @override + String get whoCanPerformWhichAction => 'Kurš var veikt kādas darbības'; + + @override + String get whoIsAllowedToJoinThisGroup => + 'Kuram ir ļauts pievienoties šai kopai'; + + @override + String get whyDoYouWantToReportThis => 'Kādēļ vēlies ziņot par šo?'; + + @override + String get wipeChatBackup => + 'Notīrīt tērzēšanu rezerves kopiju, lai izveidotu jaunu atkopes atslēgu?'; + + @override + String get withTheseAddressesRecoveryDescription => + 'Ar šīm adresēm var atjaunot savu paroli.'; + + @override + String get writeAMessage => 'Rakstīt ziņu…'; + + @override + String get yes => 'Jā'; + + @override + String get you => 'Tu'; + + @override + String get youAreNoLongerParticipatingInThisChat => + 'Tu vairs nepiedalies šajā tērzēšanā'; + + @override + String get youHaveBeenBannedFromThisChat => + 'Tev tika liegta piekļuve šai tērzēšanai'; + + @override + String get yourPublicKey => 'Tava publiskā atslēga'; + + @override + String get messageInfo => 'Informācija par ziņu'; + + @override + String get time => 'Laiks'; + + @override + String get messageType => 'Ziņas veids'; + + @override + String get sender => 'Sūtītājs'; + + @override + String get openGallery => 'Atvērt galeriju'; + + @override + String get removeFromSpace => 'Noņemt no vietas'; + + @override + String get addToSpaceDescription => + 'Atlasīt vietu, kurai pievienot šo tērzēšanu.'; + + @override + String get start => 'Uzsākt'; + + @override + String get pleaseEnterRecoveryKeyDescription => + 'Lai atslēgtu savas vecās ziņas, lūgums ievadīt savu atkopes atslēgu, kas tika izveidota iepriekšējā sesijā. Atkopes atslēga NAV parole.'; + + @override + String get publish => 'Publicēt'; + + @override + String videoWithSize(String size) { + return 'Video ($size)'; + } + + @override + String get openChat => 'Atvērt tērzēšanu'; + + @override + String get markAsRead => 'Atzīmēt kā lasītu'; + + @override + String get reportUser => 'Ziņot par lietotāju'; + + @override + String get dismiss => 'Atmest'; + + @override + String reactedWith(String sender, String reaction) { + return '$sender atsaucās ar $reaction'; + } + + @override + String get pinMessage => 'Piespraust istabai'; + + @override + String get confirmEventUnpin => + 'Vai tiešām neatgriezeniski atspraust šo notikumu?'; + + @override + String get emojis => 'Emocijzīmes'; + + @override + String get placeCall => 'Veikt zvanu'; + + @override + String get voiceCall => 'Balss zvans'; + + @override + String get unsupportedAndroidVersion => 'Neatbalstīta Android versija'; + + @override + String get unsupportedAndroidVersionLong => + 'Šai iespējai ir nepieciešama jaunāka Android versija. Lūgums pārbaudīt atjauninājumus vai Lineage OS atbalstu.'; + + @override + String get videoCallsBetaWarning => + 'Lūgums ņemt vērā, ka video zvani pašreiz ir beta stāvoklī. Tie visās platformās var nedarboties kā paredzēs vai pat nedarboties vispār.'; + + @override + String get experimentalVideoCalls => 'Izmēģinājuma video zvani'; + + @override + String get emailOrUsername => 'E-pasta adrese vai lietotājvārds'; + + @override + String get indexedDbErrorTitle => 'Privātā režīma nebūšanas'; + + @override + String get indexedDbErrorLong => + 'Diemžēl ziņu krātuve pēc noklusējuma nav iespējota privātajā režīmā.\nLūgums apmeklēt\n - about:config\n - iestatīt dom.indexedDB.privateBrowsing.enabled kā true\nPretējā gadījumā nav iespējams palaist FluffyChat.'; + + @override + String switchToAccount(String number) { + return 'Pārslēgties uz kontu $number'; + } + + @override + String get nextAccount => 'Nākamais konts'; + + @override + String get previousAccount => 'Iepriekšējais konts'; + + @override + String get addWidget => 'Pievienot logrīku'; + + @override + String get widgetVideo => 'Video'; + + @override + String get widgetEtherpad => 'Teksta piezīme'; + + @override + String get widgetJitsi => 'Jitsi Meet'; + + @override + String get widgetCustom => 'Pielāgots'; + + @override + String get widgetName => 'Nosaukums'; + + @override + String get widgetUrlError => 'Tas nav derīgs URL.'; + + @override + String get widgetNameError => 'Lūgums norādīt attēlojamo nosaukumu.'; + + @override + String get errorAddingWidget => 'Kļūda logrīka pievienošanā.'; + + @override + String get youRejectedTheInvitation => 'Tu noraidīji uzaicinājumu'; + + @override + String get youJoinedTheChat => 'Tu pievienojies tērzēšanai'; + + @override + String get youAcceptedTheInvitation => '👍 Tu pieņēmi uzaicinājumu'; + + @override + String youBannedUser(String user) { + return 'Tu $user liedzi piekļuvi'; + } + + @override + String youHaveWithdrawnTheInvitationFor(String user) { + return 'Tu atsauci $user uzaicinājumu'; + } + + @override + String youInvitedToBy(String alias) { + return '📩 Tu tiki uzaicināts ar saiti:\n$alias'; + } + + @override + String youInvitedBy(String user) { + return '📩 $user Tevi uzaicināja'; + } + + @override + String invitedBy(String user) { + return '📩 $user uzaicināja'; + } + + @override + String youInvitedUser(String user) { + return '📩 Tu uzaicināji $user'; + } + + @override + String youKicked(String user) { + return '👞 Tu izraidīji $user'; + } + + @override + String youKickedAndBanned(String user) { + return '🙅 Izraidīji $user un liedzi piekļuvi'; + } + + @override + String youUnbannedUser(String user) { + return 'Tu atcēli $user piekļuves liegumu'; + } + + @override + String hasKnocked(String user) { + return '🚪 $user pieklauvēja'; + } + + @override + String get usersMustKnock => 'Lietotājiem jāpieklauvē'; + + @override + String get noOneCanJoin => 'Neviens nevar pievienoties'; + + @override + String userWouldLikeToChangeTheChat(String user) { + return '$user vēlas pievienoties tērzēšanai.'; + } + + @override + String get noPublicLinkHasBeenCreatedYet => + 'Vēl nav izveidota neviena publiska saite'; + + @override + String get knock => 'Pieklauvēt'; + + @override + String get users => 'Lietotāji'; + + @override + String get unlockOldMessages => 'Atslēgt vecās ziņas'; + + @override + String get storeInSecureStorageDescription => + 'Glabāt atkopes atslēgu šīs ierīces drošajā krātuvē.'; + + @override + String get saveKeyManuallyDescription => + 'Šo atslēgu var pašrocīgi saglabāt ar sistēmas kopīgošanas dialogloga vai starpliktuves izsaukšanu.'; + + @override + String get storeInAndroidKeystore => 'Glabāt Android KeyStore'; + + @override + String get storeInAppleKeyChain => 'Glabāt Apple KeyChain'; + + @override + String get storeSecurlyOnThisDevice => 'Droši uzglabāt šajā ierīcē'; + + @override + String countFiles(int count) { + return '$count datnes'; + } + + @override + String get user => 'Lietotājs'; + + @override + String get custom => 'Pielāgots'; + + @override + String get foregroundServiceRunning => + 'Šis paziņojums parādās, kad darbojas priekšplāna pakalpojums.'; + + @override + String get screenSharingTitle => 'ekrāna kopīgošana'; + + @override + String get screenSharingDetail => 'Tu kopīgo savu ekrānu FluffyChat'; + + @override + String get callingPermissions => 'Zvanīšanas atļaujas'; + + @override + String get callingAccount => 'Zvanīšanas konts'; + + @override + String get callingAccountDetails => + 'Ļauj FluffyChat izmantot iebūvēto Android zvanīšanas lietotni.'; + + @override + String get appearOnTop => 'Parādīt virspusē'; + + @override + String get appearOnTopDetails => + 'Ļauj lietotnei parādīties virspusē (nav nepieciešams, ja FluffyChat jau ir iestatīts kā zvanīšanas konts)'; + + @override + String get otherCallingPermissions => + 'Mikrofons, kamera un citas FluffyChat atļaujas'; + + @override + String get whyIsThisMessageEncrypted => 'Kādēļ šī ziņa ir nelasāma?'; + + @override + String get noKeyForThisMessage => + 'Tā var notikt, ja ziņa tika nosūtīta, pirms pieteicies savā kontā šajā ierīcē.\n\nIr arī iespējams, ka sūtītājs noliedza Tavu ierīci vai kaut kas nogāja greizi ar interneta savienojumu.\n\nVai ziņas ir lasāmas citā sesijā? Tad Tu vari pārsūtīt ziņu no tās. Jādodas uz Iestatījumi > Ierīces un jāpārliecinās, ka ierīces viena otru ir apliecinājušas. Kad nākamreiz atvērsi istabu un abas sesijas būs priekšplānā, atslēgas tiks automātiski pārsūtītas.\n\nVai nevēlies zaudēt atslēgas, kad atsakies vai maini ierīces? Jāpārliecinās, ka iestatījumos ir iespējota tērzēšanu rezerves kopija.'; + + @override + String get newGroup => 'Jauna kopa'; + + @override + String get newSpace => 'Jauna vieta'; + + @override + String get enterSpace => 'Ieiet vietā'; + + @override + String get enterRoom => 'Ieiet istabā'; + + @override + String get allSpaces => 'Visas vietas'; + + @override + String numChats(String number) { + return '$number tērzēšanas'; + } + + @override + String get hideUnimportantStateEvents => + 'Paslēpt nebūtiskus stāvokļa notikumus'; + + @override + String get hidePresences => 'Paslēpt stāvokļu sarakstu?'; + + @override + String get doNotShowAgain => 'Vairs nerādīt'; + + @override + String wasDirectChatDisplayName(String oldDisplayName) { + return 'Tukša tērzēšana (bija $oldDisplayName)'; + } + + @override + String get newSpaceDescription => + 'Vietas ļauj apvienot tērzēšanas un būvēt privātas vai publiskas kopienas.'; + + @override + String get encryptThisChat => 'Šifrēt šo tērzēšanu'; + + @override + String get disableEncryptionWarning => + 'Drošības iemeslu dēļ tērzēšanā nevar atspējot šifrēšanu, ja tā ir pirms tam ir bijusi iespējota.'; + + @override + String get sorryThatsNotPossible => 'Atvaino! Tas nav iespējams'; + + @override + String get deviceKeys => 'Ierīces atslēgas:'; + + @override + String get reopenChat => 'Atkārtoti atvērt tērzēšanu'; + + @override + String get noBackupWarning => + 'Uzmanību! Bez tērzēšanu rezerves kopiju veidošanas iespējošanas tiks zaudēta piekļuve savām šifrētajām ziņām. Ir ļoti ieteicams iespējot tērzēšanu rezerves kopiju veidošanu pirms atteikšanās.'; + + @override + String get noOtherDevicesFound => 'Netika atrastas citas ierīces'; + + @override + String fileIsTooBigForServer(String max) { + return 'Nevar nosūtīt. Serveris nodrošina pielikums līdz $max.'; + } + + @override + String fileHasBeenSavedAt(String path) { + return 'Datne tika saglabāta $path'; + } + + @override + String get jumpToLastReadMessage => 'Pārlēkt uz pēdējo izlasīto ziņu'; + + @override + String get readUpToHere => 'Izlasīts līdz šejienei'; + + @override + String get jump => 'Pārlēkt'; + + @override + String get openLinkInBrowser => 'Atvērt saiti pārlūkā'; + + @override + String get reportErrorDescription => + '😭 Ak nē! Kaut kas nogāja greizi. Ja ir vēlēšanas, par šo nepilnību var ziņot izstrādātājiem.'; + + @override + String get report => 'ziņot'; + + @override + String get signInWithPassword => 'Pieteikties ar paroli'; + + @override + String get pleaseTryAgainLaterOrChooseDifferentServer => + 'Lūgums vēlāk mēģināt vēlreiz vai izvēlēties citu serveri.'; + + @override + String signInWith(String provider) { + return 'Pieteikties ar $provider'; + } + + @override + String get profileNotFound => + 'Lietotāju serverī nevarēja atrast. Varbūt ir nebūšanas ar savienojumu vai lietotājs nepastāv.'; + + @override + String get setTheme => 'Iestatīt izskatu:'; + + @override + String get setColorTheme => 'Iestatīt krāsu izskatu:'; + + @override + String get invite => 'Uzaicināt'; + + @override + String get inviteGroupChat => '📨 Uzaicināt kopas tērzēšanu'; + + @override + String get invitePrivateChat => '📨 Uzaicināt privātu tērzēšanu'; + + @override + String get invalidInput => 'Nederīga ievade.'; + + @override + String wrongPinEntered(int seconds) { + return 'Ievadīts nepareizs PIN. Lūgums mēģināt vēlreiz pēc $seconds sekundēm...'; + } + + @override + String get pleaseEnterANumber => 'Lūgums ievadīt skaitli lielāku par 0'; + + @override + String get archiveRoomDescription => + 'Tērzēšana tiks pārvietota uz arhīvu. Citi lietotāji redzēs, ka pameti tērzēšanu.'; + + @override + String get roomUpgradeDescription => + 'Tērzēšana tad tiks atkārtoti izveidota ar jauno istabas versiju. Visiem dalībniekiem tiks paziņots, ka viņiem ir jāpārslēdzas uz jauno tērzēšanu. Vairāk par istabu versijām var atrast https://spec.matrix.org/latest/rooms/'; + + @override + String get removeDevicesDescription => + 'Tu tiksi izrakstīts no šīs ierīces un vairs nevarēsi saņemt ziņas.'; + + @override + String get banUserDescription => + 'Lietotājam tiks liegta piekļuve tērzēšanai, un vairs nevarēs vēlreiz pievienoties tērzēšanai, līdz liegums tiks atcelts.'; + + @override + String get unbanUserDescription => + 'Lietotājs varēs atkal pievienoties tērzēšanai, ja mēģinās.'; + + @override + String get kickUserDescription => + 'Lietotājs ir izmests no tērzēšanas, bet piekļuve nav liegta. Publiskās tērzēšanās lietotājs var atkārtoti pievienoties jebkurā laikā.'; + + @override + String get makeAdminDescription => + 'Tiklīdz šis lietotājs tiks padarīts par pārvaldītāju, to vairs nevarēs atdarīt, jo tad tam būs tādas pašas atļaujas kā Tev.'; + + @override + String get pushNotificationsNotAvailable => + 'Pašpiegādes paziņojumi nav pieejami'; + + @override + String get learnMore => 'Uzzināt vairāk'; + + @override + String get yourGlobalUserIdIs => 'Vispārējais lietotāja Id ir: '; + + @override + String noUsersFoundWithQuery(String query) { + return 'Diemžēl ar \"$query\" netika atrasts neviens lietotājs. Lūgums pārbaudīt, vai ir pieļauta drukas kļūda.'; + } + + @override + String get knocking => 'Klauvē'; + + @override + String chatCanBeDiscoveredViaSearchOnServer(String server) { + return 'Tērzēšana var tikt atklāta ar meklēšanu $server'; + } + + @override + String get searchChatsRooms => 'Meklēt #tērzēšanas, @lietotājus...'; + + @override + String get nothingFound => 'Nekas netika atrasts...'; + + @override + String get groupName => 'Kopas nosaukums'; + + @override + String get createGroupAndInviteUsers => + 'Izveidot kopu un uzaicināt lietotājus'; + + @override + String get groupCanBeFoundViaSearch => 'Kopu var atrast meklēšanā'; + + @override + String get wrongRecoveryKey => + 'Atvaino... Nešķiet, ka šī būtu pareiza atkopes atslēga.'; + + @override + String get startConversation => 'Uzsākt sarunu'; + + @override + String get commandHint_sendraw => 'Nosūtīt neapstrādātu JSON'; + + @override + String get databaseMigrationTitle => 'Datubāze ir optimizēta'; + + @override + String get databaseMigrationBody => + 'Lūgums uzgaidīt. Tas var aizņemt kādu brīdi.'; + + @override + String get leaveEmptyToClearStatus => + 'Atstāt tukšu, lai notīrītu savu stāvokli.'; + + @override + String get select => 'Atlasīt'; + + @override + String get searchForUsers => 'Meklēt @lietotājus...'; + + @override + String get pleaseEnterYourCurrentPassword => + 'Lūgums ievadīt savu pašreizējo paroli'; + + @override + String get newPassword => 'Jauna parole'; + + @override + String get pleaseChooseAStrongPassword => 'Lūgums izvēlēties spēcīgu paroli'; + + @override + String get passwordsDoNotMatch => 'Paroles nesakrīt'; + + @override + String get passwordIsWrong => 'Ievadītā parole ir nepareiza'; + + @override + String get publicLink => 'Publiska saite'; + + @override + String get publicChatAddresses => 'Publiskas tērzēšanas adreses'; + + @override + String get createNewAddress => 'Izveidot jaunu adresi'; + + @override + String get joinSpace => 'Pievienoties vietai'; + + @override + String get publicSpaces => 'Publiskas vietas'; + + @override + String get addChatOrSubSpace => 'Pievienot tērzēšanu vai apakšvietu'; + + @override + String get subspace => 'Apakšvieta'; + + @override + String get decline => 'Atteikt'; + + @override + String get thisDevice => 'Šī ierīce:'; + + @override + String get initAppError => 'Atgadījās kļūda lietotnes sāknēšanas laikā'; + + @override + String get userRole => 'Lietotāja loma'; + + @override + String minimumPowerLevel(String level) { + return '$level ir zemākais spēka līmenis.'; + } + + @override + String searchIn(String chat) { + return 'Meklēt tērzēšanā \"$chat\"...'; + } + + @override + String get searchMore => 'Meklēt vairāk...'; + + @override + String get gallery => 'Galerija'; + + @override + String get files => 'Datnes'; + + @override + String databaseBuildErrorBody(String url, String error) { + return 'Nebija iespējams izveidot SQlite datubāzi. Lietotne pagaidām mēģina izmantot iepriekšējo datubāzi. Lūgums ziņot par šo kļūdu izstrādātājiem $url. Kļūdas ziņojums ir: $error'; + } + + @override + String sessionLostBody(String url, String error) { + return 'Sesija ir zaudēta. Lūgums ziņot par šo kļūdu izstrādātājiem $url. Kļūdas ziņojums ir: $error'; + } + + @override + String restoreSessionBody(String url, String error) { + return 'Lietotne tagad mēģina atjaunot sesiju no rezerves kopijas. Lūgums ziņot par šo kļūdu izstrādātājiem $url. Kļūdas ziņojums ir: $error'; + } + + @override + String forwardMessageTo(String roomName) { + return 'Pārsūtīt ziņu uz $roomName?'; + } + + @override + String get sendReadReceipts => 'Nosūtīt lasīšanas atskaites'; + + @override + String get sendTypingNotificationsDescription => + 'Citi tērzēšanas dalībnieki var redzēt, kad raksti jaunu ziņu.'; + + @override + String get sendReadReceiptsDescription => + 'Citi tērzēšanas dalībnieki var redzēt, kad izlasīji ziņu.'; + + @override + String get formattedMessages => 'Formatētas ziņas'; + + @override + String get formattedMessagesDescription => + 'Attēlot bagātinātu ziņu saturu, piemēram, ar Markdown iezīmētu treknrakstu.'; + + @override + String get verifyOtherUser => '🔐 Apliecināt otru lietotāju'; + + @override + String get verifyOtherUserDescription => + 'Ar cita lietotāja apliecināšanu vari pārliecināties, ka zini, kam Tu tiešām raksti. 💪\n\nKad uzsāc apliecināšanu, Tu un otrs lietotājs lietotnē redzēs uznirstošo logu. Tajā jūs redzēsiet dažādas emocijzīmes vai skaitļus, kas ir jāsalīdzina savā starpā.\n\nLabākais veids, kā to izdarīt, ir satikties vai uzsākt videozvanu. 👭'; + + @override + String get verifyOtherDevice => '🔐 Apliecināt otru ierīci'; + + @override + String get verifyOtherDeviceDescription => + 'Kad apliecini citu ierīci, šīs ierīces var apmainīt atslēgas, palielinot vispārējo drošību. 💪 Pēc apliecināšanas uzsākšanas abās ierīcēs lietotnē parādīsies uznirstošais logs. Tajā būs redzamas dažādas emocijzīmes vai skaitļi, kas jāsalīdzina abās ierīcēs. Vislabāk, ja abas ierīces ir pieejamas, pirms tiek uzsākta apliecināšana. 🤳'; + + @override + String acceptedKeyVerification(String sender) { + return '$sender apstiprināja atslēgas apliecināšanu'; + } + + @override + String canceledKeyVerification(String sender) { + return '$sender atcēla atslēgas apliecināšanu'; + } + + @override + String completedKeyVerification(String sender) { + return '$sender pabeidza atslēgas apliecināšanu'; + } + + @override + String isReadyForKeyVerification(String sender) { + return '$sender ir gatavs atslēgas apliecināšanai'; + } + + @override + String requestedKeyVerification(String sender) { + return '$sender pieprasīja atslēgas apliecināšanu'; + } + + @override + String startedKeyVerification(String sender) { + return '$sender uzsāka atslēgas apliecināšanu'; + } + + @override + String get transparent => 'Caurspīdīgs'; + + @override + String get incomingMessages => 'Ienākošās ziņas'; + + @override + String get stickers => 'Uzlīmes'; + + @override + String get discover => 'Atklāt'; + + @override + String get commandHint_ignore => 'Neņemt vērā norādīto Matrix Id'; + + @override + String get commandHint_unignore => 'Atcelt norādītā Matrix Id neņemšanu vērā'; + + @override + String unreadChatsInApp(String appname, String unread) { + return '$appname: $unread nelasītas tērzēšanas'; + } + + @override + String get noDatabaseEncryption => + 'Šajā platformā datubāzes šifrēšana netiek nodrošināta'; + + @override + String thereAreCountUsersBlocked(Object count) { + return 'Šobrīd ir izslēgti $count lietotāji.'; + } + + @override + String get restricted => 'Ierobežots'; + + @override + String get knockRestricted => 'Pieklauvēt ierobežotajiem'; + + @override + String goToSpace(Object space) { + return 'Doties uz vietu: $space'; + } + + @override + String get markAsUnread => 'Atzīmēt kā nelasītu'; + + @override + String userLevel(int level) { + return '$level - Lietotājs'; + } + + @override + String moderatorLevel(int level) { + return '$level - Moderators'; + } + + @override + String adminLevel(int level) { + return '$level - Pārvaldītājs'; + } + + @override + String get changeGeneralChatSettings => + 'Mainīt vispārējos tērzēšanas iestatījumus'; + + @override + String get inviteOtherUsers => 'Uzaicināt šajā tērzēšanā citus lietotājus'; + + @override + String get changeTheChatPermissions => 'Mainīt tērzēšanas atļaujas'; + + @override + String get changeTheVisibilityOfChatHistory => + 'Mainīt tērzēšanas vēstures redzamību'; + + @override + String get changeTheCanonicalRoomAlias => + 'Mainīt tērzēšanas galveno publisko adresi'; + + @override + String get sendRoomNotifications => 'Sūtīt @istaba paziņojumus'; + + @override + String get changeTheDescriptionOfTheGroup => 'Mainīt tērzēšanas aprakstu'; + + @override + String get chatPermissionsDescription => + 'Noteikt, kurš spēka līmenis ir nepieciešams noteiktām darbībām šajā tērzēšanā. Spēka līmeņi 0, 50 un 100 parasti atbilst lietotājiem, moderatoriem un pārvaldītājiem, bet ir iespējams jebkāds iedalījums.'; + + @override + String updateInstalled(String version) { + return '🎉 Atjauninājums $version uzstādīts.'; + } + + @override + String get changelog => 'Izmaiņu žurnāls'; + + @override + String get sendCanceled => 'Sūtīšana atcelta'; + + @override + String get loginWithMatrixId => 'Pieteikties ar Matrix-Id'; + + @override + String get discoverHomeservers => 'Atklāt mājasserverus'; + + @override + String get whatIsAHomeserver => 'Kas ir mājasserveris?'; + + @override + String get homeserverDescription => + 'Visi lietotāja dati tiek glabāti mājasserverī, gluži kā ar e-pasta nodrošinātāju. Ir iespējams izvēlēties, kuru mājasserveri izmantot, saglabājot iespēju sazināties ar ikvienu. Vairāk var uzzināt https://matrix.org.'; + + @override + String get doesNotSeemToBeAValidHomeserver => + 'Neizskatās pēc saderīga mājasservera. Nepareizs URL?'; + + @override + String get calculatingFileSize => 'Aprēķina datnes lielumu...'; + + @override + String get prepareSendingAttachment => 'Sagatavo pielikuma nosūtīšanu...'; + + @override + String get sendingAttachment => 'Nosūta pielikumu...'; + + @override + String get generatingVideoThumbnail => 'Izveido video sīktēlu...'; + + @override + String get compressVideo => 'Saspiež video...'; + + @override + String sendingAttachmentCountOfCount(int index, int length) { + return 'Nosūta $index. pielikumu no $length...'; + } + + @override + String serverLimitReached(int seconds) { + return 'Sasniegts servera ierobežojums. Gaida $seconds sekundes...'; + } + + @override + String get oneOfYourDevicesIsNotVerified => + 'Viena no ierīcēm nav apliecināta'; + + @override + String get noticeChatBackupDeviceVerification => + 'Piezīme: kad visas ierīces tiek savienotas ar tērzēšanu rezerves kopiju, tās tiek automātiski apliecinātas.'; + + @override + String get continueText => 'Turpināt'; + + @override + String get welcomeText => + 'Sveicieni! 👋 Šis ir FluffyChat. Tu vari pieteikties jebkurā mājasserverī, kas ir saderīgs ar https://matrix.org. Tad vari tērzēt ar ikvienu. Tas ir milzīgs decentralizētās saziņas tīkls!'; + + @override + String get blur => 'Aizmiglojums:'; + + @override + String get opacity => 'Necaurredzamība:'; + + @override + String get setWallpaper => 'Iestatīt ekrāntapeti'; + + @override + String get manageAccount => 'Pārvaldīt kontu'; + + @override + String get noContactInformationProvided => + 'Serveris nesniedz nekādu derīgu saziņas informāciju'; + + @override + String get contactServerAdmin => 'Sazināties ar servera pārvaldītāju'; + + @override + String get contactServerSecurity => + 'Sazināties ar servera drošības uzturētājiem'; + + @override + String get supportPage => 'Atbalsta lapa'; + + @override + String get serverInformation => 'Informācija par serveri:'; + + @override + String get name => 'Nosaukums'; + + @override + String get version => 'Versija'; + + @override + String get website => 'Tīmekļvietne'; + + @override + String get compress => 'Saspiest'; + + @override + String get boldText => 'Teksts treknrakstā'; + + @override + String get italicText => 'Teksts slīprakstā'; + + @override + String get strikeThrough => 'Pārsvītrots'; + + @override + String get pleaseFillOut => 'Lūgums aizpildīt'; + + @override + String get invalidUrl => 'Nederīgs URL'; + + @override + String get addLink => 'Pievienot saiti'; + + @override + String get unableToJoinChat => + 'Nevarēja pievienoties tērzēšanai. Varbūt otra puse jau ir aizvērusi sarunu.'; + + @override + String get previous => 'Iepriekšējais'; + + @override + String get otherPartyNotLoggedIn => + 'Otra puse pašlaik nav pieteikusies un tādēļ nevar saņemt ziņas.'; + + @override + String appWantsToUseForLogin(String server) { + return 'Izmantot \'$server\', lai pieteiktos'; + } + + @override + String get appWantsToUseForLoginDescription => + 'Ar šo tiek ļauts lietotnei un tīmekļvietnei kopīgot informāciju par Tevi.'; + + @override + String get open => 'Atvērt'; + + @override + String get waitingForServer => 'Gaida serveri...'; + + @override + String get appIntroduction => + 'FluffyChat ļauj tērzēt ar draugiem, kuri izmanto dažādas ziņojumapmaiņas lietotnes. Vairāk var uzzināt https://matrix.org vai vienkārši piesitot *Turpināt*.'; + + @override + String get newChatRequest => '📩 Jauns tērzēšanas pieprasījums'; + + @override + String get contentNotificationSettings => 'Satura paziņojumu iestatījumi'; + + @override + String get generalNotificationSettings => 'Vispārēji paziņojumu iestatījumi'; + + @override + String get roomNotificationSettings => 'Istabu paziņojumu iestatījumi'; + + @override + String get userSpecificNotificationSettings => + 'Lietotāja paziņojumu iestatījumi'; + + @override + String get otherNotificationSettings => 'Citi paziņojumu iestatījumi'; + + @override + String get notificationRuleContainsUserName => 'Saturs lietotāja vārdu'; + + @override + String get notificationRuleContainsUserNameDescription => + 'Paziņo lietotājam, kad ziņa satur viņa lietotājvārdu.'; + + @override + String get notificationRuleMaster => 'Apklusināt visus paziņojumus'; + + @override + String get notificationRuleMasterDescription => + 'Pārspēj visas pārējās kārtulas un atspējo visus paziņojumus.'; + + @override + String get notificationRuleSuppressNotices => 'Apspiest automātiskās ziņas'; + + @override + String get notificationRuleSuppressNoticesDescription => + 'Apspiež paziņojumus no automatizētiem klientiem, piemēram, robotprogrammatūras.'; + + @override + String get notificationRuleInviteForMe => 'Uzaicinājums man'; + + @override + String get notificationRuleInviteForMeDescription => + 'Paziņo lietotājam, kad viņš ir uzaicināts pievienoties istabai.'; + + @override + String get notificationRuleMemberEvent => 'Dalībnieka notikums'; + + @override + String get notificationRuleMemberEventDescription => + 'Apspiež paziņojums par dalības notikumiem.'; + + @override + String get notificationRuleIsUserMention => 'Lietotāja pieminēšana'; + + @override + String get notificationRuleIsUserMentionDescription => + 'Paziņo lietotājam, kad viņš ziņā ir tieši pieminēts.'; + + @override + String get notificationRuleContainsDisplayName => 'Satur attēlojamo vārdu'; + + @override + String get notificationRuleContainsDisplayNameDescription => + 'Paziņo lietotājam, kad ziņa satur viņa attēlojamo vārdu.'; + + @override + String get notificationRuleIsRoomMention => 'Istabas pieminēšana'; + + @override + String get notificationRuleIsRoomMentionDescription => + 'Paziņo lietotājam, kad tiek pieminēta istaba.'; + + @override + String get notificationRuleRoomnotif => 'Istabas paziņojums'; + + @override + String get notificationRuleRoomnotifDescription => + 'Paziņo lietotājam, kad ziņa satur \"@istaba\".'; + + @override + String get notificationRuleTombstone => 'Kapakmens'; + + @override + String get notificationRuleTombstoneDescription => + 'Paziņo lietotājam par istabu aizvēršanas ziņām.'; + + @override + String get notificationRuleReaction => 'Reakcija'; + + @override + String get notificationRuleReactionDescription => + 'Apspiež paziņojums par reakcijām.'; + + @override + String get notificationRuleRoomServerAcl => 'Istabas servera ACL'; + + @override + String get notificationRuleRoomServerAclDescription => + 'Apspiež paziņojumus par istabas servera piekļuves kontroles sarakstiem (ACL).'; + + @override + String get notificationRuleSuppressEdits => 'Apspiest labojumus'; + + @override + String get notificationRuleSuppressEditsDescription => + 'Apspiež paziņojumus par labotām ziņām.'; + + @override + String get notificationRuleCall => 'Zvans'; + + @override + String get notificationRuleCallDescription => + 'Paziņo lietotājam par zvaniem.'; + + @override + String get notificationRuleEncryptedRoomOneToOne => + 'Šifrēta viens pret viens istaba'; + + @override + String get notificationRuleEncryptedRoomOneToOneDescription => + 'Paziņo lietotājam par ziņām šifrētās viens pret viens istabās.'; + + @override + String get notificationRuleRoomOneToOne => 'Viens pret viens istaba'; + + @override + String get notificationRuleRoomOneToOneDescription => + 'Paziņo lietotājam par ziņām viens pret viens istabās.'; + + @override + String get notificationRuleMessage => 'Ziņa'; + + @override + String get notificationRuleMessageDescription => + 'Paziņo lietotājam par vispārējām ziņām.'; + + @override + String get notificationRuleEncrypted => 'Šifrēts'; + + @override + String get notificationRuleEncryptedDescription => + 'Paziņo lietotājam par ziņām šifrētās istabās.'; + + @override + String get notificationRuleJitsi => 'Jitsi'; + + @override + String get notificationRuleJitsiDescription => + 'Paziņo lietotājam par Jitsi logrīka notikumiem.'; + + @override + String get notificationRuleServerAcl => 'Apspiest servera ACL notikumus'; + + @override + String get notificationRuleServerAclDescription => + 'Apspiež notikumus par servera ACL notikumiem.'; + + @override + String unknownPushRule(String rule) { + return 'Nezināma pašpiegādes kārtula \'$rule\''; + } + + @override + String get deletePushRuleCanNotBeUndone => + 'Ja tiek izdzēsts šis paziņojuma iestatījums, to nevar atsaukt.'; + + @override + String get more => 'Vairāk'; + + @override + String get shareKeysWith => 'Kopīgot atslēgas ar...'; + + @override + String get shareKeysWithDescription => + 'Kurām ierīcēm vajadzētu uzticēties, lai tajās varētu lasīt ziņas šifrētajās tērzēšanās?'; + + @override + String get allDevices => 'Visas ierīces'; + + @override + String get crossVerifiedDevicesIfEnabled => + 'Savstarpēji apliecinātas ierīces, ja iespējots'; + + @override + String get crossVerifiedDevices => 'Savstarpēji apliecinātas ierīces'; + + @override + String get verifiedDevicesOnly => 'Tikai apliecinātas ierīces'; + + @override + String get takeAPhoto => 'Uzņemt attēlu'; + + @override + String get recordAVideo => 'Ierakstīt video'; + + @override + String get optionalMessage => '(Pēc izvēles) Ziņojums...'; + + @override + String get notSupportedOnThisDevice => 'Šajā ierīcē nav atbalstīts'; + + @override + String get enterNewChat => 'Ieiet jaunajā tērzēšanā'; + + @override + String get approve => 'Approve'; + + @override + String get youHaveKnocked => 'You have knocked'; + + @override + String get pleaseWaitUntilInvited => + 'Please wait now, until someone from the room invites you.'; +} diff --git a/lib/generated/l10n/l10n_nb.dart b/lib/generated/l10n/l10n_nb.dart new file mode 100644 index 0000000..51e3bb8 --- /dev/null +++ b/lib/generated/l10n/l10n_nb.dart @@ -0,0 +1,2748 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'l10n.dart'; + +// ignore_for_file: type=lint + +/// The translations for Norwegian Bokmål (`nb`). +class L10nNb extends L10n { + L10nNb([String locale = 'nb']) : super(locale); + + @override + String get noSendPermission => 'You can\'t send messages here'; + + @override + String get alwaysUse24HourFormat => 'false'; + + @override + String get repeatPassword => 'Gjenta passord'; + + @override + String get notAnImage => 'Ikke en bildefil.'; + + @override + String get setCustomPermissionLevel => 'Set custom permission level'; + + @override + String get setPermissionsLevelDescription => + 'Please choose a predefined role below or enter a custom permission level between 0 and 100.'; + + @override + String get ignoreUser => 'Ignore user'; + + @override + String get normalUser => 'Normal user'; + + @override + String get remove => 'Fjern'; + + @override + String get importNow => 'Import now'; + + @override + String get importEmojis => 'Import Emojis'; + + @override + String get importFromZipFile => 'Import from .zip file'; + + @override + String get exportEmotePack => 'Export Emote pack as .zip'; + + @override + String get replace => 'Replace'; + + @override + String get about => 'Om'; + + @override + String aboutHomeserver(String homeserver) { + return 'About $homeserver'; + } + + @override + String get accept => 'Godta'; + + @override + String acceptedTheInvitation(String username) { + return '$username godtok invitasjonen'; + } + + @override + String get account => 'Konto'; + + @override + String activatedEndToEndEncryption(String username) { + return '$username skrudde på ende-til-ende -kryptering'; + } + + @override + String get addEmail => 'Legg til e-post'; + + @override + String get confirmMatrixId => + 'Please confirm your Matrix ID in order to delete your account.'; + + @override + String supposedMxid(String mxid) { + return 'This should be $mxid'; + } + + @override + String get addChatDescription => 'Add a chat description...'; + + @override + String get addToSpace => 'Legg til space'; + + @override + String get admin => 'Administrator'; + + @override + String get alias => 'alias'; + + @override + String get all => 'Alle'; + + @override + String get allChats => 'Alle samtaler'; + + @override + String get commandHint_roomupgrade => + 'Upgrade this room to the given room version'; + + @override + String get commandHint_googly => 'Send some googly eyes'; + + @override + String get commandHint_cuddle => 'Send a cuddle'; + + @override + String get commandHint_hug => 'Send a hug'; + + @override + String googlyEyesContent(String senderName) { + return '$senderName sends you googly eyes'; + } + + @override + String cuddleContent(String senderName) { + return '$senderName cuddles you'; + } + + @override + String hugContent(String senderName) { + return '$senderName hugs you'; + } + + @override + String answeredTheCall(String senderName) { + return '$senderName besvarte anropet'; + } + + @override + String get anyoneCanJoin => 'Hvem som helst kan delta'; + + @override + String get appLock => 'Programlås'; + + @override + String get appLockDescription => + 'Lock the app when not using with a pin code'; + + @override + String get archive => 'Arkiv'; + + @override + String get areGuestsAllowedToJoin => 'Skal gjester tillates å ta del'; + + @override + String get areYouSure => 'Er du sikker?'; + + @override + String get areYouSureYouWantToLogout => 'Er du sikker på at du vil logge ut?'; + + @override + String get askSSSSSign => + 'For å kunne signere den andre personen, skriv inn ditt sikre lagerpassord eller gjenopprettingsnøkkel.'; + + @override + String askVerificationRequest(String username) { + return 'Godta denne bekreftelsesforespørselen fra $username?'; + } + + @override + String get autoplayImages => + 'Automatisk spill av animerte stickers og emojis'; + + @override + String badServerLoginTypesException(String serverVersions, + String supportedVersions, Object suportedVersions) { + return 'Denne hjemme serveren støtter følgende innloggings-typer:\n$serverVersions\nMen denne applikasjonen støtter kun:\n$supportedVersions'; + } + + @override + String get sendTypingNotifications => 'Send typing notifications'; + + @override + String get swipeRightToLeftToReply => 'Swipe right to left to reply'; + + @override + String get sendOnEnter => 'Trykk på enter for å sende'; + + @override + String badServerVersionsException(String serverVersions, + String supportedVersions, Object serverVerions, Object suportedVersions) { + return 'Denne hjemme serveren støtter følgene Spec-versjoner:\n$serverVersions\nMen denne applikasjonen støtter kun $supportedVersions'; + } + + @override + String countChatsAndCountParticipants(int chats, int participants) { + return '$chats chats and $participants participants'; + } + + @override + String get noMoreChatsFound => 'No more chats found...'; + + @override + String get noChatsFoundHere => + 'No chats found here yet. Start a new chat with someone by using the button below. ⤵️'; + + @override + String get joinedChats => 'Joined chats'; + + @override + String get unread => 'Unread'; + + @override + String get space => 'Space'; + + @override + String get spaces => 'Spaces'; + + @override + String get banFromChat => 'Bannlys fra sludring'; + + @override + String get banned => 'Bannlyst'; + + @override + String bannedUser(String username, String targetName) { + return '$username bannlyste $targetName'; + } + + @override + String get blockDevice => 'Blokker enhet'; + + @override + String get blocked => 'Blokkert'; + + @override + String get botMessages => 'Bot-meldinger'; + + @override + String get cancel => 'Avbryt'; + + @override + String cantOpenUri(String uri) { + return 'Kan ikke åpne URI $uri'; + } + + @override + String get changeDeviceName => 'Endre enhetsnavn'; + + @override + String changedTheChatAvatar(String username) { + return '$username endret sludreavatar'; + } + + @override + String changedTheChatDescriptionTo(String username, String description) { + return '$username endret sludrebeskrivelse til: «$description»'; + } + + @override + String changedTheChatNameTo(String username, String chatname) { + return '$username endret sludringsnavn til: «$chatname»'; + } + + @override + String changedTheChatPermissions(String username) { + return '$username endret sludretilgangene'; + } + + @override + String changedTheDisplaynameTo(String username, String displayname) { + return '$username endret visningsnavn til: $displayname'; + } + + @override + String changedTheGuestAccessRules(String username) { + return '$username endret gjestetilgangsreglene'; + } + + @override + String changedTheGuestAccessRulesTo(String username, String rules) { + return '$username endret gjestetilgangsregler til: $rules'; + } + + @override + String changedTheHistoryVisibility(String username) { + return '$username endret historikksynlighet'; + } + + @override + String changedTheHistoryVisibilityTo(String username, String rules) { + return '$username endret historikksynlighet til: $rules'; + } + + @override + String changedTheJoinRules(String username) { + return '$username endret tilgangsreglene'; + } + + @override + String changedTheJoinRulesTo(String username, String joinRules) { + return '$username endret tilgangsreglene til: $joinRules'; + } + + @override + String changedTheProfileAvatar(String username) { + return '$username endret avataren sin'; + } + + @override + String changedTheRoomAliases(String username) { + return '$username endret rom-aliasene'; + } + + @override + String changedTheRoomInvitationLink(String username) { + return '$username endret invitasjonslenken'; + } + + @override + String get changePassword => 'Endre passord'; + + @override + String get changeTheHomeserver => 'Endre hjemmetjener'; + + @override + String get changeTheme => 'Endre din stil'; + + @override + String get changeTheNameOfTheGroup => 'Endre gruppens navn'; + + @override + String get changeYourAvatar => 'Bytt profilbilde'; + + @override + String get channelCorruptedDecryptError => 'Krypteringen er skadet'; + + @override + String get chat => 'Sludring'; + + @override + String get yourChatBackupHasBeenSetUp => 'Your chat backup has been set up.'; + + @override + String get chatBackup => 'Sludringssikkerhetskopi'; + + @override + String get chatBackupDescription => + 'Din sludringssikkerhetskopi er sikret med en sikkerhetsnøkkel. Ikke mist den.'; + + @override + String get chatDetails => 'Sludringsdetaljer'; + + @override + String get chatHasBeenAddedToThisSpace => 'Chat has been added to this space'; + + @override + String get chats => 'Chats'; + + @override + String get chooseAStrongPassword => 'Velg et sterkt passord'; + + @override + String get clearArchive => 'Clear archive'; + + @override + String get close => 'Lukk'; + + @override + String get commandHint_markasdm => + 'Mark as direct message room for the giving Matrix ID'; + + @override + String get commandHint_markasgroup => 'Mark as group'; + + @override + String get commandHint_ban => 'Ban the given user from this room'; + + @override + String get commandHint_clearcache => 'Clear cache'; + + @override + String get commandHint_create => + 'Create an empty group chat\nUse --no-encryption to disable encryption'; + + @override + String get commandHint_discardsession => 'Discard session'; + + @override + String get commandHint_dm => + 'Start a direct chat\nUse --no-encryption to disable encryption'; + + @override + String get commandHint_html => 'Send HTML-formatted text'; + + @override + String get commandHint_invite => 'Invite the given user to this room'; + + @override + String get commandHint_join => 'Join the given room'; + + @override + String get commandHint_kick => 'Remove the given user from this room'; + + @override + String get commandHint_leave => 'Leave this room'; + + @override + String get commandHint_me => 'Describe yourself'; + + @override + String get commandHint_myroomavatar => + 'Set your picture for this room (by mxc-uri)'; + + @override + String get commandHint_myroomnick => 'Set your display name for this room'; + + @override + String get commandHint_op => + 'Set the given user\'s power level (default: 50)'; + + @override + String get commandHint_plain => 'Send unformatted text'; + + @override + String get commandHint_react => 'Send reply as a reaction'; + + @override + String get commandHint_send => 'Send text'; + + @override + String get commandHint_unban => 'Unban the given user from this room'; + + @override + String get commandInvalid => 'Command invalid'; + + @override + String commandMissing(String command) { + return '$command is not a command.'; + } + + @override + String get compareEmojiMatch => + 'Sammenlign og forsikre at følgende smilefjes samsvarer med de på den andre enheten:'; + + @override + String get compareNumbersMatch => + 'Sammenlign og forsikre at følgende tall samsvarer med de på den andre enheten:'; + + @override + String get configureChat => 'Sett opp sludring'; + + @override + String get confirm => 'Bekreft'; + + @override + String get connect => 'Koble til'; + + @override + String get contactHasBeenInvitedToTheGroup => 'Kontakt invitert til gruppen'; + + @override + String get containsDisplayName => 'Inneholder visningsnavn'; + + @override + String get containsUserName => 'Inneholder brukernavn'; + + @override + String get contentHasBeenReported => + 'Innholdet har blitt rapportert til tjeneradministratorene'; + + @override + String get copiedToClipboard => 'Kopiert til utklippstavle'; + + @override + String get copy => 'Kopier'; + + @override + String get copyToClipboard => 'Kopier til utklippstavle'; + + @override + String couldNotDecryptMessage(String error) { + return 'Kunne ikke dekryptere melding: $error'; + } + + @override + String countParticipants(int count) { + return '$count deltagere'; + } + + @override + String get create => 'Opprett'; + + @override + String createdTheChat(String username) { + return '$username opprettet sludringen'; + } + + @override + String get createGroup => 'Create group'; + + @override + String get createNewSpace => 'New space'; + + @override + String get currentlyActive => 'Aktiv nå'; + + @override + String get darkTheme => 'Mørk'; + + @override + String dateAndTimeOfDay(String date, String timeOfDay) { + return '$timeOfDay, $date'; + } + + @override + String dateWithoutYear(String month, String day) { + return '$day $month'; + } + + @override + String dateWithYear(String year, String month, String day) { + return '$day $month $year'; + } + + @override + String get deactivateAccountWarning => + 'Dette vil skru av din brukerkonto for godt, og kan ikke angres! Er du sikker?'; + + @override + String get defaultPermissionLevel => 'Forvalgt tilgangsnivå'; + + @override + String get delete => 'Slett'; + + @override + String get deleteAccount => 'Slett konto'; + + @override + String get deleteMessage => 'Slett melding'; + + @override + String get device => 'Enhet'; + + @override + String get deviceId => 'Enhets-ID'; + + @override + String get devices => 'Enheter'; + + @override + String get directChats => 'Direktesludringer'; + + @override + String get allRooms => 'All Group Chats'; + + @override + String get displaynameHasBeenChanged => 'Visningsnavn endret'; + + @override + String get downloadFile => 'Last ned fil'; + + @override + String get edit => 'Rediger'; + + @override + String get editBlockedServers => 'Rediger blokkerte tjenere'; + + @override + String get chatPermissions => 'Chat permissions'; + + @override + String get editDisplayname => 'Rediger visningsnavn'; + + @override + String get editRoomAliases => 'Edit room aliases'; + + @override + String get editRoomAvatar => 'Rediger romavatar'; + + @override + String get emoteExists => 'Smilefjeset finnes allerede!'; + + @override + String get emoteInvalid => 'Ugyldig smilefjes-kode!'; + + @override + String get emoteKeyboardNoRecents => + 'Recently-used emotes will appear here...'; + + @override + String get emotePacks => 'Smilefjespakker for rommet'; + + @override + String get emoteSettings => 'Smilefjes-innstillinger'; + + @override + String get globalChatId => 'Global chat ID'; + + @override + String get accessAndVisibility => 'Access and visibility'; + + @override + String get accessAndVisibilityDescription => + 'Who is allowed to join this chat and how the chat can be discovered.'; + + @override + String get calls => 'Calls'; + + @override + String get customEmojisAndStickers => 'Custom emojis and stickers'; + + @override + String get customEmojisAndStickersBody => + 'Add or share custom emojis or stickers which can be used in any chat.'; + + @override + String get emoteShortcode => 'Smilefjes-kode'; + + @override + String get emoteWarnNeedToPick => + 'Du må velge en smilefjes-kode og et bilde!'; + + @override + String get emptyChat => 'Tom sludring'; + + @override + String get enableEmotesGlobally => + 'Skru på smilefjespakke for hele programmet'; + + @override + String get enableEncryption => 'Skru på kryptering'; + + @override + String get enableEncryptionWarning => + 'Du vil ikke kunne skru av kryptering lenger. Er du sikker?'; + + @override + String get encrypted => 'Kryptert'; + + @override + String get encryption => 'Kryptering'; + + @override + String get encryptionNotEnabled => 'Kryptering er ikke påskrudd'; + + @override + String endedTheCall(String senderName) { + return '$senderName avsluttet samtalen'; + } + + @override + String get enterAnEmailAddress => 'Skriv inn en e-postadresse'; + + @override + String get homeserver => 'Homeserver'; + + @override + String get enterYourHomeserver => 'Skriv inn din hjemmetjener'; + + @override + String errorObtainingLocation(String error) { + return 'Error obtaining location: $error'; + } + + @override + String get everythingReady => 'Alt er klart!'; + + @override + String get extremeOffensive => 'Veldig'; + + @override + String get fileName => 'Filnavn'; + + @override + String get fluffychat => 'FluffyChat'; + + @override + String get fontSize => 'Skriftstørrelse'; + + @override + String get forward => 'Videre'; + + @override + String get fromJoining => 'Fra å ta del'; + + @override + String get fromTheInvitation => 'Fra invitasjonen'; + + @override + String get goToTheNewRoom => 'Go to the new room'; + + @override + String get group => 'Gruppe'; + + @override + String get chatDescription => 'Chat description'; + + @override + String get chatDescriptionHasBeenChanged => 'Chat description changed'; + + @override + String get groupIsPublic => 'Gruppen er offentlig'; + + @override + String get groups => 'Grupper'; + + @override + String groupWith(String displayname) { + return 'Gruppe med $displayname'; + } + + @override + String get guestsAreForbidden => 'Gjester forbudt'; + + @override + String get guestsCanJoin => 'Gjester kan ta del'; + + @override + String hasWithdrawnTheInvitationFor(String username, String targetName) { + return '$username har trukket tilbake invitasjonen til $targetName'; + } + + @override + String get help => 'Hjelp'; + + @override + String get hideRedactedEvents => 'Skjul tilbaketrukne hendelser'; + + @override + String get hideRedactedMessages => 'Hide redacted messages'; + + @override + String get hideRedactedMessagesBody => + 'If someone redacts a message, this message won\'t be visible in the chat anymore.'; + + @override + String get hideInvalidOrUnknownMessageFormats => + 'Hide invalid or unknown message formats'; + + @override + String get howOffensiveIsThisContent => 'Hvor støtende er innholdet?'; + + @override + String get id => 'ID'; + + @override + String get identity => 'Identitet'; + + @override + String get block => 'Block'; + + @override + String get blockedUsers => 'Blocked users'; + + @override + String get blockListDescription => + 'You can block users who are disturbing you. You won\'t be able to receive any messages or room invites from the users on your personal block list.'; + + @override + String get blockUsername => 'Ignore username'; + + @override + String get iHaveClickedOnLink => 'Jeg har klikket på lenken'; + + @override + String get incorrectPassphraseOrKey => + 'Feilaktig passord eller gjenopprettingsnøkkel'; + + @override + String get inoffensive => 'Harmløst'; + + @override + String get inviteContact => 'Inviter kontakt'; + + @override + String inviteContactToGroupQuestion(Object contact, Object groupName) { + return 'Do you want to invite $contact to the chat \"$groupName\"?'; + } + + @override + String inviteContactToGroup(String groupName) { + return 'Inviter kontakt til $groupName'; + } + + @override + String get noChatDescriptionYet => 'No chat description created yet.'; + + @override + String get tryAgain => 'Try again'; + + @override + String get invalidServerName => 'Invalid server name'; + + @override + String get invited => 'Invitert'; + + @override + String get redactMessageDescription => + 'The message will be redacted for all participants in this conversation. This cannot be undone.'; + + @override + String get optionalRedactReason => + '(Optional) Reason for redacting this message...'; + + @override + String invitedUser(String username, String targetName) { + return '$username inviterte $targetName'; + } + + @override + String get invitedUsersOnly => 'Kun inviterte brukere'; + + @override + String get inviteForMe => 'Invitasjon for meg'; + + @override + String inviteText(String username, String link) { + return '$username har invitert deg til FluffyChat. \n1. Installer FluffyChat: https://fluffychat.im \n2. Registrer deg eller logg inn \n3. Åpne invitasjonslenken: $link'; + } + + @override + String get isTyping => 'skriver…'; + + @override + String joinedTheChat(String username) { + return '${username}ble med i samtalen'; + } + + @override + String get joinRoom => 'Ta del i rom'; + + @override + String kicked(String username, String targetName) { + return '$username kastet ut $targetName'; + } + + @override + String kickedAndBanned(String username, String targetName) { + return '$username kastet ut og bannlyste $targetName'; + } + + @override + String get kickFromChat => 'Kast ut av sludringen'; + + @override + String lastActiveAgo(String localizedTimeShort) { + return 'Sist aktiv: $localizedTimeShort'; + } + + @override + String get leave => 'Forlat'; + + @override + String get leftTheChat => 'Forlat sludringen'; + + @override + String get license => 'Lisens'; + + @override + String get lightTheme => 'Lys'; + + @override + String loadCountMoreParticipants(int count) { + return 'Last inn $count deltagere til'; + } + + @override + String get dehydrate => 'Export session and wipe device'; + + @override + String get dehydrateWarning => + 'This action cannot be undone. Ensure you safely store the backup file.'; + + @override + String get dehydrateTor => 'TOR Users: Export session'; + + @override + String get dehydrateTorLong => + 'For TOR users, it is recommended to export the session before closing the window.'; + + @override + String get hydrateTor => 'TOR Users: Import session export'; + + @override + String get hydrateTorLong => + 'Did you export your session last time on TOR? Quickly import it and continue chatting.'; + + @override + String get hydrate => 'Restore from backup file'; + + @override + String get loadingPleaseWait => 'Laster inn… Vent.'; + + @override + String get loadMore => 'Last inn mer…'; + + @override + String get locationDisabledNotice => + 'Location services are disabled. Please enable them to be able to share your location.'; + + @override + String get locationPermissionDeniedNotice => + 'Location permission denied. Please grant them to be able to share your location.'; + + @override + String get login => 'Logg inn'; + + @override + String logInTo(String homeserver) { + return 'Logg inn på $homeserver'; + } + + @override + String get logout => 'Logg ut'; + + @override + String get memberChanges => 'Medlemsendringer'; + + @override + String get mention => 'Nevn'; + + @override + String get messages => 'Meldinger'; + + @override + String get messagesStyle => 'Messages:'; + + @override + String get moderator => 'Moderator'; + + @override + String get muteChat => 'Forstum sludring'; + + @override + String get needPantalaimonWarning => + 'Merk at du trenger Pantalaimon for å bruke ende-til-ende -kryptering inntil videre.'; + + @override + String get newChat => 'Ny sludring'; + + @override + String get newMessageInFluffyChat => 'Ny melding i FluffyChat'; + + @override + String get newVerificationRequest => 'Ny bekreftelsesforespørsel!'; + + @override + String get next => 'Neste'; + + @override + String get no => 'Nei'; + + @override + String get noConnectionToTheServer => 'Ingen tilkobling til tjeneren'; + + @override + String get noEmotesFound => 'Fant ingen smilefjes. 😕'; + + @override + String get noEncryptionForPublicRooms => + 'You can only activate encryption as soon as the room is no longer publicly accessible.'; + + @override + String get noGoogleServicesWarning => + 'Bruk https://microg.org/ for å få Google-tjenester (uten at det går ut over personvernet) for å få push-merknader i FluffyChat:'; + + @override + String noMatrixServer(String server1, String server2) { + return '$server1 is no matrix server, use $server2 instead?'; + } + + @override + String get shareInviteLink => 'Share invite link'; + + @override + String get scanQrCode => 'Scan QR code'; + + @override + String get none => 'Ingen'; + + @override + String get noPasswordRecoveryDescription => + 'Du har ikke lagt til en måte å gjenopprette passordet ditt på.'; + + @override + String get noPermission => 'Ingen tilgang'; + + @override + String get noRoomsFound => 'Fant ingen rom …'; + + @override + String get notifications => 'Merknader'; + + @override + String get notificationsEnabledForThisAccount => + 'Merknader påslått for denne kontoen'; + + @override + String numUsersTyping(int count) { + return '$count brukere skriver …'; + } + + @override + String get obtainingLocation => 'Obtaining location…'; + + @override + String get offensive => 'Støtende'; + + @override + String get offline => 'Frakoblet'; + + @override + String get ok => 'OK'; + + @override + String get online => 'Pålogget'; + + @override + String get onlineKeyBackupEnabled => + 'Nettbasert sikkerhetskopiering av nøkler på'; + + @override + String get oopsPushError => + 'Oops! Unfortunately, an error occurred when setting up the push notifications.'; + + @override + String get oopsSomethingWentWrong => 'Oida, noe gikk galt …'; + + @override + String get openAppToReadMessages => 'Åpne programmet for å lese meldinger'; + + @override + String get openCamera => 'Åpne kamera'; + + @override + String get openVideoCamera => 'Open camera for a video'; + + @override + String get oneClientLoggedOut => 'One of your clients has been logged out'; + + @override + String get addAccount => 'Add account'; + + @override + String get editBundlesForAccount => 'Edit bundles for this account'; + + @override + String get addToBundle => 'Add to bundle'; + + @override + String get removeFromBundle => 'Remove from this bundle'; + + @override + String get bundleName => 'Bundle name'; + + @override + String get enableMultiAccounts => + '(BETA) Enable multi accounts on this device'; + + @override + String get openInMaps => 'Open in maps'; + + @override + String get link => 'Link'; + + @override + String get serverRequiresEmail => + 'This server needs to validate your email address for registration.'; + + @override + String get or => 'Or'; + + @override + String get participant => 'Deltager'; + + @override + String get passphraseOrKey => 'Passord eller gjenopprettingsnøkkel'; + + @override + String get password => 'Passord'; + + @override + String get passwordForgotten => 'Passord glemt'; + + @override + String get passwordHasBeenChanged => 'Passord endret'; + + @override + String get hideMemberChangesInPublicChats => + 'Hide member changes in public chats'; + + @override + String get hideMemberChangesInPublicChatsBody => + 'Do not show in the chat timeline if someone joins or leaves a public chat to improve readability.'; + + @override + String get overview => 'Overview'; + + @override + String get notifyMeFor => 'Notify me for'; + + @override + String get passwordRecoverySettings => 'Password recovery settings'; + + @override + String get passwordRecovery => 'Passordgjenoppretting'; + + @override + String get people => 'People'; + + @override + String get pickImage => 'Velg bilde'; + + @override + String get pin => 'Fest'; + + @override + String play(String fileName) { + return 'Spill av $fileName'; + } + + @override + String get pleaseChoose => 'Please choose'; + + @override + String get pleaseChooseAPasscode => 'Please choose a pass code'; + + @override + String get pleaseClickOnLink => 'Klikk på lenken i e-posten og fortsett.'; + + @override + String get pleaseEnter4Digits => + 'Please enter 4 digits or leave empty to disable app lock.'; + + @override + String get pleaseEnterRecoveryKey => 'Please enter your recovery key:'; + + @override + String get pleaseEnterYourPassword => 'Skriv inn passordet ditt'; + + @override + String get pleaseEnterYourPin => 'Please enter your pin'; + + @override + String get pleaseEnterYourUsername => 'Skriv inn brukernavnet ditt'; + + @override + String get pleaseFollowInstructionsOnWeb => + 'Følg instruksen på nettsiden og trykk på «Neste».'; + + @override + String get privacy => 'Personvern'; + + @override + String get publicRooms => 'Offentlige rom'; + + @override + String get pushRules => 'Dyttingsregler'; + + @override + String get reason => 'Grunn'; + + @override + String get recording => 'Opptak'; + + @override + String redactedBy(String username) { + return 'Redacted by $username'; + } + + @override + String get directChat => 'Direct chat'; + + @override + String redactedByBecause(String username, String reason) { + return 'Redacted by $username because: \"$reason\"'; + } + + @override + String redactedAnEvent(String username) { + return '$username har trukket tilbake en hendelse'; + } + + @override + String get redactMessage => 'Redact message'; + + @override + String get register => 'Register'; + + @override + String get reject => 'Avslå'; + + @override + String rejectedTheInvitation(String username) { + return '$username avslo invitasjonen'; + } + + @override + String get rejoin => 'Ta del igjen'; + + @override + String get removeAllOtherDevices => 'Fjern alle andre enheter'; + + @override + String removedBy(String username) { + return 'Fjernet av $username'; + } + + @override + String get removeDevice => 'Fjern enhet'; + + @override + String get unbanFromChat => 'Opphev bannlysning'; + + @override + String get removeYourAvatar => 'Remove your avatar'; + + @override + String get replaceRoomWithNewerVersion => 'Erstatt rom med nyere versjon'; + + @override + String get reply => 'Svar'; + + @override + String get reportMessage => 'Rapporter melding'; + + @override + String get translateMessage => 'Translate message'; + + @override + String get translatedMessage => 'Translated message'; + + @override + String get errorTranslatingMessage => + 'An error has occured while translating the message.'; + + @override + String get recoverMessage => 'Recover message'; + + @override + String get recoveredMessage => 'Recovered message'; + + @override + String get errorRecoveringMessage => + 'An error has occured while recovering the message.'; + + @override + String get errorRecoveringMessageNoAdmin => + 'This feature is available on Synapse homeservers only for adminstrators.'; + + @override + String get requestPermission => 'Forespør tilgang'; + + @override + String get roomHasBeenUpgraded => 'Rommet har blitt oppgradert'; + + @override + String get roomVersion => 'Room version'; + + @override + String get saveFile => 'Save file'; + + @override + String get retry => 'Retry'; + + @override + String get search => 'Søk'; + + @override + String get security => 'Sikkerhet'; + + @override + String get recoveryKey => 'Recovery key'; + + @override + String get recoveryKeyLost => 'Recovery key lost?'; + + @override + String seenByUser(String username) { + return 'Sett av $username'; + } + + @override + String get send => 'Send'; + + @override + String get sendAMessage => 'Send en melding'; + + @override + String get sendAsText => 'Send as text'; + + @override + String get sendAudio => 'Send lyd'; + + @override + String get sendFile => 'Send fil'; + + @override + String get sendImage => 'Send bilde'; + + @override + String sendImages(int count) { + return 'Send $count image'; + } + + @override + String get sendMessages => 'Send meldinger'; + + @override + String get sendOriginal => 'Send original'; + + @override + String get sendSticker => 'Send sticker'; + + @override + String get sendVideo => 'Send video'; + + @override + String sentAFile(String username) { + return '$username sendte en fil'; + } + + @override + String sentAnAudio(String username) { + return '$username sendte lyd'; + } + + @override + String sentAPicture(String username) { + return '$username sendte et bilde'; + } + + @override + String sentASticker(String username) { + return '$username sendte et klistremerke'; + } + + @override + String sentAVideo(String username) { + return '$username sendte en video'; + } + + @override + String sentCallInformations(String senderName) { + return '$senderName sendte anropsinfo'; + } + + @override + String get separateChatTypes => 'Separate Direct Chats and Groups'; + + @override + String get setAsCanonicalAlias => 'Set as main alias'; + + @override + String get setCustomEmotes => 'Sett tilpassede smilefjes'; + + @override + String get setChatDescription => 'Set chat description'; + + @override + String get setInvitationLink => 'Sett invitasjonslenke'; + + @override + String get setPermissionsLevel => 'Sett tilgangsnivå'; + + @override + String get setStatus => 'Angi status'; + + @override + String get settings => 'Innstilinger'; + + @override + String get share => 'Del'; + + @override + String sharedTheLocation(String username) { + return '$username delte posisjonen'; + } + + @override + String get shareLocation => 'Share location'; + + @override + String get showPassword => 'Show password'; + + @override + String get presenceStyle => 'Presence:'; + + @override + String get hideAvatarsInInvites => 'Hide avatars in invites'; + + @override + String get hideAvatarsInInvitesDescription => + 'Do not show room avatars in invites'; + + @override + String get presencesToggle => 'Show status messages from other users'; + + @override + String get pureBlackToggle => 'Pure Black'; + + @override + String get singlesignon => 'Single Sign on'; + + @override + String get skip => 'Hopp over'; + + @override + String get sourceCode => 'Kildekode'; + + @override + String get spaceIsPublic => 'Space is public'; + + @override + String get spaceName => 'Space name'; + + @override + String startedACall(String senderName) { + return '$senderName startet en samtale'; + } + + @override + String get startFirstChat => 'Start your first chat'; + + @override + String get status => 'Status'; + + @override + String get statusExampleMessage => 'Hvordan har du det i dag?'; + + @override + String get submit => 'Send inn'; + + @override + String get synchronizingPleaseWait => 'Synchronizing… Please wait.'; + + @override + String synchronizingPleaseWaitCounter(String percentage) { + return ' Synchronizing… ($percentage%)'; + } + + @override + String get systemTheme => 'System'; + + @override + String get theyDontMatch => 'Samsvarer ikke'; + + @override + String get theyMatch => 'Samsvarer'; + + @override + String get title => 'FluffyChat'; + + @override + String get toggleFavorite => 'Veksle favorittmerking'; + + @override + String get toggleMuted => 'Veksle forstumming'; + + @override + String get toggleUnread => 'Marker som lest/ulest'; + + @override + String get tooManyRequestsWarning => + 'For mange forespørsler. Prøv igjen senere!'; + + @override + String get transferFromAnotherDevice => 'Overfør fra en annen enhet'; + + @override + String get tryToSendAgain => 'Prøv å sende igjen'; + + @override + String get unavailable => 'Utilgjengelig'; + + @override + String unbannedUser(String username, String targetName) { + return '$username opphevet bannlysning av $targetName'; + } + + @override + String get unblockDevice => 'Opphev blokkering av enhet'; + + @override + String get unknownDevice => 'Ukjent enhet'; + + @override + String get unknownEncryptionAlgorithm => 'Ukjent krypteringsalgoritme'; + + @override + String unknownEvent(String type) { + return 'Ukjent hendelse «$type»'; + } + + @override + String get unmuteChat => 'Opphev forstumming av sludring'; + + @override + String get unpin => 'Løsne'; + + @override + String unreadChats(int unreadCount) { + String _temp0 = intl.Intl.pluralLogic( + unreadCount, + locale: localeName, + other: '$unreadCount uleste sludringer', + ); + return '$_temp0'; + } + + @override + String userAndOthersAreTyping(String username, int count) { + return '$username og $count andre skriver…'; + } + + @override + String userAndUserAreTyping(String username, String username2) { + return '$username og $username2 skriver…'; + } + + @override + String userIsTyping(String username) { + return '$username skriver…'; + } + + @override + String userLeftTheChat(String username) { + return '$username har forlatt sludringen'; + } + + @override + String get username => 'Brukernavn'; + + @override + String userSentUnknownEvent(String username, String type) { + return '$username sendte en $type-hendelse'; + } + + @override + String get unverified => 'Unverified'; + + @override + String get verified => 'Verified'; + + @override + String get verify => 'Bekreft'; + + @override + String get verifyStart => 'Start bekreftelse'; + + @override + String get verifySuccess => 'Du har bekreftet!'; + + @override + String get verifyTitle => 'Bekrefter annen konto'; + + @override + String get videoCall => 'Videosamtale'; + + @override + String get visibilityOfTheChatHistory => 'Sludrehistorikkens synlighet'; + + @override + String get visibleForAllParticipants => 'Synlig for alle deltagere'; + + @override + String get visibleForEveryone => 'Synlig for alle'; + + @override + String get voiceMessage => 'Lydmelding'; + + @override + String get waitingPartnerAcceptRequest => + 'Waiting for partner to accept the request…'; + + @override + String get waitingPartnerEmoji => 'Waiting for partner to accept the emoji…'; + + @override + String get waitingPartnerNumbers => + 'Venter på at samtalepartner skal godta tallene …'; + + @override + String get wallpaper => 'Bakgrunnsbilde'; + + @override + String get warning => 'Advarsel!'; + + @override + String get weSentYouAnEmail => 'Du har fått en e-post'; + + @override + String get whoCanPerformWhichAction => 'Hvem kan utføre hvilken handling'; + + @override + String get whoIsAllowedToJoinThisGroup => + 'Hvem tillates å ta del i denne gruppen'; + + @override + String get whyDoYouWantToReportThis => + 'Hvorfor ønsker du å rapportere dette?'; + + @override + String get wipeChatBackup => + 'Wipe your chat backup to create a new recovery key?'; + + @override + String get withTheseAddressesRecoveryDescription => + 'Med disse adressene kan du gjenopprette passordet ditt hvis du trenger det.'; + + @override + String get writeAMessage => 'Skriv en melding …'; + + @override + String get yes => 'Ja'; + + @override + String get you => 'Deg'; + + @override + String get youAreNoLongerParticipatingInThisChat => + 'Du deltar ikke lenger i denne sludringen'; + + @override + String get youHaveBeenBannedFromThisChat => + 'Du har blitt bannlyst fra denne sludringen'; + + @override + String get yourPublicKey => 'Din offentlige nøkkel'; + + @override + String get messageInfo => 'Message info'; + + @override + String get time => 'Time'; + + @override + String get messageType => 'Message Type'; + + @override + String get sender => 'Sender'; + + @override + String get openGallery => 'Open gallery'; + + @override + String get removeFromSpace => 'Remove from space'; + + @override + String get addToSpaceDescription => 'Select a space to add this chat to it.'; + + @override + String get start => 'Start'; + + @override + String get pleaseEnterRecoveryKeyDescription => + 'To unlock your old messages, please enter your recovery key that has been generated in a previous session. Your recovery key is NOT your password.'; + + @override + String get publish => 'Publish'; + + @override + String videoWithSize(String size) { + return 'Video ($size)'; + } + + @override + String get openChat => 'Open Chat'; + + @override + String get markAsRead => 'Mark as read'; + + @override + String get reportUser => 'Report user'; + + @override + String get dismiss => 'Dismiss'; + + @override + String reactedWith(String sender, String reaction) { + return '$sender reacted with $reaction'; + } + + @override + String get pinMessage => 'Pin to room'; + + @override + String get confirmEventUnpin => + 'Are you sure to permanently unpin the event?'; + + @override + String get emojis => 'Emojis'; + + @override + String get placeCall => 'Place call'; + + @override + String get voiceCall => 'Voice call'; + + @override + String get unsupportedAndroidVersion => 'Unsupported Android version'; + + @override + String get unsupportedAndroidVersionLong => + 'This feature requires a newer Android version. Please check for updates or Lineage OS support.'; + + @override + String get videoCallsBetaWarning => + 'Please note that video calls are currently in beta. They might not work as expected or work at all on all platforms.'; + + @override + String get experimentalVideoCalls => 'Experimental video calls'; + + @override + String get emailOrUsername => 'Email or username'; + + @override + String get indexedDbErrorTitle => 'Private mode issues'; + + @override + String get indexedDbErrorLong => + 'The message storage is unfortunately not enabled in private mode by default.\nPlease visit\n - about:config\n - set dom.indexedDB.privateBrowsing.enabled to true\nOtherwise, it is not possible to run Extera.'; + + @override + String switchToAccount(String number) { + return 'Switch to account $number'; + } + + @override + String get nextAccount => 'Next account'; + + @override + String get previousAccount => 'Previous account'; + + @override + String get addWidget => 'Add widget'; + + @override + String get widgetVideo => 'Video'; + + @override + String get widgetEtherpad => 'Text note'; + + @override + String get widgetJitsi => 'Jitsi Meet'; + + @override + String get widgetCustom => 'Custom'; + + @override + String get widgetName => 'Name'; + + @override + String get widgetUrlError => 'This is not a valid URL.'; + + @override + String get widgetNameError => 'Please provide a display name.'; + + @override + String get errorAddingWidget => 'Error adding the widget.'; + + @override + String get youRejectedTheInvitation => 'You rejected the invitation'; + + @override + String get youJoinedTheChat => 'You joined the chat'; + + @override + String get youAcceptedTheInvitation => '👍 You accepted the invitation'; + + @override + String youBannedUser(String user) { + return 'You banned $user'; + } + + @override + String youHaveWithdrawnTheInvitationFor(String user) { + return 'You have withdrawn the invitation for $user'; + } + + @override + String youInvitedToBy(String alias) { + return '📩 You have been invited via link to:\n$alias'; + } + + @override + String youInvitedBy(String user) { + return '📩 You have been invited by $user'; + } + + @override + String invitedBy(String user) { + return '📩 Invited by $user'; + } + + @override + String youInvitedUser(String user) { + return '📩 You invited $user'; + } + + @override + String youKicked(String user) { + return '👞 You kicked $user'; + } + + @override + String youKickedAndBanned(String user) { + return '🙅 You kicked and banned $user'; + } + + @override + String youUnbannedUser(String user) { + return 'You unbanned $user'; + } + + @override + String hasKnocked(String user) { + return '🚪 $user has knocked'; + } + + @override + String get usersMustKnock => 'Users must knock'; + + @override + String get noOneCanJoin => 'No one can join'; + + @override + String userWouldLikeToChangeTheChat(String user) { + return '$user would like to join the chat.'; + } + + @override + String get noPublicLinkHasBeenCreatedYet => + 'No public link has been created yet'; + + @override + String get knock => 'Knock'; + + @override + String get users => 'Users'; + + @override + String get unlockOldMessages => 'Unlock old messages'; + + @override + String get storeInSecureStorageDescription => + 'Store the recovery key in the secure storage of this device.'; + + @override + String get saveKeyManuallyDescription => + 'Save this key manually by triggering the system share dialog or clipboard.'; + + @override + String get storeInAndroidKeystore => 'Store in Android KeyStore'; + + @override + String get storeInAppleKeyChain => 'Store in Apple KeyChain'; + + @override + String get storeSecurlyOnThisDevice => 'Store securely on this device'; + + @override + String countFiles(int count) { + return '$count files'; + } + + @override + String get user => 'User'; + + @override + String get custom => 'Custom'; + + @override + String get foregroundServiceRunning => + 'This notification appears when the foreground service is running.'; + + @override + String get screenSharingTitle => 'screen sharing'; + + @override + String get screenSharingDetail => 'You are sharing your screen in Extera'; + + @override + String get callingPermissions => 'Calling permissions'; + + @override + String get callingAccount => 'Calling account'; + + @override + String get callingAccountDetails => + 'Allows Extera to use the native android dialer app.'; + + @override + String get appearOnTop => 'Appear on top'; + + @override + String get appearOnTopDetails => + 'Allows the app to appear on top (not needed if you already have Fluffychat setup as a calling account)'; + + @override + String get otherCallingPermissions => + 'Microphone, camera and other Extera permissions'; + + @override + String get whyIsThisMessageEncrypted => 'Why is this message unreadable?'; + + @override + String get noKeyForThisMessage => + 'This can happen if the message was sent before you have signed in to your account at this device.\n\nIt is also possible that the sender has blocked your device or something went wrong with the internet connection.\n\nAre you able to read the message on another session? Then you can transfer the message from it! Go to Settings > Devices and make sure that your devices have verified each other. When you open the room the next time and both sessions are in the foreground, the keys will be transmitted automatically.\n\nDo you not want to lose the keys when logging out or switching devices? Make sure that you have enabled the chat backup in the settings.'; + + @override + String get newGroup => 'New group'; + + @override + String get newSpace => 'New space'; + + @override + String get enterSpace => 'Enter space'; + + @override + String get enterRoom => 'Enter room'; + + @override + String get allSpaces => 'All spaces'; + + @override + String numChats(String number) { + return '$number chats'; + } + + @override + String get hideUnimportantStateEvents => 'Hide unimportant state events'; + + @override + String get hidePresences => 'Hide Status List?'; + + @override + String get doNotShowAgain => 'Do not show again'; + + @override + String wasDirectChatDisplayName(String oldDisplayName) { + return 'Empty chat (was $oldDisplayName)'; + } + + @override + String get newSpaceDescription => + 'Spaces allows you to consolidate your chats and build private or public communities.'; + + @override + String get encryptThisChat => 'Encrypt this chat'; + + @override + String get disableEncryptionWarning => + 'For security reasons you can not disable encryption in a chat, where it has been enabled before.'; + + @override + String get sorryThatsNotPossible => 'Sorry... that is not possible'; + + @override + String get deviceKeys => 'Device keys:'; + + @override + String get reopenChat => 'Reopen chat'; + + @override + String get noBackupWarning => + 'Warning! Without enabling chat backup, you will lose access to your encrypted messages. It is highly recommended to enable the chat backup first before logging out.'; + + @override + String get noOtherDevicesFound => 'No other devices found'; + + @override + String fileIsTooBigForServer(String max) { + return 'Unable to send! The server only supports attachments up to $max.'; + } + + @override + String fileHasBeenSavedAt(String path) { + return 'File has been saved at $path'; + } + + @override + String get jumpToLastReadMessage => 'Jump to last read message'; + + @override + String get readUpToHere => 'Read up to here'; + + @override + String get jump => 'Jump'; + + @override + String get openLinkInBrowser => 'Open link in browser'; + + @override + String get reportErrorDescription => + '😭 Oh no. Something went wrong. If you want, you can report this bug to the developers.'; + + @override + String get report => 'Report'; + + @override + String get signInWithPassword => 'Sign in with password'; + + @override + String get pleaseTryAgainLaterOrChooseDifferentServer => + 'Please try again later or choose a different server.'; + + @override + String signInWith(String provider) { + return 'Sign in with $provider'; + } + + @override + String get profileNotFound => + 'The user could not be found on the server. Maybe there is a connection problem or the user doesn\'t exist.'; + + @override + String get setTheme => 'Set theme:'; + + @override + String get setColorTheme => 'Set color theme:'; + + @override + String get invite => 'Invite'; + + @override + String get inviteGroupChat => '📨 Invite group chat'; + + @override + String get invitePrivateChat => '📨 Invite private chat'; + + @override + String get invalidInput => 'Invalid input!'; + + @override + String wrongPinEntered(int seconds) { + return 'Wrong pin entered! Try again in $seconds seconds...'; + } + + @override + String get pleaseEnterANumber => 'Please enter a number greater than 0'; + + @override + String get archiveRoomDescription => + 'The chat will be moved to the archive. Other users will be able to see that you have left the chat.'; + + @override + String get roomUpgradeDescription => + 'The chat will then be recreated with the new room version. All participants will be notified that they need to switch to the new chat. You can find out more about room versions at https://spec.matrix.org/latest/rooms/'; + + @override + String get removeDevicesDescription => + 'You will be logged out of this device and will no longer be able to receive messages.'; + + @override + String get banUserDescription => + 'The user will be banned from the chat and will not be able to enter the chat again until they are unbanned.'; + + @override + String get unbanUserDescription => + 'The user will be able to enter the chat again if they try.'; + + @override + String get kickUserDescription => + 'The user is kicked out of the chat but not banned. In public chats, the user can rejoin at any time.'; + + @override + String get makeAdminDescription => + 'Once you make this user admin, you may not be able to undo this as they will then have the same permissions as you.'; + + @override + String get pushNotificationsNotAvailable => + 'Push notifications not available'; + + @override + String get learnMore => 'Learn more'; + + @override + String get yourGlobalUserIdIs => 'Your global user-ID is: '; + + @override + String noUsersFoundWithQuery(String query) { + return 'Unfortunately no user could be found with \"$query\". Please check whether you made a typo.'; + } + + @override + String get knocking => 'Knocking'; + + @override + String chatCanBeDiscoveredViaSearchOnServer(String server) { + return 'Chat can be discovered via the search on $server'; + } + + @override + String get searchChatsRooms => 'Search for #chats, @users...'; + + @override + String get nothingFound => 'Nothing found...'; + + @override + String get groupName => 'Group name'; + + @override + String get createGroupAndInviteUsers => 'Create a group and invite users'; + + @override + String get groupCanBeFoundViaSearch => 'Group can be found via search'; + + @override + String get wrongRecoveryKey => + 'Sorry... this does not seem to be the correct recovery key.'; + + @override + String get startConversation => 'Start conversation'; + + @override + String get commandHint_sendraw => 'Send raw json'; + + @override + String get databaseMigrationTitle => 'Database is optimized'; + + @override + String get databaseMigrationBody => 'Please wait. This may take a moment.'; + + @override + String get leaveEmptyToClearStatus => 'Leave empty to clear your status.'; + + @override + String get select => 'Select'; + + @override + String get searchForUsers => 'Search for @users...'; + + @override + String get pleaseEnterYourCurrentPassword => + 'Please enter your current password'; + + @override + String get newPassword => 'New password'; + + @override + String get pleaseChooseAStrongPassword => 'Please choose a strong password'; + + @override + String get passwordsDoNotMatch => 'Passwords do not match'; + + @override + String get passwordIsWrong => 'Your entered password is wrong'; + + @override + String get publicLink => 'Public link'; + + @override + String get publicChatAddresses => 'Public chat addresses'; + + @override + String get createNewAddress => 'Create new address'; + + @override + String get joinSpace => 'Join space'; + + @override + String get publicSpaces => 'Public spaces'; + + @override + String get addChatOrSubSpace => 'Add chat or sub space'; + + @override + String get subspace => 'Subspace'; + + @override + String get decline => 'Decline'; + + @override + String get thisDevice => 'This device:'; + + @override + String get initAppError => 'An error occured while init the app'; + + @override + String get userRole => 'User role'; + + @override + String minimumPowerLevel(String level) { + return '$level is the minimum power level.'; + } + + @override + String searchIn(String chat) { + return 'Search in chat \"$chat\"...'; + } + + @override + String get searchMore => 'Search more...'; + + @override + String get gallery => 'Gallery'; + + @override + String get files => 'Files'; + + @override + String databaseBuildErrorBody(String url, String error) { + return 'Unable to build the SQlite database. The app tries to use the legacy database for now. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String sessionLostBody(String url, String error) { + return 'Your session is lost. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String restoreSessionBody(String url, String error) { + return 'The app now tries to restore your session from the backup. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String forwardMessageTo(String roomName) { + return 'Forward message to $roomName?'; + } + + @override + String get sendReadReceipts => 'Send read receipts'; + + @override + String get sendTypingNotificationsDescription => + 'Other participants in a chat can see when you are typing a new message.'; + + @override + String get sendReadReceiptsDescription => + 'Other participants in a chat can see when you have read a message.'; + + @override + String get formattedMessages => 'Formatted messages'; + + @override + String get formattedMessagesDescription => + 'Display rich message content like bold text using markdown.'; + + @override + String get verifyOtherUser => '🔐 Verify other user'; + + @override + String get verifyOtherUserDescription => + 'If you verify another user, you can be sure that you know who you are really writing to. 💪\n\nWhen you start a verification, you and the other user will see a popup in the app. There you will then see a series of emojis or numbers that you have to compare with each other.\n\nThe best way to do this is to meet up or start a video call. 👭'; + + @override + String get verifyOtherDevice => '🔐 Verify other device'; + + @override + String get verifyOtherDeviceDescription => + 'When you verify another device, those devices can exchange keys, increasing your overall security. 💪 When you start a verification, a popup will appear in the app on both devices. There you will then see a series of emojis or numbers that you have to compare with each other. It\'s best to have both devices handy before you start the verification. 🤳'; + + @override + String acceptedKeyVerification(String sender) { + return '$sender accepted key verification'; + } + + @override + String canceledKeyVerification(String sender) { + return '$sender canceled key verification'; + } + + @override + String completedKeyVerification(String sender) { + return '$sender completed key verification'; + } + + @override + String isReadyForKeyVerification(String sender) { + return '$sender is ready for key verification'; + } + + @override + String requestedKeyVerification(String sender) { + return '$sender requested key verification'; + } + + @override + String startedKeyVerification(String sender) { + return '$sender started key verification'; + } + + @override + String get transparent => 'Transparent'; + + @override + String get incomingMessages => 'Incoming messages'; + + @override + String get stickers => 'Stickers'; + + @override + String get discover => 'Discover'; + + @override + String get commandHint_ignore => 'Ignore the given matrix ID'; + + @override + String get commandHint_unignore => 'Unignore the given matrix ID'; + + @override + String unreadChatsInApp(String appname, String unread) { + return '$appname: $unread unread chats'; + } + + @override + String get noDatabaseEncryption => + 'Database encryption is not supported on this platform'; + + @override + String thereAreCountUsersBlocked(Object count) { + return 'Right now there are $count users blocked.'; + } + + @override + String get restricted => 'Restricted'; + + @override + String get knockRestricted => 'Knock restricted'; + + @override + String goToSpace(Object space) { + return 'Go to space: $space'; + } + + @override + String get markAsUnread => 'Mark as unread'; + + @override + String userLevel(int level) { + return '$level - User'; + } + + @override + String moderatorLevel(int level) { + return '$level - Moderator'; + } + + @override + String adminLevel(int level) { + return '$level - Admin'; + } + + @override + String get changeGeneralChatSettings => 'Change general chat settings'; + + @override + String get inviteOtherUsers => 'Invite other users to this chat'; + + @override + String get changeTheChatPermissions => 'Change the chat permissions'; + + @override + String get changeTheVisibilityOfChatHistory => + 'Change the visibility of the chat history'; + + @override + String get changeTheCanonicalRoomAlias => + 'Change the main public chat address'; + + @override + String get sendRoomNotifications => 'Send a @room notifications'; + + @override + String get changeTheDescriptionOfTheGroup => + 'Change the description of the chat'; + + @override + String get chatPermissionsDescription => + 'Define which power level is necessary for certain actions in this chat. The power levels 0, 50 and 100 are usually representing users, moderators and admins, but any gradation is possible.'; + + @override + String updateInstalled(String version) { + return '🎉 Update $version installed!'; + } + + @override + String get changelog => 'Changelog'; + + @override + String get sendCanceled => 'Sending canceled'; + + @override + String get loginWithMatrixId => 'Login with Matrix-ID'; + + @override + String get discoverHomeservers => 'Discover homeservers'; + + @override + String get whatIsAHomeserver => 'What is a homeserver?'; + + @override + String get homeserverDescription => + 'All your data is stored on the homeserver, just like an email provider. You can choose which homeserver you want to use, while you can still communicate with everyone. Learn more at at https://matrix.org.'; + + @override + String get doesNotSeemToBeAValidHomeserver => + 'Doesn\'t seem to be a compatible homeserver. Wrong URL?'; + + @override + String get calculatingFileSize => 'Calculating file size...'; + + @override + String get prepareSendingAttachment => 'Prepare sending attachment...'; + + @override + String get sendingAttachment => 'Sending attachment...'; + + @override + String get generatingVideoThumbnail => 'Generating video thumbnail...'; + + @override + String get compressVideo => 'Compressing video...'; + + @override + String sendingAttachmentCountOfCount(int index, int length) { + return 'Sending attachment $index of $length...'; + } + + @override + String serverLimitReached(int seconds) { + return 'Server limit reached! Waiting $seconds seconds...'; + } + + @override + String get oneOfYourDevicesIsNotVerified => + 'One of your devices is not verified'; + + @override + String get noticeChatBackupDeviceVerification => + 'Note: When you connect all your devices to the chat backup, they are automatically verified.'; + + @override + String get continueText => 'Continue'; + + @override + String get welcomeText => + 'Hey Hey 👋 This is Extera. You can sign in to any homeserver, which is compatible with https://matrix.org. And then chat with anyone. It\'s a huge decentralized messaging network!'; + + @override + String get blur => 'Blur:'; + + @override + String get opacity => 'Opacity:'; + + @override + String get setWallpaper => 'Set wallpaper'; + + @override + String get manageAccount => 'Manage account'; + + @override + String get noContactInformationProvided => + 'Server does not provide any valid contact information'; + + @override + String get contactServerAdmin => 'Contact server admin'; + + @override + String get contactServerSecurity => 'Contact server security'; + + @override + String get supportPage => 'Support page'; + + @override + String get serverInformation => 'Server information:'; + + @override + String get name => 'Name'; + + @override + String get version => 'Version'; + + @override + String get website => 'Website'; + + @override + String get compress => 'Compress'; + + @override + String get boldText => 'Bold text'; + + @override + String get italicText => 'Italic text'; + + @override + String get strikeThrough => 'Strikethrough'; + + @override + String get pleaseFillOut => 'Please fill out'; + + @override + String get invalidUrl => 'Invalid url'; + + @override + String get addLink => 'Add link'; + + @override + String get unableToJoinChat => + 'Unable to join chat. Maybe the other party has already closed the conversation.'; + + @override + String get previous => 'Previous'; + + @override + String get otherPartyNotLoggedIn => + 'The other party is currently not logged in and therefore cannot receive messages!'; + + @override + String appWantsToUseForLogin(String server) { + return 'Use \'$server\' to log in'; + } + + @override + String get appWantsToUseForLoginDescription => + 'You hereby allow the app and website to share information about you.'; + + @override + String get open => 'Open'; + + @override + String get waitingForServer => 'Waiting for server...'; + + @override + String get appIntroduction => + 'Extera lets you chat with your friends across different messengers. Learn more at https://matrix.org or just tap *Continue*.'; + + @override + String get newChatRequest => '📩 New chat request'; + + @override + String get contentNotificationSettings => 'Content notification settings'; + + @override + String get generalNotificationSettings => 'General notification settings'; + + @override + String get roomNotificationSettings => 'Room notification settings'; + + @override + String get userSpecificNotificationSettings => + 'User specific notification settings'; + + @override + String get otherNotificationSettings => 'Other notification settings'; + + @override + String get notificationRuleContainsUserName => 'Contains User Name'; + + @override + String get notificationRuleContainsUserNameDescription => + 'Notifies the user when a message contains their username.'; + + @override + String get notificationRuleMaster => 'Mute all notifications'; + + @override + String get notificationRuleMasterDescription => + 'Overrides all other rules and disables all notifications.'; + + @override + String get notificationRuleSuppressNotices => 'Suppress Automated Messages'; + + @override + String get notificationRuleSuppressNoticesDescription => + 'Suppresses notifications from automated clients like bots.'; + + @override + String get notificationRuleInviteForMe => 'Invite for Me'; + + @override + String get notificationRuleInviteForMeDescription => + 'Notifies the user when they are invited to a room.'; + + @override + String get notificationRuleMemberEvent => 'Member Event'; + + @override + String get notificationRuleMemberEventDescription => + 'Suppresses notifications for membership events.'; + + @override + String get notificationRuleIsUserMention => 'User Mention'; + + @override + String get notificationRuleIsUserMentionDescription => + 'Notifies the user when they are directly mentioned in a message.'; + + @override + String get notificationRuleContainsDisplayName => 'Contains Display Name'; + + @override + String get notificationRuleContainsDisplayNameDescription => + 'Notifies the user when a message contains their display name.'; + + @override + String get notificationRuleIsRoomMention => 'Room Mention'; + + @override + String get notificationRuleIsRoomMentionDescription => + 'Notifies the user when there is a room mention.'; + + @override + String get notificationRuleRoomnotif => 'Room Notification'; + + @override + String get notificationRuleRoomnotifDescription => + 'Notifies the user when a message contains \'@room\'.'; + + @override + String get notificationRuleTombstone => 'Tombstone'; + + @override + String get notificationRuleTombstoneDescription => + 'Notifies the user about room deactivation messages.'; + + @override + String get notificationRuleReaction => 'Reaction'; + + @override + String get notificationRuleReactionDescription => + 'Suppresses notifications for reactions.'; + + @override + String get notificationRuleRoomServerAcl => 'Room Server ACL'; + + @override + String get notificationRuleRoomServerAclDescription => + 'Suppresses notifications for room server access control lists (ACL).'; + + @override + String get notificationRuleSuppressEdits => 'Suppress Edits'; + + @override + String get notificationRuleSuppressEditsDescription => + 'Suppresses notifications for edited messages.'; + + @override + String get notificationRuleCall => 'Call'; + + @override + String get notificationRuleCallDescription => + 'Notifies the user about calls.'; + + @override + String get notificationRuleEncryptedRoomOneToOne => + 'Encrypted Room One-to-One'; + + @override + String get notificationRuleEncryptedRoomOneToOneDescription => + 'Notifies the user about messages in encrypted one-to-one rooms.'; + + @override + String get notificationRuleRoomOneToOne => 'Room One-to-One'; + + @override + String get notificationRuleRoomOneToOneDescription => + 'Notifies the user about messages in one-to-one rooms.'; + + @override + String get notificationRuleMessage => 'Message'; + + @override + String get notificationRuleMessageDescription => + 'Notifies the user about general messages.'; + + @override + String get notificationRuleEncrypted => 'Encrypted'; + + @override + String get notificationRuleEncryptedDescription => + 'Notifies the user about messages in encrypted rooms.'; + + @override + String get notificationRuleJitsi => 'Jitsi'; + + @override + String get notificationRuleJitsiDescription => + 'Notifies the user about Jitsi widget events.'; + + @override + String get notificationRuleServerAcl => 'Suppress Server ACL Events'; + + @override + String get notificationRuleServerAclDescription => + 'Suppresses notifications for Server ACL events.'; + + @override + String unknownPushRule(String rule) { + return 'Unknown push rule \'$rule\''; + } + + @override + String get deletePushRuleCanNotBeUndone => + 'If you delete this notification setting, this can not be undone.'; + + @override + String get more => 'More'; + + @override + String get shareKeysWith => 'Share keys with...'; + + @override + String get shareKeysWithDescription => + 'Which devices should be trusted so that they can read along your messages in encrypted chats?'; + + @override + String get allDevices => 'All devices'; + + @override + String get crossVerifiedDevicesIfEnabled => + 'Cross verified devices if enabled'; + + @override + String get crossVerifiedDevices => 'Cross verified devices'; + + @override + String get verifiedDevicesOnly => 'Verified devices only'; + + @override + String get takeAPhoto => 'Take a photo'; + + @override + String get recordAVideo => 'Record a video'; + + @override + String get optionalMessage => '(Optional) message...'; + + @override + String get notSupportedOnThisDevice => 'Not supported on this device'; + + @override + String get enterNewChat => 'Enter new chat'; + + @override + String get approve => 'Approve'; + + @override + String get youHaveKnocked => 'You have knocked'; + + @override + String get pleaseWaitUntilInvited => + 'Please wait now, until someone from the room invites you.'; +} diff --git a/lib/generated/l10n/l10n_nl.dart b/lib/generated/l10n/l10n_nl.dart new file mode 100644 index 0000000..d23266c --- /dev/null +++ b/lib/generated/l10n/l10n_nl.dart @@ -0,0 +1,2752 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'l10n.dart'; + +// ignore_for_file: type=lint + +/// The translations for Dutch Flemish (`nl`). +class L10nNl extends L10n { + L10nNl([String locale = 'nl']) : super(locale); + + @override + String get noSendPermission => 'You can\'t send messages here'; + + @override + String get alwaysUse24HourFormat => 'true'; + + @override + String get repeatPassword => 'Wachtwoord herhalen'; + + @override + String get notAnImage => 'Geen afbeeldingsbestand.'; + + @override + String get setCustomPermissionLevel => 'Set custom permission level'; + + @override + String get setPermissionsLevelDescription => + 'Please choose a predefined role below or enter a custom permission level between 0 and 100.'; + + @override + String get ignoreUser => 'Ignore user'; + + @override + String get normalUser => 'Normal user'; + + @override + String get remove => 'Verwijder'; + + @override + String get importNow => 'Nu importeren'; + + @override + String get importEmojis => 'Emoji\'s importeren'; + + @override + String get importFromZipFile => 'Uit zip-bestand importeren'; + + @override + String get exportEmotePack => 'Emote-pakket als zip exporteren'; + + @override + String get replace => 'Vervang'; + + @override + String get about => 'Over ons'; + + @override + String aboutHomeserver(String homeserver) { + return 'Over $homeserver'; + } + + @override + String get accept => 'Accepteren'; + + @override + String acceptedTheInvitation(String username) { + return '👍 $username heeft de uitnodiging geaccepteerd'; + } + + @override + String get account => 'Account'; + + @override + String activatedEndToEndEncryption(String username) { + return '🔐 $username heeft eind-tot-eindversleuteling geactiveerd'; + } + + @override + String get addEmail => 'Email toevoegen'; + + @override + String get confirmMatrixId => + 'Bevestig jouw Matrix-ID om je account te verwijderen.'; + + @override + String supposedMxid(String mxid) { + return 'Dit moet $mxid zijn'; + } + + @override + String get addChatDescription => 'Voeg een chatomschrijving toe...'; + + @override + String get addToSpace => 'Aan space toevoegen'; + + @override + String get admin => 'Beheerder'; + + @override + String get alias => 'alias'; + + @override + String get all => 'Alle'; + + @override + String get allChats => 'Alle chats'; + + @override + String get commandHint_roomupgrade => + 'Upgradeer deze kamer naar de aangegeven kamerversie'; + + @override + String get commandHint_googly => 'Wiebel-ogen versturen'; + + @override + String get commandHint_cuddle => 'Een knuffel versturen'; + + @override + String get commandHint_hug => 'Een knuffel versturen'; + + @override + String googlyEyesContent(String senderName) { + return '$senderName stuurt je wiebelogen'; + } + + @override + String cuddleContent(String senderName) { + return '$senderName knuffelt je'; + } + + @override + String hugContent(String senderName) { + return '$senderName omhelst je'; + } + + @override + String answeredTheCall(String senderName) { + return '$senderName heeft de oproep beantwoord'; + } + + @override + String get anyoneCanJoin => 'Iedereen kan toetreden'; + + @override + String get appLock => 'App-vergrendeling'; + + @override + String get appLockDescription => + 'Vergendel de app wanneer het niet gebruikt wordt met een pincode'; + + @override + String get archive => 'Archief'; + + @override + String get areGuestsAllowedToJoin => 'Mogen gasten deelnemen'; + + @override + String get areYouSure => 'Weet je het zeker?'; + + @override + String get areYouSureYouWantToLogout => + 'Weet je zeker dat je wilt uitloggen?'; + + @override + String get askSSSSSign => + 'Voer je beveiligde opslag wachtwoordzin of herstelsleutel in om de andere persoon te kunnen ondertekenen.'; + + @override + String askVerificationRequest(String username) { + return 'Accepteer je dit verificatieverzoek van $username?'; + } + + @override + String get autoplayImages => + 'Automatisch geanimeerde stickers en emoticons afspelen'; + + @override + String badServerLoginTypesException(String serverVersions, + String supportedVersions, Object suportedVersions) { + return 'De homeserver ondersteunt de login types:\n$serverVersions\nMaar deze app ondersteunt alleen:\n$supportedVersions'; + } + + @override + String get sendTypingNotifications => 'Typemeldingen verzenden'; + + @override + String get swipeRightToLeftToReply => + 'Veeg van rechts naar links om te reageren'; + + @override + String get sendOnEnter => 'Verstuur met enter'; + + @override + String badServerVersionsException(String serverVersions, + String supportedVersions, Object serverVerions, Object suportedVersions) { + return 'De homeserver ondersteunt de Spec-versies:\n$serverVersions\nMaar deze app ondersteunt alleen $supportedVersions'; + } + + @override + String countChatsAndCountParticipants(int chats, int participants) { + return '$chats chats en $participants deelnemers'; + } + + @override + String get noMoreChatsFound => 'Geen chats gevonden...'; + + @override + String get noChatsFoundHere => + 'Hier zijn nog geen chats. Begin een nieuwe chat met iemand door op de onderstaande knop te klikken. ⤵️'; + + @override + String get joinedChats => 'Chats waaraan je deelneemt'; + + @override + String get unread => 'Ongelezen'; + + @override + String get space => 'Space'; + + @override + String get spaces => 'Spaces'; + + @override + String get banFromChat => 'Van chat verbannen'; + + @override + String get banned => 'Verbannen'; + + @override + String bannedUser(String username, String targetName) { + return '$username verbant $targetName'; + } + + @override + String get blockDevice => 'Apparaat blokkeren'; + + @override + String get blocked => 'Geblokkeerd'; + + @override + String get botMessages => 'Bot-berichten'; + + @override + String get cancel => 'Annuleren'; + + @override + String cantOpenUri(String uri) { + return 'Kan de URI $uri niet openen'; + } + + @override + String get changeDeviceName => 'Apparaatnaam wijzigen'; + + @override + String changedTheChatAvatar(String username) { + return '$username heeft de chatavatar gewijzigd'; + } + + @override + String changedTheChatDescriptionTo(String username, String description) { + return '$username heeft de chatomschrijving gewijzigd in: \'$description\''; + } + + @override + String changedTheChatNameTo(String username, String chatname) { + return '$username heeft de chatnaam gewijzigd in: \'$chatname\''; + } + + @override + String changedTheChatPermissions(String username) { + return '$username heeft de chatrechten gewijzigd'; + } + + @override + String changedTheDisplaynameTo(String username, String displayname) { + return '$username\'s naam is nu \'$displayname\''; + } + + @override + String changedTheGuestAccessRules(String username) { + return '$username heeft de toegangsregels voor gasten gewijzigd'; + } + + @override + String changedTheGuestAccessRulesTo(String username, String rules) { + return '$username heeft de gastenregels gewijzigd in: $rules'; + } + + @override + String changedTheHistoryVisibility(String username) { + return '$username heeft de zichtbaarheid van de geschiedenis gewijzigd'; + } + + @override + String changedTheHistoryVisibilityTo(String username, String rules) { + return '$username heeft de zichtbaarheid van de geschiedenis gewijzigd in: $rules'; + } + + @override + String changedTheJoinRules(String username) { + return '$username heeft de toetredingsregels gewijzigd'; + } + + @override + String changedTheJoinRulesTo(String username, String joinRules) { + return '$username heeft de toetredingsregels gewijzigd in: $joinRules'; + } + + @override + String changedTheProfileAvatar(String username) { + return '$username\'s avatar is gewijzigd'; + } + + @override + String changedTheRoomAliases(String username) { + return '$username heeft de kameraliassen gewijzigd'; + } + + @override + String changedTheRoomInvitationLink(String username) { + return '$username heeft de uitnodigingslink gewijzigd'; + } + + @override + String get changePassword => 'Wachtwoord wijzigen'; + + @override + String get changeTheHomeserver => 'Homeserver wijzigen'; + + @override + String get changeTheme => 'Je stijl veranderen'; + + @override + String get changeTheNameOfTheGroup => 'Groepsnaam wijzigen'; + + @override + String get changeYourAvatar => 'Jouw avatar veranderen'; + + @override + String get channelCorruptedDecryptError => 'De versleuteling is beschadigd'; + + @override + String get chat => 'Chat'; + + @override + String get yourChatBackupHasBeenSetUp => 'Jouw chatback-up is ingesteld.'; + + @override + String get chatBackup => 'Chatback-up'; + + @override + String get chatBackupDescription => + 'Je oude berichten zijn beveiligd met een herstelsleutel. Zorg ervoor dat je deze niet verliest.'; + + @override + String get chatDetails => 'Chatdetails'; + + @override + String get chatHasBeenAddedToThisSpace => 'Chat is toegevoegd aan deze space'; + + @override + String get chats => 'Chats'; + + @override + String get chooseAStrongPassword => 'Kies een sterk wachtwoord'; + + @override + String get clearArchive => 'Archief wissen'; + + @override + String get close => 'Sluiten'; + + @override + String get commandHint_markasdm => + 'Markeer als privéberichtenkamer voor Matrix ID'; + + @override + String get commandHint_markasgroup => 'Markeer als groep'; + + @override + String get commandHint_ban => 'Persoon uit deze kamer verbannen'; + + @override + String get commandHint_clearcache => 'Cache wissen'; + + @override + String get commandHint_create => + 'Maak een lege groepschat\nGebruik --no-encryption om de versleuteling uit te schakelen'; + + @override + String get commandHint_discardsession => 'Sessie weggooien'; + + @override + String get commandHint_dm => + 'Start een directe chat\nGebruik --no-encryption om de versleuteling uit te schakelen'; + + @override + String get commandHint_html => 'Tekst met HTML-opmaak versturen'; + + @override + String get commandHint_invite => 'Persoon in deze kamer uitnodigen'; + + @override + String get commandHint_join => 'Toetreden tot de vermelde kamer'; + + @override + String get commandHint_kick => 'Persoon uit deze kamer verwijderen'; + + @override + String get commandHint_leave => 'Deze kamer verlaten'; + + @override + String get commandHint_me => 'Beschrijf jezelf'; + + @override + String get commandHint_myroomavatar => + 'Jouw avatar voor deze kamer instellen (met mxc-uri)'; + + @override + String get commandHint_myroomnick => 'Jouw naam voor deze kamer instellen'; + + @override + String get commandHint_op => + 'Machtsniveau van de persoon instellen (standaard: 50)'; + + @override + String get commandHint_plain => 'Niet-opgemaakte tekst versturen'; + + @override + String get commandHint_react => 'Antwoord als reactie versturen'; + + @override + String get commandHint_send => 'Tekst versturen'; + + @override + String get commandHint_unban => 'Persoon weer in deze kamer toestaan'; + + @override + String get commandInvalid => 'Opdracht ongeldig'; + + @override + String commandMissing(String command) { + return '$command is geen opdracht.'; + } + + @override + String get compareEmojiMatch => 'Vergelijk de emoji\'s'; + + @override + String get compareNumbersMatch => 'Vergelijk de cijfers'; + + @override + String get configureChat => 'Chat configureren'; + + @override + String get confirm => 'Bevestigen'; + + @override + String get connect => 'Verbinden'; + + @override + String get contactHasBeenInvitedToTheGroup => + 'Contact is voor de groep uitgenodigd'; + + @override + String get containsDisplayName => 'Bevat naam'; + + @override + String get containsUserName => 'Bevat inlognaam'; + + @override + String get contentHasBeenReported => + 'De inhoud is gerapporteerd aan de serverbeheerders'; + + @override + String get copiedToClipboard => 'Gekopieerd naar klembord'; + + @override + String get copy => 'Bericht kopiëren'; + + @override + String get copyToClipboard => 'Kopieer naar klembord'; + + @override + String couldNotDecryptMessage(String error) { + return 'Kan het bericht niet ontsleutelen: $error'; + } + + @override + String countParticipants(int count) { + return '$count personen'; + } + + @override + String get create => 'Aanmaken'; + + @override + String createdTheChat(String username) { + return '💬 $username heeft de chat gemaakt'; + } + + @override + String get createGroup => 'Groep aanmaken'; + + @override + String get createNewSpace => 'Maak nieuwe space aan'; + + @override + String get currentlyActive => 'Momenteel actief'; + + @override + String get darkTheme => 'Donker'; + + @override + String dateAndTimeOfDay(String date, String timeOfDay) { + return '$date, $timeOfDay'; + } + + @override + String dateWithoutYear(String month, String day) { + return '$day-$month'; + } + + @override + String dateWithYear(String year, String month, String day) { + return '$day-$month-$year'; + } + + @override + String get deactivateAccountWarning => + 'Hierdoor wordt je account gedeactiveerd. Dit kan niet ongedaan gemaakt worden! Weet je het zeker?'; + + @override + String get defaultPermissionLevel => + 'Standaard machtigingsniveau voor nieuwe personen'; + + @override + String get delete => 'Verwijderen'; + + @override + String get deleteAccount => 'Account verwijderen'; + + @override + String get deleteMessage => 'Bericht verwijderen'; + + @override + String get device => 'Apparaat'; + + @override + String get deviceId => 'Apparaat-ID'; + + @override + String get devices => 'Apparaten'; + + @override + String get directChats => 'Directe chats'; + + @override + String get allRooms => 'Alle groepschats'; + + @override + String get displaynameHasBeenChanged => 'De naam is gewijzigd'; + + @override + String get downloadFile => 'Bestand downloaden'; + + @override + String get edit => 'Wijzig'; + + @override + String get editBlockedServers => 'Geblokkeerde servers wijzigen'; + + @override + String get chatPermissions => 'Chat toestemmingen'; + + @override + String get editDisplayname => 'Naam wijzigen'; + + @override + String get editRoomAliases => 'Kameraliassen wijzigen'; + + @override + String get editRoomAvatar => 'Kameravatar wijzigen'; + + @override + String get emoteExists => 'Emoticon bestaat al!'; + + @override + String get emoteInvalid => 'Ongeldige emoticon korte code!'; + + @override + String get emoteKeyboardNoRecents => + 'Recent gebruikte emoticons zullen hier verschijnen...'; + + @override + String get emotePacks => 'Emoticonpakketten voor de kamer'; + + @override + String get emoteSettings => 'Emoticon-instellingen'; + + @override + String get globalChatId => 'Globale chat ID'; + + @override + String get accessAndVisibility => 'Toegang en zichtbaarheid'; + + @override + String get accessAndVisibilityDescription => + 'Wie mag toetreden tot deze chat en hoe de chat ontdekt kan worden.'; + + @override + String get calls => 'Gesprekken'; + + @override + String get customEmojisAndStickers => 'Aangepaste emoticons en stickers'; + + @override + String get customEmojisAndStickersBody => + 'Voeg toe of deel aangepaste emoji\'s of stickers die gebruikt kunnen worden in elke chat.'; + + @override + String get emoteShortcode => 'Emoticon korte code'; + + @override + String get emoteWarnNeedToPick => + 'Je moet een emoticon korte code en afbeelding kiezen!'; + + @override + String get emptyChat => 'Lege chat'; + + @override + String get enableEmotesGlobally => 'Emoticonpakket overal inschakelen'; + + @override + String get enableEncryption => 'Versleuteling inschakelen'; + + @override + String get enableEncryptionWarning => + 'Je kunt de versleuteling hierna niet meer uitschakelen. Weet je het zeker?'; + + @override + String get encrypted => 'Versleuteld'; + + @override + String get encryption => 'Versleuteling'; + + @override + String get encryptionNotEnabled => 'Versleuteling is niet ingeschakeld'; + + @override + String endedTheCall(String senderName) { + return '$senderName heeft het gesprek beëindigd'; + } + + @override + String get enterAnEmailAddress => 'Voer een email in'; + + @override + String get homeserver => 'Server'; + + @override + String get enterYourHomeserver => 'Vul je homeserver in'; + + @override + String errorObtainingLocation(String error) { + return 'Locatie ophalen fout: $error'; + } + + @override + String get everythingReady => 'Alles klaar!'; + + @override + String get extremeOffensive => 'Extreem beledigend'; + + @override + String get fileName => 'Bestandsnaam'; + + @override + String get fluffychat => 'FluffyChat'; + + @override + String get fontSize => 'Lettergrootte'; + + @override + String get forward => 'Stuur door'; + + @override + String get fromJoining => 'Vanaf toetreden'; + + @override + String get fromTheInvitation => 'Vanaf uitnodiging'; + + @override + String get goToTheNewRoom => 'Ga naar de nieuwe kamer'; + + @override + String get group => 'Groep'; + + @override + String get chatDescription => 'Chatomschrijving'; + + @override + String get chatDescriptionHasBeenChanged => 'Chatomschrijving gewijzigd'; + + @override + String get groupIsPublic => 'Groep is openbaar'; + + @override + String get groups => 'Groepen'; + + @override + String groupWith(String displayname) { + return 'Groep met $displayname'; + } + + @override + String get guestsAreForbidden => 'Gasten zijn verboden'; + + @override + String get guestsCanJoin => 'Gasten kunnen deelnemen'; + + @override + String hasWithdrawnTheInvitationFor(String username, String targetName) { + return '$username heeft de uitnodiging voor $targetName ingetrokken'; + } + + @override + String get help => 'Help'; + + @override + String get hideRedactedEvents => 'Bewerkte gebeurtenissen verbergen'; + + @override + String get hideRedactedMessages => 'Verberg verwijderde berichten'; + + @override + String get hideRedactedMessagesBody => + 'Als iemand een bericht verwijdert, is dit bericht niet meer zichtbaar in de chat.'; + + @override + String get hideInvalidOrUnknownMessageFormats => + 'Verberg ongeldige of onbekende berichtformaten'; + + @override + String get howOffensiveIsThisContent => 'Hoe beledigend is deze inhoud?'; + + @override + String get id => 'ID'; + + @override + String get identity => 'Identiteit'; + + @override + String get block => 'Blokkeren'; + + @override + String get blockedUsers => 'Geblokkeerde personen'; + + @override + String get blockListDescription => + 'Je kunt personen blokkeren die je lastig vallen. Je kan dan geen berichten meer ontvangen of kameruitnodigingen krijgen van de personen op je blokkeerlijst.'; + + @override + String get blockUsername => 'Negeer inlognaam'; + + @override + String get iHaveClickedOnLink => 'Ik heb op de link geklikt'; + + @override + String get incorrectPassphraseOrKey => + 'Onjuiste wachtwoordzin of herstelsleutel'; + + @override + String get inoffensive => 'Niet beledigend'; + + @override + String get inviteContact => 'Contact uitnodigen'; + + @override + String inviteContactToGroupQuestion(Object contact, Object groupName) { + return 'Wil je $contact uitnodigingen voor de chat \"$groupName\"?'; + } + + @override + String inviteContactToGroup(String groupName) { + return 'Contact voor $groupName uitnodigen'; + } + + @override + String get noChatDescriptionYet => 'Nog geen chatomschrijving gemaakt.'; + + @override + String get tryAgain => 'Opnieuw proberen'; + + @override + String get invalidServerName => 'Foute servernaam'; + + @override + String get invited => 'Uitgenodigd'; + + @override + String get redactMessageDescription => + 'Het bericht zal worden aangepast voor alle deelnemers in dit gesprek. Dit kan niet ongedaan gemaakt worden.'; + + @override + String get optionalRedactReason => + '(Optioneel) Reden voor aanpassing van dit bericht...'; + + @override + String invitedUser(String username, String targetName) { + return '📩 $username heeft $targetName uitgenodigd'; + } + + @override + String get invitedUsersOnly => 'Alleen uitgenodigde personen'; + + @override + String get inviteForMe => 'Persoonlijke uitnodiging'; + + @override + String inviteText(String username, String link) { + return '$username heeft je uitgenodigd voor FluffyChat.\n1. Bezoek https://fluffychat.im en installeer de app\n2. Registreer of log in\n3. Open deze uitnodigingslink:\n$link'; + } + + @override + String get isTyping => 'is aan het typen…'; + + @override + String joinedTheChat(String username) { + return '👋 $username is toegetreden tot de chat'; + } + + @override + String get joinRoom => 'Toetreden tot de kamer'; + + @override + String kicked(String username, String targetName) { + return '👞 $username heeft $targetName verwijderd'; + } + + @override + String kickedAndBanned(String username, String targetName) { + return '🙅 $username heeft $targetName verwijderd en verbannen'; + } + + @override + String get kickFromChat => 'Uit chat verwijderen'; + + @override + String lastActiveAgo(String localizedTimeShort) { + return 'Laatst actief: $localizedTimeShort'; + } + + @override + String get leave => 'Chat verlaten'; + + @override + String get leftTheChat => 'Verliet de chat'; + + @override + String get license => 'Licentie'; + + @override + String get lightTheme => 'Licht'; + + @override + String loadCountMoreParticipants(int count) { + return 'Laad nog $count personen'; + } + + @override + String get dehydrate => 'Sessie exporteren en apparaat wissen'; + + @override + String get dehydrateWarning => + 'Deze actie kan niet ongedaan worden gemaakt. Zorg ervoor dat je het back-upbestand veilig opslaat.'; + + @override + String get dehydrateTor => 'TOR-sessies: Exporteer sessie'; + + @override + String get dehydrateTorLong => + 'Voor TOR-sessies is het aanbevolen de sessie te exporteren alvorens het venster te sluiten.'; + + @override + String get hydrateTor => 'TOR-sessie: Importeren sessie export'; + + @override + String get hydrateTorLong => + 'Heb je de vorige keer jouw sessie geëxporteerd met TOR? Importeer het dan snel en ga verder met chatten.'; + + @override + String get hydrate => 'Herstellen vanuit back-upbestand'; + + @override + String get loadingPleaseWait => 'Bezig met laden… Even geduld.'; + + @override + String get loadMore => 'Meer laden…'; + + @override + String get locationDisabledNotice => + 'Locatievoorzieningen is uitgeschakeld. Zet dit eerst aan om je locatie te delen.'; + + @override + String get locationPermissionDeniedNotice => + 'Locatievoorzieningen is geweigerd. Zet hem aan om locatie delen te gebruiken.'; + + @override + String get login => 'Inloggen'; + + @override + String logInTo(String homeserver) { + return 'Inloggen bij $homeserver'; + } + + @override + String get logout => 'Uitloggen'; + + @override + String get memberChanges => 'Persoon wijzigingen'; + + @override + String get mention => 'Vermeld'; + + @override + String get messages => 'Berichten'; + + @override + String get messagesStyle => 'Berichten:'; + + @override + String get moderator => 'Moderator'; + + @override + String get muteChat => 'Meldingen uitschakelen'; + + @override + String get needPantalaimonWarning => + 'Houd er rekening mee dat je voorlopig Pantalaimon nodig hebt om eind-tot-eindversleuteling te gebruiken.'; + + @override + String get newChat => 'Nieuwe chat'; + + @override + String get newMessageInFluffyChat => '💬 Nieuw bericht in FluffyChat'; + + @override + String get newVerificationRequest => 'Nieuw verificatieverzoek!'; + + @override + String get next => 'Volgende'; + + @override + String get no => 'Nee'; + + @override + String get noConnectionToTheServer => 'Geen verbinding met de server'; + + @override + String get noEmotesFound => 'Geen emoticons gevonden. 😕'; + + @override + String get noEncryptionForPublicRooms => + 'Je kunt de versleuteling pas activeren zodra de kamer niet meer openbaar toegankelijk is.'; + + @override + String get noGoogleServicesWarning => + 'Firebase Cloud Messaging lijkt niet beschikbaar op je apparaat. Om nog steeds pushmeldingen te krijgen, adviseren we om ntfy te installeren. Met ntfy of een andere Unified Push provider kun je pushmeldingen ontvangen op een veilige manier. Je kunt ntfy downloaden van de PlayStore of van F-Droid.'; + + @override + String noMatrixServer(String server1, String server2) { + return '$server1 is geen Matrix-server, wil je $server2 gebruiken?'; + } + + @override + String get shareInviteLink => 'Uitnodigingslink delen'; + + @override + String get scanQrCode => 'QR-code scannen'; + + @override + String get none => 'Geen'; + + @override + String get noPasswordRecoveryDescription => + 'Je hebt nog geen manier toegevoegd om je wachtwoord te herstellen.'; + + @override + String get noPermission => 'Geen toestemming'; + + @override + String get noRoomsFound => 'Geen kamers gevonden …'; + + @override + String get notifications => 'Meldingen'; + + @override + String get notificationsEnabledForThisAccount => + 'Meldingen ingeschakeld voor dit account'; + + @override + String numUsersTyping(int count) { + return '$count personen typen…'; + } + + @override + String get obtainingLocation => 'Locatie ophalen…'; + + @override + String get offensive => 'Beledigend'; + + @override + String get offline => 'Offline'; + + @override + String get ok => 'OK'; + + @override + String get online => 'Online'; + + @override + String get onlineKeyBackupEnabled => 'Online sleutelback-up is ingeschakeld'; + + @override + String get oopsPushError => + 'Oeps! Helaas is er een fout opgetreden bij het instellen van de pushmeldingen.'; + + @override + String get oopsSomethingWentWrong => 'Oeps, er ging iets mis…'; + + @override + String get openAppToReadMessages => 'Open app om de berichten te lezen'; + + @override + String get openCamera => 'Camera openen'; + + @override + String get openVideoCamera => 'Videocamera openen'; + + @override + String get oneClientLoggedOut => 'Één van jouw apparaten is uitgelogd'; + + @override + String get addAccount => 'Account toevoegen'; + + @override + String get editBundlesForAccount => 'Bundels voor dit account wijzigen'; + + @override + String get addToBundle => 'Aan bundel toevoegen'; + + @override + String get removeFromBundle => 'Van bundel verwijderen'; + + @override + String get bundleName => 'Bundelnaam'; + + @override + String get enableMultiAccounts => + '(BETA) Multi-accounts inschakelen op dit apparaat'; + + @override + String get openInMaps => 'In kaarten openen'; + + @override + String get link => 'Link'; + + @override + String get serverRequiresEmail => + 'Deze server wil je email laten bevestigen bij de registratie.'; + + @override + String get or => 'Of'; + + @override + String get participant => 'Personen'; + + @override + String get passphraseOrKey => 'wachtwoordzin of herstelsleutel'; + + @override + String get password => 'Wachtwoord'; + + @override + String get passwordForgotten => 'Wachtwoord vergeten'; + + @override + String get passwordHasBeenChanged => 'Wachtwoord gewijzigd'; + + @override + String get hideMemberChangesInPublicChats => + 'Verberg persoon veranderingen in openbare chats'; + + @override + String get hideMemberChangesInPublicChatsBody => + 'Verberg in de tijdlijn van de chat als iemand zich aanmeldt bij een openbare chat of deze verlaat om de leesbaarheid te verbeteren.'; + + @override + String get overview => 'Overzicht'; + + @override + String get notifyMeFor => 'Waarschuw mij voor'; + + @override + String get passwordRecoverySettings => 'Wachtwoordherstel-instellingen'; + + @override + String get passwordRecovery => 'Wachtwoordherstel'; + + @override + String get people => 'Personen'; + + @override + String get pickImage => 'Kies een afbeelding'; + + @override + String get pin => 'Pin'; + + @override + String play(String fileName) { + return 'Speel $fileName'; + } + + @override + String get pleaseChoose => 'Maak een keuze'; + + @override + String get pleaseChooseAPasscode => 'Kies een toegangscode'; + + @override + String get pleaseClickOnLink => + 'Klik op de link in de email en ga dan verder.'; + + @override + String get pleaseEnter4Digits => + 'Voer 4 cijfers in of laat leeg om app-vergrendeling uit te schakelen.'; + + @override + String get pleaseEnterRecoveryKey => 'Voer jouw herstelsleutel in:'; + + @override + String get pleaseEnterYourPassword => 'Voer jouw wachtwoord in'; + + @override + String get pleaseEnterYourPin => 'Voer je pincode in'; + + @override + String get pleaseEnterYourUsername => 'Voer je inlognaam in'; + + @override + String get pleaseFollowInstructionsOnWeb => + 'Volg de instructies op de website en tik op volgende.'; + + @override + String get privacy => 'Privacy'; + + @override + String get publicRooms => 'Openbare kamers'; + + @override + String get pushRules => 'Meldingsinstellingen'; + + @override + String get reason => 'Reden'; + + @override + String get recording => 'Opnemen'; + + @override + String redactedBy(String username) { + return 'Aangepast door $username'; + } + + @override + String get directChat => 'Directe chat'; + + @override + String redactedByBecause(String username, String reason) { + return 'Aangepast door $username, reden: \"$reason\"'; + } + + @override + String redactedAnEvent(String username) { + return '$username heeft een event verwijderd'; + } + + @override + String get redactMessage => 'Aangepast bericht'; + + @override + String get register => 'Registeren'; + + @override + String get reject => 'Afwijzen'; + + @override + String rejectedTheInvitation(String username) { + return '$username heeft de uitnodiging afgewezen'; + } + + @override + String get rejoin => 'Opnieuw deelnemen'; + + @override + String get removeAllOtherDevices => 'Verwijder alle andere apparaten'; + + @override + String removedBy(String username) { + return 'Verwijderd door $username'; + } + + @override + String get removeDevice => 'Verwijder apparaat'; + + @override + String get unbanFromChat => 'Verbanning opheffen'; + + @override + String get removeYourAvatar => 'Jouw avatar verwijderen'; + + @override + String get replaceRoomWithNewerVersion => 'Kamerversie upgraden'; + + @override + String get reply => 'Antwoord'; + + @override + String get reportMessage => 'Bericht rapporteren'; + + @override + String get translateMessage => 'Translate message'; + + @override + String get translatedMessage => 'Translated message'; + + @override + String get errorTranslatingMessage => + 'An error has occured while translating the message.'; + + @override + String get recoverMessage => 'Recover message'; + + @override + String get recoveredMessage => 'Recovered message'; + + @override + String get errorRecoveringMessage => + 'An error has occured while recovering the message.'; + + @override + String get errorRecoveringMessageNoAdmin => + 'This feature is available on Synapse homeservers only for adminstrators.'; + + @override + String get requestPermission => 'Vraag toestemming'; + + @override + String get roomHasBeenUpgraded => 'Kamer is geüpgrade'; + + @override + String get roomVersion => 'Kamerversie'; + + @override + String get saveFile => 'Bestand opslaan'; + + @override + String get retry => 'Retry'; + + @override + String get search => 'Zoeken'; + + @override + String get security => 'Beveiliging'; + + @override + String get recoveryKey => 'Herstelsleutel'; + + @override + String get recoveryKeyLost => 'Herstelsleutel verloren?'; + + @override + String seenByUser(String username) { + return 'Gezien door $username'; + } + + @override + String get send => 'Verstuur'; + + @override + String get sendAMessage => 'Stuur een bericht'; + + @override + String get sendAsText => 'Als tekst versturen'; + + @override + String get sendAudio => 'Audio versturen'; + + @override + String get sendFile => 'Bestand versturen'; + + @override + String get sendImage => 'Afbeelding versturen'; + + @override + String sendImages(int count) { + return 'Stuur $count afbeelding(en)'; + } + + @override + String get sendMessages => 'Berichten versturen'; + + @override + String get sendOriginal => 'Origineel versturen'; + + @override + String get sendSticker => 'Sticker versturen'; + + @override + String get sendVideo => 'Video versturen'; + + @override + String sentAFile(String username) { + return '📁 $username heeft een bestand verzonden'; + } + + @override + String sentAnAudio(String username) { + return '🎤 $username heeft een audio verzonden'; + } + + @override + String sentAPicture(String username) { + return '🖼️ $username heeft een afbeelding verzonden'; + } + + @override + String sentASticker(String username) { + return '😊 $username heeft een sticker verzonden'; + } + + @override + String sentAVideo(String username) { + return '🎥 $username heeft een video verzonden'; + } + + @override + String sentCallInformations(String senderName) { + return '$senderName heeft oproepgegevens verzonden'; + } + + @override + String get separateChatTypes => 'Directe chats en groepen los weergeven'; + + @override + String get setAsCanonicalAlias => 'Als hoofdalias instellen'; + + @override + String get setCustomEmotes => 'Aangepaste emoticons instellen'; + + @override + String get setChatDescription => 'Chatomschrijving instellen'; + + @override + String get setInvitationLink => 'Uitnodigingslink instellen'; + + @override + String get setPermissionsLevel => 'Machtigingsniveau instellen'; + + @override + String get setStatus => 'Status instellen'; + + @override + String get settings => 'Instellingen'; + + @override + String get share => 'Delen'; + + @override + String sharedTheLocation(String username) { + return '$username heeft deze locatie gedeeld'; + } + + @override + String get shareLocation => 'Locatie delen'; + + @override + String get showPassword => 'Wachtwoord weergeven'; + + @override + String get presenceStyle => 'Aanwezigheid:'; + + @override + String get hideAvatarsInInvites => 'Hide avatars in invites'; + + @override + String get hideAvatarsInInvitesDescription => + 'Do not show room avatars in invites'; + + @override + String get presencesToggle => 'Toon statusberichten van andere personen'; + + @override + String get pureBlackToggle => 'Pure Black'; + + @override + String get singlesignon => 'Eenmalig Inloggen'; + + @override + String get skip => 'Overslaan'; + + @override + String get sourceCode => 'Broncode'; + + @override + String get spaceIsPublic => 'Space is openbaar'; + + @override + String get spaceName => 'Spacenaam'; + + @override + String startedACall(String senderName) { + return '$senderName heeft een gesprek gestart'; + } + + @override + String get startFirstChat => 'Begin je eerste chat'; + + @override + String get status => 'Status'; + + @override + String get statusExampleMessage => 'Hoe gaat het met jouw vandaag?'; + + @override + String get submit => 'Indienen'; + + @override + String get synchronizingPleaseWait => 'Synchroniseren... Even geduld.'; + + @override + String synchronizingPleaseWaitCounter(String percentage) { + return ' Synchroniseren… ($percentage%)'; + } + + @override + String get systemTheme => 'Systeem'; + + @override + String get theyDontMatch => 'Ze komen niet overeen'; + + @override + String get theyMatch => 'Ze komen overeen'; + + @override + String get title => 'FluffyChat'; + + @override + String get toggleFavorite => 'Favoriet in- of uitschakelen'; + + @override + String get toggleMuted => 'Meldingen in- of uitschakelen'; + + @override + String get toggleUnread => 'Markeer gelezen/ongelezen'; + + @override + String get tooManyRequestsWarning => + 'Te veel verzoeken. Probeer het later nog eens!'; + + @override + String get transferFromAnotherDevice => 'Overzetten vanaf een ander apparaat'; + + @override + String get tryToSendAgain => 'Probeer nogmaals te verzenden'; + + @override + String get unavailable => 'Niet beschikbaar'; + + @override + String unbannedUser(String username, String targetName) { + return '$username heeft verbanning $targetName ongedaan gemaakt'; + } + + @override + String get unblockDevice => 'Deblokkeer apparaat'; + + @override + String get unknownDevice => 'Onbekend apparaat'; + + @override + String get unknownEncryptionAlgorithm => 'Onbekend versleutelingsalgoritme'; + + @override + String unknownEvent(String type) { + return 'Onbekend evenement \'$type\''; + } + + @override + String get unmuteChat => 'Meldingen inschakelen'; + + @override + String get unpin => 'Losmaken'; + + @override + String unreadChats(int unreadCount) { + String _temp0 = intl.Intl.pluralLogic( + unreadCount, + locale: localeName, + other: '$unreadCount ongelezen chats', + one: '1 ongelezen chat', + ); + return '$_temp0'; + } + + @override + String userAndOthersAreTyping(String username, int count) { + return '$username en $count anderen zijn aan het typen …'; + } + + @override + String userAndUserAreTyping(String username, String username2) { + return '$username en $username2 zijn aan het typen …'; + } + + @override + String userIsTyping(String username) { + return '$username is aan het typen …'; + } + + @override + String userLeftTheChat(String username) { + return '🚪 $username is vertrokken uit de chat'; + } + + @override + String get username => 'Inlognaam'; + + @override + String userSentUnknownEvent(String username, String type) { + return '$username heeft een $type -gebeurtenis gestuurd'; + } + + @override + String get unverified => 'Niet geverifieerd'; + + @override + String get verified => 'Geverifieerd'; + + @override + String get verify => 'Verifieer'; + + @override + String get verifyStart => 'Verificatie starten'; + + @override + String get verifySuccess => 'Je bent succesvol geverifieerd!'; + + @override + String get verifyTitle => 'Ander account verifiëren'; + + @override + String get videoCall => 'Videogesprek'; + + @override + String get visibilityOfTheChatHistory => 'Chatgeschiedenis zichtbaarheid'; + + @override + String get visibleForAllParticipants => 'Zichtbaar voor alle personen'; + + @override + String get visibleForEveryone => 'Zichtbaar voor iedereen'; + + @override + String get voiceMessage => 'Spraakbericht versturen'; + + @override + String get waitingPartnerAcceptRequest => + 'Wachten tot partner het verzoek accepteert …'; + + @override + String get waitingPartnerEmoji => + 'Wachten tot je partner de emoji accepteert…'; + + @override + String get waitingPartnerNumbers => + 'Wachten tot partner de nummers accepteert …'; + + @override + String get wallpaper => 'Achtergrond:'; + + @override + String get warning => 'Waarschuwing!'; + + @override + String get weSentYouAnEmail => 'We hebben je een email gestuurd'; + + @override + String get whoCanPerformWhichAction => 'Wie kan welke actie uitvoeren'; + + @override + String get whoIsAllowedToJoinThisGroup => 'Wie mag deelnemen aan deze groep'; + + @override + String get whyDoYouWantToReportThis => 'Waarom wil je dit rapporteren?'; + + @override + String get wipeChatBackup => + 'Wil je de chatback-up wissen om een nieuwe herstelsleutel te kunnen maken?'; + + @override + String get withTheseAddressesRecoveryDescription => + 'Met deze adressen kun je je wachtwoord herstellen.'; + + @override + String get writeAMessage => 'Schrijf een bericht…'; + + @override + String get yes => 'Ja'; + + @override + String get you => 'Jij'; + + @override + String get youAreNoLongerParticipatingInThisChat => + 'Je neemt niet langer deel aan deze chat'; + + @override + String get youHaveBeenBannedFromThisChat => 'Je bent verbannen uit deze chat'; + + @override + String get yourPublicKey => 'Je publieke sleutel'; + + @override + String get messageInfo => 'Berichtinfo'; + + @override + String get time => 'Tijd'; + + @override + String get messageType => 'Berichttype'; + + @override + String get sender => 'Afzender'; + + @override + String get openGallery => 'Galerij openen'; + + @override + String get removeFromSpace => 'Uit de space verwijderen'; + + @override + String get addToSpaceDescription => + 'Selecteer een space om deze chat aan toe te voegen.'; + + @override + String get start => 'Start'; + + @override + String get pleaseEnterRecoveryKeyDescription => + 'Om je oude berichten te ontgrendelen voer je jouw herstelsleutel in die gemaakt is in je vorige sessie. Je sleutel is niet je wachtwoord.'; + + @override + String get publish => 'Publiceren'; + + @override + String videoWithSize(String size) { + return 'Video ($size)'; + } + + @override + String get openChat => 'Chat openen'; + + @override + String get markAsRead => 'Markeer als gelezen'; + + @override + String get reportUser => 'Persoon rapporteren'; + + @override + String get dismiss => 'Sluiten'; + + @override + String reactedWith(String sender, String reaction) { + return '$sender reageerde met $reaction'; + } + + @override + String get pinMessage => 'Maak vast aan kamer'; + + @override + String get confirmEventUnpin => + 'Weet je zeker dat je de gebeurtenis definitief wilt losmaken?'; + + @override + String get emojis => 'Emoji\'s'; + + @override + String get placeCall => 'Bellen'; + + @override + String get voiceCall => 'Spraakoproep'; + + @override + String get unsupportedAndroidVersion => 'Niet-ondersteunde Android-versie'; + + @override + String get unsupportedAndroidVersionLong => + 'Voor deze functie is een nieuwere Android-versie vereist. Controleer op updates of Lineage OS-ondersteuning.'; + + @override + String get videoCallsBetaWarning => + 'Houd er rekening mee dat videogesprekken momenteel in bèta zijn. Ze werken misschien niet zoals je verwacht of werken niet op alle platformen.'; + + @override + String get experimentalVideoCalls => 'Videogesprekken (experimenteel)'; + + @override + String get emailOrUsername => 'Email of inlognaam'; + + @override + String get indexedDbErrorTitle => 'Problemen met privémodus'; + + @override + String get indexedDbErrorLong => + 'Het opslaan van berichten is helaas niet standaard ingeschakeld in de privémodus.\nBezoek alsjeblieft\n - about:config\n - stel dom.indexedDB.privateBrowsing.enabled in op true\nAnders is het niet mogelijk om FluffyChat op te starten.'; + + @override + String switchToAccount(String number) { + return 'Naar account $number overschakelen'; + } + + @override + String get nextAccount => 'Volgende account'; + + @override + String get previousAccount => 'Vorige account'; + + @override + String get addWidget => 'Widget toevoegen'; + + @override + String get widgetVideo => 'Video'; + + @override + String get widgetEtherpad => 'Tekstnotitie'; + + @override + String get widgetJitsi => 'Jitsi Meet'; + + @override + String get widgetCustom => 'Aangepast'; + + @override + String get widgetName => 'Naam'; + + @override + String get widgetUrlError => 'Dit is geen geldige link.'; + + @override + String get widgetNameError => 'Geef een naam op.'; + + @override + String get errorAddingWidget => 'Fout bij het toevoegen van de widget.'; + + @override + String get youRejectedTheInvitation => 'Je hebt de uitnodiging afgewezen'; + + @override + String get youJoinedTheChat => 'Je bent toegetreden tot de chat'; + + @override + String get youAcceptedTheInvitation => + '👍 Je hebt de uitnodiging geaccepteerd'; + + @override + String youBannedUser(String user) { + return 'Je hebt $user verbannen'; + } + + @override + String youHaveWithdrawnTheInvitationFor(String user) { + return 'Je hebt de uitnodiging voor $user ingetrokken'; + } + + @override + String youInvitedToBy(String alias) { + return '📩 Je bent uitgenodigd via een link voor:\n$alias'; + } + + @override + String youInvitedBy(String user) { + return '📩 Je bent uitgenodigd door $user'; + } + + @override + String invitedBy(String user) { + return '📩 Uitgenodigd door: $user'; + } + + @override + String youInvitedUser(String user) { + return '📩 Je hebt $user uitgenodigd'; + } + + @override + String youKicked(String user) { + return '👞 Je hebt $user weggestuurd'; + } + + @override + String youKickedAndBanned(String user) { + return '🙅 Je hebt weggestuurd en verbannen $user'; + } + + @override + String youUnbannedUser(String user) { + return 'Je hebt de ban op $user opgeheven'; + } + + @override + String hasKnocked(String user) { + return '🚪 $user heeft geklopt'; + } + + @override + String get usersMustKnock => 'Personen moeten kloppen'; + + @override + String get noOneCanJoin => 'Niemand kan deelnemen'; + + @override + String userWouldLikeToChangeTheChat(String user) { + return '$user wil graag deelnemen aan de chat.'; + } + + @override + String get noPublicLinkHasBeenCreatedYet => + 'Openbare link is nog niet gecreëerd'; + + @override + String get knock => 'Klop'; + + @override + String get users => 'Personen'; + + @override + String get unlockOldMessages => 'Oude berichten ontgrendelen'; + + @override + String get storeInSecureStorageDescription => + 'Sla de herstelsleutel op in de beveiligde opslag van dit apparaat.'; + + @override + String get saveKeyManuallyDescription => + 'Sla deze sleutel handmatig op via delen of het klembord.'; + + @override + String get storeInAndroidKeystore => 'In Android KeyStore opslaan'; + + @override + String get storeInAppleKeyChain => 'In Apple KeyChain opslaan'; + + @override + String get storeSecurlyOnThisDevice => 'Veilig opslaan op dit apparaat'; + + @override + String countFiles(int count) { + return '$count bestanden'; + } + + @override + String get user => 'Persoon'; + + @override + String get custom => 'Aangepast'; + + @override + String get foregroundServiceRunning => + 'Deze melding verschijnt wanneer de voorgronddienst draait.'; + + @override + String get screenSharingTitle => 'scherm delen'; + + @override + String get screenSharingDetail => 'Je deelt je scherm in FuffyChat'; + + @override + String get callingPermissions => 'Telefoon-rechten'; + + @override + String get callingAccount => 'Telefoon-account'; + + @override + String get callingAccountDetails => + 'Hiermee kan FluffyChat de Android telefoon-app gebruiken.'; + + @override + String get appearOnTop => 'Bovenaan verschijnen'; + + @override + String get appearOnTopDetails => + 'Laat de app bovenaan verschijnen (niet nodig als je FluffyChat al hebt ingesteld als een belaccount)'; + + @override + String get otherCallingPermissions => + 'Microfoon, camera en andere FluffyChat-rechten'; + + @override + String get whyIsThisMessageEncrypted => 'Waarom is dit bericht onleesbaar?'; + + @override + String get noKeyForThisMessage => + 'Dit kan gebeuren als het bericht is verzonden voordat je bij je account op dit apparaat hebt aangemeld.\n\nHet is ook mogelijk dat de afzender je apparaat heeft geblokkeerd of dat er iets mis is gegaan met de internetverbinding.\n\nKan je het bericht wel lezen op een andere sessie? Dan kan je het bericht daarvandaan overzetten! Ga naar Instellingen > Apparaten en zorg ervoor dat je apparaten elkaar hebben geverifieerd. Wanneer je de kamer de volgende keer opent en beide sessies op de voorgrond staan, zullen de sleutels automatisch worden verzonden.\n\nWil je de sleutels niet verliezen als je uitlogt of van apparaat wisselt? Zorg er dan voor dat je de chatback-up hebt aangezet in de instellingen.'; + + @override + String get newGroup => 'Nieuwe groep'; + + @override + String get newSpace => 'Space aanmaken'; + + @override + String get enterSpace => 'Space betreden'; + + @override + String get enterRoom => 'Kamer betreden'; + + @override + String get allSpaces => 'Alle spaces'; + + @override + String numChats(String number) { + return '$number chats'; + } + + @override + String get hideUnimportantStateEvents => + 'Onbelangrijke statusgebeurtenissen verbergen'; + + @override + String get hidePresences => 'Verberg statuslijst?'; + + @override + String get doNotShowAgain => 'Niet meer tonen'; + + @override + String wasDirectChatDisplayName(String oldDisplayName) { + return 'Lege chat (was $oldDisplayName)'; + } + + @override + String get newSpaceDescription => + 'Met spaces kun je je chats samenvoegen en privé- of openbare community\'s bouwen.'; + + @override + String get encryptThisChat => 'Versleutel deze chat'; + + @override + String get disableEncryptionWarning => + 'Om veiligheidsredenen kun je versleuteling niet uitschakelen in een chat, waar deze eerder is ingeschakeld.'; + + @override + String get sorryThatsNotPossible => 'Sorry, dat is niet mogelijk'; + + @override + String get deviceKeys => 'Apparaatsleutels:'; + + @override + String get reopenChat => 'Chat heropenen'; + + @override + String get noBackupWarning => + 'Waarschuwing! Zonder de chatback-up in te schakelen, verlies je de toegang tot je versleutelde berichten. Het is sterk aanbevolen om eerst de chatback-up in te schakelen voordat je uitlogt.'; + + @override + String get noOtherDevicesFound => 'Geen andere apparaten gevonden'; + + @override + String fileIsTooBigForServer(String max) { + return 'Kan niet verzenden! De server ondersteunt alleen bijlages tot $max.'; + } + + @override + String fileHasBeenSavedAt(String path) { + return 'Het bestand is opgeslagen op $path'; + } + + @override + String get jumpToLastReadMessage => 'Spring naar het laatst gelezen bericht'; + + @override + String get readUpToHere => 'Lees tot hier'; + + @override + String get jump => 'Spring'; + + @override + String get openLinkInBrowser => 'Link in browser openen'; + + @override + String get reportErrorDescription => + '😭 Oh nee. Er is iets misgegaan. Probeer het later nog eens. Als je wilt, kun je de bug rapporteren aan de ontwikkelaars.'; + + @override + String get report => 'Rapporteer'; + + @override + String get signInWithPassword => 'Aanmelden met wachtwoord'; + + @override + String get pleaseTryAgainLaterOrChooseDifferentServer => + 'Probeer het later nog eens of kies een andere server.'; + + @override + String signInWith(String provider) { + return 'Aanmelden met $provider'; + } + + @override + String get profileNotFound => + 'De persoon kan niet gevonden worden op de server. Misschien is er een verbindingsprobleem of de persoon bestaat niet.'; + + @override + String get setTheme => 'Thema instellen:'; + + @override + String get setColorTheme => 'Kleurthema instellen:'; + + @override + String get invite => 'Uitnodigen'; + + @override + String get inviteGroupChat => '📨 Groeps-chat uitnodiging'; + + @override + String get invitePrivateChat => '📨 Privé-chat uitnodiging'; + + @override + String get invalidInput => 'Ongeldige invoer!'; + + @override + String wrongPinEntered(int seconds) { + return 'Verkeerde pin ingevoerd! Probeer het nog eens over $seconds seconden...'; + } + + @override + String get pleaseEnterANumber => 'Vul een getal in groter dan 0'; + + @override + String get archiveRoomDescription => + 'De chat zal naar het archief worden verplaatst. Andere personen zullen in staat zijn te zien dat je de chat hebt verlaten.'; + + @override + String get roomUpgradeDescription => + 'De chat zal dan opnieuw gemaakt worden met de nieuwe kamerversie. Alle deelnemers worden geïnformeerd dat ze moeten overstappen naar de nieuwe chat. Je kan meer lezen over kamerversies op https://spec.matrix.org/latest/rooms/'; + + @override + String get removeDevicesDescription => + 'Je wordt op dit apparaat uitgelogd en zal niet langer in staat zijn om berichten te ontvangen.'; + + @override + String get banUserDescription => + 'De persoon zal worden verbannen van de chat en kan niet meer toetreden totdat de verbanning is opgeheven.'; + + @override + String get unbanUserDescription => + 'De persoon zal weer in staat zijn om de chat te betreden als ze het proberen.'; + + @override + String get kickUserDescription => + 'De persoon is verwijderd uit de chat, maar is niet verbannen. In openbare chats kan de persoon op elk moment opnieuw deelnemen.'; + + @override + String get makeAdminDescription => + 'Wanneer je deze persoon beheerder maakt kun je dit niet ongedaan maken als jullie dezelfde rechten hebben.'; + + @override + String get pushNotificationsNotAvailable => + 'Pushmeldingen zijn niet beschikbaar'; + + @override + String get learnMore => 'Lees meer'; + + @override + String get yourGlobalUserIdIs => 'Je Matrix ID is: '; + + @override + String noUsersFoundWithQuery(String query) { + return 'Helaas kan er geen persoon gevonden worden met \"$query\". Controleer of je een typfout hebt gemaakt.'; + } + + @override + String get knocking => 'Kloppen'; + + @override + String chatCanBeDiscoveredViaSearchOnServer(String server) { + return 'Chat kan worden gevonden via een zoekopdracht op $server'; + } + + @override + String get searchChatsRooms => 'Zoek naar #chats, @personen...'; + + @override + String get nothingFound => 'Niets gevonden...'; + + @override + String get groupName => 'Groepsnaam'; + + @override + String get createGroupAndInviteUsers => 'Maak groep en nodig personen uit'; + + @override + String get groupCanBeFoundViaSearch => 'Groep kan gevonden worden via zoeken'; + + @override + String get wrongRecoveryKey => + 'Helaas... dit lijkt niet de correcte herstelsleutel.'; + + @override + String get startConversation => 'Start gesprek'; + + @override + String get commandHint_sendraw => 'Stuur kale json'; + + @override + String get databaseMigrationTitle => 'Database is geoptimaliseerd'; + + @override + String get databaseMigrationBody => 'Een ogenblik. Dit kan even duren.'; + + @override + String get leaveEmptyToClearStatus => 'Laat leeg om je status te resetten.'; + + @override + String get select => 'Selecteer'; + + @override + String get searchForUsers => 'Zoek naar @personen...'; + + @override + String get pleaseEnterYourCurrentPassword => 'Vul je huidige wachtwoord in'; + + @override + String get newPassword => 'Nieuw wachtwoord'; + + @override + String get pleaseChooseAStrongPassword => 'Kies a.j.b. een sterk wachtwoord'; + + @override + String get passwordsDoNotMatch => 'Wachtwoorden komen niet overeen'; + + @override + String get passwordIsWrong => 'Je ingevoerde wachtwoord is fout'; + + @override + String get publicLink => 'Openbare link'; + + @override + String get publicChatAddresses => 'Openbare chat adressen'; + + @override + String get createNewAddress => 'Creëer nieuw adres'; + + @override + String get joinSpace => 'Toetreden tot de space'; + + @override + String get publicSpaces => 'Openbare spaces'; + + @override + String get addChatOrSubSpace => 'Voeg chat of subspace toe'; + + @override + String get subspace => 'Subspace'; + + @override + String get decline => 'Weiger'; + + @override + String get thisDevice => 'Dit apparaat:'; + + @override + String get initAppError => + 'Er is een fout opgetreden bij het laden van de app'; + + @override + String get userRole => 'Rol'; + + @override + String minimumPowerLevel(String level) { + return '$level is het minimale rechten-niveau.'; + } + + @override + String searchIn(String chat) { + return 'Zoek in chat \"$chat\"...'; + } + + @override + String get searchMore => 'Zoek meer...'; + + @override + String get gallery => 'Galerij'; + + @override + String get files => 'Bestanden'; + + @override + String databaseBuildErrorBody(String url, String error) { + return 'Het aanmaken van de SQlite database is mislukt. De app probeert nu een traditionele database te gebruiken. Meldt alsjeblieft deze fout aan de ontwikkelaars via deze $url. De foutmelding is: $error'; + } + + @override + String sessionLostBody(String url, String error) { + return 'Je sessie is verlopen. Meldt alsjeblieft deze fout aan de ontwikkelaars via deze link $url. De foutmelding is: $error'; + } + + @override + String restoreSessionBody(String url, String error) { + return 'De app probeert nu je sessie te herstellen van een back-up. Meldt alsjeblieft deze fout aan de ontwikkelaars via deze link $url. De foutmelding is: $error'; + } + + @override + String forwardMessageTo(String roomName) { + return 'Bericht doorsturen naar $roomName?'; + } + + @override + String get sendReadReceipts => 'Leesbevestigingen versturen'; + + @override + String get sendTypingNotificationsDescription => + 'Andere deelnemers in de chat kunnen zien wanneer je een bericht aan het typen bent.'; + + @override + String get sendReadReceiptsDescription => + 'Andere deelnemers van de chat kunnen zien of je een bericht hebt gelezen.'; + + @override + String get formattedMessages => 'Opgemaakte berichten'; + + @override + String get formattedMessagesDescription => + 'Geef rijke berichtinhoud weer zoals vetgedrukte tekst met markdown.'; + + @override + String get verifyOtherUser => '🔐 Persoon verifiëren'; + + @override + String get verifyOtherUserDescription => + 'Als je een persoon verifieert ben je er zeker van dat je echt met haar contact hebt. 💪\n\nWanneer je een verificatie start ziet de persoon een popup in de app. Hier staat een serie van emoji\'s of getallen die je met elkaar moet vergelijken.\n\nDe beste manier om dit te doen is in persoon of met een videogesprek. 👭'; + + @override + String get verifyOtherDevice => '🔐 Ander apparaat verifiëren'; + + @override + String get verifyOtherDeviceDescription => + 'Een geverifieerd ander apparaat zorgt ervoor dat de apparaten sleutels uitwisselen, wat je beveiliging versterkt. 💪 Als je de verificatie start verschijnt er een popup op beide apparaten. Hier staat een reeks emoji\'s of getallen die je met elkaar moet vergelijken. Het is handig om beide apparaten bij de hand te hebben voordat je de verificatie start. 🤳'; + + @override + String acceptedKeyVerification(String sender) { + return '$sender accepteerde de sleutelverificatie'; + } + + @override + String canceledKeyVerification(String sender) { + return '$sender annuleerde de sleutelverificatie'; + } + + @override + String completedKeyVerification(String sender) { + return '$sender ronde de sleutelverificatie af'; + } + + @override + String isReadyForKeyVerification(String sender) { + return '$sender is klaar voor de sleutelverificatie'; + } + + @override + String requestedKeyVerification(String sender) { + return '$sender vraagt een sleutelverificatie'; + } + + @override + String startedKeyVerification(String sender) { + return '$sender start een sleutelverificatie'; + } + + @override + String get transparent => 'Transparant'; + + @override + String get incomingMessages => 'Inkomende berichten'; + + @override + String get stickers => 'Stickers'; + + @override + String get discover => 'Ontdek'; + + @override + String get commandHint_ignore => 'Negeer de gegeven Matrix ID'; + + @override + String get commandHint_unignore => 'Herstel de negeerde Matrix ID'; + + @override + String unreadChatsInApp(String appname, String unread) { + return '$appname: $unread ongelezen chats'; + } + + @override + String get noDatabaseEncryption => + 'Database versleuteling is niet ondersteund op dit platform'; + + @override + String thereAreCountUsersBlocked(Object count) { + return 'Momenteel zijn er $count personen geblokkeerd.'; + } + + @override + String get restricted => 'Beperkt'; + + @override + String get knockRestricted => 'Kloppen is beperkt'; + + @override + String goToSpace(Object space) { + return 'Ga naar space: $space'; + } + + @override + String get markAsUnread => 'Als ongelezen markeren'; + + @override + String userLevel(int level) { + return '$level - Persoon'; + } + + @override + String moderatorLevel(int level) { + return '$level - Moderator'; + } + + @override + String adminLevel(int level) { + return '$level - Beheerder'; + } + + @override + String get changeGeneralChatSettings => 'Algemene chat instellingen wijzigen'; + + @override + String get inviteOtherUsers => 'Personen voor deze chat uitnodigen'; + + @override + String get changeTheChatPermissions => 'Chat-rechten wijzigen'; + + @override + String get changeTheVisibilityOfChatHistory => + 'Zichtbaarheid van de chat-geschiedenis wijzigen'; + + @override + String get changeTheCanonicalRoomAlias => + 'Standaard openbaar chat-adres wijzigen'; + + @override + String get sendRoomNotifications => '@room-meldingen versturen'; + + @override + String get changeTheDescriptionOfTheGroup => 'Chatomschrijving wijzigen'; + + @override + String get chatPermissionsDescription => + 'Stel het gewenste rechten-niveau in voor bepaalde acties in deze chat. Het rechten-niveau 0, 50 en 100 zijn gebruikelijk voor deelnemer, moderator en beheerder, maar elke verdeling is mogelijk.'; + + @override + String updateInstalled(String version) { + return '🎉 Update $version geïnstalleerd!'; + } + + @override + String get changelog => 'Wijzigingengeschiedenis'; + + @override + String get sendCanceled => 'Versturen geannuleerd'; + + @override + String get loginWithMatrixId => 'Inloggen met Matrix ID'; + + @override + String get discoverHomeservers => 'Ontdek servers'; + + @override + String get whatIsAHomeserver => 'Wat is een server?'; + + @override + String get homeserverDescription => + 'Al je data is opgeslagen op de server, net als bij een email-leverancier. Je kan kiezen welke server je gebruikt en toch communiceren met iedereen. Lees meer op https://matrix.org.'; + + @override + String get doesNotSeemToBeAValidHomeserver => + 'Dit lijkt geen ondersteunde server. Verkeerde URL?'; + + @override + String get calculatingFileSize => 'Bestandsgrootte berekenen...'; + + @override + String get prepareSendingAttachment => 'Bijlage versturen voorbereiden...'; + + @override + String get sendingAttachment => 'Bijlage versturen...'; + + @override + String get generatingVideoThumbnail => 'Video-voorbeeld genereren...'; + + @override + String get compressVideo => 'Video comprimeren...'; + + @override + String sendingAttachmentCountOfCount(int index, int length) { + return 'Bijlage versturen $index van $length...'; + } + + @override + String serverLimitReached(int seconds) { + return 'Server limiet bereikt! Wacht $seconds seconden...'; + } + + @override + String get oneOfYourDevicesIsNotVerified => + 'Een van jouw apparaten is niet geverifieerd'; + + @override + String get noticeChatBackupDeviceVerification => + 'Opmerking: Als al je apparaten zijn verbonden met de chat back-up worden ze automatisch geverifieerd.'; + + @override + String get continueText => 'Doorgaan'; + + @override + String get welcomeText => + 'Hallo hallo 👋 Dit is FluffyChat. Je kan inloggen op elke server die werkt met https://matrix.org. En dan chat je met iedereen. Het is een groot decentraal chat-netwerk!'; + + @override + String get blur => 'Vervaag:'; + + @override + String get opacity => 'Doorzichtigheid:'; + + @override + String get setWallpaper => 'Wallpaper instellen'; + + @override + String get manageAccount => 'Account beheren'; + + @override + String get noContactInformationProvided => + 'Server geeft geen geldige contactinformatie'; + + @override + String get contactServerAdmin => 'Contact opnemen met serverbeheerder'; + + @override + String get contactServerSecurity => 'Contact opnemen met serverbeveiliger'; + + @override + String get supportPage => 'Supportpagina'; + + @override + String get serverInformation => 'Server-informatie:'; + + @override + String get name => 'Naam'; + + @override + String get version => 'Versie'; + + @override + String get website => 'Website'; + + @override + String get compress => 'Comprimeren'; + + @override + String get boldText => 'Vet gedrukte tekst'; + + @override + String get italicText => 'Cursieve tekst'; + + @override + String get strikeThrough => 'Doorhalen'; + + @override + String get pleaseFillOut => 'Vul alsjeblieft in'; + + @override + String get invalidUrl => 'Ongeldige url'; + + @override + String get addLink => 'Koppeling toevoegen'; + + @override + String get unableToJoinChat => + 'Kan niet toetreden tot de chat. Misschien heeft de andere partij het gesprek al afgesloten.'; + + @override + String get previous => 'Vorige'; + + @override + String get otherPartyNotLoggedIn => + 'De andere partij is momenteel niet ingelogd en kan daarom geen berichten ontvangen!'; + + @override + String appWantsToUseForLogin(String server) { + return 'Inloggen met \'$server\''; + } + + @override + String get appWantsToUseForLoginDescription => + 'Hierbij sta je toe dat de app en website informatie over je delen.'; + + @override + String get open => 'Open'; + + @override + String get waitingForServer => 'Wachten op server...'; + + @override + String get appIntroduction => + 'FluffyChat laat je chatten met je vrienden tussen verschillende chat-netwerken. Lees meer op https://matrix.org of tik *Continue*.'; + + @override + String get newChatRequest => '📩 Nieuw chat verzoek'; + + @override + String get contentNotificationSettings => 'Contentmelding instellingen'; + + @override + String get generalNotificationSettings => 'Algemene melding instellingen'; + + @override + String get roomNotificationSettings => 'Kamermelding instellingen'; + + @override + String get userSpecificNotificationSettings => + 'Persoon specifieke melding instellingen'; + + @override + String get otherNotificationSettings => 'Andere melding instellingen'; + + @override + String get notificationRuleContainsUserName => 'Bevat naam van persoon'; + + @override + String get notificationRuleContainsUserNameDescription => + 'Stuurt een melding als een bericht de persoon vermeld.'; + + @override + String get notificationRuleMaster => 'Alle meldingen uitschakelen'; + + @override + String get notificationRuleMasterDescription => + 'Overschrijf alle andere regels en meldingen uitschakelen.'; + + @override + String get notificationRuleSuppressNotices => + 'Automatische berichten uitschakelen'; + + @override + String get notificationRuleSuppressNoticesDescription => + 'Meldingen van automatische accounts zoals bots uitschakelen.'; + + @override + String get notificationRuleInviteForMe => 'Uitnodiging voor mij'; + + @override + String get notificationRuleInviteForMeDescription => + 'Stuur een melding wanneer een persoon wordt uitgenodigd voor een kamer.'; + + @override + String get notificationRuleMemberEvent => 'Kamer-gebeurtenis'; + + @override + String get notificationRuleMemberEventDescription => + 'Meldingen voor kamer-gebeurtenissen uitschakelen.'; + + @override + String get notificationRuleIsUserMention => 'Persoonvermelding'; + + @override + String get notificationRuleIsUserMentionDescription => + 'Stuur een melding als de persoon direct genoemd wordt in een bericht.'; + + @override + String get notificationRuleContainsDisplayName => 'Bevat de naam'; + + @override + String get notificationRuleContainsDisplayNameDescription => + 'Stuur een melding als de persoon genoemd wordt in het bericht.'; + + @override + String get notificationRuleIsRoomMention => 'Kamervermelding'; + + @override + String get notificationRuleIsRoomMentionDescription => + 'Stuur een melding naar de persoon als er in een kamervermelding is.'; + + @override + String get notificationRuleRoomnotif => 'Kamermelding'; + + @override + String get notificationRuleRoomnotifDescription => + 'Stuur een melding naar de persoon wanneer een bericht \'@room\' bevat.'; + + @override + String get notificationRuleTombstone => 'Sleutingsbericht'; + + @override + String get notificationRuleTombstoneDescription => + 'Stuur een melding naar de persoon over kamersluitingsberichten.'; + + @override + String get notificationRuleReaction => 'Reactie'; + + @override + String get notificationRuleReactionDescription => + 'Meldingen voor reacties uitschakelen.'; + + @override + String get notificationRuleRoomServerAcl => 'Kamer Server ACL'; + + @override + String get notificationRuleRoomServerAclDescription => + 'Meldingen voor kamer server toegangscontrolelijst (ACL) uitschakelen.'; + + @override + String get notificationRuleSuppressEdits => 'Bewerkingen uitschakelen'; + + @override + String get notificationRuleSuppressEditsDescription => + 'Meldingen voor bewerkte berichten uitschakelen.'; + + @override + String get notificationRuleCall => 'Oproep'; + + @override + String get notificationRuleCallDescription => + 'Stuur een melding naar de persoon over oproepen.'; + + @override + String get notificationRuleEncryptedRoomOneToOne => + 'Versleutelde een-op-een kamer'; + + @override + String get notificationRuleEncryptedRoomOneToOneDescription => + 'Stuur een melding naar de persoon over berichten in versleutelde een-op-een kamers.'; + + @override + String get notificationRuleRoomOneToOne => 'Een-op-een kamer'; + + @override + String get notificationRuleRoomOneToOneDescription => + 'Stuur een melding naar de persoon over berichten in een-op-een kamers.'; + + @override + String get notificationRuleMessage => 'Bericht'; + + @override + String get notificationRuleMessageDescription => + 'Stuur een melding naar de persoon over algemene berichten.'; + + @override + String get notificationRuleEncrypted => 'Versleuteld'; + + @override + String get notificationRuleEncryptedDescription => + 'Stuur een melding naar de persoon over berichten in versleutelde kamers.'; + + @override + String get notificationRuleJitsi => 'Jitsi'; + + @override + String get notificationRuleJitsiDescription => + 'Stuur een melding naar de persoon over Jitsi widget gebeurtenissen.'; + + @override + String get notificationRuleServerAcl => + 'Server ACL gebeurtenissen uitschakelen'; + + @override + String get notificationRuleServerAclDescription => + 'Meldingen over server ACL gebeurtenissen uitschakelen.'; + + @override + String unknownPushRule(String rule) { + return 'Onbekende notificatieregel \'$rule\''; + } + + @override + String get deletePushRuleCanNotBeUndone => + 'Als je deze melding-instelling verwijderd, kan dit niet ongedaan gemaakt worden.'; + + @override + String get more => 'Meer'; + + @override + String get shareKeysWith => 'Deel sleutels met...'; + + @override + String get shareKeysWithDescription => + 'Welke apparaten moeten vertrouwd worden zodat ze je berichten kunnen lezen in versleutelde chats?'; + + @override + String get allDevices => 'Alle apparaten'; + + @override + String get crossVerifiedDevicesIfEnabled => + 'Kruislings geverifieerde apparaten als ingeschakeld'; + + @override + String get crossVerifiedDevices => 'Kruislings geverifieerde apparaten'; + + @override + String get verifiedDevicesOnly => 'Alleen geverifieerde apparaten'; + + @override + String get takeAPhoto => 'Neem een foto'; + + @override + String get recordAVideo => 'Neem een video'; + + @override + String get optionalMessage => '(Optioneel) bericht...'; + + @override + String get notSupportedOnThisDevice => 'Niet ondersteund op dit apparaat'; + + @override + String get enterNewChat => 'Nieuwe chat openen'; + + @override + String get approve => 'Approve'; + + @override + String get youHaveKnocked => 'You have knocked'; + + @override + String get pleaseWaitUntilInvited => + 'Please wait now, until someone from the room invites you.'; +} diff --git a/lib/generated/l10n/l10n_pl.dart b/lib/generated/l10n/l10n_pl.dart new file mode 100644 index 0000000..1e73cf9 --- /dev/null +++ b/lib/generated/l10n/l10n_pl.dart @@ -0,0 +1,2762 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'l10n.dart'; + +// ignore_for_file: type=lint + +/// The translations for Polish (`pl`). +class L10nPl extends L10n { + L10nPl([String locale = 'pl']) : super(locale); + + @override + String get noSendPermission => 'You can\'t send messages here'; + + @override + String get alwaysUse24HourFormat => 'false'; + + @override + String get repeatPassword => 'Powtórz hasło'; + + @override + String get notAnImage => 'To nie jest plik obrazu.'; + + @override + String get setCustomPermissionLevel => 'Set custom permission level'; + + @override + String get setPermissionsLevelDescription => + 'Please choose a predefined role below or enter a custom permission level between 0 and 100.'; + + @override + String get ignoreUser => 'Ignore user'; + + @override + String get normalUser => 'Normal user'; + + @override + String get remove => 'Usuń'; + + @override + String get importNow => 'Zaimportuj'; + + @override + String get importEmojis => 'Zaimportuj emotikony'; + + @override + String get importFromZipFile => 'Zaimportuj z pliku .zip'; + + @override + String get exportEmotePack => 'Eksportuj pakiet emotikonów jako .zip'; + + @override + String get replace => 'Zastąp'; + + @override + String get about => 'O aplikacji'; + + @override + String aboutHomeserver(String homeserver) { + return 'O $homeserver'; + } + + @override + String get accept => 'Akceptuj'; + + @override + String acceptedTheInvitation(String username) { + return '👍 $username zaakceptował/-a zaproszenie'; + } + + @override + String get account => 'Konto'; + + @override + String activatedEndToEndEncryption(String username) { + return '🔐 $username aktywował/-a szyfrowanie od końca do końca'; + } + + @override + String get addEmail => 'Dodaj adres email'; + + @override + String get confirmMatrixId => + 'Potwierdź swój identyfikator Matrix w celu usunięcia konta.'; + + @override + String supposedMxid(String mxid) { + return 'To powinno być $mxid'; + } + + @override + String get addChatDescription => 'Dodaj opis tego czatu...'; + + @override + String get addToSpace => 'Dodaj do przestrzeni'; + + @override + String get admin => 'Administrator'; + + @override + String get alias => 'alias'; + + @override + String get all => 'Wszystkie'; + + @override + String get allChats => 'Wszystkie'; + + @override + String get commandHint_roomupgrade => + 'Upgrade this room to the given room version'; + + @override + String get commandHint_googly => 'Wyślij kręcące się oczka'; + + @override + String get commandHint_cuddle => 'Wyślij przytulenie'; + + @override + String get commandHint_hug => 'Wyślij uścisk'; + + @override + String googlyEyesContent(String senderName) { + return '$senderName wysyła ci kręcące się oczka'; + } + + @override + String cuddleContent(String senderName) { + return '$senderName przytula cię'; + } + + @override + String hugContent(String senderName) { + return '$senderName uściska cię'; + } + + @override + String answeredTheCall(String senderName) { + return '$senderName odebrał/-a połączenie'; + } + + @override + String get anyoneCanJoin => 'Każdy może dołączyć'; + + @override + String get appLock => 'Blokada aplikacji'; + + @override + String get appLockDescription => + 'Zablokuj aplikację pinem kiedy nie jest używana'; + + @override + String get archive => 'Archiwum'; + + @override + String get areGuestsAllowedToJoin => 'Czy użytkownicy-goście mogą dołączyć'; + + @override + String get areYouSure => 'Czy na pewno?'; + + @override + String get areYouSureYouWantToLogout => 'Czy na pewno chcesz się wylogować?'; + + @override + String get askSSSSSign => + 'Aby zalogować inną osobę, proszę wpisać hasło przechowywania lub klucz odzyskiwania.'; + + @override + String askVerificationRequest(String username) { + return 'Zaakceptować tą prośbę weryfikacji od $username?'; + } + + @override + String get autoplayImages => + 'Automatycznie odtwarzaj animowane naklejki i emotikony'; + + @override + String badServerLoginTypesException(String serverVersions, + String supportedVersions, Object suportedVersions) { + return 'Serwer obsługuje typy logowania:\n$serverVersions\nAle ta aplikacja obsługuje tylko:\n$supportedVersions'; + } + + @override + String get sendTypingNotifications => 'Wysyłaj powiadomienie o pisaniu'; + + @override + String get swipeRightToLeftToReply => 'Przeciągnij w lewo, by odpowiedzieć'; + + @override + String get sendOnEnter => 'Wyślij enterem'; + + @override + String badServerVersionsException(String serverVersions, + String supportedVersions, Object serverVerions, Object suportedVersions) { + return 'Serwer obsługuje wersje Spec:\n$serverVersions\nAle aplikacja obsługuje tylko $supportedVersions'; + } + + @override + String countChatsAndCountParticipants(int chats, int participants) { + return '$participants$chats czatów i $participants uczestników'; + } + + @override + String get noMoreChatsFound => 'Nie znaleziono więcej czatów...'; + + @override + String get noChatsFoundHere => + 'Nie jeszcze ma żadnych czatów. Wciśnij poniższy przycisk, aby rozpocząć nowy czat. ⤵️'; + + @override + String get joinedChats => 'Czaty, do których dołączono'; + + @override + String get unread => 'Nieprzeczytane'; + + @override + String get space => 'Przestrzeń'; + + @override + String get spaces => 'Przestrzenie'; + + @override + String get banFromChat => 'Ban w czacie'; + + @override + String get banned => 'Zbanowany/-a'; + + @override + String bannedUser(String username, String targetName) { + return '$username zbanował/-a $targetName'; + } + + @override + String get blockDevice => 'Zablokuj urządzenie'; + + @override + String get blocked => 'Zablokowane'; + + @override + String get botMessages => 'Wiadomości botów'; + + @override + String get cancel => 'Anuluj'; + + @override + String cantOpenUri(String uri) { + return 'Nie można otworzyć linku $uri'; + } + + @override + String get changeDeviceName => 'Zmień nazwę urządzenia'; + + @override + String changedTheChatAvatar(String username) { + return '$username zmienił/-a zdjęcie profilowe'; + } + + @override + String changedTheChatDescriptionTo(String username, String description) { + return '$username zmienił/-a opis czatu na \'$description\''; + } + + @override + String changedTheChatNameTo(String username, String chatname) { + return '$username zmienił/-a nazwę czatu na \'$chatname\''; + } + + @override + String changedTheChatPermissions(String username) { + return '$username zmienił/-a uprawnienia w czacie'; + } + + @override + String changedTheDisplaynameTo(String username, String displayname) { + return '$username zmienił/-a swoją nazwę wyświetlaną na \'$displayname\''; + } + + @override + String changedTheGuestAccessRules(String username) { + return '$username zmienił/-a zasady dostępu dla gości'; + } + + @override + String changedTheGuestAccessRulesTo(String username, String rules) { + return '$username zmienił/-a zasady dostępu dla gości na $rules'; + } + + @override + String changedTheHistoryVisibility(String username) { + return '$username zmienił/-a widoczność historii'; + } + + @override + String changedTheHistoryVisibilityTo(String username, String rules) { + return '$username zmienił/-a widoczność historii na $rules'; + } + + @override + String changedTheJoinRules(String username) { + return '$username zmienił/-a zasady wejścia'; + } + + @override + String changedTheJoinRulesTo(String username, String joinRules) { + return '$username zmienił/-a zasady wejścia na $joinRules'; + } + + @override + String changedTheProfileAvatar(String username) { + return '$username zmienił/-a zdjęcie profilowe'; + } + + @override + String changedTheRoomAliases(String username) { + return '$username zmienił/-a alias pokoju'; + } + + @override + String changedTheRoomInvitationLink(String username) { + return '$username zmienił/-a link z zaproszeniem do pokoju'; + } + + @override + String get changePassword => 'Zmień hasło'; + + @override + String get changeTheHomeserver => 'Zmień serwer domyślny'; + + @override + String get changeTheme => 'Zmień swój styl'; + + @override + String get changeTheNameOfTheGroup => 'Zmień nazwę grupy'; + + @override + String get changeYourAvatar => 'Zmień swoje zdjęcie'; + + @override + String get channelCorruptedDecryptError => 'Szyfrowanie zostało uszkodzone'; + + @override + String get chat => 'Czat'; + + @override + String get yourChatBackupHasBeenSetUp => + 'Kopia zapasowa Twojego czatu została ustawiona.'; + + @override + String get chatBackup => 'Kopia zapasowa czatów'; + + @override + String get chatBackupDescription => + 'Twoje stare wiadomości są zabezpieczone kluczem odzyskiwania. Uważaj żeby go nie zgubić.'; + + @override + String get chatDetails => 'Szczegóły czatu'; + + @override + String get chatHasBeenAddedToThisSpace => + 'Czat został dodany do tej przestrzeni'; + + @override + String get chats => 'Czaty'; + + @override + String get chooseAStrongPassword => 'Wybierz silne hasło'; + + @override + String get clearArchive => 'Wyczyść archiwum'; + + @override + String get close => 'Zamknij'; + + @override + String get commandHint_markasdm => + 'Oznacz jako pokój wiadomości bezpośrednich dla podanego Matrix ID'; + + @override + String get commandHint_markasgroup => 'Oznacz jako grupę'; + + @override + String get commandHint_ban => 'Zbanuj użytkownika w tym pokoju'; + + @override + String get commandHint_clearcache => 'Wyczyść pamięć podręczną'; + + @override + String get commandHint_create => + 'Stwórz pusty czat\nUżyj --no-encryption by wyłączyć szyfrowanie'; + + @override + String get commandHint_discardsession => 'Odrzuć sesję'; + + @override + String get commandHint_dm => + 'Rozpocznij czat bezpośredni\nUżyj --no-encryption by wyłączyć szyfrowanie'; + + @override + String get commandHint_html => 'Wyślij tekst sformatowany w HTML'; + + @override + String get commandHint_invite => 'Zaproś użytkownika do pokoju'; + + @override + String get commandHint_join => 'Dołącz do podanego pokoju'; + + @override + String get commandHint_kick => 'Usuń tego użytkownika z tego pokoju'; + + @override + String get commandHint_leave => 'Opuść ten pokój'; + + @override + String get commandHint_me => 'Opisz siebie'; + + @override + String get commandHint_myroomavatar => + 'Ustaw swoje zdjęcie w tym pokoju (przez mxc-uri)'; + + @override + String get commandHint_myroomnick => + 'Ustaw swoją nazwę wyświetlaną w tym pokoju'; + + @override + String get commandHint_op => + 'Ustaw poziom uprawnień tego użytkownika (domyślnie: 50)'; + + @override + String get commandHint_plain => 'Wyślij niesformatowany tekst'; + + @override + String get commandHint_react => 'Wyślij odpowiedź jako reakcję'; + + @override + String get commandHint_send => 'Wyślij wiadomość'; + + @override + String get commandHint_unban => 'Odbanuj użytkownika w tym pokoju'; + + @override + String get commandInvalid => 'Nieprawidłowe polecenie'; + + @override + String commandMissing(String command) { + return '$command nie jest poleceniem.'; + } + + @override + String get compareEmojiMatch => 'Porównaj emoji'; + + @override + String get compareNumbersMatch => 'Porównaj cyfry'; + + @override + String get configureChat => 'Konfiguruj czat'; + + @override + String get confirm => 'Potwierdź'; + + @override + String get connect => 'Połącz'; + + @override + String get contactHasBeenInvitedToTheGroup => + 'Kontakt został zaproszony do grupy'; + + @override + String get containsDisplayName => 'Zawiera nazwę wyświetlaną'; + + @override + String get containsUserName => 'Zawiera nazwę użytkownika'; + + @override + String get contentHasBeenReported => + 'Treść została zgłoszona administratorom serwera'; + + @override + String get copiedToClipboard => 'Skopiowano do schowka'; + + @override + String get copy => 'Kopiuj'; + + @override + String get copyToClipboard => 'Skopiuj do schowka'; + + @override + String couldNotDecryptMessage(String error) { + return 'Nie można odszyfrować wiadomości: $error'; + } + + @override + String countParticipants(int count) { + return '$count uczestników'; + } + + @override + String get create => 'Stwórz'; + + @override + String createdTheChat(String username) { + return '💬 $username utworzył/-a czat'; + } + + @override + String get createGroup => 'Utwórz grupę'; + + @override + String get createNewSpace => 'Nowa przestrzeń'; + + @override + String get currentlyActive => 'Obecnie aktywny/-a'; + + @override + String get darkTheme => 'Ciemny'; + + @override + String dateAndTimeOfDay(String date, String timeOfDay) { + return '$date $timeOfDay'; + } + + @override + String dateWithoutYear(String month, String day) { + return '$month-$day'; + } + + @override + String dateWithYear(String year, String month, String day) { + return '$day.$month.$year'; + } + + @override + String get deactivateAccountWarning => + 'To zdezaktywuje twoje konto. To jest nieodwracalne! Na pewno chcesz to zrobić?'; + + @override + String get defaultPermissionLevel => + 'Domyślny poziom uprawnień dla nowych użytkowników'; + + @override + String get delete => 'Usuń'; + + @override + String get deleteAccount => 'Usuń konto'; + + @override + String get deleteMessage => 'Usuń wiadomość'; + + @override + String get device => 'Urządzenie'; + + @override + String get deviceId => 'Identyfikator urządzenia'; + + @override + String get devices => 'Urządzenia'; + + @override + String get directChats => 'Czaty bezpośrednie'; + + @override + String get allRooms => 'Wszystkie czaty grupowe'; + + @override + String get displaynameHasBeenChanged => 'Nazwa wyświetlana została zmieniona'; + + @override + String get downloadFile => 'Pobierz plik'; + + @override + String get edit => 'Edytuj'; + + @override + String get editBlockedServers => 'Edytuj zablokowane serwery'; + + @override + String get chatPermissions => 'Uprawnienia w czacie'; + + @override + String get editDisplayname => 'Edytuj nazwę wyświetlaną'; + + @override + String get editRoomAliases => 'Zmień aliasy pokoju'; + + @override + String get editRoomAvatar => 'Edytuj zdjęcie pokoju'; + + @override + String get emoteExists => 'Emotikon już istnieje!'; + + @override + String get emoteInvalid => 'Nieprawidłowy kod emotikonu!'; + + @override + String get emoteKeyboardNoRecents => + 'Tutaj pojawiają się ostatnio używane emotikony...'; + + @override + String get emotePacks => 'Paczki emotikonów dla pokoju'; + + @override + String get emoteSettings => 'Ustawienia emotikonów'; + + @override + String get globalChatId => 'Globalny identyfikator czatu'; + + @override + String get accessAndVisibility => 'Dostęp i widoczność'; + + @override + String get accessAndVisibilityDescription => + 'Kto może dołączyć do tego czatu i w jaki sposób można ten czat znaleźć.'; + + @override + String get calls => 'Połączenia'; + + @override + String get customEmojisAndStickers => 'Własne emotikony i naklejki'; + + @override + String get customEmojisAndStickersBody => + 'Dodaj lub podziel się własnymi emotikonami i naklejkami, które będą mogły być użyte w dowolnym czacie.'; + + @override + String get emoteShortcode => 'Skrócony kod emotikonu'; + + @override + String get emoteWarnNeedToPick => 'Musisz wybrać kod emotikonu oraz obraz!'; + + @override + String get emptyChat => 'Pusty czat'; + + @override + String get enableEmotesGlobally => 'Włącz paczkę emotikonów globalnie'; + + @override + String get enableEncryption => 'Włącz szyfowanie'; + + @override + String get enableEncryptionWarning => + 'Nie będziesz już mógł wyłączyć szyfrowania. Jesteś pewny?'; + + @override + String get encrypted => 'Szyfrowane'; + + @override + String get encryption => 'Szyfrowanie'; + + @override + String get encryptionNotEnabled => 'Szyfrowanie nie jest włączone'; + + @override + String endedTheCall(String senderName) { + return '$senderName zakończył/-a połączenie'; + } + + @override + String get enterAnEmailAddress => 'Wpisz adres e-mail'; + + @override + String get homeserver => 'Adres serwera'; + + @override + String get enterYourHomeserver => 'Wpisz swój serwer domowy'; + + @override + String errorObtainingLocation(String error) { + return 'Błąd w ustalaniu lokalizacji: $error'; + } + + @override + String get everythingReady => 'Wszystko gotowe!'; + + @override + String get extremeOffensive => 'Bardzo obraźliwe'; + + @override + String get fileName => 'Nazwa pliku'; + + @override + String get fluffychat => 'FluffyChat'; + + @override + String get fontSize => 'Rozmiar fontu'; + + @override + String get forward => 'Przekaż'; + + @override + String get fromJoining => 'Od dołączenia'; + + @override + String get fromTheInvitation => 'Od zaproszenia'; + + @override + String get goToTheNewRoom => 'Przejdź do nowego pokoju'; + + @override + String get group => 'Grupa'; + + @override + String get chatDescription => 'Opis czatu'; + + @override + String get chatDescriptionHasBeenChanged => 'Zmieniono opis czatu'; + + @override + String get groupIsPublic => 'Grupa jest publiczna'; + + @override + String get groups => 'Grupy'; + + @override + String groupWith(String displayname) { + return 'Grupa z $displayname'; + } + + @override + String get guestsAreForbidden => 'Goście są zakazani'; + + @override + String get guestsCanJoin => 'Goście mogą dołączyć'; + + @override + String hasWithdrawnTheInvitationFor(String username, String targetName) { + return '$username wycofał/-a zaproszenie dla $targetName'; + } + + @override + String get help => 'Pomoc'; + + @override + String get hideRedactedEvents => 'Ukryj informacje o usuniętych zdarzeniach'; + + @override + String get hideRedactedMessages => 'Nie pokazuj usuniętych wiadomości'; + + @override + String get hideRedactedMessagesBody => + 'Usunięte wiadomości nie będą widoczne w czacie.'; + + @override + String get hideInvalidOrUnknownMessageFormats => + 'Ukryj niepoprawne lub nieznane typy wiadomości'; + + @override + String get howOffensiveIsThisContent => 'Jak bardzo obraźliwa jest ta treść?'; + + @override + String get id => 'Identyfikator'; + + @override + String get identity => 'Tożsamość'; + + @override + String get block => 'Zablokuj'; + + @override + String get blockedUsers => 'Zablokowani użytkownicy'; + + @override + String get blockListDescription => + 'Możesz zablokować uciążliwych użytkowników. Nie będziesz widzieć ani otrzymywać wiadomości oraz zaproszeń od nich.'; + + @override + String get blockUsername => 'Ignoruj użytkownika'; + + @override + String get iHaveClickedOnLink => 'Nacisnąłem na link'; + + @override + String get incorrectPassphraseOrKey => + 'Złe hasło bezpieczeństwa lub klucz odzyskiwania'; + + @override + String get inoffensive => 'Nieobraźliwe'; + + @override + String get inviteContact => 'Zaproś kontakt'; + + @override + String inviteContactToGroupQuestion(Object contact, Object groupName) { + return 'Czy chcesz zaprosić $contact do czatu „$groupName”?'; + } + + @override + String inviteContactToGroup(String groupName) { + return 'Zaproś kontakty do $groupName'; + } + + @override + String get noChatDescriptionYet => 'Nie utworzono jeszcze opisu czatu.'; + + @override + String get tryAgain => 'Spróbuj ponownie'; + + @override + String get invalidServerName => 'Nieprawidłowa nazwa serwera'; + + @override + String get invited => 'Zaproszono'; + + @override + String get redactMessageDescription => + 'Wiadomość zostanie usunięta u wszystkich uczestników tej rozmowy. Tego nie można cofnąć.'; + + @override + String get optionalRedactReason => + '(Opcjonalnie) Powód usunięcia tej wiadomości...'; + + @override + String invitedUser(String username, String targetName) { + return '📩 $username zaprosił/-a $targetName'; + } + + @override + String get invitedUsersOnly => 'Tylko zaproszeni użytkownicy'; + + @override + String get inviteForMe => 'Zaproszenie dla mnie'; + + @override + String inviteText(String username, String link) { + return '$username zaprosił/-a Cię do FluffyChat.\n1. Odwiedź fluffychat.im i zainstaluj aplikację\n2. Zarejestuj się lub zaloguj\n3. Otwórz link zaproszenia:\n$link'; + } + + @override + String get isTyping => 'pisze…'; + + @override + String joinedTheChat(String username) { + return '👋 $username dołączył/-a do czatu'; + } + + @override + String get joinRoom => 'Dołącz do pokoju'; + + @override + String kicked(String username, String targetName) { + return '👞 $username wyrzucił/-a $targetName'; + } + + @override + String kickedAndBanned(String username, String targetName) { + return '🙅 $username wyrzucił/-a i zbanował/-a $targetName'; + } + + @override + String get kickFromChat => 'Wyrzuć z czatu'; + + @override + String lastActiveAgo(String localizedTimeShort) { + return 'Ostatnio widziano $localizedTimeShort'; + } + + @override + String get leave => 'Opuść'; + + @override + String get leftTheChat => 'Opuścił/-a czat'; + + @override + String get license => 'Licencja'; + + @override + String get lightTheme => 'Jasny'; + + @override + String loadCountMoreParticipants(int count) { + return 'Załaduj jeszcze $count uczestników'; + } + + @override + String get dehydrate => 'Eksportuj sesję i wymaż urządzenie'; + + @override + String get dehydrateWarning => + 'Tego nie można cofnąć. Upewnij się, że plik kopii zapasowej jest bezpiecznie przechowywany.'; + + @override + String get dehydrateTor => 'Użytkownicy TOR: Eksportuj sesję'; + + @override + String get dehydrateTorLong => + 'W przypadku użytkowników sieci TOR zaleca się eksportowanie sesji przed zamknięciem okna.'; + + @override + String get hydrateTor => 'Użytkownicy TOR: Importuj eksport sesji'; + + @override + String get hydrateTorLong => + 'Czy ostatnio eksportowałeś/-aś swoją sesję na TOR? Szybko ją zaimportuj i kontynuuj rozmowy.'; + + @override + String get hydrate => 'Przywracanie z pliku kopii zapasowej'; + + @override + String get loadingPleaseWait => 'Ładowanie… Proszę czekać.'; + + @override + String get loadMore => 'Załaduj więcej…'; + + @override + String get locationDisabledNotice => + 'Usługi lokalizacji są wyłączone. Proszę włącz je aby móc udostępnić swoją lokalizację.'; + + @override + String get locationPermissionDeniedNotice => + 'Brak uprawnień. Proszę zezwól aplikacji na dostęp do lokalizacji aby móc ją udostępnić.'; + + @override + String get login => 'Zaloguj się'; + + @override + String logInTo(String homeserver) { + return 'Zaloguj się do $homeserver'; + } + + @override + String get logout => 'Wyloguj się'; + + @override + String get memberChanges => 'Zmiany członków'; + + @override + String get mention => 'Wzmianka'; + + @override + String get messages => 'Wiadomości'; + + @override + String get messagesStyle => 'Wiadomości:'; + + @override + String get moderator => 'Moderator'; + + @override + String get muteChat => 'Wycisz czat'; + + @override + String get needPantalaimonWarning => + 'Należy pamiętać, że Pantalaimon wymaga na razie szyfrowania od końca do końca.'; + + @override + String get newChat => 'Nowa rozmowa'; + + @override + String get newMessageInFluffyChat => '💬 Nowa wiadomość we FluffyChat'; + + @override + String get newVerificationRequest => 'Nowa prośba o weryfikację!'; + + @override + String get next => 'Dalej'; + + @override + String get no => 'Nie'; + + @override + String get noConnectionToTheServer => 'Brak połączenia z serwerem'; + + @override + String get noEmotesFound => 'Nie znaleziono żadnych emotikonów. 😕'; + + @override + String get noEncryptionForPublicRooms => + 'Możesz aktywować szyfrowanie dopiero kiedy pokój nie będzie publicznie dostępny.'; + + @override + String get noGoogleServicesWarning => + 'Wygląda na to, że Twoje urządzenie nie obsługuje Firebase Cloud Messaging. Aby wciąż otrzymywać powiadomienia push, zalecamy istalację ntfy. Używając ntfy lub inengo zunifikowanego dostawcy powiadomień push, możesz bezpiecznie otrzymywać takowe powiadomienia. Ntfy można pobrać ze sklepu Google Play Store lub z F-Droid.'; + + @override + String noMatrixServer(String server1, String server2) { + return '$server1 nie jest serwerem Matriksa, czy chcesz zamiast niego użyć $server2?'; + } + + @override + String get shareInviteLink => 'Udostępnij link z zaproszeniem'; + + @override + String get scanQrCode => 'Skanuj kod QR'; + + @override + String get none => 'Brak'; + + @override + String get noPasswordRecoveryDescription => + 'Nie dodałeś/-aś jeszcze sposobu odzyskiwania swojego hasła.'; + + @override + String get noPermission => 'Brak uprawnień'; + + @override + String get noRoomsFound => 'Nie znaleziono pokojów…'; + + @override + String get notifications => 'Powiadomienia'; + + @override + String get notificationsEnabledForThisAccount => + 'Powiadomienia są włączone dla tego konta'; + + @override + String numUsersTyping(int count) { + return '$count użytkowników pisze…'; + } + + @override + String get obtainingLocation => 'Uzyskiwanie lokalizacji…'; + + @override + String get offensive => 'Obraźliwe'; + + @override + String get offline => 'Offline'; + + @override + String get ok => 'Ok'; + + @override + String get online => 'Online'; + + @override + String get onlineKeyBackupEnabled => + 'Kopia zapasowa kluczy online jest włączona'; + + @override + String get oopsPushError => + 'Ojej! Wystąpił błąd podczas ustawiania powiadomień push.'; + + @override + String get oopsSomethingWentWrong => 'Ojej! Coś poszło nie tak…'; + + @override + String get openAppToReadMessages => 'Otwórz aplikację by odczytać wiadomości'; + + @override + String get openCamera => 'Otwórz aparat'; + + @override + String get openVideoCamera => 'Nagraj film'; + + @override + String get oneClientLoggedOut => 'Jedno z twoich urządzeń zostało wylogowane'; + + @override + String get addAccount => 'Dodaj konto'; + + @override + String get editBundlesForAccount => 'Edytuj pakiety dla tego konta'; + + @override + String get addToBundle => 'Dodaj do pakietu'; + + @override + String get removeFromBundle => 'Usuń z tego pakietu'; + + @override + String get bundleName => 'Nazwa pakietu'; + + @override + String get enableMultiAccounts => + '(BETA) Włącza obsługę wielu kont na tym urządzeniu'; + + @override + String get openInMaps => 'Otwórz w mapach'; + + @override + String get link => 'Link'; + + @override + String get serverRequiresEmail => + 'Ten serwer wymaga potwierdzenia Twojego adresu email w celu rejestracji.'; + + @override + String get or => 'Lub'; + + @override + String get participant => 'Uczestnik'; + + @override + String get passphraseOrKey => 'fraza dostępu lub klucz odzyskiwania'; + + @override + String get password => 'Hasło'; + + @override + String get passwordForgotten => 'Nie pamiętam hasła'; + + @override + String get passwordHasBeenChanged => 'Hasło zostało zmienione'; + + @override + String get hideMemberChangesInPublicChats => + 'Ukryj zmiany członkostwa w publicznych czatach'; + + @override + String get hideMemberChangesInPublicChatsBody => + 'W celu poprawienia czytelności, nie pokazuj w historii publicznego czatu, czy ktoś do niego dołączył lub go opuścił.'; + + @override + String get overview => 'Podsumowanie'; + + @override + String get notifyMeFor => 'Powiadom mnie o'; + + @override + String get passwordRecoverySettings => 'Ustawienia odzyskiwania hasła'; + + @override + String get passwordRecovery => 'Odzyskiwanie hasła'; + + @override + String get people => 'Osoby'; + + @override + String get pickImage => 'Wybierz obraz'; + + @override + String get pin => 'Przypnij'; + + @override + String play(String fileName) { + return 'Otwórz $fileName'; + } + + @override + String get pleaseChoose => 'Proszę wybrać'; + + @override + String get pleaseChooseAPasscode => 'Wybierz kod dostępu'; + + @override + String get pleaseClickOnLink => + 'Proszę kliknij w odnośnik wysłany w wiadomości e-mail, aby kontynuować.'; + + @override + String get pleaseEnter4Digits => + 'Proszę podaj 4 cyfry. By wyłączyć blokadę pozostaw puste.'; + + @override + String get pleaseEnterRecoveryKey => 'Wprowadź swój klucz odzyskiwania:'; + + @override + String get pleaseEnterYourPassword => 'Wprowadź swoje hasło'; + + @override + String get pleaseEnterYourPin => 'Podaj swój PIN'; + + @override + String get pleaseEnterYourUsername => 'Wpisz swoją nazwę użytkownika'; + + @override + String get pleaseFollowInstructionsOnWeb => + 'Wykonaj instrukcje na stronie internetowej i naciśnij „dalej”.'; + + @override + String get privacy => 'Prywatność'; + + @override + String get publicRooms => 'Publiczne pokoje'; + + @override + String get pushRules => 'Reguły push'; + + @override + String get reason => 'Powód'; + + @override + String get recording => 'Nagranie'; + + @override + String redactedBy(String username) { + return 'Usunięte przez $username'; + } + + @override + String get directChat => 'Czat bezpośredni'; + + @override + String redactedByBecause(String username, String reason) { + return 'Usunięte przez $username z powodu „$reason”'; + } + + @override + String redactedAnEvent(String username) { + return '$username usunął/-ęła zdarzenie'; + } + + @override + String get redactMessage => 'Usuń wiadomość'; + + @override + String get register => 'Zarejestruj'; + + @override + String get reject => 'Odrzuć'; + + @override + String rejectedTheInvitation(String username) { + return '$username odrzucił/-a zaproszenie'; + } + + @override + String get rejoin => 'Dołącz ponownie'; + + @override + String get removeAllOtherDevices => 'Usuń wszystkie inne urządzenia'; + + @override + String removedBy(String username) { + return 'Usunięta przez $username'; + } + + @override + String get removeDevice => 'Usuń urządzenie'; + + @override + String get unbanFromChat => 'Odbanuj w czacie'; + + @override + String get removeYourAvatar => 'Usuń swoje zdjęcie'; + + @override + String get replaceRoomWithNewerVersion => 'Zamień pokój na nowszą wersję'; + + @override + String get reply => 'Odpowiedz'; + + @override + String get reportMessage => 'Zgłoś wiadomość'; + + @override + String get translateMessage => 'Translate message'; + + @override + String get translatedMessage => 'Translated message'; + + @override + String get errorTranslatingMessage => + 'An error has occured while translating the message.'; + + @override + String get recoverMessage => 'Recover message'; + + @override + String get recoveredMessage => 'Recovered message'; + + @override + String get errorRecoveringMessage => + 'An error has occured while recovering the message.'; + + @override + String get errorRecoveringMessageNoAdmin => + 'This feature is available on Synapse homeservers only for adminstrators.'; + + @override + String get requestPermission => 'Prośba o pozwolenie'; + + @override + String get roomHasBeenUpgraded => 'Pokój zostać zaktualizowany'; + + @override + String get roomVersion => 'Wersja pokoju'; + + @override + String get saveFile => 'Zapisz plik'; + + @override + String get retry => 'Retry'; + + @override + String get search => 'Szukaj'; + + @override + String get security => 'Bezpieczeństwo'; + + @override + String get recoveryKey => 'Klucz odzyskiwania'; + + @override + String get recoveryKeyLost => 'Utracono klucz odzyskiwania?'; + + @override + String seenByUser(String username) { + return 'Zobaczone przez $username'; + } + + @override + String get send => 'Wyślij'; + + @override + String get sendAMessage => 'Wyślij wiadomość'; + + @override + String get sendAsText => 'Wyślij jako tekst'; + + @override + String get sendAudio => 'Wyślij dźwięk'; + + @override + String get sendFile => 'Wyślij plik'; + + @override + String get sendImage => 'Wyślij obraz'; + + @override + String sendImages(int count) { + return 'Wyślij $count obrazów'; + } + + @override + String get sendMessages => 'Wyślij wiadomości'; + + @override + String get sendOriginal => 'Wyślij oryginał'; + + @override + String get sendSticker => 'Wyślij naklejkę'; + + @override + String get sendVideo => 'Wyślij film'; + + @override + String sentAFile(String username) { + return '📁 $username wysłał/-a plik'; + } + + @override + String sentAnAudio(String username) { + return '🎤 $username wysłał/-a plik dżwiękowy'; + } + + @override + String sentAPicture(String username) { + return '🖼️ $username wysłał/-a zdjęcie'; + } + + @override + String sentASticker(String username) { + return '😊 $username wysłał/-a naklejkę'; + } + + @override + String sentAVideo(String username) { + return '🎥 $username wysłał/-a film'; + } + + @override + String sentCallInformations(String senderName) { + return '$senderName wysłał/-a informacje o połączeniu'; + } + + @override + String get separateChatTypes => + 'Oddzielenie czatów bezpośrednich i grupowych'; + + @override + String get setAsCanonicalAlias => 'Ustaw jako główny alias'; + + @override + String get setCustomEmotes => 'Ustaw niestandardowe emotikony'; + + @override + String get setChatDescription => 'Ustaw opis czatu'; + + @override + String get setInvitationLink => 'Ustaw link z zaproszeniem'; + + @override + String get setPermissionsLevel => 'Ustaw poziom uprawnień'; + + @override + String get setStatus => 'Ustaw status'; + + @override + String get settings => 'Ustawienia'; + + @override + String get share => 'Udostępnij'; + + @override + String sharedTheLocation(String username) { + return '$username udostępnił/-a swoją lokalizację'; + } + + @override + String get shareLocation => 'Udostępnij lokalizację'; + + @override + String get showPassword => 'Pokaż hasło'; + + @override + String get presenceStyle => 'Obecność:'; + + @override + String get hideAvatarsInInvites => 'Hide avatars in invites'; + + @override + String get hideAvatarsInInvitesDescription => + 'Do not show room avatars in invites'; + + @override + String get presencesToggle => 'Pokazuj zmiany statusów innych użytkowników'; + + @override + String get pureBlackToggle => 'Pure Black'; + + @override + String get singlesignon => 'Pojedyncze logowanie'; + + @override + String get skip => 'Pomiń'; + + @override + String get sourceCode => 'Kod żródłowy'; + + @override + String get spaceIsPublic => 'Ustaw jako publiczną'; + + @override + String get spaceName => 'Nazwa przestrzeni'; + + @override + String startedACall(String senderName) { + return '$senderName rozpoczął/-ęła rozmowę'; + } + + @override + String get startFirstChat => 'Rozpocznij swój pierwszy czat'; + + @override + String get status => 'Status'; + + @override + String get statusExampleMessage => 'Jak się masz dziś?'; + + @override + String get submit => 'Odeślij'; + + @override + String get synchronizingPleaseWait => 'Synchronizowanie… Proszę czekać.'; + + @override + String synchronizingPleaseWaitCounter(String percentage) { + return ' Synchronizowanie… ($percentage%)'; + } + + @override + String get systemTheme => 'System'; + + @override + String get theyDontMatch => 'Nie zgadzają się'; + + @override + String get theyMatch => 'Zgadzają się'; + + @override + String get title => 'FluffyChat'; + + @override + String get toggleFavorite => 'Przełącz ulubione'; + + @override + String get toggleMuted => 'Przełącz wyciszone'; + + @override + String get toggleUnread => 'Oznacz przeczytane/nieprzeczytane'; + + @override + String get tooManyRequestsWarning => + 'Zbyt wiele żądań. Proszę spróbować później.'; + + @override + String get transferFromAnotherDevice => 'Przenieś z innego urządzenia'; + + @override + String get tryToSendAgain => 'Spróbuj wysłać ponownie'; + + @override + String get unavailable => 'Niedostępne'; + + @override + String unbannedUser(String username, String targetName) { + return '$username odbanował/-a $targetName'; + } + + @override + String get unblockDevice => 'Odblokuj urządzenie'; + + @override + String get unknownDevice => 'Nieznane urządzenie'; + + @override + String get unknownEncryptionAlgorithm => 'Nieznany algorytm szyfrowania'; + + @override + String unknownEvent(String type) { + return 'Nieznane zdarzenie \'$type\''; + } + + @override + String get unmuteChat => 'Wyłącz wyciszenie'; + + @override + String get unpin => 'Odepnij'; + + @override + String unreadChats(int unreadCount) { + String _temp0 = intl.Intl.pluralLogic( + unreadCount, + locale: localeName, + other: '$unreadCount unread chats', + one: '1 unread chat', + ); + return '$_temp0'; + } + + @override + String userAndOthersAreTyping(String username, int count) { + return '$username oraz $count pozostałych pisze…'; + } + + @override + String userAndUserAreTyping(String username, String username2) { + return '$username i $username2 piszą…'; + } + + @override + String userIsTyping(String username) { + return '$username pisze…'; + } + + @override + String userLeftTheChat(String username) { + return '🚪 $username opuścił/-a czat'; + } + + @override + String get username => 'Nazwa użytkownika'; + + @override + String userSentUnknownEvent(String username, String type) { + return '$username wysłał/-a zdarzenie $type'; + } + + @override + String get unverified => 'Niezweryfikowane'; + + @override + String get verified => 'Zweryfikowane'; + + @override + String get verify => 'zweryfikuj'; + + @override + String get verifyStart => 'Rozpocznij weryfikację'; + + @override + String get verifySuccess => 'Pomyślnie zweryfikowano!'; + + @override + String get verifyTitle => 'Weryfikowanie innego konta'; + + @override + String get videoCall => 'Rozmowa wideo'; + + @override + String get visibilityOfTheChatHistory => 'Widoczność historii czatu'; + + @override + String get visibleForAllParticipants => + 'Widoczny dla wszystkich użytkowników'; + + @override + String get visibleForEveryone => 'Widoczne dla każdego'; + + @override + String get voiceMessage => 'Wiadomość głosowa'; + + @override + String get waitingPartnerAcceptRequest => + 'Oczekiwanie na zaakceptowanie prośby przez drugą osobę…'; + + @override + String get waitingPartnerEmoji => + 'Oczekiwanie na zaakceptowanie emoji przez drugą osobę…'; + + @override + String get waitingPartnerNumbers => + 'Oczekiwanie na zaakceptowanie numerów przez drugą osobę…'; + + @override + String get wallpaper => 'Tapeta:'; + + @override + String get warning => 'Uwaga!'; + + @override + String get weSentYouAnEmail => 'Wysłaliśmy Ci wiadomość e-mail'; + + @override + String get whoCanPerformWhichAction => 'Kto może wykonywać jakie czynności'; + + @override + String get whoIsAllowedToJoinThisGroup => 'Kto może dołączyć do tej grupy'; + + @override + String get whyDoYouWantToReportThis => 'Dlaczego chcesz to zgłosić?'; + + @override + String get wipeChatBackup => + 'Wymazać kopię zapasową czatu, aby utworzyć nowy klucz odzyskiwania?'; + + @override + String get withTheseAddressesRecoveryDescription => + 'Dzięki tym adresom możesz odzyskać swoje hasło.'; + + @override + String get writeAMessage => 'Napisz wiadomość…'; + + @override + String get yes => 'Tak'; + + @override + String get you => 'Ty'; + + @override + String get youAreNoLongerParticipatingInThisChat => + 'Nie uczestniczysz już w tym czacie'; + + @override + String get youHaveBeenBannedFromThisChat => + 'Zostałeś/-aś zbanowany/-a w tym czacie'; + + @override + String get yourPublicKey => 'Twój klucz publiczny'; + + @override + String get messageInfo => 'Informacje o wiadomości'; + + @override + String get time => 'Czas'; + + @override + String get messageType => 'Rodzaj wiadomości'; + + @override + String get sender => 'Nadawca'; + + @override + String get openGallery => 'Otwórz galerię'; + + @override + String get removeFromSpace => 'Usuń z przestrzeni'; + + @override + String get addToSpaceDescription => + 'Wybierz przestrzeń, do której ten czat ma być dodany.'; + + @override + String get start => 'Start'; + + @override + String get 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.'; + + @override + String get publish => 'Opublikuj'; + + @override + String videoWithSize(String size) { + return 'Film ($size)'; + } + + @override + String get openChat => 'Otwórz czat'; + + @override + String get markAsRead => 'Oznacz jako przeczytane'; + + @override + String get reportUser => 'Zgłoś użytkownika'; + + @override + String get dismiss => 'Odrzuć'; + + @override + String reactedWith(String sender, String reaction) { + return '$sender zareagował/-a z $reaction'; + } + + @override + String get pinMessage => 'Przypnij do pokoju'; + + @override + String get confirmEventUnpin => + 'Czy na pewno chcesz trwale odpiąć wydarzenie?'; + + @override + String get emojis => 'Emoji'; + + @override + String get placeCall => 'Zadzwoń'; + + @override + String get voiceCall => 'Połączenie głosowe'; + + @override + String get unsupportedAndroidVersion => + 'Nieobsługiwana wersja systemu Android'; + + @override + String get unsupportedAndroidVersionLong => + 'Ta funkcja wymaga nowszej wersji systemu Android. Sprawdź aktualizacje lub wsparcie Lineage OS.'; + + @override + String get 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.'; + + @override + String get experimentalVideoCalls => 'Eksperymentalne połączenia wideo'; + + @override + String get emailOrUsername => 'Adres e-mail lub nazwa użytkownika'; + + @override + String get indexedDbErrorTitle => 'Problemy związane z trybem prywatnym'; + + @override + String get indexedDbErrorLong => + 'Przechowywanie wiadomości niestety nie jest domyślnie włączone w trybie prywatnym.\nOdwiedź\n - about:config\n - ustaw dom.indexedDB.privateBrowsing.enabled na true\nW przeciwnym razie nie jest możliwe uruchomienie FluffyChat.'; + + @override + String switchToAccount(String number) { + return 'Przełącz na konto $number'; + } + + @override + String get nextAccount => 'Następne konto'; + + @override + String get previousAccount => 'Poprzednie konto'; + + @override + String get addWidget => 'Dodaj widżet'; + + @override + String get widgetVideo => 'Film'; + + @override + String get widgetEtherpad => 'Notatka'; + + @override + String get widgetJitsi => 'Jitsi Meet'; + + @override + String get widgetCustom => 'Własny'; + + @override + String get widgetName => 'Nazwa'; + + @override + String get widgetUrlError => 'Niepoprawny URL.'; + + @override + String get widgetNameError => 'Podaj nazwę wyświetlaną.'; + + @override + String get errorAddingWidget => 'Błąd podczas dodawania widżetu.'; + + @override + String get youRejectedTheInvitation => 'Odrzucono zaproszenie'; + + @override + String get youJoinedTheChat => 'Dołączono do czatu'; + + @override + String get youAcceptedTheInvitation => '👍 Zaakceptowałeś/-aś zaproszenie'; + + @override + String youBannedUser(String user) { + return 'Zbanowałeś/-aś $user'; + } + + @override + String youHaveWithdrawnTheInvitationFor(String user) { + return 'Wycofano zaproszenie dla $user'; + } + + @override + String youInvitedToBy(String alias) { + return 'Otrzymałeś/-aś link z zaproszeniem do:\n$alias'; + } + + @override + String youInvitedBy(String user) { + return '📩 Zostałeś/-aś zaproszony/-a przez $user'; + } + + @override + String invitedBy(String user) { + return 'Zaproszony/-a przez $user'; + } + + @override + String youInvitedUser(String user) { + return '📩 Zaprosiłeś/-aś $user'; + } + + @override + String youKicked(String user) { + return '👞 Wyrzuciłeś/-aś $user'; + } + + @override + String youKickedAndBanned(String user) { + return '🙅 Wyrzuciłeś/-aś i zbanowałeś/-aś $user'; + } + + @override + String youUnbannedUser(String user) { + return 'Odbanowałeś/-aś $user'; + } + + @override + String hasKnocked(String user) { + return '$user zapukał-/a'; + } + + @override + String get usersMustKnock => 'Użytkownicy muszą zapukać'; + + @override + String get noOneCanJoin => 'Nikt nie może dołączyć'; + + @override + String userWouldLikeToChangeTheChat(String user) { + return '$user chce dołączyć do czatu.'; + } + + @override + String get noPublicLinkHasBeenCreatedYet => + 'Nie utworzono jeszcze żadnego publicznego linku'; + + @override + String get knock => 'Zapukaj'; + + @override + String get users => 'Użytkownicy'; + + @override + String get unlockOldMessages => 'Odblokuj stare wiadomości'; + + @override + String get storeInSecureStorageDescription => + 'Przechowaj klucz odzyskiwania w bezpiecznym magazynie tego urządzenia.'; + + @override + String get saveKeyManuallyDescription => + 'Zapisz ten klucz ręcznie, uruchamiając systemowe okno dialogowe udostępniania lub schowek.'; + + @override + String get storeInAndroidKeystore => 'Przechowaj w Android KeyStore'; + + @override + String get storeInAppleKeyChain => 'Przechowaj w pęku kluczy Apple'; + + @override + String get storeSecurlyOnThisDevice => + 'Przechowaj bezpiecznie na tym urządzeniu'; + + @override + String countFiles(int count) { + return '$count plików'; + } + + @override + String get user => 'Użytkownik'; + + @override + String get custom => 'Własne'; + + @override + String get foregroundServiceRunning => + 'To powiadomienie pojawia się, gdy usługa w tle jest uruchomiona.'; + + @override + String get screenSharingTitle => 'udostępnianie ekranu'; + + @override + String get screenSharingDetail => 'Udostępniasz swój ekran w FluffyChat'; + + @override + String get callingPermissions => 'Uprawnienia połączeń'; + + @override + String get callingAccount => 'Konto połączeń'; + + @override + String get callingAccountDetails => + 'Pozwala FluffyChat używać natywnej aplikacji do wykonywania połączeń w Androidzie.'; + + @override + String get appearOnTop => 'Wyświetlaj nad innymi'; + + @override + String get appearOnTopDetails => + 'Umożliwia wyświetlanie aplikacji nad innymi (nie jest to konieczne, jeśli FluffyChat jest już ustawiony jako konto do dzwonienia)'; + + @override + String get otherCallingPermissions => + 'Mikrofon, kamera i inne uprawnienia FluffyChat'; + + @override + String get whyIsThisMessageEncrypted => + 'Dlaczego nie można odczytać tej wiadomości?'; + + @override + String get 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.'; + + @override + String get newGroup => 'Nowa grupa'; + + @override + String get newSpace => 'Nowa przestrzeń'; + + @override + String get enterSpace => 'Wejdź do przestrzeni'; + + @override + String get enterRoom => 'Wejdź do pokoju'; + + @override + String get allSpaces => 'Wszystkie przestrzenie'; + + @override + String numChats(String number) { + return '$number czatów'; + } + + @override + String get hideUnimportantStateEvents => 'Ukryj nieistotne wydarzenia stanu'; + + @override + String get hidePresences => 'Ukryć listę statusów?'; + + @override + String get doNotShowAgain => 'Nie pokazuj ponownie'; + + @override + String wasDirectChatDisplayName(String oldDisplayName) { + return 'Pusty czat (wcześniej $oldDisplayName)'; + } + + @override + String get newSpaceDescription => + 'Przestrzenie pozwalają na konsolidację czatów i budowanie prywatnych lub publicznych społeczności.'; + + @override + String get encryptThisChat => 'Zaszyfruj ten czat'; + + @override + String get 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.'; + + @override + String get sorryThatsNotPossible => 'Przepraszamy... to nie jest możliwe'; + + @override + String get deviceKeys => 'Klucze urządzenia:'; + + @override + String get reopenChat => 'Otwórz ponownie czat'; + + @override + String get 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.'; + + @override + String get noOtherDevicesFound => 'Nie znaleziono innych urządzeń'; + + @override + String fileIsTooBigForServer(String max) { + return 'Nie udało się wysłać! Ten serwer obsługuje załączniki o maksymalnej wielkości $max.'; + } + + @override + String fileHasBeenSavedAt(String path) { + return 'Plik został zapisany w ścieżce $path'; + } + + @override + String get jumpToLastReadMessage => + 'Przejdź do ostatnio przeczytanej wiadomości'; + + @override + String get readUpToHere => 'Czytaj do tego miejsca'; + + @override + String get jump => 'Przejdź'; + + @override + String get openLinkInBrowser => 'Otwórz link w przeglądarce'; + + @override + String get 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.'; + + @override + String get report => 'zgłoś'; + + @override + String get signInWithPassword => 'Zaloguj się z hasłem'; + + @override + String get pleaseTryAgainLaterOrChooseDifferentServer => + 'Spróbuj ponownie później lub wybierz inny serwer.'; + + @override + String signInWith(String provider) { + return 'Zaloguj się z $provider'; + } + + @override + String get profileNotFound => + 'Nie można odnaleźć użytkownika na serwerze. Być może wystąpił problem z połączeniem lub użytkownik nie istnieje.'; + + @override + String get setTheme => 'Ustaw wygląd:'; + + @override + String get setColorTheme => 'Ustal styl kolorów:'; + + @override + String get invite => 'Zaproszenie'; + + @override + String get inviteGroupChat => '📨 Zaproszenie do rozmowy grupowej'; + + @override + String get invitePrivateChat => '📨 Zaproszenie do rozmowy prywatnej'; + + @override + String get invalidInput => 'Nieprawidłowe dane!'; + + @override + String wrongPinEntered(int seconds) { + return 'Wprowadzono nieprawidłowy kod PIN! Spróbuj ponownie za $seconds sekund...'; + } + + @override + String get pleaseEnterANumber => 'Proszę podać liczbę większą od 0'; + + @override + String get archiveRoomDescription => + 'Czat zostanie przeniesiony do archiwum. Pozostali użytkownicy będą mogli zobaczyć, że opuściłeś/-aś czat.'; + + @override + String get 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/'; + + @override + String get removeDevicesDescription => + 'Nastąpi wylogowanie z tego urządzenia. Nie będziesz w stanie odbierać na nim wiadomości.'; + + @override + String get banUserDescription => + 'Użytkownik zostanie zbanowany w czacie i nie będzie w stanie dołączyć do czatu do momentu odbanowania.'; + + @override + String get unbanUserDescription => + 'Użytkownik będzie w stanie dołączyć do czatu ponownie.'; + + @override + String get kickUserDescription => + 'Użytkownik jest wyrzucony z czatu, ale nie zbanowany. Do czatu publicznego może dołączyć ponownie.'; + + @override + String get makeAdminDescription => + 'Kiedy użytkownik zostanie adminem, nie będziesz móc tego cofnąć, bo nabierze takich samych uprawnień, jak Ty.'; + + @override + String get pushNotificationsNotAvailable => + 'Powiadomienia push nie są dostępne'; + + @override + String get learnMore => 'Dowiedz się więcej'; + + @override + String get yourGlobalUserIdIs => 'Twój globalny identyfikator to: '; + + @override + String noUsersFoundWithQuery(String query) { + return 'Niestety nie udało się nikogo znaleźć poprzez \"$query\". Proszę sprawdzić, czy w zapytaniu nie ma literówek.'; + } + + @override + String get knocking => 'Pukanie'; + + @override + String chatCanBeDiscoveredViaSearchOnServer(String server) { + return 'Czat będzie można znaleźć, szukając na $server'; + } + + @override + String get searchChatsRooms => 'Szukaj #czatów, @użytkowników...'; + + @override + String get nothingFound => 'Nic nie odnaleziono...'; + + @override + String get groupName => 'Nazwa grupy'; + + @override + String get createGroupAndInviteUsers => 'Utwórz grupę i zaproś użytkowników'; + + @override + String get groupCanBeFoundViaSearch => + 'Grupa może być znaleziona poprzez wyszukiwanie'; + + @override + String get wrongRecoveryKey => + 'Niestety to nie wygląda na poprawny klucz odzyskiwania.'; + + @override + String get startConversation => 'Rozpocznij rozmowę'; + + @override + String get commandHint_sendraw => 'Wyślij zwykły JSON'; + + @override + String get databaseMigrationTitle => 'Baza danych jest zoptymalizowana'; + + @override + String get databaseMigrationBody => 'Proszę czekać. Może to potrwać chwilę.'; + + @override + String get leaveEmptyToClearStatus => + 'Pozostaw puste, aby wyczyścić swój status.'; + + @override + String get select => 'Zaznacz'; + + @override + String get searchForUsers => 'Szukaj @użytkowników...'; + + @override + String get pleaseEnterYourCurrentPassword => + 'Proszę podać swoje obecne hasło'; + + @override + String get newPassword => 'Nowe hasło'; + + @override + String get pleaseChooseAStrongPassword => 'Proszę wybrać silne hasło'; + + @override + String get passwordsDoNotMatch => 'Hasła się nie zgadzają'; + + @override + String get passwordIsWrong => 'Podano niepoprawne hasło'; + + @override + String get publicLink => 'Link publiczny'; + + @override + String get publicChatAddresses => 'Adresy publicznych czatów'; + + @override + String get createNewAddress => 'Utwórz nowy adres'; + + @override + String get joinSpace => 'Dołącz do przestrzeni'; + + @override + String get publicSpaces => 'Przestrzenie publiczne'; + + @override + String get addChatOrSubSpace => 'Dodaj czat lub podprzestrzeń'; + + @override + String get subspace => 'Podprzestrzeń'; + + @override + String get decline => 'Odmów'; + + @override + String get thisDevice => 'To urządzenie:'; + + @override + String get initAppError => 'Wystąpił błąd podczas inicjalizacji aplikacji'; + + @override + String get userRole => 'Rola użytkownika/-czki'; + + @override + String minimumPowerLevel(String level) { + return '$level jest minimalnym poziomem uprawnień.'; + } + + @override + String searchIn(String chat) { + return 'Szukaj w czacie \"$chat\"...'; + } + + @override + String get searchMore => 'Szukaj dalej...'; + + @override + String get gallery => 'Galeria'; + + @override + String get files => 'Pliki'; + + @override + String databaseBuildErrorBody(String url, String error) { + return 'Nie udało się utworzyć bazy danych SQLite. Aplikacja na razie spróbuje korzystać ze starej bazy. Prosimy zgłosić ten błąd autorom aplikacji na $url. Treść błędu to: $error'; + } + + @override + String sessionLostBody(String url, String error) { + return 'Twoja sesja została utracona. Prosimy zgłosić ten błąd autorom aplikacji na $url. Treść błędu to: $error'; + } + + @override + String restoreSessionBody(String url, String error) { + return 'Aplikacja spróbuje teraz odzyskać Twoją sesję z kopii zapasowej. Prosimy zgłosić ten błąd autorom aplikacji na $url. Treść błędu to: $error'; + } + + @override + String forwardMessageTo(String roomName) { + return 'Przekazać wiadomość do $roomName?'; + } + + @override + String get sendReadReceipts => + 'Wysyłaj powiadomienia o przeczytaniu wiadomości'; + + @override + String get sendTypingNotificationsDescription => + 'Pozostali uczestnicy czatu mogą widzieć kiedy piszesz nową wiadomość.'; + + @override + String get sendReadReceiptsDescription => + 'Pozostali uczestnicy czatu mogą widzieć zobaczyć kiedy przeczytasz wiadomość.'; + + @override + String get formattedMessages => 'Sformatowane wiadomości'; + + @override + String get formattedMessagesDescription => + 'Używaj Markdown do wyświetlania dodatkowego formatowania w wiadomościach, jak np. pogrubienie tekstu.'; + + @override + String get verifyOtherUser => '🔐 Zweryfikuj innego użytkownika'; + + @override + String get 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ę. 👭'; + + @override + String get verifyOtherDevice => '🔐 Zweryfikuj inne urządzenie'; + + @override + String get 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. 🤳'; + + @override + String acceptedKeyVerification(String sender) { + return '$sender zaakceptował/-a weryfikację kluczy'; + } + + @override + String canceledKeyVerification(String sender) { + return '$sender anulował/-a weryfikację kluczy'; + } + + @override + String completedKeyVerification(String sender) { + return '$sender zakończył/-a weryfikację kluczy'; + } + + @override + String isReadyForKeyVerification(String sender) { + return '$sender jest gotowy/-a do weryfikacji kluczy'; + } + + @override + String requestedKeyVerification(String sender) { + return '$sender poprosił/-a o weryfikację kluczy'; + } + + @override + String startedKeyVerification(String sender) { + return '$sender rozpoczął/-ęła weryfikację kluczy'; + } + + @override + String get transparent => 'Przezroczystość'; + + @override + String get incomingMessages => 'Wiadomości przychodzące'; + + @override + String get stickers => 'Naklejki'; + + @override + String get discover => 'Odkrywaj'; + + @override + String get commandHint_ignore => 'Ignoruj podany identyfikator Matrix'; + + @override + String get commandHint_unignore => + 'Przestań ignorować podany identyfikator Matrix'; + + @override + String unreadChatsInApp(String appname, String unread) { + return '$appname: $unread nieprzeczytanych czatów'; + } + + @override + String get noDatabaseEncryption => + 'Szyfrowanie bazy danych nie jest obsługiwane na tej platformie'; + + @override + String thereAreCountUsersBlocked(Object count) { + return 'Obecnie jest $count zablokowanych użytkowników.'; + } + + @override + String get restricted => 'Ograniczone'; + + @override + String get knockRestricted => 'Pukanie jest ograniczone'; + + @override + String goToSpace(Object space) { + return 'Przejdź do przestrzeni $space'; + } + + @override + String get markAsUnread => 'Oznacz jako nieprzeczytane'; + + @override + String userLevel(int level) { + return '$level - Użytkownik'; + } + + @override + String moderatorLevel(int level) { + return '$level - Moderator'; + } + + @override + String adminLevel(int level) { + return '$level - Administrator'; + } + + @override + String get changeGeneralChatSettings => 'Zmień ogólne ustawienia czatu'; + + @override + String get inviteOtherUsers => 'Zaproś innych użytkowników do tego czatu'; + + @override + String get changeTheChatPermissions => 'Zmień uprawnienia w czacie'; + + @override + String get changeTheVisibilityOfChatHistory => + 'Zmień widoczność historii czatu'; + + @override + String get changeTheCanonicalRoomAlias => 'Zmień główny publiczny czatu'; + + @override + String get sendRoomNotifications => 'Wysyłaj powiadomienia @room'; + + @override + String get changeTheDescriptionOfTheGroup => 'Zmień opis czatu'; + + @override + String get 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.'; + + @override + String updateInstalled(String version) { + return '🎉 Zainstalowano aktualizację do wersji $version!'; + } + + @override + String get changelog => 'Lista zmian'; + + @override + String get sendCanceled => 'Anulowano wysyłanie'; + + @override + String get loginWithMatrixId => 'Zaloguj się identyfikatorem Matrix'; + + @override + String get discoverHomeservers => 'Odkrywaj serwery domowe'; + + @override + String get whatIsAHomeserver => 'Czym jest serwer domowy?'; + + @override + String get homeserverDescription => + 'Wszystkie Twoje dane trzymane są na serwerze domowym, jak u dostawców usług e-mail. Możesz wybrać swój serwer domowy i nadal rozmawiać ze wszystkimi. Dowiedz się więcej na https://matrix.org.'; + + @override + String get doesNotSeemToBeAValidHomeserver => + 'Wydaje się nie być kompatybilnym serwerem domowym. Niepoprawny adres URL?'; + + @override + String get calculatingFileSize => 'Obliczanie rozmiaru pliku...'; + + @override + String get prepareSendingAttachment => 'Przygotuj wysyłanie załącznika...'; + + @override + String get sendingAttachment => 'Wysyłanie załącznika...'; + + @override + String get generatingVideoThumbnail => 'Generowanie podglądu filmu...'; + + @override + String get compressVideo => 'Kompresowanie filmu...'; + + @override + String sendingAttachmentCountOfCount(int index, int length) { + return 'Wysyłanie $index z $length części załącznika...'; + } + + @override + String serverLimitReached(int seconds) { + return 'Osiągnięto limit serwera. Czekanie $seconds sekund...'; + } + + @override + String get oneOfYourDevicesIsNotVerified => + 'Tylko kiedy Twoje urządzenie nie jest zweryfikowane'; + + @override + String get noticeChatBackupDeviceVerification => + 'Uwaga: Urządzenia dodane do kopii zapasowej czatu automatycznie zostają zweryfikowane.'; + + @override + String get continueText => 'Kontynuuj'; + + @override + String get 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!'; + + @override + String get blur => 'Rozmazanie:'; + + @override + String get opacity => 'Przezroczystość:'; + + @override + String get setWallpaper => 'Ustaw tapetę'; + + @override + String get manageAccount => 'Zarządzaj kontem'; + + @override + String get noContactInformationProvided => + 'Serwer nie dostarcza żadnych poprawnych danych kontaktowych'; + + @override + String get contactServerAdmin => 'Skontaktuj się z administratorem serwera'; + + @override + String get contactServerSecurity => + 'Skontaktuj się z działem bezpieczeństwa serwera'; + + @override + String get supportPage => 'Strona obsługi użytkownika'; + + @override + String get serverInformation => 'Informacje o serwerze:'; + + @override + String get name => 'Nazwa'; + + @override + String get version => 'Wersja'; + + @override + String get website => 'Strona internetowa'; + + @override + String get compress => 'Skompresuj'; + + @override + String get boldText => 'Pogrubienie'; + + @override + String get italicText => 'Kursywa'; + + @override + String get strikeThrough => 'Przekreślenie'; + + @override + String get pleaseFillOut => 'Proszę wypełnić'; + + @override + String get invalidUrl => 'Niepoprawny adres URL'; + + @override + String get addLink => 'Dodaj link'; + + @override + String get unableToJoinChat => + 'Nie udało się dołączyć do czatu. Może druga strona zakończyła już rozmowę?'; + + @override + String get previous => 'Poprzedni'; + + @override + String get otherPartyNotLoggedIn => + 'Druga strona nie jest obecnie zalogowana i dlatego nie może odbierać wiadomości!'; + + @override + String appWantsToUseForLogin(String server) { + return 'Użyj serwera \'$server\' do zalogowania się'; + } + + @override + String get appWantsToUseForLoginDescription => + 'Niniejszym zezwalasz aplikacji i witrynie na udostępnianie informacji o sobie.'; + + @override + String get open => 'Otwórz'; + + @override + String get waitingForServer => 'Oczekiwanie na serwer...'; + + @override + String get appIntroduction => + 'FluffyChat umożliwia czatowanie ze znajomymi za pośrednictwem różnych komunikatorów. Dowiedz się więcej na stronie https://matrix.org lub kliknij na *Kontynuuj*.'; + + @override + String get newChatRequest => '📩 Nowa prośba o czat'; + + @override + String get contentNotificationSettings => 'Ustawienia powiadomień o treści'; + + @override + String get generalNotificationSettings => 'Ogólne ustawienia powiadomień'; + + @override + String get roomNotificationSettings => 'Ustawienia powiadomień w pokoju'; + + @override + String get userSpecificNotificationSettings => + 'Ustawienia powiadomień dla użytkownika'; + + @override + String get otherNotificationSettings => 'Inne ustawienia powiadomień'; + + @override + String get notificationRuleContainsUserName => 'Zawiera nazwę użytkownika'; + + @override + String get notificationRuleContainsUserNameDescription => + 'Powiadamia użytkownika kiedy wiadomość zawiera jego nazwę.'; + + @override + String get notificationRuleMaster => 'Wycisz wszystkie powiadomienia'; + + @override + String get notificationRuleMasterDescription => + 'Zastępuje wszystkie inne reguły i wyłącza wszystkie powiadomienia.'; + + @override + String get notificationRuleSuppressNotices => 'Stłum automatyczne wiadomości'; + + @override + String get notificationRuleSuppressNoticesDescription => + 'Tłumi powiadomienia z automatycznych klientów, takich jak boty.'; + + @override + String get notificationRuleInviteForMe => 'Zaproszenia'; + + @override + String get notificationRuleInviteForMeDescription => + 'Powiadamia o zaproszeniach do pokoju.'; + + @override + String get notificationRuleMemberEvent => 'Zdarzenia członków pokoju'; + + @override + String get notificationRuleMemberEventDescription => + 'Tłumi powiadomienia o zmianach członkostwa w pokoju.'; + + @override + String get notificationRuleIsUserMention => 'Wzmianki'; + + @override + String get notificationRuleIsUserMentionDescription => + 'Powiadamia o byciu wzmiankowanym w wiadomości.'; + + @override + String get notificationRuleContainsDisplayName => 'Zawiera nazwę wyświetlaną'; + + @override + String get notificationRuleContainsDisplayNameDescription => + 'Powiadamia osobę o wiadomości zawierającej jej nazwę wyświetlaną.'; + + @override + String get notificationRuleIsRoomMention => 'Wzmianki pokoju'; + + @override + String get notificationRuleIsRoomMentionDescription => + 'Powiadamia o wzmiankowaniu całego pokoju.'; + + @override + String get notificationRuleRoomnotif => 'Powiadomienia w pokoju'; + + @override + String get notificationRuleRoomnotifDescription => + 'Powiadamia o wiadomości zawierającej „@room”.'; + + @override + String get notificationRuleTombstone => 'Nagrobki'; + + @override + String get notificationRuleTombstoneDescription => + 'Powiadamia o komunikatach dezaktywacji pokojów.'; + + @override + String get notificationRuleReaction => 'Reakcje'; + + @override + String get notificationRuleReactionDescription => + 'Tłumi powiadomienia o reakcjach.'; + + @override + String get notificationRuleRoomServerAcl => + 'Lista kontroli dostępu serwerów pokojów'; + + @override + String get notificationRuleRoomServerAclDescription => + 'Wyłącza powiadomienia dla list kontroli dostępu (ACL) serwerów pokojów.'; + + @override + String get notificationRuleSuppressEdits => 'Stłum edycje'; + + @override + String get notificationRuleSuppressEditsDescription => + 'Tłumi powiadomienia o edycjach wiadomości.'; + + @override + String get notificationRuleCall => 'Połączenia'; + + @override + String get notificationRuleCallDescription => + 'Powiadamia o przychodzących połączeniach.'; + + @override + String get notificationRuleEncryptedRoomOneToOne => + 'Szyfrowane pokoje „jeden na jeden”'; + + @override + String get notificationRuleEncryptedRoomOneToOneDescription => + 'Powiadamia o wiadomościach w szyfrowanych pokojach „jeden na jeden” (one-to-one).'; + + @override + String get notificationRuleRoomOneToOne => 'Pokoje „jeden na jeden”'; + + @override + String get notificationRuleRoomOneToOneDescription => + 'Powiadamia o wiadomościach w pokojach „jeden na jeden” (one-to-one).'; + + @override + String get notificationRuleMessage => 'Wiadomości'; + + @override + String get notificationRuleMessageDescription => + 'Powiadamia o ogólnych wiadomościach.'; + + @override + String get notificationRuleEncrypted => 'Zaszyfrowane pokoje'; + + @override + String get notificationRuleEncryptedDescription => + 'Powiadamia o wiadomościach w zaszyfrowanych pokojach.'; + + @override + String get notificationRuleJitsi => 'Jitsi'; + + @override + String get notificationRuleJitsiDescription => + 'Powiadamia o komunikatach widżetów Jitsi.'; + + @override + String get notificationRuleServerAcl => + 'Stłum komunikaty o listach kontroli dostępu serwerów pokojów'; + + @override + String get notificationRuleServerAclDescription => + 'Tłumi powiadomienia o komunikatach o listach kontroli dostępu (ACL) serwerów pokojów.'; + + @override + String unknownPushRule(String rule) { + return 'Nieznana reguła: \'$rule\''; + } + + @override + String get deletePushRuleCanNotBeUndone => + 'Jeśli skasujesz to ustawienie powiadomień, nie będzie się dało tego cofnąć.'; + + @override + String get more => 'Więcej'; + + @override + String get shareKeysWith => 'Udostępnij klucze...'; + + @override + String get shareKeysWithDescription => + 'Które urządzenia powinny być zaufane, aby mogły odczytywać Twoje wiadomości w zaszyfrowanych czatach?'; + + @override + String get allDevices => 'Wszystkie urządzenia'; + + @override + String get crossVerifiedDevicesIfEnabled => + 'Urządzenia zweryfikowane krzyżowo, jeśli włączone'; + + @override + String get crossVerifiedDevices => 'Urządzenia zweryfikowane krzyżowo'; + + @override + String get verifiedDevicesOnly => 'Tylko zweryfikowane urządzenia'; + + @override + String get takeAPhoto => 'Zrób zdjęcie'; + + @override + String get recordAVideo => 'Nagraj film'; + + @override + String get optionalMessage => '(Opcjonalna) wiadomość...'; + + @override + String get notSupportedOnThisDevice => 'Niewspierane na tym urządzeniu'; + + @override + String get enterNewChat => 'Enter new chat'; + + @override + String get approve => 'Approve'; + + @override + String get youHaveKnocked => 'You have knocked'; + + @override + String get pleaseWaitUntilInvited => + 'Please wait now, until someone from the room invites you.'; +} diff --git a/lib/generated/l10n/l10n_pt.dart b/lib/generated/l10n/l10n_pt.dart new file mode 100644 index 0000000..d82d123 --- /dev/null +++ b/lib/generated/l10n/l10n_pt.dart @@ -0,0 +1,6019 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'l10n.dart'; + +// ignore_for_file: type=lint + +/// The translations for Portuguese (`pt`). +class L10nPt extends L10n { + L10nPt([String locale = 'pt']) : super(locale); + + @override + String get noSendPermission => 'You can\'t send messages here'; + + @override + String get alwaysUse24HourFormat => 'false'; + + @override + String get repeatPassword => 'Repeat password'; + + @override + String get notAnImage => 'Not an image file.'; + + @override + String get setCustomPermissionLevel => 'Set custom permission level'; + + @override + String get setPermissionsLevelDescription => + 'Please choose a predefined role below or enter a custom permission level between 0 and 100.'; + + @override + String get ignoreUser => 'Ignore user'; + + @override + String get normalUser => 'Normal user'; + + @override + String get remove => 'Remove'; + + @override + String get importNow => 'Import now'; + + @override + String get importEmojis => 'Import Emojis'; + + @override + String get importFromZipFile => 'Import from .zip file'; + + @override + String get exportEmotePack => 'Export Emote pack as .zip'; + + @override + String get replace => 'Replace'; + + @override + String get about => 'Sobre'; + + @override + String aboutHomeserver(String homeserver) { + return 'About $homeserver'; + } + + @override + String get accept => 'Accept'; + + @override + String acceptedTheInvitation(String username) { + return '👍 $username accepted the invitation'; + } + + @override + String get account => 'Conta'; + + @override + String activatedEndToEndEncryption(String username) { + return '🔐 $username activated end to end encryption'; + } + + @override + String get addEmail => 'Add email'; + + @override + String get confirmMatrixId => + 'Please confirm your Matrix ID in order to delete your account.'; + + @override + String supposedMxid(String mxid) { + return 'This should be $mxid'; + } + + @override + String get addChatDescription => 'Add a chat description...'; + + @override + String get addToSpace => 'Add to space'; + + @override + String get admin => 'Admin'; + + @override + String get alias => 'alias'; + + @override + String get all => 'All'; + + @override + String get allChats => 'All chats'; + + @override + String get commandHint_roomupgrade => + 'Upgrade this room to the given room version'; + + @override + String get commandHint_googly => 'Send some googly eyes'; + + @override + String get commandHint_cuddle => 'Send a cuddle'; + + @override + String get commandHint_hug => 'Send a hug'; + + @override + String googlyEyesContent(String senderName) { + return '$senderName sends you googly eyes'; + } + + @override + String cuddleContent(String senderName) { + return '$senderName cuddles you'; + } + + @override + String hugContent(String senderName) { + return '$senderName hugs you'; + } + + @override + String answeredTheCall(String senderName) { + return '$senderName answered the call'; + } + + @override + String get anyoneCanJoin => 'Anyone can join'; + + @override + String get appLock => 'App lock'; + + @override + String get appLockDescription => + 'Lock the app when not using with a pin code'; + + @override + String get archive => 'Archive'; + + @override + String get areGuestsAllowedToJoin => 'Are guest users allowed to join'; + + @override + String get areYouSure => 'Tens a certeza?'; + + @override + String get areYouSureYouWantToLogout => 'Are you sure you want to log out?'; + + @override + String get askSSSSSign => + 'To be able to sign the other person, please enter your secure store passphrase or recovery key.'; + + @override + String askVerificationRequest(String username) { + return 'Accept this verification request from $username?'; + } + + @override + String get autoplayImages => + 'Automatically play animated stickers and emotes'; + + @override + String badServerLoginTypesException(String serverVersions, + String supportedVersions, Object suportedVersions) { + return 'The homeserver supports the login types:\n$serverVersions\nBut this app supports only:\n$supportedVersions'; + } + + @override + String get sendTypingNotifications => 'Send typing notifications'; + + @override + String get swipeRightToLeftToReply => 'Swipe right to left to reply'; + + @override + String get sendOnEnter => 'Send on enter'; + + @override + String badServerVersionsException(String serverVersions, + String supportedVersions, Object serverVerions, Object suportedVersions) { + return 'The homeserver supports the Spec versions:\n$serverVersions\nBut this app supports only $supportedVersions'; + } + + @override + String countChatsAndCountParticipants(int chats, int participants) { + return '$chats chats and $participants participants'; + } + + @override + String get noMoreChatsFound => 'No more chats found...'; + + @override + String get noChatsFoundHere => + 'No chats found here yet. Start a new chat with someone by using the button below. ⤵️'; + + @override + String get joinedChats => 'Joined chats'; + + @override + String get unread => 'Unread'; + + @override + String get space => 'Space'; + + @override + String get spaces => 'Spaces'; + + @override + String get banFromChat => 'Ban from chat'; + + @override + String get banned => 'Banned'; + + @override + String bannedUser(String username, String targetName) { + return '$username banned $targetName'; + } + + @override + String get blockDevice => 'Block Device'; + + @override + String get blocked => 'Blocked'; + + @override + String get botMessages => 'Bot messages'; + + @override + String get cancel => 'Cancelar'; + + @override + String cantOpenUri(String uri) { + return 'Can\'t open the URI $uri'; + } + + @override + String get changeDeviceName => 'Change device name'; + + @override + String changedTheChatAvatar(String username) { + return '$username changed the chat avatar'; + } + + @override + String changedTheChatDescriptionTo(String username, String description) { + return '$username changed the chat description to: \'$description\''; + } + + @override + String changedTheChatNameTo(String username, String chatname) { + return '$username changed the chat name to: \'$chatname\''; + } + + @override + String changedTheChatPermissions(String username) { + return '$username changed the chat permissions'; + } + + @override + String changedTheDisplaynameTo(String username, String displayname) { + return '$username changed their displayname to: \'$displayname\''; + } + + @override + String changedTheGuestAccessRules(String username) { + return '$username changed the guest access rules'; + } + + @override + String changedTheGuestAccessRulesTo(String username, String rules) { + return '$username changed the guest access rules to: $rules'; + } + + @override + String changedTheHistoryVisibility(String username) { + return '$username changed the history visibility'; + } + + @override + String changedTheHistoryVisibilityTo(String username, String rules) { + return '$username changed the history visibility to: $rules'; + } + + @override + String changedTheJoinRules(String username) { + return '$username changed the join rules'; + } + + @override + String changedTheJoinRulesTo(String username, String joinRules) { + return '$username changed the join rules to: $joinRules'; + } + + @override + String changedTheProfileAvatar(String username) { + return '$username changed their avatar'; + } + + @override + String changedTheRoomAliases(String username) { + return '$username changed the room aliases'; + } + + @override + String changedTheRoomInvitationLink(String username) { + return '$username changed the invitation link'; + } + + @override + String get changePassword => 'Change password'; + + @override + String get changeTheHomeserver => 'Change the homeserver'; + + @override + String get changeTheme => 'Change your style'; + + @override + String get changeTheNameOfTheGroup => 'Change the name of the group'; + + @override + String get changeYourAvatar => 'Change your avatar'; + + @override + String get channelCorruptedDecryptError => + 'The encryption has been corrupted'; + + @override + String get chat => 'Chat'; + + @override + String get yourChatBackupHasBeenSetUp => 'Your chat backup has been set up.'; + + @override + String get chatBackup => 'Chat backup'; + + @override + String get chatBackupDescription => + 'Your old messages are secured with a recovery key. Please make sure you don\'t lose it.'; + + @override + String get chatDetails => 'Chat details'; + + @override + String get chatHasBeenAddedToThisSpace => 'Chat has been added to this space'; + + @override + String get chats => 'Chats'; + + @override + String get chooseAStrongPassword => 'Choose a strong password'; + + @override + String get clearArchive => 'Clear archive'; + + @override + String get close => 'Fechar'; + + @override + String get commandHint_markasdm => + 'Mark as direct message room for the giving Matrix ID'; + + @override + String get commandHint_markasgroup => 'Mark as group'; + + @override + String get commandHint_ban => 'Ban the given user from this room'; + + @override + String get commandHint_clearcache => 'Clear cache'; + + @override + String get commandHint_create => + 'Create an empty group chat\nUse --no-encryption to disable encryption'; + + @override + String get commandHint_discardsession => 'Discard session'; + + @override + String get commandHint_dm => + 'Start a direct chat\nUse --no-encryption to disable encryption'; + + @override + String get commandHint_html => 'Send HTML-formatted text'; + + @override + String get commandHint_invite => 'Invite the given user to this room'; + + @override + String get commandHint_join => 'Join the given room'; + + @override + String get commandHint_kick => 'Remove the given user from this room'; + + @override + String get commandHint_leave => 'Leave this room'; + + @override + String get commandHint_me => 'Describe yourself'; + + @override + String get commandHint_myroomavatar => + 'Set your picture for this room (by mxc-uri)'; + + @override + String get commandHint_myroomnick => 'Set your display name for this room'; + + @override + String get commandHint_op => + 'Set the given user\'s power level (default: 50)'; + + @override + String get commandHint_plain => 'Send unformatted text'; + + @override + String get commandHint_react => 'Send reply as a reaction'; + + @override + String get commandHint_send => 'Send text'; + + @override + String get commandHint_unban => 'Unban the given user from this room'; + + @override + String get commandInvalid => 'Command invalid'; + + @override + String commandMissing(String command) { + return '$command is not a command.'; + } + + @override + String get compareEmojiMatch => 'Please compare the emojis'; + + @override + String get compareNumbersMatch => 'Please compare the numbers'; + + @override + String get configureChat => 'Configure chat'; + + @override + String get confirm => 'Confirm'; + + @override + String get connect => 'Connect'; + + @override + String get contactHasBeenInvitedToTheGroup => + 'Contact has been invited to the group'; + + @override + String get containsDisplayName => 'Contains display name'; + + @override + String get containsUserName => 'Contains username'; + + @override + String get contentHasBeenReported => + 'The content has been reported to the server admins'; + + @override + String get copiedToClipboard => 'Copiada para a área de transferência'; + + @override + String get copy => 'Copy'; + + @override + String get copyToClipboard => 'Copy to clipboard'; + + @override + String couldNotDecryptMessage(String error) { + return 'Could not decrypt message: $error'; + } + + @override + String countParticipants(int count) { + return '$count participants'; + } + + @override + String get create => 'Create'; + + @override + String createdTheChat(String username) { + return '💬 $username created the chat'; + } + + @override + String get createGroup => 'Create group'; + + @override + String get createNewSpace => 'New space'; + + @override + String get currentlyActive => 'Currently active'; + + @override + String get darkTheme => 'Dark'; + + @override + String dateAndTimeOfDay(String date, String timeOfDay) { + return '$date, $timeOfDay'; + } + + @override + String dateWithoutYear(String month, String day) { + return '$day-$month'; + } + + @override + String dateWithYear(String year, String month, String day) { + return '$day-$month-$year'; + } + + @override + String get deactivateAccountWarning => + 'This will deactivate your user account. This can not be undone! Are you sure?'; + + @override + String get defaultPermissionLevel => 'Default permission level for new users'; + + @override + String get delete => 'Eliminar'; + + @override + String get deleteAccount => 'Delete account'; + + @override + String get deleteMessage => 'Delete message'; + + @override + String get device => 'Device'; + + @override + String get deviceId => 'Device ID'; + + @override + String get devices => 'Devices'; + + @override + String get directChats => 'Direct Chats'; + + @override + String get allRooms => 'All Group Chats'; + + @override + String get displaynameHasBeenChanged => 'Displayname has been changed'; + + @override + String get downloadFile => 'Download file'; + + @override + String get edit => 'Edit'; + + @override + String get editBlockedServers => 'Edit blocked servers'; + + @override + String get chatPermissions => 'Chat permissions'; + + @override + String get editDisplayname => 'Edit displayname'; + + @override + String get editRoomAliases => 'Edit room aliases'; + + @override + String get editRoomAvatar => 'Edit room avatar'; + + @override + String get emoteExists => 'Emote already exists!'; + + @override + String get emoteInvalid => 'Invalid emote shortcode!'; + + @override + String get emoteKeyboardNoRecents => + 'Recently-used emotes will appear here...'; + + @override + String get emotePacks => 'Emote packs for room'; + + @override + String get emoteSettings => 'Emote Settings'; + + @override + String get globalChatId => 'Global chat ID'; + + @override + String get accessAndVisibility => 'Access and visibility'; + + @override + String get accessAndVisibilityDescription => + 'Who is allowed to join this chat and how the chat can be discovered.'; + + @override + String get calls => 'Calls'; + + @override + String get customEmojisAndStickers => 'Custom emojis and stickers'; + + @override + String get customEmojisAndStickersBody => + 'Add or share custom emojis or stickers which can be used in any chat.'; + + @override + String get emoteShortcode => 'Emote shortcode'; + + @override + String get emoteWarnNeedToPick => + 'You need to pick an emote shortcode and an image!'; + + @override + String get emptyChat => 'Empty chat'; + + @override + String get enableEmotesGlobally => 'Enable emote pack globally'; + + @override + String get enableEncryption => 'Enable encryption'; + + @override + String get enableEncryptionWarning => + 'You won\'t be able to disable the encryption anymore. Are you sure?'; + + @override + String get encrypted => 'Encrypted'; + + @override + String get encryption => 'Encryption'; + + @override + String get encryptionNotEnabled => 'Encryption is not enabled'; + + @override + String endedTheCall(String senderName) { + return '$senderName ended the call'; + } + + @override + String get enterAnEmailAddress => 'Enter an email address'; + + @override + String get homeserver => 'Homeserver'; + + @override + String get enterYourHomeserver => 'Enter your homeserver'; + + @override + String errorObtainingLocation(String error) { + return 'Error obtaining location: $error'; + } + + @override + String get everythingReady => 'Everything ready!'; + + @override + String get extremeOffensive => 'Extremely offensive'; + + @override + String get fileName => 'File name'; + + @override + String get fluffychat => 'Extera'; + + @override + String get fontSize => 'Font size'; + + @override + String get forward => 'Forward'; + + @override + String get fromJoining => 'From joining'; + + @override + String get fromTheInvitation => 'From the invitation'; + + @override + String get goToTheNewRoom => 'Go to the new room'; + + @override + String get group => 'Group'; + + @override + String get chatDescription => 'Chat description'; + + @override + String get chatDescriptionHasBeenChanged => 'Chat description changed'; + + @override + String get groupIsPublic => 'Group is public'; + + @override + String get groups => 'Groups'; + + @override + String groupWith(String displayname) { + return 'Group with $displayname'; + } + + @override + String get guestsAreForbidden => 'Guests are forbidden'; + + @override + String get guestsCanJoin => 'Guests can join'; + + @override + String hasWithdrawnTheInvitationFor(String username, String targetName) { + return '$username has withdrawn the invitation for $targetName'; + } + + @override + String get help => 'Ajuda'; + + @override + String get hideRedactedEvents => 'Hide redacted events'; + + @override + String get hideRedactedMessages => 'Hide redacted messages'; + + @override + String get hideRedactedMessagesBody => + 'If someone redacts a message, this message won\'t be visible in the chat anymore.'; + + @override + String get hideInvalidOrUnknownMessageFormats => + 'Hide invalid or unknown message formats'; + + @override + String get howOffensiveIsThisContent => 'How offensive is this content?'; + + @override + String get id => 'ID'; + + @override + String get identity => 'Identity'; + + @override + String get block => 'Block'; + + @override + String get blockedUsers => 'Blocked users'; + + @override + String get blockListDescription => + 'You can block users who are disturbing you. You won\'t be able to receive any messages or room invites from the users on your personal block list.'; + + @override + String get blockUsername => 'Ignore username'; + + @override + String get iHaveClickedOnLink => 'I have clicked on the link'; + + @override + String get incorrectPassphraseOrKey => 'Incorrect passphrase or recovery key'; + + @override + String get inoffensive => 'Inoffensive'; + + @override + String get inviteContact => 'Invite contact'; + + @override + String inviteContactToGroupQuestion(Object contact, Object groupName) { + return 'Do you want to invite $contact to the chat \"$groupName\"?'; + } + + @override + String inviteContactToGroup(String groupName) { + return 'Invite contact to $groupName'; + } + + @override + String get noChatDescriptionYet => 'No chat description created yet.'; + + @override + String get tryAgain => 'Try again'; + + @override + String get invalidServerName => 'Invalid server name'; + + @override + String get invited => 'Invited'; + + @override + String get redactMessageDescription => + 'The message will be redacted for all participants in this conversation. This cannot be undone.'; + + @override + String get optionalRedactReason => + '(Optional) Reason for redacting this message...'; + + @override + String invitedUser(String username, String targetName) { + return '📩 $username invited $targetName'; + } + + @override + String get invitedUsersOnly => 'Invited users only'; + + @override + String get inviteForMe => 'Invite for me'; + + @override + String inviteText(String username, String link) { + return '$username invited you to Extera.\n1. Visit fluffychat.im and install the app \n2. Sign up or sign in \n3. Open the invite link: \n $link'; + } + + @override + String get isTyping => 'is typing…'; + + @override + String joinedTheChat(String username) { + return '👋 $username joined the chat'; + } + + @override + String get joinRoom => 'Join room'; + + @override + String kicked(String username, String targetName) { + return '👞 $username kicked $targetName'; + } + + @override + String kickedAndBanned(String username, String targetName) { + return '🙅 $username kicked and banned $targetName'; + } + + @override + String get kickFromChat => 'Kick from chat'; + + @override + String lastActiveAgo(String localizedTimeShort) { + return 'Last active: $localizedTimeShort'; + } + + @override + String get leave => 'Leave'; + + @override + String get leftTheChat => 'Left the chat'; + + @override + String get license => 'License'; + + @override + String get lightTheme => 'Light'; + + @override + String loadCountMoreParticipants(int count) { + return 'Load $count more participants'; + } + + @override + String get dehydrate => 'Export session and wipe device'; + + @override + String get dehydrateWarning => + 'This action cannot be undone. Ensure you safely store the backup file.'; + + @override + String get dehydrateTor => 'TOR Users: Export session'; + + @override + String get dehydrateTorLong => + 'For TOR users, it is recommended to export the session before closing the window.'; + + @override + String get hydrateTor => 'TOR Users: Import session export'; + + @override + String get hydrateTorLong => + 'Did you export your session last time on TOR? Quickly import it and continue chatting.'; + + @override + String get hydrate => 'Restore from backup file'; + + @override + String get loadingPleaseWait => 'Loading… Please wait.'; + + @override + String get loadMore => 'Load more…'; + + @override + String get locationDisabledNotice => + 'Location services are disabled. Please enable them to be able to share your location.'; + + @override + String get locationPermissionDeniedNotice => + 'Location permission denied. Please grant them to be able to share your location.'; + + @override + String get login => 'Iniciar sessão'; + + @override + String logInTo(String homeserver) { + return 'Log in to $homeserver'; + } + + @override + String get logout => 'Terminar sessão'; + + @override + String get memberChanges => 'Member changes'; + + @override + String get mention => 'Mention'; + + @override + String get messages => 'Mensagens'; + + @override + String get messagesStyle => 'Messages:'; + + @override + String get moderator => 'Moderator'; + + @override + String get muteChat => 'Mute chat'; + + @override + String get needPantalaimonWarning => + 'Please be aware that you need Pantalaimon to use end-to-end encryption for now.'; + + @override + String get newChat => 'New chat'; + + @override + String get newMessageInFluffyChat => '💬 New message in Extera'; + + @override + String get newVerificationRequest => 'New verification request!'; + + @override + String get next => 'Next'; + + @override + String get no => 'No'; + + @override + String get noConnectionToTheServer => 'No connection to the server'; + + @override + String get noEmotesFound => 'No emotes found. 😕'; + + @override + String get noEncryptionForPublicRooms => + 'You can only activate encryption as soon as the room is no longer publicly accessible.'; + + @override + String get noGoogleServicesWarning => + 'Firebase Cloud Messaging doesn\'t appear to be available on your device. To still receive push notifications, we recommend installing ntfy. With ntfy or another Unified Push provider you can receive push notifications in a data secure way. You can download ntfy from the PlayStore or from F-Droid.'; + + @override + String noMatrixServer(String server1, String server2) { + return '$server1 is no matrix server, use $server2 instead?'; + } + + @override + String get shareInviteLink => 'Share invite link'; + + @override + String get scanQrCode => 'Scan QR code'; + + @override + String get none => 'None'; + + @override + String get noPasswordRecoveryDescription => + 'You have not added a way to recover your password yet.'; + + @override + String get noPermission => 'No permission'; + + @override + String get noRoomsFound => 'No rooms found…'; + + @override + String get notifications => 'Notificações'; + + @override + String get notificationsEnabledForThisAccount => + 'Notifications enabled for this account'; + + @override + String numUsersTyping(int count) { + return '$count users are typing…'; + } + + @override + String get obtainingLocation => 'Obtaining location…'; + + @override + String get offensive => 'Offensive'; + + @override + String get offline => 'Offline'; + + @override + String get ok => 'Ok'; + + @override + String get online => 'Online'; + + @override + String get onlineKeyBackupEnabled => 'Online Key Backup is enabled'; + + @override + String get oopsPushError => + 'Oops! Unfortunately, an error occurred when setting up the push notifications.'; + + @override + String get oopsSomethingWentWrong => 'Oops, something went wrong…'; + + @override + String get openAppToReadMessages => 'Open app to read messages'; + + @override + String get openCamera => 'Abrir câmara'; + + @override + String get openVideoCamera => 'Open camera for a video'; + + @override + String get oneClientLoggedOut => 'One of your clients has been logged out'; + + @override + String get addAccount => 'Add account'; + + @override + String get editBundlesForAccount => 'Edit bundles for this account'; + + @override + String get addToBundle => 'Add to bundle'; + + @override + String get removeFromBundle => 'Remove from this bundle'; + + @override + String get bundleName => 'Bundle name'; + + @override + String get enableMultiAccounts => + '(BETA) Enable multi accounts on this device'; + + @override + String get openInMaps => 'Open in maps'; + + @override + String get link => 'Link'; + + @override + String get serverRequiresEmail => + 'This server needs to validate your email address for registration.'; + + @override + String get or => 'Or'; + + @override + String get participant => 'Participant'; + + @override + String get passphraseOrKey => 'passphrase or recovery key'; + + @override + String get password => 'Password'; + + @override + String get passwordForgotten => 'Password forgotten'; + + @override + String get passwordHasBeenChanged => 'Password has been changed'; + + @override + String get hideMemberChangesInPublicChats => + 'Hide member changes in public chats'; + + @override + String get hideMemberChangesInPublicChatsBody => + 'Do not show in the chat timeline if someone joins or leaves a public chat to improve readability.'; + + @override + String get overview => 'Overview'; + + @override + String get notifyMeFor => 'Notify me for'; + + @override + String get passwordRecoverySettings => 'Password recovery settings'; + + @override + String get passwordRecovery => 'Password recovery'; + + @override + String get people => 'People'; + + @override + String get pickImage => 'Pick an image'; + + @override + String get pin => 'Pin'; + + @override + String play(String fileName) { + return 'Play $fileName'; + } + + @override + String get pleaseChoose => 'Please choose'; + + @override + String get pleaseChooseAPasscode => 'Please choose a pass code'; + + @override + String get pleaseClickOnLink => + 'Please click on the link in the email and then proceed.'; + + @override + String get pleaseEnter4Digits => + 'Please enter 4 digits or leave empty to disable app lock.'; + + @override + String get pleaseEnterRecoveryKey => 'Please enter your recovery key:'; + + @override + String get pleaseEnterYourPassword => 'Please enter your password'; + + @override + String get pleaseEnterYourPin => 'Please enter your pin'; + + @override + String get pleaseEnterYourUsername => 'Please enter your username'; + + @override + String get pleaseFollowInstructionsOnWeb => + 'Please follow the instructions on the website and tap on next.'; + + @override + String get privacy => 'Privacidade'; + + @override + String get publicRooms => 'Public Rooms'; + + @override + String get pushRules => 'Push rules'; + + @override + String get reason => 'Razão'; + + @override + String get recording => 'Recording'; + + @override + String redactedBy(String username) { + return 'Redacted by $username'; + } + + @override + String get directChat => 'Direct chat'; + + @override + String redactedByBecause(String username, String reason) { + return 'Redacted by $username because: \"$reason\"'; + } + + @override + String redactedAnEvent(String username) { + return '$username redacted an event'; + } + + @override + String get redactMessage => 'Redact message'; + + @override + String get register => 'Register'; + + @override + String get reject => 'Reject'; + + @override + String rejectedTheInvitation(String username) { + return '$username rejected the invitation'; + } + + @override + String get rejoin => 'Rejoin'; + + @override + String get removeAllOtherDevices => 'Remove all other devices'; + + @override + String removedBy(String username) { + return 'Removed by $username'; + } + + @override + String get removeDevice => 'Remove device'; + + @override + String get unbanFromChat => 'Unban from chat'; + + @override + String get removeYourAvatar => 'Remove your avatar'; + + @override + String get replaceRoomWithNewerVersion => 'Replace room with newer version'; + + @override + String get reply => 'Reply'; + + @override + String get reportMessage => 'Report message'; + + @override + String get translateMessage => 'Translate message'; + + @override + String get translatedMessage => 'Translated message'; + + @override + String get errorTranslatingMessage => + 'An error has occured while translating the message.'; + + @override + String get recoverMessage => 'Recover message'; + + @override + String get recoveredMessage => 'Recovered message'; + + @override + String get errorRecoveringMessage => + 'An error has occured while recovering the message.'; + + @override + String get errorRecoveringMessageNoAdmin => + 'This feature is available on Synapse homeservers only for adminstrators.'; + + @override + String get requestPermission => 'Request permission'; + + @override + String get roomHasBeenUpgraded => 'Room has been upgraded'; + + @override + String get roomVersion => 'Room version'; + + @override + String get saveFile => 'Save file'; + + @override + String get retry => 'Retry'; + + @override + String get search => 'Pesquisar'; + + @override + String get security => 'Security'; + + @override + String get recoveryKey => 'Recovery key'; + + @override + String get recoveryKeyLost => 'Recovery key lost?'; + + @override + String seenByUser(String username) { + return 'Seen by $username'; + } + + @override + String get send => 'Send'; + + @override + String get sendAMessage => 'Send a message'; + + @override + String get sendAsText => 'Send as text'; + + @override + String get sendAudio => 'Send audio'; + + @override + String get sendFile => 'Send file'; + + @override + String get sendImage => 'Send image'; + + @override + String sendImages(int count) { + return 'Send $count image'; + } + + @override + String get sendMessages => 'Send messages'; + + @override + String get sendOriginal => 'Send original'; + + @override + String get sendSticker => 'Send sticker'; + + @override + String get sendVideo => 'Send video'; + + @override + String sentAFile(String username) { + return '📁 $username sent a file'; + } + + @override + String sentAnAudio(String username) { + return '🎤 $username sent an audio'; + } + + @override + String sentAPicture(String username) { + return '🖼️ $username sent a picture'; + } + + @override + String sentASticker(String username) { + return '😊 $username sent a sticker'; + } + + @override + String sentAVideo(String username) { + return '🎥 $username sent a video'; + } + + @override + String sentCallInformations(String senderName) { + return '$senderName sent call information'; + } + + @override + String get separateChatTypes => 'Separate Direct Chats and Groups'; + + @override + String get setAsCanonicalAlias => 'Set as main alias'; + + @override + String get setCustomEmotes => 'Set custom emotes'; + + @override + String get setChatDescription => 'Set chat description'; + + @override + String get setInvitationLink => 'Set invitation link'; + + @override + String get setPermissionsLevel => 'Set permissions level'; + + @override + String get setStatus => 'Set status'; + + @override + String get settings => 'Configurações'; + + @override + String get share => 'Share'; + + @override + String sharedTheLocation(String username) { + return '$username shared their location'; + } + + @override + String get shareLocation => 'Share location'; + + @override + String get showPassword => 'Show password'; + + @override + String get presenceStyle => 'Presence:'; + + @override + String get hideAvatarsInInvites => 'Hide avatars in invites'; + + @override + String get hideAvatarsInInvitesDescription => + 'Do not show room avatars in invites'; + + @override + String get presencesToggle => 'Show status messages from other users'; + + @override + String get pureBlackToggle => 'Pure Black'; + + @override + String get singlesignon => 'Single Sign on'; + + @override + String get skip => 'Skip'; + + @override + String get sourceCode => 'Source code'; + + @override + String get spaceIsPublic => 'Space is public'; + + @override + String get spaceName => 'Space name'; + + @override + String startedACall(String senderName) { + return '$senderName started a call'; + } + + @override + String get startFirstChat => 'Start your first chat'; + + @override + String get status => 'Status'; + + @override + String get statusExampleMessage => 'How are you today?'; + + @override + String get submit => 'Submit'; + + @override + String get synchronizingPleaseWait => 'Synchronizing… Please wait.'; + + @override + String synchronizingPleaseWaitCounter(String percentage) { + return ' Synchronizing… ($percentage%)'; + } + + @override + String get systemTheme => 'System'; + + @override + String get theyDontMatch => 'They Don\'t Match'; + + @override + String get theyMatch => 'They Match'; + + @override + String get title => 'Extera'; + + @override + String get toggleFavorite => 'Toggle Favorite'; + + @override + String get toggleMuted => 'Toggle Muted'; + + @override + String get toggleUnread => 'Mark Read/Unread'; + + @override + String get tooManyRequestsWarning => + 'Too many requests. Please try again later!'; + + @override + String get transferFromAnotherDevice => 'Transfer from another device'; + + @override + String get tryToSendAgain => 'Try to send again'; + + @override + String get unavailable => 'Unavailable'; + + @override + String unbannedUser(String username, String targetName) { + return '$username unbanned $targetName'; + } + + @override + String get unblockDevice => 'Unblock Device'; + + @override + String get unknownDevice => 'Unknown device'; + + @override + String get unknownEncryptionAlgorithm => 'Unknown encryption algorithm'; + + @override + String unknownEvent(String type) { + return 'Unknown event \'$type\''; + } + + @override + String get unmuteChat => 'Unmute chat'; + + @override + String get unpin => 'Unpin'; + + @override + String unreadChats(int unreadCount) { + String _temp0 = intl.Intl.pluralLogic( + unreadCount, + locale: localeName, + other: '$unreadCount unread chats', + one: '1 unread chat', + ); + return '$_temp0'; + } + + @override + String userAndOthersAreTyping(String username, int count) { + return '$username and $count others are typing…'; + } + + @override + String userAndUserAreTyping(String username, String username2) { + return '$username and $username2 are typing…'; + } + + @override + String userIsTyping(String username) { + return '$username is typing…'; + } + + @override + String userLeftTheChat(String username) { + return '🚪 $username left the chat'; + } + + @override + String get username => 'Username'; + + @override + String userSentUnknownEvent(String username, String type) { + return '$username sent a $type event'; + } + + @override + String get unverified => 'Unverified'; + + @override + String get verified => 'Verified'; + + @override + String get verify => 'Verify'; + + @override + String get verifyStart => 'Start Verification'; + + @override + String get verifySuccess => 'You successfully verified!'; + + @override + String get verifyTitle => 'Verifying other account'; + + @override + String get videoCall => 'Video call'; + + @override + String get visibilityOfTheChatHistory => 'Visibility of the chat history'; + + @override + String get visibleForAllParticipants => 'Visible for all participants'; + + @override + String get visibleForEveryone => 'Visible for everyone'; + + @override + String get voiceMessage => 'Voice message'; + + @override + String get waitingPartnerAcceptRequest => + 'Waiting for partner to accept the request…'; + + @override + String get waitingPartnerEmoji => 'Waiting for partner to accept the emoji…'; + + @override + String get waitingPartnerNumbers => + 'Waiting for partner to accept the numbers…'; + + @override + String get wallpaper => 'Wallpaper:'; + + @override + String get warning => 'Warning!'; + + @override + String get weSentYouAnEmail => 'We sent you an email'; + + @override + String get whoCanPerformWhichAction => 'Who can perform which action'; + + @override + String get whoIsAllowedToJoinThisGroup => 'Who is allowed to join this group'; + + @override + String get whyDoYouWantToReportThis => 'Why do you want to report this?'; + + @override + String get wipeChatBackup => + 'Wipe your chat backup to create a new recovery key?'; + + @override + String get withTheseAddressesRecoveryDescription => + 'With these addresses you can recover your password.'; + + @override + String get writeAMessage => 'Write a message…'; + + @override + String get yes => 'Yes'; + + @override + String get you => 'You'; + + @override + String get youAreNoLongerParticipatingInThisChat => + 'You are no longer participating in this chat'; + + @override + String get youHaveBeenBannedFromThisChat => + 'You have been banned from this chat'; + + @override + String get yourPublicKey => 'Your public key'; + + @override + String get messageInfo => 'Message info'; + + @override + String get time => 'Time'; + + @override + String get messageType => 'Message Type'; + + @override + String get sender => 'Sender'; + + @override + String get openGallery => 'Open gallery'; + + @override + String get removeFromSpace => 'Remove from space'; + + @override + String get addToSpaceDescription => 'Select a space to add this chat to it.'; + + @override + String get start => 'Start'; + + @override + String get pleaseEnterRecoveryKeyDescription => + 'To unlock your old messages, please enter your recovery key that has been generated in a previous session. Your recovery key is NOT your password.'; + + @override + String get publish => 'Publish'; + + @override + String videoWithSize(String size) { + return 'Video ($size)'; + } + + @override + String get openChat => 'Open Chat'; + + @override + String get markAsRead => 'Mark as read'; + + @override + String get reportUser => 'Report user'; + + @override + String get dismiss => 'Dismiss'; + + @override + String reactedWith(String sender, String reaction) { + return '$sender reacted with $reaction'; + } + + @override + String get pinMessage => 'Pin to room'; + + @override + String get confirmEventUnpin => + 'Are you sure to permanently unpin the event?'; + + @override + String get emojis => 'Emojis'; + + @override + String get placeCall => 'Place call'; + + @override + String get voiceCall => 'Voice call'; + + @override + String get unsupportedAndroidVersion => 'Unsupported Android version'; + + @override + String get unsupportedAndroidVersionLong => + 'This feature requires a newer Android version. Please check for updates or Lineage OS support.'; + + @override + String get videoCallsBetaWarning => + 'Please note that video calls are currently in beta. They might not work as expected or work at all on all platforms.'; + + @override + String get experimentalVideoCalls => 'Experimental video calls'; + + @override + String get emailOrUsername => 'Email or username'; + + @override + String get indexedDbErrorTitle => 'Private mode issues'; + + @override + String get indexedDbErrorLong => + 'The message storage is unfortunately not enabled in private mode by default.\nPlease visit\n - about:config\n - set dom.indexedDB.privateBrowsing.enabled to true\nOtherwise, it is not possible to run Extera.'; + + @override + String switchToAccount(String number) { + return 'Switch to account $number'; + } + + @override + String get nextAccount => 'Next account'; + + @override + String get previousAccount => 'Previous account'; + + @override + String get addWidget => 'Add widget'; + + @override + String get widgetVideo => 'Video'; + + @override + String get widgetEtherpad => 'Text note'; + + @override + String get widgetJitsi => 'Jitsi Meet'; + + @override + String get widgetCustom => 'Custom'; + + @override + String get widgetName => 'Name'; + + @override + String get widgetUrlError => 'This is not a valid URL.'; + + @override + String get widgetNameError => 'Please provide a display name.'; + + @override + String get errorAddingWidget => 'Error adding the widget.'; + + @override + String get youRejectedTheInvitation => 'You rejected the invitation'; + + @override + String get youJoinedTheChat => 'You joined the chat'; + + @override + String get youAcceptedTheInvitation => '👍 You accepted the invitation'; + + @override + String youBannedUser(String user) { + return 'You banned $user'; + } + + @override + String youHaveWithdrawnTheInvitationFor(String user) { + return 'You have withdrawn the invitation for $user'; + } + + @override + String youInvitedToBy(String alias) { + return '📩 You have been invited via link to:\n$alias'; + } + + @override + String youInvitedBy(String user) { + return '📩 You have been invited by $user'; + } + + @override + String invitedBy(String user) { + return '📩 Invited by $user'; + } + + @override + String youInvitedUser(String user) { + return '📩 You invited $user'; + } + + @override + String youKicked(String user) { + return '👞 You kicked $user'; + } + + @override + String youKickedAndBanned(String user) { + return '🙅 You kicked and banned $user'; + } + + @override + String youUnbannedUser(String user) { + return 'You unbanned $user'; + } + + @override + String hasKnocked(String user) { + return '🚪 $user has knocked'; + } + + @override + String get usersMustKnock => 'Users must knock'; + + @override + String get noOneCanJoin => 'No one can join'; + + @override + String userWouldLikeToChangeTheChat(String user) { + return '$user would like to join the chat.'; + } + + @override + String get noPublicLinkHasBeenCreatedYet => + 'No public link has been created yet'; + + @override + String get knock => 'Knock'; + + @override + String get users => 'Utilizadores'; + + @override + String get unlockOldMessages => 'Unlock old messages'; + + @override + String get storeInSecureStorageDescription => + 'Store the recovery key in the secure storage of this device.'; + + @override + String get saveKeyManuallyDescription => + 'Save this key manually by triggering the system share dialog or clipboard.'; + + @override + String get storeInAndroidKeystore => 'Store in Android KeyStore'; + + @override + String get storeInAppleKeyChain => 'Store in Apple KeyChain'; + + @override + String get storeSecurlyOnThisDevice => 'Store securely on this device'; + + @override + String countFiles(int count) { + return '$count files'; + } + + @override + String get user => 'User'; + + @override + String get custom => 'Custom'; + + @override + String get foregroundServiceRunning => + 'This notification appears when the foreground service is running.'; + + @override + String get screenSharingTitle => 'screen sharing'; + + @override + String get screenSharingDetail => 'You are sharing your screen in Extera'; + + @override + String get callingPermissions => 'Calling permissions'; + + @override + String get callingAccount => 'Calling account'; + + @override + String get callingAccountDetails => + 'Allows Extera to use the native android dialer app.'; + + @override + String get appearOnTop => 'Appear on top'; + + @override + String get appearOnTopDetails => + 'Allows the app to appear on top (not needed if you already have Fluffychat setup as a calling account)'; + + @override + String get otherCallingPermissions => + 'Microphone, camera and other Extera permissions'; + + @override + String get whyIsThisMessageEncrypted => 'Why is this message unreadable?'; + + @override + String get noKeyForThisMessage => + 'This can happen if the message was sent before you have signed in to your account at this device.\n\nIt is also possible that the sender has blocked your device or something went wrong with the internet connection.\n\nAre you able to read the message on another session? Then you can transfer the message from it! Go to Settings > Devices and make sure that your devices have verified each other. When you open the room the next time and both sessions are in the foreground, the keys will be transmitted automatically.\n\nDo you not want to lose the keys when logging out or switching devices? Make sure that you have enabled the chat backup in the settings.'; + + @override + String get newGroup => 'New group'; + + @override + String get newSpace => 'New space'; + + @override + String get enterSpace => 'Enter space'; + + @override + String get enterRoom => 'Enter room'; + + @override + String get allSpaces => 'All spaces'; + + @override + String numChats(String number) { + return '$number chats'; + } + + @override + String get hideUnimportantStateEvents => 'Hide unimportant state events'; + + @override + String get hidePresences => 'Hide Status List?'; + + @override + String get doNotShowAgain => 'Do not show again'; + + @override + String wasDirectChatDisplayName(String oldDisplayName) { + return 'Empty chat (was $oldDisplayName)'; + } + + @override + String get newSpaceDescription => + 'Spaces allows you to consolidate your chats and build private or public communities.'; + + @override + String get encryptThisChat => 'Encrypt this chat'; + + @override + String get disableEncryptionWarning => + 'For security reasons you can not disable encryption in a chat, where it has been enabled before.'; + + @override + String get sorryThatsNotPossible => 'Sorry... that is not possible'; + + @override + String get deviceKeys => 'Device keys:'; + + @override + String get reopenChat => 'Reopen chat'; + + @override + String get noBackupWarning => + 'Warning! Without enabling chat backup, you will lose access to your encrypted messages. It is highly recommended to enable the chat backup first before logging out.'; + + @override + String get noOtherDevicesFound => 'No other devices found'; + + @override + String fileIsTooBigForServer(String max) { + return 'Unable to send! The server only supports attachments up to $max.'; + } + + @override + String fileHasBeenSavedAt(String path) { + return 'File has been saved at $path'; + } + + @override + String get jumpToLastReadMessage => 'Jump to last read message'; + + @override + String get readUpToHere => 'Read up to here'; + + @override + String get jump => 'Jump'; + + @override + String get openLinkInBrowser => 'Open link in browser'; + + @override + String get reportErrorDescription => + '😭 Oh no. Something went wrong. If you want, you can report this bug to the developers.'; + + @override + String get report => 'Report'; + + @override + String get signInWithPassword => 'Sign in with password'; + + @override + String get pleaseTryAgainLaterOrChooseDifferentServer => + 'Please try again later or choose a different server.'; + + @override + String signInWith(String provider) { + return 'Sign in with $provider'; + } + + @override + String get profileNotFound => + 'The user could not be found on the server. Maybe there is a connection problem or the user doesn\'t exist.'; + + @override + String get setTheme => 'Set theme:'; + + @override + String get setColorTheme => 'Set color theme:'; + + @override + String get invite => 'Invite'; + + @override + String get inviteGroupChat => '📨 Invite group chat'; + + @override + String get invitePrivateChat => '📨 Invite private chat'; + + @override + String get invalidInput => 'Invalid input!'; + + @override + String wrongPinEntered(int seconds) { + return 'Wrong pin entered! Try again in $seconds seconds...'; + } + + @override + String get pleaseEnterANumber => 'Please enter a number greater than 0'; + + @override + String get archiveRoomDescription => + 'The chat will be moved to the archive. Other users will be able to see that you have left the chat.'; + + @override + String get roomUpgradeDescription => + 'The chat will then be recreated with the new room version. All participants will be notified that they need to switch to the new chat. You can find out more about room versions at https://spec.matrix.org/latest/rooms/'; + + @override + String get removeDevicesDescription => + 'You will be logged out of this device and will no longer be able to receive messages.'; + + @override + String get banUserDescription => + 'The user will be banned from the chat and will not be able to enter the chat again until they are unbanned.'; + + @override + String get unbanUserDescription => + 'The user will be able to enter the chat again if they try.'; + + @override + String get kickUserDescription => + 'The user is kicked out of the chat but not banned. In public chats, the user can rejoin at any time.'; + + @override + String get makeAdminDescription => + 'Once you make this user admin, you may not be able to undo this as they will then have the same permissions as you.'; + + @override + String get pushNotificationsNotAvailable => + 'Push notifications not available'; + + @override + String get learnMore => 'Learn more'; + + @override + String get yourGlobalUserIdIs => 'Your global user-ID is: '; + + @override + String noUsersFoundWithQuery(String query) { + return 'Unfortunately no user could be found with \"$query\". Please check whether you made a typo.'; + } + + @override + String get knocking => 'Knocking'; + + @override + String chatCanBeDiscoveredViaSearchOnServer(String server) { + return 'Chat can be discovered via the search on $server'; + } + + @override + String get searchChatsRooms => 'Search for #chats, @users...'; + + @override + String get nothingFound => 'Nothing found...'; + + @override + String get groupName => 'Group name'; + + @override + String get createGroupAndInviteUsers => 'Create a group and invite users'; + + @override + String get groupCanBeFoundViaSearch => 'Group can be found via search'; + + @override + String get wrongRecoveryKey => + 'Sorry... this does not seem to be the correct recovery key.'; + + @override + String get startConversation => 'Start conversation'; + + @override + String get commandHint_sendraw => 'Send raw json'; + + @override + String get databaseMigrationTitle => 'Database is optimized'; + + @override + String get databaseMigrationBody => 'Please wait. This may take a moment.'; + + @override + String get leaveEmptyToClearStatus => 'Leave empty to clear your status.'; + + @override + String get select => 'Select'; + + @override + String get searchForUsers => 'Search for @users...'; + + @override + String get pleaseEnterYourCurrentPassword => + 'Please enter your current password'; + + @override + String get newPassword => 'New password'; + + @override + String get pleaseChooseAStrongPassword => 'Please choose a strong password'; + + @override + String get passwordsDoNotMatch => 'Passwords do not match'; + + @override + String get passwordIsWrong => 'Your entered password is wrong'; + + @override + String get publicLink => 'Public link'; + + @override + String get publicChatAddresses => 'Public chat addresses'; + + @override + String get createNewAddress => 'Create new address'; + + @override + String get joinSpace => 'Join space'; + + @override + String get publicSpaces => 'Public spaces'; + + @override + String get addChatOrSubSpace => 'Add chat or sub space'; + + @override + String get subspace => 'Subspace'; + + @override + String get decline => 'Decline'; + + @override + String get thisDevice => 'This device:'; + + @override + String get initAppError => 'An error occured while init the app'; + + @override + String get userRole => 'User role'; + + @override + String minimumPowerLevel(String level) { + return '$level is the minimum power level.'; + } + + @override + String searchIn(String chat) { + return 'Search in chat \"$chat\"...'; + } + + @override + String get searchMore => 'Search more...'; + + @override + String get gallery => 'Gallery'; + + @override + String get files => 'Files'; + + @override + String databaseBuildErrorBody(String url, String error) { + return 'Unable to build the SQlite database. The app tries to use the legacy database for now. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String sessionLostBody(String url, String error) { + return 'Your session is lost. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String restoreSessionBody(String url, String error) { + return 'The app now tries to restore your session from the backup. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String forwardMessageTo(String roomName) { + return 'Forward message to $roomName?'; + } + + @override + String get sendReadReceipts => 'Send read receipts'; + + @override + String get sendTypingNotificationsDescription => + 'Other participants in a chat can see when you are typing a new message.'; + + @override + String get sendReadReceiptsDescription => + 'Other participants in a chat can see when you have read a message.'; + + @override + String get formattedMessages => 'Formatted messages'; + + @override + String get formattedMessagesDescription => + 'Display rich message content like bold text using markdown.'; + + @override + String get verifyOtherUser => '🔐 Verify other user'; + + @override + String get verifyOtherUserDescription => + 'If you verify another user, you can be sure that you know who you are really writing to. 💪\n\nWhen you start a verification, you and the other user will see a popup in the app. There you will then see a series of emojis or numbers that you have to compare with each other.\n\nThe best way to do this is to meet up or start a video call. 👭'; + + @override + String get verifyOtherDevice => '🔐 Verify other device'; + + @override + String get verifyOtherDeviceDescription => + 'When you verify another device, those devices can exchange keys, increasing your overall security. 💪 When you start a verification, a popup will appear in the app on both devices. There you will then see a series of emojis or numbers that you have to compare with each other. It\'s best to have both devices handy before you start the verification. 🤳'; + + @override + String acceptedKeyVerification(String sender) { + return '$sender accepted key verification'; + } + + @override + String canceledKeyVerification(String sender) { + return '$sender canceled key verification'; + } + + @override + String completedKeyVerification(String sender) { + return '$sender completed key verification'; + } + + @override + String isReadyForKeyVerification(String sender) { + return '$sender is ready for key verification'; + } + + @override + String requestedKeyVerification(String sender) { + return '$sender requested key verification'; + } + + @override + String startedKeyVerification(String sender) { + return '$sender started key verification'; + } + + @override + String get transparent => 'Transparent'; + + @override + String get incomingMessages => 'Incoming messages'; + + @override + String get stickers => 'Stickers'; + + @override + String get discover => 'Discover'; + + @override + String get commandHint_ignore => 'Ignore the given matrix ID'; + + @override + String get commandHint_unignore => 'Unignore the given matrix ID'; + + @override + String unreadChatsInApp(String appname, String unread) { + return '$appname: $unread unread chats'; + } + + @override + String get noDatabaseEncryption => + 'Database encryption is not supported on this platform'; + + @override + String thereAreCountUsersBlocked(Object count) { + return 'Right now there are $count users blocked.'; + } + + @override + String get restricted => 'Restricted'; + + @override + String get knockRestricted => 'Knock restricted'; + + @override + String goToSpace(Object space) { + return 'Go to space: $space'; + } + + @override + String get markAsUnread => 'Mark as unread'; + + @override + String userLevel(int level) { + return '$level - User'; + } + + @override + String moderatorLevel(int level) { + return '$level - Moderator'; + } + + @override + String adminLevel(int level) { + return '$level - Admin'; + } + + @override + String get changeGeneralChatSettings => 'Change general chat settings'; + + @override + String get inviteOtherUsers => 'Invite other users to this chat'; + + @override + String get changeTheChatPermissions => 'Change the chat permissions'; + + @override + String get changeTheVisibilityOfChatHistory => + 'Change the visibility of the chat history'; + + @override + String get changeTheCanonicalRoomAlias => + 'Change the main public chat address'; + + @override + String get sendRoomNotifications => 'Send a @room notifications'; + + @override + String get changeTheDescriptionOfTheGroup => + 'Change the description of the chat'; + + @override + String get chatPermissionsDescription => + 'Define which power level is necessary for certain actions in this chat. The power levels 0, 50 and 100 are usually representing users, moderators and admins, but any gradation is possible.'; + + @override + String updateInstalled(String version) { + return '🎉 Update $version installed!'; + } + + @override + String get changelog => 'Changelog'; + + @override + String get sendCanceled => 'Sending canceled'; + + @override + String get loginWithMatrixId => 'Login with Matrix-ID'; + + @override + String get discoverHomeservers => 'Discover homeservers'; + + @override + String get whatIsAHomeserver => 'What is a homeserver?'; + + @override + String get homeserverDescription => + 'All your data is stored on the homeserver, just like an email provider. You can choose which homeserver you want to use, while you can still communicate with everyone. Learn more at at https://matrix.org.'; + + @override + String get doesNotSeemToBeAValidHomeserver => + 'Doesn\'t seem to be a compatible homeserver. Wrong URL?'; + + @override + String get calculatingFileSize => 'Calculating file size...'; + + @override + String get prepareSendingAttachment => 'Prepare sending attachment...'; + + @override + String get sendingAttachment => 'Sending attachment...'; + + @override + String get generatingVideoThumbnail => 'Generating video thumbnail...'; + + @override + String get compressVideo => 'Compressing video...'; + + @override + String sendingAttachmentCountOfCount(int index, int length) { + return 'Sending attachment $index of $length...'; + } + + @override + String serverLimitReached(int seconds) { + return 'Server limit reached! Waiting $seconds seconds...'; + } + + @override + String get oneOfYourDevicesIsNotVerified => + 'One of your devices is not verified'; + + @override + String get noticeChatBackupDeviceVerification => + 'Note: When you connect all your devices to the chat backup, they are automatically verified.'; + + @override + String get continueText => 'Continue'; + + @override + String get welcomeText => + 'Hey Hey 👋 This is Extera. You can sign in to any homeserver, which is compatible with https://matrix.org. And then chat with anyone. It\'s a huge decentralized messaging network!'; + + @override + String get blur => 'Blur:'; + + @override + String get opacity => 'Opacity:'; + + @override + String get setWallpaper => 'Set wallpaper'; + + @override + String get manageAccount => 'Manage account'; + + @override + String get noContactInformationProvided => + 'Server does not provide any valid contact information'; + + @override + String get contactServerAdmin => 'Contact server admin'; + + @override + String get contactServerSecurity => 'Contact server security'; + + @override + String get supportPage => 'Support page'; + + @override + String get serverInformation => 'Server information:'; + + @override + String get name => 'Name'; + + @override + String get version => 'Version'; + + @override + String get website => 'Website'; + + @override + String get compress => 'Compress'; + + @override + String get boldText => 'Bold text'; + + @override + String get italicText => 'Italic text'; + + @override + String get strikeThrough => 'Strikethrough'; + + @override + String get pleaseFillOut => 'Please fill out'; + + @override + String get invalidUrl => 'Invalid url'; + + @override + String get addLink => 'Add link'; + + @override + String get unableToJoinChat => + 'Unable to join chat. Maybe the other party has already closed the conversation.'; + + @override + String get previous => 'Previous'; + + @override + String get otherPartyNotLoggedIn => + 'The other party is currently not logged in and therefore cannot receive messages!'; + + @override + String appWantsToUseForLogin(String server) { + return 'Use \'$server\' to log in'; + } + + @override + String get appWantsToUseForLoginDescription => + 'You hereby allow the app and website to share information about you.'; + + @override + String get open => 'Open'; + + @override + String get waitingForServer => 'Waiting for server...'; + + @override + String get appIntroduction => + 'Extera lets you chat with your friends across different messengers. Learn more at https://matrix.org or just tap *Continue*.'; + + @override + String get newChatRequest => '📩 New chat request'; + + @override + String get contentNotificationSettings => 'Content notification settings'; + + @override + String get generalNotificationSettings => 'General notification settings'; + + @override + String get roomNotificationSettings => 'Room notification settings'; + + @override + String get userSpecificNotificationSettings => + 'User specific notification settings'; + + @override + String get otherNotificationSettings => 'Other notification settings'; + + @override + String get notificationRuleContainsUserName => 'Contains User Name'; + + @override + String get notificationRuleContainsUserNameDescription => + 'Notifies the user when a message contains their username.'; + + @override + String get notificationRuleMaster => 'Mute all notifications'; + + @override + String get notificationRuleMasterDescription => + 'Overrides all other rules and disables all notifications.'; + + @override + String get notificationRuleSuppressNotices => 'Suppress Automated Messages'; + + @override + String get notificationRuleSuppressNoticesDescription => + 'Suppresses notifications from automated clients like bots.'; + + @override + String get notificationRuleInviteForMe => 'Invite for Me'; + + @override + String get notificationRuleInviteForMeDescription => + 'Notifies the user when they are invited to a room.'; + + @override + String get notificationRuleMemberEvent => 'Member Event'; + + @override + String get notificationRuleMemberEventDescription => + 'Suppresses notifications for membership events.'; + + @override + String get notificationRuleIsUserMention => 'User Mention'; + + @override + String get notificationRuleIsUserMentionDescription => + 'Notifies the user when they are directly mentioned in a message.'; + + @override + String get notificationRuleContainsDisplayName => 'Contains Display Name'; + + @override + String get notificationRuleContainsDisplayNameDescription => + 'Notifies the user when a message contains their display name.'; + + @override + String get notificationRuleIsRoomMention => 'Room Mention'; + + @override + String get notificationRuleIsRoomMentionDescription => + 'Notifies the user when there is a room mention.'; + + @override + String get notificationRuleRoomnotif => 'Room Notification'; + + @override + String get notificationRuleRoomnotifDescription => + 'Notifies the user when a message contains \'@room\'.'; + + @override + String get notificationRuleTombstone => 'Tombstone'; + + @override + String get notificationRuleTombstoneDescription => + 'Notifies the user about room deactivation messages.'; + + @override + String get notificationRuleReaction => 'Reaction'; + + @override + String get notificationRuleReactionDescription => + 'Suppresses notifications for reactions.'; + + @override + String get notificationRuleRoomServerAcl => 'Room Server ACL'; + + @override + String get notificationRuleRoomServerAclDescription => + 'Suppresses notifications for room server access control lists (ACL).'; + + @override + String get notificationRuleSuppressEdits => 'Suppress Edits'; + + @override + String get notificationRuleSuppressEditsDescription => + 'Suppresses notifications for edited messages.'; + + @override + String get notificationRuleCall => 'Call'; + + @override + String get notificationRuleCallDescription => + 'Notifies the user about calls.'; + + @override + String get notificationRuleEncryptedRoomOneToOne => + 'Encrypted Room One-to-One'; + + @override + String get notificationRuleEncryptedRoomOneToOneDescription => + 'Notifies the user about messages in encrypted one-to-one rooms.'; + + @override + String get notificationRuleRoomOneToOne => 'Room One-to-One'; + + @override + String get notificationRuleRoomOneToOneDescription => + 'Notifies the user about messages in one-to-one rooms.'; + + @override + String get notificationRuleMessage => 'Message'; + + @override + String get notificationRuleMessageDescription => + 'Notifies the user about general messages.'; + + @override + String get notificationRuleEncrypted => 'Encrypted'; + + @override + String get notificationRuleEncryptedDescription => + 'Notifies the user about messages in encrypted rooms.'; + + @override + String get notificationRuleJitsi => 'Jitsi'; + + @override + String get notificationRuleJitsiDescription => + 'Notifies the user about Jitsi widget events.'; + + @override + String get notificationRuleServerAcl => 'Suppress Server ACL Events'; + + @override + String get notificationRuleServerAclDescription => + 'Suppresses notifications for Server ACL events.'; + + @override + String unknownPushRule(String rule) { + return 'Unknown push rule \'$rule\''; + } + + @override + String get deletePushRuleCanNotBeUndone => + 'If you delete this notification setting, this can not be undone.'; + + @override + String get more => 'More'; + + @override + String get shareKeysWith => 'Share keys with...'; + + @override + String get shareKeysWithDescription => + 'Which devices should be trusted so that they can read along your messages in encrypted chats?'; + + @override + String get allDevices => 'All devices'; + + @override + String get crossVerifiedDevicesIfEnabled => + 'Cross verified devices if enabled'; + + @override + String get crossVerifiedDevices => 'Cross verified devices'; + + @override + String get verifiedDevicesOnly => 'Verified devices only'; + + @override + String get takeAPhoto => 'Take a photo'; + + @override + String get recordAVideo => 'Record a video'; + + @override + String get optionalMessage => '(Optional) message...'; + + @override + String get notSupportedOnThisDevice => 'Not supported on this device'; + + @override + String get enterNewChat => 'Enter new chat'; + + @override + String get approve => 'Approve'; + + @override + String get youHaveKnocked => 'You have knocked'; + + @override + String get pleaseWaitUntilInvited => + 'Please wait now, until someone from the room invites you.'; +} + +/// The translations for Portuguese, as used in Brazil (`pt_BR`). +class L10nPtBr extends L10nPt { + L10nPtBr() : super('pt_BR'); + + @override + String get repeatPassword => 'Repita a senha'; + + @override + String get notAnImage => 'Não é uma imagem.'; + + @override + String get remove => 'Remover'; + + @override + String get importNow => 'Importar agora'; + + @override + String get importEmojis => 'Importar Emojis'; + + @override + String get importFromZipFile => 'Importar de arquivo .zip'; + + @override + String get exportEmotePack => 'Exportar pacote de Emotes como .zip'; + + @override + String get replace => 'Substituir'; + + @override + String get about => 'Sobre'; + + @override + String get accept => 'Aceitar'; + + @override + String acceptedTheInvitation(String username) { + return '👍 $username aceitou o convite'; + } + + @override + String get account => 'Conta'; + + @override + String activatedEndToEndEncryption(String username) { + return '🔐 $username ativou a criptografia ponta-a-ponta'; + } + + @override + String get addEmail => 'Adicionar email'; + + @override + String get confirmMatrixId => + 'Por favor, confirme seu ID Matrix para apagar sua conta.'; + + @override + String supposedMxid(String mxid) { + return 'Isto deveria ser $mxid'; + } + + @override + String get addChatDescription => 'Inserir descrição da conversa...'; + + @override + String get addToSpace => 'Adicionar ao espaço'; + + @override + String get admin => 'Admin'; + + @override + String get alias => 'cognome'; + + @override + String get all => 'Todas'; + + @override + String get allChats => 'Todas as conversas'; + + @override + String get commandHint_googly => 'Enviar olhos arregalados'; + + @override + String get commandHint_cuddle => 'Enviar um afago'; + + @override + String get commandHint_hug => 'Enviar um abraço'; + + @override + String googlyEyesContent(String senderName) { + return '$senderName enviou olhos arregalados'; + } + + @override + String cuddleContent(String senderName) { + return '$senderName afagou você'; + } + + @override + String hugContent(String senderName) { + return '$senderName abraçou você'; + } + + @override + String answeredTheCall(String senderName) { + return '$senderName atendeu à chamada'; + } + + @override + String get anyoneCanJoin => 'Qualquer pessoa pode participar'; + + @override + String get appLock => 'Trava do aplicativo'; + + @override + String get appLockDescription => + 'Bloquear o app com um código PIN quando não estiver usando'; + + @override + String get archive => 'Arquivo'; + + @override + String get areGuestsAllowedToJoin => 'Usuários convidados podem participar'; + + @override + String get areYouSure => 'Tem certeza?'; + + @override + String get areYouSureYouWantToLogout => + 'Tem certeza que deseja encerrar a sessão?'; + + @override + String get askSSSSSign => + 'Para poder validar a outra pessoa, por favor, insira sua frase secreta ou chave de recuperação.'; + + @override + String askVerificationRequest(String username) { + return 'Aceitar esta solicitação de verificação de $username?'; + } + + @override + String get autoplayImages => + 'Reproduzir automaticamente figurinhas animadas e emojis'; + + @override + String badServerLoginTypesException(String serverVersions, + String supportedVersions, Object suportedVersions) { + return 'O servidor matriz suporta os tipos de login:\n$serverVersions\nMas este app suporta apenas:\n$supportedVersions'; + } + + @override + String get sendTypingNotifications => 'Enviar notificações de digitação'; + + @override + String get sendOnEnter => 'Enviar ao pressionar enter'; + + @override + String badServerVersionsException(String serverVersions, + String supportedVersions, Object serverVerions, Object suportedVersions) { + return 'O servidor matriz suporta as versões Spec:\n$serverVersions\nMas este app suporta apenas $supportedVersions'; + } + + @override + String get banFromChat => 'Banir da conversa'; + + @override + String get banned => 'Banido'; + + @override + String bannedUser(String username, String targetName) { + return '$username baniu $targetName'; + } + + @override + String get blockDevice => 'Bloquear dispositivo'; + + @override + String get blocked => 'Bloqueado'; + + @override + String get botMessages => 'Mensagens de robôs'; + + @override + String get cancel => 'Cancelar'; + + @override + String cantOpenUri(String uri) { + return 'Não foi possível abrir a URI $uri'; + } + + @override + String get changeDeviceName => 'Alterar o nome do dispositivo'; + + @override + String changedTheChatAvatar(String username) { + return '$username alterou o avatar da conversa'; + } + + @override + String changedTheChatDescriptionTo(String username, String description) { + return '$username alterou a descrição da conversa para: \'$description\''; + } + + @override + String changedTheChatNameTo(String username, String chatname) { + return '$username alterou o nome da conversa para: \'$chatname\''; + } + + @override + String changedTheChatPermissions(String username) { + return '$username alterou as permissões na conversa'; + } + + @override + String changedTheDisplaynameTo(String username, String displayname) { + return '$username mudou o seu nome de exibição para: \'$displayname\''; + } + + @override + String changedTheGuestAccessRules(String username) { + return '$username alterou as regras de acesso dos convidados'; + } + + @override + String changedTheGuestAccessRulesTo(String username, String rules) { + return '$username alterou as regras de acesso dos convidados para: $rules'; + } + + @override + String changedTheHistoryVisibility(String username) { + return '$username alterou a visibilidade do histórico'; + } + + @override + String changedTheHistoryVisibilityTo(String username, String rules) { + return '$username alterou a visibilidade do histórico para: $rules'; + } + + @override + String changedTheJoinRules(String username) { + return '$username alterou as regras para participação'; + } + + @override + String changedTheJoinRulesTo(String username, String joinRules) { + return '$username alterou as regras para participação para: $joinRules'; + } + + @override + String changedTheProfileAvatar(String username) { + return '$username alterou seu avatar'; + } + + @override + String changedTheRoomAliases(String username) { + return '$username alterou os cognomes da sala'; + } + + @override + String changedTheRoomInvitationLink(String username) { + return '$username alterou o link de convite'; + } + + @override + String get changePassword => 'Alterar a senha'; + + @override + String get changeTheHomeserver => 'Alterar o servidor matriz'; + + @override + String get changeTheme => 'Alterar o tema'; + + @override + String get changeTheNameOfTheGroup => 'Alterar o nome do grupo'; + + @override + String get changeYourAvatar => 'Alterar seu avatar'; + + @override + String get channelCorruptedDecryptError => 'A criptografia foi corrompida'; + + @override + String get chat => 'Conversas'; + + @override + String get yourChatBackupHasBeenSetUp => + 'Seu backup de conversas foi configurado.'; + + @override + String get chatBackup => 'Backup da conversa'; + + @override + String get chatBackupDescription => + 'Suas mensagens antigas são protegidas com sua chave de recuperação. Por favor, evite perdê-la.'; + + @override + String get chatDetails => 'Detalhes da conversa'; + + @override + String get chatHasBeenAddedToThisSpace => + 'A conversa foi adicionada a este espaço'; + + @override + String get chats => 'Conversas'; + + @override + String get chooseAStrongPassword => 'Escolha uma senha forte'; + + @override + String get clearArchive => 'Limpar arquivo'; + + @override + String get close => 'Fechar'; + + @override + String get commandHint_markasdm => + 'Marcar como conversa direta para o ID Matrix dado'; + + @override + String get commandHint_markasgroup => 'Marcar como grupo'; + + @override + String get commandHint_ban => 'Banir um(a) usuário(a) desta sala'; + + @override + String get commandHint_clearcache => 'Limpar dados temporários'; + + @override + String get commandHint_create => + 'Criar uma sala vazia.\nUse --no-encryption para desabilitar a criptografia'; + + @override + String get commandHint_discardsession => 'Descartar sessão'; + + @override + String get commandHint_dm => + 'Iniciar uma conversa direta\nUse --no-encryption para desabilitar a criptografia'; + + @override + String get commandHint_html => 'Enviar mensagem formatada em HTML'; + + @override + String get commandHint_invite => 'Convidar um(a) usuário(a) para esta sala'; + + @override + String get commandHint_join => 'Entrar numa sala'; + + @override + String get commandHint_kick => 'Remover um(a) usuário(a) desta sala'; + + @override + String get commandHint_leave => 'Sair desta sala'; + + @override + String get commandHint_me => 'Descrever você mesmo'; + + @override + String get commandHint_myroomavatar => + 'Determinar sua imagem para esta sala (via mxc-uri)'; + + @override + String get commandHint_myroomnick => + 'Determinar seu nome de exibição para esta sala'; + + @override + String get commandHint_op => + 'Determinar o grau de poderes de um(a) usuário(a) (padrão: 50)'; + + @override + String get commandHint_plain => 'Enviar mensagem sem formatação'; + + @override + String get commandHint_react => 'Enviar uma resposta como reação'; + + @override + String get commandHint_send => 'Enviar mensagem'; + + @override + String get commandHint_unban => + 'Revogar o banimento de um(a) usuário(a) desta sala'; + + @override + String get commandInvalid => 'Comando inválido'; + + @override + String commandMissing(String command) { + return '$command não é um comando.'; + } + + @override + String get compareEmojiMatch => 'Por favor compare os emojis'; + + @override + String get compareNumbersMatch => 'Por favor compare os números'; + + @override + String get configureChat => 'Configurar conversa'; + + @override + String get confirm => 'Confirma'; + + @override + String get connect => 'Conectar'; + + @override + String get contactHasBeenInvitedToTheGroup => + 'O contato foi convidado ao grupo'; + + @override + String get containsDisplayName => 'Contém nome de exibição'; + + @override + String get containsUserName => 'Contém nome de usuário'; + + @override + String get contentHasBeenReported => + 'O conteúdo foi denunciado para quem administra o servidor'; + + @override + String get copiedToClipboard => 'Copiado para área de transferência'; + + @override + String get copy => 'Copiar'; + + @override + String get copyToClipboard => 'Copiar para a área de transferência'; + + @override + String couldNotDecryptMessage(String error) { + return 'Não foi possível decriptar a mensagem: $error'; + } + + @override + String countParticipants(int count) { + return '$count participantes'; + } + + @override + String get create => 'Criar'; + + @override + String createdTheChat(String username) { + return '💬 $username criou a conversa'; + } + + @override + String get createGroup => 'Criar grupo'; + + @override + String get createNewSpace => 'Novo espaço'; + + @override + String get currentlyActive => 'Ativo'; + + @override + String get darkTheme => 'Escuro'; + + @override + String dateAndTimeOfDay(String date, String timeOfDay) { + return '$date, $timeOfDay'; + } + + @override + String dateWithoutYear(String month, String day) { + return '$day/$month'; + } + + @override + String dateWithYear(String year, String month, String day) { + return '$day/$month/$year'; + } + + @override + String get deactivateAccountWarning => + 'Isto desativará a conta do usuário. É irreversível! Tem certeza?'; + + @override + String get defaultPermissionLevel => 'Nível de permissão padrão'; + + @override + String get delete => 'Apagar'; + + @override + String get deleteAccount => 'Apagar conta'; + + @override + String get deleteMessage => 'Apagar mensagem'; + + @override + String get device => 'Dispositivo'; + + @override + String get deviceId => 'ID do dispositivo'; + + @override + String get devices => 'Dispositivos'; + + @override + String get directChats => 'Conversas diretas'; + + @override + String get allRooms => 'Todos os Chats em Grupo'; + + @override + String get displaynameHasBeenChanged => 'O nome de exibição foi alterado'; + + @override + String get downloadFile => 'Baixar arquivo'; + + @override + String get edit => 'Editar'; + + @override + String get editBlockedServers => 'Editar servidores bloqueados'; + + @override + String get chatPermissions => 'Permissões da conversa'; + + @override + String get editDisplayname => 'Editar nome de exibição'; + + @override + String get editRoomAliases => 'Editar cognome da sala'; + + @override + String get editRoomAvatar => 'Editar o avatar da sala'; + + @override + String get emoteExists => 'Emoji já existe!'; + + @override + String get emoteInvalid => 'Código emoji inválido!'; + + @override + String get emoteKeyboardNoRecents => 'Emotes recentes aparecem aqui...'; + + @override + String get emotePacks => 'Pacote de emoji para a sala'; + + @override + String get emoteSettings => 'Configuração dos Emoji'; + + @override + String get globalChatId => 'ID de chat global'; + + @override + String get accessAndVisibility => 'Acesso e visibilidade'; + + @override + String get accessAndVisibilityDescription => + 'Quem é permitido entrar nesse chat e como pode ser descoberto.'; + + @override + String get calls => 'Chamadas'; + + @override + String get customEmojisAndStickers => 'Emojis e stickers customizados'; + + @override + String get customEmojisAndStickersBody => + 'Adicionar ou compartilhar emojis ou stickers customizados que podem ser usados em qualquer chat.'; + + @override + String get emoteShortcode => 'Código Emoji'; + + @override + String get emoteWarnNeedToPick => + 'Você tem que escolher um código emoji e uma imagem!'; + + @override + String get emptyChat => 'Conversa vazia'; + + @override + String get enableEmotesGlobally => 'Habilitar globalmente o pacote de emoji'; + + @override + String get enableEncryption => 'Habilitar criptografia'; + + @override + String get enableEncryptionWarning => + 'Você não poderá desabilitar a criptografia posteriormente. Tem certeza?'; + + @override + String get encrypted => 'Criptografado'; + + @override + String get encryption => 'Criptografia'; + + @override + String get encryptionNotEnabled => 'A criptografia não está habilitada'; + + @override + String endedTheCall(String senderName) { + return '$senderName finalizou a chamada'; + } + + @override + String get enterAnEmailAddress => 'Inserir endereço de e-mail'; + + @override + String get homeserver => 'Servidor matriz'; + + @override + String get enterYourHomeserver => 'Insira um servidor matriz'; + + @override + String errorObtainingLocation(String error) { + return 'Erro ao obter local: $error'; + } + + @override + String get everythingReady => 'Tudo pronto!'; + + @override + String get extremeOffensive => 'Extremamente ofensivo'; + + @override + String get fileName => 'Nome do arquivo'; + + @override + String get fluffychat => 'FluffyChat'; + + @override + String get fontSize => 'Tamanho da fonte'; + + @override + String get forward => 'Encaminhar'; + + @override + String get fromJoining => 'Desde que entrou'; + + @override + String get fromTheInvitation => 'Desde o convite'; + + @override + String get goToTheNewRoom => 'Ir para a sala nova'; + + @override + String get group => 'Grupo'; + + @override + String get chatDescription => 'Descrição da conversa'; + + @override + String get chatDescriptionHasBeenChanged => 'Descrição da conversa alterada'; + + @override + String get groupIsPublic => 'Grupo público'; + + @override + String get groups => 'Grupos'; + + @override + String groupWith(String displayname) { + return 'Grupo com $displayname'; + } + + @override + String get guestsAreForbidden => 'Convidados estão proibidos'; + + @override + String get guestsCanJoin => 'Convidados podem participar'; + + @override + String hasWithdrawnTheInvitationFor(String username, String targetName) { + return '$username revogou o convite para $targetName'; + } + + @override + String get help => 'Ajuda'; + + @override + String get hideRedactedEvents => 'Ocultar eventos removidos'; + + @override + String get hideRedactedMessages => 'Esconder mensagens excluídas'; + + @override + String get hideRedactedMessagesBody => + 'Se alguém excluir uma mensagem, esta mensagem não será mais visível no chat.'; + + @override + String get hideInvalidOrUnknownMessageFormats => + 'Esconder formatos de mensagem inválidos ou desconhecidos'; + + @override + String get howOffensiveIsThisContent => 'O quão ofensivo é este conteúdo?'; + + @override + String get id => 'ID'; + + @override + String get identity => 'Identidade'; + + @override + String get block => 'Bloquear'; + + @override + String get blockedUsers => 'Usuários bloqueados'; + + @override + String get blockListDescription => + 'Você pode bloquear usuários que estejam perturbando. Você não receberá mensagens ou convites de usuários na sua lista pessoal de bloqueios.'; + + @override + String get blockUsername => 'Ignore usuário'; + + @override + String get iHaveClickedOnLink => 'Eu cliquei no link'; + + @override + String get incorrectPassphraseOrKey => + 'Frase secreta ou chave de recuperação incorreta'; + + @override + String get inoffensive => 'Inofensivo'; + + @override + String get inviteContact => 'Convidar contato'; + + @override + String inviteContactToGroupQuestion(Object contact, Object groupName) { + return 'Você quer convidar $contact para a conversa \"$groupName\"?'; + } + + @override + String inviteContactToGroup(String groupName) { + return 'Convidar contato para $groupName'; + } + + @override + String get noChatDescriptionYet => + 'Nenhuma descrição da conversa disponível.'; + + @override + String get tryAgain => 'Tente novamente'; + + @override + String get invalidServerName => 'Nome de usuário inválido'; + + @override + String get invited => 'Foi convidado'; + + @override + String get redactMessageDescription => + 'A mensagem será removida para todos participantes desta conversa. Isto não poderá ser desfeito.'; + + @override + String get optionalRedactReason => + '(Opcional) Motivo para remover esta mensagem.'; + + @override + String invitedUser(String username, String targetName) { + return '📩 $username convidou $targetName'; + } + + @override + String get invitedUsersOnly => 'Apenas usuários convidados'; + + @override + String get inviteForMe => 'Convite para mim'; + + @override + String inviteText(String username, String link) { + return '$username convidou você para o FluffyChat. \n1. Visite fluffychat.im e instale o aplicativo\n2. Entre ou crie uma conta \n3. Abra o link do convite:\n $link'; + } + + @override + String get isTyping => 'está escrevendo…'; + + @override + String joinedTheChat(String username) { + return '👋 $username entrou na conversa'; + } + + @override + String get joinRoom => 'Entrar na sala'; + + @override + String kicked(String username, String targetName) { + return '👞 $username enxotou $targetName'; + } + + @override + String kickedAndBanned(String username, String targetName) { + return '🙅 $username expulsou e baniu $targetName'; + } + + @override + String get kickFromChat => 'Expulso da conversa'; + + @override + String lastActiveAgo(String localizedTimeShort) { + return 'Última vez ativo: $localizedTimeShort'; + } + + @override + String get leave => 'Sair'; + + @override + String get leftTheChat => 'Sair da conversa'; + + @override + String get license => 'Licença'; + + @override + String get lightTheme => 'Claro'; + + @override + String loadCountMoreParticipants(int count) { + return 'Carregue $count mais participantes'; + } + + @override + String get dehydrate => 'Exportar sessão e limpar dispositivo'; + + @override + String get dehydrateWarning => + 'Esta ação não pode ser desfeita. Certifique-se de que o arquivo backup está guardado e seguro.'; + + @override + String get dehydrateTor => 'Usuários TOR: Exportar sessão'; + + @override + String get dehydrateTorLong => + 'Para usuários TOR, é recomendado exportar a sessão antes de fechar a janela.'; + + @override + String get hydrateTor => 'Usuários TOR: Importar sessão'; + + @override + String get hydrateTorLong => + 'Você exportou sua última sessão no TOR? Importe ela rapidamente e continue conversando.'; + + @override + String get hydrate => 'Restaurar a partir de arquivo backup'; + + @override + String get loadingPleaseWait => 'Carregando... Aguarde.'; + + @override + String get loadMore => 'Carregando mais…'; + + @override + String get locationDisabledNotice => + 'O serviço de localização está desabilitado. Por favor, habilite-o para compartilhar sua localização.'; + + @override + String get locationPermissionDeniedNotice => + 'Permissão de localização negada. Conceda as permissões para habilitar o compartilhamento de localização.'; + + @override + String get login => 'Iniciar sessão'; + + @override + String logInTo(String homeserver) { + return 'Conectar a $homeserver'; + } + + @override + String get logout => 'Encerrar sessão'; + + @override + String get memberChanges => 'Alterações de membros'; + + @override + String get mention => 'Mencionar'; + + @override + String get messages => 'Mensagens'; + + @override + String get messagesStyle => 'Mensagens:'; + + @override + String get moderator => 'Moderador'; + + @override + String get muteChat => 'Silenciar'; + + @override + String get needPantalaimonWarning => + 'Por favor, observe que, por enquanto, você precisa do Pantalaimon para usar criptografia ponta-a-ponta.'; + + @override + String get newChat => 'Nova conversa'; + + @override + String get newMessageInFluffyChat => '💬 Nova mensagem no FluffyChat'; + + @override + String get newVerificationRequest => 'Nova solicitação de verificação!'; + + @override + String get next => 'Próximo'; + + @override + String get no => 'Não'; + + @override + String get noConnectionToTheServer => 'Sem conexão com o servidor'; + + @override + String get noEmotesFound => 'Nenhum emoji encontrado. 😕'; + + @override + String get noEncryptionForPublicRooms => + 'Você só pode ativar criptografia quando a sala não for mais publicamente acessível.'; + + @override + String get noGoogleServicesWarning => + 'Aparentemente você não tem serviços Google no seu celular. Para receber notificações no FluffyChat, recomendamos instalar ntfy.'; + + @override + String noMatrixServer(String server1, String server2) { + return '$server1 não é um servidor matrix, usar $server2 talvez?'; + } + + @override + String get shareInviteLink => 'Compartilhar convite'; + + @override + String get scanQrCode => 'Escanear o código QR'; + + @override + String get none => 'Nenhum'; + + @override + String get noPasswordRecoveryDescription => + 'Você ainda não adicionou uma forma de recuparar sua senha.'; + + @override + String get noPermission => 'Sem permissão'; + + @override + String get noRoomsFound => 'Nenhuma sala encontrada…'; + + @override + String get notifications => 'Notificações'; + + @override + String get notificationsEnabledForThisAccount => + 'Notificações habilitadas para esta conta'; + + @override + String numUsersTyping(int count) { + return '$count usuários estão digitando…'; + } + + @override + String get obtainingLocation => 'Obtendo localização…'; + + @override + String get offensive => 'Ofensivo'; + + @override + String get offline => 'Desconectado'; + + @override + String get ok => 'Ok'; + + @override + String get online => 'Disponível'; + + @override + String get onlineKeyBackupEnabled => 'Backup de chaves está ativado'; + + @override + String get oopsPushError => + 'Opa! Infelizmente, um erro ocorreu ao configurar as notificações.'; + + @override + String get oopsSomethingWentWrong => 'Opa, algo deu errado…'; + + @override + String get openAppToReadMessages => 'Abra o app para ler as mensagens'; + + @override + String get openCamera => 'Abra a câmera'; + + @override + String get openVideoCamera => 'Abra a câmera para um vídeo'; + + @override + String get oneClientLoggedOut => 'Um dos seus clientes foi desvinculado'; + + @override + String get addAccount => 'Adicionar conta'; + + @override + String get editBundlesForAccount => 'Editar coleções para esta conta'; + + @override + String get addToBundle => 'Adicionar à coleção'; + + @override + String get removeFromBundle => 'Remover desta coleção'; + + @override + String get bundleName => 'Nome da coleção'; + + @override + String get enableMultiAccounts => + '(BETA) Habilitar múltiplas contas neste dispositivo'; + + @override + String get openInMaps => 'Abrir no mapas'; + + @override + String get link => 'Link'; + + @override + String get serverRequiresEmail => + 'Este servidor precisa validar seu email para efetuar o registro.'; + + @override + String get or => 'Ou'; + + @override + String get participant => 'Participante'; + + @override + String get passphraseOrKey => 'frase secreta ou chave de recuperação'; + + @override + String get password => 'Senha'; + + @override + String get passwordForgotten => 'Esqueci a senha'; + + @override + String get passwordHasBeenChanged => 'Senha foi alterada'; + + @override + String get hideMemberChangesInPublicChats => + 'Esconder mudanças de membro em chats públicos'; + + @override + String get hideMemberChangesInPublicChatsBody => + 'Não mostre se alguém entrou ou saiu no chat para melhorar a legibilidade.'; + + @override + String get overview => 'Visão geral'; + + @override + String get notifyMeFor => 'Notificar me para'; + + @override + String get passwordRecoverySettings => + 'Configurações de recuperação de senha'; + + @override + String get passwordRecovery => 'Recuperação de senha'; + + @override + String get people => 'Pessoas'; + + @override + String get pickImage => 'Escolha uma imagem'; + + @override + String get pin => 'Alfinetar'; + + @override + String play(String fileName) { + return 'Tocar $fileName'; + } + + @override + String get pleaseChoose => 'Por favor, selecione'; + + @override + String get pleaseChooseAPasscode => 'Por favor, escolha um código'; + + @override + String get pleaseClickOnLink => + 'Por favor, clique a ligação no e-mail para prosseguir.'; + + @override + String get pleaseEnter4Digits => + 'Por favor, insira 4 dígitos ou deixe em branco para desativar a trava do aplicativo.'; + + @override + String get pleaseEnterRecoveryKey => + 'Por favor, insira sua chave de recuperação:'; + + @override + String get pleaseEnterYourPassword => 'Por favor, insira sua senha'; + + @override + String get pleaseEnterYourPin => 'Por favor, insira seu PIN'; + + @override + String get pleaseEnterYourUsername => 'Por favor, insira seu nome de usuário'; + + @override + String get pleaseFollowInstructionsOnWeb => + 'Por favor, siga as instruções no site e toque em próximo.'; + + @override + String get privacy => 'Privacidade'; + + @override + String get publicRooms => 'Salas públicas'; + + @override + String get pushRules => 'Regras de notificação'; + + @override + String get reason => 'Motivo'; + + @override + String get recording => 'Gravando'; + + @override + String redactedBy(String username) { + return 'Removido por $username'; + } + + @override + String get directChat => 'Conversa direta'; + + @override + String redactedByBecause(String username, String reason) { + return 'Removido por $username, pois: \"$reason\"'; + } + + @override + String redactedAnEvent(String username) { + return '$username removeu um evento'; + } + + @override + String get redactMessage => 'Retratar mensagem'; + + @override + String get register => 'Registrar'; + + @override + String get reject => 'Recusar'; + + @override + String rejectedTheInvitation(String username) { + return '$username recusou o convite'; + } + + @override + String get rejoin => 'Retornar'; + + @override + String get removeAllOtherDevices => 'Remover todos os outros dispositivos'; + + @override + String removedBy(String username) { + return 'Removido por $username'; + } + + @override + String get removeDevice => 'Remover dispositivo'; + + @override + String get unbanFromChat => 'Revogar banimento'; + + @override + String get removeYourAvatar => 'Remover seu avatar'; + + @override + String get replaceRoomWithNewerVersion => + 'Substituir sala por uma nova versão'; + + @override + String get reply => 'Responder'; + + @override + String get reportMessage => 'Denunciar mensagem'; + + @override + String get requestPermission => 'Solicitar permissão'; + + @override + String get roomHasBeenUpgraded => 'Sala foi atualizada'; + + @override + String get roomVersion => 'Versão da sala'; + + @override + String get saveFile => 'Salvar arquivo'; + + @override + String get search => 'Buscar'; + + @override + String get security => 'Segurança'; + + @override + String get recoveryKey => 'Chave de recuperação'; + + @override + String get recoveryKeyLost => 'Perdeu a chave de recuperação?'; + + @override + String seenByUser(String username) { + return 'Visto por $username'; + } + + @override + String get send => 'Enviar'; + + @override + String get sendAMessage => 'Enviar mensagem'; + + @override + String get sendAsText => 'Enviar como texto'; + + @override + String get sendAudio => 'Enviar audio'; + + @override + String get sendFile => 'Enviar arquivo'; + + @override + String get sendImage => 'Enviar imagem'; + + @override + String get sendMessages => 'Enviar mensagens'; + + @override + String get sendOriginal => 'Enviar original'; + + @override + String get sendSticker => 'Enviar figurinha'; + + @override + String get sendVideo => 'Enviar vídeo'; + + @override + String sentAFile(String username) { + return '📁 $username enviou um arquivo'; + } + + @override + String sentAnAudio(String username) { + return '🎤 $username enviou um audio'; + } + + @override + String sentAPicture(String username) { + return '🖼️ $username enviou uma imagem'; + } + + @override + String sentASticker(String username) { + return '😊 $username enviou uma figurinha'; + } + + @override + String sentAVideo(String username) { + return '🎥 $username enviou um vídeo'; + } + + @override + String sentCallInformations(String senderName) { + return '$senderName enviou informações de chamada'; + } + + @override + String get separateChatTypes => 'Separar Conversas Diretas e Grupos'; + + @override + String get setAsCanonicalAlias => 'Fixar como cognome principal'; + + @override + String get setCustomEmotes => 'Implantar emojis personalizados'; + + @override + String get setChatDescription => 'Inserir descrição da conversa'; + + @override + String get setInvitationLink => 'Enviar link de convite'; + + @override + String get setPermissionsLevel => 'Determinar níveis de permissão'; + + @override + String get setStatus => 'Alterar o status'; + + @override + String get settings => 'Configurações'; + + @override + String get share => 'Compartilhar'; + + @override + String sharedTheLocation(String username) { + return '$username compartilhou sua localização'; + } + + @override + String get shareLocation => 'Compartilhar localização'; + + @override + String get showPassword => 'Mostrar senha'; + + @override + String get presenceStyle => 'Presença:'; + + @override + String get presencesToggle => + 'Mostrar o status das mensagens de outros usuários'; + + @override + String get singlesignon => 'Identidade Única'; + + @override + String get skip => 'Pular'; + + @override + String get sourceCode => 'Código fonte'; + + @override + String get spaceIsPublic => 'Espaço é público'; + + @override + String get spaceName => 'Nome do espaço'; + + @override + String startedACall(String senderName) { + return '$senderName iniciou uma chamada'; + } + + @override + String get startFirstChat => 'Comece seu primeiro chat'; + + @override + String get status => 'Status'; + + @override + String get statusExampleMessage => 'Como vai você?'; + + @override + String get submit => 'Submeter'; + + @override + String get synchronizingPleaseWait => 'Sincronizando… Por favor, aguarde.'; + + @override + String get systemTheme => 'Sistema'; + + @override + String get theyDontMatch => 'Não correspondem'; + + @override + String get theyMatch => 'Correspondem'; + + @override + String get title => 'FluffyChat'; + + @override + String get toggleFavorite => 'Alternar favorito'; + + @override + String get toggleMuted => 'Alternar Silenciado'; + + @override + String get toggleUnread => 'Marcar lido/não lido'; + + @override + String get tooManyRequestsWarning => + 'Demasiadas requisições. Por favor, tente novamente mais tarde!'; + + @override + String get transferFromAnotherDevice => 'Transferir de outro dispositivo'; + + @override + String get tryToSendAgain => 'Tente enviar novamente'; + + @override + String get unavailable => 'Indisponível'; + + @override + String unbannedUser(String username, String targetName) { + return '$username revogou o banimento de $targetName'; + } + + @override + String get unblockDevice => 'Desbloquear dispositivo'; + + @override + String get unknownDevice => 'Dispositivo desconhecido'; + + @override + String get unknownEncryptionAlgorithm => + 'Algoritmo de criptografia desconhecido'; + + @override + String unknownEvent(String type) { + return 'Evento desconhecido \'$type\''; + } + + @override + String get unmuteChat => 'Cancelar silenciamento'; + + @override + String get unpin => 'Desalfinetar'; + + @override + String unreadChats(int unreadCount) { + String _temp0 = intl.Intl.pluralLogic( + unreadCount, + locale: localeName, + other: '$unreadCount conversas não lidas', + one: '1 conversa não lida', + ); + return '$_temp0'; + } + + @override + String userAndOthersAreTyping(String username, int count) { + return '$username e mais $count pessoas estão digitando…'; + } + + @override + String userAndUserAreTyping(String username, String username2) { + return '$username e $username2 estão digitando…'; + } + + @override + String userIsTyping(String username) { + return '$username está digitando…'; + } + + @override + String userLeftTheChat(String username) { + return '🚪 $username saiu da conversa'; + } + + @override + String get username => 'Nome de usuário'; + + @override + String userSentUnknownEvent(String username, String type) { + return '$username enviou um evento $type'; + } + + @override + String get unverified => 'Não verificado'; + + @override + String get verified => 'Verificado'; + + @override + String get verify => 'Verificar'; + + @override + String get verifyStart => 'Iniciar verificação'; + + @override + String get verifySuccess => 'Verificação efetivada!'; + + @override + String get verifyTitle => 'Verificando outra conta'; + + @override + String get videoCall => 'Vídeochamada'; + + @override + String get visibilityOfTheChatHistory => + 'Visibilidade do histórico da conversa'; + + @override + String get visibleForAllParticipants => 'Visível aos participantes'; + + @override + String get visibleForEveryone => 'Visível a qualquer pessoa'; + + @override + String get voiceMessage => 'Mensagem de voz'; + + @override + String get waitingPartnerAcceptRequest => + 'Esperando que a outra pessoa aceite a solicitação…'; + + @override + String get waitingPartnerEmoji => + 'Esperando que a outra pessoa aceite os emoji…'; + + @override + String get waitingPartnerNumbers => + 'Aguardando a outra pessoa aceitar os números…'; + + @override + String get wallpaper => 'Pano de fundo:'; + + @override + String get warning => 'Atenção!'; + + @override + String get weSentYouAnEmail => 'Enviamos um e-mail para você'; + + @override + String get whoCanPerformWhichAction => 'Quem pode desempenhar quais ações'; + + @override + String get whoIsAllowedToJoinThisGroup => + 'Quais pessoas são permitidas participar deste grupo'; + + @override + String get whyDoYouWantToReportThis => 'Por que você quer denunciar isto?'; + + @override + String get wipeChatBackup => + 'Limpar o backup da conversa para criar uma nova chave de recuperação?'; + + @override + String get withTheseAddressesRecoveryDescription => + 'Você pode recuperar a sua senha com estes endereços.'; + + @override + String get writeAMessage => 'Escreva uma mensagem…'; + + @override + String get yes => 'Sim'; + + @override + String get you => 'Você'; + + @override + String get youAreNoLongerParticipatingInThisChat => + 'Você não está mais participando desta conversa'; + + @override + String get youHaveBeenBannedFromThisChat => 'Você foi banido desta conversa'; + + @override + String get yourPublicKey => 'Sua chave pública'; + + @override + String get messageInfo => 'Informações da mensagem'; + + @override + String get time => 'Hora'; + + @override + String get messageType => 'Tipo da mensagem'; + + @override + String get sender => 'Remetente'; + + @override + String get openGallery => 'Abrir galeria'; + + @override + String get removeFromSpace => 'Remover do espaço'; + + @override + String get addToSpaceDescription => + 'Selecione um espaço para adicionar esta conversa.'; + + @override + String get start => 'Começar'; + + @override + String get pleaseEnterRecoveryKeyDescription => + 'Para destrancar suas mensagens antigas, por favor, insira sua chave de recuperação gerada numa sessão prévia. Suas chave de recuperação NÃO é sua senha.'; + + @override + String get publish => 'Publicar'; + + @override + String videoWithSize(String size) { + return 'Vídeo ($size)'; + } + + @override + String get openChat => 'Abrir conversa'; + + @override + String get markAsRead => 'Marcar como lido'; + + @override + String get reportUser => 'Delatar usuário'; + + @override + String get dismiss => 'Descartar'; + + @override + String reactedWith(String sender, String reaction) { + return '$sender reagiu com $reaction'; + } + + @override + String get pinMessage => 'Afixar à sala'; + + @override + String get confirmEventUnpin => + 'Tem certeza que quer desafixar o evento permanentemente?'; + + @override + String get emojis => 'Emojis'; + + @override + String get placeCall => 'Chamar'; + + @override + String get voiceCall => 'Chamada de voz'; + + @override + String get unsupportedAndroidVersion => 'Versão Android não suportada'; + + @override + String get unsupportedAndroidVersionLong => + 'Esta funcionalidade requer uma versão mais nova do Android. Por favor, busque atualizações ou suporte ao Lineage OS.'; + + @override + String get videoCallsBetaWarning => + 'Por favor, note que chamadas de vídeo estão atualmente em teste. Podem não funcionar como esperado ou sequer funcionar em algumas plataformas.'; + + @override + String get experimentalVideoCalls => 'Vídeo chamadas experimentais'; + + @override + String get emailOrUsername => 'Email ou nome de usuário'; + + @override + String get indexedDbErrorTitle => 'Problemas no modo privado'; + + @override + String get indexedDbErrorLong => + 'Infelizmente, o armazenamento de mensagens não é habilitado por padrão no modo privado.\nPor favor, visite\n- about:config\n- atribua \"true\" a \"dom.indexedDB.privateBrowsing.enabled\"\nDe outro modo, não será possível executar o FluffyChat.'; + + @override + String switchToAccount(String number) { + return 'Alternar para a conta $number'; + } + + @override + String get nextAccount => 'Próxima conta'; + + @override + String get previousAccount => 'Conta anterior'; + + @override + String get addWidget => 'Adicionar ferramenta'; + + @override + String get widgetVideo => 'Vídeo'; + + @override + String get widgetEtherpad => 'Anotação'; + + @override + String get widgetJitsi => 'Jitsi Meet'; + + @override + String get widgetCustom => 'Personalizado'; + + @override + String get widgetName => 'Nome'; + + @override + String get widgetUrlError => 'Isto não é uma URL válida.'; + + @override + String get widgetNameError => 'Por favor, forneça um nome de exibição.'; + + @override + String get errorAddingWidget => 'Erro ao adicionar a ferramenta.'; + + @override + String get youRejectedTheInvitation => 'Você rejeitou o convite'; + + @override + String get youJoinedTheChat => 'Você entrou na conversa'; + + @override + String get youAcceptedTheInvitation => '👍 Você aceitou o convite'; + + @override + String youBannedUser(String user) { + return 'Você baniu $user'; + } + + @override + String youHaveWithdrawnTheInvitationFor(String user) { + return 'Você revogou o convite para $user'; + } + + @override + String youInvitedToBy(String alias) { + return 'Você foi convidado através do link para:\n$alias'; + } + + @override + String youInvitedBy(String user) { + return '📩 Você foi convidado por $user'; + } + + @override + String youInvitedUser(String user) { + return '📩 Você convidou $user'; + } + + @override + String youKicked(String user) { + return '👞 Você expulsou $user'; + } + + @override + String youKickedAndBanned(String user) { + return '🙅 Você expulsou e baniu $user'; + } + + @override + String youUnbannedUser(String user) { + return 'Você revogou o banimento de $user'; + } + + @override + String hasKnocked(String user) { + return '🚪 $user bateu na porta'; + } + + @override + String get usersMustKnock => 'Usuários devem bater na porta'; + + @override + String get noOneCanJoin => 'Ninguém pode entrar'; + + @override + String userWouldLikeToChangeTheChat(String user) { + return '$user gostaria de entrar no chat.'; + } + + @override + String get noPublicLinkHasBeenCreatedYet => + 'Nenhum link público foi criado ainda'; + + @override + String get knock => 'Bater na porta'; + + @override + String get users => 'Usuários'; + + @override + String get unlockOldMessages => 'Destrancar mensagens antigas'; + + @override + String get storeInSecureStorageDescription => + 'Guardar a chave de recuperação no armazenamento seguro deste dispositivo.'; + + @override + String get saveKeyManuallyDescription => + 'Salvar esta chave manualmente via compartilhamento do sistema ou área de transferência.'; + + @override + String get storeInAndroidKeystore => 'Guardar no cofre do Android'; + + @override + String get storeInAppleKeyChain => 'Guardar no chaveiro da Apple'; + + @override + String get storeSecurlyOnThisDevice => + 'Guardar de modo seguro neste dispositivo'; + + @override + String countFiles(int count) { + return '$count arquivos'; + } + + @override + String get user => 'Usuário'; + + @override + String get custom => 'Personalizado'; + + @override + String get foregroundServiceRunning => + 'Esta notificação aparece quando um serviço está executando.'; + + @override + String get screenSharingTitle => 'Compartilhar tela'; + + @override + String get screenSharingDetail => + 'Você está compartilhando sua tela no FluffyChat'; + + @override + String get callingPermissions => 'Permissões de chamada'; + + @override + String get callingAccount => 'Conta para chamadas'; + + @override + String get callingAccountDetails => + 'Permitir que o FluffyChat use o app de chamadas nativo do Android.'; + + @override + String get appearOnTop => 'Aparecer no topo'; + + @override + String get appearOnTopDetails => + 'Permitir que o app apareça no topo (desnecessário caso FluffyChat já esteja configurado como conta para chamadas)'; + + @override + String get otherCallingPermissions => + 'Microfone, câmera e outras permissões do FluffyChat'; + + @override + String get whyIsThisMessageEncrypted => + 'Por que esta mensagem está ilegível?'; + + @override + String get noKeyForThisMessage => + 'Isto pode ocorrer caso a mensagem tenha sido enviada antes da entrada na sua conta com este dispositivo.\n\nTambém é possível que o remetente tenha bloqueado o seu dispositivo ou ocorreu algum problema com a conexão.\n\nVocê consegue ler as mensagens em outra sessão? Então, pode transferir as mensagens de lá! Vá em Configurações > Dispositivos e confira se os dispositivos verificaram um ao outro. Quando abrir a sala da próxima vez e ambas as sessões estiverem abertas, as chaves serão transmitidas automaticamente.\n\nNão gostaria de perder suas chaves quando sair ou trocar de dispositivos? Certifique-se que o backup de conversas esteja habilitado nas configurações.'; + + @override + String get newGroup => 'Novo grupo'; + + @override + String get newSpace => 'Novo espaço'; + + @override + String get enterSpace => 'Entrar no espaço'; + + @override + String get enterRoom => 'Entrar na conversa'; + + @override + String get allSpaces => 'Todos espaços'; + + @override + String numChats(String number) { + return '$number conversas'; + } + + @override + String get hideUnimportantStateEvents => 'Ocultar eventos desimportantes'; + + @override + String get hidePresences => 'Esconder lista de status?'; + + @override + String get doNotShowAgain => 'Não mostrar novamente'; + + @override + String wasDirectChatDisplayName(String oldDisplayName) { + return 'Conversa vazia (era $oldDisplayName)'; + } + + @override + String get newSpaceDescription => + 'Espaços permitem que você consolide suas conversas e construa comunidades públicas ou privadas.'; + + @override + String get encryptThisChat => 'Encriptar esta conversa'; + + @override + String get disableEncryptionWarning => + 'Por razões de segurança, não possível desabilitar a encriptação uma vez habilitada.'; + + @override + String get sorryThatsNotPossible => 'Desculpe... isto não é possível'; + + @override + String get deviceKeys => 'Chaves de dispositivo:'; + + @override + String get reopenChat => 'Reabrir conversa'; + + @override + String get noBackupWarning => + 'Atenção! Sem habilitar o backup de conversa, você perderá acesso a suas mensagens encriptadas. É altamente recomendável habilitar o backup antes de encerrar a sessão.'; + + @override + String get noOtherDevicesFound => 'Nenhum outro dispositivo encontrado'; + + @override + String fileIsTooBigForServer(String max) { + return 'O servidor avisa que o arquivo é grande demais para ser enviado.'; + } + + @override + String fileHasBeenSavedAt(String path) { + return 'Arquivo salvo em $path'; + } + + @override + String get jumpToLastReadMessage => 'Pular para a última mensagem lida'; + + @override + String get readUpToHere => 'Marcar como lido até aqui'; + + @override + String get jump => 'Pular'; + + @override + String get openLinkInBrowser => 'Abrir no navegador'; + + @override + String get reportErrorDescription => + '😭 Ah, não. Algo deu errado. Se quiser, pode relatar isto aos desenvolvedores.'; + + @override + String get report => 'Relatar'; + + @override + String get signInWithPassword => 'Autenticar com senha'; + + @override + String get pleaseTryAgainLaterOrChooseDifferentServer => + 'Por favor, tente novamente mais tarde ou escolha um servidor diferente.'; + + @override + String signInWith(String provider) { + return 'Autenticar com $provider'; + } + + @override + String get profileNotFound => + 'O usuário não foi encontrado neste servidor. Talvez um problema de conexão ou o usuário não existe.'; + + @override + String get setTheme => 'Aplicar tema:'; + + @override + String get setColorTheme => 'Aplicar paleta de cor:'; + + @override + String get invite => 'Convidar'; + + @override + String get inviteGroupChat => '📨 Convidar para o grupo'; + + @override + String get invitePrivateChat => '📨 Convidar para uma conversa privada'; + + @override + String get invalidInput => 'Inserção inválida!'; + + @override + String wrongPinEntered(int seconds) { + return 'PIN incorreto! Tente novamente em $seconds segundos...'; + } + + @override + String get pleaseEnterANumber => 'Por favor, insira um número maior que 0'; + + @override + String get archiveRoomDescription => + 'A conversa será movida para o arquivo. Outros usuários verão que você deixou a conversa.'; + + @override + String get roomUpgradeDescription => + 'A conversa será recriada com a nova versão de sala. Todos participantes será notificados e terão que migrar para a nova sala. Você pode encontrar mais informações sobre versões de sala em https://spec.matrix.org/latest/room/'; + + @override + String get removeDevicesDescription => + 'Você encerrará a sessão neste dispositivo e não poderá mais receber mensagens.'; + + @override + String get banUserDescription => + 'O usuário será banido da conversa e não poderá participar novamente até que isto seja revogado.'; + + @override + String get unbanUserDescription => + 'O usuário poderá ingressar novamente na conversa, caso tente.'; + + @override + String get kickUserDescription => + 'O usuário foi enxotado da conversa, mas não banido. Em conversas públicas, o usuário pode reingressar a qualquer momento.'; + + @override + String get makeAdminDescription => + 'Assim que promover este usuário a administrador, não poderá desfazê-lo e ele terá as mesmas permissões que você.'; + + @override + String get pushNotificationsNotAvailable => + 'Notificações não estão disponíveis'; + + @override + String get learnMore => 'Saiba mais'; + + @override + String get yourGlobalUserIdIs => 'Seu ID global é: '; + + @override + String noUsersFoundWithQuery(String query) { + return 'Infelizmente, não foi encontrado usuário via \"$query\". Por favor, verifique se digitou corretamente.'; + } + + @override + String get knocking => 'Batendo na porta'; + + @override + String chatCanBeDiscoveredViaSearchOnServer(String server) { + return 'O chat pode ser descoberto pela pesquisa em $server'; + } + + @override + String get searchChatsRooms => 'Buscar por #conversas, @usuários...'; + + @override + String get nothingFound => 'Nada foi encontrado...'; + + @override + String get groupName => 'Nome do grupo'; + + @override + String get createGroupAndInviteUsers => 'Criar um grupo e convidar pessoas'; + + @override + String get groupCanBeFoundViaSearch => + 'Grupos podem ser encontrados via busca'; + + @override + String get wrongRecoveryKey => + 'Desculpe... esta não parece ser a chave de recuperação correta.'; + + @override + String get startConversation => 'Começar uma conversa'; + + @override + String get commandHint_sendraw => 'Enviar JSON puro'; + + @override + String get databaseMigrationTitle => 'Banco de dados otimizado'; + + @override + String get databaseMigrationBody => + 'Por favor, espere. Isto pode demorar um pouco.'; + + @override + String get leaveEmptyToClearStatus => + 'Deixe em branco para limpar seu Status.'; + + @override + String get select => 'Selecionar'; + + @override + String get searchForUsers => 'Buscar por @usuários...'; + + @override + String get pleaseEnterYourCurrentPassword => + 'Por favor, insira sua senha atual'; + + @override + String get newPassword => 'Nova senha'; + + @override + String get pleaseChooseAStrongPassword => + 'Por favor, escolha uma senha forte'; + + @override + String get passwordsDoNotMatch => 'Senhas não batem'; + + @override + String get passwordIsWrong => 'A senha inserida está incorreta'; + + @override + String get publicLink => 'Link público'; + + @override + String get publicChatAddresses => 'Endereços de chat públicos'; + + @override + String get createNewAddress => 'Criar um novo endereço'; + + @override + String get joinSpace => 'Ingressar no espaço'; + + @override + String get publicSpaces => 'Espaços públicos'; + + @override + String get addChatOrSubSpace => 'Adicionar conversa ou subespaço'; + + @override + String get subspace => 'Subespaço'; + + @override + String get decline => 'Rejeitar'; + + @override + String get thisDevice => 'Este dispositivo:'; + + @override + String get initAppError => + 'Ocorreu um erro enquanto o aplicativo era iniciado'; + + @override + String get userRole => 'Cargo do usuário'; + + @override + String minimumPowerLevel(String level) { + return '$level é o nível mínimo de poder.'; + } + + @override + String searchIn(String chat) { + return 'Pesquisar em $chat...'; + } + + @override + String get searchMore => 'Pesquisar mais...'; + + @override + String get gallery => 'Galeria'; + + @override + String get files => 'Arquivos'; + + @override + String databaseBuildErrorBody(String url, String error) { + return 'Não foi possível construir o banco de dados SQLite. O aplicativo tentará utilizar o banco de dados legado por enquanto. Por favor, reporte este erro aos desenvolvedores em $url. A mensagem de erro é: $error'; + } + + @override + String sessionLostBody(String url, String error) { + return 'Sua sessão foi desconectada. Por favor, reporte este ao desenvolvedor em $url. A mensagem de erro é: $error'; + } + + @override + String restoreSessionBody(String url, String error) { + return 'O aplicativo tentará agora restaurar sua sessão a partir do backup. Por favor, reporte este ao desenvolvedor em $url. A mensagem de erro é: $error'; + } + + @override + String forwardMessageTo(String roomName) { + return 'Encaminhar mensagem para $roomName?'; + } + + @override + String get sendReadReceipts => 'Enviar recibos de leitura'; + + @override + String get sendTypingNotificationsDescription => + 'Outros participantes neste chat podem ver quando você está digitando uma nova mensagem.'; + + @override + String get sendReadReceiptsDescription => + 'Outros participantes neste chat podem ver quando você tiver lido uma mensagem.'; + + @override + String get formattedMessages => 'Mensagens formatadas'; + + @override + String get formattedMessagesDescription => + 'Mostrar mensagens ricas com conteúdos tipo negrito usando markdown.'; + + @override + String get verifyOtherUser => '🔐 Verificar outro usuário'; + + @override + String get verifyOtherUserDescription => + 'Se você verificar outro usuário, você terá certeza que você conhece com quem está conversando. 💪\n\nQuando iniciar uma verificação, você e o outro usuário receberão um popup no aplicativo. Então vocês receberão uma série de emojis ou números para comparar um com o outro.\n\nA melhor maneira de fazer este procedimento é encontrar pessoalmente ou através de um vídeochamada. 👭'; + + @override + String get verifyOtherDevice => '🔐 Verificar outro aparelho'; + + @override + String get verifyOtherDeviceDescription => + 'Quando você verifica outro aparelho, estes aparelhos poderão trocar chaves, aumentando sua segurança. 💪\n\nQuando iniciar a verificação, um popup aparecerá no aplicativo em ambos os aparelhos. Então você verá uma série de emojis ou números que você terá que comparar um com o outro.\n\nÉ melhor fazer esse procedimento com ambos os aparelhos em mãos antes de começar a verificação. 🤳'; + + @override + String acceptedKeyVerification(String sender) { + return '$sender aceitou sua chave de verificação'; + } + + @override + String canceledKeyVerification(String sender) { + return '$sender cancelou sua chave de verificação'; + } + + @override + String completedKeyVerification(String sender) { + return '$sender completou a chave de verificação'; + } + + @override + String isReadyForKeyVerification(String sender) { + return '$sender está pronto para a chave de verificação'; + } + + @override + String requestedKeyVerification(String sender) { + return '$sender enviou uma chave de verificação'; + } + + @override + String startedKeyVerification(String sender) { + return '$sender iniciou a chave de verificação'; + } + + @override + String get transparent => 'Transparente'; + + @override + String get incomingMessages => 'Mensagens recebidas'; + + @override + String get stickers => 'Stickers'; + + @override + String get discover => 'Descubra'; + + @override + String get commandHint_ignore => 'Ignorar o seguinte ID Matrix'; + + @override + String get commandHint_unignore => 'Designorar o seguinte ID Matrix'; + + @override + String unreadChatsInApp(String appname, String unread) { + return '$appname: $unread mensagens não lidas'; + } + + @override + String get noDatabaseEncryption => + 'A criptografia do banco de dados não é suportada nesta plataforma'; + + @override + String thereAreCountUsersBlocked(Object count) { + return 'Nesse momento, há $count usuários bloqueados.'; + } + + @override + String get restricted => 'Restrito'; + + @override + String get knockRestricted => 'Bater na porta restrito'; +} + +/// The translations for Portuguese, as used in Portugal (`pt_PT`). +class L10nPtPt extends L10nPt { + L10nPtPt() : super('pt_PT'); + + @override + String get repeatPassword => 'Repete a palavra-passe'; + + @override + String get remove => 'Remover'; + + @override + String get about => 'Acerca de'; + + @override + String get accept => 'Aceitar'; + + @override + String acceptedTheInvitation(String username) { + return '$username aceitou o convite'; + } + + @override + String get account => 'Conta'; + + @override + String activatedEndToEndEncryption(String username) { + return '$username ativou encriptação ponta-a-ponta'; + } + + @override + String get addEmail => 'Adicionar correio eletrónico'; + + @override + String get addToSpace => 'Adicionar ao espaço'; + + @override + String get admin => 'Admin'; + + @override + String get alias => 'alcunha'; + + @override + String get all => 'Todos(as)'; + + @override + String get allChats => 'Todas as conversas'; + + @override + String answeredTheCall(String senderName) { + return '$senderName atendeu a chamada'; + } + + @override + String get anyoneCanJoin => 'Qualquer pessoa pode entrar'; + + @override + String get appLock => 'Bloqueio da aplicação'; + + @override + String get archive => 'Arquivo'; + + @override + String get areGuestsAllowedToJoin => 'Todos os visitantes podem entrar'; + + @override + String get areYouSure => 'Tens a certeza?'; + + @override + String get areYouSureYouWantToLogout => 'Tens a certeza que queres sair?'; + + @override + String get askSSSSSign => + 'Para poderes assinar a outra pessoa, por favor, insere a tua senha de armazenamento seguro ou a chave de recuperação.'; + + @override + String askVerificationRequest(String username) { + return 'Aceitar este pedido de verificação de $username?'; + } + + @override + String get autoplayImages => + 'Automaticamente reproduzir autocolantes e emotes animados'; + + @override + String badServerLoginTypesException(String serverVersions, + String supportedVersions, Object suportedVersions) { + return 'O servidor suporta os tipos de início de sessão:\n$serverVersions\nMas esta aplicação apenas suporta:\n$suportedVersions'; + } + + @override + String get sendOnEnter => 'Enviar com Enter'; + + @override + String badServerVersionsException(String serverVersions, + String supportedVersions, Object serverVerions, Object suportedVersions) { + return 'O servidor suporta as versões Spec:\n$serverVersions\nMas esta aplicação apenas suporta $suportedVersions'; + } + + @override + String get banFromChat => 'Banir da conversa'; + + @override + String get banned => 'Banido(a)'; + + @override + String bannedUser(String username, String targetName) { + return '$username baniu $targetName'; + } + + @override + String get blockDevice => 'Bloquear dispositivo'; + + @override + String get blocked => 'Bloqueado'; + + @override + String get botMessages => 'Mensagens de robôs'; + + @override + String get cancel => 'Cancelar'; + + @override + String cantOpenUri(String uri) { + return 'Não é possível abrir o URI $uri'; + } + + @override + String get changeDeviceName => 'Alterar nome do dispositivo'; + + @override + String changedTheChatAvatar(String username) { + return '$username alterou o avatar da conversa'; + } + + @override + String changedTheChatDescriptionTo(String username, String description) { + return '$username alterou a descrição da conversa para: \'$description\''; + } + + @override + String changedTheChatNameTo(String username, String chatname) { + return '$username alterou o nome da conversa para: \'$chatname\''; + } + + @override + String changedTheChatPermissions(String username) { + return '$username alterou as permissões da conversa'; + } + + @override + String changedTheDisplaynameTo(String username, String displayname) { + return '$username alterou o seu nome para: \'$displayname\''; + } + + @override + String changedTheGuestAccessRules(String username) { + return '$username alterou as regras de acesso de visitantes'; + } + + @override + String changedTheGuestAccessRulesTo(String username, String rules) { + return '$username alterou as regras de acesso de visitantes para: $rules'; + } + + @override + String changedTheHistoryVisibility(String username) { + return '$username alterou a visibilidade do histórico'; + } + + @override + String changedTheHistoryVisibilityTo(String username, String rules) { + return '$username alterou a visibilidade do histórico para: $rules'; + } + + @override + String changedTheJoinRules(String username) { + return '$username alterou as regras de entrada'; + } + + @override + String changedTheJoinRulesTo(String username, String joinRules) { + return '$username alterou as regras de entrada para: $joinRules'; + } + + @override + String changedTheProfileAvatar(String username) { + return '$username alterou o seu avatar'; + } + + @override + String changedTheRoomAliases(String username) { + return '$username alterou as alcunhas da sala'; + } + + @override + String changedTheRoomInvitationLink(String username) { + return '$username alterou a ligação de convite'; + } + + @override + String get changePassword => 'Alterar palavra-passe'; + + @override + String get changeTheHomeserver => 'Alterar o servidor'; + + @override + String get changeTheme => 'Alterar o teu estilo'; + + @override + String get changeTheNameOfTheGroup => 'Alterar o nome do grupo'; + + @override + String get changeYourAvatar => 'Alterar o teu avatar'; + + @override + String get channelCorruptedDecryptError => 'A encriptação foi corrompida'; + + @override + String get chat => 'Conversa'; + + @override + String get yourChatBackupHasBeenSetUp => + 'A cópia de segurança foi configurada.'; + + @override + String get chatBackup => 'Cópia de segurança de conversas'; + + @override + String get chatBackupDescription => + 'A tuas mensagens antigas estão protegidas com uma chave de recuperação. Por favor, certifica-te que não a perdes.'; + + @override + String get chatDetails => 'Detalhes de conversa'; + + @override + String get chatHasBeenAddedToThisSpace => + 'A conversa foi adicionada a este espaço'; + + @override + String get chats => 'Conversas'; + + @override + String get chooseAStrongPassword => 'Escolhe uma palavra-passe forte'; + + @override + String get clearArchive => 'Limpar arquivo'; + + @override + String get close => 'Fechar'; + + @override + String get commandHint_ban => 'Banir o utilizador dado desta sala'; + + @override + String get commandHint_clearcache => 'Limpar cache'; + + @override + String get commandHint_create => + 'Criar uma conversa de grupo vazia\nUsa --no-encryption para desativar a encriptação'; + + @override + String get commandHint_discardsession => 'Descartar sessão'; + + @override + String get commandHint_dm => + 'Iniciar uma conversa direta\nUsa --no-encryption para desativar a encriptação'; + + @override + String get commandHint_html => 'Enviar texto formatado com HTML'; + + @override + String get commandHint_invite => 'Convidar o utilizador dado a esta sala'; + + @override + String get commandHint_join => 'Entrar na sala dada'; + + @override + String get commandHint_kick => 'Remover o utilizador dado desta sala'; + + @override + String get commandHint_leave => 'Sair desta sala'; + + @override + String get commandHint_me => 'Descreve-te'; + + @override + String get commandHint_myroomavatar => + 'Definir a tua imagem para esta sala (por mxc-uri)'; + + @override + String get commandHint_myroomnick => 'Definir o teu nome para esta sala'; + + @override + String get commandHint_op => + 'Definir o nível de poder do utilizador dado (por omissão: 50)'; + + @override + String get commandHint_plain => 'Enviar texto não formatado'; + + @override + String get commandHint_react => 'Enviar respostas como reações'; + + @override + String get commandHint_send => 'Enviar texto'; + + @override + String get commandHint_unban => 'Perdoar o utilizador dado'; + + @override + String get commandInvalid => 'Comando inválido'; + + @override + String commandMissing(String command) { + return '$command não é um comando.'; + } + + @override + String get compareEmojiMatch => + 'Compara e certifica-te que os emojis que se seguem correspondem aos do outro dispositivo:'; + + @override + String get compareNumbersMatch => + 'Compara e certifica-te que os números que se seguem correspondem aos do outro dispositivo:'; + + @override + String get configureChat => 'Configurar conversa'; + + @override + String get confirm => 'Confirmar'; + + @override + String get connect => 'Ligar'; + + @override + String get contactHasBeenInvitedToTheGroup => + 'O contacto foi convidado para o grupo'; + + @override + String get containsDisplayName => 'Contém nome de exibição'; + + @override + String get containsUserName => 'Contém nome de utilizador'; + + @override + String get contentHasBeenReported => + 'O conteúdo foi denunciado aos admins do servidor'; + + @override + String get copiedToClipboard => 'Copiado para a área de transferência'; + + @override + String get copy => 'Copiar'; + + @override + String get copyToClipboard => 'Copiar para a área de transferência'; + + @override + String couldNotDecryptMessage(String error) { + return 'Não foi possível desencriptar mensagem: $error'; + } + + @override + String countParticipants(int count) { + return '$count participantes'; + } + + @override + String get create => 'Criar'; + + @override + String createdTheChat(String username) { + return '$username criou a conversa'; + } + + @override + String get createNewSpace => 'Novo espaço'; + + @override + String get currentlyActive => 'Ativo(a) agora'; + + @override + String get darkTheme => 'Escuro'; + + @override + String dateAndTimeOfDay(String date, String timeOfDay) { + return '$date às $timeOfDay'; + } + + @override + String dateWithoutYear(String month, String day) { + return '$day-$month'; + } + + @override + String dateWithYear(String year, String month, String day) { + return '$day-$month-$year'; + } + + @override + String get deactivateAccountWarning => + 'Isto irá desativar a tua conta. Não é reversível! Tens a certeza?'; + + @override + String get defaultPermissionLevel => 'Nível de permissão normal'; + + @override + String get delete => 'Eliminar'; + + @override + String get deleteAccount => 'Eliminar conta'; + + @override + String get deleteMessage => 'Eliminar mensagem'; + + @override + String get device => 'Dispositivo'; + + @override + String get deviceId => 'ID de dispositivo'; + + @override + String get devices => 'Dispositivos'; + + @override + String get directChats => 'Conversas diretas'; + + @override + String get displaynameHasBeenChanged => 'Nome de exibição alterado'; + + @override + String get downloadFile => 'Descarregar ficheiro'; + + @override + String get edit => 'Editar'; + + @override + String get editBlockedServers => 'Editar servidores bloqueados'; + + @override + String get editDisplayname => 'Editar nome de exibição'; + + @override + String get editRoomAliases => 'Editar alcunhas da sala'; + + @override + String get editRoomAvatar => 'Editar avatar da sala'; + + @override + String get emoteExists => 'Emote já existente!'; + + @override + String get emoteInvalid => 'Código de emote inválido!'; + + @override + String get emotePacks => 'Pacotes de emotes da sala'; + + @override + String get emoteSettings => 'Configurações de emotes'; + + @override + String get emoteShortcode => 'Código do emote'; + + @override + String get emoteWarnNeedToPick => + 'Precisas de escolher um código de emote e uma imagem!'; + + @override + String get emptyChat => 'Conversa vazia'; + + @override + String get enableEmotesGlobally => 'Ativar pacote de emotes globalmente'; + + @override + String get enableEncryption => 'Ativar encriptação'; + + @override + String get enableEncryptionWarning => + 'Nunca mais poderás desativar a encriptação. Tens a certeza?'; + + @override + String get encrypted => 'Encriptada'; + + @override + String get encryption => 'Encriptação'; + + @override + String get encryptionNotEnabled => 'A encriptação não está ativada'; + + @override + String endedTheCall(String senderName) { + return '$senderName terminou a chamada'; + } + + @override + String get enterAnEmailAddress => 'Insere um endereço de correio eletrónico'; + + @override + String get homeserver => 'Servidor'; + + @override + String get enterYourHomeserver => 'Insere o teu servidor'; + + @override + String errorObtainingLocation(String error) { + return 'Erro ao obter localização: $error'; + } + + @override + String get everythingReady => 'Tudo a postos!'; + + @override + String get extremeOffensive => 'Extremamente ofensivo'; + + @override + String get fileName => 'Nome do ficheiro'; + + @override + String get fluffychat => 'FluffyChat'; + + @override + String get fontSize => 'Tamanho da letra'; + + @override + String get forward => 'Reencaminhar'; + + @override + String get goToTheNewRoom => 'Ir para a nova sala'; + + @override + String get group => 'Grupo'; + + @override + String get groupIsPublic => 'O grupo é público'; + + @override + String get groups => 'Grupos'; + + @override + String groupWith(String displayname) { + return 'Grupo com $displayname'; + } + + @override + String get guestsAreForbidden => 'São proibidos visitantes'; + + @override + String get guestsCanJoin => 'Podem entrar visitantes'; + + @override + String hasWithdrawnTheInvitationFor(String username, String targetName) { + return '$username revogou o convite para $targetName'; + } + + @override + String get help => 'Ajuda'; + + @override + String get hideRedactedEvents => 'Esconder eventos eliminados'; + + @override + String get howOffensiveIsThisContent => 'Quão ofensivo é este conteúdo?'; + + @override + String get id => 'ID'; + + @override + String get identity => 'Identidade'; + + @override + String get iHaveClickedOnLink => 'Eu cliquei na ligação'; + + @override + String get incorrectPassphraseOrKey => + 'Senha ou chave de recuperação incorretos'; + + @override + String get inoffensive => 'Inofensivo'; + + @override + String get inviteContact => 'Convidar contacto'; + + @override + String inviteContactToGroup(String groupName) { + return 'Convidar contacto para $groupName'; + } + + @override + String get invited => 'Convidado(a)'; + + @override + String invitedUser(String username, String targetName) { + return '$username convidou $targetName'; + } + + @override + String get invitedUsersOnly => 'Utilizadores(as) convidados(as) apenas'; + + @override + String get inviteForMe => 'Convite para mim'; + + @override + String inviteText(String username, String link) { + return '$username convidou-te para o FluffyChat.\n1. Instala o FluffyChat: https://fluffychat.im\n2. Regista-te ou inicia sessão.\n3. Abre a ligação de convite: $link'; + } + + @override + String get isTyping => 'está a escrever…'; + + @override + String joinedTheChat(String username) { + return '$username entrou na conversa'; + } + + @override + String get joinRoom => 'Entrar na sala'; + + @override + String kicked(String username, String targetName) { + return '$username expulsou $targetName'; + } + + @override + String kickedAndBanned(String username, String targetName) { + return '$username expulsou e baniu $targetName'; + } + + @override + String get kickFromChat => 'Expulsar da conversa'; + + @override + String lastActiveAgo(String localizedTimeShort) { + return 'Ativo(a) pela última vez: $localizedTimeShort'; + } + + @override + String get leave => 'Sair'; + + @override + String get leftTheChat => 'Saiu da conversa'; + + @override + String get license => 'Licença'; + + @override + String get lightTheme => 'Claro'; + + @override + String loadCountMoreParticipants(int count) { + return 'Carregar mais $count participantes'; + } + + @override + String get dehydrate => 'Exportar sessão e limpar dispositivo'; + + @override + String get dehydrateWarning => + 'Esta ação não pode ser revertida. Assegura-te que guardas bem a cópia de segurança.'; + + @override + String get dehydrateTor => 'Utilizadores do TOR: Exportar sessão'; + + @override + String get dehydrateTorLong => + 'Para utilizadores do TOR, é recomendado exportar a sessão antes de fechar a janela.'; + + @override + String get hydrateTor => 'Utilizadores do TOR: Importar sessão'; + + @override + String get hydrateTorLong => + 'Exportaste a tua sessão na última vez que estiveste no TOR? Importa-a rapidamente e continua a conversar.'; + + @override + String get hydrate => 'Restaurar a partir de cópia de segurança'; + + @override + String get loadingPleaseWait => 'A carregar... Por favor aguarde.'; + + @override + String get loadMore => 'Carregar mais…'; + + @override + String get locationDisabledNotice => + 'Os serviços de localização estão desativados. Por favor, ativa-os para poder partilhar a sua localização.'; + + @override + String get locationPermissionDeniedNotice => + 'Permissão de localização recusada. Por favor, concede permissão para poderes partilhar a tua posição.'; + + @override + String get login => 'Entrar'; + + @override + String logInTo(String homeserver) { + return 'Entrar em $homeserver'; + } + + @override + String get logout => 'Sair'; + + @override + String get memberChanges => 'Alterações de membros'; + + @override + String get mention => 'Mencionar'; + + @override + String get messages => 'Mensagens'; + + @override + String get moderator => 'Moderador'; + + @override + String get muteChat => 'Silenciar conversa'; + + @override + String get needPantalaimonWarning => 'Por favor,'; + + @override + String get newChat => 'Nova conversa'; + + @override + String get newMessageInFluffyChat => 'Nova mensagem no FluffyChat'; + + @override + String get newVerificationRequest => 'Novo pedido de verificação!'; + + @override + String get next => 'Próximo'; + + @override + String get no => 'Não'; + + @override + String get noConnectionToTheServer => 'Nenhuma ligação ao servidor'; + + @override + String get noEmotesFound => 'Nenhuns emotes encontrados. 😕'; + + @override + String get noEncryptionForPublicRooms => + 'Só podes ativar a encriptação quando a sala não for publicamente acessível.'; + + @override + String get noGoogleServicesWarning => + 'Parece que não tens nenhuns serviços da Google no seu telemóvel. É uma boa decisão para a sua privacidade! Para receber notificações instantâneas no FluffyChat, recomendamos que uses https://microg.org/ ou https://unifiedpush.org/.'; + + @override + String noMatrixServer(String server1, String server2) { + return '$server1 não é um servidor Matrix, usar $server2?'; + } + + @override + String get none => 'Nenhum'; + + @override + String get noPasswordRecoveryDescription => + 'Ainda não adicionaste uma forma de recuperar a tua palavra-passe.'; + + @override + String get noPermission => 'Sem permissão'; + + @override + String get noRoomsFound => 'Não foram encontradas nenhumas salas…'; + + @override + String get notifications => 'Notificações'; + + @override + String get notificationsEnabledForThisAccount => + 'Notificações ativadas para esta conta'; + + @override + String numUsersTyping(int count) { + return 'Estão $count utilizadores(as) a escrever…'; + } + + @override + String get obtainingLocation => 'A obter localização…'; + + @override + String get offensive => 'Offensivo'; + + @override + String get offline => 'Offline'; + + @override + String get ok => 'ok'; + + @override + String get online => 'Online'; + + @override + String get onlineKeyBackupEnabled => + 'A cópia de segurança online de chaves está ativada'; + + @override + String get oopsPushError => + 'Ups! Infelizmente, ocorreu um erro ao configurar as notificações instantâneas.'; + + @override + String get oopsSomethingWentWrong => 'Ups, algo correu mal…'; + + @override + String get openAppToReadMessages => 'Abrir aplicação para ler mensagens'; + + @override + String get openCamera => 'Abrir câmara'; + + @override + String get oneClientLoggedOut => 'Um dos teus clientes terminou sessão'; + + @override + String get addAccount => 'Adicionar conta'; + + @override + String get editBundlesForAccount => 'Editar pacotes para esta conta'; + + @override + String get addToBundle => 'Adicionar ao pacote'; + + @override + String get removeFromBundle => 'Remover deste pacote'; + + @override + String get bundleName => 'Nome do pacote'; + + @override + String get enableMultiAccounts => + '(BETA) Ativar múltiplas contas neste dispositivo'; + + @override + String get openInMaps => 'Abrir nos mapas'; + + @override + String get link => 'Ligação'; + + @override + String get serverRequiresEmail => + 'Este servidor precisa de validar o teu endereço de correio eletrónico para o registo.'; + + @override + String get or => 'Ou'; + + @override + String get participant => 'Participante'; + + @override + String get passphraseOrKey => 'senha ou chave de recuperação'; + + @override + String get password => 'Palavra-passe'; + + @override + String get passwordForgotten => 'Palavra-passe esquecida'; + + @override + String get passwordHasBeenChanged => 'A palavra-passe foi alterada'; + + @override + String get passwordRecovery => 'Recuperação de palavra-passe'; + + @override + String get people => 'Pessoas'; + + @override + String get pickImage => 'Escolher uma imagem'; + + @override + String get pin => 'Afixar'; + + @override + String play(String fileName) { + return 'Reproduzir $fileName'; + } + + @override + String get pleaseChoose => 'Por favor, escolhe'; + + @override + String get pleaseChooseAPasscode => 'Por favor, escolhe um código-passe'; + + @override + String get pleaseClickOnLink => + 'Por favor, clica na ligação no correio eletrónico e depois continua.'; + + @override + String get pleaseEnter4Digits => + 'Por favor, insere 4 dígitos ou deixa vazio para desativar o bloqueio da aplicação.'; + + @override + String get pleaseEnterYourPassword => 'Por favor, insere a tua palavra-passe'; + + @override + String get pleaseEnterYourPin => 'Por favor, insere o teu código'; + + @override + String get pleaseEnterYourUsername => + 'Por favor, insere o teu nome de utilizador'; + + @override + String get pleaseFollowInstructionsOnWeb => + 'Por favor, segue as instruções no website e clica em \"Seguinte\".'; + + @override + String get privacy => 'Privacidade'; + + @override + String get publicRooms => 'Salas públicas'; + + @override + String get reason => 'Razão'; + + @override + String get recording => 'A gravar'; + + @override + String redactedAnEvent(String username) { + return '$username eliminou um evento'; + } + + @override + String get redactMessage => 'Eliminar mensagem'; + + @override + String get register => 'Registar'; + + @override + String get reject => 'Rejeitar'; + + @override + String rejectedTheInvitation(String username) { + return '$username rejeitou o convite'; + } + + @override + String get rejoin => 'Reentrar'; + + @override + String get removeAllOtherDevices => 'Remover todos os outros dispositivos'; + + @override + String removedBy(String username) { + return 'Removido por $username'; + } + + @override + String get removeDevice => 'Remover dispositivo'; + + @override + String get unbanFromChat => 'Perdoar nesta conversa'; + + @override + String get removeYourAvatar => 'Remover o teu avatar'; + + @override + String get replaceRoomWithNewerVersion => + 'Substituir sala com versão mais recente'; + + @override + String get reply => 'Responder'; + + @override + String get reportMessage => 'Reportar mensagem'; + + @override + String get requestPermission => 'Pedir permissão'; + + @override + String get roomHasBeenUpgraded => 'A sala foi atualizada'; + + @override + String get roomVersion => 'Versão da sala'; + + @override + String get saveFile => 'Guardar ficheiro'; + + @override + String get search => 'Procurar'; + + @override + String get security => 'Segurança'; + + @override + String seenByUser(String username) { + return 'Visto por $username'; + } + + @override + String get send => 'Enviar'; + + @override + String get sendAMessage => 'Enviar a mensagem'; + + @override + String get sendAsText => 'Enviar como texto'; + + @override + String get sendAudio => 'Enviar áudio'; + + @override + String get sendFile => 'Enviar ficheiro'; + + @override + String get sendImage => 'Enviar imagem'; + + @override + String get sendMessages => 'Enviar mensagens'; + + @override + String get sendOriginal => 'Enviar original'; + + @override + String get sendSticker => 'Enviar autocolante'; + + @override + String get sendVideo => 'Enviar vídeo'; + + @override + String sentAFile(String username) { + return '$username enviar um ficheiro'; + } + + @override + String sentAnAudio(String username) { + return '$username enviar um áudio'; + } + + @override + String sentAPicture(String username) { + return '$username enviar uma imagem'; + } + + @override + String sentASticker(String username) { + return '$username enviou um autocolante'; + } + + @override + String sentAVideo(String username) { + return '$username enviou um vídeo'; + } +} diff --git a/lib/generated/l10n/l10n_ro.dart b/lib/generated/l10n/l10n_ro.dart new file mode 100644 index 0000000..ad97a7c --- /dev/null +++ b/lib/generated/l10n/l10n_ro.dart @@ -0,0 +1,2762 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'l10n.dart'; + +// ignore_for_file: type=lint + +/// The translations for Romanian Moldavian Moldovan (`ro`). +class L10nRo extends L10n { + L10nRo([String locale = 'ro']) : super(locale); + + @override + String get noSendPermission => 'You can\'t send messages here'; + + @override + String get alwaysUse24HourFormat => 'false'; + + @override + String get repeatPassword => 'Repetați parola'; + + @override + String get notAnImage => 'Not an image file.'; + + @override + String get setCustomPermissionLevel => 'Set custom permission level'; + + @override + String get setPermissionsLevelDescription => + 'Please choose a predefined role below or enter a custom permission level between 0 and 100.'; + + @override + String get ignoreUser => 'Ignore user'; + + @override + String get normalUser => 'Normal user'; + + @override + String get remove => 'Eliminați'; + + @override + String get importNow => 'Import now'; + + @override + String get importEmojis => 'Import Emojis'; + + @override + String get importFromZipFile => 'Import from .zip file'; + + @override + String get exportEmotePack => 'Export Emote pack as .zip'; + + @override + String get replace => 'Replace'; + + @override + String get about => 'Despre'; + + @override + String aboutHomeserver(String homeserver) { + return 'About $homeserver'; + } + + @override + String get accept => 'Accept'; + + @override + String acceptedTheInvitation(String username) { + return '$username a aceptat invitați'; + } + + @override + String get account => 'Cont'; + + @override + String activatedEndToEndEncryption(String username) { + return '$username a activat criptarea end-to-end'; + } + + @override + String get addEmail => 'Adăugați email'; + + @override + String get confirmMatrixId => + 'Vă rugăm să confirmați Matrix ID-ul vostru să ștergeți contul vostru.'; + + @override + String supposedMxid(String mxid) { + return 'ID-ul ar trebuii să fie $mxid'; + } + + @override + String get addChatDescription => 'Add a chat description...'; + + @override + String get addToSpace => 'Adăugați la spațiu'; + + @override + String get admin => 'Administrator'; + + @override + String get alias => 'poreclă'; + + @override + String get all => 'Toate'; + + @override + String get allChats => 'Toate Chaturile'; + + @override + String get commandHint_roomupgrade => + 'Upgrade this room to the given room version'; + + @override + String get commandHint_googly => 'Trimiteți câțiva ochi googly'; + + @override + String get commandHint_cuddle => 'Trimiteți o îmbrățișare'; + + @override + String get commandHint_hug => 'Trimiteți o îmbrățișare'; + + @override + String googlyEyesContent(String senderName) { + return '$senderName v-a trimis ochi googly'; + } + + @override + String cuddleContent(String senderName) { + return '$senderName vă îmbrățișează'; + } + + @override + String hugContent(String senderName) { + return '$senderName vă îmbrățișează'; + } + + @override + String answeredTheCall(String senderName) { + return '$senderName a acceptat apelul'; + } + + @override + String get anyoneCanJoin => 'Oricine se poate alătura'; + + @override + String get appLock => 'Lacăt aplicație'; + + @override + String get appLockDescription => + 'Lock the app when not using with a pin code'; + + @override + String get archive => 'Arhivă'; + + @override + String get areGuestsAllowedToJoin => 'Vizitatorii \"guest\" se pot alătura'; + + @override + String get areYouSure => 'Ești sigur?'; + + @override + String get areYouSureYouWantToLogout => + 'Sunteți sigur că doriți să vă deconectați?'; + + @override + String get askSSSSSign => + 'Pentru a putea conecta cealaltă persoană, te rog introdu parola sau cheia ta de recuperare.'; + + @override + String askVerificationRequest(String username) { + return 'Accepți cererea de verificare de la $username?'; + } + + @override + String get autoplayImages => 'Anima automatic stickere și emote animate'; + + @override + String badServerLoginTypesException(String serverVersions, + String supportedVersions, Object suportedVersions) { + return 'Homeserver-ul suportă următoarele feluri de login:\n$serverVersions\nDar această aplicație suportă numai:\n$supportedVersions'; + } + + @override + String get sendTypingNotifications => 'Send typing notifications'; + + @override + String get swipeRightToLeftToReply => 'Swipe right to left to reply'; + + @override + String get sendOnEnter => 'Trimite cu tasta enter'; + + @override + String badServerVersionsException(String serverVersions, + String supportedVersions, Object serverVerions, Object suportedVersions) { + return 'Homeserver-ul suportă versiunele de Spec următoare:\n$serverVersions\nDar această aplicație suportă numai $supportedVersions'; + } + + @override + String countChatsAndCountParticipants(int chats, int participants) { + return '$chats chats and $participants participants'; + } + + @override + String get noMoreChatsFound => 'No more chats found...'; + + @override + String get noChatsFoundHere => + 'No chats found here yet. Start a new chat with someone by using the button below. ⤵️'; + + @override + String get joinedChats => 'Joined chats'; + + @override + String get unread => 'Unread'; + + @override + String get space => 'Space'; + + @override + String get spaces => 'Spaces'; + + @override + String get banFromChat => 'Interzis din conversație'; + + @override + String get banned => 'Interzis'; + + @override + String bannedUser(String username, String targetName) { + return '$username a interzis pe $targetName'; + } + + @override + String get blockDevice => 'Blochează dispozitiv'; + + @override + String get blocked => 'Blocat'; + + @override + String get botMessages => 'Mesaje Bot'; + + @override + String get cancel => 'Anulează'; + + @override + String cantOpenUri(String uri) { + return 'Nu se poate deschide URI-ul $uri'; + } + + @override + String get changeDeviceName => 'Schimbă numele dispozitiv'; + + @override + String changedTheChatAvatar(String username) { + return '$username a schimbat poza conversați'; + } + + @override + String changedTheChatDescriptionTo(String username, String description) { + return '$username a schimbat descrierea grupului în \'$description\''; + } + + @override + String changedTheChatNameTo(String username, String chatname) { + return '$username a schimbat porecla în \'$chatname\''; + } + + @override + String changedTheChatPermissions(String username) { + return '$username a schimbat permisiunile chatului'; + } + + @override + String changedTheDisplaynameTo(String username, String displayname) { + return '$username s-a schimbat displayname la: \'$displayname\''; + } + + @override + String changedTheGuestAccessRules(String username) { + return '$username a schimbat regulile pentru acesul musafirilor'; + } + + @override + String changedTheGuestAccessRulesTo(String username, String rules) { + return '$username a schimbat regulile pentru acesul musafirilor la: $rules'; + } + + @override + String changedTheHistoryVisibility(String username) { + return '$username a schimbat vizibilitatea istoriei chatului'; + } + + @override + String changedTheHistoryVisibilityTo(String username, String rules) { + return '$username a schimbat vizibilitatea istoriei chatului la: $rules'; + } + + @override + String changedTheJoinRules(String username) { + return '$username a schimbat regulile de alăturare'; + } + + @override + String changedTheJoinRulesTo(String username, String joinRules) { + return '$username a schimbat regulile de alăturare la: $joinRules'; + } + + @override + String changedTheProfileAvatar(String username) { + return '$username s-a schimbat avatarul'; + } + + @override + String changedTheRoomAliases(String username) { + return '$username a schimbat pseudonimele camerei'; + } + + @override + String changedTheRoomInvitationLink(String username) { + return '$username a schimbat linkul de invitație'; + } + + @override + String get changePassword => 'Schimbați parola'; + + @override + String get changeTheHomeserver => 'Schimbați homeserver-ul'; + + @override + String get changeTheme => 'Schimbați tema aplicației'; + + @override + String get changeTheNameOfTheGroup => 'Schimbați numele grupului'; + + @override + String get changeYourAvatar => 'Schimbați avatarul vostru'; + + @override + String get channelCorruptedDecryptError => 'Criptarea a fost corupată'; + + @override + String get chat => 'Chat'; + + @override + String get yourChatBackupHasBeenSetUp => + 'Backup-ul vostru de chat a fost configurat.'; + + @override + String get chatBackup => 'Backup de chat'; + + @override + String get chatBackupDescription => + 'Mesajele voastre vechi sunt sigurate cu o cheie de recuperare. Vă rugăm să nu o pierdeți.'; + + @override + String get chatDetails => 'Detalii de chat'; + + @override + String get chatHasBeenAddedToThisSpace => + 'Chatul a fost adăugat la acest spațiu'; + + @override + String get chats => 'Chaturi'; + + @override + String get chooseAStrongPassword => 'Alegeți o parolă robustă'; + + @override + String get clearArchive => 'Ștergeți arhiva'; + + @override + String get close => 'Închideți'; + + @override + String get commandHint_markasdm => 'Marcați ca cameră de mesaje directe'; + + @override + String get commandHint_markasgroup => 'Marcați ca grup'; + + @override + String get commandHint_ban => + 'Interziceți acesul utilizatorului ales din această cameră'; + + @override + String get commandHint_clearcache => 'Ștergeți cache'; + + @override + String get commandHint_create => + 'Creați un grup de chat gol\nFolosiți --no-encryption să dezactivați criptare'; + + @override + String get commandHint_discardsession => 'Renunțați sesiunea'; + + @override + String get commandHint_dm => + 'Porniți un chat direct\nFolosiți --no-encryption să dezactivați criptare'; + + @override + String get commandHint_html => 'Trimiteți text format ca HTML'; + + @override + String get commandHint_invite => + 'Invitați utilizatorul ales la această cameră'; + + @override + String get commandHint_join => 'Alăturați-vă la camera alesă'; + + @override + String get commandHint_kick => + 'Dați afară pe utilizatorul ales din această cameră'; + + @override + String get commandHint_leave => 'Renunțați la această cameră'; + + @override + String get commandHint_me => 'Descrieți-vă'; + + @override + String get commandHint_myroomavatar => + 'Alegeți un avatar pentru această cameră (foloșește mxc-uri)'; + + @override + String get commandHint_myroomnick => + 'Alegeți un displayname pentru această cameră'; + + @override + String get commandHint_op => + 'Stabiliți nivelul de putere a utilizatorul ales (implicit: 50)'; + + @override + String get commandHint_plain => 'Trimiteți text simplu/neformatat'; + + @override + String get commandHint_react => 'Trimiteți răspuns ca reacție'; + + @override + String get commandHint_send => 'Trimiteți text'; + + @override + String get commandHint_unban => + 'Dezinterziceți utilizatorul ales din această cameră'; + + @override + String get commandInvalid => 'Comandă nevalibilă'; + + @override + String commandMissing(String command) { + return '$command nu este o comandă.'; + } + + @override + String get compareEmojiMatch => 'Vă rugăm să comparați emoji-urile'; + + @override + String get compareNumbersMatch => 'Vă rugăm să comparați numerele'; + + @override + String get configureChat => 'Configurați chat'; + + @override + String get confirm => 'Confirmați'; + + @override + String get connect => 'Conectați'; + + @override + String get contactHasBeenInvitedToTheGroup => + 'Contactul a fost invitat la grup'; + + @override + String get containsDisplayName => 'Conține displayname'; + + @override + String get containsUserName => 'Conține nume de utilizator'; + + @override + String get contentHasBeenReported => + 'Conținutul a fost reportat la administratori serverului'; + + @override + String get copiedToClipboard => 'Copiat în clipboard'; + + @override + String get copy => 'Copiați'; + + @override + String get copyToClipboard => 'Copiați în clipboard'; + + @override + String couldNotDecryptMessage(String error) { + return 'Dezcriptarea mesajului a eșuat: $error'; + } + + @override + String countParticipants(int count) { + return '$count participanți'; + } + + @override + String get create => 'Creați'; + + @override + String createdTheChat(String username) { + return '💬$username a creat chatul'; + } + + @override + String get createGroup => 'Create group'; + + @override + String get createNewSpace => 'Spațiu nou'; + + @override + String get currentlyActive => 'Activ acum'; + + @override + String get darkTheme => 'Întunecat'; + + @override + String dateAndTimeOfDay(String date, String timeOfDay) { + return '$date, $timeOfDay'; + } + + @override + String dateWithoutYear(String month, String day) { + return '$month-$day'; + } + + @override + String dateWithYear(String year, String month, String day) { + return '$year-$month-$day'; + } + + @override + String get deactivateAccountWarning => + 'Această acțiune va dezactiva contul vostru. Nu poate fi anulat! Sunteți sigur?'; + + @override + String get defaultPermissionLevel => 'Nivel de permisiuni implicită'; + + @override + String get delete => 'Ștergeți'; + + @override + String get deleteAccount => 'Ștergeți contul'; + + @override + String get deleteMessage => 'Ștergeți mesajul'; + + @override + String get device => 'Dispozitiv'; + + @override + String get deviceId => 'ID-ul Dispozitiv'; + + @override + String get devices => 'Dispozitive'; + + @override + String get directChats => 'Chaturi directe'; + + @override + String get allRooms => 'Toate chaturi de grup'; + + @override + String get displaynameHasBeenChanged => 'Displayname a fost schimbat'; + + @override + String get downloadFile => 'Descărcați fișierul'; + + @override + String get edit => 'Editați'; + + @override + String get editBlockedServers => 'Editați servere blocate'; + + @override + String get chatPermissions => 'Chat permissions'; + + @override + String get editDisplayname => 'Schimbați displayname'; + + @override + String get editRoomAliases => 'Schimbați pseudonimele camerei'; + + @override + String get editRoomAvatar => 'Schimbați avatarul din cameră'; + + @override + String get emoteExists => 'Emote deja există!'; + + @override + String get emoteInvalid => 'Shortcode de emote nevalibil!'; + + @override + String get emoteKeyboardNoRecents => + 'Recently-used emotes will appear here...'; + + @override + String get emotePacks => 'Pachete de emoturi din cameră'; + + @override + String get emoteSettings => 'Configurări Emote'; + + @override + String get globalChatId => 'Global chat ID'; + + @override + String get accessAndVisibility => 'Access and visibility'; + + @override + String get accessAndVisibilityDescription => + 'Who is allowed to join this chat and how the chat can be discovered.'; + + @override + String get calls => 'Calls'; + + @override + String get customEmojisAndStickers => 'Custom emojis and stickers'; + + @override + String get customEmojisAndStickersBody => + 'Add or share custom emojis or stickers which can be used in any chat.'; + + @override + String get emoteShortcode => 'Shortcode de emote'; + + @override + String get emoteWarnNeedToPick => + 'Trebuie să alegeți shortcode pentru emote și o imagine!'; + + @override + String get emptyChat => 'Chat gol'; + + @override + String get enableEmotesGlobally => 'Activați pachet de emote global'; + + @override + String get enableEncryption => 'Activați criptare'; + + @override + String get enableEncryptionWarning => + 'Activând criptare, nu mai puteți să o dezactivați în viitor. Sunteți sigur?'; + + @override + String get encrypted => 'Criptat'; + + @override + String get encryption => 'Criptare'; + + @override + String get encryptionNotEnabled => 'Criptare nu e activată'; + + @override + String endedTheCall(String senderName) { + return '$senderName a terminat apelul'; + } + + @override + String get enterAnEmailAddress => 'Introduceți o adresă email'; + + @override + String get homeserver => 'Homeserver'; + + @override + String get enterYourHomeserver => 'Introduceți homeserverul vostru'; + + @override + String errorObtainingLocation(String error) { + return 'Obținerea locației a eșuat: $error'; + } + + @override + String get everythingReady => 'Totul e gata!'; + + @override + String get extremeOffensive => 'De foarte mare ofensă'; + + @override + String get fileName => 'Nume de fișier'; + + @override + String get fluffychat => 'FluffyChat'; + + @override + String get fontSize => 'Mărimea fontului'; + + @override + String get forward => 'Înainte'; + + @override + String get fromJoining => 'De la alăturare'; + + @override + String get fromTheInvitation => 'De la invitația'; + + @override + String get goToTheNewRoom => 'Mergeți la camera nouă'; + + @override + String get group => 'Grup'; + + @override + String get chatDescription => 'Chat description'; + + @override + String get chatDescriptionHasBeenChanged => 'Chat description changed'; + + @override + String get groupIsPublic => 'Grupul este public'; + + @override + String get groups => 'Grupuri'; + + @override + String groupWith(String displayname) { + return 'Grup cu $displayname'; + } + + @override + String get guestsAreForbidden => 'Musafiri sunt interziși'; + + @override + String get guestsCanJoin => 'Musafiri pot să se alăture'; + + @override + String hasWithdrawnTheInvitationFor(String username, String targetName) { + return '$username a retras invitația pentru $targetName'; + } + + @override + String get help => 'Ajutor'; + + @override + String get hideRedactedEvents => 'Ascunde evenimente redactate'; + + @override + String get hideRedactedMessages => 'Hide redacted messages'; + + @override + String get hideRedactedMessagesBody => + 'If someone redacts a message, this message won\'t be visible in the chat anymore.'; + + @override + String get hideInvalidOrUnknownMessageFormats => + 'Hide invalid or unknown message formats'; + + @override + String get howOffensiveIsThisContent => 'Cât de ofensiv este acest conținut?'; + + @override + String get id => 'ID'; + + @override + String get identity => 'Identitate'; + + @override + String get block => 'Block'; + + @override + String get blockedUsers => 'Blocked users'; + + @override + String get blockListDescription => + 'You can block users who are disturbing you. You won\'t be able to receive any messages or room invites from the users on your personal block list.'; + + @override + String get blockUsername => 'Ignore username'; + + @override + String get iHaveClickedOnLink => 'Am făcut click pe link'; + + @override + String get incorrectPassphraseOrKey => + 'Parolă sau cheie de recuperare incorectă'; + + @override + String get inoffensive => 'Inofensiv'; + + @override + String get inviteContact => 'Invitați contact'; + + @override + String inviteContactToGroupQuestion(Object contact, Object groupName) { + return 'Do you want to invite $contact to the chat \"$groupName\"?'; + } + + @override + String inviteContactToGroup(String groupName) { + return 'Invitați contact la $groupName'; + } + + @override + String get noChatDescriptionYet => 'No chat description created yet.'; + + @override + String get tryAgain => 'Try again'; + + @override + String get invalidServerName => 'Invalid server name'; + + @override + String get invited => 'Invitat'; + + @override + String get redactMessageDescription => + 'The message will be redacted for all participants in this conversation. This cannot be undone.'; + + @override + String get optionalRedactReason => + '(Optional) Reason for redacting this message...'; + + @override + String invitedUser(String username, String targetName) { + return '📩$username a invitat $targetName'; + } + + @override + String get invitedUsersOnly => 'Numai utilizatori invitați'; + + @override + String get inviteForMe => 'Invitați pentru mine'; + + @override + String inviteText(String username, String link) { + return '$username v-a invitat la FluffyChat.\n1. Instalați FluffyChat: https://fluffychat.im\n2. Înregistrați-vă sau conectați-vă\n3. Deschideți invitația: $link'; + } + + @override + String get isTyping => 'tastează…'; + + @override + String joinedTheChat(String username) { + return '👋$username a intrat în chat'; + } + + @override + String get joinRoom => 'Alăturați la cameră'; + + @override + String kicked(String username, String targetName) { + return '👞$username a dat afară pe $targetName'; + } + + @override + String kickedAndBanned(String username, String targetName) { + return '🙅$username a dat afară și a interzis pe $targetName din cameră'; + } + + @override + String get kickFromChat => 'Dați afară din chat'; + + @override + String lastActiveAgo(String localizedTimeShort) { + return 'Ultima dată activ: $localizedTimeShort'; + } + + @override + String get leave => 'Renunțați'; + + @override + String get leftTheChat => 'A plecat din chat'; + + @override + String get license => 'Permis'; + + @override + String get lightTheme => 'Luminat'; + + @override + String loadCountMoreParticipants(int count) { + return 'Încărcați încă mai $count participanți'; + } + + @override + String get dehydrate => 'Exportați sesiunea și ștergeți dispozitivul'; + + @override + String get dehydrateWarning => + 'Această actiune nu poate fi anulată. Asigurați-vă că păstrați fișierul backup.'; + + @override + String get dehydrateTor => 'Utilizatori de TOR: Exportați sesiunea'; + + @override + String get dehydrateTorLong => + 'Pentru utilizatori de TOR, este recomandat să exportați sesiunea înainte de a închideți fereastra.'; + + @override + String get hydrateTor => 'Utilizatori TOR: Importați sesiune exportată'; + + @override + String get hydrateTorLong => + 'Ați exportat sesiunea vostră ultima dată pe TOR? Importați-o repede și continuați să conversați.'; + + @override + String get hydrate => 'Restaurați din fișier backup'; + + @override + String get loadingPleaseWait => 'Încărcând... Vă rugăm să așteptați.'; + + @override + String get loadMore => 'Încarcă mai multe…'; + + @override + String get locationDisabledNotice => + 'Servicile de locație sunt dezactivate. Vă rugăm să le activați să împărțiți locația voastră.'; + + @override + String get locationPermissionDeniedNotice => + 'Permisiunea locației blocată. Vă rugăm să o dezblocați să împărțiți locația voastră.'; + + @override + String get login => 'Conectați-vă'; + + @override + String logInTo(String homeserver) { + return 'Conectați-vă la $homeserver'; + } + + @override + String get logout => 'Deconectați-vă'; + + @override + String get memberChanges => 'Schimbări de membri'; + + @override + String get mention => 'Menționați'; + + @override + String get messages => 'Mesaje'; + + @override + String get messagesStyle => 'Messages:'; + + @override + String get moderator => 'Moderator'; + + @override + String get muteChat => 'Amuțați chatul'; + + @override + String get needPantalaimonWarning => + 'Vă rugăm să fiți conștienți că e nevoie de Pantalaimon să folosiți criptare end-to-end deocamdată.'; + + @override + String get newChat => 'Chat nou'; + + @override + String get newMessageInFluffyChat => '💬 Mesaj nou în FluffyChat'; + + @override + String get newVerificationRequest => 'Cerere de verificare nouă!'; + + @override + String get next => 'Următor'; + + @override + String get no => 'Nu'; + + @override + String get noConnectionToTheServer => 'Fără conexiune la server'; + + @override + String get noEmotesFound => 'Nu s-a găsit nici un emote. 😕'; + + @override + String get noEncryptionForPublicRooms => + 'Criptare nu poate fi activată până când camera este accesibilă public.'; + + @override + String get noGoogleServicesWarning => + 'Se pare că nu aveți serviciile google pe dispozitivul vostru. Această decizie este bună pentru confidențialitatea voastră! Să primiți notificari push în FluffyChat vă recomandăm https://microg.org/ sau https://unifiedpush.org/.'; + + @override + String noMatrixServer(String server1, String server2) { + return '$server1 nu este server matrix, înlocuiți cu $server2?'; + } + + @override + String get shareInviteLink => 'Share invite link'; + + @override + String get scanQrCode => 'Scanați cod QR'; + + @override + String get none => 'Niciunul'; + + @override + String get noPasswordRecoveryDescription => + 'Nu ați adăugat încă nici un mod de recuperare pentru parola voastră.'; + + @override + String get noPermission => 'Fără permisie'; + + @override + String get noRoomsFound => 'Nici o cameră nu s-a găsit…'; + + @override + String get notifications => 'Notificări'; + + @override + String get notificationsEnabledForThisAccount => + 'Notificări activate pentru acest cont'; + + @override + String numUsersTyping(int count) { + return '$count utilizatori tastează…'; + } + + @override + String get obtainingLocation => 'Obținând locație…'; + + @override + String get offensive => 'Ofensiv'; + + @override + String get offline => 'Offline'; + + @override + String get ok => 'Ok'; + + @override + String get online => 'Online'; + + @override + String get onlineKeyBackupEnabled => 'Backup de cheie online este activat'; + + @override + String get oopsPushError => + 'Ups! Din păcate, o eroare s-a întâmplat cu stabilirea de notificări push.'; + + @override + String get oopsSomethingWentWrong => 'Ups, ceva a eșuat…'; + + @override + String get openAppToReadMessages => 'Deschideți aplicația să citiți mesajele'; + + @override + String get openCamera => 'Deschideți camera'; + + @override + String get openVideoCamera => 'Deschideți camera pentru video'; + + @override + String get oneClientLoggedOut => + 'Unul dintre clienților voștri a fost deconectat'; + + @override + String get addAccount => 'Adăugați cont'; + + @override + String get editBundlesForAccount => 'Editați pachetele pentru acest cont'; + + @override + String get addToBundle => 'Adăugați în pachet'; + + @override + String get removeFromBundle => 'Stergeți din acest pachet'; + + @override + String get bundleName => 'Numele pachetului'; + + @override + String get enableMultiAccounts => + '(BETA) Activați multiple conturi pe acest dispozitiv'; + + @override + String get openInMaps => 'Deschideți pe hartă'; + + @override + String get link => 'Link'; + + @override + String get serverRequiresEmail => + 'Acest server trebuie să valideze emailul vostru pentru înregistrare.'; + + @override + String get or => 'Sau'; + + @override + String get participant => 'Participant'; + + @override + String get passphraseOrKey => 'frază de acces sau cheie de recuperare'; + + @override + String get password => 'Parolă'; + + @override + String get passwordForgotten => 'Parola uitată'; + + @override + String get passwordHasBeenChanged => 'Parola a fost schimbată'; + + @override + String get hideMemberChangesInPublicChats => + 'Hide member changes in public chats'; + + @override + String get hideMemberChangesInPublicChatsBody => + 'Do not show in the chat timeline if someone joins or leaves a public chat to improve readability.'; + + @override + String get overview => 'Overview'; + + @override + String get notifyMeFor => 'Notify me for'; + + @override + String get passwordRecoverySettings => 'Password recovery settings'; + + @override + String get passwordRecovery => 'Recuperare parolei'; + + @override + String get people => 'Persoane'; + + @override + String get pickImage => 'Alegeți o imagine'; + + @override + String get pin => 'Fixați'; + + @override + String play(String fileName) { + return 'Redați $fileName'; + } + + @override + String get pleaseChoose => 'Vă rugăm să alegeți'; + + @override + String get pleaseChooseAPasscode => 'Vă rugăm să alegeți un passcode'; + + @override + String get pleaseClickOnLink => + 'Vă rugăm să deschideți linkul din email și apoi să procedați.'; + + @override + String get pleaseEnter4Digits => + 'Vă rugăm să introduceți 4 cifre sau puteți să lăsați gol să dezactivați lacătul aplicației.'; + + @override + String get pleaseEnterRecoveryKey => + 'Vă rugăm să introduceți cheia voastră de recuperare:'; + + @override + String get pleaseEnterYourPassword => + 'Vă rugăm să introduceți parola voastră'; + + @override + String get pleaseEnterYourPin => 'Vă rugăm să introduceți pinul vostru'; + + @override + String get pleaseEnterYourUsername => + 'Vă rugăm să introduceți username-ul vostru'; + + @override + String get pleaseFollowInstructionsOnWeb => + 'Vă rugăm să urmați instrucțiunele pe website și apoi să apăsați pe următor.'; + + @override + String get privacy => 'Confidențialitate'; + + @override + String get publicRooms => 'Camere Publice'; + + @override + String get pushRules => 'Regulile Push'; + + @override + String get reason => 'Motiv'; + + @override + String get recording => 'Înregistrare'; + + @override + String redactedBy(String username) { + return 'Redacted by $username'; + } + + @override + String get directChat => 'Direct chat'; + + @override + String redactedByBecause(String username, String reason) { + return 'Redacted by $username because: \"$reason\"'; + } + + @override + String redactedAnEvent(String username) { + return '$username a redactat un eveniment'; + } + + @override + String get redactMessage => 'Redactați mesaj'; + + @override + String get register => 'Înregistrați-vă'; + + @override + String get reject => 'Respingeți'; + + @override + String rejectedTheInvitation(String username) { + return '$username a respins invitația'; + } + + @override + String get rejoin => 'Reintrați'; + + @override + String get removeAllOtherDevices => 'Eliminați toate celelalte dispozitive'; + + @override + String removedBy(String username) { + return 'Eliminat de $username'; + } + + @override + String get removeDevice => 'Eliminați dispozitivul'; + + @override + String get unbanFromChat => 'Revoca interzicerea din chat'; + + @override + String get removeYourAvatar => 'Ștergeți avatarul'; + + @override + String get replaceRoomWithNewerVersion => + 'Înlocuiți camera cu versiune mai nouă'; + + @override + String get reply => 'Răspundeți'; + + @override + String get reportMessage => 'Raportați mesajul'; + + @override + String get translateMessage => 'Translate message'; + + @override + String get translatedMessage => 'Translated message'; + + @override + String get errorTranslatingMessage => + 'An error has occured while translating the message.'; + + @override + String get recoverMessage => 'Recover message'; + + @override + String get recoveredMessage => 'Recovered message'; + + @override + String get errorRecoveringMessage => + 'An error has occured while recovering the message.'; + + @override + String get errorRecoveringMessageNoAdmin => + 'This feature is available on Synapse homeservers only for adminstrators.'; + + @override + String get requestPermission => 'Cereți permisiune'; + + @override + String get roomHasBeenUpgraded => 'Camera a fost actualizată'; + + @override + String get roomVersion => 'Versiunea camerei'; + + @override + String get saveFile => 'Salvați fișierul'; + + @override + String get retry => 'Retry'; + + @override + String get search => 'Căutați'; + + @override + String get security => 'Securitate'; + + @override + String get recoveryKey => 'Cheie de recuperare'; + + @override + String get recoveryKeyLost => 'Cheia de recuperare pierdută?'; + + @override + String seenByUser(String username) { + return 'Văzut de $username'; + } + + @override + String get send => 'Trimiteți'; + + @override + String get sendAMessage => 'Trimiteți un mesaj'; + + @override + String get sendAsText => 'Trimiteți ca text'; + + @override + String get sendAudio => 'Trimiteți audio'; + + @override + String get sendFile => 'Trimiteți fișier'; + + @override + String get sendImage => 'Trimiteți imagine'; + + @override + String sendImages(int count) { + return 'Send $count image'; + } + + @override + String get sendMessages => 'Trimiteți mesaje'; + + @override + String get sendOriginal => 'Trimiteți original'; + + @override + String get sendSticker => 'Trimiteți sticker'; + + @override + String get sendVideo => 'Trimiteți video'; + + @override + String sentAFile(String username) { + return '📁$username a trimis un fișier'; + } + + @override + String sentAnAudio(String username) { + return '🎤$username a trimis audio'; + } + + @override + String sentAPicture(String username) { + return '🖼️ $username a trimis o poză'; + } + + @override + String sentASticker(String username) { + return '😊 $username a trimis un sticker'; + } + + @override + String sentAVideo(String username) { + return '🎥$username a trimis un video'; + } + + @override + String sentCallInformations(String senderName) { + return '$senderName a trimis informație de apel'; + } + + @override + String get separateChatTypes => 'Afișați chaturi directe și grupuri separat'; + + @override + String get setAsCanonicalAlias => 'Stabiliți ca pseudonimul primar'; + + @override + String get setCustomEmotes => 'Stabiliți emoji-uri personalizate'; + + @override + String get setChatDescription => 'Set chat description'; + + @override + String get setInvitationLink => 'Stabiliți linkul de invitație'; + + @override + String get setPermissionsLevel => 'Stabiliți nivelul de permisii'; + + @override + String get setStatus => 'Stabiliți status'; + + @override + String get settings => 'Configurări'; + + @override + String get share => 'Partajați'; + + @override + String sharedTheLocation(String username) { + return '$username sa partajat locația'; + } + + @override + String get shareLocation => 'Partajați locația'; + + @override + String get showPassword => 'Afișați parola'; + + @override + String get presenceStyle => 'Presence:'; + + @override + String get hideAvatarsInInvites => 'Hide avatars in invites'; + + @override + String get hideAvatarsInInvitesDescription => + 'Do not show room avatars in invites'; + + @override + String get presencesToggle => 'Show status messages from other users'; + + @override + String get pureBlackToggle => 'Pure Black'; + + @override + String get singlesignon => 'Autentificare unică'; + + @override + String get skip => 'Săriți peste'; + + @override + String get sourceCode => 'Codul surs'; + + @override + String get spaceIsPublic => 'Spațiul este public'; + + @override + String get spaceName => 'Numele spațiului'; + + @override + String startedACall(String senderName) { + return '$senderName a început un apel'; + } + + @override + String get startFirstChat => 'Începeți primul chatul vostru'; + + @override + String get status => 'Status'; + + @override + String get statusExampleMessage => 'Ce faceți?'; + + @override + String get submit => 'Trimiteți'; + + @override + String get synchronizingPleaseWait => + 'Sincronizează... Vă rugăm să așteptați.'; + + @override + String synchronizingPleaseWaitCounter(String percentage) { + return ' Synchronizing… ($percentage%)'; + } + + @override + String get systemTheme => 'Sistem'; + + @override + String get theyDontMatch => 'Nu sunt asemănători'; + + @override + String get theyMatch => 'Sunt asemănători'; + + @override + String get title => 'FluffyChat'; + + @override + String get toggleFavorite => 'Comutați favoritul'; + + @override + String get toggleMuted => 'Comutați amuțeștarea'; + + @override + String get toggleUnread => 'Marcați Citit/Necitit'; + + @override + String get tooManyRequestsWarning => + 'Prea multe cereri. Vă rugăm să încercați din nou mai tărziu!'; + + @override + String get transferFromAnotherDevice => 'Transfera de la alt dispozitiv'; + + @override + String get tryToSendAgain => 'Încercați să trimiteți din nou'; + + @override + String get unavailable => 'Nedisponibil'; + + @override + String unbannedUser(String username, String targetName) { + return '$username a ridicat interzicerea lui $targetName'; + } + + @override + String get unblockDevice => 'Debloca dispozitiv'; + + @override + String get unknownDevice => 'Dispozitiv necunoscut'; + + @override + String get unknownEncryptionAlgorithm => 'Algoritm de criptare necunoscut'; + + @override + String unknownEvent(String type) { + return 'Evenimet necunoscut \'$type\''; + } + + @override + String get unmuteChat => 'Dezamuțați chat'; + + @override + String get unpin => 'Anulează fixarea'; + + @override + String unreadChats(int unreadCount) { + String _temp0 = intl.Intl.pluralLogic( + unreadCount, + locale: localeName, + other: '$unreadCount chaturi necitite', + one: 'Un chat necitit', + ); + return '$_temp0'; + } + + @override + String userAndOthersAreTyping(String username, int count) { + return '$username și $count alți tastează…'; + } + + @override + String userAndUserAreTyping(String username, String username2) { + return '$username și $username2 tastează…'; + } + + @override + String userIsTyping(String username) { + return '$username tastează…'; + } + + @override + String userLeftTheChat(String username) { + return '🚪$username a plecat din chat'; + } + + @override + String get username => 'Nume de utilizator'; + + @override + String userSentUnknownEvent(String username, String type) { + return '$username a trimis un eveniment $type'; + } + + @override + String get unverified => 'Neverificat'; + + @override + String get verified => 'Verificat'; + + @override + String get verify => 'Verificați'; + + @override + String get verifyStart => 'Începeți verificare'; + + @override + String get verifySuccess => 'A reușit verificarea!'; + + @override + String get verifyTitle => 'Verificând celălalt cont'; + + @override + String get videoCall => 'Apel video'; + + @override + String get visibilityOfTheChatHistory => 'Vizibilitatea istoria chatului'; + + @override + String get visibleForAllParticipants => 'Vizibil pentru toți participanți'; + + @override + String get visibleForEveryone => 'Vizibil pentru toți'; + + @override + String get voiceMessage => 'Mesaj vocal'; + + @override + String get waitingPartnerAcceptRequest => + 'Așteptând pe partenerul să accepte cererea…'; + + @override + String get waitingPartnerEmoji => + 'Așteptând pe partenerul să accepte emoji-ul…'; + + @override + String get waitingPartnerNumbers => + 'Așteptând pe partenerul să accepte numerele…'; + + @override + String get wallpaper => 'Imagine de fundal'; + + @override + String get warning => 'Avertizment!'; + + @override + String get weSentYouAnEmail => 'V-am trimis un email'; + + @override + String get whoCanPerformWhichAction => 'Cine poate face care acțiune'; + + @override + String get whoIsAllowedToJoinThisGroup => + 'Cine se poate alătura la acest grup'; + + @override + String get whyDoYouWantToReportThis => + 'De ce doriți să reportați acest conținut?'; + + @override + String get wipeChatBackup => + 'Ștergeți backup-ul vostru de chat să creați o nouă cheie de recuperare?'; + + @override + String get withTheseAddressesRecoveryDescription => + 'Cu acestea adrese puteți să vă recuperați parola.'; + + @override + String get writeAMessage => 'Scrieți un mesaj…'; + + @override + String get yes => 'Da'; + + @override + String get you => 'Voi'; + + @override + String get youAreNoLongerParticipatingInThisChat => + 'Nu mai participați în acest chat'; + + @override + String get youHaveBeenBannedFromThisChat => + 'Ați fost interzis din acest chat'; + + @override + String get yourPublicKey => 'Cheia voastră publică'; + + @override + String get messageInfo => 'Info mesajului'; + + @override + String get time => 'Timp'; + + @override + String get messageType => 'Fel de mesaj'; + + @override + String get sender => 'Trimițător'; + + @override + String get openGallery => 'Deschideți galeria'; + + @override + String get removeFromSpace => 'Eliminați din spațiu'; + + @override + String get addToSpaceDescription => + 'Alegeți un spațiu în care să adăugați acest chat.'; + + @override + String get start => 'Începeți'; + + @override + String get pleaseEnterRecoveryKeyDescription => + 'Să vă deblocați mesajele vechi, vă rugăm să introduceți cheia de recuperare creată de o seșiune anterioră. Cheia de recuperare NU este parola voastră.'; + + @override + String get publish => 'Publicați'; + + @override + String videoWithSize(String size) { + return 'Video ($size)'; + } + + @override + String get openChat => 'Deschideți Chat'; + + @override + String get markAsRead => 'Marcați ca citit'; + + @override + String get reportUser => 'Reportați utilizator'; + + @override + String get dismiss => 'Respingeți'; + + @override + String reactedWith(String sender, String reaction) { + return '$sender a reacționat cu $reaction'; + } + + @override + String get pinMessage => 'Fixați în cameră'; + + @override + String get confirmEventUnpin => + 'Sunteți sigur că doriți să anulați permanent fixarea evenimentului?'; + + @override + String get emojis => 'Emoji-uri'; + + @override + String get placeCall => 'Faceți apel'; + + @override + String get voiceCall => 'Apel vocal'; + + @override + String get unsupportedAndroidVersion => 'Versiune de Android nesuportat'; + + @override + String get unsupportedAndroidVersionLong => + 'Această funcție are nevoie de o versiune de Android mai nouă. Vă rugăm să verificați dacă sunt actualizări sau suport de la Lineage OS.'; + + @override + String get videoCallsBetaWarning => + 'Vă rugăm să luați notă că apeluri video sunt în beta. Se poate că nu funcționează normal sau de loc pe fie care platformă.'; + + @override + String get experimentalVideoCalls => 'Apeluri video experimentale'; + + @override + String get emailOrUsername => 'Email sau nume de utilizator'; + + @override + String get indexedDbErrorTitle => 'Probleme cu modul privat'; + + @override + String get indexedDbErrorLong => + 'Stocarea de mesaje nu este activat implicit în modul privat.\nVă rugăm să vizitați\n- about:config\n- stabiliți dom.indexedDB.privateBrowsing.enabled la true\nAstfel, nu este posibil să folosiți FluffyChat.'; + + @override + String switchToAccount(String number) { + return 'Schimbați la contul $number'; + } + + @override + String get nextAccount => 'Contul următor'; + + @override + String get previousAccount => 'Contul anterior'; + + @override + String get addWidget => 'Adăugați widget'; + + @override + String get widgetVideo => 'Video'; + + @override + String get widgetEtherpad => 'Notiță text'; + + @override + String get widgetJitsi => 'Jitsi Meet'; + + @override + String get widgetCustom => 'Personalizat'; + + @override + String get widgetName => 'Nume'; + + @override + String get widgetUrlError => 'Acest URL nu este valibil.'; + + @override + String get widgetNameError => 'Vă rugăm să introduceți un nume de afișare.'; + + @override + String get errorAddingWidget => 'Adăugarea widget-ului a eșuat.'; + + @override + String get youRejectedTheInvitation => 'Ați respins invitația'; + + @override + String get youJoinedTheChat => 'Va-ți alăturat la chat'; + + @override + String get youAcceptedTheInvitation => '👍Ați acceptat invitația'; + + @override + String youBannedUser(String user) { + return 'Ați interzis pe $user'; + } + + @override + String youHaveWithdrawnTheInvitationFor(String user) { + return 'Ați retras invitația pentru $user'; + } + + @override + String youInvitedToBy(String alias) { + return '📩 You have been invited via link to:\n$alias'; + } + + @override + String youInvitedBy(String user) { + return '📩Ați fost invitat de $user'; + } + + @override + String invitedBy(String user) { + return '📩 Invited by $user'; + } + + @override + String youInvitedUser(String user) { + return '📩Ați invitat pe $user'; + } + + @override + String youKicked(String user) { + return '👞Ați dat afară pe $user'; + } + + @override + String youKickedAndBanned(String user) { + return '🙅Ați dat afară și interzis pe $user'; + } + + @override + String youUnbannedUser(String user) { + return 'Ați ridicat interzicerea lui $user'; + } + + @override + String hasKnocked(String user) { + return '🚪 $user has knocked'; + } + + @override + String get usersMustKnock => 'Users must knock'; + + @override + String get noOneCanJoin => 'No one can join'; + + @override + String userWouldLikeToChangeTheChat(String user) { + return '$user would like to join the chat.'; + } + + @override + String get noPublicLinkHasBeenCreatedYet => + 'No public link has been created yet'; + + @override + String get knock => 'Knock'; + + @override + String get users => 'Utilizatori'; + + @override + String get unlockOldMessages => 'Deblocați mesajele vechi'; + + @override + String get storeInSecureStorageDescription => + 'Păstrați cheia de recuperare în stocarea sigură a acestui dispozitiv.'; + + @override + String get saveKeyManuallyDescription => + 'Activați dialogul de partajare sistemului sau folosiți clipboard-ul să salvați manual această cheie.'; + + @override + String get storeInAndroidKeystore => 'Stoca în Android KeyStore'; + + @override + String get storeInAppleKeyChain => 'Stoca în Apple KeyChain'; + + @override + String get storeSecurlyOnThisDevice => 'Stoca sigur pe acest dispozitiv'; + + @override + String countFiles(int count) { + return '$count fișiere'; + } + + @override + String get user => 'Utilizator'; + + @override + String get custom => 'Personalizat'; + + @override + String get foregroundServiceRunning => + 'Această notificare apare când serviciul de foreground rulează.'; + + @override + String get screenSharingTitle => 'partajarea de ecran'; + + @override + String get screenSharingDetail => 'Partajați ecranul în FluffyChat'; + + @override + String get callingPermissions => 'Permisiuni de apel'; + + @override + String get callingAccount => 'Cont de apel'; + + @override + String get callingAccountDetails => + 'Permite FluffyChat să folosească aplicația de apeluri nativă android.'; + + @override + String get appearOnTop => 'Apare deasupra'; + + @override + String get appearOnTopDetails => + 'Permite aplicația să apare deasupra (nu este necesar dacă aveți FluffyChat stabilit ca cont de apeluri)'; + + @override + String get otherCallingPermissions => + 'Microfon, cameră și alte permisiuni lui FluffyChat'; + + @override + String get whyIsThisMessageEncrypted => 'De ce este acest mesaj ilizibil?'; + + @override + String get noKeyForThisMessage => + 'Această chestie poate să se întâmple când mesajul a fost trimis înainte să vă conectați contul cu acest dispozitiv.\n\nO altă explicație ar fi dacă trimițătorul a blocat dispozitivul vostru sau ceva s-a întâmplat cu conexiunea la internet\n\nPuteți să citiți mesajul în o altă seșiune? Atunci puteți să transferați mesajul de acolo! Mergeți la Configurări > Dispozitive și verificați că dispozitivele s-au verificat. Când deschideți camera în viitor și ambele seșiune sunt în foreground, cheile va fi transmise automat. \n\nDoriți să îți păstrați cheile când deconectați sau schimbați dispozitive? Fiți atenți să activați backup de chat în configurări.'; + + @override + String get newGroup => 'Grup nou'; + + @override + String get newSpace => 'Spațiu nou'; + + @override + String get enterSpace => 'Intrați în spațiu'; + + @override + String get enterRoom => 'Intrați în cameră'; + + @override + String get allSpaces => 'Toate spațiile'; + + @override + String numChats(String number) { + return '$number chaturi'; + } + + @override + String get hideUnimportantStateEvents => + 'Ascundeți evenimente de stare neimportante'; + + @override + String get hidePresences => 'Hide Status List?'; + + @override + String get doNotShowAgain => 'Nu se mai apară din nou'; + + @override + String wasDirectChatDisplayName(String oldDisplayName) { + return 'Chat gol (a fost $oldDisplayName)'; + } + + @override + String get newSpaceDescription => + 'Spațiile vă permit să vă consolidați chaturile și să stabiliți comunități private sau publice.'; + + @override + String get encryptThisChat => 'Criptați acest chat'; + + @override + String get disableEncryptionWarning => + 'Pentru motive de securitate, nu este posibil să dezactivați criptarea unui chat în care criptare este activată.'; + + @override + String get sorryThatsNotPossible => 'Scuze... acest nu este posibil'; + + @override + String get deviceKeys => 'Cheile dispozitivului:'; + + @override + String get reopenChat => 'Deschide din nou chatul'; + + @override + String get noBackupWarning => + 'Avertisment! Fără să activați backup de chat, veți pierde accesul la mesajele voastre criptate. E foarte recomandat să activați backup de chat înainte să vă deconectați.'; + + @override + String get noOtherDevicesFound => 'Nu s-a găsit alte dispozitive'; + + @override + String fileIsTooBigForServer(String max) { + return 'Serverul reportează că fișierul este prea mare să fie trimis.'; + } + + @override + String fileHasBeenSavedAt(String path) { + return 'Fișierul a fost salvat la $path'; + } + + @override + String get jumpToLastReadMessage => 'Săriți la ultimul citit mesaj'; + + @override + String get readUpToHere => 'Citit până aici'; + + @override + String get jump => 'Săriți'; + + @override + String get openLinkInBrowser => 'Deschideți linkul în browser'; + + @override + String get reportErrorDescription => + 'Ceva a eșuat. Vă rugăm să încercați din nou mai tărziu. Dacă doriți, puteți să reportați problema la dezvoltatori.'; + + @override + String get report => 'reportați'; + + @override + String get signInWithPassword => 'Conectați-vă cu parolă'; + + @override + String get pleaseTryAgainLaterOrChooseDifferentServer => + 'Vă rugăm să încercați din nou mai târziu sau să alegeți un server diferit.'; + + @override + String signInWith(String provider) { + return 'Sign in with $provider'; + } + + @override + String get profileNotFound => + 'The user could not be found on the server. Maybe there is a connection problem or the user doesn\'t exist.'; + + @override + String get setTheme => 'Set theme:'; + + @override + String get setColorTheme => 'Set color theme:'; + + @override + String get invite => 'Invite'; + + @override + String get inviteGroupChat => '📨 Invite group chat'; + + @override + String get invitePrivateChat => '📨 Invite private chat'; + + @override + String get invalidInput => 'Invalid input!'; + + @override + String wrongPinEntered(int seconds) { + return 'Wrong pin entered! Try again in $seconds seconds...'; + } + + @override + String get pleaseEnterANumber => 'Please enter a number greater than 0'; + + @override + String get archiveRoomDescription => + 'The chat will be moved to the archive. Other users will be able to see that you have left the chat.'; + + @override + String get roomUpgradeDescription => + 'The chat will then be recreated with the new room version. All participants will be notified that they need to switch to the new chat. You can find out more about room versions at https://spec.matrix.org/latest/rooms/'; + + @override + String get removeDevicesDescription => + 'You will be logged out of this device and will no longer be able to receive messages.'; + + @override + String get banUserDescription => + 'The user will be banned from the chat and will not be able to enter the chat again until they are unbanned.'; + + @override + String get unbanUserDescription => + 'The user will be able to enter the chat again if they try.'; + + @override + String get kickUserDescription => + 'The user is kicked out of the chat but not banned. In public chats, the user can rejoin at any time.'; + + @override + String get makeAdminDescription => + 'Once you make this user admin, you may not be able to undo this as they will then have the same permissions as you.'; + + @override + String get pushNotificationsNotAvailable => + 'Push notifications not available'; + + @override + String get learnMore => 'Learn more'; + + @override + String get yourGlobalUserIdIs => 'Your global user-ID is: '; + + @override + String noUsersFoundWithQuery(String query) { + return 'Unfortunately no user could be found with \"$query\". Please check whether you made a typo.'; + } + + @override + String get knocking => 'Knocking'; + + @override + String chatCanBeDiscoveredViaSearchOnServer(String server) { + return 'Chat can be discovered via the search on $server'; + } + + @override + String get searchChatsRooms => 'Search for #chats, @users...'; + + @override + String get nothingFound => 'Nothing found...'; + + @override + String get groupName => 'Group name'; + + @override + String get createGroupAndInviteUsers => 'Create a group and invite users'; + + @override + String get groupCanBeFoundViaSearch => 'Group can be found via search'; + + @override + String get wrongRecoveryKey => + 'Sorry... this does not seem to be the correct recovery key.'; + + @override + String get startConversation => 'Start conversation'; + + @override + String get commandHint_sendraw => 'Send raw json'; + + @override + String get databaseMigrationTitle => 'Database is optimized'; + + @override + String get databaseMigrationBody => 'Please wait. This may take a moment.'; + + @override + String get leaveEmptyToClearStatus => 'Leave empty to clear your status.'; + + @override + String get select => 'Select'; + + @override + String get searchForUsers => 'Search for @users...'; + + @override + String get pleaseEnterYourCurrentPassword => + 'Please enter your current password'; + + @override + String get newPassword => 'New password'; + + @override + String get pleaseChooseAStrongPassword => 'Please choose a strong password'; + + @override + String get passwordsDoNotMatch => 'Passwords do not match'; + + @override + String get passwordIsWrong => 'Your entered password is wrong'; + + @override + String get publicLink => 'Public link'; + + @override + String get publicChatAddresses => 'Public chat addresses'; + + @override + String get createNewAddress => 'Create new address'; + + @override + String get joinSpace => 'Join space'; + + @override + String get publicSpaces => 'Public spaces'; + + @override + String get addChatOrSubSpace => 'Add chat or sub space'; + + @override + String get subspace => 'Subspace'; + + @override + String get decline => 'Decline'; + + @override + String get thisDevice => 'This device:'; + + @override + String get initAppError => 'An error occured while init the app'; + + @override + String get userRole => 'User role'; + + @override + String minimumPowerLevel(String level) { + return '$level is the minimum power level.'; + } + + @override + String searchIn(String chat) { + return 'Search in chat \"$chat\"...'; + } + + @override + String get searchMore => 'Search more...'; + + @override + String get gallery => 'Gallery'; + + @override + String get files => 'Files'; + + @override + String databaseBuildErrorBody(String url, String error) { + return 'Unable to build the SQlite database. The app tries to use the legacy database for now. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String sessionLostBody(String url, String error) { + return 'Your session is lost. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String restoreSessionBody(String url, String error) { + return 'The app now tries to restore your session from the backup. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String forwardMessageTo(String roomName) { + return 'Forward message to $roomName?'; + } + + @override + String get sendReadReceipts => 'Send read receipts'; + + @override + String get sendTypingNotificationsDescription => + 'Other participants in a chat can see when you are typing a new message.'; + + @override + String get sendReadReceiptsDescription => + 'Other participants in a chat can see when you have read a message.'; + + @override + String get formattedMessages => 'Formatted messages'; + + @override + String get formattedMessagesDescription => + 'Display rich message content like bold text using markdown.'; + + @override + String get verifyOtherUser => '🔐 Verify other user'; + + @override + String get verifyOtherUserDescription => + 'If you verify another user, you can be sure that you know who you are really writing to. 💪\n\nWhen you start a verification, you and the other user will see a popup in the app. There you will then see a series of emojis or numbers that you have to compare with each other.\n\nThe best way to do this is to meet up or start a video call. 👭'; + + @override + String get verifyOtherDevice => '🔐 Verify other device'; + + @override + String get verifyOtherDeviceDescription => + 'When you verify another device, those devices can exchange keys, increasing your overall security. 💪 When you start a verification, a popup will appear in the app on both devices. There you will then see a series of emojis or numbers that you have to compare with each other. It\'s best to have both devices handy before you start the verification. 🤳'; + + @override + String acceptedKeyVerification(String sender) { + return '$sender accepted key verification'; + } + + @override + String canceledKeyVerification(String sender) { + return '$sender canceled key verification'; + } + + @override + String completedKeyVerification(String sender) { + return '$sender completed key verification'; + } + + @override + String isReadyForKeyVerification(String sender) { + return '$sender is ready for key verification'; + } + + @override + String requestedKeyVerification(String sender) { + return '$sender requested key verification'; + } + + @override + String startedKeyVerification(String sender) { + return '$sender started key verification'; + } + + @override + String get transparent => 'Transparent'; + + @override + String get incomingMessages => 'Incoming messages'; + + @override + String get stickers => 'Stickers'; + + @override + String get discover => 'Discover'; + + @override + String get commandHint_ignore => 'Ignore the given matrix ID'; + + @override + String get commandHint_unignore => 'Unignore the given matrix ID'; + + @override + String unreadChatsInApp(String appname, String unread) { + return '$appname: $unread unread chats'; + } + + @override + String get noDatabaseEncryption => + 'Database encryption is not supported on this platform'; + + @override + String thereAreCountUsersBlocked(Object count) { + return 'Right now there are $count users blocked.'; + } + + @override + String get restricted => 'Restricted'; + + @override + String get knockRestricted => 'Knock restricted'; + + @override + String goToSpace(Object space) { + return 'Go to space: $space'; + } + + @override + String get markAsUnread => 'Mark as unread'; + + @override + String userLevel(int level) { + return '$level - User'; + } + + @override + String moderatorLevel(int level) { + return '$level - Moderator'; + } + + @override + String adminLevel(int level) { + return '$level - Admin'; + } + + @override + String get changeGeneralChatSettings => 'Change general chat settings'; + + @override + String get inviteOtherUsers => 'Invite other users to this chat'; + + @override + String get changeTheChatPermissions => 'Change the chat permissions'; + + @override + String get changeTheVisibilityOfChatHistory => + 'Change the visibility of the chat history'; + + @override + String get changeTheCanonicalRoomAlias => + 'Change the main public chat address'; + + @override + String get sendRoomNotifications => 'Send a @room notifications'; + + @override + String get changeTheDescriptionOfTheGroup => + 'Change the description of the chat'; + + @override + String get chatPermissionsDescription => + 'Define which power level is necessary for certain actions in this chat. The power levels 0, 50 and 100 are usually representing users, moderators and admins, but any gradation is possible.'; + + @override + String updateInstalled(String version) { + return '🎉 Update $version installed!'; + } + + @override + String get changelog => 'Changelog'; + + @override + String get sendCanceled => 'Sending canceled'; + + @override + String get loginWithMatrixId => 'Login with Matrix-ID'; + + @override + String get discoverHomeservers => 'Discover homeservers'; + + @override + String get whatIsAHomeserver => 'What is a homeserver?'; + + @override + String get homeserverDescription => + 'All your data is stored on the homeserver, just like an email provider. You can choose which homeserver you want to use, while you can still communicate with everyone. Learn more at at https://matrix.org.'; + + @override + String get doesNotSeemToBeAValidHomeserver => + 'Doesn\'t seem to be a compatible homeserver. Wrong URL?'; + + @override + String get calculatingFileSize => 'Calculating file size...'; + + @override + String get prepareSendingAttachment => 'Prepare sending attachment...'; + + @override + String get sendingAttachment => 'Sending attachment...'; + + @override + String get generatingVideoThumbnail => 'Generating video thumbnail...'; + + @override + String get compressVideo => 'Compressing video...'; + + @override + String sendingAttachmentCountOfCount(int index, int length) { + return 'Sending attachment $index of $length...'; + } + + @override + String serverLimitReached(int seconds) { + return 'Server limit reached! Waiting $seconds seconds...'; + } + + @override + String get oneOfYourDevicesIsNotVerified => + 'One of your devices is not verified'; + + @override + String get noticeChatBackupDeviceVerification => + 'Note: When you connect all your devices to the chat backup, they are automatically verified.'; + + @override + String get continueText => 'Continue'; + + @override + String get welcomeText => + 'Hey Hey 👋 This is Extera. You can sign in to any homeserver, which is compatible with https://matrix.org. And then chat with anyone. It\'s a huge decentralized messaging network!'; + + @override + String get blur => 'Blur:'; + + @override + String get opacity => 'Opacity:'; + + @override + String get setWallpaper => 'Set wallpaper'; + + @override + String get manageAccount => 'Manage account'; + + @override + String get noContactInformationProvided => + 'Server does not provide any valid contact information'; + + @override + String get contactServerAdmin => 'Contact server admin'; + + @override + String get contactServerSecurity => 'Contact server security'; + + @override + String get supportPage => 'Support page'; + + @override + String get serverInformation => 'Server information:'; + + @override + String get name => 'Name'; + + @override + String get version => 'Version'; + + @override + String get website => 'Website'; + + @override + String get compress => 'Compress'; + + @override + String get boldText => 'Bold text'; + + @override + String get italicText => 'Italic text'; + + @override + String get strikeThrough => 'Strikethrough'; + + @override + String get pleaseFillOut => 'Please fill out'; + + @override + String get invalidUrl => 'Invalid url'; + + @override + String get addLink => 'Add link'; + + @override + String get unableToJoinChat => + 'Unable to join chat. Maybe the other party has already closed the conversation.'; + + @override + String get previous => 'Previous'; + + @override + String get otherPartyNotLoggedIn => + 'The other party is currently not logged in and therefore cannot receive messages!'; + + @override + String appWantsToUseForLogin(String server) { + return 'Use \'$server\' to log in'; + } + + @override + String get appWantsToUseForLoginDescription => + 'You hereby allow the app and website to share information about you.'; + + @override + String get open => 'Open'; + + @override + String get waitingForServer => 'Waiting for server...'; + + @override + String get appIntroduction => + 'Extera lets you chat with your friends across different messengers. Learn more at https://matrix.org or just tap *Continue*.'; + + @override + String get newChatRequest => '📩 New chat request'; + + @override + String get contentNotificationSettings => 'Content notification settings'; + + @override + String get generalNotificationSettings => 'General notification settings'; + + @override + String get roomNotificationSettings => 'Room notification settings'; + + @override + String get userSpecificNotificationSettings => + 'User specific notification settings'; + + @override + String get otherNotificationSettings => 'Other notification settings'; + + @override + String get notificationRuleContainsUserName => 'Contains User Name'; + + @override + String get notificationRuleContainsUserNameDescription => + 'Notifies the user when a message contains their username.'; + + @override + String get notificationRuleMaster => 'Mute all notifications'; + + @override + String get notificationRuleMasterDescription => + 'Overrides all other rules and disables all notifications.'; + + @override + String get notificationRuleSuppressNotices => 'Suppress Automated Messages'; + + @override + String get notificationRuleSuppressNoticesDescription => + 'Suppresses notifications from automated clients like bots.'; + + @override + String get notificationRuleInviteForMe => 'Invite for Me'; + + @override + String get notificationRuleInviteForMeDescription => + 'Notifies the user when they are invited to a room.'; + + @override + String get notificationRuleMemberEvent => 'Member Event'; + + @override + String get notificationRuleMemberEventDescription => + 'Suppresses notifications for membership events.'; + + @override + String get notificationRuleIsUserMention => 'User Mention'; + + @override + String get notificationRuleIsUserMentionDescription => + 'Notifies the user when they are directly mentioned in a message.'; + + @override + String get notificationRuleContainsDisplayName => 'Contains Display Name'; + + @override + String get notificationRuleContainsDisplayNameDescription => + 'Notifies the user when a message contains their display name.'; + + @override + String get notificationRuleIsRoomMention => 'Room Mention'; + + @override + String get notificationRuleIsRoomMentionDescription => + 'Notifies the user when there is a room mention.'; + + @override + String get notificationRuleRoomnotif => 'Room Notification'; + + @override + String get notificationRuleRoomnotifDescription => + 'Notifies the user when a message contains \'@room\'.'; + + @override + String get notificationRuleTombstone => 'Tombstone'; + + @override + String get notificationRuleTombstoneDescription => + 'Notifies the user about room deactivation messages.'; + + @override + String get notificationRuleReaction => 'Reaction'; + + @override + String get notificationRuleReactionDescription => + 'Suppresses notifications for reactions.'; + + @override + String get notificationRuleRoomServerAcl => 'Room Server ACL'; + + @override + String get notificationRuleRoomServerAclDescription => + 'Suppresses notifications for room server access control lists (ACL).'; + + @override + String get notificationRuleSuppressEdits => 'Suppress Edits'; + + @override + String get notificationRuleSuppressEditsDescription => + 'Suppresses notifications for edited messages.'; + + @override + String get notificationRuleCall => 'Call'; + + @override + String get notificationRuleCallDescription => + 'Notifies the user about calls.'; + + @override + String get notificationRuleEncryptedRoomOneToOne => + 'Encrypted Room One-to-One'; + + @override + String get notificationRuleEncryptedRoomOneToOneDescription => + 'Notifies the user about messages in encrypted one-to-one rooms.'; + + @override + String get notificationRuleRoomOneToOne => 'Room One-to-One'; + + @override + String get notificationRuleRoomOneToOneDescription => + 'Notifies the user about messages in one-to-one rooms.'; + + @override + String get notificationRuleMessage => 'Message'; + + @override + String get notificationRuleMessageDescription => + 'Notifies the user about general messages.'; + + @override + String get notificationRuleEncrypted => 'Encrypted'; + + @override + String get notificationRuleEncryptedDescription => + 'Notifies the user about messages in encrypted rooms.'; + + @override + String get notificationRuleJitsi => 'Jitsi'; + + @override + String get notificationRuleJitsiDescription => + 'Notifies the user about Jitsi widget events.'; + + @override + String get notificationRuleServerAcl => 'Suppress Server ACL Events'; + + @override + String get notificationRuleServerAclDescription => + 'Suppresses notifications for Server ACL events.'; + + @override + String unknownPushRule(String rule) { + return 'Unknown push rule \'$rule\''; + } + + @override + String get deletePushRuleCanNotBeUndone => + 'If you delete this notification setting, this can not be undone.'; + + @override + String get more => 'More'; + + @override + String get shareKeysWith => 'Share keys with...'; + + @override + String get shareKeysWithDescription => + 'Which devices should be trusted so that they can read along your messages in encrypted chats?'; + + @override + String get allDevices => 'All devices'; + + @override + String get crossVerifiedDevicesIfEnabled => + 'Cross verified devices if enabled'; + + @override + String get crossVerifiedDevices => 'Cross verified devices'; + + @override + String get verifiedDevicesOnly => 'Verified devices only'; + + @override + String get takeAPhoto => 'Take a photo'; + + @override + String get recordAVideo => 'Record a video'; + + @override + String get optionalMessage => '(Optional) message...'; + + @override + String get notSupportedOnThisDevice => 'Not supported on this device'; + + @override + String get enterNewChat => 'Enter new chat'; + + @override + String get approve => 'Approve'; + + @override + String get youHaveKnocked => 'You have knocked'; + + @override + String get pleaseWaitUntilInvited => + 'Please wait now, until someone from the room invites you.'; +} diff --git a/lib/generated/l10n/l10n_ru.dart b/lib/generated/l10n/l10n_ru.dart new file mode 100644 index 0000000..32f3fa0 --- /dev/null +++ b/lib/generated/l10n/l10n_ru.dart @@ -0,0 +1,2750 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'l10n.dart'; + +// ignore_for_file: type=lint + +/// The translations for Russian (`ru`). +class L10nRu extends L10n { + L10nRu([String locale = 'ru']) : super(locale); + + @override + String get noSendPermission => 'Вы не можете отправлять сообщения'; + + @override + String get alwaysUse24HourFormat => 'нет'; + + @override + String get repeatPassword => 'Повторите пароль'; + + @override + String get notAnImage => 'Это не картинка.'; + + @override + String get setCustomPermissionLevel => 'Установить другой уровень прав'; + + @override + String get setPermissionsLevelDescription => + 'Выберите роль из списка ниже или укажите другой уровень прав.'; + + @override + String get ignoreUser => 'Игнорировать'; + + @override + String get normalUser => 'Участник'; + + @override + String get remove => 'Удалить'; + + @override + String get importNow => 'Импортировать сейчас'; + + @override + String get importEmojis => 'Импортировать эмодзи'; + + @override + String get importFromZipFile => 'Импортировать из ZIP-файла'; + + @override + String get exportEmotePack => 'Экспортировать набор эмодзи как ZIP'; + + @override + String get replace => 'Заменить'; + + @override + String get about => 'О проекте'; + + @override + String aboutHomeserver(String homeserver) { + return 'О сервере $homeserver'; + } + + @override + String get accept => 'Принять'; + + @override + String acceptedTheInvitation(String username) { + return '👍 $username принял(а) приглашение'; + } + + @override + String get account => 'Учётная запись'; + + @override + String activatedEndToEndEncryption(String username) { + return '🔐 $username активировал(а) сквозное шифрование'; + } + + @override + String get addEmail => 'Добавить электронную почту'; + + @override + String get confirmMatrixId => + 'Пожалуйста, подтвердите Matrix ID, чтобы удалить свою учётную запись.'; + + @override + String supposedMxid(String mxid) { + return 'Это должно быть $mxid'; + } + + @override + String get addChatDescription => 'Добавить описание чата...'; + + @override + String get addToSpace => 'Добавить в пространство'; + + @override + String get admin => 'Администратор'; + + @override + String get alias => 'псевдоним'; + + @override + String get all => 'Все'; + + @override + String get allChats => 'Все чаты'; + + @override + String get commandHint_roomupgrade => 'Обновить эту комнату'; + + @override + String get commandHint_googly => 'Отправить выпученные глаза'; + + @override + String get commandHint_cuddle => 'Отправить улыбку'; + + @override + String get commandHint_hug => 'Отправить обнимашки'; + + @override + String googlyEyesContent(String senderName) { + return '$senderName выпучил(а) глаза'; + } + + @override + String cuddleContent(String senderName) { + return '$senderName улыбнулся(-ась) Вам'; + } + + @override + String hugContent(String senderName) { + return '$senderName обнял(а) Вас'; + } + + @override + String answeredTheCall(String senderName) { + return '$senderName ответил(а) на звонок'; + } + + @override + String get anyoneCanJoin => 'Каждый может присоединиться'; + + @override + String get appLock => 'Блокировка приложения'; + + @override + String get appLockDescription => + 'Заблокировать приложение, когда не используется пин-код'; + + @override + String get archive => 'Архив'; + + @override + String get areGuestsAllowedToJoin => 'Разрешено ли гостям присоединяться'; + + @override + String get areYouSure => 'Вы уверены?'; + + @override + String get areYouSureYouWantToLogout => 'Вы действительно хотите выйти?'; + + @override + String get askSSSSSign => + 'Для подписи ключа другого пользователя, пожалуйста, введите вашу парольную фразу или ключ восстановления.'; + + @override + String askVerificationRequest(String username) { + return 'Принять этот запрос подтверждения от $username?'; + } + + @override + String get autoplayImages => + 'Автоматически воспроизводить анимированные стикеры и эмодзи'; + + @override + String badServerLoginTypesException(String serverVersions, + String supportedVersions, Object suportedVersions) { + return 'Домашний сервер поддерживает следующие типы входа в систему:\n$serverVersions\nНо это приложение поддерживает только:\n$supportedVersions'; + } + + @override + String get sendTypingNotifications => + 'Отправлять уведомления о наборе текста'; + + @override + String get swipeRightToLeftToReply => 'Для ответа проведите справа на лево'; + + @override + String get sendOnEnter => 'Отправлять на Enter'; + + @override + String badServerVersionsException(String serverVersions, + String supportedVersions, Object serverVerions, Object suportedVersions) { + return 'Домашний сервер поддерживает следующие версии спецификации:\n$serverVersions\nНо это приложение поддерживает только $supportedVersions'; + } + + @override + String countChatsAndCountParticipants(int chats, int participants) { + return '$chats чатов и $participants участников'; + } + + @override + String get noMoreChatsFound => 'Больше чатов не обнаружено...'; + + @override + String get noChatsFoundHere => + 'Не было найдено ни одного чата. Начните новый чат, нажав кнопку ниже. ⤵️'; + + @override + String get joinedChats => 'Чаты'; + + @override + String get unread => 'Непрочитанные'; + + @override + String get space => 'Пространство'; + + @override + String get spaces => 'Пространства'; + + @override + String get banFromChat => 'Забанить'; + + @override + String get banned => 'Забанен(а)'; + + @override + String bannedUser(String username, String targetName) { + return '$username забанил(а) $targetName'; + } + + @override + String get blockDevice => 'Заблокировать устройство'; + + @override + String get blocked => 'Заблокировано'; + + @override + String get botMessages => 'Сообщения от ботов'; + + @override + String get cancel => 'Отмена'; + + @override + String cantOpenUri(String uri) { + return 'Не удается открыть URI $uri'; + } + + @override + String get changeDeviceName => 'Изменить имя устройства'; + + @override + String changedTheChatAvatar(String username) { + return '$username изменил(а) аватар чата'; + } + + @override + String changedTheChatDescriptionTo(String username, String description) { + return '$username изменил(а) описание чата на: \'$description\''; + } + + @override + String changedTheChatNameTo(String username, String chatname) { + return '$username изменил(а) имя чата на: \'$chatname\''; + } + + @override + String changedTheChatPermissions(String username) { + return '$username изменил(а) права доступа к чату'; + } + + @override + String changedTheDisplaynameTo(String username, String displayname) { + return '$username изменил(а) отображаемое имя на: \'$displayname\''; + } + + @override + String changedTheGuestAccessRules(String username) { + return '$username изменил(а) правила гостевого доступа'; + } + + @override + String changedTheGuestAccessRulesTo(String username, String rules) { + return '$username изменил(а) правила гостевого доступа на: $rules'; + } + + @override + String changedTheHistoryVisibility(String username) { + return '$username изменил(а) видимость истории'; + } + + @override + String changedTheHistoryVisibilityTo(String username, String rules) { + return '$username изменил(а) видимость истории на: $rules'; + } + + @override + String changedTheJoinRules(String username) { + return '$username изменил(а) правила присоединения'; + } + + @override + String changedTheJoinRulesTo(String username, String joinRules) { + return '$username изменил(а) правила присоединения на: $joinRules'; + } + + @override + String changedTheProfileAvatar(String username) { + return '$username изменил(а) аватар'; + } + + @override + String changedTheRoomAliases(String username) { + return '$username изменил(а) псевдонимы комнаты'; + } + + @override + String changedTheRoomInvitationLink(String username) { + return '$username изменил(а) ссылку для приглашения'; + } + + @override + String get changePassword => 'Изменить пароль'; + + @override + String get changeTheHomeserver => 'Изменить домашний сервер'; + + @override + String get changeTheme => 'Персонализация'; + + @override + String get changeTheNameOfTheGroup => 'Изменить название группы'; + + @override + String get changeYourAvatar => 'Изменить свой аватар'; + + @override + String get channelCorruptedDecryptError => 'Шифрование было повреждено'; + + @override + String get chat => 'Чат'; + + @override + String get yourChatBackupHasBeenSetUp => + 'Настроено резервное копирование чатов.'; + + @override + String get chatBackup => 'Резервное копирование чатов'; + + @override + String get chatBackupDescription => + 'Резервная копия сообщений защищена ключом восстановления. Сохраните его в надёжном месте.'; + + @override + String get chatDetails => 'Настройки чата'; + + @override + String get chatHasBeenAddedToThisSpace => + 'Чат был добавлен в это пространство'; + + @override + String get chats => 'Чаты'; + + @override + String get chooseAStrongPassword => 'Выберите надёжный пароль'; + + @override + String get clearArchive => 'Очистить архив'; + + @override + String get close => 'Закрыть'; + + @override + String get commandHint_markasdm => 'Пометить как комнату личных сообщений'; + + @override + String get commandHint_markasgroup => 'Пометить как группу'; + + @override + String get commandHint_ban => 'Забанить пользователя в этой комнате'; + + @override + String get commandHint_clearcache => 'Очистить кэш'; + + @override + String get commandHint_create => + 'Создайте пустой групповой чат\nИспользуйте --no-encryption, чтобы отключить шифрование'; + + @override + String get commandHint_discardsession => 'Удалить сеанс'; + + @override + String get commandHint_dm => + 'Начните личный чат\nИспользуйте --no-encryption, чтобы отключить шифрование'; + + @override + String get commandHint_html => 'Отправить текст формата HTML'; + + @override + String get commandHint_invite => + 'Пригласить данного пользователя в эту комнату'; + + @override + String get commandHint_join => 'Присоединиться к данной комнате'; + + @override + String get commandHint_kick => 'Удалить данного пользователя из этой комнаты'; + + @override + String get commandHint_leave => 'Покинуть эту комнату'; + + @override + String get commandHint_me => 'Опишите действие'; + + @override + String get commandHint_myroomavatar => + 'Установите свою фотографию для этой комнаты (аватар: mxc-uri)'; + + @override + String get commandHint_myroomnick => + 'Задайте отображаемое имя для этой комнаты'; + + @override + String get commandHint_op => + 'Установить уровень прав для пользователя (по умолчанию: 50)'; + + @override + String get commandHint_plain => 'Отправить неотформатированный текст'; + + @override + String get commandHint_react => 'Отправить ответ как реакцию'; + + @override + String get commandHint_send => 'Отправить текст'; + + @override + String get commandHint_unban => 'Разбанить пользователя в этой комнате'; + + @override + String get commandInvalid => 'Недопустимая команда'; + + @override + String commandMissing(String command) { + return '$command не является командой.'; + } + + @override + String get compareEmojiMatch => 'Сравните эмодзи'; + + @override + String get compareNumbersMatch => 'Сравните числа'; + + @override + String get configureChat => 'Настроить чат'; + + @override + String get confirm => 'Подтвердить'; + + @override + String get connect => 'Присоединиться'; + + @override + String get contactHasBeenInvitedToTheGroup => + 'Контакт был приглашен в группу'; + + @override + String get containsDisplayName => 'Содержит отображаемое имя'; + + @override + String get containsUserName => 'Содержит имя пользователя'; + + @override + String get contentHasBeenReported => 'Жалоба отправлена'; + + @override + String get copiedToClipboard => 'Скопировано в буфер обмена'; + + @override + String get copy => 'Копировать'; + + @override + String get copyToClipboard => 'Скопировать в буфер обмена'; + + @override + String couldNotDecryptMessage(String error) { + return 'Не удалось расшифровать сообщение: $error'; + } + + @override + String countParticipants(int count) { + return '$count участника(-ов)'; + } + + @override + String get create => 'Создать'; + + @override + String createdTheChat(String username) { + return '💬 $username создал(а) чат'; + } + + @override + String get createGroup => 'Создать группу'; + + @override + String get createNewSpace => 'Новое пространство'; + + @override + String get currentlyActive => 'Сейчас активен(-а)'; + + @override + String get darkTheme => 'Тёмная'; + + @override + String dateAndTimeOfDay(String date, String timeOfDay) { + return '$timeOfDay, $date'; + } + + @override + String dateWithoutYear(String month, String day) { + return '$day.$month'; + } + + @override + String dateWithYear(String year, String month, String day) { + return '$day.$month.$year'; + } + + @override + String get deactivateAccountWarning => + 'Это деактивирует ваш аккаунт. Пути назад не будет! Вы уверены?'; + + @override + String get defaultPermissionLevel => + 'Уровень разрешений по умолчанию для новых пользователей'; + + @override + String get delete => 'Удалить'; + + @override + String get deleteAccount => 'Удалить аккаунт'; + + @override + String get deleteMessage => 'Удалить сообщение'; + + @override + String get device => 'Устройство'; + + @override + String get deviceId => 'Идентификатор устройства'; + + @override + String get devices => 'Устройства'; + + @override + String get directChats => 'Личные чаты'; + + @override + String get allRooms => 'Все группы'; + + @override + String get displaynameHasBeenChanged => 'Отображаемое имя было изменено'; + + @override + String get downloadFile => 'Скачать файл'; + + @override + String get edit => 'Редактировать'; + + @override + String get editBlockedServers => 'Редактировать заблокированные серверы'; + + @override + String get chatPermissions => 'Права в чате'; + + @override + String get editDisplayname => 'Отображаемое имя'; + + @override + String get editRoomAliases => 'Редактировать псевдонимы комнаты'; + + @override + String get editRoomAvatar => 'Изменить аватар комнаты'; + + @override + String get emoteExists => 'Эмодзи уже существует!'; + + @override + String get emoteInvalid => 'Недопустимый код эмодзи!'; + + @override + String get emoteKeyboardNoRecents => + 'Недавно использованные эмодзи появятся здесь...'; + + @override + String get emotePacks => 'Наборы эмодзи для комнаты'; + + @override + String get emoteSettings => 'Настройки эмодзи'; + + @override + String get globalChatId => 'ID глобального чата'; + + @override + String get accessAndVisibility => 'Доступность и видимость'; + + @override + String get accessAndVisibilityDescription => + 'Кто может зайти и как найти этот чат.'; + + @override + String get calls => 'Звонки'; + + @override + String get customEmojisAndStickers => 'Пользовательские эмодзи и стикеры'; + + @override + String get customEmojisAndStickersBody => + 'Добавить или поделиться пользовательскими эмодзи или стикерами, которые могут быть применены в любом чате.'; + + @override + String get emoteShortcode => 'Код эмодзи'; + + @override + String get emoteWarnNeedToPick => + 'Вам нужно задать код эмодзи и изображение!'; + + @override + String get emptyChat => 'Пустой чат'; + + @override + String get enableEmotesGlobally => 'Включить набор эмодзи глобально'; + + @override + String get enableEncryption => 'Включить шифрование'; + + @override + String get enableEncryptionWarning => + 'Вы не сможете отключить шифрование. Вы уверены?'; + + @override + String get encrypted => 'Зашифровано'; + + @override + String get encryption => 'Шифрование'; + + @override + String get encryptionNotEnabled => 'Шифрование не включено'; + + @override + String endedTheCall(String senderName) { + return '$senderName завершил(а) звонок'; + } + + @override + String get enterAnEmailAddress => 'Введите адрес электронной почты'; + + @override + String get homeserver => 'Домашний сервер'; + + @override + String get enterYourHomeserver => 'Введите адрес вашего домашнего сервера'; + + @override + String errorObtainingLocation(String error) { + return 'Ошибка получения местоположения: $error'; + } + + @override + String get everythingReady => 'Всё готово!'; + + @override + String get extremeOffensive => 'Крайне оскорбительный'; + + @override + String get fileName => 'Имя файла'; + + @override + String get fluffychat => 'Extera'; + + @override + String get fontSize => 'Размер шрифта'; + + @override + String get forward => 'Переслать'; + + @override + String get fromJoining => 'С момента присоединения'; + + @override + String get fromTheInvitation => 'С момента приглашения'; + + @override + String get goToTheNewRoom => 'В новую комнату'; + + @override + String get group => 'Группа'; + + @override + String get chatDescription => 'Описание чата'; + + @override + String get chatDescriptionHasBeenChanged => 'Описание чата изменено'; + + @override + String get groupIsPublic => 'Публичная группа'; + + @override + String get groups => 'Группы'; + + @override + String groupWith(String displayname) { + return 'Группа с $displayname'; + } + + @override + String get guestsAreForbidden => 'Гости не могут присоединиться'; + + @override + String get guestsCanJoin => 'Гости могут присоединиться'; + + @override + String hasWithdrawnTheInvitationFor(String username, String targetName) { + return '$username отозвал(а) приглашение $targetName'; + } + + @override + String get help => 'Помощь'; + + @override + String get hideRedactedEvents => 'Скрыть удалённые события'; + + @override + String get hideRedactedMessages => 'Скрыть удалённые сообщения'; + + @override + String get hideRedactedMessagesBody => + 'Если кто-то удаляет сообщение, оно будет скрыто в чате.'; + + @override + String get hideInvalidOrUnknownMessageFormats => + 'Скрыть неверные или неизвестные форматы сообщений'; + + @override + String get howOffensiveIsThisContent => + 'Насколько оскорбительным является этот контент?'; + + @override + String get id => 'ID'; + + @override + String get identity => 'Идентификация'; + + @override + String get block => 'Заглушить'; + + @override + String get blockedUsers => 'Заглушённые пользователи'; + + @override + String get blockListDescription => + 'Вы можете игнорировать пользователей на свой вкус: Вы не увидите их сообщения и не получите от них приглашений.'; + + @override + String get blockUsername => 'Игнорировать имя пользователя'; + + @override + String get iHaveClickedOnLink => 'Я перешёл по ссылке'; + + @override + String get incorrectPassphraseOrKey => + 'Неверный пароль или ключ восстановления'; + + @override + String get inoffensive => 'Безобидный'; + + @override + String get inviteContact => 'Пригласить контакт'; + + @override + String inviteContactToGroupQuestion(Object contact, Object groupName) { + return 'Вы уверены, что хотите пригласить $contact в чат \"$groupName\"?'; + } + + @override + String inviteContactToGroup(String groupName) { + return 'Пригласить контакт в $groupName'; + } + + @override + String get noChatDescriptionYet => 'Описание чата не создано.'; + + @override + String get tryAgain => 'Повторите попытку'; + + @override + String get invalidServerName => 'Недопустимое имя сервера'; + + @override + String get invited => 'Приглашён'; + + @override + String get redactMessageDescription => + 'Сообщение будет удалено для всех участников. Это необратимо.'; + + @override + String get optionalRedactReason => 'Причина... (Необязательно)'; + + @override + String invitedUser(String username, String targetName) { + return '📩 $username пригласил(а) $targetName'; + } + + @override + String get invitedUsersOnly => 'Только приглашённым пользователям'; + + @override + String get inviteForMe => 'Приглашение для меня'; + + @override + String inviteText(String username, String link) { + return '$username пригласил(а) вас в Extera. \n1. Посетите https://extera.xyz/next/next.apk?_invite и установите приложение \n2. Зарегистрируйтесь или войдите \n3. Откройте ссылку приглашения: \n $link'; + } + + @override + String get isTyping => 'печатает…'; + + @override + String joinedTheChat(String username) { + return '👋 $username присоединился(-ась) к чату'; + } + + @override + String get joinRoom => 'Присоединиться к комнате'; + + @override + String kicked(String username, String targetName) { + return '👞 $username выгнал(а) $targetName'; + } + + @override + String kickedAndBanned(String username, String targetName) { + return '🙅 $username забанил(а) $targetName'; + } + + @override + String get kickFromChat => 'Выгнать'; + + @override + String lastActiveAgo(String localizedTimeShort) { + return 'Последнее посещение: $localizedTimeShort'; + } + + @override + String get leave => 'Покинуть'; + + @override + String get leftTheChat => 'Покинуть чат'; + + @override + String get license => 'Лицензия'; + + @override + String get lightTheme => 'Светлая'; + + @override + String loadCountMoreParticipants(int count) { + return 'Загрузить еще $count участника(-ов)'; + } + + @override + String get dehydrate => 'Экспорт сеанса и очистка устройства'; + + @override + String get dehydrateWarning => + 'Это действие не может быть отменено. Убедитесь, что вы безопасно сохранили файл резервной копии.'; + + @override + String get dehydrateTor => 'Пользователи TOR: Экспорт сеанса'; + + @override + String get dehydrateTorLong => + 'Для пользователей TOR рекомендуется экспортировать сессию перед закрытием окна.'; + + @override + String get hydrateTor => 'Пользователи TOR: Импорт экспорта сессии'; + + @override + String get hydrateTorLong => + 'В прошлый раз вы экспортировали свою сессию в TOR? Быстро импортируйте его и продолжайте общение.'; + + @override + String get hydrate => 'Восстановить из файла резервной копии'; + + @override + String get loadingPleaseWait => 'Загрузка... Пожалуйста, подождите.'; + + @override + String get loadMore => 'Загрузить больше…'; + + @override + String get locationDisabledNotice => + 'Службы определения местоположения отключены. Включите их для отправки местоположения.'; + + @override + String get locationPermissionDeniedNotice => + 'Разрешение на определение местоположения отклонено. Это необходимо для отправки местоположения.'; + + @override + String get login => 'Войти'; + + @override + String logInTo(String homeserver) { + return 'Войти в $homeserver'; + } + + @override + String get logout => 'Выйти'; + + @override + String get memberChanges => 'Изменения участников'; + + @override + String get mention => 'Упомянуть'; + + @override + String get messages => 'Сообщения'; + + @override + String get messagesStyle => 'Сообщения:'; + + @override + String get moderator => 'Модератор'; + + @override + String get muteChat => 'Отключить уведомления'; + + @override + String get needPantalaimonWarning => + 'Помните, что вам нужен Pantalaimon для использования сквозного шифрования.'; + + @override + String get newChat => 'Новый чат'; + + @override + String get newMessageInFluffyChat => '💬 Новое сообщение в Extera'; + + @override + String get newVerificationRequest => 'Новый запрос на подтверждение!'; + + @override + String get next => 'Далее'; + + @override + String get no => 'Нет'; + + @override + String get noConnectionToTheServer => 'Нет соединения с сервером'; + + @override + String get noEmotesFound => 'Эмодзи не найдены 😕'; + + @override + String get noEncryptionForPublicRooms => + 'Вы не можете активировать шифрование в общедоступных комнатах.'; + + @override + String get noGoogleServicesWarning => + 'На Вашем устройстве не установлены сервисы Google Play. Классное решение! Для получения push-уведомлений, скачайте ntfy из F-Droid. Вы также можете использовать Aurora Store и microG вместо Google Play Services, если Ваш телефон не поддерживает GMS (например, Huawei).'; + + @override + String noMatrixServer(String server1, String server2) { + return '$server1 не является matrix-сервером, использовать $server2 вместо него?'; + } + + @override + String get shareInviteLink => 'Поделиться приглашением'; + + @override + String get scanQrCode => 'Сканировать QR-код'; + + @override + String get none => 'Ничего'; + + @override + String get noPasswordRecoveryDescription => + 'Вы ещё не добавили способ восстановления пароля.'; + + @override + String get noPermission => 'Нет прав доступа'; + + @override + String get noRoomsFound => 'Комнаты не найдены…'; + + @override + String get notifications => 'Уведомления'; + + @override + String get notificationsEnabledForThisAccount => + 'Уведомления включены для этого аккаунта'; + + @override + String numUsersTyping(int count) { + return '$count пользователей печатают…'; + } + + @override + String get obtainingLocation => 'Получение местоположения…'; + + @override + String get offensive => 'Оскорбительный'; + + @override + String get offline => 'Не в сети'; + + @override + String get ok => 'Ок'; + + @override + String get online => 'В сети'; + + @override + String get onlineKeyBackupEnabled => 'Резервное копирование ключей включено'; + + @override + String get oopsPushError => + 'Ой! К сожалению, при настройке push-уведомлений произошла ошибка.'; + + @override + String get oopsSomethingWentWrong => 'Ой, что-то пошло не так…'; + + @override + String get openAppToReadMessages => + 'Откройте приложение чтобы прочитать сообщения'; + + @override + String get openCamera => 'Открыть камеру'; + + @override + String get openVideoCamera => 'Открыть камеру для видео'; + + @override + String get oneClientLoggedOut => 'Один из ваших аккаунтов был отключен'; + + @override + String get addAccount => 'Добавить учетную запись'; + + @override + String get editBundlesForAccount => 'Изменить пакеты для этой учетной записи'; + + @override + String get addToBundle => 'Добавить в пакет'; + + @override + String get removeFromBundle => 'Удалить из этого пакета'; + + @override + String get bundleName => 'Название пакета'; + + @override + String get enableMultiAccounts => + '(БЕТА) Включить несколько учетных записей на этом устройстве'; + + @override + String get openInMaps => 'Открыть на картах'; + + @override + String get link => 'Ссылка'; + + @override + String get serverRequiresEmail => + 'Этот сервер должен подтвердить ваш адрес электронной почты для регистрации.'; + + @override + String get or => 'Или'; + + @override + String get participant => 'Участник'; + + @override + String get passphraseOrKey => 'Пароль или ключ восстановления'; + + @override + String get password => 'Пароль'; + + @override + String get passwordForgotten => 'Забыли пароль'; + + @override + String get passwordHasBeenChanged => 'Пароль был изменён'; + + @override + String get hideMemberChangesInPublicChats => + 'Скрыть изменения участников в общедоступных чатах'; + + @override + String get hideMemberChangesInPublicChatsBody => + 'Не показывать входы и выходы, изменения отображаемых имён или аватаров в общедоступных чатах.'; + + @override + String get overview => 'Обзор'; + + @override + String get notifyMeFor => 'Уведомлять меня о'; + + @override + String get passwordRecoverySettings => 'Настройки восстановления пароля'; + + @override + String get passwordRecovery => 'Восстановление пароля'; + + @override + String get people => 'Люди'; + + @override + String get pickImage => 'Выбрать изображение'; + + @override + String get pin => 'Закрепить'; + + @override + String play(String fileName) { + return 'Проиграть $fileName'; + } + + @override + String get pleaseChoose => 'Пожалуйста, выберите'; + + @override + String get pleaseChooseAPasscode => 'Пожалуйста, выберите код доступа'; + + @override + String get pleaseClickOnLink => + 'Пожалуйста, откройте ссылку в электронной почте для того чтобы продолжить.'; + + @override + String get pleaseEnter4Digits => + 'Введите 4 цифры, или оставьте поле пустым, чтобы отключить блокировку приложения.'; + + @override + String get pleaseEnterRecoveryKey => 'Введите ключ восстановления:'; + + @override + String get pleaseEnterYourPassword => 'Пожалуйста, введите ваш пароль'; + + @override + String get pleaseEnterYourPin => 'Пожалуйста, введите свой пин-код'; + + @override + String get pleaseEnterYourUsername => 'Пожалуйста, введите имя пользователя'; + + @override + String get pleaseFollowInstructionsOnWeb => + 'Следуйте инструкциям на веб-сайте и нажмите «Далее».'; + + @override + String get privacy => 'Конфиденциальность'; + + @override + String get publicRooms => 'Публичные комнаты'; + + @override + String get pushRules => 'Правила push'; + + @override + String get reason => 'Причина'; + + @override + String get recording => 'Запись'; + + @override + String redactedBy(String username) { + return '$username удалил(а) это сообщение'; + } + + @override + String get directChat => 'Личный чат'; + + @override + String redactedByBecause(String username, String reason) { + return '$username удалил(а) это сообщение. Причина: \"$reason\"'; + } + + @override + String redactedAnEvent(String username) { + return '$username удалил(а) сообщение'; + } + + @override + String get redactMessage => 'Удалить сообщение'; + + @override + String get register => 'Зарегистрироваться'; + + @override + String get reject => 'Отказать'; + + @override + String rejectedTheInvitation(String username) { + return '$username отклонил(а) приглашение'; + } + + @override + String get rejoin => 'Зайти повторно'; + + @override + String get removeAllOtherDevices => 'Удалить все другие устройства'; + + @override + String removedBy(String username) { + return 'Удалено пользователем $username'; + } + + @override + String get removeDevice => 'Удалить устройство'; + + @override + String get unbanFromChat => 'Разбанить'; + + @override + String get removeYourAvatar => 'Удалить свой аватар'; + + @override + String get replaceRoomWithNewerVersion => + 'Заменить комнату более новой версией'; + + @override + String get reply => 'Ответить'; + + @override + String get reportMessage => 'Пожаловаться'; + + @override + String get translateMessage => 'Перевести сообщение'; + + @override + String get translatedMessage => 'Переведённое сообщение'; + + @override + String get errorTranslatingMessage => 'Не удалось перевести сообщение.'; + + @override + String get recoverMessage => 'Восстановить'; + + @override + String get recoveredMessage => 'Восстановленное сообщение'; + + @override + String get errorRecoveringMessage => 'Не удалось восстановить сообщение.'; + + @override + String get errorRecoveringMessageNoAdmin => + 'Эта возможность доступна только администраторам на серверах Synapse.'; + + @override + String get requestPermission => 'Запросить разрешение'; + + @override + String get roomHasBeenUpgraded => 'Комната обновлена'; + + @override + String get roomVersion => 'Версия комнаты'; + + @override + String get saveFile => 'Сохранить файл'; + + @override + String get retry => 'Повторить'; + + @override + String get search => 'Поиск'; + + @override + String get security => 'Безопасность'; + + @override + String get recoveryKey => 'Ключ восстановления'; + + @override + String get recoveryKeyLost => 'Ключ восстановления утерян?'; + + @override + String seenByUser(String username) { + return 'Просмотрено пользователем $username'; + } + + @override + String get send => 'Прислать'; + + @override + String get sendAMessage => 'Отправить сообщение'; + + @override + String get sendAsText => 'Отправить как текст'; + + @override + String get sendAudio => 'Отправить аудио'; + + @override + String get sendFile => 'Отправить файл'; + + @override + String get sendImage => 'Отправить изображение'; + + @override + String sendImages(int count) { + return 'Отправить $count изображений'; + } + + @override + String get sendMessages => 'Отправить сообщения'; + + @override + String get sendOriginal => 'Отправить оригинал'; + + @override + String get sendSticker => 'Отправить стикер'; + + @override + String get sendVideo => 'Отправить видео'; + + @override + String sentAFile(String username) { + return '📁 $username отправил(а) файл'; + } + + @override + String sentAnAudio(String username) { + return '🎤 $username отправил(а) аудио'; + } + + @override + String sentAPicture(String username) { + return '🖼️ $username отправил(а) изображение'; + } + + @override + String sentASticker(String username) { + return '😊 $username отправил(а) стикер'; + } + + @override + String sentAVideo(String username) { + return '🎥 $username отправил(а) видео'; + } + + @override + String sentCallInformations(String senderName) { + return '$senderName отправил(а) информацию о звонке'; + } + + @override + String get separateChatTypes => 'Разделять личные чаты и группы'; + + @override + String get setAsCanonicalAlias => 'Установить как основной псевдоним'; + + @override + String get setCustomEmotes => 'Установить пользовательские эмодзи'; + + @override + String get setChatDescription => 'Установить описание чата'; + + @override + String get setInvitationLink => 'Установить ссылку для приглашения'; + + @override + String get setPermissionsLevel => 'Установить уровень прав'; + + @override + String get setStatus => 'Задать статус'; + + @override + String get settings => 'Настройки'; + + @override + String get share => 'Поделиться'; + + @override + String sharedTheLocation(String username) { + return '$username поделился(-ась) местоположением'; + } + + @override + String get shareLocation => 'Поделиться местоположением'; + + @override + String get showPassword => 'Показать пароль'; + + @override + String get presenceStyle => 'Представление:'; + + @override + String get hideAvatarsInInvites => 'Скрывать аватары в приглашениях'; + + @override + String get hideAvatarsInInvitesDescription => + 'Не показывать аватары комнат в приглашениях'; + + @override + String get presencesToggle => + 'Показывать сообщения в статусах других пользователей'; + + @override + String get pureBlackToggle => 'Чёрный фон (AMOLED)'; + + @override + String get singlesignon => 'Единая система авторизации'; + + @override + String get skip => 'Пропустить'; + + @override + String get sourceCode => 'Исходный код'; + + @override + String get spaceIsPublic => 'Публичное пространство'; + + @override + String get spaceName => 'Название пространства'; + + @override + String startedACall(String senderName) { + return '$senderName начал(а) звонок'; + } + + @override + String get startFirstChat => 'Начните Ваш первый чат'; + + @override + String get status => 'Статус'; + + @override + String get statusExampleMessage => 'Как у вас сегодня дела?'; + + @override + String get submit => 'Отправить'; + + @override + String get synchronizingPleaseWait => 'Синхронизация… Пожалуйста, подождите.'; + + @override + String synchronizingPleaseWaitCounter(String percentage) { + return ' Синхронизация… ($percentage%)'; + } + + @override + String get systemTheme => 'Системная'; + + @override + String get theyDontMatch => 'Они не совпадают'; + + @override + String get theyMatch => 'Они совпадают'; + + @override + String get title => 'Extera'; + + @override + String get toggleFavorite => 'Переключить избранное'; + + @override + String get toggleMuted => 'Переключить без звука'; + + @override + String get toggleUnread => 'Отметить как прочитанное/непрочитанное'; + + @override + String get tooManyRequestsWarning => + 'Слишком много запросов. Пожалуйста, повторите попытку позже!'; + + @override + String get transferFromAnotherDevice => 'Перенос с другого устройства'; + + @override + String get tryToSendAgain => 'Попробуйте отправить ещё раз'; + + @override + String get unavailable => 'Недоступен'; + + @override + String unbannedUser(String username, String targetName) { + return '$username разбанил(а) $targetName'; + } + + @override + String get unblockDevice => 'Разблокировать устройство'; + + @override + String get unknownDevice => 'Неизвестное устройство'; + + @override + String get unknownEncryptionAlgorithm => 'Неизвестный алгоритм шифрования'; + + @override + String unknownEvent(String type) { + return 'Неизвестное событие \'$type\''; + } + + @override + String get unmuteChat => 'Включить уведомления'; + + @override + String get unpin => 'Открепить'; + + @override + String unreadChats(int unreadCount) { + String _temp0 = intl.Intl.pluralLogic( + unreadCount, + locale: localeName, + other: '$unreadCount непрочитанных чата(ов)', + ); + return '$_temp0'; + } + + @override + String userAndOthersAreTyping(String username, int count) { + return '$username и $count других участников печатают…'; + } + + @override + String userAndUserAreTyping(String username, String username2) { + return '$username и $username2 печатают…'; + } + + @override + String userIsTyping(String username) { + return '$username печатает…'; + } + + @override + String userLeftTheChat(String username) { + return '🚪 $username покинул(а) чат'; + } + + @override + String get username => 'Имя пользователя'; + + @override + String userSentUnknownEvent(String username, String type) { + return '$username отправил(а) событие типа \"$type\"'; + } + + @override + String get unverified => 'Не проверено'; + + @override + String get verified => 'Проверено'; + + @override + String get verify => 'Проверить'; + + @override + String get verifyStart => 'Начать проверку'; + + @override + String get verifySuccess => 'Вы успешно проверены!'; + + @override + String get verifyTitle => 'Проверка другой учётной записи'; + + @override + String get videoCall => 'Видеозвонок'; + + @override + String get visibilityOfTheChatHistory => 'Видимость истории чата'; + + @override + String get visibleForAllParticipants => 'Видима для всех участников'; + + @override + String get visibleForEveryone => 'Видна всем'; + + @override + String get voiceMessage => 'Отправить голосовое сообщение'; + + @override + String get waitingPartnerAcceptRequest => + 'Ждём, пока другая сторона примет запрос…'; + + @override + String get waitingPartnerEmoji => 'Ждём, пока другая сторона примет эмодзи…'; + + @override + String get waitingPartnerNumbers => + 'В ожидании другой стороны, чтобы принять числа…'; + + @override + String get wallpaper => 'Обои:'; + + @override + String get warning => 'Предупреждение!'; + + @override + String get weSentYouAnEmail => 'Мы отправили вам электронное письмо'; + + @override + String get whoCanPerformWhichAction => 'Кто и какое действие может выполнять'; + + @override + String get whoIsAllowedToJoinThisGroup => + 'Кому разрешено вступать в эту группу'; + + @override + String get whyDoYouWantToReportThis => 'Почему вы хотите сообщить об этом?'; + + @override + String get wipeChatBackup => + 'Удалить резервную копию чата, чтобы создать новый ключ восстановления?'; + + @override + String get withTheseAddressesRecoveryDescription => + 'По этим адресам вы можете восстановить свой пароль.'; + + @override + String get writeAMessage => 'Напишите сообщение…'; + + @override + String get yes => 'Да'; + + @override + String get you => 'Вы'; + + @override + String get youAreNoLongerParticipatingInThisChat => + 'Вы больше не участвуете в этом чате'; + + @override + String get youHaveBeenBannedFromThisChat => 'Вы были забанены в этом чате'; + + @override + String get yourPublicKey => 'Ваш открытый ключ'; + + @override + String get messageInfo => 'Информация о сообщении'; + + @override + String get time => 'Время'; + + @override + String get messageType => 'Тип сообщения'; + + @override + String get sender => 'Отправитель'; + + @override + String get openGallery => 'Открыть галерею'; + + @override + String get removeFromSpace => 'Удалить из пространства'; + + @override + String get addToSpaceDescription => + 'Выберите пространство, чтобы добавить к нему этот чат.'; + + @override + String get start => 'Начать'; + + @override + String get pleaseEnterRecoveryKeyDescription => + 'Чтобы разблокировать старые сообщения, введите ключ восстановления, сгенерированный в предыдущем сеансе. Ваш ключ восстановления НЕ является вашим паролем.'; + + @override + String get publish => 'Опубликовать'; + + @override + String videoWithSize(String size) { + return 'Видео ($size)'; + } + + @override + String get openChat => 'Открыть чат'; + + @override + String get markAsRead => 'Отметить как прочитанное'; + + @override + String get reportUser => 'Сообщить о пользователе'; + + @override + String get dismiss => 'Отклонить'; + + @override + String reactedWith(String sender, String reaction) { + return '$sender отправил реакцию: $reaction'; + } + + @override + String get pinMessage => 'Прикрепить к комнате'; + + @override + String get confirmEventUnpin => 'Вы уверены, что хотите открепить событие?'; + + @override + String get emojis => 'Эмодзи'; + + @override + String get placeCall => 'Совершить звонок'; + + @override + String get voiceCall => 'Голосовой звонок'; + + @override + String get unsupportedAndroidVersion => 'Неподдерживаемая версия Android'; + + @override + String get unsupportedAndroidVersionLong => + 'Для этой функции требуется более новая версия Android. Проверьте наличие обновлений или поддержку сторонних прошивок.'; + + @override + String get videoCallsBetaWarning => + 'Обратите внимание, что видеозвонки в настоящее время находятся в бета-версии. Они могут работать не так, как ожидалось, или вообще не работать на всех платформах.'; + + @override + String get experimentalVideoCalls => 'Экспериментальные видеозвонки'; + + @override + String get emailOrUsername => 'Адрес электронной почты или имя пользователя'; + + @override + String get indexedDbErrorTitle => 'Проблемы с приватным режимом'; + + @override + String get indexedDbErrorLong => + 'К сожалению, по умолчанию хранилище сообщений не включено в приватном режиме.\nПожалуйста, посетите\n- about:config\n- установите для dom.indexedDB.privateBrowsing.enabled значение true\nВ противном случае запуск Extera будет невозможен.'; + + @override + String switchToAccount(String number) { + return 'Переключиться на учётную запись $number'; + } + + @override + String get nextAccount => 'Следующая учётная запись'; + + @override + String get previousAccount => 'Предыдущая учётная запись'; + + @override + String get addWidget => 'Добавить виджет'; + + @override + String get widgetVideo => 'Видео'; + + @override + String get widgetEtherpad => 'Текстовая записка'; + + @override + String get widgetJitsi => 'Видеозвонок Jitsi'; + + @override + String get widgetCustom => 'Пользовательский'; + + @override + String get widgetName => 'Имя'; + + @override + String get widgetUrlError => 'Этот URL не действителен.'; + + @override + String get widgetNameError => 'Пожалуйста, укажите отображаемое имя.'; + + @override + String get errorAddingWidget => 'Ошибка при добавлении виджета.'; + + @override + String get youRejectedTheInvitation => 'Вы отклонили приглашение'; + + @override + String get youJoinedTheChat => 'Вы присоединились к чату'; + + @override + String get youAcceptedTheInvitation => '👍 Вы приняли приглашение'; + + @override + String youBannedUser(String user) { + return 'Вы забанили $user'; + } + + @override + String youHaveWithdrawnTheInvitationFor(String user) { + return 'Вы отозвали приглашение для $user'; + } + + @override + String youInvitedToBy(String alias) { + return '📩 Вы были приглашены по ссылке в:\n$alias'; + } + + @override + String youInvitedBy(String user) { + return '📩 Вы были приглашены $user'; + } + + @override + String invitedBy(String user) { + return '📩 Приглашен(а) $user'; + } + + @override + String youInvitedUser(String user) { + return '📩 Вы пригласили $user'; + } + + @override + String youKicked(String user) { + return '👞 Вы выгнали $user'; + } + + @override + String youKickedAndBanned(String user) { + return '🙅 Вы забанили $user'; + } + + @override + String youUnbannedUser(String user) { + return 'Вы разбанили $user'; + } + + @override + String hasKnocked(String user) { + return '🚪 $user подал(а) заявку на вступление'; + } + + @override + String get usersMustKnock => 'По заявке на вступление'; + + @override + String get noOneCanJoin => 'Никто не может присоединиться'; + + @override + String userWouldLikeToChangeTheChat(String user) { + return '$user желает присоединиться к чату.'; + } + + @override + String get noPublicLinkHasBeenCreatedYet => + 'Публичная ссылка еще не была создана'; + + @override + String get knock => 'Подать заявку'; + + @override + String get users => 'Пользователи'; + + @override + String get unlockOldMessages => 'Разблокировать старые сообщения'; + + @override + String get storeInSecureStorageDescription => + 'Сохраните ключ восстановления в безопасном хранилище этого устройства.'; + + @override + String get saveKeyManuallyDescription => + 'Сохраните этот ключ вручную, вызвав диалог общего доступа системы или буфера обмена.'; + + @override + String get storeInAndroidKeystore => 'Сохранить в Android KeyStore'; + + @override + String get storeInAppleKeyChain => 'Сохранить в Apple KeyChain'; + + @override + String get storeSecurlyOnThisDevice => 'Сохранить на этом устройстве'; + + @override + String countFiles(int count) { + return '$count файлов'; + } + + @override + String get user => 'Пользователь'; + + @override + String get custom => 'Пользовательское'; + + @override + String get foregroundServiceRunning => + 'Это уведомление появляется, когда запущена основная служба.'; + + @override + String get screenSharingTitle => 'общий доступ к экрану'; + + @override + String get screenSharingDetail => 'Вы делитесь своим экраном в Extera'; + + @override + String get callingPermissions => 'Разрешения на звонки'; + + @override + String get callingAccount => 'Аккаунт для звонков'; + + @override + String get callingAccountDetails => + 'Позволяет Extera использовать системное приложение для звонков.'; + + @override + String get appearOnTop => 'Появляться сверху'; + + @override + String get appearOnTopDetails => + 'Позволяет приложению отображаться сверху (не требуется, если у Вас уже настроена Extera как аккаунт для звонков)'; + + @override + String get otherCallingPermissions => + 'Микрофон, камера и другие разрешения Extera'; + + @override + String get whyIsThisMessageEncrypted => 'Почему это сообщение нечитаемо?'; + + @override + String get noKeyForThisMessage => + 'Это может произойти, если сообщение было отправлено до того, как вы вошли в свою учетную запись на данном устройстве.\n\nТакже возможно, что отправитель заблокировал ваше устройство или что-то пошло не так с интернет-соединением.\n\nВы можете прочитать сообщение на другой сессии? Тогда вы можете перенести сообщение с неё! Перейдите в Настройки > Устройства и убедитесь, что ваши устройства проверили друг друга. Когда вы откроете комнату в следующий раз и обе сессии будут открыты, ключи будут переданы автоматически.\n\nВы не хотите потерять ключи при выходе из системы или переключении устройств? Убедитесь, что вы включили резервное копирование чата в настройках.'; + + @override + String get newGroup => 'Новая группа'; + + @override + String get newSpace => 'Новое пространство'; + + @override + String get enterSpace => 'Войти в пространство'; + + @override + String get enterRoom => 'Войти в комнату'; + + @override + String get allSpaces => 'Все пространства'; + + @override + String numChats(String number) { + return '$number чатов'; + } + + @override + String get hideUnimportantStateEvents => + 'Скрыть необязательные события статуса'; + + @override + String get hidePresences => 'Скрыть список статусов?'; + + @override + String get doNotShowAgain => 'Не показывать снова'; + + @override + String wasDirectChatDisplayName(String oldDisplayName) { + return 'Пустой чат (был $oldDisplayName)'; + } + + @override + String get newSpaceDescription => + 'Пространства позволяют объединять Ваши чаты и создавать частные или общедоступные сообщества.'; + + @override + String get encryptThisChat => 'Зашифровать этот чат'; + + @override + String get disableEncryptionWarning => + 'В целях безопасности Вы не можете отключить шифрование в чате, где оно было включено.'; + + @override + String get sorryThatsNotPossible => 'Извините... это невозможно'; + + @override + String get deviceKeys => 'Ключи устройств:'; + + @override + String get reopenChat => 'Открыть чат заново'; + + @override + String get noBackupWarning => + 'Внимание! Без резервного копиирования, Вы потеряете доступ к своим зашифрованным сообщениям. Крайне рекомендуется включить резервное копирование перед выходом.'; + + @override + String get noOtherDevicesFound => 'Другие устройства не найдены'; + + @override + String fileIsTooBigForServer(String max) { + return 'Отправка не удалась! Сервер поддерживает только вложения размером до $max.'; + } + + @override + String fileHasBeenSavedAt(String path) { + return 'Файл сохранён в $path'; + } + + @override + String get jumpToLastReadMessage => 'Последнее прочитанное сообщение'; + + @override + String get readUpToHere => 'Непрочитанное'; + + @override + String get jump => 'Перейти'; + + @override + String get openLinkInBrowser => 'Открыть ссылку в браузере'; + + @override + String get reportErrorDescription => + '😭 О, нет. Что-то пошло не так. При желании вы можете сообщить об этой ошибке разработчикам.'; + + @override + String get report => 'пожаловаться'; + + @override + String get signInWithPassword => 'Войти с помощью пароля'; + + @override + String get pleaseTryAgainLaterOrChooseDifferentServer => + 'Повторите попытку позже или выберите другой сервер.'; + + @override + String signInWith(String provider) { + return 'Войти с $provider'; + } + + @override + String get profileNotFound => + 'Пользователь не найден на сервере. Это может быть проблемой подключения или пользователь не существует.'; + + @override + String get setTheme => 'Тема:'; + + @override + String get setColorTheme => 'Цветовая тема:'; + + @override + String get invite => 'Пригласить'; + + @override + String get inviteGroupChat => '📨 Приглашение в групповой чат'; + + @override + String get invitePrivateChat => '📨 Приглашение в приватный чат'; + + @override + String get invalidInput => 'Недопустимый ввод!'; + + @override + String wrongPinEntered(int seconds) { + return 'Введён неверный пин-код! Повторите попытку через $seconds секунд...'; + } + + @override + String get pleaseEnterANumber => 'Пожалуйста, введите число больше 0'; + + @override + String get archiveRoomDescription => + 'Чат переместится в архив. Другим пользователям будет видно, что вы вышли из чата.'; + + @override + String get roomUpgradeDescription => + 'Затем чат будет воссоздан с новой версией комнаты. Все участники будут уведомлены о необходимости перейти в новый чат. Вы можете узнать больше о версиях комнат на https://spec.matrix.org/latest/rooms/'; + + @override + String get removeDevicesDescription => + 'Вы выйдете с этого устройства и больше не будете получать сообщения.'; + + @override + String get banUserDescription => + 'Забаненные пользователи не смогут зайти в чат.'; + + @override + String get unbanUserDescription => 'Пользователь сможет зайти в чат снова.'; + + @override + String get kickUserDescription => + 'Пользователь будет выгнан из чата, но не забанен. В общедоступных чатах пользователь может перезайти когда угодно.'; + + @override + String get makeAdminDescription => + 'Как только вы назначите этого пользователя администратором, пути назад не будет, так как их права доступа и ваши будут одинаковы.'; + + @override + String get pushNotificationsNotAvailable => 'Push-уведомления недоступны'; + + @override + String get learnMore => 'Узнать больше'; + + @override + String get yourGlobalUserIdIs => 'Ваш глобальный идентификатор - '; + + @override + String noUsersFoundWithQuery(String query) { + return 'К сожалению, пользователей по запросу \"$query\" не найдено. Убедитесь, что вы не совершили опечатку.'; + } + + @override + String get knocking => 'Подали заявку'; + + @override + String chatCanBeDiscoveredViaSearchOnServer(String server) { + return 'Чат может быть обнаружен через поиск в $server'; + } + + @override + String get searchChatsRooms => 'Поиск #чатов, @людей...'; + + @override + String get nothingFound => 'Ничего не найдено...'; + + @override + String get groupName => 'Название группы'; + + @override + String get createGroupAndInviteUsers => 'Создать и пригласить'; + + @override + String get groupCanBeFoundViaSearch => 'Группа может быть найдена поиском'; + + @override + String get wrongRecoveryKey => + 'Простите... судя по всему, это неверный ключ восстановления.'; + + @override + String get startConversation => 'Начать общение'; + + @override + String get commandHint_sendraw => 'Отправить необработанный json'; + + @override + String get databaseMigrationTitle => 'База данных оптимизирована'; + + @override + String get databaseMigrationBody => + 'Пожалуйста, подождите. Это может занять некоторое время.'; + + @override + String get leaveEmptyToClearStatus => + 'Чтобы очистить статус, оставьте поле пустым.'; + + @override + String get select => 'Выбрать'; + + @override + String get searchForUsers => 'Поиск @пользователей...'; + + @override + String get pleaseEnterYourCurrentPassword => + 'Пожалуйста, введите свой текущий пароль'; + + @override + String get newPassword => 'Новый пароль'; + + @override + String get pleaseChooseAStrongPassword => + 'Пожалуйста, выберите более надёжный пароль'; + + @override + String get passwordsDoNotMatch => 'Пароли не совпадают'; + + @override + String get passwordIsWrong => 'Вы ввели неверный пароль'; + + @override + String get publicLink => 'Общедоступная ссылка'; + + @override + String get publicChatAddresses => 'Адреса общедоступного чата'; + + @override + String get createNewAddress => 'Создать новый адрес'; + + @override + String get joinSpace => 'Присоединиться к пространству'; + + @override + String get publicSpaces => 'Общедоступные пространства'; + + @override + String get addChatOrSubSpace => 'Добавить чат или подпространство'; + + @override + String get subspace => 'Подпространство'; + + @override + String get decline => 'Отклонить'; + + @override + String get thisDevice => 'Данное устройство:'; + + @override + String get initAppError => 'Произошла ошибка при запуске приложения'; + + @override + String get userRole => 'Роль пользователя'; + + @override + String minimumPowerLevel(String level) { + return '$level является минимальным уровнем прав.'; + } + + @override + String searchIn(String chat) { + return 'Поиск в чате \"$chat\"...'; + } + + @override + String get searchMore => 'Найти еще...'; + + @override + String get gallery => 'Галерея'; + + @override + String get files => 'Файлы'; + + @override + String databaseBuildErrorBody(String url, String error) { + return 'Невозможно собрать базу данных SQlite. Приложение пытается использовать старую базу данных. Пожалуйста, сообщите об этой ошибке разработчикам по адресу $url. Сообщение об ошибке: $error'; + } + + @override + String sessionLostBody(String url, String error) { + return 'Ваш сеанс утерян. Пожалуйста, сообщите об этой ошибке разработчикам по адресу $url. Сообщение об ошибке: $error'; + } + + @override + String restoreSessionBody(String url, String error) { + return 'Приложение пытается восстановить сеанс из резервной копии. Пожалуйста, сообщите об этой ошибке разработчикам по адресу $url. Сообщение об ошибке: $error'; + } + + @override + String forwardMessageTo(String roomName) { + return 'Переслать сообщение в $roomName?'; + } + + @override + String get sendReadReceipts => 'Отправка отчётов о прочтении'; + + @override + String get sendTypingNotificationsDescription => + 'Другие участники чата будут видеть, когда Вы набираете новое сообщение.'; + + @override + String get sendReadReceiptsDescription => + 'Другие участники чата увидят, когда Вы прочитали сообщение.'; + + @override + String get formattedMessages => 'Форматированные сообщения'; + + @override + String get formattedMessagesDescription => + 'Отображать формат Markdown в сообщениях, например, жирный текст.'; + + @override + String get verifyOtherUser => '🔐 Подтвердить другого пользователя'; + + @override + String get verifyOtherUserDescription => + 'Если вы подтвердите другого пользователя, то вы можете быть уверены, зная, кому Вы действительно пишете. 💪\n\nКогда Вы начинаете подтверждение, Вы и другой пользователь увидите всплывающее окно в приложении. Там Вы увидите ряд чисел или эмодзи, которые Вы должны сравнить друг с другом.\n\nЛучший способ сделать это - встретиться в реальной жизни или по видео звонку. Если Вы читаете это в далёком будущем, где технологии Deepfake сильно развились, то лучше не стоит доверять видеозвонкам. 👭'; + + @override + String get verifyOtherDevice => '🔐 Подтвердить другое устройство'; + + @override + String get verifyOtherDeviceDescription => + 'При подтверждении другого устройства эти устройства могут обмениваться ключами, повышая общую безопасность. 💪 При запуске подтверждения в приложении на обоих устройствах появится всплывающее окно. Там вы увидите ряд чисел или эмодзи, которые вы должны сравнить друг с другом. Лучше иметь оба устройства под рукой перед началом проверки. 🤳'; + + @override + String acceptedKeyVerification(String sender) { + return '$sender принял(а) подтверждение ключей'; + } + + @override + String canceledKeyVerification(String sender) { + return '$sender отклонил(а) подтверждение ключей'; + } + + @override + String completedKeyVerification(String sender) { + return '$sender завершил(а) подтверждение ключей'; + } + + @override + String isReadyForKeyVerification(String sender) { + return '$sender готов(а) к подтверждению ключей'; + } + + @override + String requestedKeyVerification(String sender) { + return '$sender запросил(а) подтверждение ключей'; + } + + @override + String startedKeyVerification(String sender) { + return '$sender начал(а) подтверждение ключей'; + } + + @override + String get transparent => 'Прозрачный'; + + @override + String get incomingMessages => 'Входящие сообщения'; + + @override + String get stickers => 'Стикеры'; + + @override + String get discover => 'Исследовать'; + + @override + String get commandHint_ignore => 'Игнорировать данный Matrix ID'; + + @override + String get commandHint_unignore => 'Перестать игнорировать данный Matrix ID'; + + @override + String unreadChatsInApp(String appname, String unread) { + return '$appname: $unread непрочитанных чатов'; + } + + @override + String get noDatabaseEncryption => + 'Шифрование базы данных не поддерживается на этой платформе'; + + @override + String thereAreCountUsersBlocked(Object count) { + return 'Заблокировано $count пользователей.'; + } + + @override + String get restricted => 'Ограничено'; + + @override + String get knockRestricted => 'Ограничено + по запросу'; + + @override + String goToSpace(Object space) { + return 'Перейти к пространству: $space'; + } + + @override + String get markAsUnread => 'Отметить как непрочитанное'; + + @override + String userLevel(int level) { + return '$level - Пользователь'; + } + + @override + String moderatorLevel(int level) { + return '$level - Модератор'; + } + + @override + String adminLevel(int level) { + return '$level - Администратор'; + } + + @override + String get changeGeneralChatSettings => 'Изменить общие настройки чата'; + + @override + String get inviteOtherUsers => 'Пригласить других пользователей в этот чат'; + + @override + String get changeTheChatPermissions => 'Изменить права доступа к чату'; + + @override + String get changeTheVisibilityOfChatHistory => + 'Изменить видимость истории чата'; + + @override + String get changeTheCanonicalRoomAlias => + 'Изменить основной общедоступный адрес чата'; + + @override + String get sendRoomNotifications => 'Упоминать @room'; + + @override + String get changeTheDescriptionOfTheGroup => 'Изменить описание чата'; + + @override + String get chatPermissionsDescription => + 'Задайте уровень власти, необходимый для совершения определённых действий в этом чате. Уровни прав 0, 50 и 100 обычно обозначают пользователей, модераторов и администраторов соответственно, но другие уровни также возможны.'; + + @override + String updateInstalled(String version) { + return '🎉 Обновление $version успешно установлено!'; + } + + @override + String get changelog => 'Список изменений'; + + @override + String get sendCanceled => 'Отправка отменена'; + + @override + String get loginWithMatrixId => 'Войти через Matrix ID'; + + @override + String get discoverHomeservers => 'Список домашних серверов'; + + @override + String get whatIsAHomeserver => 'Для чего нужен домашний сервер?'; + + @override + String get homeserverDescription => + 'Все ваши данные хранятся на домашнем сервере, прямо как у вашего провайдера электронной почты. Вы можете выбрать, какому серверу вы их доверите, при этом сохраняя возможность общаться со всеми. Узнайте больше на https://matrix.org.'; + + @override + String get doesNotSeemToBeAValidHomeserver => + 'Кажется, это не домашний сервер. Нет ли в ссылке опечаток?'; + + @override + String get calculatingFileSize => 'Вычисление размера файла...'; + + @override + String get prepareSendingAttachment => 'Подготовка к отправке вложения...'; + + @override + String get sendingAttachment => 'Отправка вложения...'; + + @override + String get generatingVideoThumbnail => 'Создание превью видео...'; + + @override + String get compressVideo => 'Сжатие видео...'; + + @override + String sendingAttachmentCountOfCount(int index, int length) { + return 'Отправка... $index $length...'; + } + + @override + String serverLimitReached(int seconds) { + return 'Слишком много запросов. Повторите попытку через $seconds секунд...'; + } + + @override + String get oneOfYourDevicesIsNotVerified => + 'Одно из ваших устройств не подтверждено'; + + @override + String get noticeChatBackupDeviceVerification => + 'Примечание: Если вы подключите все свои устройства к резервному копированию чатов, то они автоматически станут подтверждёнными.'; + + @override + String get continueText => 'Продолжить'; + + @override + String get welcomeText => + 'Добро пожаловать в Extera - приложение для Matrix, огромной децентрализованной сети обмена сообщениями!'; + + @override + String get blur => 'Размытие:'; + + @override + String get opacity => 'Прозрачность:'; + + @override + String get setWallpaper => 'Установить обои'; + + @override + String get manageAccount => 'Управление аккаунтом'; + + @override + String get noContactInformationProvided => + 'Сервер не предоставляет никакой контактной информации'; + + @override + String get contactServerAdmin => 'Админ сервера'; + + @override + String get contactServerSecurity => 'Безопасность контактов сервера'; + + @override + String get supportPage => 'Поддержка'; + + @override + String get serverInformation => 'Информация о сервере:'; + + @override + String get name => 'Имя'; + + @override + String get version => 'Версия'; + + @override + String get website => 'Сайт'; + + @override + String get compress => 'Сжатие'; + + @override + String get boldText => 'Жирный шрифт'; + + @override + String get italicText => 'Italic'; + + @override + String get strikeThrough => 'Перечёркнутый'; + + @override + String get pleaseFillOut => 'Пожалуйста, заполните'; + + @override + String get invalidUrl => 'Не верный URL'; + + @override + String get addLink => 'Добавить ссылку'; + + @override + String get unableToJoinChat => + 'Невозможно присоединиться к чату. Возможно, другая сторона уже завершила разговор.'; + + @override + String get previous => 'Предыдущий'; + + @override + String get otherPartyNotLoggedIn => + 'Другая сторона не может получать сообщения.'; + + @override + String appWantsToUseForLogin(String server) { + return 'Использовать \'$server\' для входа'; + } + + @override + String get appWantsToUseForLoginDescription => + 'Вы позволяете приложению и веб-сайту делиться информацией о Вас.'; + + @override + String get open => 'Открыть'; + + @override + String get waitingForServer => 'Ожидание сервера...'; + + @override + String get appIntroduction => + 'Extera позволяет Вам присоединяться к другим мессенджерам. Узнайте больше на https://matrix.org или просто нажмите *Продолжить*.'; + + @override + String get newChatRequest => '📩 Запрос нового чата'; + + @override + String get contentNotificationSettings => 'Настройки уведомлений по тексту'; + + @override + String get generalNotificationSettings => 'Общие настройки уведомлений'; + + @override + String get roomNotificationSettings => 'Настройки уведомлений комнаты'; + + @override + String get userSpecificNotificationSettings => + 'Настроки уведомлений пользователя'; + + @override + String get otherNotificationSettings => 'Другие настройки уведомлений'; + + @override + String get notificationRuleContainsUserName => 'Содержит имя пользователя'; + + @override + String get notificationRuleContainsUserNameDescription => + 'Уведомляет пользователя когда сообщение содержит его имя пользователя.'; + + @override + String get notificationRuleMaster => 'Отключить все уведомления'; + + @override + String get notificationRuleMasterDescription => + 'Перекрывает все другие правила и отключает все уведомления.'; + + @override + String get notificationRuleSuppressNotices => + 'Отключить автоматические сообщения'; + + @override + String get notificationRuleSuppressNoticesDescription => + 'Отключить уведомления от ботов.'; + + @override + String get notificationRuleInviteForMe => 'Приглашение для меня'; + + @override + String get notificationRuleInviteForMeDescription => + 'Уведомляет о приглашениях.'; + + @override + String get notificationRuleMemberEvent => 'Изменение участника'; + + @override + String get notificationRuleMemberEventDescription => + 'Отключить уведомления об изменениях имён, аватаров.'; + + @override + String get notificationRuleIsUserMention => 'Упоминание пользователя'; + + @override + String get notificationRuleIsUserMentionDescription => + 'Отправлять уведомление, когда Вы @упомянуты.'; + + @override + String get notificationRuleContainsDisplayName => 'Содержит отображаемое имя'; + + @override + String get notificationRuleContainsDisplayNameDescription => + 'Отправлять уведомление, если сообщение содержит Ваше отображаемое имя.'; + + @override + String get notificationRuleIsRoomMention => 'Упоминание комнаты'; + + @override + String get notificationRuleIsRoomMentionDescription => + 'Отправлять уведомление, когда в сообщении есть \'@room\'.'; + + @override + String get notificationRuleRoomnotif => 'Упоминание комнаты'; + + @override + String get notificationRuleRoomnotifDescription => + 'Отправлять уведомление, когда в сообщении есть \'@room\'.'; + + @override + String get notificationRuleTombstone => 'Завершение чата'; + + @override + String get notificationRuleTombstoneDescription => + 'Отправлять уведомление при завершении чата.'; + + @override + String get notificationRuleReaction => 'Реакция'; + + @override + String get notificationRuleReactionDescription => + 'Отключить уведомления о реакциях.'; + + @override + String get notificationRuleRoomServerAcl => 'Заглушить уведомления о ACL'; + + @override + String get notificationRuleRoomServerAclDescription => + 'Не отправлять уведомления при изменении ACL комнаты.'; + + @override + String get notificationRuleSuppressEdits => 'Заглушить изменения'; + + @override + String get notificationRuleSuppressEditsDescription => + 'Отключить уведомления об изменённых сообщениях.'; + + @override + String get notificationRuleCall => 'Звонок'; + + @override + String get notificationRuleCallDescription => + 'Отправлять уведомления о звонках.'; + + @override + String get notificationRuleEncryptedRoomOneToOne => 'Зашифрованные ЛС'; + + @override + String get notificationRuleEncryptedRoomOneToOneDescription => + 'Отправлять уведомления из зашифрованных личных сообщений.'; + + @override + String get notificationRuleRoomOneToOne => 'Личные сообщения'; + + @override + String get notificationRuleRoomOneToOneDescription => + 'Отправлять уведомления из незашифрованных личных сообщений.'; + + @override + String get notificationRuleMessage => 'Сообщения'; + + @override + String get notificationRuleMessageDescription => + 'Отправлять уведомления из обычных чатов.'; + + @override + String get notificationRuleEncrypted => 'Зашифрованные сообщения'; + + @override + String get notificationRuleEncryptedDescription => + 'Отправлять уведомления из зашифрованных чатов.'; + + @override + String get notificationRuleJitsi => 'Jitsi'; + + @override + String get notificationRuleJitsiDescription => + 'Отправлять уведомления о видеозвонках Jitsi.'; + + @override + String get notificationRuleServerAcl => 'Заглушить события ACL'; + + @override + String get notificationRuleServerAclDescription => + 'Не отправлять уведомления об изменениях ACL.'; + + @override + String unknownPushRule(String rule) { + return 'Неизвестное правило push-уведомлений \'$rule\''; + } + + @override + String get deletePushRuleCanNotBeUndone => + 'Удаление правила push-уведомлений необратимо.'; + + @override + String get more => 'Больше'; + + @override + String get shareKeysWith => 'Делиться ключами...'; + + @override + String get shareKeysWithDescription => + 'Какие устройства доверены и смогут читать Ваши зашифрованные сообщения?'; + + @override + String get allDevices => 'Со всеми устройствами'; + + @override + String get crossVerifiedDevicesIfEnabled => + 'С устройствами, заверенными перекрёстной подписью, если включено'; + + @override + String get crossVerifiedDevices => + 'С устройствами, заверенными перекрёстной подписью'; + + @override + String get verifiedDevicesOnly => 'Только с подтверждёнными устройствами'; + + @override + String get takeAPhoto => 'Сделать фото'; + + @override + String get recordAVideo => 'Записать видео'; + + @override + String get optionalMessage => 'Подпись (необязательно)...'; + + @override + String get notSupportedOnThisDevice => 'Не поддерживается на этом устройстве'; + + @override + String get enterNewChat => 'Перейти в новый чат'; + + @override + String get approve => 'Принять'; + + @override + String get youHaveKnocked => 'Вы отправили запрос на вступление'; + + @override + String get pleaseWaitUntilInvited => + 'Пожалуйста, подождите когда администраторы примут Ваш запрос.'; +} diff --git a/lib/generated/l10n/l10n_sk.dart b/lib/generated/l10n/l10n_sk.dart new file mode 100644 index 0000000..9ed9d95 --- /dev/null +++ b/lib/generated/l10n/l10n_sk.dart @@ -0,0 +1,2746 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'l10n.dart'; + +// ignore_for_file: type=lint + +/// The translations for Slovak (`sk`). +class L10nSk extends L10n { + L10nSk([String locale = 'sk']) : super(locale); + + @override + String get noSendPermission => 'You can\'t send messages here'; + + @override + String get alwaysUse24HourFormat => 'false'; + + @override + String get repeatPassword => 'Zopakujte heslo'; + + @override + String get notAnImage => 'Not an image file.'; + + @override + String get setCustomPermissionLevel => 'Set custom permission level'; + + @override + String get setPermissionsLevelDescription => + 'Please choose a predefined role below or enter a custom permission level between 0 and 100.'; + + @override + String get ignoreUser => 'Ignore user'; + + @override + String get normalUser => 'Normal user'; + + @override + String get remove => 'Odstrániť'; + + @override + String get importNow => 'Importovať teraz'; + + @override + String get importEmojis => 'Import Emojis'; + + @override + String get importFromZipFile => 'Import from .zip file'; + + @override + String get exportEmotePack => 'Export Emote pack as .zip'; + + @override + String get replace => 'Replace'; + + @override + String get about => 'O aplikácii'; + + @override + String aboutHomeserver(String homeserver) { + return 'About $homeserver'; + } + + @override + String get accept => 'Prijať'; + + @override + String acceptedTheInvitation(String username) { + return '$username prijali pozvánku'; + } + + @override + String get account => 'Účet'; + + @override + String activatedEndToEndEncryption(String username) { + return '$username aktivovali koncové šifrovanie'; + } + + @override + String get addEmail => 'Pridať email'; + + @override + String get confirmMatrixId => + 'Please confirm your Matrix ID in order to delete your account.'; + + @override + String supposedMxid(String mxid) { + return 'This should be $mxid'; + } + + @override + String get addChatDescription => 'Add a chat description...'; + + @override + String get addToSpace => 'Pridať do priestoru'; + + @override + String get admin => 'Administrátor'; + + @override + String get alias => 'alias'; + + @override + String get all => 'Všetky'; + + @override + String get allChats => 'Všetky chaty'; + + @override + String get commandHint_roomupgrade => + 'Upgrade this room to the given room version'; + + @override + String get commandHint_googly => 'Send some googly eyes'; + + @override + String get commandHint_cuddle => 'Send a cuddle'; + + @override + String get commandHint_hug => 'Send a hug'; + + @override + String googlyEyesContent(String senderName) { + return '$senderName sends you googly eyes'; + } + + @override + String cuddleContent(String senderName) { + return '$senderName cuddles you'; + } + + @override + String hugContent(String senderName) { + return '$senderName hugs you'; + } + + @override + String answeredTheCall(String senderName) { + return '$senderName prevzal hovor'; + } + + @override + String get anyoneCanJoin => 'Ktokoľvek sa môže pripojiť'; + + @override + String get appLock => 'Uzamknutie aplikácie'; + + @override + String get appLockDescription => + 'Lock the app when not using with a pin code'; + + @override + String get archive => 'Archivovať'; + + @override + String get areGuestsAllowedToJoin => 'Môžu sa pripojiť hostia'; + + @override + String get areYouSure => 'Ste si istí?'; + + @override + String get areYouSureYouWantToLogout => 'Ste si istí, že sa chcete odhlásiť?'; + + @override + String get askSSSSSign => + 'Na overenie tejto osoby, prosím zadajte prístupovu frázu k \"bezpečému úložisku\" alebo \"klúč na obnovu\".'; + + @override + String askVerificationRequest(String username) { + return 'Akcepovať žiadosť o verifikáciu od $username?'; + } + + @override + String get autoplayImages => + 'Automatically play animated stickers and emotes'; + + @override + String badServerLoginTypesException(String serverVersions, + String supportedVersions, Object suportedVersions) { + return 'Server podporuje tieto typy prihlásenia:\n$serverVersions\nAle táto aplikácia podporuje iba:\n$supportedVersions'; + } + + @override + String get sendTypingNotifications => 'Send typing notifications'; + + @override + String get swipeRightToLeftToReply => 'Swipe right to left to reply'; + + @override + String get sendOnEnter => 'Odoslať pri vstupe'; + + @override + String badServerVersionsException(String serverVersions, + String supportedVersions, Object serverVerions, Object suportedVersions) { + return 'Domovský server podporuje verzie špecifikácie:\n$serverVersions\nAle táto aplikácie podporuje iba $supportedVersions'; + } + + @override + String countChatsAndCountParticipants(int chats, int participants) { + return '$chats chats and $participants participants'; + } + + @override + String get noMoreChatsFound => 'No more chats found...'; + + @override + String get noChatsFoundHere => + 'No chats found here yet. Start a new chat with someone by using the button below. ⤵️'; + + @override + String get joinedChats => 'Joined chats'; + + @override + String get unread => 'Unread'; + + @override + String get space => 'Space'; + + @override + String get spaces => 'Spaces'; + + @override + String get banFromChat => 'Zabanovať z chatu'; + + @override + String get banned => 'Zabanovaný'; + + @override + String bannedUser(String username, String targetName) { + return '$username zabanoval $targetName'; + } + + @override + String get blockDevice => 'Zakázať zariadenie'; + + @override + String get blocked => 'Blocked'; + + @override + String get botMessages => 'Bot messages'; + + @override + String get cancel => 'Zrušiť'; + + @override + String cantOpenUri(String uri) { + return 'Nemožno otvoriť identifikátor prostriedku $uri'; + } + + @override + String get changeDeviceName => 'Zmeniť názov zariadenia'; + + @override + String changedTheChatAvatar(String username) { + return '$username si zmenili svôj avatar'; + } + + @override + String changedTheChatDescriptionTo(String username, String description) { + return '$username zmenili popis chatu na: „$description“'; + } + + @override + String changedTheChatNameTo(String username, String chatname) { + return '$username zmenili meno chatu na: „$chatname“'; + } + + @override + String changedTheChatPermissions(String username) { + return '$username zmenili nastavenie oprávnení chatu'; + } + + @override + String changedTheDisplaynameTo(String username, String displayname) { + return '$username si zmenili prezývku na: $displayname'; + } + + @override + String changedTheGuestAccessRules(String username) { + return '$username zmenili prístupové práva pre hosťov'; + } + + @override + String changedTheGuestAccessRulesTo(String username, String rules) { + return '$username zmenili prístupové práva pro hosťov na: $rules'; + } + + @override + String changedTheHistoryVisibility(String username) { + return '$username zmenili nastavenie viditelnosti histórie chatu'; + } + + @override + String changedTheHistoryVisibilityTo(String username, String rules) { + return '$username zmenili nastavenie viditelnosti histórie chatu na: $rules'; + } + + @override + String changedTheJoinRules(String username) { + return '$username zmenili nastavenie pravidiel pripojenia'; + } + + @override + String changedTheJoinRulesTo(String username, String joinRules) { + return '$username zmenili nastavenie pravidiel pripojenia na: $joinRules'; + } + + @override + String changedTheProfileAvatar(String username) { + return '$username si zmenili profilový obrázok'; + } + + @override + String changedTheRoomAliases(String username) { + return '$username zmenili nastavenie aliasov chatu'; + } + + @override + String changedTheRoomInvitationLink(String username) { + return '$username zmenili odkaz k pozvánke do miestnosti'; + } + + @override + String get changePassword => 'Zmeniť heslo'; + + @override + String get changeTheHomeserver => 'Zmeniť použitý server'; + + @override + String get changeTheme => 'Zmena štýlu'; + + @override + String get changeTheNameOfTheGroup => 'Zmeniť názov skupiny'; + + @override + String get changeYourAvatar => 'Change your avatar'; + + @override + String get channelCorruptedDecryptError => 'Šifrovanie bolo poškodené'; + + @override + String get chat => 'Chat'; + + @override + String get yourChatBackupHasBeenSetUp => + 'Záloha vašich chatov bola nastavená.'; + + @override + String get chatBackup => 'Záloha chatov'; + + @override + String get chatBackupDescription => + 'Your old messages are secured with a recovery key. Please make sure you don\'t lose it.'; + + @override + String get chatDetails => 'Podrobnosti o chate'; + + @override + String get chatHasBeenAddedToThisSpace => 'Chat has been added to this space'; + + @override + String get chats => 'Čety'; + + @override + String get chooseAStrongPassword => 'Vyberte si silné heslo'; + + @override + String get clearArchive => 'Clear archive'; + + @override + String get close => 'Zavrieť'; + + @override + String get commandHint_markasdm => + 'Mark as direct message room for the giving Matrix ID'; + + @override + String get commandHint_markasgroup => 'Mark as group'; + + @override + String get commandHint_ban => 'Ban the given user from this room'; + + @override + String get commandHint_clearcache => 'Clear cache'; + + @override + String get commandHint_create => + 'Create an empty group chat\nUse --no-encryption to disable encryption'; + + @override + String get commandHint_discardsession => 'Discard session'; + + @override + String get commandHint_dm => + 'Start a direct chat\nUse --no-encryption to disable encryption'; + + @override + String get commandHint_html => 'Send HTML-formatted text'; + + @override + String get commandHint_invite => 'Invite the given user to this room'; + + @override + String get commandHint_join => 'Join the given room'; + + @override + String get commandHint_kick => 'Remove the given user from this room'; + + @override + String get commandHint_leave => 'Leave this room'; + + @override + String get commandHint_me => 'Describe yourself'; + + @override + String get commandHint_myroomavatar => + 'Set your picture for this room (by mxc-uri)'; + + @override + String get commandHint_myroomnick => 'Set your display name for this room'; + + @override + String get commandHint_op => + 'Set the given user\'s power level (default: 50)'; + + @override + String get commandHint_plain => 'Send unformatted text'; + + @override + String get commandHint_react => 'Send reply as a reaction'; + + @override + String get commandHint_send => 'Send text'; + + @override + String get commandHint_unban => 'Unban the given user from this room'; + + @override + String get commandInvalid => 'Command invalid'; + + @override + String commandMissing(String command) { + return '$command is not a command.'; + } + + @override + String get compareEmojiMatch => + 'Porovnajte a uistite sa, že nasledujúce emotikony sa zhodujú na oboch zariadeniach:'; + + @override + String get compareNumbersMatch => + 'Porovnajte a uistite sa, že nasledujúce čísla sa zhodujú na oboch zariadeniach:'; + + @override + String get configureChat => 'Configure chat'; + + @override + String get confirm => 'Potvrdiť'; + + @override + String get connect => 'Pripojiť'; + + @override + String get contactHasBeenInvitedToTheGroup => + 'Kontakt bol pozvaný do skupiny'; + + @override + String get containsDisplayName => 'Contains display name'; + + @override + String get containsUserName => 'Contains username'; + + @override + String get contentHasBeenReported => + 'The content has been reported to the server admins'; + + @override + String get copiedToClipboard => 'Skopírované do schránky'; + + @override + String get copy => 'Kopírovať'; + + @override + String get copyToClipboard => 'Copy to clipboard'; + + @override + String couldNotDecryptMessage(String error) { + return 'Nebolo možné dešifrovať správu: $error'; + } + + @override + String countParticipants(int count) { + return '$count účastníkov'; + } + + @override + String get create => 'Vytvoriť'; + + @override + String createdTheChat(String username) { + return '$username založili chat'; + } + + @override + String get createGroup => 'Create group'; + + @override + String get createNewSpace => 'New space'; + + @override + String get currentlyActive => 'Momentálne prítomní'; + + @override + String get darkTheme => 'Tmavá'; + + @override + String dateAndTimeOfDay(String date, String timeOfDay) { + return '$date, $timeOfDay'; + } + + @override + String dateWithoutYear(String month, String day) { + return '$day.$month'; + } + + @override + String dateWithYear(String year, String month, String day) { + return '$day.$month.$year'; + } + + @override + String get deactivateAccountWarning => + 'This will deactivate your user account. This can not be undone! Are you sure?'; + + @override + String get defaultPermissionLevel => 'Default permission level for new users'; + + @override + String get delete => 'Odstrániť'; + + @override + String get deleteAccount => 'Delete account'; + + @override + String get deleteMessage => 'Odstrániť správu'; + + @override + String get device => 'Zariadenie'; + + @override + String get deviceId => 'Device ID'; + + @override + String get devices => 'Zariadenia'; + + @override + String get directChats => 'Direct Chats'; + + @override + String get allRooms => 'All Group Chats'; + + @override + String get displaynameHasBeenChanged => 'Prezývka bola zmenená'; + + @override + String get downloadFile => 'Stiahnuť súbor'; + + @override + String get edit => 'Edit'; + + @override + String get editBlockedServers => 'Edit blocked servers'; + + @override + String get chatPermissions => 'Chat permissions'; + + @override + String get editDisplayname => 'Zmeniť prezývku'; + + @override + String get editRoomAliases => 'Edit room aliases'; + + @override + String get editRoomAvatar => 'Edit room avatar'; + + @override + String get emoteExists => 'Emotikon už existuje!'; + + @override + String get emoteInvalid => 'Nesprávné označenie emotikonu!'; + + @override + String get emoteKeyboardNoRecents => + 'Recently-used emotes will appear here...'; + + @override + String get emotePacks => 'Emote packs for room'; + + @override + String get emoteSettings => 'Nastavenie emotikonov'; + + @override + String get globalChatId => 'Global chat ID'; + + @override + String get accessAndVisibility => 'Access and visibility'; + + @override + String get accessAndVisibilityDescription => + 'Who is allowed to join this chat and how the chat can be discovered.'; + + @override + String get calls => 'Calls'; + + @override + String get customEmojisAndStickers => 'Custom emojis and stickers'; + + @override + String get customEmojisAndStickersBody => + 'Add or share custom emojis or stickers which can be used in any chat.'; + + @override + String get emoteShortcode => 'Kód emotikonu'; + + @override + String get emoteWarnNeedToPick => 'Musíte zvoliť kód emotikonu a obrázok!'; + + @override + String get emptyChat => 'Prázdny chat'; + + @override + String get enableEmotesGlobally => 'Enable emote pack globally'; + + @override + String get enableEncryption => 'Enable encryption'; + + @override + String get enableEncryptionWarning => + 'Šifrovanie už nebude možné vypnúť. Ste si tým istí?'; + + @override + String get encrypted => 'Encrypted'; + + @override + String get encryption => 'Šifrovanie'; + + @override + String get encryptionNotEnabled => 'Šifrovanie nie je aktívne'; + + @override + String endedTheCall(String senderName) { + return '$senderName ended the call'; + } + + @override + String get enterAnEmailAddress => 'Enter an email address'; + + @override + String get homeserver => 'Homeserver'; + + @override + String get enterYourHomeserver => 'Zadajte svoj homeserver'; + + @override + String errorObtainingLocation(String error) { + return 'Error obtaining location: $error'; + } + + @override + String get everythingReady => 'Everything ready!'; + + @override + String get extremeOffensive => 'Extremely offensive'; + + @override + String get fileName => 'Názov súboru'; + + @override + String get fluffychat => 'FluffyChat'; + + @override + String get fontSize => 'Font size'; + + @override + String get forward => 'Preposlať'; + + @override + String get fromJoining => 'Od pripojenia'; + + @override + String get fromTheInvitation => 'Od pozvania'; + + @override + String get goToTheNewRoom => 'Go to the new room'; + + @override + String get group => 'Skupina'; + + @override + String get chatDescription => 'Chat description'; + + @override + String get chatDescriptionHasBeenChanged => 'Chat description changed'; + + @override + String get groupIsPublic => 'Skupina je verejná'; + + @override + String get groups => 'Groups'; + + @override + String groupWith(String displayname) { + return 'Skupina s $displayname'; + } + + @override + String get guestsAreForbidden => 'Hostia sú zakázaní'; + + @override + String get guestsCanJoin => 'Hostia sa môžu pripojiť'; + + @override + String hasWithdrawnTheInvitationFor(String username, String targetName) { + return '$username vzal späť pozvánku pre $targetName'; + } + + @override + String get help => 'Pomoc'; + + @override + String get hideRedactedEvents => 'Hide redacted events'; + + @override + String get hideRedactedMessages => 'Hide redacted messages'; + + @override + String get hideRedactedMessagesBody => + 'If someone redacts a message, this message won\'t be visible in the chat anymore.'; + + @override + String get hideInvalidOrUnknownMessageFormats => + 'Hide invalid or unknown message formats'; + + @override + String get howOffensiveIsThisContent => 'How offensive is this content?'; + + @override + String get id => 'ID'; + + @override + String get identity => 'Identita'; + + @override + String get block => 'Block'; + + @override + String get blockedUsers => 'Blocked users'; + + @override + String get blockListDescription => + 'You can block users who are disturbing you. You won\'t be able to receive any messages or room invites from the users on your personal block list.'; + + @override + String get blockUsername => 'Ignore username'; + + @override + String get iHaveClickedOnLink => 'I have clicked on the link'; + + @override + String get incorrectPassphraseOrKey => + 'Nesprávna prístupová fráza alebo kľúč na obnovenie'; + + @override + String get inoffensive => 'Inoffensive'; + + @override + String get inviteContact => 'Pozvať kontakt'; + + @override + String inviteContactToGroupQuestion(Object contact, Object groupName) { + return 'Do you want to invite $contact to the chat \"$groupName\"?'; + } + + @override + String inviteContactToGroup(String groupName) { + return 'Pozvať kontakt do $groupName'; + } + + @override + String get noChatDescriptionYet => 'No chat description created yet.'; + + @override + String get tryAgain => 'Try again'; + + @override + String get invalidServerName => 'Invalid server name'; + + @override + String get invited => 'Pozvanie'; + + @override + String get redactMessageDescription => + 'The message will be redacted for all participants in this conversation. This cannot be undone.'; + + @override + String get optionalRedactReason => + '(Optional) Reason for redacting this message...'; + + @override + String invitedUser(String username, String targetName) { + return '$username pozvali $targetName'; + } + + @override + String get invitedUsersOnly => 'Len pozvaní používatelia'; + + @override + String get inviteForMe => 'Invite for me'; + + @override + String inviteText(String username, String link) { + return '$username vás pozval na FluffyChat.\n1. Nainštalujte si FluffyChat: https://fluffychat.im\n2. Zaregistrujte sa alebo sa prihláste\n3. Otvorte odkaz na pozvánku: $link'; + } + + @override + String get isTyping => 'píše…'; + + @override + String joinedTheChat(String username) { + return '$username sa pripojili do chatu'; + } + + @override + String get joinRoom => 'Pripojiť sa k miestnosti'; + + @override + String kicked(String username, String targetName) { + return '$username vyhodili $targetName'; + } + + @override + String kickedAndBanned(String username, String targetName) { + return '$username vyhodili a zabanovali $targetName'; + } + + @override + String get kickFromChat => 'Vyhodiť z chatu'; + + @override + String lastActiveAgo(String localizedTimeShort) { + return 'Naposledy prítomní: $localizedTimeShort'; + } + + @override + String get leave => 'Opustiť'; + + @override + String get leftTheChat => 'Opustili chat'; + + @override + String get license => 'Licencia'; + + @override + String get lightTheme => 'Svetlá'; + + @override + String loadCountMoreParticipants(int count) { + return 'Načítať ďalších $count účastníkov'; + } + + @override + String get dehydrate => 'Export session and wipe device'; + + @override + String get dehydrateWarning => + 'This action cannot be undone. Ensure you safely store the backup file.'; + + @override + String get dehydrateTor => 'TOR Users: Export session'; + + @override + String get dehydrateTorLong => + 'For TOR users, it is recommended to export the session before closing the window.'; + + @override + String get hydrateTor => 'TOR Users: Import session export'; + + @override + String get hydrateTorLong => + 'Did you export your session last time on TOR? Quickly import it and continue chatting.'; + + @override + String get hydrate => 'Restore from backup file'; + + @override + String get loadingPleaseWait => 'Načítava sa… Čakajte prosím.'; + + @override + String get loadMore => 'Načítať viac…'; + + @override + String get locationDisabledNotice => + 'Location services are disabled. Please enable them to be able to share your location.'; + + @override + String get locationPermissionDeniedNotice => + 'Location permission denied. Please grant them to be able to share your location.'; + + @override + String get login => 'Prihlásiť sa'; + + @override + String logInTo(String homeserver) { + return 'Prihlásenie k $homeserver'; + } + + @override + String get logout => 'Odhlásiť sa'; + + @override + String get memberChanges => 'Member changes'; + + @override + String get mention => 'Mention'; + + @override + String get messages => 'Messages'; + + @override + String get messagesStyle => 'Messages:'; + + @override + String get moderator => 'Moderátor'; + + @override + String get muteChat => 'Stlmiť chat'; + + @override + String get needPantalaimonWarning => + 'Prosím berte na vedomie, že na koncové šifrovanie zatiaľ potrebujete Pantalaimon.'; + + @override + String get newChat => 'New chat'; + + @override + String get newMessageInFluffyChat => 'Nová správa v FluffyChate'; + + @override + String get newVerificationRequest => 'Nová žiadosť o verifikáciu!'; + + @override + String get next => 'Next'; + + @override + String get no => 'No'; + + @override + String get noConnectionToTheServer => 'No connection to the server'; + + @override + String get noEmotesFound => 'Nenašli sa žiadne emotikony. 😕'; + + @override + String get noEncryptionForPublicRooms => + 'You can only activate encryption as soon as the room is no longer publicly accessible.'; + + @override + String get noGoogleServicesWarning => + 'Zdá sa, že nemáte žiadne služby Googlu v telefóne. To je dobré rozhodnutie pre vaše súkromie! Ak chcete dostávať push notifikácie vo FluffyChat, odporúčame používať microG: https://microg.org/.'; + + @override + String noMatrixServer(String server1, String server2) { + return '$server1 is no matrix server, use $server2 instead?'; + } + + @override + String get shareInviteLink => 'Share invite link'; + + @override + String get scanQrCode => 'Scan QR code'; + + @override + String get none => 'Žiadne'; + + @override + String get noPasswordRecoveryDescription => + 'You have not added a way to recover your password yet.'; + + @override + String get noPermission => 'Chýba povolenie'; + + @override + String get noRoomsFound => 'Nenašli sa žiadne miestnosti…'; + + @override + String get notifications => 'Notifications'; + + @override + String get notificationsEnabledForThisAccount => + 'Notifications enabled for this account'; + + @override + String numUsersTyping(int count) { + return '$count users are typing…'; + } + + @override + String get obtainingLocation => 'Obtaining location…'; + + @override + String get offensive => 'Offensive'; + + @override + String get offline => 'Offline'; + + @override + String get ok => 'ok'; + + @override + String get online => 'Online'; + + @override + String get onlineKeyBackupEnabled => 'Online záloha kľúčov je zapnutá'; + + @override + String get oopsPushError => + 'Oops! Unfortunately, an error occurred when setting up the push notifications.'; + + @override + String get oopsSomethingWentWrong => 'Och! Niečo sa pokazilo…'; + + @override + String get openAppToReadMessages => 'Na prečítanie správy otvorte aplikáciu'; + + @override + String get openCamera => 'Otvoriť fotoaparát'; + + @override + String get openVideoCamera => 'Open camera for a video'; + + @override + String get oneClientLoggedOut => 'One of your clients has been logged out'; + + @override + String get addAccount => 'Add account'; + + @override + String get editBundlesForAccount => 'Edit bundles for this account'; + + @override + String get addToBundle => 'Add to bundle'; + + @override + String get removeFromBundle => 'Remove from this bundle'; + + @override + String get bundleName => 'Bundle name'; + + @override + String get enableMultiAccounts => + '(BETA) Enable multi accounts on this device'; + + @override + String get openInMaps => 'Open in maps'; + + @override + String get link => 'Link'; + + @override + String get serverRequiresEmail => + 'This server needs to validate your email address for registration.'; + + @override + String get or => 'Or'; + + @override + String get participant => 'Participant'; + + @override + String get passphraseOrKey => 'prístupová fráza alebo kľúč na obnovenie'; + + @override + String get password => 'Heslo'; + + @override + String get passwordForgotten => 'Password forgotten'; + + @override + String get passwordHasBeenChanged => 'Password has been changed'; + + @override + String get hideMemberChangesInPublicChats => + 'Hide member changes in public chats'; + + @override + String get hideMemberChangesInPublicChatsBody => + 'Do not show in the chat timeline if someone joins or leaves a public chat to improve readability.'; + + @override + String get overview => 'Overview'; + + @override + String get notifyMeFor => 'Notify me for'; + + @override + String get passwordRecoverySettings => 'Password recovery settings'; + + @override + String get passwordRecovery => 'Password recovery'; + + @override + String get people => 'Ľudia'; + + @override + String get pickImage => 'Vybrať obrázok'; + + @override + String get pin => 'Pin'; + + @override + String play(String fileName) { + return 'Prehrať $fileName'; + } + + @override + String get pleaseChoose => 'Please choose'; + + @override + String get pleaseChooseAPasscode => 'Please choose a pass code'; + + @override + String get pleaseClickOnLink => + 'Please click on the link in the email and then proceed.'; + + @override + String get pleaseEnter4Digits => + 'Please enter 4 digits or leave empty to disable app lock.'; + + @override + String get pleaseEnterRecoveryKey => 'Please enter your recovery key:'; + + @override + String get pleaseEnterYourPassword => 'Prosím zadajte svoje heslo'; + + @override + String get pleaseEnterYourPin => 'Please enter your pin'; + + @override + String get pleaseEnterYourUsername => 'Zadajte svoje používateľské meno'; + + @override + String get pleaseFollowInstructionsOnWeb => + 'Please follow the instructions on the website and tap on next.'; + + @override + String get privacy => 'Privacy'; + + @override + String get publicRooms => 'Verejné miestnosti'; + + @override + String get pushRules => 'Push rules'; + + @override + String get reason => 'Reason'; + + @override + String get recording => 'Nahrávam'; + + @override + String redactedBy(String username) { + return 'Redacted by $username'; + } + + @override + String get directChat => 'Direct chat'; + + @override + String redactedByBecause(String username, String reason) { + return 'Redacted by $username because: \"$reason\"'; + } + + @override + String redactedAnEvent(String username) { + return '$username odstránili udalosť'; + } + + @override + String get redactMessage => 'Redact message'; + + @override + String get register => 'Register'; + + @override + String get reject => 'Odmietnuť'; + + @override + String rejectedTheInvitation(String username) { + return '$username odmietli pozvánku'; + } + + @override + String get rejoin => 'Vrátiť sa'; + + @override + String get removeAllOtherDevices => 'Odstráňiť všetky ostatné zariadenia'; + + @override + String removedBy(String username) { + return 'Odstánené užívateľom $username'; + } + + @override + String get removeDevice => 'Odstráňiť zariadenie'; + + @override + String get unbanFromChat => 'Odblokovať'; + + @override + String get removeYourAvatar => 'Remove your avatar'; + + @override + String get replaceRoomWithNewerVersion => 'Replace room with newer version'; + + @override + String get reply => 'Odpovedať'; + + @override + String get reportMessage => 'Nahlásiť správu'; + + @override + String get translateMessage => 'Translate message'; + + @override + String get translatedMessage => 'Translated message'; + + @override + String get errorTranslatingMessage => + 'An error has occured while translating the message.'; + + @override + String get recoverMessage => 'Recover message'; + + @override + String get recoveredMessage => 'Recovered message'; + + @override + String get errorRecoveringMessage => + 'An error has occured while recovering the message.'; + + @override + String get errorRecoveringMessageNoAdmin => + 'This feature is available on Synapse homeservers only for adminstrators.'; + + @override + String get requestPermission => 'Vyžiadať si povolenie'; + + @override + String get roomHasBeenUpgraded => 'Miestnosť bola upgradeovaná'; + + @override + String get roomVersion => 'Verzia miestnosti'; + + @override + String get saveFile => 'Save file'; + + @override + String get retry => 'Retry'; + + @override + String get search => 'Hľadať'; + + @override + String get security => 'Bezpečnosť'; + + @override + String get recoveryKey => 'Recovery key'; + + @override + String get recoveryKeyLost => 'Recovery key lost?'; + + @override + String seenByUser(String username) { + return 'Videné užívateľom $username'; + } + + @override + String get send => 'Odoslať'; + + @override + String get sendAMessage => 'Odoslať správu'; + + @override + String get sendAsText => 'Poslať ako text'; + + @override + String get sendAudio => 'Poslať zvuk'; + + @override + String get sendFile => 'Odoslať súbor'; + + @override + String get sendImage => 'Odoslať obrázok'; + + @override + String sendImages(int count) { + return 'Send $count image'; + } + + @override + String get sendMessages => 'Poslať správy'; + + @override + String get sendOriginal => 'Poslať originál'; + + @override + String get sendSticker => 'Poslať nálepku'; + + @override + String get sendVideo => 'Poslať video'; + + @override + String sentAFile(String username) { + return '$username poslali súbor'; + } + + @override + String sentAnAudio(String username) { + return '$username poslali zvukovú nahrávku'; + } + + @override + String sentAPicture(String username) { + return '$username poslali obrázok'; + } + + @override + String sentASticker(String username) { + return '$username poslali nálepku'; + } + + @override + String sentAVideo(String username) { + return '$username poslali video'; + } + + @override + String sentCallInformations(String senderName) { + return '$senderName sent call information'; + } + + @override + String get separateChatTypes => 'Separate Direct Chats and Groups'; + + @override + String get setAsCanonicalAlias => 'Set as main alias'; + + @override + String get setCustomEmotes => 'Set custom emotes'; + + @override + String get setChatDescription => 'Set chat description'; + + @override + String get setInvitationLink => 'Nastaviť odkaz pre pozvánku'; + + @override + String get setPermissionsLevel => 'Nastaviť úroveň oprávnení'; + + @override + String get setStatus => 'Nastaviť status'; + + @override + String get settings => 'Nastavenia'; + + @override + String get share => 'Zdieľať'; + + @override + String sharedTheLocation(String username) { + return '$username zdieľa lokáciu'; + } + + @override + String get shareLocation => 'Share location'; + + @override + String get showPassword => 'Show password'; + + @override + String get presenceStyle => 'Presence:'; + + @override + String get hideAvatarsInInvites => 'Hide avatars in invites'; + + @override + String get hideAvatarsInInvitesDescription => + 'Do not show room avatars in invites'; + + @override + String get presencesToggle => 'Show status messages from other users'; + + @override + String get pureBlackToggle => 'Pure Black'; + + @override + String get singlesignon => 'Single Sign on'; + + @override + String get skip => 'Preskočiť'; + + @override + String get sourceCode => 'Zdrojový kód'; + + @override + String get spaceIsPublic => 'Space is public'; + + @override + String get spaceName => 'Space name'; + + @override + String startedACall(String senderName) { + return '$senderName started a call'; + } + + @override + String get startFirstChat => 'Start your first chat'; + + @override + String get status => 'Status'; + + @override + String get statusExampleMessage => 'Ako sa dnes máte?'; + + @override + String get submit => 'Odoslať'; + + @override + String get synchronizingPleaseWait => 'Synchronizing… Please wait.'; + + @override + String synchronizingPleaseWaitCounter(String percentage) { + return ' Synchronizing… ($percentage%)'; + } + + @override + String get systemTheme => 'Systémová farba'; + + @override + String get theyDontMatch => 'Sa nezhodujú'; + + @override + String get theyMatch => 'Zhodujú sa'; + + @override + String get title => 'FluffyChat'; + + @override + String get toggleFavorite => 'Toggle Favorite'; + + @override + String get toggleMuted => 'Toggle Muted'; + + @override + String get toggleUnread => 'Mark Read/Unread'; + + @override + String get tooManyRequestsWarning => + 'Too many requests. Please try again later!'; + + @override + String get transferFromAnotherDevice => 'Transfer from another device'; + + @override + String get tryToSendAgain => 'Skúsiť znova odoslať'; + + @override + String get unavailable => 'Unavailable'; + + @override + String unbannedUser(String username, String targetName) { + return '$username odbanovali $targetName'; + } + + @override + String get unblockDevice => 'Odblokovať zariadenie'; + + @override + String get unknownDevice => 'Neznáme zariadenie'; + + @override + String get unknownEncryptionAlgorithm => 'Neznámy šifrovací algoritmus'; + + @override + String unknownEvent(String type) { + return 'Neznáma udalosť „$type“'; + } + + @override + String get unmuteChat => 'Zrušiť stlmenie chatu'; + + @override + String get unpin => 'Unpin'; + + @override + String unreadChats(int unreadCount) { + String _temp0 = intl.Intl.pluralLogic( + unreadCount, + locale: localeName, + other: '$unreadCount neprečítaných chatov', + ); + return '$_temp0'; + } + + @override + String userAndOthersAreTyping(String username, int count) { + return '$username a $count dalších píšu…'; + } + + @override + String userAndUserAreTyping(String username, String username2) { + return '$username a $username2 píšu…'; + } + + @override + String userIsTyping(String username) { + return '$username píše…'; + } + + @override + String userLeftTheChat(String username) { + return '$username opustili chat'; + } + + @override + String get username => 'Užívateľské meno'; + + @override + String userSentUnknownEvent(String username, String type) { + return '$username poslali udalosť $type'; + } + + @override + String get unverified => 'Unverified'; + + @override + String get verified => 'Verified'; + + @override + String get verify => 'Overiť'; + + @override + String get verifyStart => 'Spustiť verifikáciu'; + + @override + String get verifySuccess => 'Verifikácia bola úspešná!'; + + @override + String get verifyTitle => 'Verifikujem protiľahlý účet'; + + @override + String get videoCall => 'Videohovor'; + + @override + String get visibilityOfTheChatHistory => 'Viditeľnosť histórie chatu'; + + @override + String get visibleForAllParticipants => 'Viditeľné pre všetkých účastníkov'; + + @override + String get visibleForEveryone => 'Viditeľné pre každého'; + + @override + String get voiceMessage => 'Hlasová správa'; + + @override + String get waitingPartnerAcceptRequest => + 'Čaká sa, kým partner prijme požiadavku…'; + + @override + String get waitingPartnerEmoji => 'Čaká sa, kým partner prijme emotikon…'; + + @override + String get waitingPartnerNumbers => + 'Čaká sa na to, kým partner prijme čísla…'; + + @override + String get wallpaper => 'Pozadie'; + + @override + String get warning => 'Warning!'; + + @override + String get weSentYouAnEmail => 'We sent you an email'; + + @override + String get whoCanPerformWhichAction => 'Who can perform which action'; + + @override + String get whoIsAllowedToJoinThisGroup => 'Kto môže vstúpiť do tejto skupiny'; + + @override + String get whyDoYouWantToReportThis => 'Why do you want to report this?'; + + @override + String get wipeChatBackup => + 'Wipe your chat backup to create a new recovery key?'; + + @override + String get withTheseAddressesRecoveryDescription => + 'With these addresses you can recover your password.'; + + @override + String get writeAMessage => 'Napísať správu…'; + + @override + String get yes => 'Áno'; + + @override + String get you => 'Vy'; + + @override + String get youAreNoLongerParticipatingInThisChat => + 'Už sa nezúčastňujete tohto chatu'; + + @override + String get youHaveBeenBannedFromThisChat => + 'Máte zablokovaný prístup k tomuto chatu'; + + @override + String get yourPublicKey => 'Your public key'; + + @override + String get messageInfo => 'Message info'; + + @override + String get time => 'Time'; + + @override + String get messageType => 'Message Type'; + + @override + String get sender => 'Sender'; + + @override + String get openGallery => 'Open gallery'; + + @override + String get removeFromSpace => 'Remove from space'; + + @override + String get addToSpaceDescription => 'Select a space to add this chat to it.'; + + @override + String get start => 'Start'; + + @override + String get pleaseEnterRecoveryKeyDescription => + 'To unlock your old messages, please enter your recovery key that has been generated in a previous session. Your recovery key is NOT your password.'; + + @override + String get publish => 'Publish'; + + @override + String videoWithSize(String size) { + return 'Video ($size)'; + } + + @override + String get openChat => 'Open Chat'; + + @override + String get markAsRead => 'Mark as read'; + + @override + String get reportUser => 'Report user'; + + @override + String get dismiss => 'Dismiss'; + + @override + String reactedWith(String sender, String reaction) { + return '$sender reacted with $reaction'; + } + + @override + String get pinMessage => 'Pin to room'; + + @override + String get confirmEventUnpin => + 'Are you sure to permanently unpin the event?'; + + @override + String get emojis => 'Emojis'; + + @override + String get placeCall => 'Place call'; + + @override + String get voiceCall => 'Voice call'; + + @override + String get unsupportedAndroidVersion => 'Unsupported Android version'; + + @override + String get unsupportedAndroidVersionLong => + 'This feature requires a newer Android version. Please check for updates or Lineage OS support.'; + + @override + String get videoCallsBetaWarning => + 'Please note that video calls are currently in beta. They might not work as expected or work at all on all platforms.'; + + @override + String get experimentalVideoCalls => 'Experimental video calls'; + + @override + String get emailOrUsername => 'Email or username'; + + @override + String get indexedDbErrorTitle => 'Private mode issues'; + + @override + String get indexedDbErrorLong => + 'The message storage is unfortunately not enabled in private mode by default.\nPlease visit\n - about:config\n - set dom.indexedDB.privateBrowsing.enabled to true\nOtherwise, it is not possible to run Extera.'; + + @override + String switchToAccount(String number) { + return 'Switch to account $number'; + } + + @override + String get nextAccount => 'Next account'; + + @override + String get previousAccount => 'Previous account'; + + @override + String get addWidget => 'Add widget'; + + @override + String get widgetVideo => 'Video'; + + @override + String get widgetEtherpad => 'Text note'; + + @override + String get widgetJitsi => 'Jitsi Meet'; + + @override + String get widgetCustom => 'Custom'; + + @override + String get widgetName => 'Name'; + + @override + String get widgetUrlError => 'This is not a valid URL.'; + + @override + String get widgetNameError => 'Please provide a display name.'; + + @override + String get errorAddingWidget => 'Error adding the widget.'; + + @override + String get youRejectedTheInvitation => 'You rejected the invitation'; + + @override + String get youJoinedTheChat => 'You joined the chat'; + + @override + String get youAcceptedTheInvitation => '👍 You accepted the invitation'; + + @override + String youBannedUser(String user) { + return 'You banned $user'; + } + + @override + String youHaveWithdrawnTheInvitationFor(String user) { + return 'You have withdrawn the invitation for $user'; + } + + @override + String youInvitedToBy(String alias) { + return '📩 You have been invited via link to:\n$alias'; + } + + @override + String youInvitedBy(String user) { + return '📩 You have been invited by $user'; + } + + @override + String invitedBy(String user) { + return '📩 Invited by $user'; + } + + @override + String youInvitedUser(String user) { + return '📩 You invited $user'; + } + + @override + String youKicked(String user) { + return '👞 You kicked $user'; + } + + @override + String youKickedAndBanned(String user) { + return '🙅 You kicked and banned $user'; + } + + @override + String youUnbannedUser(String user) { + return 'You unbanned $user'; + } + + @override + String hasKnocked(String user) { + return '🚪 $user has knocked'; + } + + @override + String get usersMustKnock => 'Users must knock'; + + @override + String get noOneCanJoin => 'No one can join'; + + @override + String userWouldLikeToChangeTheChat(String user) { + return '$user would like to join the chat.'; + } + + @override + String get noPublicLinkHasBeenCreatedYet => + 'No public link has been created yet'; + + @override + String get knock => 'Knock'; + + @override + String get users => 'Users'; + + @override + String get unlockOldMessages => 'Unlock old messages'; + + @override + String get storeInSecureStorageDescription => + 'Store the recovery key in the secure storage of this device.'; + + @override + String get saveKeyManuallyDescription => + 'Save this key manually by triggering the system share dialog or clipboard.'; + + @override + String get storeInAndroidKeystore => 'Store in Android KeyStore'; + + @override + String get storeInAppleKeyChain => 'Store in Apple KeyChain'; + + @override + String get storeSecurlyOnThisDevice => 'Store securely on this device'; + + @override + String countFiles(int count) { + return '$count files'; + } + + @override + String get user => 'User'; + + @override + String get custom => 'Custom'; + + @override + String get foregroundServiceRunning => + 'This notification appears when the foreground service is running.'; + + @override + String get screenSharingTitle => 'screen sharing'; + + @override + String get screenSharingDetail => 'You are sharing your screen in Extera'; + + @override + String get callingPermissions => 'Calling permissions'; + + @override + String get callingAccount => 'Calling account'; + + @override + String get callingAccountDetails => + 'Allows Extera to use the native android dialer app.'; + + @override + String get appearOnTop => 'Appear on top'; + + @override + String get appearOnTopDetails => + 'Allows the app to appear on top (not needed if you already have Fluffychat setup as a calling account)'; + + @override + String get otherCallingPermissions => + 'Microphone, camera and other Extera permissions'; + + @override + String get whyIsThisMessageEncrypted => 'Why is this message unreadable?'; + + @override + String get noKeyForThisMessage => + 'This can happen if the message was sent before you have signed in to your account at this device.\n\nIt is also possible that the sender has blocked your device or something went wrong with the internet connection.\n\nAre you able to read the message on another session? Then you can transfer the message from it! Go to Settings > Devices and make sure that your devices have verified each other. When you open the room the next time and both sessions are in the foreground, the keys will be transmitted automatically.\n\nDo you not want to lose the keys when logging out or switching devices? Make sure that you have enabled the chat backup in the settings.'; + + @override + String get newGroup => 'New group'; + + @override + String get newSpace => 'New space'; + + @override + String get enterSpace => 'Enter space'; + + @override + String get enterRoom => 'Enter room'; + + @override + String get allSpaces => 'All spaces'; + + @override + String numChats(String number) { + return '$number chats'; + } + + @override + String get hideUnimportantStateEvents => 'Hide unimportant state events'; + + @override + String get hidePresences => 'Hide Status List?'; + + @override + String get doNotShowAgain => 'Do not show again'; + + @override + String wasDirectChatDisplayName(String oldDisplayName) { + return 'Empty chat (was $oldDisplayName)'; + } + + @override + String get newSpaceDescription => + 'Spaces allows you to consolidate your chats and build private or public communities.'; + + @override + String get encryptThisChat => 'Encrypt this chat'; + + @override + String get disableEncryptionWarning => + 'For security reasons you can not disable encryption in a chat, where it has been enabled before.'; + + @override + String get sorryThatsNotPossible => 'Sorry... that is not possible'; + + @override + String get deviceKeys => 'Device keys:'; + + @override + String get reopenChat => 'Reopen chat'; + + @override + String get noBackupWarning => + 'Warning! Without enabling chat backup, you will lose access to your encrypted messages. It is highly recommended to enable the chat backup first before logging out.'; + + @override + String get noOtherDevicesFound => 'No other devices found'; + + @override + String fileIsTooBigForServer(String max) { + return 'Unable to send! The server only supports attachments up to $max.'; + } + + @override + String fileHasBeenSavedAt(String path) { + return 'File has been saved at $path'; + } + + @override + String get jumpToLastReadMessage => 'Jump to last read message'; + + @override + String get readUpToHere => 'Read up to here'; + + @override + String get jump => 'Jump'; + + @override + String get openLinkInBrowser => 'Open link in browser'; + + @override + String get reportErrorDescription => + '😭 Oh no. Something went wrong. If you want, you can report this bug to the developers.'; + + @override + String get report => 'Report'; + + @override + String get signInWithPassword => 'Sign in with password'; + + @override + String get pleaseTryAgainLaterOrChooseDifferentServer => + 'Please try again later or choose a different server.'; + + @override + String signInWith(String provider) { + return 'Sign in with $provider'; + } + + @override + String get profileNotFound => + 'The user could not be found on the server. Maybe there is a connection problem or the user doesn\'t exist.'; + + @override + String get setTheme => 'Set theme:'; + + @override + String get setColorTheme => 'Set color theme:'; + + @override + String get invite => 'Invite'; + + @override + String get inviteGroupChat => '📨 Invite group chat'; + + @override + String get invitePrivateChat => '📨 Invite private chat'; + + @override + String get invalidInput => 'Invalid input!'; + + @override + String wrongPinEntered(int seconds) { + return 'Wrong pin entered! Try again in $seconds seconds...'; + } + + @override + String get pleaseEnterANumber => 'Please enter a number greater than 0'; + + @override + String get archiveRoomDescription => + 'The chat will be moved to the archive. Other users will be able to see that you have left the chat.'; + + @override + String get roomUpgradeDescription => + 'The chat will then be recreated with the new room version. All participants will be notified that they need to switch to the new chat. You can find out more about room versions at https://spec.matrix.org/latest/rooms/'; + + @override + String get removeDevicesDescription => + 'You will be logged out of this device and will no longer be able to receive messages.'; + + @override + String get banUserDescription => + 'The user will be banned from the chat and will not be able to enter the chat again until they are unbanned.'; + + @override + String get unbanUserDescription => + 'The user will be able to enter the chat again if they try.'; + + @override + String get kickUserDescription => + 'The user is kicked out of the chat but not banned. In public chats, the user can rejoin at any time.'; + + @override + String get makeAdminDescription => + 'Once you make this user admin, you may not be able to undo this as they will then have the same permissions as you.'; + + @override + String get pushNotificationsNotAvailable => + 'Push notifications not available'; + + @override + String get learnMore => 'Learn more'; + + @override + String get yourGlobalUserIdIs => 'Your global user-ID is: '; + + @override + String noUsersFoundWithQuery(String query) { + return 'Unfortunately no user could be found with \"$query\". Please check whether you made a typo.'; + } + + @override + String get knocking => 'Knocking'; + + @override + String chatCanBeDiscoveredViaSearchOnServer(String server) { + return 'Chat can be discovered via the search on $server'; + } + + @override + String get searchChatsRooms => 'Search for #chats, @users...'; + + @override + String get nothingFound => 'Nothing found...'; + + @override + String get groupName => 'Group name'; + + @override + String get createGroupAndInviteUsers => 'Create a group and invite users'; + + @override + String get groupCanBeFoundViaSearch => 'Group can be found via search'; + + @override + String get wrongRecoveryKey => + 'Sorry... this does not seem to be the correct recovery key.'; + + @override + String get startConversation => 'Start conversation'; + + @override + String get commandHint_sendraw => 'Send raw json'; + + @override + String get databaseMigrationTitle => 'Database is optimized'; + + @override + String get databaseMigrationBody => 'Please wait. This may take a moment.'; + + @override + String get leaveEmptyToClearStatus => 'Leave empty to clear your status.'; + + @override + String get select => 'Select'; + + @override + String get searchForUsers => 'Search for @users...'; + + @override + String get pleaseEnterYourCurrentPassword => + 'Please enter your current password'; + + @override + String get newPassword => 'New password'; + + @override + String get pleaseChooseAStrongPassword => 'Please choose a strong password'; + + @override + String get passwordsDoNotMatch => 'Passwords do not match'; + + @override + String get passwordIsWrong => 'Your entered password is wrong'; + + @override + String get publicLink => 'Public link'; + + @override + String get publicChatAddresses => 'Public chat addresses'; + + @override + String get createNewAddress => 'Create new address'; + + @override + String get joinSpace => 'Join space'; + + @override + String get publicSpaces => 'Public spaces'; + + @override + String get addChatOrSubSpace => 'Add chat or sub space'; + + @override + String get subspace => 'Subspace'; + + @override + String get decline => 'Decline'; + + @override + String get thisDevice => 'This device:'; + + @override + String get initAppError => 'An error occured while init the app'; + + @override + String get userRole => 'User role'; + + @override + String minimumPowerLevel(String level) { + return '$level is the minimum power level.'; + } + + @override + String searchIn(String chat) { + return 'Search in chat \"$chat\"...'; + } + + @override + String get searchMore => 'Search more...'; + + @override + String get gallery => 'Gallery'; + + @override + String get files => 'Files'; + + @override + String databaseBuildErrorBody(String url, String error) { + return 'Unable to build the SQlite database. The app tries to use the legacy database for now. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String sessionLostBody(String url, String error) { + return 'Your session is lost. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String restoreSessionBody(String url, String error) { + return 'The app now tries to restore your session from the backup. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String forwardMessageTo(String roomName) { + return 'Forward message to $roomName?'; + } + + @override + String get sendReadReceipts => 'Send read receipts'; + + @override + String get sendTypingNotificationsDescription => + 'Other participants in a chat can see when you are typing a new message.'; + + @override + String get sendReadReceiptsDescription => + 'Other participants in a chat can see when you have read a message.'; + + @override + String get formattedMessages => 'Formatted messages'; + + @override + String get formattedMessagesDescription => + 'Display rich message content like bold text using markdown.'; + + @override + String get verifyOtherUser => '🔐 Verify other user'; + + @override + String get verifyOtherUserDescription => + 'If you verify another user, you can be sure that you know who you are really writing to. 💪\n\nWhen you start a verification, you and the other user will see a popup in the app. There you will then see a series of emojis or numbers that you have to compare with each other.\n\nThe best way to do this is to meet up or start a video call. 👭'; + + @override + String get verifyOtherDevice => '🔐 Verify other device'; + + @override + String get verifyOtherDeviceDescription => + 'When you verify another device, those devices can exchange keys, increasing your overall security. 💪 When you start a verification, a popup will appear in the app on both devices. There you will then see a series of emojis or numbers that you have to compare with each other. It\'s best to have both devices handy before you start the verification. 🤳'; + + @override + String acceptedKeyVerification(String sender) { + return '$sender accepted key verification'; + } + + @override + String canceledKeyVerification(String sender) { + return '$sender canceled key verification'; + } + + @override + String completedKeyVerification(String sender) { + return '$sender completed key verification'; + } + + @override + String isReadyForKeyVerification(String sender) { + return '$sender is ready for key verification'; + } + + @override + String requestedKeyVerification(String sender) { + return '$sender requested key verification'; + } + + @override + String startedKeyVerification(String sender) { + return '$sender started key verification'; + } + + @override + String get transparent => 'Transparent'; + + @override + String get incomingMessages => 'Incoming messages'; + + @override + String get stickers => 'Stickers'; + + @override + String get discover => 'Discover'; + + @override + String get commandHint_ignore => 'Ignore the given matrix ID'; + + @override + String get commandHint_unignore => 'Unignore the given matrix ID'; + + @override + String unreadChatsInApp(String appname, String unread) { + return '$appname: $unread unread chats'; + } + + @override + String get noDatabaseEncryption => + 'Database encryption is not supported on this platform'; + + @override + String thereAreCountUsersBlocked(Object count) { + return 'Right now there are $count users blocked.'; + } + + @override + String get restricted => 'Restricted'; + + @override + String get knockRestricted => 'Knock restricted'; + + @override + String goToSpace(Object space) { + return 'Go to space: $space'; + } + + @override + String get markAsUnread => 'Mark as unread'; + + @override + String userLevel(int level) { + return '$level - User'; + } + + @override + String moderatorLevel(int level) { + return '$level - Moderator'; + } + + @override + String adminLevel(int level) { + return '$level - Admin'; + } + + @override + String get changeGeneralChatSettings => 'Change general chat settings'; + + @override + String get inviteOtherUsers => 'Invite other users to this chat'; + + @override + String get changeTheChatPermissions => 'Change the chat permissions'; + + @override + String get changeTheVisibilityOfChatHistory => + 'Change the visibility of the chat history'; + + @override + String get changeTheCanonicalRoomAlias => + 'Change the main public chat address'; + + @override + String get sendRoomNotifications => 'Send a @room notifications'; + + @override + String get changeTheDescriptionOfTheGroup => + 'Change the description of the chat'; + + @override + String get chatPermissionsDescription => + 'Define which power level is necessary for certain actions in this chat. The power levels 0, 50 and 100 are usually representing users, moderators and admins, but any gradation is possible.'; + + @override + String updateInstalled(String version) { + return '🎉 Update $version installed!'; + } + + @override + String get changelog => 'Changelog'; + + @override + String get sendCanceled => 'Sending canceled'; + + @override + String get loginWithMatrixId => 'Login with Matrix-ID'; + + @override + String get discoverHomeservers => 'Discover homeservers'; + + @override + String get whatIsAHomeserver => 'What is a homeserver?'; + + @override + String get homeserverDescription => + 'All your data is stored on the homeserver, just like an email provider. You can choose which homeserver you want to use, while you can still communicate with everyone. Learn more at at https://matrix.org.'; + + @override + String get doesNotSeemToBeAValidHomeserver => + 'Doesn\'t seem to be a compatible homeserver. Wrong URL?'; + + @override + String get calculatingFileSize => 'Calculating file size...'; + + @override + String get prepareSendingAttachment => 'Prepare sending attachment...'; + + @override + String get sendingAttachment => 'Sending attachment...'; + + @override + String get generatingVideoThumbnail => 'Generating video thumbnail...'; + + @override + String get compressVideo => 'Compressing video...'; + + @override + String sendingAttachmentCountOfCount(int index, int length) { + return 'Sending attachment $index of $length...'; + } + + @override + String serverLimitReached(int seconds) { + return 'Server limit reached! Waiting $seconds seconds...'; + } + + @override + String get oneOfYourDevicesIsNotVerified => + 'One of your devices is not verified'; + + @override + String get noticeChatBackupDeviceVerification => + 'Note: When you connect all your devices to the chat backup, they are automatically verified.'; + + @override + String get continueText => 'Continue'; + + @override + String get welcomeText => + 'Hey Hey 👋 This is Extera. You can sign in to any homeserver, which is compatible with https://matrix.org. And then chat with anyone. It\'s a huge decentralized messaging network!'; + + @override + String get blur => 'Blur:'; + + @override + String get opacity => 'Opacity:'; + + @override + String get setWallpaper => 'Set wallpaper'; + + @override + String get manageAccount => 'Manage account'; + + @override + String get noContactInformationProvided => + 'Server does not provide any valid contact information'; + + @override + String get contactServerAdmin => 'Contact server admin'; + + @override + String get contactServerSecurity => 'Contact server security'; + + @override + String get supportPage => 'Support page'; + + @override + String get serverInformation => 'Server information:'; + + @override + String get name => 'Name'; + + @override + String get version => 'Version'; + + @override + String get website => 'Website'; + + @override + String get compress => 'Compress'; + + @override + String get boldText => 'Bold text'; + + @override + String get italicText => 'Italic text'; + + @override + String get strikeThrough => 'Strikethrough'; + + @override + String get pleaseFillOut => 'Please fill out'; + + @override + String get invalidUrl => 'Invalid url'; + + @override + String get addLink => 'Add link'; + + @override + String get unableToJoinChat => + 'Unable to join chat. Maybe the other party has already closed the conversation.'; + + @override + String get previous => 'Previous'; + + @override + String get otherPartyNotLoggedIn => + 'The other party is currently not logged in and therefore cannot receive messages!'; + + @override + String appWantsToUseForLogin(String server) { + return 'Use \'$server\' to log in'; + } + + @override + String get appWantsToUseForLoginDescription => + 'You hereby allow the app and website to share information about you.'; + + @override + String get open => 'Open'; + + @override + String get waitingForServer => 'Waiting for server...'; + + @override + String get appIntroduction => + 'Extera lets you chat with your friends across different messengers. Learn more at https://matrix.org or just tap *Continue*.'; + + @override + String get newChatRequest => '📩 New chat request'; + + @override + String get contentNotificationSettings => 'Content notification settings'; + + @override + String get generalNotificationSettings => 'General notification settings'; + + @override + String get roomNotificationSettings => 'Room notification settings'; + + @override + String get userSpecificNotificationSettings => + 'User specific notification settings'; + + @override + String get otherNotificationSettings => 'Other notification settings'; + + @override + String get notificationRuleContainsUserName => 'Contains User Name'; + + @override + String get notificationRuleContainsUserNameDescription => + 'Notifies the user when a message contains their username.'; + + @override + String get notificationRuleMaster => 'Mute all notifications'; + + @override + String get notificationRuleMasterDescription => + 'Overrides all other rules and disables all notifications.'; + + @override + String get notificationRuleSuppressNotices => 'Suppress Automated Messages'; + + @override + String get notificationRuleSuppressNoticesDescription => + 'Suppresses notifications from automated clients like bots.'; + + @override + String get notificationRuleInviteForMe => 'Invite for Me'; + + @override + String get notificationRuleInviteForMeDescription => + 'Notifies the user when they are invited to a room.'; + + @override + String get notificationRuleMemberEvent => 'Member Event'; + + @override + String get notificationRuleMemberEventDescription => + 'Suppresses notifications for membership events.'; + + @override + String get notificationRuleIsUserMention => 'User Mention'; + + @override + String get notificationRuleIsUserMentionDescription => + 'Notifies the user when they are directly mentioned in a message.'; + + @override + String get notificationRuleContainsDisplayName => 'Contains Display Name'; + + @override + String get notificationRuleContainsDisplayNameDescription => + 'Notifies the user when a message contains their display name.'; + + @override + String get notificationRuleIsRoomMention => 'Room Mention'; + + @override + String get notificationRuleIsRoomMentionDescription => + 'Notifies the user when there is a room mention.'; + + @override + String get notificationRuleRoomnotif => 'Room Notification'; + + @override + String get notificationRuleRoomnotifDescription => + 'Notifies the user when a message contains \'@room\'.'; + + @override + String get notificationRuleTombstone => 'Tombstone'; + + @override + String get notificationRuleTombstoneDescription => + 'Notifies the user about room deactivation messages.'; + + @override + String get notificationRuleReaction => 'Reaction'; + + @override + String get notificationRuleReactionDescription => + 'Suppresses notifications for reactions.'; + + @override + String get notificationRuleRoomServerAcl => 'Room Server ACL'; + + @override + String get notificationRuleRoomServerAclDescription => + 'Suppresses notifications for room server access control lists (ACL).'; + + @override + String get notificationRuleSuppressEdits => 'Suppress Edits'; + + @override + String get notificationRuleSuppressEditsDescription => + 'Suppresses notifications for edited messages.'; + + @override + String get notificationRuleCall => 'Call'; + + @override + String get notificationRuleCallDescription => + 'Notifies the user about calls.'; + + @override + String get notificationRuleEncryptedRoomOneToOne => + 'Encrypted Room One-to-One'; + + @override + String get notificationRuleEncryptedRoomOneToOneDescription => + 'Notifies the user about messages in encrypted one-to-one rooms.'; + + @override + String get notificationRuleRoomOneToOne => 'Room One-to-One'; + + @override + String get notificationRuleRoomOneToOneDescription => + 'Notifies the user about messages in one-to-one rooms.'; + + @override + String get notificationRuleMessage => 'Message'; + + @override + String get notificationRuleMessageDescription => + 'Notifies the user about general messages.'; + + @override + String get notificationRuleEncrypted => 'Encrypted'; + + @override + String get notificationRuleEncryptedDescription => + 'Notifies the user about messages in encrypted rooms.'; + + @override + String get notificationRuleJitsi => 'Jitsi'; + + @override + String get notificationRuleJitsiDescription => + 'Notifies the user about Jitsi widget events.'; + + @override + String get notificationRuleServerAcl => 'Suppress Server ACL Events'; + + @override + String get notificationRuleServerAclDescription => + 'Suppresses notifications for Server ACL events.'; + + @override + String unknownPushRule(String rule) { + return 'Unknown push rule \'$rule\''; + } + + @override + String get deletePushRuleCanNotBeUndone => + 'If you delete this notification setting, this can not be undone.'; + + @override + String get more => 'More'; + + @override + String get shareKeysWith => 'Share keys with...'; + + @override + String get shareKeysWithDescription => + 'Which devices should be trusted so that they can read along your messages in encrypted chats?'; + + @override + String get allDevices => 'All devices'; + + @override + String get crossVerifiedDevicesIfEnabled => + 'Cross verified devices if enabled'; + + @override + String get crossVerifiedDevices => 'Cross verified devices'; + + @override + String get verifiedDevicesOnly => 'Verified devices only'; + + @override + String get takeAPhoto => 'Take a photo'; + + @override + String get recordAVideo => 'Record a video'; + + @override + String get optionalMessage => '(Optional) message...'; + + @override + String get notSupportedOnThisDevice => 'Not supported on this device'; + + @override + String get enterNewChat => 'Enter new chat'; + + @override + String get approve => 'Approve'; + + @override + String get youHaveKnocked => 'You have knocked'; + + @override + String get pleaseWaitUntilInvited => + 'Please wait now, until someone from the room invites you.'; +} diff --git a/lib/generated/l10n/l10n_sl.dart b/lib/generated/l10n/l10n_sl.dart new file mode 100644 index 0000000..5ebf151 --- /dev/null +++ b/lib/generated/l10n/l10n_sl.dart @@ -0,0 +1,2749 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'l10n.dart'; + +// ignore_for_file: type=lint + +/// The translations for Slovenian (`sl`). +class L10nSl extends L10n { + L10nSl([String locale = 'sl']) : super(locale); + + @override + String get noSendPermission => 'You can\'t send messages here'; + + @override + String get alwaysUse24HourFormat => 'false'; + + @override + String get repeatPassword => 'Ponovite geslo'; + + @override + String get notAnImage => 'Not an image file.'; + + @override + String get setCustomPermissionLevel => 'Set custom permission level'; + + @override + String get setPermissionsLevelDescription => + 'Please choose a predefined role below or enter a custom permission level between 0 and 100.'; + + @override + String get ignoreUser => 'Ignore user'; + + @override + String get normalUser => 'Normal user'; + + @override + String get remove => 'Remove'; + + @override + String get importNow => 'Import now'; + + @override + String get importEmojis => 'Import Emojis'; + + @override + String get importFromZipFile => 'Import from .zip file'; + + @override + String get exportEmotePack => 'Export Emote pack as .zip'; + + @override + String get replace => 'Replace'; + + @override + String get about => 'O aplikaciji'; + + @override + String aboutHomeserver(String homeserver) { + return 'About $homeserver'; + } + + @override + String get accept => 'Sprejmi'; + + @override + String acceptedTheInvitation(String username) { + return '$username je sprejel povabilo'; + } + + @override + String get account => 'Račun'; + + @override + String activatedEndToEndEncryption(String username) { + return 'Uporabnik $username je aktiviral šifriranje od konca do konca'; + } + + @override + String get addEmail => 'Dodajte e-pošto'; + + @override + String get confirmMatrixId => + 'Please confirm your Matrix ID in order to delete your account.'; + + @override + String supposedMxid(String mxid) { + return 'This should be $mxid'; + } + + @override + String get addChatDescription => 'Add a chat description...'; + + @override + String get addToSpace => 'Dodajte v prostor'; + + @override + String get admin => 'Admin'; + + @override + String get alias => 'vzdevek'; + + @override + String get all => 'Vse'; + + @override + String get allChats => 'Vsi klepeti'; + + @override + String get commandHint_roomupgrade => + 'Upgrade this room to the given room version'; + + @override + String get commandHint_googly => 'Send some googly eyes'; + + @override + String get commandHint_cuddle => 'Send a cuddle'; + + @override + String get commandHint_hug => 'Send a hug'; + + @override + String googlyEyesContent(String senderName) { + return '$senderName sends you googly eyes'; + } + + @override + String cuddleContent(String senderName) { + return '$senderName cuddles you'; + } + + @override + String hugContent(String senderName) { + return '$senderName hugs you'; + } + + @override + String answeredTheCall(String senderName) { + return 'Oseba $senderName je odgovorila na klic'; + } + + @override + String get anyoneCanJoin => 'Pridruži se lahko vsak'; + + @override + String get appLock => 'Zaklepanje aplikacije'; + + @override + String get appLockDescription => + 'Lock the app when not using with a pin code'; + + @override + String get archive => 'Arhiv'; + + @override + String get areGuestsAllowedToJoin => + 'Ali se lahko gostujoči uporabniki pridružijo'; + + @override + String get areYouSure => 'Ali si prepričan?'; + + @override + String get areYouSureYouWantToLogout => + 'Ali ste prepričani, da se želite odjaviti?'; + + @override + String get askSSSSSign => + 'Če želite podpisati drugo osebo, vnesite geslo za varno trgovino ali obnovitveni ključ.'; + + @override + String askVerificationRequest(String username) { + return 'Ali želite sprejeti to zahtevo za preverjanje od $username?'; + } + + @override + String get autoplayImages => + 'Samodejno predvajajte animirane nalepke in čustva'; + + @override + String badServerLoginTypesException(String serverVersions, + String supportedVersions, Object suportedVersions) { + return 'Domači strežnik podpira vrste prijave:\n$serverVersions\nToda ta aplikacija podpira samo:\n$supportedVersions'; + } + + @override + String get sendTypingNotifications => 'Send typing notifications'; + + @override + String get swipeRightToLeftToReply => 'Swipe right to left to reply'; + + @override + String get sendOnEnter => 'Pošlji ob vstopu'; + + @override + String badServerVersionsException(String serverVersions, + String supportedVersions, Object serverVerions, Object suportedVersions) { + return 'Domači strežnik podpira različice Spec:\n$serverVersions\nToda ta aplikacija podpira samo $supportedVersions'; + } + + @override + String countChatsAndCountParticipants(int chats, int participants) { + return '$chats chats and $participants participants'; + } + + @override + String get noMoreChatsFound => 'No more chats found...'; + + @override + String get noChatsFoundHere => + 'No chats found here yet. Start a new chat with someone by using the button below. ⤵️'; + + @override + String get joinedChats => 'Joined chats'; + + @override + String get unread => 'Unread'; + + @override + String get space => 'Space'; + + @override + String get spaces => 'Spaces'; + + @override + String get banFromChat => 'Prepoved klepeta'; + + @override + String get banned => 'Prepovedano'; + + @override + String bannedUser(String username, String targetName) { + return '$username je prepovedan v $targetName'; + } + + @override + String get blockDevice => 'Blokirana naprava'; + + @override + String get blocked => 'Blokirano'; + + @override + String get botMessages => 'Botova sporočila'; + + @override + String get cancel => 'Prekliči'; + + @override + String cantOpenUri(String uri) { + return 'URI-ja $uri ni mogoče odpreti'; + } + + @override + String get changeDeviceName => 'Spremenite ime naprave'; + + @override + String changedTheChatAvatar(String username) { + return '$username je spremenil avatar za klepet'; + } + + @override + String changedTheChatDescriptionTo(String username, String description) { + return '$username je spremenil opis klepeta v: \'$description\''; + } + + @override + String changedTheChatNameTo(String username, String chatname) { + return '$username je spremenil ime klepeta v: \'$chatname\''; + } + + @override + String changedTheChatPermissions(String username) { + return '$username je spremenila dovoljenja za klepet'; + } + + @override + String changedTheDisplaynameTo(String username, String displayname) { + return '$username je spremenil svoje prikazno ime v: \'$displayname\''; + } + + @override + String changedTheGuestAccessRules(String username) { + return '$username je spremenila pravila dostopa za goste'; + } + + @override + String changedTheGuestAccessRulesTo(String username, String rules) { + return '$username je spremenila pravila dostopa za goste v: $rules'; + } + + @override + String changedTheHistoryVisibility(String username) { + return '$username je spremenila vidnost zgodovine'; + } + + @override + String changedTheHistoryVisibilityTo(String username, String rules) { + return '$username je spremenil vidnost zgodovine v: $rules'; + } + + @override + String changedTheJoinRules(String username) { + return '$username je spremenil pravila za pridružitev'; + } + + @override + String changedTheJoinRulesTo(String username, String joinRules) { + return '$username je spremenila pravila pridružitve v: $joinRules'; + } + + @override + String changedTheProfileAvatar(String username) { + return '$username je spremenil avatar'; + } + + @override + String changedTheRoomAliases(String username) { + return '$username je spremenil vzdevke sobe'; + } + + @override + String changedTheRoomInvitationLink(String username) { + return '$username je spremenil povezavo za povabilo'; + } + + @override + String get changePassword => 'Spremeni geslo'; + + @override + String get changeTheHomeserver => 'Spremenite domači strežnik'; + + @override + String get changeTheme => 'Spremenite svoj slog'; + + @override + String get changeTheNameOfTheGroup => 'Spremenite ime skupine'; + + @override + String get changeYourAvatar => 'Spremenite svoj avatar'; + + @override + String get channelCorruptedDecryptError => 'Šifriranje je poškodovano'; + + @override + String get chat => 'Klepet'; + + @override + String get yourChatBackupHasBeenSetUp => + 'Varnostna kopija klepeta je nastavljena.'; + + @override + String get chatBackup => 'Varnostno kopiranje klepeta'; + + @override + String get chatBackupDescription => + 'Varnostna kopija klepeta je zavarovana z varnostnim ključem. Prosimo, pazite, da ga ne izgubite.'; + + @override + String get chatDetails => 'Podrobnosti klepeta'; + + @override + String get chatHasBeenAddedToThisSpace => 'Klepet je bil dodan v ta prostor'; + + @override + String get chats => 'Klepeti'; + + @override + String get chooseAStrongPassword => 'Izberite močno geslo'; + + @override + String get clearArchive => 'Počisti arhiv'; + + @override + String get close => 'Zapri'; + + @override + String get commandHint_markasdm => + 'Mark as direct message room for the giving Matrix ID'; + + @override + String get commandHint_markasgroup => 'Mark as group'; + + @override + String get commandHint_ban => 'Izključi določenega uporabnika iz te sobe'; + + @override + String get commandHint_clearcache => 'Clear cache'; + + @override + String get commandHint_create => + 'Create an empty group chat\nUse --no-encryption to disable encryption'; + + @override + String get commandHint_discardsession => 'Discard session'; + + @override + String get commandHint_dm => + 'Start a direct chat\nUse --no-encryption to disable encryption'; + + @override + String get commandHint_html => 'Pošljite besedilo v obliki HTML'; + + @override + String get commandHint_invite => 'Povabi danega uporabnika v to sobo'; + + @override + String get commandHint_join => 'Pridružite se dani sobi'; + + @override + String get commandHint_kick => 'Odstranite danega uporabnika iz te sobe'; + + @override + String get commandHint_leave => 'Zapusti to sobo'; + + @override + String get commandHint_me => 'Opisi sebe'; + + @override + String get commandHint_myroomavatar => 'Nastavite svojo sliko za to sobo'; + + @override + String get commandHint_myroomnick => 'Nastavite prikazno ime za to sobo'; + + @override + String get commandHint_op => + 'Nastavite raven moči danega uporabnika (privzeto: 50)'; + + @override + String get commandHint_plain => 'Pošlji neformatirano besedilo'; + + @override + String get commandHint_react => 'Pošljite odgovor kot reakcijo'; + + @override + String get commandHint_send => 'Pošlji besedilo'; + + @override + String get commandHint_unban => + 'Prekliči izključitev določenega uporabnika iz te sobe'; + + @override + String get commandInvalid => 'Ukaz ni veljaven'; + + @override + String commandMissing(String command) { + return '$command is not a command.'; + } + + @override + String get compareEmojiMatch => + 'Primerjajte in se prepričajte, da se naslednji emoji ujemajo s tistimi iz druge naprave:'; + + @override + String get compareNumbersMatch => + 'Primerjajte in se prepričajte, da se naslednje številke ujemajo s številkami druge naprave:'; + + @override + String get configureChat => 'Konfigurirajte klepet'; + + @override + String get confirm => 'Potrdi'; + + @override + String get connect => 'Povežite se'; + + @override + String get contactHasBeenInvitedToTheGroup => + 'Kontakt je bil povabljen v skupino'; + + @override + String get containsDisplayName => 'Vsebuje prikazno ime'; + + @override + String get containsUserName => 'Vsebuje uporabniško ime'; + + @override + String get contentHasBeenReported => + 'Vsebina je bila prijavljena skrbnikom strežnika'; + + @override + String get copiedToClipboard => 'Kopirano v odložišče'; + + @override + String get copy => 'Kopiraj'; + + @override + String get copyToClipboard => 'Kopiraj v odložišče'; + + @override + String couldNotDecryptMessage(String error) { + return 'Sporočila ni bilo mogoče dešifrirati: $error'; + } + + @override + String countParticipants(int count) { + return '$count udeležencev'; + } + + @override + String get create => 'Ustvari'; + + @override + String createdTheChat(String username) { + return '$username je ustvaril klepet'; + } + + @override + String get createGroup => 'Create group'; + + @override + String get createNewSpace => 'Nov prostor'; + + @override + String get currentlyActive => 'Trenutno aktiven'; + + @override + String get darkTheme => 'Temno'; + + @override + String dateAndTimeOfDay(String date, String timeOfDay) { + return '$date, $timeOfDay'; + } + + @override + String dateWithoutYear(String month, String day) { + return '$month-$day'; + } + + @override + String dateWithYear(String year, String month, String day) { + return '$day-$month-$year'; + } + + @override + String get deactivateAccountWarning => + 'S tem boste deaktivirali vaš uporabniški račun. Tega ni mogoče razveljaviti! Ali si prepričan?'; + + @override + String get defaultPermissionLevel => 'Privzeta raven dovoljenja'; + + @override + String get delete => 'Delete'; + + @override + String get deleteAccount => 'Delete account'; + + @override + String get deleteMessage => 'Delete message'; + + @override + String get device => 'Device'; + + @override + String get deviceId => 'Device ID'; + + @override + String get devices => 'Devices'; + + @override + String get directChats => 'Direct Chats'; + + @override + String get allRooms => 'All Group Chats'; + + @override + String get displaynameHasBeenChanged => 'Displayname has been changed'; + + @override + String get downloadFile => 'Download file'; + + @override + String get edit => 'Edit'; + + @override + String get editBlockedServers => 'Edit blocked servers'; + + @override + String get chatPermissions => 'Chat permissions'; + + @override + String get editDisplayname => 'Edit displayname'; + + @override + String get editRoomAliases => 'Edit room aliases'; + + @override + String get editRoomAvatar => 'Edit room avatar'; + + @override + String get emoteExists => 'Emote already exists!'; + + @override + String get emoteInvalid => 'Invalid emote shortcode!'; + + @override + String get emoteKeyboardNoRecents => + 'Recently-used emotes will appear here...'; + + @override + String get emotePacks => 'Emote packs for room'; + + @override + String get emoteSettings => 'Emote Settings'; + + @override + String get globalChatId => 'Global chat ID'; + + @override + String get accessAndVisibility => 'Access and visibility'; + + @override + String get accessAndVisibilityDescription => + 'Who is allowed to join this chat and how the chat can be discovered.'; + + @override + String get calls => 'Calls'; + + @override + String get customEmojisAndStickers => 'Custom emojis and stickers'; + + @override + String get customEmojisAndStickersBody => + 'Add or share custom emojis or stickers which can be used in any chat.'; + + @override + String get emoteShortcode => 'Emote shortcode'; + + @override + String get emoteWarnNeedToPick => + 'You need to pick an emote shortcode and an image!'; + + @override + String get emptyChat => 'Empty chat'; + + @override + String get enableEmotesGlobally => 'Enable emote pack globally'; + + @override + String get enableEncryption => 'Enable encryption'; + + @override + String get enableEncryptionWarning => + 'You won\'t be able to disable the encryption anymore. Are you sure?'; + + @override + String get encrypted => 'Encrypted'; + + @override + String get encryption => 'Encryption'; + + @override + String get encryptionNotEnabled => 'Encryption is not enabled'; + + @override + String endedTheCall(String senderName) { + return '$senderName ended the call'; + } + + @override + String get enterAnEmailAddress => 'Enter an email address'; + + @override + String get homeserver => 'Homeserver'; + + @override + String get enterYourHomeserver => 'Enter your homeserver'; + + @override + String errorObtainingLocation(String error) { + return 'Error obtaining location: $error'; + } + + @override + String get everythingReady => 'Everything ready!'; + + @override + String get extremeOffensive => 'Extremely offensive'; + + @override + String get fileName => 'File name'; + + @override + String get fluffychat => 'Extera'; + + @override + String get fontSize => 'Font size'; + + @override + String get forward => 'Forward'; + + @override + String get fromJoining => 'From joining'; + + @override + String get fromTheInvitation => 'From the invitation'; + + @override + String get goToTheNewRoom => 'Go to the new room'; + + @override + String get group => 'Group'; + + @override + String get chatDescription => 'Chat description'; + + @override + String get chatDescriptionHasBeenChanged => 'Chat description changed'; + + @override + String get groupIsPublic => 'Group is public'; + + @override + String get groups => 'Groups'; + + @override + String groupWith(String displayname) { + return 'Group with $displayname'; + } + + @override + String get guestsAreForbidden => 'Guests are forbidden'; + + @override + String get guestsCanJoin => 'Guests can join'; + + @override + String hasWithdrawnTheInvitationFor(String username, String targetName) { + return '$username has withdrawn the invitation for $targetName'; + } + + @override + String get help => 'Help'; + + @override + String get hideRedactedEvents => 'Hide redacted events'; + + @override + String get hideRedactedMessages => 'Hide redacted messages'; + + @override + String get hideRedactedMessagesBody => + 'If someone redacts a message, this message won\'t be visible in the chat anymore.'; + + @override + String get hideInvalidOrUnknownMessageFormats => + 'Hide invalid or unknown message formats'; + + @override + String get howOffensiveIsThisContent => 'How offensive is this content?'; + + @override + String get id => 'ID'; + + @override + String get identity => 'Identity'; + + @override + String get block => 'Block'; + + @override + String get blockedUsers => 'Blocked users'; + + @override + String get blockListDescription => + 'You can block users who are disturbing you. You won\'t be able to receive any messages or room invites from the users on your personal block list.'; + + @override + String get blockUsername => 'Ignore username'; + + @override + String get iHaveClickedOnLink => 'I have clicked on the link'; + + @override + String get incorrectPassphraseOrKey => 'Incorrect passphrase or recovery key'; + + @override + String get inoffensive => 'Inoffensive'; + + @override + String get inviteContact => 'Invite contact'; + + @override + String inviteContactToGroupQuestion(Object contact, Object groupName) { + return 'Do you want to invite $contact to the chat \"$groupName\"?'; + } + + @override + String inviteContactToGroup(String groupName) { + return 'Invite contact to $groupName'; + } + + @override + String get noChatDescriptionYet => 'No chat description created yet.'; + + @override + String get tryAgain => 'Try again'; + + @override + String get invalidServerName => 'Invalid server name'; + + @override + String get invited => 'Invited'; + + @override + String get redactMessageDescription => + 'The message will be redacted for all participants in this conversation. This cannot be undone.'; + + @override + String get optionalRedactReason => + '(Optional) Reason for redacting this message...'; + + @override + String invitedUser(String username, String targetName) { + return '📩 $username invited $targetName'; + } + + @override + String get invitedUsersOnly => 'Invited users only'; + + @override + String get inviteForMe => 'Invite for me'; + + @override + String inviteText(String username, String link) { + return '$username invited you to Extera.\n1. Visit fluffychat.im and install the app \n2. Sign up or sign in \n3. Open the invite link: \n $link'; + } + + @override + String get isTyping => 'is typing…'; + + @override + String joinedTheChat(String username) { + return '👋 $username joined the chat'; + } + + @override + String get joinRoom => 'Join room'; + + @override + String kicked(String username, String targetName) { + return '👞 $username kicked $targetName'; + } + + @override + String kickedAndBanned(String username, String targetName) { + return '🙅 $username kicked and banned $targetName'; + } + + @override + String get kickFromChat => 'Kick from chat'; + + @override + String lastActiveAgo(String localizedTimeShort) { + return 'Last active: $localizedTimeShort'; + } + + @override + String get leave => 'Leave'; + + @override + String get leftTheChat => 'Left the chat'; + + @override + String get license => 'License'; + + @override + String get lightTheme => 'Light'; + + @override + String loadCountMoreParticipants(int count) { + return 'Load $count more participants'; + } + + @override + String get dehydrate => 'Export session and wipe device'; + + @override + String get dehydrateWarning => + 'This action cannot be undone. Ensure you safely store the backup file.'; + + @override + String get dehydrateTor => 'TOR Users: Export session'; + + @override + String get dehydrateTorLong => + 'For TOR users, it is recommended to export the session before closing the window.'; + + @override + String get hydrateTor => 'TOR Users: Import session export'; + + @override + String get hydrateTorLong => + 'Did you export your session last time on TOR? Quickly import it and continue chatting.'; + + @override + String get hydrate => 'Restore from backup file'; + + @override + String get loadingPleaseWait => 'Loading… Please wait.'; + + @override + String get loadMore => 'Load more…'; + + @override + String get locationDisabledNotice => + 'Location services are disabled. Please enable them to be able to share your location.'; + + @override + String get locationPermissionDeniedNotice => + 'Location permission denied. Please grant them to be able to share your location.'; + + @override + String get login => 'Login'; + + @override + String logInTo(String homeserver) { + return 'Log in to $homeserver'; + } + + @override + String get logout => 'Logout'; + + @override + String get memberChanges => 'Member changes'; + + @override + String get mention => 'Mention'; + + @override + String get messages => 'Messages'; + + @override + String get messagesStyle => 'Messages:'; + + @override + String get moderator => 'Moderator'; + + @override + String get muteChat => 'Mute chat'; + + @override + String get needPantalaimonWarning => + 'Please be aware that you need Pantalaimon to use end-to-end encryption for now.'; + + @override + String get newChat => 'New chat'; + + @override + String get newMessageInFluffyChat => '💬 New message in Extera'; + + @override + String get newVerificationRequest => 'New verification request!'; + + @override + String get next => 'Next'; + + @override + String get no => 'No'; + + @override + String get noConnectionToTheServer => 'No connection to the server'; + + @override + String get noEmotesFound => 'No emotes found. 😕'; + + @override + String get noEncryptionForPublicRooms => + 'You can only activate encryption as soon as the room is no longer publicly accessible.'; + + @override + String get noGoogleServicesWarning => + 'Firebase Cloud Messaging doesn\'t appear to be available on your device. To still receive push notifications, we recommend installing ntfy. With ntfy or another Unified Push provider you can receive push notifications in a data secure way. You can download ntfy from the PlayStore or from F-Droid.'; + + @override + String noMatrixServer(String server1, String server2) { + return '$server1 is no matrix server, use $server2 instead?'; + } + + @override + String get shareInviteLink => 'Share invite link'; + + @override + String get scanQrCode => 'Scan QR code'; + + @override + String get none => 'None'; + + @override + String get noPasswordRecoveryDescription => + 'You have not added a way to recover your password yet.'; + + @override + String get noPermission => 'No permission'; + + @override + String get noRoomsFound => 'No rooms found…'; + + @override + String get notifications => 'Notifications'; + + @override + String get notificationsEnabledForThisAccount => + 'Notifications enabled for this account'; + + @override + String numUsersTyping(int count) { + return '$count users are typing…'; + } + + @override + String get obtainingLocation => 'Obtaining location…'; + + @override + String get offensive => 'Offensive'; + + @override + String get offline => 'Offline'; + + @override + String get ok => 'Ok'; + + @override + String get online => 'Online'; + + @override + String get onlineKeyBackupEnabled => 'Online Key Backup is enabled'; + + @override + String get oopsPushError => + 'Oops! Unfortunately, an error occurred when setting up the push notifications.'; + + @override + String get oopsSomethingWentWrong => 'Oops, something went wrong…'; + + @override + String get openAppToReadMessages => 'Open app to read messages'; + + @override + String get openCamera => 'Open camera'; + + @override + String get openVideoCamera => 'Open camera for a video'; + + @override + String get oneClientLoggedOut => 'One of your clients has been logged out'; + + @override + String get addAccount => 'Add account'; + + @override + String get editBundlesForAccount => 'Edit bundles for this account'; + + @override + String get addToBundle => 'Add to bundle'; + + @override + String get removeFromBundle => 'Remove from this bundle'; + + @override + String get bundleName => 'Bundle name'; + + @override + String get enableMultiAccounts => + '(BETA) Enable multi accounts on this device'; + + @override + String get openInMaps => 'Open in maps'; + + @override + String get link => 'Link'; + + @override + String get serverRequiresEmail => + 'This server needs to validate your email address for registration.'; + + @override + String get or => 'Or'; + + @override + String get participant => 'Participant'; + + @override + String get passphraseOrKey => 'passphrase or recovery key'; + + @override + String get password => 'Password'; + + @override + String get passwordForgotten => 'Password forgotten'; + + @override + String get passwordHasBeenChanged => 'Password has been changed'; + + @override + String get hideMemberChangesInPublicChats => + 'Hide member changes in public chats'; + + @override + String get hideMemberChangesInPublicChatsBody => + 'Do not show in the chat timeline if someone joins or leaves a public chat to improve readability.'; + + @override + String get overview => 'Overview'; + + @override + String get notifyMeFor => 'Notify me for'; + + @override + String get passwordRecoverySettings => 'Password recovery settings'; + + @override + String get passwordRecovery => 'Password recovery'; + + @override + String get people => 'People'; + + @override + String get pickImage => 'Pick an image'; + + @override + String get pin => 'Pin'; + + @override + String play(String fileName) { + return 'Play $fileName'; + } + + @override + String get pleaseChoose => 'Please choose'; + + @override + String get pleaseChooseAPasscode => 'Please choose a pass code'; + + @override + String get pleaseClickOnLink => + 'Please click on the link in the email and then proceed.'; + + @override + String get pleaseEnter4Digits => + 'Please enter 4 digits or leave empty to disable app lock.'; + + @override + String get pleaseEnterRecoveryKey => 'Please enter your recovery key:'; + + @override + String get pleaseEnterYourPassword => 'Please enter your password'; + + @override + String get pleaseEnterYourPin => 'Please enter your pin'; + + @override + String get pleaseEnterYourUsername => 'Please enter your username'; + + @override + String get pleaseFollowInstructionsOnWeb => + 'Please follow the instructions on the website and tap on next.'; + + @override + String get privacy => 'Privacy'; + + @override + String get publicRooms => 'Public Rooms'; + + @override + String get pushRules => 'Push rules'; + + @override + String get reason => 'Reason'; + + @override + String get recording => 'Recording'; + + @override + String redactedBy(String username) { + return 'Redacted by $username'; + } + + @override + String get directChat => 'Direct chat'; + + @override + String redactedByBecause(String username, String reason) { + return 'Redacted by $username because: \"$reason\"'; + } + + @override + String redactedAnEvent(String username) { + return '$username redacted an event'; + } + + @override + String get redactMessage => 'Redact message'; + + @override + String get register => 'Register'; + + @override + String get reject => 'Reject'; + + @override + String rejectedTheInvitation(String username) { + return '$username rejected the invitation'; + } + + @override + String get rejoin => 'Rejoin'; + + @override + String get removeAllOtherDevices => 'Remove all other devices'; + + @override + String removedBy(String username) { + return 'Removed by $username'; + } + + @override + String get removeDevice => 'Remove device'; + + @override + String get unbanFromChat => 'Unban from chat'; + + @override + String get removeYourAvatar => 'Remove your avatar'; + + @override + String get replaceRoomWithNewerVersion => 'Replace room with newer version'; + + @override + String get reply => 'Reply'; + + @override + String get reportMessage => 'Report message'; + + @override + String get translateMessage => 'Translate message'; + + @override + String get translatedMessage => 'Translated message'; + + @override + String get errorTranslatingMessage => + 'An error has occured while translating the message.'; + + @override + String get recoverMessage => 'Recover message'; + + @override + String get recoveredMessage => 'Recovered message'; + + @override + String get errorRecoveringMessage => + 'An error has occured while recovering the message.'; + + @override + String get errorRecoveringMessageNoAdmin => + 'This feature is available on Synapse homeservers only for adminstrators.'; + + @override + String get requestPermission => 'Request permission'; + + @override + String get roomHasBeenUpgraded => 'Room has been upgraded'; + + @override + String get roomVersion => 'Room version'; + + @override + String get saveFile => 'Save file'; + + @override + String get retry => 'Retry'; + + @override + String get search => 'Search'; + + @override + String get security => 'Security'; + + @override + String get recoveryKey => 'Recovery key'; + + @override + String get recoveryKeyLost => 'Recovery key lost?'; + + @override + String seenByUser(String username) { + return 'Seen by $username'; + } + + @override + String get send => 'Send'; + + @override + String get sendAMessage => 'Send a message'; + + @override + String get sendAsText => 'Send as text'; + + @override + String get sendAudio => 'Send audio'; + + @override + String get sendFile => 'Send file'; + + @override + String get sendImage => 'Send image'; + + @override + String sendImages(int count) { + return 'Send $count image'; + } + + @override + String get sendMessages => 'Send messages'; + + @override + String get sendOriginal => 'Send original'; + + @override + String get sendSticker => 'Send sticker'; + + @override + String get sendVideo => 'Send video'; + + @override + String sentAFile(String username) { + return '📁 $username sent a file'; + } + + @override + String sentAnAudio(String username) { + return '🎤 $username sent an audio'; + } + + @override + String sentAPicture(String username) { + return '🖼️ $username sent a picture'; + } + + @override + String sentASticker(String username) { + return '😊 $username sent a sticker'; + } + + @override + String sentAVideo(String username) { + return '🎥 $username sent a video'; + } + + @override + String sentCallInformations(String senderName) { + return '$senderName sent call information'; + } + + @override + String get separateChatTypes => 'Separate Direct Chats and Groups'; + + @override + String get setAsCanonicalAlias => 'Set as main alias'; + + @override + String get setCustomEmotes => 'Set custom emotes'; + + @override + String get setChatDescription => 'Set chat description'; + + @override + String get setInvitationLink => 'Set invitation link'; + + @override + String get setPermissionsLevel => 'Set permissions level'; + + @override + String get setStatus => 'Set status'; + + @override + String get settings => 'Settings'; + + @override + String get share => 'Share'; + + @override + String sharedTheLocation(String username) { + return '$username shared their location'; + } + + @override + String get shareLocation => 'Share location'; + + @override + String get showPassword => 'Show password'; + + @override + String get presenceStyle => 'Presence:'; + + @override + String get hideAvatarsInInvites => 'Hide avatars in invites'; + + @override + String get hideAvatarsInInvitesDescription => + 'Do not show room avatars in invites'; + + @override + String get presencesToggle => 'Show status messages from other users'; + + @override + String get pureBlackToggle => 'Pure Black'; + + @override + String get singlesignon => 'Single Sign on'; + + @override + String get skip => 'Skip'; + + @override + String get sourceCode => 'Source code'; + + @override + String get spaceIsPublic => 'Space is public'; + + @override + String get spaceName => 'Space name'; + + @override + String startedACall(String senderName) { + return '$senderName started a call'; + } + + @override + String get startFirstChat => 'Start your first chat'; + + @override + String get status => 'Status'; + + @override + String get statusExampleMessage => 'How are you today?'; + + @override + String get submit => 'Submit'; + + @override + String get synchronizingPleaseWait => 'Synchronizing… Please wait.'; + + @override + String synchronizingPleaseWaitCounter(String percentage) { + return ' Synchronizing… ($percentage%)'; + } + + @override + String get systemTheme => 'System'; + + @override + String get theyDontMatch => 'They Don\'t Match'; + + @override + String get theyMatch => 'They Match'; + + @override + String get title => 'Extera'; + + @override + String get toggleFavorite => 'Toggle Favorite'; + + @override + String get toggleMuted => 'Toggle Muted'; + + @override + String get toggleUnread => 'Mark Read/Unread'; + + @override + String get tooManyRequestsWarning => + 'Too many requests. Please try again later!'; + + @override + String get transferFromAnotherDevice => 'Transfer from another device'; + + @override + String get tryToSendAgain => 'Try to send again'; + + @override + String get unavailable => 'Unavailable'; + + @override + String unbannedUser(String username, String targetName) { + return '$username unbanned $targetName'; + } + + @override + String get unblockDevice => 'Unblock Device'; + + @override + String get unknownDevice => 'Unknown device'; + + @override + String get unknownEncryptionAlgorithm => 'Unknown encryption algorithm'; + + @override + String unknownEvent(String type) { + return 'Unknown event \'$type\''; + } + + @override + String get unmuteChat => 'Unmute chat'; + + @override + String get unpin => 'Unpin'; + + @override + String unreadChats(int unreadCount) { + String _temp0 = intl.Intl.pluralLogic( + unreadCount, + locale: localeName, + other: '$unreadCount unread chats', + one: '1 unread chat', + ); + return '$_temp0'; + } + + @override + String userAndOthersAreTyping(String username, int count) { + return '$username and $count others are typing…'; + } + + @override + String userAndUserAreTyping(String username, String username2) { + return '$username and $username2 are typing…'; + } + + @override + String userIsTyping(String username) { + return '$username is typing…'; + } + + @override + String userLeftTheChat(String username) { + return '🚪 $username left the chat'; + } + + @override + String get username => 'Username'; + + @override + String userSentUnknownEvent(String username, String type) { + return '$username sent a $type event'; + } + + @override + String get unverified => 'Unverified'; + + @override + String get verified => 'Verified'; + + @override + String get verify => 'Verify'; + + @override + String get verifyStart => 'Start Verification'; + + @override + String get verifySuccess => 'You successfully verified!'; + + @override + String get verifyTitle => 'Verifying other account'; + + @override + String get videoCall => 'Video call'; + + @override + String get visibilityOfTheChatHistory => 'Visibility of the chat history'; + + @override + String get visibleForAllParticipants => 'Visible for all participants'; + + @override + String get visibleForEveryone => 'Visible for everyone'; + + @override + String get voiceMessage => 'Voice message'; + + @override + String get waitingPartnerAcceptRequest => + 'Waiting for partner to accept the request…'; + + @override + String get waitingPartnerEmoji => 'Waiting for partner to accept the emoji…'; + + @override + String get waitingPartnerNumbers => + 'Waiting for partner to accept the numbers…'; + + @override + String get wallpaper => 'Wallpaper:'; + + @override + String get warning => 'Warning!'; + + @override + String get weSentYouAnEmail => 'We sent you an email'; + + @override + String get whoCanPerformWhichAction => 'Who can perform which action'; + + @override + String get whoIsAllowedToJoinThisGroup => 'Who is allowed to join this group'; + + @override + String get whyDoYouWantToReportThis => 'Why do you want to report this?'; + + @override + String get wipeChatBackup => + 'Wipe your chat backup to create a new recovery key?'; + + @override + String get withTheseAddressesRecoveryDescription => + 'With these addresses you can recover your password.'; + + @override + String get writeAMessage => 'Write a message…'; + + @override + String get yes => 'Yes'; + + @override + String get you => 'You'; + + @override + String get youAreNoLongerParticipatingInThisChat => + 'You are no longer participating in this chat'; + + @override + String get youHaveBeenBannedFromThisChat => + 'You have been banned from this chat'; + + @override + String get yourPublicKey => 'Your public key'; + + @override + String get messageInfo => 'Message info'; + + @override + String get time => 'Time'; + + @override + String get messageType => 'Message Type'; + + @override + String get sender => 'Sender'; + + @override + String get openGallery => 'Open gallery'; + + @override + String get removeFromSpace => 'Remove from space'; + + @override + String get addToSpaceDescription => 'Select a space to add this chat to it.'; + + @override + String get start => 'Start'; + + @override + String get pleaseEnterRecoveryKeyDescription => + 'To unlock your old messages, please enter your recovery key that has been generated in a previous session. Your recovery key is NOT your password.'; + + @override + String get publish => 'Publish'; + + @override + String videoWithSize(String size) { + return 'Video ($size)'; + } + + @override + String get openChat => 'Open Chat'; + + @override + String get markAsRead => 'Mark as read'; + + @override + String get reportUser => 'Report user'; + + @override + String get dismiss => 'Dismiss'; + + @override + String reactedWith(String sender, String reaction) { + return '$sender reacted with $reaction'; + } + + @override + String get pinMessage => 'Pin to room'; + + @override + String get confirmEventUnpin => + 'Are you sure to permanently unpin the event?'; + + @override + String get emojis => 'Emojis'; + + @override + String get placeCall => 'Place call'; + + @override + String get voiceCall => 'Voice call'; + + @override + String get unsupportedAndroidVersion => 'Unsupported Android version'; + + @override + String get unsupportedAndroidVersionLong => + 'This feature requires a newer Android version. Please check for updates or Lineage OS support.'; + + @override + String get videoCallsBetaWarning => + 'Please note that video calls are currently in beta. They might not work as expected or work at all on all platforms.'; + + @override + String get experimentalVideoCalls => 'Experimental video calls'; + + @override + String get emailOrUsername => 'Email or username'; + + @override + String get indexedDbErrorTitle => 'Private mode issues'; + + @override + String get indexedDbErrorLong => + 'The message storage is unfortunately not enabled in private mode by default.\nPlease visit\n - about:config\n - set dom.indexedDB.privateBrowsing.enabled to true\nOtherwise, it is not possible to run Extera.'; + + @override + String switchToAccount(String number) { + return 'Switch to account $number'; + } + + @override + String get nextAccount => 'Next account'; + + @override + String get previousAccount => 'Previous account'; + + @override + String get addWidget => 'Add widget'; + + @override + String get widgetVideo => 'Video'; + + @override + String get widgetEtherpad => 'Text note'; + + @override + String get widgetJitsi => 'Jitsi Meet'; + + @override + String get widgetCustom => 'Custom'; + + @override + String get widgetName => 'Name'; + + @override + String get widgetUrlError => 'This is not a valid URL.'; + + @override + String get widgetNameError => 'Please provide a display name.'; + + @override + String get errorAddingWidget => 'Error adding the widget.'; + + @override + String get youRejectedTheInvitation => 'You rejected the invitation'; + + @override + String get youJoinedTheChat => 'You joined the chat'; + + @override + String get youAcceptedTheInvitation => '👍 You accepted the invitation'; + + @override + String youBannedUser(String user) { + return 'You banned $user'; + } + + @override + String youHaveWithdrawnTheInvitationFor(String user) { + return 'You have withdrawn the invitation for $user'; + } + + @override + String youInvitedToBy(String alias) { + return '📩 You have been invited via link to:\n$alias'; + } + + @override + String youInvitedBy(String user) { + return '📩 You have been invited by $user'; + } + + @override + String invitedBy(String user) { + return '📩 Invited by $user'; + } + + @override + String youInvitedUser(String user) { + return '📩 You invited $user'; + } + + @override + String youKicked(String user) { + return '👞 You kicked $user'; + } + + @override + String youKickedAndBanned(String user) { + return '🙅 You kicked and banned $user'; + } + + @override + String youUnbannedUser(String user) { + return 'You unbanned $user'; + } + + @override + String hasKnocked(String user) { + return '🚪 $user has knocked'; + } + + @override + String get usersMustKnock => 'Users must knock'; + + @override + String get noOneCanJoin => 'No one can join'; + + @override + String userWouldLikeToChangeTheChat(String user) { + return '$user would like to join the chat.'; + } + + @override + String get noPublicLinkHasBeenCreatedYet => + 'No public link has been created yet'; + + @override + String get knock => 'Knock'; + + @override + String get users => 'Users'; + + @override + String get unlockOldMessages => 'Unlock old messages'; + + @override + String get storeInSecureStorageDescription => + 'Store the recovery key in the secure storage of this device.'; + + @override + String get saveKeyManuallyDescription => + 'Save this key manually by triggering the system share dialog or clipboard.'; + + @override + String get storeInAndroidKeystore => 'Store in Android KeyStore'; + + @override + String get storeInAppleKeyChain => 'Store in Apple KeyChain'; + + @override + String get storeSecurlyOnThisDevice => 'Store securely on this device'; + + @override + String countFiles(int count) { + return '$count files'; + } + + @override + String get user => 'User'; + + @override + String get custom => 'Custom'; + + @override + String get foregroundServiceRunning => + 'This notification appears when the foreground service is running.'; + + @override + String get screenSharingTitle => 'screen sharing'; + + @override + String get screenSharingDetail => 'You are sharing your screen in Extera'; + + @override + String get callingPermissions => 'Calling permissions'; + + @override + String get callingAccount => 'Calling account'; + + @override + String get callingAccountDetails => + 'Allows Extera to use the native android dialer app.'; + + @override + String get appearOnTop => 'Appear on top'; + + @override + String get appearOnTopDetails => + 'Allows the app to appear on top (not needed if you already have Fluffychat setup as a calling account)'; + + @override + String get otherCallingPermissions => + 'Microphone, camera and other Extera permissions'; + + @override + String get whyIsThisMessageEncrypted => 'Why is this message unreadable?'; + + @override + String get noKeyForThisMessage => + 'This can happen if the message was sent before you have signed in to your account at this device.\n\nIt is also possible that the sender has blocked your device or something went wrong with the internet connection.\n\nAre you able to read the message on another session? Then you can transfer the message from it! Go to Settings > Devices and make sure that your devices have verified each other. When you open the room the next time and both sessions are in the foreground, the keys will be transmitted automatically.\n\nDo you not want to lose the keys when logging out or switching devices? Make sure that you have enabled the chat backup in the settings.'; + + @override + String get newGroup => 'New group'; + + @override + String get newSpace => 'New space'; + + @override + String get enterSpace => 'Enter space'; + + @override + String get enterRoom => 'Enter room'; + + @override + String get allSpaces => 'All spaces'; + + @override + String numChats(String number) { + return '$number chats'; + } + + @override + String get hideUnimportantStateEvents => 'Hide unimportant state events'; + + @override + String get hidePresences => 'Hide Status List?'; + + @override + String get doNotShowAgain => 'Do not show again'; + + @override + String wasDirectChatDisplayName(String oldDisplayName) { + return 'Empty chat (was $oldDisplayName)'; + } + + @override + String get newSpaceDescription => + 'Spaces allows you to consolidate your chats and build private or public communities.'; + + @override + String get encryptThisChat => 'Encrypt this chat'; + + @override + String get disableEncryptionWarning => + 'For security reasons you can not disable encryption in a chat, where it has been enabled before.'; + + @override + String get sorryThatsNotPossible => 'Sorry... that is not possible'; + + @override + String get deviceKeys => 'Device keys:'; + + @override + String get reopenChat => 'Reopen chat'; + + @override + String get noBackupWarning => + 'Warning! Without enabling chat backup, you will lose access to your encrypted messages. It is highly recommended to enable the chat backup first before logging out.'; + + @override + String get noOtherDevicesFound => 'No other devices found'; + + @override + String fileIsTooBigForServer(String max) { + return 'Unable to send! The server only supports attachments up to $max.'; + } + + @override + String fileHasBeenSavedAt(String path) { + return 'File has been saved at $path'; + } + + @override + String get jumpToLastReadMessage => 'Jump to last read message'; + + @override + String get readUpToHere => 'Read up to here'; + + @override + String get jump => 'Jump'; + + @override + String get openLinkInBrowser => 'Open link in browser'; + + @override + String get reportErrorDescription => + '😭 Oh no. Something went wrong. If you want, you can report this bug to the developers.'; + + @override + String get report => 'Report'; + + @override + String get signInWithPassword => 'Sign in with password'; + + @override + String get pleaseTryAgainLaterOrChooseDifferentServer => + 'Please try again later or choose a different server.'; + + @override + String signInWith(String provider) { + return 'Sign in with $provider'; + } + + @override + String get profileNotFound => + 'The user could not be found on the server. Maybe there is a connection problem or the user doesn\'t exist.'; + + @override + String get setTheme => 'Set theme:'; + + @override + String get setColorTheme => 'Set color theme:'; + + @override + String get invite => 'Invite'; + + @override + String get inviteGroupChat => '📨 Invite group chat'; + + @override + String get invitePrivateChat => '📨 Invite private chat'; + + @override + String get invalidInput => 'Invalid input!'; + + @override + String wrongPinEntered(int seconds) { + return 'Wrong pin entered! Try again in $seconds seconds...'; + } + + @override + String get pleaseEnterANumber => 'Please enter a number greater than 0'; + + @override + String get archiveRoomDescription => + 'The chat will be moved to the archive. Other users will be able to see that you have left the chat.'; + + @override + String get roomUpgradeDescription => + 'The chat will then be recreated with the new room version. All participants will be notified that they need to switch to the new chat. You can find out more about room versions at https://spec.matrix.org/latest/rooms/'; + + @override + String get removeDevicesDescription => + 'You will be logged out of this device and will no longer be able to receive messages.'; + + @override + String get banUserDescription => + 'The user will be banned from the chat and will not be able to enter the chat again until they are unbanned.'; + + @override + String get unbanUserDescription => + 'The user will be able to enter the chat again if they try.'; + + @override + String get kickUserDescription => + 'The user is kicked out of the chat but not banned. In public chats, the user can rejoin at any time.'; + + @override + String get makeAdminDescription => + 'Once you make this user admin, you may not be able to undo this as they will then have the same permissions as you.'; + + @override + String get pushNotificationsNotAvailable => + 'Push notifications not available'; + + @override + String get learnMore => 'Learn more'; + + @override + String get yourGlobalUserIdIs => 'Your global user-ID is: '; + + @override + String noUsersFoundWithQuery(String query) { + return 'Unfortunately no user could be found with \"$query\". Please check whether you made a typo.'; + } + + @override + String get knocking => 'Knocking'; + + @override + String chatCanBeDiscoveredViaSearchOnServer(String server) { + return 'Chat can be discovered via the search on $server'; + } + + @override + String get searchChatsRooms => 'Search for #chats, @users...'; + + @override + String get nothingFound => 'Nothing found...'; + + @override + String get groupName => 'Group name'; + + @override + String get createGroupAndInviteUsers => 'Create a group and invite users'; + + @override + String get groupCanBeFoundViaSearch => 'Group can be found via search'; + + @override + String get wrongRecoveryKey => + 'Sorry... this does not seem to be the correct recovery key.'; + + @override + String get startConversation => 'Start conversation'; + + @override + String get commandHint_sendraw => 'Send raw json'; + + @override + String get databaseMigrationTitle => 'Database is optimized'; + + @override + String get databaseMigrationBody => 'Please wait. This may take a moment.'; + + @override + String get leaveEmptyToClearStatus => 'Leave empty to clear your status.'; + + @override + String get select => 'Select'; + + @override + String get searchForUsers => 'Search for @users...'; + + @override + String get pleaseEnterYourCurrentPassword => + 'Please enter your current password'; + + @override + String get newPassword => 'New password'; + + @override + String get pleaseChooseAStrongPassword => 'Please choose a strong password'; + + @override + String get passwordsDoNotMatch => 'Passwords do not match'; + + @override + String get passwordIsWrong => 'Your entered password is wrong'; + + @override + String get publicLink => 'Public link'; + + @override + String get publicChatAddresses => 'Public chat addresses'; + + @override + String get createNewAddress => 'Create new address'; + + @override + String get joinSpace => 'Join space'; + + @override + String get publicSpaces => 'Public spaces'; + + @override + String get addChatOrSubSpace => 'Add chat or sub space'; + + @override + String get subspace => 'Subspace'; + + @override + String get decline => 'Decline'; + + @override + String get thisDevice => 'This device:'; + + @override + String get initAppError => 'An error occured while init the app'; + + @override + String get userRole => 'User role'; + + @override + String minimumPowerLevel(String level) { + return '$level is the minimum power level.'; + } + + @override + String searchIn(String chat) { + return 'Search in chat \"$chat\"...'; + } + + @override + String get searchMore => 'Search more...'; + + @override + String get gallery => 'Gallery'; + + @override + String get files => 'Files'; + + @override + String databaseBuildErrorBody(String url, String error) { + return 'Unable to build the SQlite database. The app tries to use the legacy database for now. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String sessionLostBody(String url, String error) { + return 'Your session is lost. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String restoreSessionBody(String url, String error) { + return 'The app now tries to restore your session from the backup. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String forwardMessageTo(String roomName) { + return 'Forward message to $roomName?'; + } + + @override + String get sendReadReceipts => 'Send read receipts'; + + @override + String get sendTypingNotificationsDescription => + 'Other participants in a chat can see when you are typing a new message.'; + + @override + String get sendReadReceiptsDescription => + 'Other participants in a chat can see when you have read a message.'; + + @override + String get formattedMessages => 'Formatted messages'; + + @override + String get formattedMessagesDescription => + 'Display rich message content like bold text using markdown.'; + + @override + String get verifyOtherUser => '🔐 Verify other user'; + + @override + String get verifyOtherUserDescription => + 'If you verify another user, you can be sure that you know who you are really writing to. 💪\n\nWhen you start a verification, you and the other user will see a popup in the app. There you will then see a series of emojis or numbers that you have to compare with each other.\n\nThe best way to do this is to meet up or start a video call. 👭'; + + @override + String get verifyOtherDevice => '🔐 Verify other device'; + + @override + String get verifyOtherDeviceDescription => + 'When you verify another device, those devices can exchange keys, increasing your overall security. 💪 When you start a verification, a popup will appear in the app on both devices. There you will then see a series of emojis or numbers that you have to compare with each other. It\'s best to have both devices handy before you start the verification. 🤳'; + + @override + String acceptedKeyVerification(String sender) { + return '$sender accepted key verification'; + } + + @override + String canceledKeyVerification(String sender) { + return '$sender canceled key verification'; + } + + @override + String completedKeyVerification(String sender) { + return '$sender completed key verification'; + } + + @override + String isReadyForKeyVerification(String sender) { + return '$sender is ready for key verification'; + } + + @override + String requestedKeyVerification(String sender) { + return '$sender requested key verification'; + } + + @override + String startedKeyVerification(String sender) { + return '$sender started key verification'; + } + + @override + String get transparent => 'Transparent'; + + @override + String get incomingMessages => 'Incoming messages'; + + @override + String get stickers => 'Stickers'; + + @override + String get discover => 'Discover'; + + @override + String get commandHint_ignore => 'Ignore the given matrix ID'; + + @override + String get commandHint_unignore => 'Unignore the given matrix ID'; + + @override + String unreadChatsInApp(String appname, String unread) { + return '$appname: $unread unread chats'; + } + + @override + String get noDatabaseEncryption => + 'Database encryption is not supported on this platform'; + + @override + String thereAreCountUsersBlocked(Object count) { + return 'Right now there are $count users blocked.'; + } + + @override + String get restricted => 'Restricted'; + + @override + String get knockRestricted => 'Knock restricted'; + + @override + String goToSpace(Object space) { + return 'Go to space: $space'; + } + + @override + String get markAsUnread => 'Mark as unread'; + + @override + String userLevel(int level) { + return '$level - User'; + } + + @override + String moderatorLevel(int level) { + return '$level - Moderator'; + } + + @override + String adminLevel(int level) { + return '$level - Admin'; + } + + @override + String get changeGeneralChatSettings => 'Change general chat settings'; + + @override + String get inviteOtherUsers => 'Invite other users to this chat'; + + @override + String get changeTheChatPermissions => 'Change the chat permissions'; + + @override + String get changeTheVisibilityOfChatHistory => + 'Change the visibility of the chat history'; + + @override + String get changeTheCanonicalRoomAlias => + 'Change the main public chat address'; + + @override + String get sendRoomNotifications => 'Send a @room notifications'; + + @override + String get changeTheDescriptionOfTheGroup => + 'Change the description of the chat'; + + @override + String get chatPermissionsDescription => + 'Define which power level is necessary for certain actions in this chat. The power levels 0, 50 and 100 are usually representing users, moderators and admins, but any gradation is possible.'; + + @override + String updateInstalled(String version) { + return '🎉 Update $version installed!'; + } + + @override + String get changelog => 'Changelog'; + + @override + String get sendCanceled => 'Sending canceled'; + + @override + String get loginWithMatrixId => 'Login with Matrix-ID'; + + @override + String get discoverHomeservers => 'Discover homeservers'; + + @override + String get whatIsAHomeserver => 'What is a homeserver?'; + + @override + String get homeserverDescription => + 'All your data is stored on the homeserver, just like an email provider. You can choose which homeserver you want to use, while you can still communicate with everyone. Learn more at at https://matrix.org.'; + + @override + String get doesNotSeemToBeAValidHomeserver => + 'Doesn\'t seem to be a compatible homeserver. Wrong URL?'; + + @override + String get calculatingFileSize => 'Calculating file size...'; + + @override + String get prepareSendingAttachment => 'Prepare sending attachment...'; + + @override + String get sendingAttachment => 'Sending attachment...'; + + @override + String get generatingVideoThumbnail => 'Generating video thumbnail...'; + + @override + String get compressVideo => 'Compressing video...'; + + @override + String sendingAttachmentCountOfCount(int index, int length) { + return 'Sending attachment $index of $length...'; + } + + @override + String serverLimitReached(int seconds) { + return 'Server limit reached! Waiting $seconds seconds...'; + } + + @override + String get oneOfYourDevicesIsNotVerified => + 'One of your devices is not verified'; + + @override + String get noticeChatBackupDeviceVerification => + 'Note: When you connect all your devices to the chat backup, they are automatically verified.'; + + @override + String get continueText => 'Continue'; + + @override + String get welcomeText => + 'Hey Hey 👋 This is Extera. You can sign in to any homeserver, which is compatible with https://matrix.org. And then chat with anyone. It\'s a huge decentralized messaging network!'; + + @override + String get blur => 'Blur:'; + + @override + String get opacity => 'Opacity:'; + + @override + String get setWallpaper => 'Set wallpaper'; + + @override + String get manageAccount => 'Manage account'; + + @override + String get noContactInformationProvided => + 'Server does not provide any valid contact information'; + + @override + String get contactServerAdmin => 'Contact server admin'; + + @override + String get contactServerSecurity => 'Contact server security'; + + @override + String get supportPage => 'Support page'; + + @override + String get serverInformation => 'Server information:'; + + @override + String get name => 'Name'; + + @override + String get version => 'Version'; + + @override + String get website => 'Website'; + + @override + String get compress => 'Compress'; + + @override + String get boldText => 'Bold text'; + + @override + String get italicText => 'Italic text'; + + @override + String get strikeThrough => 'Strikethrough'; + + @override + String get pleaseFillOut => 'Please fill out'; + + @override + String get invalidUrl => 'Invalid url'; + + @override + String get addLink => 'Add link'; + + @override + String get unableToJoinChat => + 'Unable to join chat. Maybe the other party has already closed the conversation.'; + + @override + String get previous => 'Previous'; + + @override + String get otherPartyNotLoggedIn => + 'The other party is currently not logged in and therefore cannot receive messages!'; + + @override + String appWantsToUseForLogin(String server) { + return 'Use \'$server\' to log in'; + } + + @override + String get appWantsToUseForLoginDescription => + 'You hereby allow the app and website to share information about you.'; + + @override + String get open => 'Open'; + + @override + String get waitingForServer => 'Waiting for server...'; + + @override + String get appIntroduction => + 'Extera lets you chat with your friends across different messengers. Learn more at https://matrix.org or just tap *Continue*.'; + + @override + String get newChatRequest => '📩 New chat request'; + + @override + String get contentNotificationSettings => 'Content notification settings'; + + @override + String get generalNotificationSettings => 'General notification settings'; + + @override + String get roomNotificationSettings => 'Room notification settings'; + + @override + String get userSpecificNotificationSettings => + 'User specific notification settings'; + + @override + String get otherNotificationSettings => 'Other notification settings'; + + @override + String get notificationRuleContainsUserName => 'Contains User Name'; + + @override + String get notificationRuleContainsUserNameDescription => + 'Notifies the user when a message contains their username.'; + + @override + String get notificationRuleMaster => 'Mute all notifications'; + + @override + String get notificationRuleMasterDescription => + 'Overrides all other rules and disables all notifications.'; + + @override + String get notificationRuleSuppressNotices => 'Suppress Automated Messages'; + + @override + String get notificationRuleSuppressNoticesDescription => + 'Suppresses notifications from automated clients like bots.'; + + @override + String get notificationRuleInviteForMe => 'Invite for Me'; + + @override + String get notificationRuleInviteForMeDescription => + 'Notifies the user when they are invited to a room.'; + + @override + String get notificationRuleMemberEvent => 'Member Event'; + + @override + String get notificationRuleMemberEventDescription => + 'Suppresses notifications for membership events.'; + + @override + String get notificationRuleIsUserMention => 'User Mention'; + + @override + String get notificationRuleIsUserMentionDescription => + 'Notifies the user when they are directly mentioned in a message.'; + + @override + String get notificationRuleContainsDisplayName => 'Contains Display Name'; + + @override + String get notificationRuleContainsDisplayNameDescription => + 'Notifies the user when a message contains their display name.'; + + @override + String get notificationRuleIsRoomMention => 'Room Mention'; + + @override + String get notificationRuleIsRoomMentionDescription => + 'Notifies the user when there is a room mention.'; + + @override + String get notificationRuleRoomnotif => 'Room Notification'; + + @override + String get notificationRuleRoomnotifDescription => + 'Notifies the user when a message contains \'@room\'.'; + + @override + String get notificationRuleTombstone => 'Tombstone'; + + @override + String get notificationRuleTombstoneDescription => + 'Notifies the user about room deactivation messages.'; + + @override + String get notificationRuleReaction => 'Reaction'; + + @override + String get notificationRuleReactionDescription => + 'Suppresses notifications for reactions.'; + + @override + String get notificationRuleRoomServerAcl => 'Room Server ACL'; + + @override + String get notificationRuleRoomServerAclDescription => + 'Suppresses notifications for room server access control lists (ACL).'; + + @override + String get notificationRuleSuppressEdits => 'Suppress Edits'; + + @override + String get notificationRuleSuppressEditsDescription => + 'Suppresses notifications for edited messages.'; + + @override + String get notificationRuleCall => 'Call'; + + @override + String get notificationRuleCallDescription => + 'Notifies the user about calls.'; + + @override + String get notificationRuleEncryptedRoomOneToOne => + 'Encrypted Room One-to-One'; + + @override + String get notificationRuleEncryptedRoomOneToOneDescription => + 'Notifies the user about messages in encrypted one-to-one rooms.'; + + @override + String get notificationRuleRoomOneToOne => 'Room One-to-One'; + + @override + String get notificationRuleRoomOneToOneDescription => + 'Notifies the user about messages in one-to-one rooms.'; + + @override + String get notificationRuleMessage => 'Message'; + + @override + String get notificationRuleMessageDescription => + 'Notifies the user about general messages.'; + + @override + String get notificationRuleEncrypted => 'Encrypted'; + + @override + String get notificationRuleEncryptedDescription => + 'Notifies the user about messages in encrypted rooms.'; + + @override + String get notificationRuleJitsi => 'Jitsi'; + + @override + String get notificationRuleJitsiDescription => + 'Notifies the user about Jitsi widget events.'; + + @override + String get notificationRuleServerAcl => 'Suppress Server ACL Events'; + + @override + String get notificationRuleServerAclDescription => + 'Suppresses notifications for Server ACL events.'; + + @override + String unknownPushRule(String rule) { + return 'Unknown push rule \'$rule\''; + } + + @override + String get deletePushRuleCanNotBeUndone => + 'If you delete this notification setting, this can not be undone.'; + + @override + String get more => 'More'; + + @override + String get shareKeysWith => 'Share keys with...'; + + @override + String get shareKeysWithDescription => + 'Which devices should be trusted so that they can read along your messages in encrypted chats?'; + + @override + String get allDevices => 'All devices'; + + @override + String get crossVerifiedDevicesIfEnabled => + 'Cross verified devices if enabled'; + + @override + String get crossVerifiedDevices => 'Cross verified devices'; + + @override + String get verifiedDevicesOnly => 'Verified devices only'; + + @override + String get takeAPhoto => 'Take a photo'; + + @override + String get recordAVideo => 'Record a video'; + + @override + String get optionalMessage => '(Optional) message...'; + + @override + String get notSupportedOnThisDevice => 'Not supported on this device'; + + @override + String get enterNewChat => 'Enter new chat'; + + @override + String get approve => 'Approve'; + + @override + String get youHaveKnocked => 'You have knocked'; + + @override + String get pleaseWaitUntilInvited => + 'Please wait now, until someone from the room invites you.'; +} diff --git a/lib/generated/l10n/l10n_sr.dart b/lib/generated/l10n/l10n_sr.dart new file mode 100644 index 0000000..e179c6c --- /dev/null +++ b/lib/generated/l10n/l10n_sr.dart @@ -0,0 +1,2741 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'l10n.dart'; + +// ignore_for_file: type=lint + +/// The translations for Serbian (`sr`). +class L10nSr extends L10n { + L10nSr([String locale = 'sr']) : super(locale); + + @override + String get noSendPermission => 'You can\'t send messages here'; + + @override + String get alwaysUse24HourFormat => 'false'; + + @override + String get repeatPassword => 'Repeat password'; + + @override + String get notAnImage => 'Not an image file.'; + + @override + String get setCustomPermissionLevel => 'Set custom permission level'; + + @override + String get setPermissionsLevelDescription => + 'Please choose a predefined role below or enter a custom permission level between 0 and 100.'; + + @override + String get ignoreUser => 'Ignore user'; + + @override + String get normalUser => 'Normal user'; + + @override + String get remove => 'Уклони'; + + @override + String get importNow => 'Import now'; + + @override + String get importEmojis => 'Import Emojis'; + + @override + String get importFromZipFile => 'Import from .zip file'; + + @override + String get exportEmotePack => 'Export Emote pack as .zip'; + + @override + String get replace => 'Replace'; + + @override + String get about => 'О програму'; + + @override + String aboutHomeserver(String homeserver) { + return 'About $homeserver'; + } + + @override + String get accept => 'Прихвати'; + + @override + String acceptedTheInvitation(String username) { + return '$username прихвата позивницу'; + } + + @override + String get account => 'Налог'; + + @override + String activatedEndToEndEncryption(String username) { + return '$username укључи шифровање с краја на крај'; + } + + @override + String get addEmail => 'Додај е-адресу'; + + @override + String get confirmMatrixId => + 'Please confirm your Matrix ID in order to delete your account.'; + + @override + String supposedMxid(String mxid) { + return 'This should be $mxid'; + } + + @override + String get addChatDescription => 'Add a chat description...'; + + @override + String get addToSpace => 'Add to space'; + + @override + String get admin => 'Админ'; + + @override + String get alias => 'алијас'; + + @override + String get all => 'Сви'; + + @override + String get allChats => 'All chats'; + + @override + String get commandHint_roomupgrade => + 'Upgrade this room to the given room version'; + + @override + String get commandHint_googly => 'Send some googly eyes'; + + @override + String get commandHint_cuddle => 'Send a cuddle'; + + @override + String get commandHint_hug => 'Send a hug'; + + @override + String googlyEyesContent(String senderName) { + return '$senderName sends you googly eyes'; + } + + @override + String cuddleContent(String senderName) { + return '$senderName cuddles you'; + } + + @override + String hugContent(String senderName) { + return '$senderName hugs you'; + } + + @override + String answeredTheCall(String senderName) { + return '$senderName одговори на позив'; + } + + @override + String get anyoneCanJoin => 'свако може да се придружи'; + + @override + String get appLock => 'Закључавање апликације'; + + @override + String get appLockDescription => + 'Lock the app when not using with a pin code'; + + @override + String get archive => 'Архива'; + + @override + String get areGuestsAllowedToJoin => 'Да ли је гостима дозвољен приступ'; + + @override + String get areYouSure => 'Сигурни сте?'; + + @override + String get areYouSureYouWantToLogout => 'Заиста желите да се одјавите?'; + + @override + String get askSSSSSign => + 'Да бисте могли да пријавите другу особу, унесите своју безбедносну фразу или кључ опоравка.'; + + @override + String askVerificationRequest(String username) { + return 'Прихватате ли захтев за верификацију од корисника $username?'; + } + + @override + String get autoplayImages => + 'Automatically play animated stickers and emotes'; + + @override + String badServerLoginTypesException(String serverVersions, + String supportedVersions, Object suportedVersions) { + return 'Домаћи сервер подржава начине пријаве:\n$serverVersions\nали ова апликација подржава само:\n$supportedVersions'; + } + + @override + String get sendTypingNotifications => 'Send typing notifications'; + + @override + String get swipeRightToLeftToReply => 'Swipe right to left to reply'; + + @override + String get sendOnEnter => 'Send on enter'; + + @override + String badServerVersionsException(String serverVersions, + String supportedVersions, Object serverVerions, Object suportedVersions) { + return 'Домаћи сервер подржава верзије:\n$serverVersions\nали ова апликација подржава само $supportedVersions'; + } + + @override + String countChatsAndCountParticipants(int chats, int participants) { + return '$chats chats and $participants participants'; + } + + @override + String get noMoreChatsFound => 'No more chats found...'; + + @override + String get noChatsFoundHere => + 'No chats found here yet. Start a new chat with someone by using the button below. ⤵️'; + + @override + String get joinedChats => 'Joined chats'; + + @override + String get unread => 'Unread'; + + @override + String get space => 'Space'; + + @override + String get spaces => 'Spaces'; + + @override + String get banFromChat => 'Забрани у ћаскању'; + + @override + String get banned => 'Забрањен'; + + @override + String bannedUser(String username, String targetName) { + return '$username забрани корисника $targetName'; + } + + @override + String get blockDevice => 'Блокирај уређај'; + + @override + String get blocked => 'Блокиран'; + + @override + String get botMessages => 'Поруке Бота'; + + @override + String get cancel => 'Откажи'; + + @override + String cantOpenUri(String uri) { + return 'Can\'t open the URI $uri'; + } + + @override + String get changeDeviceName => 'Промени назив уређаја'; + + @override + String changedTheChatAvatar(String username) { + return '$username промени аватар ћаскања'; + } + + @override + String changedTheChatDescriptionTo(String username, String description) { + return '$username промени опис ћаскања у: „$description“'; + } + + @override + String changedTheChatNameTo(String username, String chatname) { + return '$username промени назив ћаскања у: „$chatname“'; + } + + @override + String changedTheChatPermissions(String username) { + return '$username измени дозволе ћаскања'; + } + + @override + String changedTheDisplaynameTo(String username, String displayname) { + return '$username промени приказно име на: „$displayname“'; + } + + @override + String changedTheGuestAccessRules(String username) { + return '$username измени правила за приступ гостију'; + } + + @override + String changedTheGuestAccessRulesTo(String username, String rules) { + return '$username измени правила за приступ гостију на: $rules'; + } + + @override + String changedTheHistoryVisibility(String username) { + return '$username измени видљивост историје'; + } + + @override + String changedTheHistoryVisibilityTo(String username, String rules) { + return '$username измени видљивост историје на: $rules'; + } + + @override + String changedTheJoinRules(String username) { + return '$username измени правила приступања'; + } + + @override + String changedTheJoinRulesTo(String username, String joinRules) { + return '$username измени правила приступања на: $joinRules'; + } + + @override + String changedTheProfileAvatar(String username) { + return '$username измени свој аватар'; + } + + @override + String changedTheRoomAliases(String username) { + return '$username измени алијас собе'; + } + + @override + String changedTheRoomInvitationLink(String username) { + return '$username измени везу позивнице'; + } + + @override + String get changePassword => 'Измени лозинку'; + + @override + String get changeTheHomeserver => 'Промени домаћи сервер'; + + @override + String get changeTheme => 'Измените изглед'; + + @override + String get changeTheNameOfTheGroup => 'Измени назив групе'; + + @override + String get changeYourAvatar => 'Измените свој аватар'; + + @override + String get channelCorruptedDecryptError => 'Шифровање је покварено'; + + @override + String get chat => 'Ћаскање'; + + @override + String get yourChatBackupHasBeenSetUp => 'Your chat backup has been set up.'; + + @override + String get chatBackup => 'Копија ћаскања'; + + @override + String get chatBackupDescription => + 'Ваша резервна копија ћаскања је обезбеђена кључем. Немојте да га изгубите.'; + + @override + String get chatDetails => 'Детаљи ћаскања'; + + @override + String get chatHasBeenAddedToThisSpace => 'Chat has been added to this space'; + + @override + String get chats => 'Ћаскања'; + + @override + String get chooseAStrongPassword => 'Изаберите јаку лозинку'; + + @override + String get clearArchive => 'Очисти архиву'; + + @override + String get close => 'Затвори'; + + @override + String get commandHint_markasdm => + 'Mark as direct message room for the giving Matrix ID'; + + @override + String get commandHint_markasgroup => 'Mark as group'; + + @override + String get commandHint_ban => 'Блокирај задатог корисника за ову собу'; + + @override + String get commandHint_clearcache => 'Clear cache'; + + @override + String get commandHint_create => + 'Create an empty group chat\nUse --no-encryption to disable encryption'; + + @override + String get commandHint_discardsession => 'Discard session'; + + @override + String get commandHint_dm => + 'Start a direct chat\nUse --no-encryption to disable encryption'; + + @override + String get commandHint_html => 'Шаљи ХТМЛ обликован текст'; + + @override + String get commandHint_invite => 'Позови задатог корисника у собу'; + + @override + String get commandHint_join => 'Придружи се наведеној соби'; + + @override + String get commandHint_kick => 'Уклони задатог корисника из собе'; + + @override + String get commandHint_leave => 'Напусти ову собу'; + + @override + String get commandHint_me => 'Опишите себе'; + + @override + String get commandHint_myroomavatar => + 'Set your picture for this room (by mxc-uri)'; + + @override + String get commandHint_myroomnick => 'Поставља ваш надимак за ову собу'; + + @override + String get commandHint_op => + 'Подеси ниво задатог корисника (подразумевано: 50)'; + + @override + String get commandHint_plain => 'Шаљи неформатиран текст'; + + @override + String get commandHint_react => 'Шаљи одговор као реакцију'; + + @override + String get commandHint_send => 'Пошаљи текст'; + + @override + String get commandHint_unban => 'Скини забрану задатом кориснику за ову собу'; + + @override + String get commandInvalid => 'Command invalid'; + + @override + String commandMissing(String command) { + return '$command is not a command.'; + } + + @override + String get compareEmojiMatch => + 'Упоредите и проверите да су емоџији идентични као на другом уређају:'; + + @override + String get compareNumbersMatch => + 'Упоредите и проверите да су следећи бројеви идентични као на другом уређају:'; + + @override + String get configureChat => 'Подешавање ћаскања'; + + @override + String get confirm => 'Потврди'; + + @override + String get connect => 'Повежи се'; + + @override + String get contactHasBeenInvitedToTheGroup => 'Особа је позвана у групу'; + + @override + String get containsDisplayName => 'Садржи приказно име'; + + @override + String get containsUserName => 'Садржи корисничко име'; + + @override + String get contentHasBeenReported => + 'Садржај је пријављен администраторима сервера'; + + @override + String get copiedToClipboard => 'Копирано у клипборд'; + + @override + String get copy => 'Копирај'; + + @override + String get copyToClipboard => 'Копирај у клипборд'; + + @override + String couldNotDecryptMessage(String error) { + return 'Не могу да дешифрујем поруку: $error'; + } + + @override + String countParticipants(int count) { + return 'учесника: $count'; + } + + @override + String get create => 'Направи'; + + @override + String createdTheChat(String username) { + return '$username направи ћаскање'; + } + + @override + String get createGroup => 'Create group'; + + @override + String get createNewSpace => 'New space'; + + @override + String get currentlyActive => 'Тренутно активно'; + + @override + String get darkTheme => 'тамни'; + + @override + String dateAndTimeOfDay(String date, String timeOfDay) { + return '$date, $timeOfDay'; + } + + @override + String dateWithoutYear(String month, String day) { + return '$day $month'; + } + + @override + String dateWithYear(String year, String month, String day) { + return '$day $month $year'; + } + + @override + String get deactivateAccountWarning => + 'Ово ће деактивирати ваш кориснички налог. Не може се повратити! Сигурни сте?'; + + @override + String get defaultPermissionLevel => 'Подразумевани ниво приступа'; + + @override + String get delete => 'Обриши'; + + @override + String get deleteAccount => 'Обриши налог'; + + @override + String get deleteMessage => 'Брисање поруке'; + + @override + String get device => 'Уређај'; + + @override + String get deviceId => 'ИД уређаја'; + + @override + String get devices => 'Уређаји'; + + @override + String get directChats => 'Директна ћаскања'; + + @override + String get allRooms => 'All Group Chats'; + + @override + String get displaynameHasBeenChanged => 'Име за приказ је измењено'; + + @override + String get downloadFile => 'Преузми фајл'; + + @override + String get edit => 'Уреди'; + + @override + String get editBlockedServers => 'Уреди блокиране сервере'; + + @override + String get chatPermissions => 'Chat permissions'; + + @override + String get editDisplayname => 'Уреди име за приказ'; + + @override + String get editRoomAliases => 'Уреди алијасе собе'; + + @override + String get editRoomAvatar => 'Уређује аватар собе'; + + @override + String get emoteExists => 'Емоти већ постоји!'; + + @override + String get emoteInvalid => 'Неисправна скраћеница за емоти!'; + + @override + String get emoteKeyboardNoRecents => + 'Recently-used emotes will appear here...'; + + @override + String get emotePacks => 'Пакети емотија за собу'; + + @override + String get emoteSettings => 'Поставке емотија'; + + @override + String get globalChatId => 'Global chat ID'; + + @override + String get accessAndVisibility => 'Access and visibility'; + + @override + String get accessAndVisibilityDescription => + 'Who is allowed to join this chat and how the chat can be discovered.'; + + @override + String get calls => 'Calls'; + + @override + String get customEmojisAndStickers => 'Custom emojis and stickers'; + + @override + String get customEmojisAndStickersBody => + 'Add or share custom emojis or stickers which can be used in any chat.'; + + @override + String get emoteShortcode => 'скраћеница'; + + @override + String get emoteWarnNeedToPick => + 'Морате да изаберете скраћеницу и слику за емоти!'; + + @override + String get emptyChat => 'празно ћаскање'; + + @override + String get enableEmotesGlobally => 'Глобално укључи пакет емотија'; + + @override + String get enableEncryption => 'Укључује шифровање'; + + @override + String get enableEncryptionWarning => + 'Шифровање више нећете моћи да искључите. Сигурни сте?'; + + @override + String get encrypted => 'Шифровано'; + + @override + String get encryption => 'Шифровање'; + + @override + String get encryptionNotEnabled => 'Шифровање није укључено'; + + @override + String endedTheCall(String senderName) { + return '$senderName заврши позив'; + } + + @override + String get enterAnEmailAddress => 'Унесите адресу е-поште'; + + @override + String get homeserver => 'Homeserver'; + + @override + String get enterYourHomeserver => 'Унесите свој домаћи сервер'; + + @override + String errorObtainingLocation(String error) { + return 'Error obtaining location: $error'; + } + + @override + String get everythingReady => 'Све је спремно!'; + + @override + String get extremeOffensive => 'Екстремно увредљив'; + + @override + String get fileName => 'Назив фајла'; + + @override + String get fluffychat => 'FluffyChat'; + + @override + String get fontSize => 'Величина фонта'; + + @override + String get forward => 'Напред'; + + @override + String get fromJoining => 'од приступања'; + + @override + String get fromTheInvitation => 'од позивања'; + + @override + String get goToTheNewRoom => 'Иди у нову собу'; + + @override + String get group => 'Група'; + + @override + String get chatDescription => 'Chat description'; + + @override + String get chatDescriptionHasBeenChanged => 'Chat description changed'; + + @override + String get groupIsPublic => 'Група је јавна'; + + @override + String get groups => 'Групе'; + + @override + String groupWith(String displayname) { + return 'Група са корисником $displayname'; + } + + @override + String get guestsAreForbidden => 'гости су забрањени'; + + @override + String get guestsCanJoin => 'гости могу приступити'; + + @override + String hasWithdrawnTheInvitationFor(String username, String targetName) { + return '$username поништи позивницу за корисника $targetName'; + } + + @override + String get help => 'Помоћ'; + + @override + String get hideRedactedEvents => 'Сакриј редиговане догађаје'; + + @override + String get hideRedactedMessages => 'Hide redacted messages'; + + @override + String get hideRedactedMessagesBody => + 'If someone redacts a message, this message won\'t be visible in the chat anymore.'; + + @override + String get hideInvalidOrUnknownMessageFormats => + 'Hide invalid or unknown message formats'; + + @override + String get howOffensiveIsThisContent => 'Колико је увредљив овај садржај?'; + + @override + String get id => 'ИД'; + + @override + String get identity => 'Идентитет'; + + @override + String get block => 'Block'; + + @override + String get blockedUsers => 'Blocked users'; + + @override + String get blockListDescription => + 'You can block users who are disturbing you. You won\'t be able to receive any messages or room invites from the users on your personal block list.'; + + @override + String get blockUsername => 'Ignore username'; + + @override + String get iHaveClickedOnLink => 'Кликнуо сам на везу'; + + @override + String get incorrectPassphraseOrKey => 'Неисправна фраза или кључ опоравка'; + + @override + String get inoffensive => 'Није увредљив'; + + @override + String get inviteContact => 'Позивање особа'; + + @override + String inviteContactToGroupQuestion(Object contact, Object groupName) { + return 'Do you want to invite $contact to the chat \"$groupName\"?'; + } + + @override + String inviteContactToGroup(String groupName) { + return 'Позови особу у групу $groupName'; + } + + @override + String get noChatDescriptionYet => 'No chat description created yet.'; + + @override + String get tryAgain => 'Try again'; + + @override + String get invalidServerName => 'Invalid server name'; + + @override + String get invited => 'Позван'; + + @override + String get redactMessageDescription => + 'The message will be redacted for all participants in this conversation. This cannot be undone.'; + + @override + String get optionalRedactReason => + '(Optional) Reason for redacting this message...'; + + @override + String invitedUser(String username, String targetName) { + return '$username позва корисника $targetName'; + } + + @override + String get invitedUsersOnly => 'само позвани корисници'; + + @override + String get inviteForMe => 'Позивнице за мене'; + + @override + String inviteText(String username, String link) { + return '$username вас позива у FluffyChat. \n1. Инсталирајте FluffyChat: https://fluffychat.im \n2. Региструјте се или пријавите \n3. Отворите везу позивнице: $link'; + } + + @override + String get isTyping => 'куца…'; + + @override + String joinedTheChat(String username) { + return '$username се придружи ћаскању'; + } + + @override + String get joinRoom => 'Придружи се соби'; + + @override + String kicked(String username, String targetName) { + return '$username избаци корисника $targetName'; + } + + @override + String kickedAndBanned(String username, String targetName) { + return '$username избаци и забрани корисника $targetName'; + } + + @override + String get kickFromChat => 'Избаци из ћаскања'; + + @override + String lastActiveAgo(String localizedTimeShort) { + return 'Последња активност: $localizedTimeShort'; + } + + @override + String get leave => 'Напусти'; + + @override + String get leftTheChat => 'Напусти ћаскање'; + + @override + String get license => 'Лиценца'; + + @override + String get lightTheme => 'светли'; + + @override + String loadCountMoreParticipants(int count) { + return 'Учитај још $count учесника'; + } + + @override + String get dehydrate => 'Export session and wipe device'; + + @override + String get dehydrateWarning => + 'This action cannot be undone. Ensure you safely store the backup file.'; + + @override + String get dehydrateTor => 'TOR Users: Export session'; + + @override + String get dehydrateTorLong => + 'For TOR users, it is recommended to export the session before closing the window.'; + + @override + String get hydrateTor => 'TOR Users: Import session export'; + + @override + String get hydrateTorLong => + 'Did you export your session last time on TOR? Quickly import it and continue chatting.'; + + @override + String get hydrate => 'Restore from backup file'; + + @override + String get loadingPleaseWait => 'Учитавам… Сачекајте.'; + + @override + String get loadMore => 'Учитај још…'; + + @override + String get locationDisabledNotice => + 'Location services are disabled. Please enable them to be able to share your location.'; + + @override + String get locationPermissionDeniedNotice => + 'Location permission denied. Please grant them to be able to share your location.'; + + @override + String get login => 'Пријава'; + + @override + String logInTo(String homeserver) { + return 'Пријава на $homeserver'; + } + + @override + String get logout => 'Одјава'; + + @override + String get memberChanges => 'Измене чланова'; + + @override + String get mention => 'Спомени'; + + @override + String get messages => 'Поруке'; + + @override + String get messagesStyle => 'Messages:'; + + @override + String get moderator => 'Модератор'; + + @override + String get muteChat => 'Ућуткај ћаскање'; + + @override + String get needPantalaimonWarning => + 'За сада, потребан је Пантелејмон (Pantalaimon) да бисте користили шифровање с краја на крај.'; + + @override + String get newChat => 'Ново ћаскање'; + + @override + String get newMessageInFluffyChat => 'Нова порука — FluffyChat'; + + @override + String get newVerificationRequest => 'Нови захтев за верификацију!'; + + @override + String get next => 'Следеће'; + + @override + String get no => 'Не'; + + @override + String get noConnectionToTheServer => 'Нема везе са сервером'; + + @override + String get noEmotesFound => 'Нема емотија. 😕'; + + @override + String get noEncryptionForPublicRooms => + 'Шифровање се може активирати након што соба престане да буде јавно доступна.'; + + @override + String get noGoogleServicesWarning => + 'Чини се да немате Гугл услуге на телефону. То је добра одлука за вашу приватност! Да би се протурале нотификације у FluffyChat, препоручујемо коришћење https://microg.org/ или https://unifiedpush.org/'; + + @override + String noMatrixServer(String server1, String server2) { + return '$server1 is no matrix server, use $server2 instead?'; + } + + @override + String get shareInviteLink => 'Share invite link'; + + @override + String get scanQrCode => 'Scan QR code'; + + @override + String get none => 'Ништа'; + + @override + String get noPasswordRecoveryDescription => + 'Још нисте одредили начин за опоравак лозинке.'; + + @override + String get noPermission => 'Нема дозвола'; + + @override + String get noRoomsFound => 'Нисам нашао собе…'; + + @override + String get notifications => 'Обавештења'; + + @override + String get notificationsEnabledForThisAccount => + 'Обавештења укључена за овај налог'; + + @override + String numUsersTyping(int count) { + return '$count корисника куца…'; + } + + @override + String get obtainingLocation => 'Obtaining location…'; + + @override + String get offensive => 'Увредљив'; + + @override + String get offline => 'Ван везе'; + + @override + String get ok => 'у реду'; + + @override + String get online => 'На вези'; + + @override + String get onlineKeyBackupEnabled => 'Резерва кључева на мрежи је укључена'; + + @override + String get oopsPushError => + 'Нажалост, дошло је до грешке при подешавању дотурања обавештења.'; + + @override + String get oopsSomethingWentWrong => 'Нешто је пошло наопако…'; + + @override + String get openAppToReadMessages => 'Отворите апликацију да прочитате поруке'; + + @override + String get openCamera => 'Отвори камеру'; + + @override + String get openVideoCamera => 'Open camera for a video'; + + @override + String get oneClientLoggedOut => 'One of your clients has been logged out'; + + @override + String get addAccount => 'Add account'; + + @override + String get editBundlesForAccount => 'Edit bundles for this account'; + + @override + String get addToBundle => 'Add to bundle'; + + @override + String get removeFromBundle => 'Remove from this bundle'; + + @override + String get bundleName => 'Bundle name'; + + @override + String get enableMultiAccounts => + '(BETA) Enable multi accounts on this device'; + + @override + String get openInMaps => 'Open in maps'; + + @override + String get link => 'Link'; + + @override + String get serverRequiresEmail => + 'This server needs to validate your email address for registration.'; + + @override + String get or => 'или'; + + @override + String get participant => 'Учесник'; + + @override + String get passphraseOrKey => 'фраза или кључ опоравка'; + + @override + String get password => 'Лозинка'; + + @override + String get passwordForgotten => 'Заборављена лозинка'; + + @override + String get passwordHasBeenChanged => 'Лозинка је промењена'; + + @override + String get hideMemberChangesInPublicChats => + 'Hide member changes in public chats'; + + @override + String get hideMemberChangesInPublicChatsBody => + 'Do not show in the chat timeline if someone joins or leaves a public chat to improve readability.'; + + @override + String get overview => 'Overview'; + + @override + String get notifyMeFor => 'Notify me for'; + + @override + String get passwordRecoverySettings => 'Password recovery settings'; + + @override + String get passwordRecovery => 'Опоравак лозинке'; + + @override + String get people => 'Људи'; + + @override + String get pickImage => 'Избор слике'; + + @override + String get pin => 'Закачи'; + + @override + String play(String fileName) { + return 'Пусти $fileName'; + } + + @override + String get pleaseChoose => 'Изаберите'; + + @override + String get pleaseChooseAPasscode => 'Изаберите код за пролаз'; + + @override + String get pleaseClickOnLink => + 'Кликните на везу у примљеној е-пошти па наставите.'; + + @override + String get pleaseEnter4Digits => + 'Унесите 4 цифре или оставите празно да не закључавате апликацију.'; + + @override + String get pleaseEnterRecoveryKey => 'Please enter your recovery key:'; + + @override + String get pleaseEnterYourPassword => 'Унесите своју лозинку'; + + @override + String get pleaseEnterYourPin => 'Унесите свој пин'; + + @override + String get pleaseEnterYourUsername => 'Унесите своје корисничко име'; + + @override + String get pleaseFollowInstructionsOnWeb => + 'Испратите упутства на веб сајту и тапните на „Следеће“.'; + + @override + String get privacy => 'Приватност'; + + @override + String get publicRooms => 'Јавне собе'; + + @override + String get pushRules => 'Правила протурања'; + + @override + String get reason => 'Разлог'; + + @override + String get recording => 'Снимам'; + + @override + String redactedBy(String username) { + return 'Redacted by $username'; + } + + @override + String get directChat => 'Direct chat'; + + @override + String redactedByBecause(String username, String reason) { + return 'Redacted by $username because: \"$reason\"'; + } + + @override + String redactedAnEvent(String username) { + return '$username редигова догађај'; + } + + @override + String get redactMessage => 'Редигуј поруку'; + + @override + String get register => 'Регистрација'; + + @override + String get reject => 'Одбиј'; + + @override + String rejectedTheInvitation(String username) { + return '$username одби позивницу'; + } + + @override + String get rejoin => 'Поново се придружи'; + + @override + String get removeAllOtherDevices => 'Уклони све остале уређаје'; + + @override + String removedBy(String username) { + return 'Уклонио корисник $username'; + } + + @override + String get removeDevice => 'Уклони уређај'; + + @override + String get unbanFromChat => 'Уклони изгнанство'; + + @override + String get removeYourAvatar => 'Уклоните свој аватар'; + + @override + String get replaceRoomWithNewerVersion => 'Замени собу новијом верзијом'; + + @override + String get reply => 'Одговори'; + + @override + String get reportMessage => 'Пријави поруку'; + + @override + String get translateMessage => 'Translate message'; + + @override + String get translatedMessage => 'Translated message'; + + @override + String get errorTranslatingMessage => + 'An error has occured while translating the message.'; + + @override + String get recoverMessage => 'Recover message'; + + @override + String get recoveredMessage => 'Recovered message'; + + @override + String get errorRecoveringMessage => + 'An error has occured while recovering the message.'; + + @override + String get errorRecoveringMessageNoAdmin => + 'This feature is available on Synapse homeservers only for adminstrators.'; + + @override + String get requestPermission => 'Затражи дозволу'; + + @override + String get roomHasBeenUpgraded => 'Соба је надограђена'; + + @override + String get roomVersion => 'Верзија собе'; + + @override + String get saveFile => 'Save file'; + + @override + String get retry => 'Retry'; + + @override + String get search => 'Претражи'; + + @override + String get security => 'Безбедност'; + + @override + String get recoveryKey => 'Recovery key'; + + @override + String get recoveryKeyLost => 'Recovery key lost?'; + + @override + String seenByUser(String username) { + return '$username прегледа'; + } + + @override + String get send => 'Пошаљи'; + + @override + String get sendAMessage => 'Пошаљи поруку'; + + @override + String get sendAsText => 'Send as text'; + + @override + String get sendAudio => 'Пошаљи аудио'; + + @override + String get sendFile => 'Пошаљи фајл'; + + @override + String get sendImage => 'Пошаљи слику'; + + @override + String sendImages(int count) { + return 'Send $count image'; + } + + @override + String get sendMessages => 'Слање порука'; + + @override + String get sendOriginal => 'Пошаљи оригинал'; + + @override + String get sendSticker => 'Send sticker'; + + @override + String get sendVideo => 'Пошаљи видео'; + + @override + String sentAFile(String username) { + return '$username посла фајл'; + } + + @override + String sentAnAudio(String username) { + return '$username посла аудио'; + } + + @override + String sentAPicture(String username) { + return '$username посла слику'; + } + + @override + String sentASticker(String username) { + return '$username посла налепницу'; + } + + @override + String sentAVideo(String username) { + return '$username посла видео'; + } + + @override + String sentCallInformations(String senderName) { + return '$senderName посла податке о позиву'; + } + + @override + String get separateChatTypes => 'Separate Direct Chats and Groups'; + + @override + String get setAsCanonicalAlias => 'Постави као главни алијас'; + + @override + String get setCustomEmotes => 'постави посебне емотије'; + + @override + String get setChatDescription => 'Set chat description'; + + @override + String get setInvitationLink => 'Поставља везу позивнице'; + + @override + String get setPermissionsLevel => 'Одреди ниво дозволе'; + + @override + String get setStatus => 'Постави статус'; + + @override + String get settings => 'Поставке'; + + @override + String get share => 'Подели'; + + @override + String sharedTheLocation(String username) { + return '$username подели локацију'; + } + + @override + String get shareLocation => 'Share location'; + + @override + String get showPassword => 'Прикажи лозинку'; + + @override + String get presenceStyle => 'Presence:'; + + @override + String get hideAvatarsInInvites => 'Hide avatars in invites'; + + @override + String get hideAvatarsInInvitesDescription => + 'Do not show room avatars in invites'; + + @override + String get presencesToggle => 'Show status messages from other users'; + + @override + String get pureBlackToggle => 'Pure Black'; + + @override + String get singlesignon => 'Јединствена пријава'; + + @override + String get skip => 'Прескочи'; + + @override + String get sourceCode => 'Изворни код'; + + @override + String get spaceIsPublic => 'Space is public'; + + @override + String get spaceName => 'Space name'; + + @override + String startedACall(String senderName) { + return '$senderName започе позив'; + } + + @override + String get startFirstChat => 'Start your first chat'; + + @override + String get status => 'Стање'; + + @override + String get statusExampleMessage => 'Како сте данас?'; + + @override + String get submit => 'Пошаљи'; + + @override + String get synchronizingPleaseWait => 'Synchronizing… Please wait.'; + + @override + String synchronizingPleaseWaitCounter(String percentage) { + return ' Synchronizing… ($percentage%)'; + } + + @override + String get systemTheme => 'системски'; + + @override + String get theyDontMatch => 'Не поклапају се'; + + @override + String get theyMatch => 'Поклапају се'; + + @override + String get title => 'FluffyChat'; + + @override + String get toggleFavorite => 'Мењај омиљеност'; + + @override + String get toggleMuted => 'Мењај ућутканост'; + + @override + String get toggleUnread => 'Означи не/прочитано'; + + @override + String get tooManyRequestsWarning => 'Превише упита. Покушајте касније!'; + + @override + String get transferFromAnotherDevice => 'Пренос са другог уређаја'; + + @override + String get tryToSendAgain => 'Покушај слање поново'; + + @override + String get unavailable => 'Недоступно'; + + @override + String unbannedUser(String username, String targetName) { + return '$username одблокира корисника $targetName'; + } + + @override + String get unblockDevice => 'Одблокирај уређај'; + + @override + String get unknownDevice => 'Непознат уређај'; + + @override + String get unknownEncryptionAlgorithm => 'Непознат алгоритам шифровања'; + + @override + String unknownEvent(String type) { + return 'Непознат догађај „$type“'; + } + + @override + String get unmuteChat => 'Врати обавештења'; + + @override + String get unpin => 'Откачи'; + + @override + String unreadChats(int unreadCount) { + String _temp0 = intl.Intl.pluralLogic( + unreadCount, + locale: localeName, + other: 'непрочитаних ћаскања: $unreadCount', + ); + return '$_temp0'; + } + + @override + String userAndOthersAreTyping(String username, int count) { + return '$username и $count корисника куцају…'; + } + + @override + String userAndUserAreTyping(String username, String username2) { + return '$username и $username2 куцају…'; + } + + @override + String userIsTyping(String username) { + return '$username куца…'; + } + + @override + String userLeftTheChat(String username) { + return '$username напусти ћаскање'; + } + + @override + String get username => 'Корисничко име'; + + @override + String userSentUnknownEvent(String username, String type) { + return '$username посла $type догађај'; + } + + @override + String get unverified => 'Unverified'; + + @override + String get verified => 'Оверен'; + + @override + String get verify => 'Верификуј'; + + @override + String get verifyStart => 'Покрени верификацију'; + + @override + String get verifySuccess => 'Успешно сте верификовали!'; + + @override + String get verifyTitle => 'Верификујем други налог'; + + @override + String get videoCall => 'Видео позив'; + + @override + String get visibilityOfTheChatHistory => 'Одреди видљивост историје'; + + @override + String get visibleForAllParticipants => 'видљиво свим учесницима'; + + @override + String get visibleForEveryone => 'видљиво свима'; + + @override + String get voiceMessage => 'Гласовна порука'; + + @override + String get waitingPartnerAcceptRequest => + 'Чекам да саговорник прихвати захтев…'; + + @override + String get waitingPartnerEmoji => 'Чекам да саговорник прихвати емоџије…'; + + @override + String get waitingPartnerNumbers => 'Чекам да саговорник прихвати бројеве…'; + + @override + String get wallpaper => 'Тапета'; + + @override + String get warning => 'Упозорење!'; + + @override + String get weSentYouAnEmail => 'Послали смо вам е-пошту'; + + @override + String get whoCanPerformWhichAction => 'ко може шта да ради'; + + @override + String get whoIsAllowedToJoinThisGroup => 'Ко може да се придружи групи'; + + @override + String get whyDoYouWantToReportThis => 'Зашто желите ово да пријавите?'; + + @override + String get wipeChatBackup => + 'Да обришем резервну копију како би направио нови сигурносни кључ?'; + + @override + String get withTheseAddressesRecoveryDescription => + 'Са овим адресама можете опоравити своју лозинку.'; + + @override + String get writeAMessage => 'напишите поруку…'; + + @override + String get yes => 'Да'; + + @override + String get you => 'Ви'; + + @override + String get youAreNoLongerParticipatingInThisChat => + 'Више не учествујете у овом ћаскању'; + + @override + String get youHaveBeenBannedFromThisChat => 'Забрањено вам је ово ћаскање'; + + @override + String get yourPublicKey => 'Ваш јавни кључ'; + + @override + String get messageInfo => 'Message info'; + + @override + String get time => 'Time'; + + @override + String get messageType => 'Message Type'; + + @override + String get sender => 'Sender'; + + @override + String get openGallery => 'Open gallery'; + + @override + String get removeFromSpace => 'Remove from space'; + + @override + String get addToSpaceDescription => 'Select a space to add this chat to it.'; + + @override + String get start => 'Start'; + + @override + String get pleaseEnterRecoveryKeyDescription => + 'To unlock your old messages, please enter your recovery key that has been generated in a previous session. Your recovery key is NOT your password.'; + + @override + String get publish => 'Publish'; + + @override + String videoWithSize(String size) { + return 'Video ($size)'; + } + + @override + String get openChat => 'Open Chat'; + + @override + String get markAsRead => 'Mark as read'; + + @override + String get reportUser => 'Report user'; + + @override + String get dismiss => 'Dismiss'; + + @override + String reactedWith(String sender, String reaction) { + return '$sender reacted with $reaction'; + } + + @override + String get pinMessage => 'Pin to room'; + + @override + String get confirmEventUnpin => + 'Are you sure to permanently unpin the event?'; + + @override + String get emojis => 'Emojis'; + + @override + String get placeCall => 'Place call'; + + @override + String get voiceCall => 'Voice call'; + + @override + String get unsupportedAndroidVersion => 'Unsupported Android version'; + + @override + String get unsupportedAndroidVersionLong => + 'This feature requires a newer Android version. Please check for updates or Lineage OS support.'; + + @override + String get videoCallsBetaWarning => + 'Please note that video calls are currently in beta. They might not work as expected or work at all on all platforms.'; + + @override + String get experimentalVideoCalls => 'Experimental video calls'; + + @override + String get emailOrUsername => 'Email or username'; + + @override + String get indexedDbErrorTitle => 'Private mode issues'; + + @override + String get indexedDbErrorLong => + 'The message storage is unfortunately not enabled in private mode by default.\nPlease visit\n - about:config\n - set dom.indexedDB.privateBrowsing.enabled to true\nOtherwise, it is not possible to run Extera.'; + + @override + String switchToAccount(String number) { + return 'Switch to account $number'; + } + + @override + String get nextAccount => 'Next account'; + + @override + String get previousAccount => 'Previous account'; + + @override + String get addWidget => 'Add widget'; + + @override + String get widgetVideo => 'Video'; + + @override + String get widgetEtherpad => 'Text note'; + + @override + String get widgetJitsi => 'Jitsi Meet'; + + @override + String get widgetCustom => 'Custom'; + + @override + String get widgetName => 'Name'; + + @override + String get widgetUrlError => 'This is not a valid URL.'; + + @override + String get widgetNameError => 'Please provide a display name.'; + + @override + String get errorAddingWidget => 'Error adding the widget.'; + + @override + String get youRejectedTheInvitation => 'You rejected the invitation'; + + @override + String get youJoinedTheChat => 'You joined the chat'; + + @override + String get youAcceptedTheInvitation => '👍 You accepted the invitation'; + + @override + String youBannedUser(String user) { + return 'You banned $user'; + } + + @override + String youHaveWithdrawnTheInvitationFor(String user) { + return 'You have withdrawn the invitation for $user'; + } + + @override + String youInvitedToBy(String alias) { + return '📩 You have been invited via link to:\n$alias'; + } + + @override + String youInvitedBy(String user) { + return '📩 You have been invited by $user'; + } + + @override + String invitedBy(String user) { + return '📩 Invited by $user'; + } + + @override + String youInvitedUser(String user) { + return '📩 You invited $user'; + } + + @override + String youKicked(String user) { + return '👞 You kicked $user'; + } + + @override + String youKickedAndBanned(String user) { + return '🙅 You kicked and banned $user'; + } + + @override + String youUnbannedUser(String user) { + return 'You unbanned $user'; + } + + @override + String hasKnocked(String user) { + return '🚪 $user has knocked'; + } + + @override + String get usersMustKnock => 'Users must knock'; + + @override + String get noOneCanJoin => 'No one can join'; + + @override + String userWouldLikeToChangeTheChat(String user) { + return '$user would like to join the chat.'; + } + + @override + String get noPublicLinkHasBeenCreatedYet => + 'No public link has been created yet'; + + @override + String get knock => 'Knock'; + + @override + String get users => 'Users'; + + @override + String get unlockOldMessages => 'Unlock old messages'; + + @override + String get storeInSecureStorageDescription => + 'Store the recovery key in the secure storage of this device.'; + + @override + String get saveKeyManuallyDescription => + 'Save this key manually by triggering the system share dialog or clipboard.'; + + @override + String get storeInAndroidKeystore => 'Store in Android KeyStore'; + + @override + String get storeInAppleKeyChain => 'Store in Apple KeyChain'; + + @override + String get storeSecurlyOnThisDevice => 'Store securely on this device'; + + @override + String countFiles(int count) { + return '$count files'; + } + + @override + String get user => 'User'; + + @override + String get custom => 'Custom'; + + @override + String get foregroundServiceRunning => + 'This notification appears when the foreground service is running.'; + + @override + String get screenSharingTitle => 'screen sharing'; + + @override + String get screenSharingDetail => 'You are sharing your screen in Extera'; + + @override + String get callingPermissions => 'Calling permissions'; + + @override + String get callingAccount => 'Calling account'; + + @override + String get callingAccountDetails => + 'Allows Extera to use the native android dialer app.'; + + @override + String get appearOnTop => 'Appear on top'; + + @override + String get appearOnTopDetails => + 'Allows the app to appear on top (not needed if you already have Fluffychat setup as a calling account)'; + + @override + String get otherCallingPermissions => + 'Microphone, camera and other Extera permissions'; + + @override + String get whyIsThisMessageEncrypted => 'Why is this message unreadable?'; + + @override + String get noKeyForThisMessage => + 'This can happen if the message was sent before you have signed in to your account at this device.\n\nIt is also possible that the sender has blocked your device or something went wrong with the internet connection.\n\nAre you able to read the message on another session? Then you can transfer the message from it! Go to Settings > Devices and make sure that your devices have verified each other. When you open the room the next time and both sessions are in the foreground, the keys will be transmitted automatically.\n\nDo you not want to lose the keys when logging out or switching devices? Make sure that you have enabled the chat backup in the settings.'; + + @override + String get newGroup => 'New group'; + + @override + String get newSpace => 'New space'; + + @override + String get enterSpace => 'Enter space'; + + @override + String get enterRoom => 'Enter room'; + + @override + String get allSpaces => 'All spaces'; + + @override + String numChats(String number) { + return '$number chats'; + } + + @override + String get hideUnimportantStateEvents => 'Hide unimportant state events'; + + @override + String get hidePresences => 'Hide Status List?'; + + @override + String get doNotShowAgain => 'Do not show again'; + + @override + String wasDirectChatDisplayName(String oldDisplayName) { + return 'Empty chat (was $oldDisplayName)'; + } + + @override + String get newSpaceDescription => + 'Spaces allows you to consolidate your chats and build private or public communities.'; + + @override + String get encryptThisChat => 'Encrypt this chat'; + + @override + String get disableEncryptionWarning => + 'For security reasons you can not disable encryption in a chat, where it has been enabled before.'; + + @override + String get sorryThatsNotPossible => 'Sorry... that is not possible'; + + @override + String get deviceKeys => 'Device keys:'; + + @override + String get reopenChat => 'Reopen chat'; + + @override + String get noBackupWarning => + 'Warning! Without enabling chat backup, you will lose access to your encrypted messages. It is highly recommended to enable the chat backup first before logging out.'; + + @override + String get noOtherDevicesFound => 'No other devices found'; + + @override + String fileIsTooBigForServer(String max) { + return 'Unable to send! The server only supports attachments up to $max.'; + } + + @override + String fileHasBeenSavedAt(String path) { + return 'File has been saved at $path'; + } + + @override + String get jumpToLastReadMessage => 'Jump to last read message'; + + @override + String get readUpToHere => 'Read up to here'; + + @override + String get jump => 'Jump'; + + @override + String get openLinkInBrowser => 'Open link in browser'; + + @override + String get reportErrorDescription => + '😭 Oh no. Something went wrong. If you want, you can report this bug to the developers.'; + + @override + String get report => 'Report'; + + @override + String get signInWithPassword => 'Sign in with password'; + + @override + String get pleaseTryAgainLaterOrChooseDifferentServer => + 'Please try again later or choose a different server.'; + + @override + String signInWith(String provider) { + return 'Sign in with $provider'; + } + + @override + String get profileNotFound => + 'The user could not be found on the server. Maybe there is a connection problem or the user doesn\'t exist.'; + + @override + String get setTheme => 'Set theme:'; + + @override + String get setColorTheme => 'Set color theme:'; + + @override + String get invite => 'Invite'; + + @override + String get inviteGroupChat => '📨 Invite group chat'; + + @override + String get invitePrivateChat => '📨 Invite private chat'; + + @override + String get invalidInput => 'Invalid input!'; + + @override + String wrongPinEntered(int seconds) { + return 'Wrong pin entered! Try again in $seconds seconds...'; + } + + @override + String get pleaseEnterANumber => 'Please enter a number greater than 0'; + + @override + String get archiveRoomDescription => + 'The chat will be moved to the archive. Other users will be able to see that you have left the chat.'; + + @override + String get roomUpgradeDescription => + 'The chat will then be recreated with the new room version. All participants will be notified that they need to switch to the new chat. You can find out more about room versions at https://spec.matrix.org/latest/rooms/'; + + @override + String get removeDevicesDescription => + 'You will be logged out of this device and will no longer be able to receive messages.'; + + @override + String get banUserDescription => + 'The user will be banned from the chat and will not be able to enter the chat again until they are unbanned.'; + + @override + String get unbanUserDescription => + 'The user will be able to enter the chat again if they try.'; + + @override + String get kickUserDescription => + 'The user is kicked out of the chat but not banned. In public chats, the user can rejoin at any time.'; + + @override + String get makeAdminDescription => + 'Once you make this user admin, you may not be able to undo this as they will then have the same permissions as you.'; + + @override + String get pushNotificationsNotAvailable => + 'Push notifications not available'; + + @override + String get learnMore => 'Learn more'; + + @override + String get yourGlobalUserIdIs => 'Your global user-ID is: '; + + @override + String noUsersFoundWithQuery(String query) { + return 'Unfortunately no user could be found with \"$query\". Please check whether you made a typo.'; + } + + @override + String get knocking => 'Knocking'; + + @override + String chatCanBeDiscoveredViaSearchOnServer(String server) { + return 'Chat can be discovered via the search on $server'; + } + + @override + String get searchChatsRooms => 'Search for #chats, @users...'; + + @override + String get nothingFound => 'Nothing found...'; + + @override + String get groupName => 'Group name'; + + @override + String get createGroupAndInviteUsers => 'Create a group and invite users'; + + @override + String get groupCanBeFoundViaSearch => 'Group can be found via search'; + + @override + String get wrongRecoveryKey => + 'Sorry... this does not seem to be the correct recovery key.'; + + @override + String get startConversation => 'Start conversation'; + + @override + String get commandHint_sendraw => 'Send raw json'; + + @override + String get databaseMigrationTitle => 'Database is optimized'; + + @override + String get databaseMigrationBody => 'Please wait. This may take a moment.'; + + @override + String get leaveEmptyToClearStatus => 'Leave empty to clear your status.'; + + @override + String get select => 'Select'; + + @override + String get searchForUsers => 'Search for @users...'; + + @override + String get pleaseEnterYourCurrentPassword => + 'Please enter your current password'; + + @override + String get newPassword => 'New password'; + + @override + String get pleaseChooseAStrongPassword => 'Please choose a strong password'; + + @override + String get passwordsDoNotMatch => 'Passwords do not match'; + + @override + String get passwordIsWrong => 'Your entered password is wrong'; + + @override + String get publicLink => 'Public link'; + + @override + String get publicChatAddresses => 'Public chat addresses'; + + @override + String get createNewAddress => 'Create new address'; + + @override + String get joinSpace => 'Join space'; + + @override + String get publicSpaces => 'Public spaces'; + + @override + String get addChatOrSubSpace => 'Add chat or sub space'; + + @override + String get subspace => 'Subspace'; + + @override + String get decline => 'Decline'; + + @override + String get thisDevice => 'This device:'; + + @override + String get initAppError => 'An error occured while init the app'; + + @override + String get userRole => 'User role'; + + @override + String minimumPowerLevel(String level) { + return '$level is the minimum power level.'; + } + + @override + String searchIn(String chat) { + return 'Search in chat \"$chat\"...'; + } + + @override + String get searchMore => 'Search more...'; + + @override + String get gallery => 'Gallery'; + + @override + String get files => 'Files'; + + @override + String databaseBuildErrorBody(String url, String error) { + return 'Unable to build the SQlite database. The app tries to use the legacy database for now. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String sessionLostBody(String url, String error) { + return 'Your session is lost. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String restoreSessionBody(String url, String error) { + return 'The app now tries to restore your session from the backup. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String forwardMessageTo(String roomName) { + return 'Forward message to $roomName?'; + } + + @override + String get sendReadReceipts => 'Send read receipts'; + + @override + String get sendTypingNotificationsDescription => + 'Other participants in a chat can see when you are typing a new message.'; + + @override + String get sendReadReceiptsDescription => + 'Other participants in a chat can see when you have read a message.'; + + @override + String get formattedMessages => 'Formatted messages'; + + @override + String get formattedMessagesDescription => + 'Display rich message content like bold text using markdown.'; + + @override + String get verifyOtherUser => '🔐 Verify other user'; + + @override + String get verifyOtherUserDescription => + 'If you verify another user, you can be sure that you know who you are really writing to. 💪\n\nWhen you start a verification, you and the other user will see a popup in the app. There you will then see a series of emojis or numbers that you have to compare with each other.\n\nThe best way to do this is to meet up or start a video call. 👭'; + + @override + String get verifyOtherDevice => '🔐 Verify other device'; + + @override + String get verifyOtherDeviceDescription => + 'When you verify another device, those devices can exchange keys, increasing your overall security. 💪 When you start a verification, a popup will appear in the app on both devices. There you will then see a series of emojis or numbers that you have to compare with each other. It\'s best to have both devices handy before you start the verification. 🤳'; + + @override + String acceptedKeyVerification(String sender) { + return '$sender accepted key verification'; + } + + @override + String canceledKeyVerification(String sender) { + return '$sender canceled key verification'; + } + + @override + String completedKeyVerification(String sender) { + return '$sender completed key verification'; + } + + @override + String isReadyForKeyVerification(String sender) { + return '$sender is ready for key verification'; + } + + @override + String requestedKeyVerification(String sender) { + return '$sender requested key verification'; + } + + @override + String startedKeyVerification(String sender) { + return '$sender started key verification'; + } + + @override + String get transparent => 'Transparent'; + + @override + String get incomingMessages => 'Incoming messages'; + + @override + String get stickers => 'Stickers'; + + @override + String get discover => 'Discover'; + + @override + String get commandHint_ignore => 'Ignore the given matrix ID'; + + @override + String get commandHint_unignore => 'Unignore the given matrix ID'; + + @override + String unreadChatsInApp(String appname, String unread) { + return '$appname: $unread unread chats'; + } + + @override + String get noDatabaseEncryption => + 'Database encryption is not supported on this platform'; + + @override + String thereAreCountUsersBlocked(Object count) { + return 'Right now there are $count users blocked.'; + } + + @override + String get restricted => 'Restricted'; + + @override + String get knockRestricted => 'Knock restricted'; + + @override + String goToSpace(Object space) { + return 'Go to space: $space'; + } + + @override + String get markAsUnread => 'Mark as unread'; + + @override + String userLevel(int level) { + return '$level - User'; + } + + @override + String moderatorLevel(int level) { + return '$level - Moderator'; + } + + @override + String adminLevel(int level) { + return '$level - Admin'; + } + + @override + String get changeGeneralChatSettings => 'Change general chat settings'; + + @override + String get inviteOtherUsers => 'Invite other users to this chat'; + + @override + String get changeTheChatPermissions => 'Change the chat permissions'; + + @override + String get changeTheVisibilityOfChatHistory => + 'Change the visibility of the chat history'; + + @override + String get changeTheCanonicalRoomAlias => + 'Change the main public chat address'; + + @override + String get sendRoomNotifications => 'Send a @room notifications'; + + @override + String get changeTheDescriptionOfTheGroup => + 'Change the description of the chat'; + + @override + String get chatPermissionsDescription => + 'Define which power level is necessary for certain actions in this chat. The power levels 0, 50 and 100 are usually representing users, moderators and admins, but any gradation is possible.'; + + @override + String updateInstalled(String version) { + return '🎉 Update $version installed!'; + } + + @override + String get changelog => 'Changelog'; + + @override + String get sendCanceled => 'Sending canceled'; + + @override + String get loginWithMatrixId => 'Login with Matrix-ID'; + + @override + String get discoverHomeservers => 'Discover homeservers'; + + @override + String get whatIsAHomeserver => 'What is a homeserver?'; + + @override + String get homeserverDescription => + 'All your data is stored on the homeserver, just like an email provider. You can choose which homeserver you want to use, while you can still communicate with everyone. Learn more at at https://matrix.org.'; + + @override + String get doesNotSeemToBeAValidHomeserver => + 'Doesn\'t seem to be a compatible homeserver. Wrong URL?'; + + @override + String get calculatingFileSize => 'Calculating file size...'; + + @override + String get prepareSendingAttachment => 'Prepare sending attachment...'; + + @override + String get sendingAttachment => 'Sending attachment...'; + + @override + String get generatingVideoThumbnail => 'Generating video thumbnail...'; + + @override + String get compressVideo => 'Compressing video...'; + + @override + String sendingAttachmentCountOfCount(int index, int length) { + return 'Sending attachment $index of $length...'; + } + + @override + String serverLimitReached(int seconds) { + return 'Server limit reached! Waiting $seconds seconds...'; + } + + @override + String get oneOfYourDevicesIsNotVerified => + 'One of your devices is not verified'; + + @override + String get noticeChatBackupDeviceVerification => + 'Note: When you connect all your devices to the chat backup, they are automatically verified.'; + + @override + String get continueText => 'Continue'; + + @override + String get welcomeText => + 'Hey Hey 👋 This is Extera. You can sign in to any homeserver, which is compatible with https://matrix.org. And then chat with anyone. It\'s a huge decentralized messaging network!'; + + @override + String get blur => 'Blur:'; + + @override + String get opacity => 'Opacity:'; + + @override + String get setWallpaper => 'Set wallpaper'; + + @override + String get manageAccount => 'Manage account'; + + @override + String get noContactInformationProvided => + 'Server does not provide any valid contact information'; + + @override + String get contactServerAdmin => 'Contact server admin'; + + @override + String get contactServerSecurity => 'Contact server security'; + + @override + String get supportPage => 'Support page'; + + @override + String get serverInformation => 'Server information:'; + + @override + String get name => 'Name'; + + @override + String get version => 'Version'; + + @override + String get website => 'Website'; + + @override + String get compress => 'Compress'; + + @override + String get boldText => 'Bold text'; + + @override + String get italicText => 'Italic text'; + + @override + String get strikeThrough => 'Strikethrough'; + + @override + String get pleaseFillOut => 'Please fill out'; + + @override + String get invalidUrl => 'Invalid url'; + + @override + String get addLink => 'Add link'; + + @override + String get unableToJoinChat => + 'Unable to join chat. Maybe the other party has already closed the conversation.'; + + @override + String get previous => 'Previous'; + + @override + String get otherPartyNotLoggedIn => + 'The other party is currently not logged in and therefore cannot receive messages!'; + + @override + String appWantsToUseForLogin(String server) { + return 'Use \'$server\' to log in'; + } + + @override + String get appWantsToUseForLoginDescription => + 'You hereby allow the app and website to share information about you.'; + + @override + String get open => 'Open'; + + @override + String get waitingForServer => 'Waiting for server...'; + + @override + String get appIntroduction => + 'Extera lets you chat with your friends across different messengers. Learn more at https://matrix.org or just tap *Continue*.'; + + @override + String get newChatRequest => '📩 New chat request'; + + @override + String get contentNotificationSettings => 'Content notification settings'; + + @override + String get generalNotificationSettings => 'General notification settings'; + + @override + String get roomNotificationSettings => 'Room notification settings'; + + @override + String get userSpecificNotificationSettings => + 'User specific notification settings'; + + @override + String get otherNotificationSettings => 'Other notification settings'; + + @override + String get notificationRuleContainsUserName => 'Contains User Name'; + + @override + String get notificationRuleContainsUserNameDescription => + 'Notifies the user when a message contains their username.'; + + @override + String get notificationRuleMaster => 'Mute all notifications'; + + @override + String get notificationRuleMasterDescription => + 'Overrides all other rules and disables all notifications.'; + + @override + String get notificationRuleSuppressNotices => 'Suppress Automated Messages'; + + @override + String get notificationRuleSuppressNoticesDescription => + 'Suppresses notifications from automated clients like bots.'; + + @override + String get notificationRuleInviteForMe => 'Invite for Me'; + + @override + String get notificationRuleInviteForMeDescription => + 'Notifies the user when they are invited to a room.'; + + @override + String get notificationRuleMemberEvent => 'Member Event'; + + @override + String get notificationRuleMemberEventDescription => + 'Suppresses notifications for membership events.'; + + @override + String get notificationRuleIsUserMention => 'User Mention'; + + @override + String get notificationRuleIsUserMentionDescription => + 'Notifies the user when they are directly mentioned in a message.'; + + @override + String get notificationRuleContainsDisplayName => 'Contains Display Name'; + + @override + String get notificationRuleContainsDisplayNameDescription => + 'Notifies the user when a message contains their display name.'; + + @override + String get notificationRuleIsRoomMention => 'Room Mention'; + + @override + String get notificationRuleIsRoomMentionDescription => + 'Notifies the user when there is a room mention.'; + + @override + String get notificationRuleRoomnotif => 'Room Notification'; + + @override + String get notificationRuleRoomnotifDescription => + 'Notifies the user when a message contains \'@room\'.'; + + @override + String get notificationRuleTombstone => 'Tombstone'; + + @override + String get notificationRuleTombstoneDescription => + 'Notifies the user about room deactivation messages.'; + + @override + String get notificationRuleReaction => 'Reaction'; + + @override + String get notificationRuleReactionDescription => + 'Suppresses notifications for reactions.'; + + @override + String get notificationRuleRoomServerAcl => 'Room Server ACL'; + + @override + String get notificationRuleRoomServerAclDescription => + 'Suppresses notifications for room server access control lists (ACL).'; + + @override + String get notificationRuleSuppressEdits => 'Suppress Edits'; + + @override + String get notificationRuleSuppressEditsDescription => + 'Suppresses notifications for edited messages.'; + + @override + String get notificationRuleCall => 'Call'; + + @override + String get notificationRuleCallDescription => + 'Notifies the user about calls.'; + + @override + String get notificationRuleEncryptedRoomOneToOne => + 'Encrypted Room One-to-One'; + + @override + String get notificationRuleEncryptedRoomOneToOneDescription => + 'Notifies the user about messages in encrypted one-to-one rooms.'; + + @override + String get notificationRuleRoomOneToOne => 'Room One-to-One'; + + @override + String get notificationRuleRoomOneToOneDescription => + 'Notifies the user about messages in one-to-one rooms.'; + + @override + String get notificationRuleMessage => 'Message'; + + @override + String get notificationRuleMessageDescription => + 'Notifies the user about general messages.'; + + @override + String get notificationRuleEncrypted => 'Encrypted'; + + @override + String get notificationRuleEncryptedDescription => + 'Notifies the user about messages in encrypted rooms.'; + + @override + String get notificationRuleJitsi => 'Jitsi'; + + @override + String get notificationRuleJitsiDescription => + 'Notifies the user about Jitsi widget events.'; + + @override + String get notificationRuleServerAcl => 'Suppress Server ACL Events'; + + @override + String get notificationRuleServerAclDescription => + 'Suppresses notifications for Server ACL events.'; + + @override + String unknownPushRule(String rule) { + return 'Unknown push rule \'$rule\''; + } + + @override + String get deletePushRuleCanNotBeUndone => + 'If you delete this notification setting, this can not be undone.'; + + @override + String get more => 'More'; + + @override + String get shareKeysWith => 'Share keys with...'; + + @override + String get shareKeysWithDescription => + 'Which devices should be trusted so that they can read along your messages in encrypted chats?'; + + @override + String get allDevices => 'All devices'; + + @override + String get crossVerifiedDevicesIfEnabled => + 'Cross verified devices if enabled'; + + @override + String get crossVerifiedDevices => 'Cross verified devices'; + + @override + String get verifiedDevicesOnly => 'Verified devices only'; + + @override + String get takeAPhoto => 'Take a photo'; + + @override + String get recordAVideo => 'Record a video'; + + @override + String get optionalMessage => '(Optional) message...'; + + @override + String get notSupportedOnThisDevice => 'Not supported on this device'; + + @override + String get enterNewChat => 'Enter new chat'; + + @override + String get approve => 'Approve'; + + @override + String get youHaveKnocked => 'You have knocked'; + + @override + String get pleaseWaitUntilInvited => + 'Please wait now, until someone from the room invites you.'; +} diff --git a/lib/generated/l10n/l10n_sv.dart b/lib/generated/l10n/l10n_sv.dart new file mode 100644 index 0000000..8aad21b --- /dev/null +++ b/lib/generated/l10n/l10n_sv.dart @@ -0,0 +1,2755 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'l10n.dart'; + +// ignore_for_file: type=lint + +/// The translations for Swedish (`sv`). +class L10nSv extends L10n { + L10nSv([String locale = 'sv']) : super(locale); + + @override + String get noSendPermission => 'You can\'t send messages here'; + + @override + String get alwaysUse24HourFormat => 'false'; + + @override + String get repeatPassword => 'Upprepa lösenord'; + + @override + String get notAnImage => 'Inte en bildfil.'; + + @override + String get setCustomPermissionLevel => 'Set custom permission level'; + + @override + String get setPermissionsLevelDescription => + 'Please choose a predefined role below or enter a custom permission level between 0 and 100.'; + + @override + String get ignoreUser => 'Ignore user'; + + @override + String get normalUser => 'Normal user'; + + @override + String get remove => 'Ta bort'; + + @override + String get importNow => 'Importera nu'; + + @override + String get importEmojis => 'Importera emojier'; + + @override + String get importFromZipFile => 'Importera från .zip-fil'; + + @override + String get exportEmotePack => 'Exportera Emote-pack som .zip'; + + @override + String get replace => 'Ersätt'; + + @override + String get about => 'Om'; + + @override + String aboutHomeserver(String homeserver) { + return 'About $homeserver'; + } + + @override + String get accept => 'Acceptera'; + + @override + String acceptedTheInvitation(String username) { + return '👍 $username accepterade inbjudan'; + } + + @override + String get account => 'Konto'; + + @override + String activatedEndToEndEncryption(String username) { + return '🔐 $username aktiverade ändpunktskryptering'; + } + + @override + String get addEmail => 'Lägg till e-post'; + + @override + String get confirmMatrixId => + 'Bekräfta ditt Matrix-ID för att radera ditt konto.'; + + @override + String supposedMxid(String mxid) { + return 'Detta bör vara $mxid'; + } + + @override + String get addChatDescription => 'Lägg till en chattbeskrivning…'; + + @override + String get addToSpace => 'Lägg till i utrymme'; + + @override + String get admin => 'Admin'; + + @override + String get alias => 'alias'; + + @override + String get all => 'Alla'; + + @override + String get allChats => 'Alla chattar'; + + @override + String get commandHint_roomupgrade => + 'Upgrade this room to the given room version'; + + @override + String get commandHint_googly => 'Skicka några googly ögon'; + + @override + String get commandHint_cuddle => 'Skicka en omfamning'; + + @override + String get commandHint_hug => 'Skicka en kram'; + + @override + String googlyEyesContent(String senderName) { + return '$senderName skickar dig googly ögon'; + } + + @override + String cuddleContent(String senderName) { + return '$senderName omfamnar dig'; + } + + @override + String hugContent(String senderName) { + return '$senderName kramar dig'; + } + + @override + String answeredTheCall(String senderName) { + return '$senderName besvarade samtalet'; + } + + @override + String get anyoneCanJoin => 'Vem som helst kan gå med'; + + @override + String get appLock => 'App-lås'; + + @override + String get appLockDescription => + 'Lock the app when not using with a pin code'; + + @override + String get archive => 'Arkiv'; + + @override + String get areGuestsAllowedToJoin => 'Får gästanvändare gå med'; + + @override + String get areYouSure => 'Är du säker?'; + + @override + String get areYouSureYouWantToLogout => + 'Är du säker på att du vill logga ut?'; + + @override + String get askSSSSSign => + 'För att kunna signera den andra personen, vänligen ange din lösenfras eller återställningsnyckel för säker lagring.'; + + @override + String askVerificationRequest(String username) { + return 'Acceptera denna verifikationsförfrågan från $username?'; + } + + @override + String get autoplayImages => + 'Automatisk spela upp animerade klistermärken och emoji'; + + @override + String badServerLoginTypesException(String serverVersions, + String supportedVersions, Object suportedVersions) { + return 'Hemma servern stödjer följande inloggnings typer :\n $serverVersions\nMen denna applikation stödjer enbart:\n$supportedVersions'; + } + + @override + String get sendTypingNotifications => 'Skicka skrivnotifikationer'; + + @override + String get swipeRightToLeftToReply => 'Swipe right to left to reply'; + + @override + String get sendOnEnter => 'Skicka med Enter'; + + @override + String badServerVersionsException(String serverVersions, + String supportedVersions, Object serverVerions, Object suportedVersions) { + return 'Hemservern stöjder Spec-versionen:\n$serverVersions\nMen denna app stödjer enbart $supportedVersions'; + } + + @override + String countChatsAndCountParticipants(int chats, int participants) { + return '$chats chats and $participants participants'; + } + + @override + String get noMoreChatsFound => 'No more chats found...'; + + @override + String get noChatsFoundHere => + 'No chats found here yet. Start a new chat with someone by using the button below. ⤵️'; + + @override + String get joinedChats => 'Joined chats'; + + @override + String get unread => 'Unread'; + + @override + String get space => 'Space'; + + @override + String get spaces => 'Spaces'; + + @override + String get banFromChat => 'Bannlys från chatt'; + + @override + String get banned => 'Bannlyst'; + + @override + String bannedUser(String username, String targetName) { + return '$username bannlös $targetName'; + } + + @override + String get blockDevice => 'Blockera Enhet'; + + @override + String get blocked => 'Blockerad'; + + @override + String get botMessages => 'Bot meddelanden'; + + @override + String get cancel => 'Avbryt'; + + @override + String cantOpenUri(String uri) { + return 'Kan inte öppna URL $uri'; + } + + @override + String get changeDeviceName => 'Ändra enhetsnamn'; + + @override + String changedTheChatAvatar(String username) { + return '$username ändrade sin chatt-avatar'; + } + + @override + String changedTheChatDescriptionTo(String username, String description) { + return '$username ändrade chatt-beskrivningen till: \'$description\''; + } + + @override + String changedTheChatNameTo(String username, String chatname) { + return '$username ändrade sitt chatt-namn till: \'$chatname\''; + } + + @override + String changedTheChatPermissions(String username) { + return '$username ändrade chatt-rättigheterna'; + } + + @override + String changedTheDisplaynameTo(String username, String displayname) { + return '$username ändrade visningsnamnet till: \'$displayname\''; + } + + @override + String changedTheGuestAccessRules(String username) { + return '$username ändrade reglerna för gästaccess'; + } + + @override + String changedTheGuestAccessRulesTo(String username, String rules) { + return '$username ändrade reglerna för gästaccess till: $rules'; + } + + @override + String changedTheHistoryVisibility(String username) { + return '$username ändrade historikens synlighet'; + } + + @override + String changedTheHistoryVisibilityTo(String username, String rules) { + return '$username ändrade historikens synlighet till: $rules'; + } + + @override + String changedTheJoinRules(String username) { + return '$username ändrade anslutningsreglerna'; + } + + @override + String changedTheJoinRulesTo(String username, String joinRules) { + return '$username ändrade anslutningsreglerna till $joinRules'; + } + + @override + String changedTheProfileAvatar(String username) { + return '$username ändrade sin avatar'; + } + + @override + String changedTheRoomAliases(String username) { + return '$username ändrade rummets alias'; + } + + @override + String changedTheRoomInvitationLink(String username) { + return '$username ändrade inbjudningslänken'; + } + + @override + String get changePassword => 'Ändra lösenord'; + + @override + String get changeTheHomeserver => 'Ändra hemserver'; + + @override + String get changeTheme => 'Ändra din stil'; + + @override + String get changeTheNameOfTheGroup => 'Ändra namn på gruppen'; + + @override + String get changeYourAvatar => 'Ändra din avatar'; + + @override + String get channelCorruptedDecryptError => 'Krypteringen har blivit korrupt'; + + @override + String get chat => 'Chatt'; + + @override + String get yourChatBackupHasBeenSetUp => + 'Din chatt-backup har konfigurerats.'; + + @override + String get chatBackup => 'Chatt backup'; + + @override + String get chatBackupDescription => + 'Din chatt backup är skyddad av en säkerhetsnyckel. Se till att du inte förlorar den.'; + + @override + String get chatDetails => 'Chatt-detaljer'; + + @override + String get chatHasBeenAddedToThisSpace => + 'Chatt har lagts till i detta utrymme'; + + @override + String get chats => 'Chatter'; + + @override + String get chooseAStrongPassword => 'Välj ett starkt lösenord'; + + @override + String get clearArchive => 'Rensa arkiv'; + + @override + String get close => 'Stäng'; + + @override + String get commandHint_markasdm => + 'Märk som rum för direktmeddelanden för det givante Matrix ID'; + + @override + String get commandHint_markasgroup => 'Märk som grupp'; + + @override + String get commandHint_ban => 'Bannlys användaren från detta rum'; + + @override + String get commandHint_clearcache => 'Rensa cache'; + + @override + String get commandHint_create => + 'Skapa en tom grupp-chatt\nAnvänd --no-encryption för att inaktivera kryptering'; + + @override + String get commandHint_discardsession => 'Kasta bort sessionen'; + + @override + String get commandHint_dm => + 'Starta en direkt-chatt\nAnvänd --no-encryption för att inaktivera kryptering'; + + @override + String get commandHint_html => 'Skicka HTML-formatted text'; + + @override + String get commandHint_invite => 'Bjud in användaren till detta rum'; + + @override + String get commandHint_join => 'Gå med i rum'; + + @override + String get commandHint_kick => 'Ta bort användare från detta rum'; + + @override + String get commandHint_leave => 'Lämna detta rum'; + + @override + String get commandHint_me => 'Beskriv dig själv'; + + @override + String get commandHint_myroomavatar => + 'Sätt din bild för detta rum (by mxc-uri)'; + + @override + String get commandHint_myroomnick => 'Sätt ditt användarnamn för rummet'; + + @override + String get commandHint_op => 'Sätt användarens kraft nivå ( standard: 50)'; + + @override + String get commandHint_plain => 'Skicka oformaterad text'; + + @override + String get commandHint_react => 'Skicka svar som reaktion'; + + @override + String get commandHint_send => 'Skicka text'; + + @override + String get commandHint_unban => 'Tillåt användare i rummet'; + + @override + String get commandInvalid => 'Felaktigt kommando'; + + @override + String commandMissing(String command) { + return '$command är inte ett kommando.'; + } + + @override + String get compareEmojiMatch => 'Vänligen jämför uttryckssymbolerna'; + + @override + String get compareNumbersMatch => 'Vänligen jämför siffrorna'; + + @override + String get configureChat => 'Konfigurera chatt'; + + @override + String get confirm => 'Bekräfta'; + + @override + String get connect => 'Anslut'; + + @override + String get contactHasBeenInvitedToTheGroup => + 'Kontakten har blivit inbjuden till gruppen'; + + @override + String get containsDisplayName => 'Innehåller visningsnamn'; + + @override + String get containsUserName => 'Innehåller användarnamn'; + + @override + String get contentHasBeenReported => + 'Innehållet har rapporterats till server-admins'; + + @override + String get copiedToClipboard => 'Kopierat till urklipp'; + + @override + String get copy => 'Kopiera'; + + @override + String get copyToClipboard => 'Kopiera till urklipp'; + + @override + String couldNotDecryptMessage(String error) { + return 'Kunde ej avkoda meddelande: $error'; + } + + @override + String countParticipants(int count) { + return '$count deltagare'; + } + + @override + String get create => 'Skapa'; + + @override + String createdTheChat(String username) { + return '💬 $username skapade chatten'; + } + + @override + String get createGroup => 'Skapa grupp'; + + @override + String get createNewSpace => 'Nytt utrymme'; + + @override + String get currentlyActive => 'För närvarande aktiv'; + + @override + String get darkTheme => 'Mörkt'; + + @override + String dateAndTimeOfDay(String date, String timeOfDay) { + return '$date, $timeOfDay'; + } + + @override + String dateWithoutYear(String month, String day) { + return '$day-$month'; + } + + @override + String dateWithYear(String year, String month, String day) { + return '$year-$month-$day'; + } + + @override + String get deactivateAccountWarning => + 'Detta kommer att avaktivera ditt konto. Det här går inte att ångra! Är du säker?'; + + @override + String get defaultPermissionLevel => 'Standard behörighetsnivå'; + + @override + String get delete => 'Radera'; + + @override + String get deleteAccount => 'Ta bort konto'; + + @override + String get deleteMessage => 'Ta bort meddelande'; + + @override + String get device => 'Enhet'; + + @override + String get deviceId => 'Enhets-ID'; + + @override + String get devices => 'Enheter'; + + @override + String get directChats => 'Direkt chatt'; + + @override + String get allRooms => 'Alla gruppchattar'; + + @override + String get displaynameHasBeenChanged => 'Visningsnamn har ändrats'; + + @override + String get downloadFile => 'Ladda ner fil'; + + @override + String get edit => 'Ändra'; + + @override + String get editBlockedServers => 'redigera blockerade servrar'; + + @override + String get chatPermissions => 'Chatt-behörigheter'; + + @override + String get editDisplayname => 'Ändra visningsnamn'; + + @override + String get editRoomAliases => 'Redigera rum alias'; + + @override + String get editRoomAvatar => 'redigera rumsavatar'; + + @override + String get emoteExists => 'Dekalen existerar redan!'; + + @override + String get emoteInvalid => 'Ogiltig dekal-kod!'; + + @override + String get emoteKeyboardNoRecents => + 'Nyligen använda emotes kommer dyka upp här…'; + + @override + String get emotePacks => 'Dekalpaket för rummet'; + + @override + String get emoteSettings => 'Emote inställningar'; + + @override + String get globalChatId => 'Global chat ID'; + + @override + String get accessAndVisibility => 'Access and visibility'; + + @override + String get accessAndVisibilityDescription => + 'Who is allowed to join this chat and how the chat can be discovered.'; + + @override + String get calls => 'Calls'; + + @override + String get customEmojisAndStickers => 'Custom emojis and stickers'; + + @override + String get customEmojisAndStickersBody => + 'Add or share custom emojis or stickers which can be used in any chat.'; + + @override + String get emoteShortcode => 'Dekal kod'; + + @override + String get emoteWarnNeedToPick => 'Du måste välja en dekal-kod och en bild!'; + + @override + String get emptyChat => 'Tom chatt'; + + @override + String get enableEmotesGlobally => 'Aktivera dekal-paket globalt'; + + @override + String get enableEncryption => 'Aktivera kryptering'; + + @override + String get enableEncryptionWarning => + 'Du kommer inte ha fortsatt möjlighet till att inaktivera krypteringen. Är du säker?'; + + @override + String get encrypted => 'Krypterad'; + + @override + String get encryption => 'Kryptering'; + + @override + String get encryptionNotEnabled => 'Kryptering är ej aktiverad'; + + @override + String endedTheCall(String senderName) { + return '$senderName avslutade samtalet'; + } + + @override + String get enterAnEmailAddress => 'Ange en e-postaddress'; + + @override + String get homeserver => 'Hemserver'; + + @override + String get enterYourHomeserver => 'Ange din hemserver'; + + @override + String errorObtainingLocation(String error) { + return 'Fel vid erhållande av plats: $error'; + } + + @override + String get everythingReady => 'Allt är klart!'; + + @override + String get extremeOffensive => 'Extremt stötande'; + + @override + String get fileName => 'Filnamn'; + + @override + String get fluffychat => 'FluffyChat'; + + @override + String get fontSize => 'Textstorlek'; + + @override + String get forward => 'Framåt'; + + @override + String get fromJoining => 'Från att gå med'; + + @override + String get fromTheInvitation => 'Från inbjudan'; + + @override + String get goToTheNewRoom => 'Gå till det nya rummet'; + + @override + String get group => 'Grupp'; + + @override + String get chatDescription => 'Chattbeskrivning'; + + @override + String get chatDescriptionHasBeenChanged => 'Chattbeskrivningen ändrades'; + + @override + String get groupIsPublic => 'Gruppen är publik'; + + @override + String get groups => 'Grupper'; + + @override + String groupWith(String displayname) { + return 'Gruppen med $displayname'; + } + + @override + String get guestsAreForbidden => 'Gäster är förbjudna'; + + @override + String get guestsCanJoin => 'Gäster kan ansluta'; + + @override + String hasWithdrawnTheInvitationFor(String username, String targetName) { + return '$username har tagit tillbaka inbjudan för $targetName'; + } + + @override + String get help => 'Hjälp'; + + @override + String get hideRedactedEvents => 'Göm redigerade händelser'; + + @override + String get hideRedactedMessages => 'Hide redacted messages'; + + @override + String get hideRedactedMessagesBody => + 'If someone redacts a message, this message won\'t be visible in the chat anymore.'; + + @override + String get hideInvalidOrUnknownMessageFormats => + 'Hide invalid or unknown message formats'; + + @override + String get howOffensiveIsThisContent => 'Hur stötande är detta innehåll?'; + + @override + String get id => 'ID'; + + @override + String get identity => 'Identitet'; + + @override + String get block => 'blockera'; + + @override + String get blockedUsers => 'Blockerade användare'; + + @override + String get blockListDescription => + 'Du kan blockera användare som stör dig. Du kommer inte få några meddelanden eller rum-inbjudningar från användarna på din personliga blocklista.'; + + @override + String get blockUsername => 'Ignorera användarnamn'; + + @override + String get iHaveClickedOnLink => 'Jag har klickat på länken'; + + @override + String get incorrectPassphraseOrKey => + 'Felaktig lösenordsfras eller åsterställningsnyckel'; + + @override + String get inoffensive => 'Oförargligt'; + + @override + String get inviteContact => 'Bjud in kontakt'; + + @override + String inviteContactToGroupQuestion(Object contact, Object groupName) { + return 'Vill du bjuda in $contact till chatten ”$groupName”?'; + } + + @override + String inviteContactToGroup(String groupName) { + return 'Bjud in kontakt till $groupName'; + } + + @override + String get noChatDescriptionYet => 'Ingen chatt-beskrivning än.'; + + @override + String get tryAgain => 'Försök igen'; + + @override + String get invalidServerName => 'Ogiltigt servernamn'; + + @override + String get invited => 'Inbjuden'; + + @override + String get redactMessageDescription => + 'Meddelandet kommer tas bort för alla medlemmar i denna konversation. Detta kan inte ångras.'; + + @override + String get optionalRedactReason => + '(Frivilligt) Anledning till att ta bort det här meddelandet…'; + + @override + String invitedUser(String username, String targetName) { + return '📩 $username bjöd in $targetName'; + } + + @override + String get invitedUsersOnly => 'Endast inbjudna användare'; + + @override + String get inviteForMe => 'Inbjudning till mig'; + + @override + String inviteText(String username, String link) { + return '$username bjöd in dig till FluffyChat.\n1. Besök fluffychat.im och installera appen\n2. Registrera dig eller logga in\n3. Öppna inbjudningslänk:\n $link'; + } + + @override + String get isTyping => 'skriver…'; + + @override + String joinedTheChat(String username) { + return '👋 $username anslöt till chatten'; + } + + @override + String get joinRoom => 'Anslut till rum'; + + @override + String kicked(String username, String targetName) { + return '👞 $username sparkade ut $targetName'; + } + + @override + String kickedAndBanned(String username, String targetName) { + return '🙅 $username sparkade och bannade $targetName'; + } + + @override + String get kickFromChat => 'Sparka från chatt'; + + @override + String lastActiveAgo(String localizedTimeShort) { + return 'Senast aktiv: $localizedTimeShort'; + } + + @override + String get leave => 'Lämna'; + + @override + String get leftTheChat => 'Lämnade chatten'; + + @override + String get license => 'Licens'; + + @override + String get lightTheme => 'Ljust'; + + @override + String loadCountMoreParticipants(int count) { + return 'Ladda $count mer deltagare'; + } + + @override + String get dehydrate => 'Exportera sessionen och rensa enheten'; + + @override + String get dehydrateWarning => + 'Denna åtgärd kan inte ångras. Försäkra dig om att backupen är i säkert förvar.'; + + @override + String get dehydrateTor => 'TOR-användare: Exportera session'; + + @override + String get dehydrateTorLong => + 'TOR-användare rekommenderas att exportera sessionen innan fönstret stängs.'; + + @override + String get hydrateTor => + 'TOR-användare: Importera session från tidigare export'; + + @override + String get hydrateTorLong => + 'Exporterade du sessionen när du senast använde TOR? Importera den enkelt och fortsätt chatta.'; + + @override + String get hydrate => 'Återställ från säkerhetskopia'; + + @override + String get loadingPleaseWait => 'Laddar... Var god vänta.'; + + @override + String get loadMore => 'Ladda mer…'; + + @override + String get locationDisabledNotice => + 'Platstjänster är inaktiverade. Var god aktivera dom för att kunna dela din plats.'; + + @override + String get locationPermissionDeniedNotice => + 'Plats åtkomst nekad. Var god godkän detta för att kunna dela din plats.'; + + @override + String get login => 'Logga in'; + + @override + String logInTo(String homeserver) { + return 'Logga in till $homeserver'; + } + + @override + String get logout => 'Logga ut'; + + @override + String get memberChanges => 'Medlemsändringar'; + + @override + String get mention => 'Nämn'; + + @override + String get messages => 'Meddelanden'; + + @override + String get messagesStyle => 'Meddelanden:'; + + @override + String get moderator => 'Moderator'; + + @override + String get muteChat => 'Tysta chatt'; + + @override + String get needPantalaimonWarning => + 'Var medveten om att du behöver Pantalaimon för att använda ändpunktskryptering tillsvidare.'; + + @override + String get newChat => 'Ny chatt'; + + @override + String get newMessageInFluffyChat => '💬 Nya meddelanden i FluffyChat'; + + @override + String get newVerificationRequest => 'Ny verifikationsbegäran!'; + + @override + String get next => 'Nästa'; + + @override + String get no => 'Nej'; + + @override + String get noConnectionToTheServer => 'Ingen anslutning till servern'; + + @override + String get noEmotesFound => 'Hittade inga dekaler. 😕'; + + @override + String get noEncryptionForPublicRooms => + 'Du kan endast aktivera kryptering när rummet inte längre är publikt tillgängligt.'; + + @override + String get noGoogleServicesWarning => + 'De ser ut som att du inte har google-tjänster på din telefon. Det är ett bra beslut för din integritet! För att få aviseringar i FluffyChat rekommenderar vi att använda https://microg.org/ eller https://unifiedpush.org/ .'; + + @override + String noMatrixServer(String server1, String server2) { + return '$server1 är inte en matrix server, använd $server2 istället?'; + } + + @override + String get shareInviteLink => 'Dela inbjudningslänk'; + + @override + String get scanQrCode => 'Skanna QR-kod'; + + @override + String get none => 'Ingen'; + + @override + String get noPasswordRecoveryDescription => + 'Du har inte lagt till något sätt för att återställa ditt lösenord än.'; + + @override + String get noPermission => 'Ingen behörighet'; + + @override + String get noRoomsFound => 'Hittade inga rum…'; + + @override + String get notifications => 'Aviseringar'; + + @override + String get notificationsEnabledForThisAccount => + 'Aviseringar är påslaget för detta konto'; + + @override + String numUsersTyping(int count) { + return '$count användare skriver…'; + } + + @override + String get obtainingLocation => 'Erhåller plats…'; + + @override + String get offensive => 'Stötande'; + + @override + String get offline => 'Offline'; + + @override + String get ok => 'OK'; + + @override + String get online => 'Online'; + + @override + String get onlineKeyBackupEnabled => 'Online Nyckel-backup är aktiverad'; + + @override + String get oopsPushError => 'Oj! Tyvärr gick inte aviseringar att slå på.'; + + @override + String get oopsSomethingWentWrong => 'Hoppsan, något gick fel…'; + + @override + String get openAppToReadMessages => 'Öppna app för att lästa meddelanden'; + + @override + String get openCamera => 'Öppna kamera'; + + @override + String get openVideoCamera => 'Aktivera kamera för video'; + + @override + String get oneClientLoggedOut => 'En av dina klienter har loggats ut'; + + @override + String get addAccount => 'Lägg till konto'; + + @override + String get editBundlesForAccount => 'Lägg till paket för detta konto'; + + @override + String get addToBundle => 'Utöka paket'; + + @override + String get removeFromBundle => 'Ta bort från paket'; + + @override + String get bundleName => 'Paketnamn'; + + @override + String get enableMultiAccounts => + '(BETA) Aktivera multi-konton på denna enhet'; + + @override + String get openInMaps => 'Öppna i karta'; + + @override + String get link => 'Länk'; + + @override + String get serverRequiresEmail => + 'Servern behöver validera din e-postadress för registrering.'; + + @override + String get or => 'Eller'; + + @override + String get participant => 'Deltagare'; + + @override + String get passphraseOrKey => 'lösenord eller återställningsnyckel'; + + @override + String get password => 'Lösenord'; + + @override + String get passwordForgotten => 'Glömt lösenord'; + + @override + String get passwordHasBeenChanged => 'Lösenordet har ändrats'; + + @override + String get hideMemberChangesInPublicChats => + 'Hide member changes in public chats'; + + @override + String get hideMemberChangesInPublicChatsBody => + 'Do not show in the chat timeline if someone joins or leaves a public chat to improve readability.'; + + @override + String get overview => 'Overview'; + + @override + String get notifyMeFor => 'Notify me for'; + + @override + String get passwordRecoverySettings => 'Password recovery settings'; + + @override + String get passwordRecovery => 'Återställ lösenord'; + + @override + String get people => 'Människor'; + + @override + String get pickImage => 'Välj en bild'; + + @override + String get pin => 'Nåla fast'; + + @override + String play(String fileName) { + return 'Spela $fileName'; + } + + @override + String get pleaseChoose => 'Var god välj'; + + @override + String get pleaseChooseAPasscode => 'Ange ett lösenord'; + + @override + String get pleaseClickOnLink => + 'Klicka på länken i e-postmeddelandet för att sedan fortsätta.'; + + @override + String get pleaseEnter4Digits => + 'Ange 4 siffror eller lämna tom för att inaktivera app-lås.'; + + @override + String get pleaseEnterRecoveryKey => 'Ange din återställningsnyckel:'; + + @override + String get pleaseEnterYourPassword => 'Ange ditt lösenord'; + + @override + String get pleaseEnterYourPin => 'Ange din pin-kod'; + + @override + String get pleaseEnterYourUsername => 'Ange ditt användarnamn'; + + @override + String get pleaseFollowInstructionsOnWeb => + 'Följ instruktionerna på hemsidan och tryck på nästa.'; + + @override + String get privacy => 'Integritet'; + + @override + String get publicRooms => 'Publika Rum'; + + @override + String get pushRules => 'Regler'; + + @override + String get reason => 'Anledning'; + + @override + String get recording => 'Spelar in'; + + @override + String redactedBy(String username) { + return 'Borttaget av $username'; + } + + @override + String get directChat => 'Direktchatt'; + + @override + String redactedByBecause(String username, String reason) { + return 'Borttaget av $username på grund av: ”$reason”'; + } + + @override + String redactedAnEvent(String username) { + return '$username redigerade en händelse'; + } + + @override + String get redactMessage => 'Redigera meddelande'; + + @override + String get register => 'Registrera'; + + @override + String get reject => 'Avböj'; + + @override + String rejectedTheInvitation(String username) { + return '$username avböjde inbjudan'; + } + + @override + String get rejoin => 'Återanslut'; + + @override + String get removeAllOtherDevices => 'Ta bort alla andra enheter'; + + @override + String removedBy(String username) { + return 'Bortagen av $username'; + } + + @override + String get removeDevice => 'Ta bort enhet'; + + @override + String get unbanFromChat => 'Ta bort chatt-blockering'; + + @override + String get removeYourAvatar => 'Ta bort din avatar'; + + @override + String get replaceRoomWithNewerVersion => 'Ersätt rum med nyare version'; + + @override + String get reply => 'Svara'; + + @override + String get reportMessage => 'Rapportera meddelande'; + + @override + String get translateMessage => 'Translate message'; + + @override + String get translatedMessage => 'Translated message'; + + @override + String get errorTranslatingMessage => + 'An error has occured while translating the message.'; + + @override + String get recoverMessage => 'Recover message'; + + @override + String get recoveredMessage => 'Recovered message'; + + @override + String get errorRecoveringMessage => + 'An error has occured while recovering the message.'; + + @override + String get errorRecoveringMessageNoAdmin => + 'This feature is available on Synapse homeservers only for adminstrators.'; + + @override + String get requestPermission => 'Begär behörighet'; + + @override + String get roomHasBeenUpgraded => 'Rummet har blivit uppgraderat'; + + @override + String get roomVersion => 'Rum version'; + + @override + String get saveFile => 'Spara fil'; + + @override + String get retry => 'Retry'; + + @override + String get search => 'Sök'; + + @override + String get security => 'Säkerhet'; + + @override + String get recoveryKey => 'Återställningsnyckel'; + + @override + String get recoveryKeyLost => 'Borttappad återställningsnyckel?'; + + @override + String seenByUser(String username) { + return 'Sedd av $username'; + } + + @override + String get send => 'Skicka'; + + @override + String get sendAMessage => 'Skicka ett meddelande'; + + @override + String get sendAsText => 'Skicka som text'; + + @override + String get sendAudio => 'Skicka ljud'; + + @override + String get sendFile => 'Skicka fil'; + + @override + String get sendImage => 'Skicka bild'; + + @override + String sendImages(int count) { + return 'Send $count image'; + } + + @override + String get sendMessages => 'Skickade meddelanden'; + + @override + String get sendOriginal => 'Skicka orginal'; + + @override + String get sendSticker => 'Skicka klistermärke'; + + @override + String get sendVideo => 'Skicka video'; + + @override + String sentAFile(String username) { + return '📁 $username skickade en fil'; + } + + @override + String sentAnAudio(String username) { + return '🎤 $username skickade ett ljudklipp'; + } + + @override + String sentAPicture(String username) { + return '🖼️ $username skickade en bild'; + } + + @override + String sentASticker(String username) { + return '😊 $username skickade ett klistermärke'; + } + + @override + String sentAVideo(String username) { + return '🎥 $username skickade en video'; + } + + @override + String sentCallInformations(String senderName) { + return '$senderName skickade samtalsinformation'; + } + + @override + String get separateChatTypes => 'Separata direktchattar och grupper'; + + @override + String get setAsCanonicalAlias => 'Sätt som primärt alias'; + + @override + String get setCustomEmotes => 'Ställ in anpassade dekaler'; + + @override + String get setChatDescription => 'Ändra chattens beskrivning'; + + @override + String get setInvitationLink => 'Ställ in inbjudningslänk'; + + @override + String get setPermissionsLevel => 'Ställ in behörighetsnivå'; + + @override + String get setStatus => 'Ställ in status'; + + @override + String get settings => 'Inställningar'; + + @override + String get share => 'Dela'; + + @override + String sharedTheLocation(String username) { + return '$username delade sin position'; + } + + @override + String get shareLocation => 'Dela plats'; + + @override + String get showPassword => 'Visa lösenord'; + + @override + String get presenceStyle => 'Närvaro:'; + + @override + String get hideAvatarsInInvites => 'Hide avatars in invites'; + + @override + String get hideAvatarsInInvitesDescription => + 'Do not show room avatars in invites'; + + @override + String get presencesToggle => 'Visa statusmeddelanden från andra användare'; + + @override + String get pureBlackToggle => 'Pure Black'; + + @override + String get singlesignon => 'Single Sign On'; + + @override + String get skip => 'Hoppa över'; + + @override + String get sourceCode => 'Källkod'; + + @override + String get spaceIsPublic => 'Utrymme är publikt'; + + @override + String get spaceName => 'Utrymmes namn'; + + @override + String startedACall(String senderName) { + return '$senderName startade ett samtal'; + } + + @override + String get startFirstChat => 'Starta din första chatt'; + + @override + String get status => 'Status'; + + @override + String get statusExampleMessage => 'Hur mår du i dag?'; + + @override + String get submit => 'Skicka in'; + + @override + String get synchronizingPleaseWait => 'Synkroniserar… Var god vänta.'; + + @override + String synchronizingPleaseWaitCounter(String percentage) { + return ' Synchronizing… ($percentage%)'; + } + + @override + String get systemTheme => 'System'; + + @override + String get theyDontMatch => 'Dom Matchar Inte'; + + @override + String get theyMatch => 'Dom Matchar'; + + @override + String get title => 'FluffyChat'; + + @override + String get toggleFavorite => 'Växla favorit'; + + @override + String get toggleMuted => 'Växla tystad'; + + @override + String get toggleUnread => 'Markera läst/oläst'; + + @override + String get tooManyRequestsWarning => + 'För många förfrågningar. Vänligen försök senare!'; + + @override + String get transferFromAnotherDevice => 'Överför till annan enhet'; + + @override + String get tryToSendAgain => 'Försök att skicka igen'; + + @override + String get unavailable => 'Upptagen'; + + @override + String unbannedUser(String username, String targetName) { + return '$username avbannade $targetName'; + } + + @override + String get unblockDevice => 'Avblockera enhet'; + + @override + String get unknownDevice => 'Okänd enhet'; + + @override + String get unknownEncryptionAlgorithm => 'Okänd krypteringsalgoritm'; + + @override + String unknownEvent(String type) { + return 'Okänd händelse \'$type\''; + } + + @override + String get unmuteChat => 'Slå på ljudet för chatten'; + + @override + String get unpin => 'Avnåla'; + + @override + String unreadChats(int unreadCount) { + String _temp0 = intl.Intl.pluralLogic( + unreadCount, + locale: localeName, + other: '$unreadCount olästa chattar', + one: 'en oläst chatt', + ); + return '$_temp0'; + } + + @override + String userAndOthersAreTyping(String username, int count) { + return '$username och $count andra skriver…'; + } + + @override + String userAndUserAreTyping(String username, String username2) { + return '$username och $username2 skriver…'; + } + + @override + String userIsTyping(String username) { + return '$username skriver…'; + } + + @override + String userLeftTheChat(String username) { + return '🚪 $username lämnade chatten'; + } + + @override + String get username => 'Användarnamn'; + + @override + String userSentUnknownEvent(String username, String type) { + return '$username skickade en $type händelse'; + } + + @override + String get unverified => 'Ej verifierad'; + + @override + String get verified => 'Verifierad'; + + @override + String get verify => 'Verifiera'; + + @override + String get verifyStart => 'Starta verifiering'; + + @override + String get verifySuccess => 'Du har lyckats verifiera!'; + + @override + String get verifyTitle => 'Verifiera andra konton'; + + @override + String get videoCall => 'Videosamtal'; + + @override + String get visibilityOfTheChatHistory => 'Chatt-historikens synlighet'; + + @override + String get visibleForAllParticipants => 'Synlig för alla deltagare'; + + @override + String get visibleForEveryone => 'Synlig för alla'; + + @override + String get voiceMessage => 'Röstmeddelande'; + + @override + String get waitingPartnerAcceptRequest => + 'Väntar på att deltagaren accepterar begäran…'; + + @override + String get waitingPartnerEmoji => + 'Väntar på att deltagaren accepterar emojien…'; + + @override + String get waitingPartnerNumbers => + 'Väntar på att deltagaren accepterar nummer…'; + + @override + String get wallpaper => 'Bakgrund:'; + + @override + String get warning => 'Varning!'; + + @override + String get weSentYouAnEmail => 'Vi skickade dig ett e-postmeddelande'; + + @override + String get whoCanPerformWhichAction => 'Vem kan utföra vilken åtgärd'; + + @override + String get whoIsAllowedToJoinThisGroup => + 'Vilka som är tilllåtna att ansluta till denna grupp'; + + @override + String get whyDoYouWantToReportThis => 'Varför vill du rapportera detta?'; + + @override + String get wipeChatBackup => + 'Radera din chatt-backup för att skapa en ny återställningsnyckel?'; + + @override + String get withTheseAddressesRecoveryDescription => + 'Med dessa addresser kan du återställa ditt lösenord.'; + + @override + String get writeAMessage => 'Skriv ett meddelande…'; + + @override + String get yes => 'Ja'; + + @override + String get you => 'Du'; + + @override + String get youAreNoLongerParticipatingInThisChat => + 'Du deltar inte längre i denna chatt'; + + @override + String get youHaveBeenBannedFromThisChat => + 'Du har blivit bannad från denna chatt'; + + @override + String get yourPublicKey => 'Din publika nyckel'; + + @override + String get messageInfo => 'Meddelandeinformation'; + + @override + String get time => 'Tid'; + + @override + String get messageType => 'Meddelandetyp'; + + @override + String get sender => 'Avsändare'; + + @override + String get openGallery => 'Öppna galleri'; + + @override + String get removeFromSpace => 'Ta bort från utrymme'; + + @override + String get addToSpaceDescription => + 'Välj ett utrymme som chatten skall läggas till i.'; + + @override + String get start => 'Starta'; + + @override + String get pleaseEnterRecoveryKeyDescription => + 'Ange din återställningsnyckel från en tidigare session för att låsa upp äldre meddelanden. Din återställningsnyckel är INTE ditt lösenord.'; + + @override + String get publish => 'Publicera'; + + @override + String videoWithSize(String size) { + return 'Video ($size)'; + } + + @override + String get openChat => 'Öppna Chatt'; + + @override + String get markAsRead => 'Markera som läst'; + + @override + String get reportUser => 'Rapportera användare'; + + @override + String get dismiss => 'Avfärda'; + + @override + String reactedWith(String sender, String reaction) { + return '$sender reagerade med $reaction'; + } + + @override + String get pinMessage => 'Fäst i rum'; + + @override + String get confirmEventUnpin => + 'Är du säker på att händelsen inte längre skall vara fastnålad?'; + + @override + String get emojis => 'Uttryckssymboler'; + + @override + String get placeCall => 'Ring'; + + @override + String get voiceCall => 'Röstsamtal'; + + @override + String get unsupportedAndroidVersion => + 'Inget stöd för denna version av Android'; + + @override + String get unsupportedAndroidVersionLong => + 'Denna funktion kräver en senare version av Android.'; + + @override + String get videoCallsBetaWarning => + 'Videosamtal är för närvarande under testning. De kanske inte fungerar som det är tänkt eller på alla plattformar.'; + + @override + String get experimentalVideoCalls => 'Experimentella videosamtal'; + + @override + String get emailOrUsername => 'Användarnamn eller e-postadress'; + + @override + String get indexedDbErrorTitle => 'Problem med privat läge'; + + @override + String get indexedDbErrorLong => + 'Meddelandelagring är tyvärr inte aktiverat i privat läge som standard.\nGå till\n - about:config\n - sätt dom.indexedDB.privateBrowsing.enabled till true\nAnnars går det inte att använda FluffyChat.'; + + @override + String switchToAccount(String number) { + return 'Byt till konto $number'; + } + + @override + String get nextAccount => 'Nästa konto'; + + @override + String get previousAccount => 'Föregående konto'; + + @override + String get addWidget => 'Lägg till widget'; + + @override + String get widgetVideo => 'Video'; + + @override + String get widgetEtherpad => 'Anteckning'; + + @override + String get widgetJitsi => 'Jitsi-möte'; + + @override + String get widgetCustom => 'Anpassad'; + + @override + String get widgetName => 'Namn'; + + @override + String get widgetUrlError => 'Detta är inte en giltig URL.'; + + @override + String get widgetNameError => 'Vänligen ange ett visningsnamn.'; + + @override + String get errorAddingWidget => + 'Ett fel uppstod när widgeten skulle läggas till.'; + + @override + String get youRejectedTheInvitation => 'Du avvisade inbjudan'; + + @override + String get youJoinedTheChat => 'Du gick med i chatten'; + + @override + String get youAcceptedTheInvitation => '👍 Du accepterade inbjudan'; + + @override + String youBannedUser(String user) { + return 'Du förbjöd $user'; + } + + @override + String youHaveWithdrawnTheInvitationFor(String user) { + return 'Du har återkallat inbjudan till $user'; + } + + @override + String youInvitedToBy(String alias) { + return '📩 Du har blivit inbjuden via länk till:\n$alias'; + } + + @override + String youInvitedBy(String user) { + return '📩 Du har blivit inbjuden av $user'; + } + + @override + String invitedBy(String user) { + return '📩 Invited by $user'; + } + + @override + String youInvitedUser(String user) { + return '📩 Du bjöd in $user'; + } + + @override + String youKicked(String user) { + return '👞 Du sparkade ut $user'; + } + + @override + String youKickedAndBanned(String user) { + return '🙅 Du sparkade ut och förbjöd $user'; + } + + @override + String youUnbannedUser(String user) { + return 'Du återkallade förbudet för $user'; + } + + @override + String hasKnocked(String user) { + return '$user har knackat'; + } + + @override + String get usersMustKnock => 'Users must knock'; + + @override + String get noOneCanJoin => 'No one can join'; + + @override + String userWouldLikeToChangeTheChat(String user) { + return '$user would like to join the chat.'; + } + + @override + String get noPublicLinkHasBeenCreatedYet => + 'No public link has been created yet'; + + @override + String get knock => 'Knock'; + + @override + String get users => 'Användare'; + + @override + String get unlockOldMessages => 'Lås upp äldre meddelanden'; + + @override + String get storeInSecureStorageDescription => + 'Lagra återställningsnyckeln på säker plats på denna enhet.'; + + @override + String get saveKeyManuallyDescription => + 'Spara nyckeln manuellt genom att aktivera dela-funktionen eller urklippshanteraren på enheten.'; + + @override + String get storeInAndroidKeystore => + 'Lagra i Androids nyckellagring (KeyStore)'; + + @override + String get storeInAppleKeyChain => 'Lagra i Apples nyckelkedja (KeyChain)'; + + @override + String get storeSecurlyOnThisDevice => 'Lagra säkert på denna enhet'; + + @override + String countFiles(int count) { + return '$count filer'; + } + + @override + String get user => 'Användare'; + + @override + String get custom => 'Anpassad'; + + @override + String get foregroundServiceRunning => + 'Denna avisering visas när förgrundstjänsten körs.'; + + @override + String get screenSharingTitle => 'skärmdelning'; + + @override + String get screenSharingDetail => 'Du delar din skärm i FluffyChat'; + + @override + String get callingPermissions => 'Samtalsbehörighet'; + + @override + String get callingAccount => 'Samtalskonto'; + + @override + String get callingAccountDetails => + 'Tillåt FluffyChat att använda Androids ring-app.'; + + @override + String get appearOnTop => 'Visa ovanpå'; + + @override + String get appearOnTopDetails => + 'Tillåt att appen visas ovanpå (behövs inte om du redan har FluffyChat konfigurerat som ett samtalskonto)'; + + @override + String get otherCallingPermissions => + 'Mikrofon, kamera och andra behörigheter för FluffyChat'; + + @override + String get whyIsThisMessageEncrypted => + 'Varför kan inte detta meddelande läsas?'; + + @override + String get noKeyForThisMessage => + 'Detta kan hända om meddelandet skickades innan du loggade in på ditt konto i den här enheten.\n\nDet kan också vara så att avsändaren har blockerat din enhet eller att något gick fel med internetanslutningen.\n\nKan du läsa meddelandet i en annan session? I sådana fall kan du överföra meddelandet från den sessionen! Gå till Inställningar > Enhet och säkerställ att dina enheter har verifierat varandra. När du öppnar rummet nästa gång och båda sessionerna är i förgrunden, så kommer nycklarna att överföras automatiskt.\n\nVill du inte förlora nycklarna vid utloggning eller när du byter enhet? Säkerställ att du har aktiverat säkerhetskopiering för chatten i inställningarna.'; + + @override + String get newGroup => 'Ny grupp'; + + @override + String get newSpace => 'Nytt utrymme'; + + @override + String get enterSpace => 'Gå till utrymme'; + + @override + String get enterRoom => 'Gå till rummet'; + + @override + String get allSpaces => 'Alla utrymmen'; + + @override + String numChats(String number) { + return '$number chattar'; + } + + @override + String get hideUnimportantStateEvents => 'Göm oviktiga tillståndshändelser'; + + @override + String get hidePresences => 'Dölj statuslista?'; + + @override + String get doNotShowAgain => 'Visa inte igen'; + + @override + String wasDirectChatDisplayName(String oldDisplayName) { + return 'Tom chatt (var $oldDisplayName)'; + } + + @override + String get newSpaceDescription => + 'Utrymmen möjliggör konsolidering av chattar och att bygga privata eller offentliga gemenskaper.'; + + @override + String get encryptThisChat => 'Kryptera denna chatt'; + + @override + String get disableEncryptionWarning => + 'Av säkerhetsskäl kan du inte stänga av kryptering i en chatt där det tidigare aktiverats.'; + + @override + String get sorryThatsNotPossible => 'Det där är inte möjligt'; + + @override + String get deviceKeys => 'Enhetsnycklar:'; + + @override + String get reopenChat => 'Återöppna chatt'; + + @override + String get noBackupWarning => + 'Varning! Om du inte aktiverar säkerhetskopiering av chattar så tappar du åtkomst till krypterade meddelanden. Det är rekommenderat att du aktiverar säkerhetskopiering innan du loggar ut.'; + + @override + String get noOtherDevicesFound => 'Inga andra enheter hittades'; + + @override + String fileIsTooBigForServer(String max) { + return 'Servern informerar om att filen är för stor för att skickas.'; + } + + @override + String fileHasBeenSavedAt(String path) { + return 'Filen har sparats i $path'; + } + + @override + String get jumpToLastReadMessage => 'Hoppa till det senast lästa meddelandet'; + + @override + String get readUpToHere => 'Läs upp till hit'; + + @override + String get jump => 'Hoppa'; + + @override + String get openLinkInBrowser => 'Öppna länk i webbläsare'; + + @override + String get reportErrorDescription => + '😭 Åh nej. Något gick fel. Om du vill ian du rapportera denna bugg till utvecklarna.'; + + @override + String get report => 'rapportera'; + + @override + String get signInWithPassword => 'Logga in med lösenord'; + + @override + String get pleaseTryAgainLaterOrChooseDifferentServer => + 'Vänligen försök igen eller välj en annan server.'; + + @override + String signInWith(String provider) { + return 'Logga in med $provider'; + } + + @override + String get profileNotFound => + 'Användaren kunde onte hittas på servern. Kanske är det ett anslutningsproblem eller så finns inte användaren.'; + + @override + String get setTheme => 'Välj tema:'; + + @override + String get setColorTheme => 'Välj färgtema:'; + + @override + String get invite => 'Bjud in'; + + @override + String get inviteGroupChat => '📨 Bjud in gruppchatt'; + + @override + String get invitePrivateChat => '📨 Bjud in privat chatt'; + + @override + String get invalidInput => 'Ogiltig input!'; + + @override + String wrongPinEntered(int seconds) { + return 'Fel pin-kod inslagen! Försök igen om $seconds sekunder…'; + } + + @override + String get pleaseEnterANumber => 'Vänligen ange ett nummer större än 0'; + + @override + String get archiveRoomDescription => + 'Den här chatten kommer flyttas till arkivet. Andra användare kommer kunna se att du har lämnat chatten.'; + + @override + String get roomUpgradeDescription => + 'Chatten kommer då att återskapas med den nya rumversionen. Alla medlemmar kommer bli påminda om att de måste byta till den nya chatten. Du kan läsa mer om rumversioner på https://spec.matrix.org/latest/rooms/'; + + @override + String get removeDevicesDescription => + 'Du kommer att bli utloggad från den här enheten och kommer inte längre kunna få meddelanden.'; + + @override + String get banUserDescription => + 'Användaren kommer bannlysas från chatten och kommer inte kunna gå med i chatten igen tills bannlysningen avslutas.'; + + @override + String get unbanUserDescription => + 'Användaren kommer kunna gå med i chatten igen om den försöker.'; + + @override + String get kickUserDescription => + 'Användaren sparkas ut ur chatten men bannlyses inte. I offentliga chattar kan användaren gå med igen när som helst.'; + + @override + String get makeAdminDescription => + 'När du gör denna användare till administratör kommer du inte kunna ångra det eftersom de kommer ha samma behörigheter som du.'; + + @override + String get pushNotificationsNotAvailable => + 'Aviseringar är inte tillgängligt'; + + @override + String get learnMore => 'Lär dig mer'; + + @override + String get yourGlobalUserIdIs => 'Ditt globala användar-ID är: '; + + @override + String noUsersFoundWithQuery(String query) { + return 'Tyvärr kunde ingen användare hittas med ”$query”. Vänligen kontrollera om du gjort ett stavfel.'; + } + + @override + String get knocking => 'Knocking'; + + @override + String chatCanBeDiscoveredViaSearchOnServer(String server) { + return 'Chat can be discovered via the search on $server'; + } + + @override + String get searchChatsRooms => 'Sök efter #chattar, @användare…'; + + @override + String get nothingFound => 'Inget hittades…'; + + @override + String get groupName => 'Gruppnamn'; + + @override + String get createGroupAndInviteUsers => + 'Skapa en grupp och bjud in användare'; + + @override + String get groupCanBeFoundViaSearch => 'Gruppen kan hittas genom sökning'; + + @override + String get wrongRecoveryKey => + 'Tyvärr verkar detta inte vara den korrekta återställningsnyckeln.'; + + @override + String get startConversation => 'Starta konversation'; + + @override + String get commandHint_sendraw => 'Skicka rå json'; + + @override + String get databaseMigrationTitle => 'Databasen är optimerad'; + + @override + String get databaseMigrationBody => + 'Var vänlig vänta. Detta kan ta en stund.'; + + @override + String get leaveEmptyToClearStatus => 'Lämna tom för att ta bort din status.'; + + @override + String get select => 'Ange val'; + + @override + String get searchForUsers => 'Sök efter @användare…'; + + @override + String get pleaseEnterYourCurrentPassword => + 'Vänligen skriv ditt nuvarande lösenord'; + + @override + String get newPassword => 'Nytt lösenord'; + + @override + String get pleaseChooseAStrongPassword => 'Vänligen välj ett starkt lösenord'; + + @override + String get passwordsDoNotMatch => 'Lösenorden passar inte'; + + @override + String get passwordIsWrong => 'Det angivna lösenordet är fel'; + + @override + String get publicLink => 'Offentlig länk'; + + @override + String get publicChatAddresses => 'Public chat addresses'; + + @override + String get createNewAddress => 'Create new address'; + + @override + String get joinSpace => 'Gå med i utrymme'; + + @override + String get publicSpaces => 'Offentliga utrymmen'; + + @override + String get addChatOrSubSpace => 'Lägg till chatt eller underutrymme'; + + @override + String get subspace => 'Underutrymme'; + + @override + String get decline => 'Neka'; + + @override + String get thisDevice => 'Denna enhet:'; + + @override + String get initAppError => 'Ett problem skedde när appen initierades'; + + @override + String get userRole => 'User role'; + + @override + String minimumPowerLevel(String level) { + return '$level is the minimum power level.'; + } + + @override + String searchIn(String chat) { + return 'Search in chat \"$chat\"...'; + } + + @override + String get searchMore => 'Search more...'; + + @override + String get gallery => 'Gallery'; + + @override + String get files => 'Files'; + + @override + String databaseBuildErrorBody(String url, String error) { + return 'Kan inte bygga SQlite-databasen. Appen försöker använda den gamla databasen för nu. Vänligen rapportera problemet till utvecklarna här: $url. Felmeddelandet är: $error'; + } + + @override + String sessionLostBody(String url, String error) { + return 'Din session är förlorad. Vänligen rapportera detta fel till utvecklarna här: $url. Felmeddelandet är: $error'; + } + + @override + String restoreSessionBody(String url, String error) { + return 'Appen försöker nu få tillbaks din session från backupen. Vänligen rapportera detta problem till utvecklarna här: $url. Felmeddelandet är: $error'; + } + + @override + String forwardMessageTo(String roomName) { + return 'Vidarebefordra meddelandet till $roomName?'; + } + + @override + String get sendReadReceipts => 'Skicka läskvitton'; + + @override + String get sendTypingNotificationsDescription => + 'Andra deltagare i en diskussion kan se när du skriver.'; + + @override + String get sendReadReceiptsDescription => + 'Andra deltagare i en diskussion kan se när du läst ett meddelande.'; + + @override + String get formattedMessages => 'Formaterade meddelanden'; + + @override + String get formattedMessagesDescription => + 'Visa formaterat meddelandeinnehåll som fet stil med markdown.'; + + @override + String get verifyOtherUser => '🔐 Verifiera användaren'; + + @override + String get verifyOtherUserDescription => + 'Om du verifierar en användare så kan du vara säker på vem du verkligen skriver till. 💪\n\nNär du påbörjar en verifiering så ser du och den andra användaren en popup-ruta i appen. I den rutan ser du ett antal tecken som du jämför med vad den andra användaren ser.\n\nDet bästa sättet att göra detta är att träffas fysiskt, eller genom att starta ett videosamtal. 👭'; + + @override + String get verifyOtherDevice => '🔐 Verifiera enhet'; + + @override + String get verifyOtherDeviceDescription => + 'När du verifierar en enhet så kan era enheter utväxla nycklar, vilket förbättrar säkerheten. 💪 När du påbörjar en verifiering så ser du en popup-ruta på båda enheterna. I den rutan ser du ett antal tecken som du jämför med det som visas på den andra enheten. Det är bäst att ha båda enheterna till hands innan du påbörjar verifieringen. 🤳'; + + @override + String acceptedKeyVerification(String sender) { + return '$sender accepterade nyckelverifieringen'; + } + + @override + String canceledKeyVerification(String sender) { + return '$sender avbröt nyckelverifieringen'; + } + + @override + String completedKeyVerification(String sender) { + return '$sender fullbordade nyckelverifieringen'; + } + + @override + String isReadyForKeyVerification(String sender) { + return '$sender är redo för nyckelverifiering'; + } + + @override + String requestedKeyVerification(String sender) { + return '$sender begärde nyckelverifiering'; + } + + @override + String startedKeyVerification(String sender) { + return '$sender påbörjade nyckelverifiering'; + } + + @override + String get transparent => 'Transparent'; + + @override + String get incomingMessages => 'Inkommande meddelanden'; + + @override + String get stickers => 'Klistermärken'; + + @override + String get discover => 'Upptäck'; + + @override + String get commandHint_ignore => 'Ignore the given matrix ID'; + + @override + String get commandHint_unignore => 'Unignore the given matrix ID'; + + @override + String unreadChatsInApp(String appname, String unread) { + return '$appname: $unread unread chats'; + } + + @override + String get noDatabaseEncryption => + 'Database encryption is not supported on this platform'; + + @override + String thereAreCountUsersBlocked(Object count) { + return 'Right now there are $count users blocked.'; + } + + @override + String get restricted => 'Restricted'; + + @override + String get knockRestricted => 'Knock restricted'; + + @override + String goToSpace(Object space) { + return 'Go to space: $space'; + } + + @override + String get markAsUnread => 'Mark as unread'; + + @override + String userLevel(int level) { + return '$level - User'; + } + + @override + String moderatorLevel(int level) { + return '$level - Moderator'; + } + + @override + String adminLevel(int level) { + return '$level - Admin'; + } + + @override + String get changeGeneralChatSettings => 'Change general chat settings'; + + @override + String get inviteOtherUsers => 'Invite other users to this chat'; + + @override + String get changeTheChatPermissions => 'Change the chat permissions'; + + @override + String get changeTheVisibilityOfChatHistory => + 'Change the visibility of the chat history'; + + @override + String get changeTheCanonicalRoomAlias => + 'Change the main public chat address'; + + @override + String get sendRoomNotifications => 'Send a @room notifications'; + + @override + String get changeTheDescriptionOfTheGroup => + 'Change the description of the chat'; + + @override + String get chatPermissionsDescription => + 'Define which power level is necessary for certain actions in this chat. The power levels 0, 50 and 100 are usually representing users, moderators and admins, but any gradation is possible.'; + + @override + String updateInstalled(String version) { + return '🎉 Update $version installed!'; + } + + @override + String get changelog => 'Changelog'; + + @override + String get sendCanceled => 'Sending canceled'; + + @override + String get loginWithMatrixId => 'Login with Matrix-ID'; + + @override + String get discoverHomeservers => 'Discover homeservers'; + + @override + String get whatIsAHomeserver => 'What is a homeserver?'; + + @override + String get homeserverDescription => + 'All your data is stored on the homeserver, just like an email provider. You can choose which homeserver you want to use, while you can still communicate with everyone. Learn more at at https://matrix.org.'; + + @override + String get doesNotSeemToBeAValidHomeserver => + 'Doesn\'t seem to be a compatible homeserver. Wrong URL?'; + + @override + String get calculatingFileSize => 'Calculating file size...'; + + @override + String get prepareSendingAttachment => 'Prepare sending attachment...'; + + @override + String get sendingAttachment => 'Sending attachment...'; + + @override + String get generatingVideoThumbnail => 'Generating video thumbnail...'; + + @override + String get compressVideo => 'Compressing video...'; + + @override + String sendingAttachmentCountOfCount(int index, int length) { + return 'Sending attachment $index of $length...'; + } + + @override + String serverLimitReached(int seconds) { + return 'Server limit reached! Waiting $seconds seconds...'; + } + + @override + String get oneOfYourDevicesIsNotVerified => + 'One of your devices is not verified'; + + @override + String get noticeChatBackupDeviceVerification => + 'Note: When you connect all your devices to the chat backup, they are automatically verified.'; + + @override + String get continueText => 'Continue'; + + @override + String get welcomeText => + 'Hey Hey 👋 This is Extera. You can sign in to any homeserver, which is compatible with https://matrix.org. And then chat with anyone. It\'s a huge decentralized messaging network!'; + + @override + String get blur => 'Blur:'; + + @override + String get opacity => 'Opacity:'; + + @override + String get setWallpaper => 'Set wallpaper'; + + @override + String get manageAccount => 'Manage account'; + + @override + String get noContactInformationProvided => + 'Server does not provide any valid contact information'; + + @override + String get contactServerAdmin => 'Contact server admin'; + + @override + String get contactServerSecurity => 'Contact server security'; + + @override + String get supportPage => 'Support page'; + + @override + String get serverInformation => 'Server information:'; + + @override + String get name => 'Name'; + + @override + String get version => 'Version'; + + @override + String get website => 'Website'; + + @override + String get compress => 'Compress'; + + @override + String get boldText => 'Bold text'; + + @override + String get italicText => 'Italic text'; + + @override + String get strikeThrough => 'Strikethrough'; + + @override + String get pleaseFillOut => 'Please fill out'; + + @override + String get invalidUrl => 'Invalid url'; + + @override + String get addLink => 'Add link'; + + @override + String get unableToJoinChat => + 'Unable to join chat. Maybe the other party has already closed the conversation.'; + + @override + String get previous => 'Previous'; + + @override + String get otherPartyNotLoggedIn => + 'The other party is currently not logged in and therefore cannot receive messages!'; + + @override + String appWantsToUseForLogin(String server) { + return 'Use \'$server\' to log in'; + } + + @override + String get appWantsToUseForLoginDescription => + 'You hereby allow the app and website to share information about you.'; + + @override + String get open => 'Open'; + + @override + String get waitingForServer => 'Waiting for server...'; + + @override + String get appIntroduction => + 'Extera lets you chat with your friends across different messengers. Learn more at https://matrix.org or just tap *Continue*.'; + + @override + String get newChatRequest => '📩 New chat request'; + + @override + String get contentNotificationSettings => 'Content notification settings'; + + @override + String get generalNotificationSettings => 'General notification settings'; + + @override + String get roomNotificationSettings => 'Room notification settings'; + + @override + String get userSpecificNotificationSettings => + 'User specific notification settings'; + + @override + String get otherNotificationSettings => 'Other notification settings'; + + @override + String get notificationRuleContainsUserName => 'Contains User Name'; + + @override + String get notificationRuleContainsUserNameDescription => + 'Notifies the user when a message contains their username.'; + + @override + String get notificationRuleMaster => 'Mute all notifications'; + + @override + String get notificationRuleMasterDescription => + 'Overrides all other rules and disables all notifications.'; + + @override + String get notificationRuleSuppressNotices => 'Suppress Automated Messages'; + + @override + String get notificationRuleSuppressNoticesDescription => + 'Suppresses notifications from automated clients like bots.'; + + @override + String get notificationRuleInviteForMe => 'Invite for Me'; + + @override + String get notificationRuleInviteForMeDescription => + 'Notifies the user when they are invited to a room.'; + + @override + String get notificationRuleMemberEvent => 'Member Event'; + + @override + String get notificationRuleMemberEventDescription => + 'Suppresses notifications for membership events.'; + + @override + String get notificationRuleIsUserMention => 'User Mention'; + + @override + String get notificationRuleIsUserMentionDescription => + 'Notifies the user when they are directly mentioned in a message.'; + + @override + String get notificationRuleContainsDisplayName => 'Contains Display Name'; + + @override + String get notificationRuleContainsDisplayNameDescription => + 'Notifies the user when a message contains their display name.'; + + @override + String get notificationRuleIsRoomMention => 'Room Mention'; + + @override + String get notificationRuleIsRoomMentionDescription => + 'Notifies the user when there is a room mention.'; + + @override + String get notificationRuleRoomnotif => 'Room Notification'; + + @override + String get notificationRuleRoomnotifDescription => + 'Notifies the user when a message contains \'@room\'.'; + + @override + String get notificationRuleTombstone => 'Tombstone'; + + @override + String get notificationRuleTombstoneDescription => + 'Notifies the user about room deactivation messages.'; + + @override + String get notificationRuleReaction => 'Reaction'; + + @override + String get notificationRuleReactionDescription => + 'Suppresses notifications for reactions.'; + + @override + String get notificationRuleRoomServerAcl => 'Room Server ACL'; + + @override + String get notificationRuleRoomServerAclDescription => + 'Suppresses notifications for room server access control lists (ACL).'; + + @override + String get notificationRuleSuppressEdits => 'Suppress Edits'; + + @override + String get notificationRuleSuppressEditsDescription => + 'Suppresses notifications for edited messages.'; + + @override + String get notificationRuleCall => 'Call'; + + @override + String get notificationRuleCallDescription => + 'Notifies the user about calls.'; + + @override + String get notificationRuleEncryptedRoomOneToOne => + 'Encrypted Room One-to-One'; + + @override + String get notificationRuleEncryptedRoomOneToOneDescription => + 'Notifies the user about messages in encrypted one-to-one rooms.'; + + @override + String get notificationRuleRoomOneToOne => 'Room One-to-One'; + + @override + String get notificationRuleRoomOneToOneDescription => + 'Notifies the user about messages in one-to-one rooms.'; + + @override + String get notificationRuleMessage => 'Message'; + + @override + String get notificationRuleMessageDescription => + 'Notifies the user about general messages.'; + + @override + String get notificationRuleEncrypted => 'Encrypted'; + + @override + String get notificationRuleEncryptedDescription => + 'Notifies the user about messages in encrypted rooms.'; + + @override + String get notificationRuleJitsi => 'Jitsi'; + + @override + String get notificationRuleJitsiDescription => + 'Notifies the user about Jitsi widget events.'; + + @override + String get notificationRuleServerAcl => 'Suppress Server ACL Events'; + + @override + String get notificationRuleServerAclDescription => + 'Suppresses notifications for Server ACL events.'; + + @override + String unknownPushRule(String rule) { + return 'Unknown push rule \'$rule\''; + } + + @override + String get deletePushRuleCanNotBeUndone => + 'If you delete this notification setting, this can not be undone.'; + + @override + String get more => 'More'; + + @override + String get shareKeysWith => 'Share keys with...'; + + @override + String get shareKeysWithDescription => + 'Which devices should be trusted so that they can read along your messages in encrypted chats?'; + + @override + String get allDevices => 'All devices'; + + @override + String get crossVerifiedDevicesIfEnabled => + 'Cross verified devices if enabled'; + + @override + String get crossVerifiedDevices => 'Cross verified devices'; + + @override + String get verifiedDevicesOnly => 'Verified devices only'; + + @override + String get takeAPhoto => 'Take a photo'; + + @override + String get recordAVideo => 'Record a video'; + + @override + String get optionalMessage => '(Optional) message...'; + + @override + String get notSupportedOnThisDevice => 'Not supported on this device'; + + @override + String get enterNewChat => 'Enter new chat'; + + @override + String get approve => 'Approve'; + + @override + String get youHaveKnocked => 'You have knocked'; + + @override + String get pleaseWaitUntilInvited => + 'Please wait now, until someone from the room invites you.'; +} diff --git a/lib/generated/l10n/l10n_ta.dart b/lib/generated/l10n/l10n_ta.dart new file mode 100644 index 0000000..f2d52a4 --- /dev/null +++ b/lib/generated/l10n/l10n_ta.dart @@ -0,0 +1,2777 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'l10n.dart'; + +// ignore_for_file: type=lint + +/// The translations for Tamil (`ta`). +class L10nTa extends L10n { + L10nTa([String locale = 'ta']) : super(locale); + + @override + String get noSendPermission => 'You can\'t send messages here'; + + @override + String get alwaysUse24HourFormat => 'தவறு'; + + @override + String get repeatPassword => 'கடவுச்சொல்லை மீண்டும் செய்யவும்'; + + @override + String get notAnImage => 'படக் கோப்பு அல்ல.'; + + @override + String get setCustomPermissionLevel => 'Set custom permission level'; + + @override + String get setPermissionsLevelDescription => + 'Please choose a predefined role below or enter a custom permission level between 0 and 100.'; + + @override + String get ignoreUser => 'Ignore user'; + + @override + String get normalUser => 'Normal user'; + + @override + String get remove => 'அகற்று'; + + @override + String get importNow => 'இப்போது இறக்குமதி செய்யுங்கள்'; + + @override + String get importEmojis => 'ஈமோசிகளை இறக்குமதி செய்யுங்கள்'; + + @override + String get importFromZipFile => '.Zip கோப்பிலிருந்து இறக்குமதி செய்யுங்கள்'; + + @override + String get exportEmotePack => 'எமோட் பேக் .zip என ஏற்றுமதி செய்யுங்கள்'; + + @override + String get replace => 'மாற்றவும்'; + + @override + String get about => 'பற்றி'; + + @override + String aboutHomeserver(String homeserver) { + return '$homeserver பற்றி'; + } + + @override + String get accept => 'ஏற்றுக்கொள்'; + + @override + String acceptedTheInvitation(String username) { + return '👍 $username அழைப்பை ஏற்றுக்கொண்டது'; + } + + @override + String get account => 'கணக்கு'; + + @override + String activatedEndToEndEncryption(String username) { + return '$username இறுதி குறியாக்கத்திற்கு செயல்படுத்தப்பட்ட முடிவு'; + } + + @override + String get addEmail => 'மின்னஞ்சல் சேர்க்கவும்'; + + @override + String get confirmMatrixId => + 'உங்கள் கணக்கை நீக்க உங்கள் மேட்ரிக்ச் ஐடியை உறுதிப்படுத்தவும்.'; + + @override + String supposedMxid(String mxid) { + return 'இது $mxid be ஆக இருக்க வேண்டும்'; + } + + @override + String get addChatDescription => 'அரட்டை விளக்கத்தைச் சேர்க்கவும் ...'; + + @override + String get addToSpace => 'விண்வெளியில் சேர்க்கவும்'; + + @override + String get admin => 'நிர்வாகி'; + + @override + String get alias => 'மாற்றுப்பெயர்'; + + @override + String get all => 'அனைத்தும்'; + + @override + String get allChats => 'அனைத்து அரட்டைகளும்'; + + @override + String get commandHint_roomupgrade => + 'Upgrade this room to the given room version'; + + @override + String get commandHint_googly => 'சில கூகிள் கண்களை அனுப்பவும்'; + + @override + String get commandHint_cuddle => 'ஒரு கசப்பு அனுப்பவும்'; + + @override + String get commandHint_hug => 'கட்டிப்பிடிக்கவும்'; + + @override + String googlyEyesContent(String senderName) { + return '$senderName உங்களுக்கு கூகிள் கண்களை அனுப்புகிறது'; + } + + @override + String cuddleContent(String senderName) { + return '$senderName பெயர் you உங்களை கசக்குகிறது'; + } + + @override + String hugContent(String senderName) { + return '$senderName உங்களை அணைத்துக்கொள்கிறது'; + } + + @override + String answeredTheCall(String senderName) { + return '$senderName அழைப்புக்கு பதிலளித்தார்'; + } + + @override + String get anyoneCanJoin => 'யார் வேண்டுமானாலும் சேரலாம்'; + + @override + String get appLock => 'பயன்பாட்டு பூட்டு'; + + @override + String get appLockDescription => + 'முள் குறியீட்டைக் கொண்டு பயன்படுத்தாதபோது பயன்பாட்டைப் பூட்டவும்'; + + @override + String get archive => 'காப்பகம்'; + + @override + String get areGuestsAllowedToJoin => + 'விருந்தினர் பயனர்கள் சேர அனுமதிக்கப்படுகிறார்களா'; + + @override + String get areYouSure => 'நீங்கள் உறுதியாக இருக்கிறீர்களா?'; + + @override + String get areYouSureYouWantToLogout => + 'நீங்கள் நிச்சயமாக வெளியேற விரும்புகிறீர்களா?'; + + @override + String get askSSSSSign => + 'மற்ற நபரில் கையெழுத்திட, தயவுசெய்து உங்கள் பாதுகாப்பான கடை பாச்ஃபிரேச் அல்லது மீட்பு விசையை உள்ளிடவும்.'; + + @override + String askVerificationRequest(String username) { + return '$usernameபயனர்பெயர் இருந்து இலிருந்து இந்த சரிபார்ப்பு கோரிக்கையை ஏற்றுக்கொள்ளவா?'; + } + + @override + String get autoplayImages => + 'அனிமேசன் செய்யப்பட்ட ச்டிக்கர்கள் மற்றும் உணர்ச்சிகளை தானாக இயக்கவும்'; + + @override + String badServerLoginTypesException(String serverVersions, + String supportedVersions, Object suportedVersions) { + return 'உள்நாட்டு வகைகளை ஓம்சர்வர் ஆதரிக்கிறது:\n $serverVersions\n ஆனால் இந்த பயன்பாடு மட்டுமே ஆதரிக்கிறது:\n $supportedVersions'; + } + + @override + String get sendTypingNotifications => 'தட்டச்சு அறிவிப்புகளை அனுப்பவும்'; + + @override + String get swipeRightToLeftToReply => + 'பதிலளிக்க வலமிருந்து இடமாக ச்வைப் செய்யவும்'; + + @override + String get sendOnEnter => 'Enter ஐ அனுப்பவும்'; + + @override + String badServerVersionsException(String serverVersions, + String supportedVersions, Object serverVerions, Object suportedVersions) { + return 'ஓம்சர்வர் ச்பெக் பதிப்புகளை ஆதரிக்கிறது:\n $serverVersions\n ஆனால் இந்த பயன்பாடு $supportedVersions மட்டுமே ஆதரிக்கிறது'; + } + + @override + String countChatsAndCountParticipants(int chats, int participants) { + return '$chats அரட்டைகள் மற்றும் $participants பங்கேற்பாளர்கள்'; + } + + @override + String get noMoreChatsFound => 'இனி அரட்டைகள் கிடைக்கவில்லை ...'; + + @override + String get noChatsFoundHere => + 'இங்கே அரட்டைகள் எதுவும் காணப்படவில்லை. கீழே உள்ள பொத்தானைப் பயன்படுத்தி ஒருவருடன் புதிய அரட்டையைத் தொடங்கவும். .'; + + @override + String get joinedChats => 'இணைந்த அரட்டைகள்'; + + @override + String get unread => 'படிக்காதது'; + + @override + String get space => 'இடைவெளி'; + + @override + String get spaces => 'இடங்கள்'; + + @override + String get banFromChat => 'அரட்டையிலிருந்து தடை'; + + @override + String get banned => 'தடைசெய்யப்பட்டது'; + + @override + String bannedUser(String username, String targetName) { + return '$username தடைசெய்யப்பட்ட $targetName'; + } + + @override + String get blockDevice => 'தொகுதி சாதனம்'; + + @override + String get blocked => 'தடுக்கப்பட்டது'; + + @override + String get botMessages => 'போட் செய்திகள்'; + + @override + String get cancel => 'ரத்துசெய்'; + + @override + String cantOpenUri(String uri) { + return 'யூரி $uri வேலை ஐ திறக்க முடியாது'; + } + + @override + String get changeDeviceName => 'சாதனத்தின் பெயரை மாற்றவும்'; + + @override + String changedTheChatAvatar(String username) { + return '$username அரட்டை அவதாரத்தை மாற்றியது'; + } + + @override + String changedTheChatDescriptionTo(String username, String description) { + return '$username பயனர்பெயர் the அரட்டை விளக்கத்தை மாற்றியது: \'$description\''; + } + + @override + String changedTheChatNameTo(String username, String chatname) { + return '$username அரட்டை பெயரை மாற்றியது: \'$chatname\''; + } + + @override + String changedTheChatPermissions(String username) { + return '$username அரட்டை அனுமதிகளை மாற்றியுள்ளார்'; + } + + @override + String changedTheDisplaynameTo(String username, String displayname) { + return '$username அவற்றின் காட்சி பெயர்: \'$displayname\''; + } + + @override + String changedTheGuestAccessRules(String username) { + return '$username விருந்தினர் அணுகல் விதிகளை மாற்றியது'; + } + + @override + String changedTheGuestAccessRulesTo(String username, String rules) { + return '$username விருந்தினர் அணுகல் விதிகளை மாற்றியது: $rules'; + } + + @override + String changedTheHistoryVisibility(String username) { + return '$username வரலாற்று தெரிவுநிலையை மாற்றியது'; + } + + @override + String changedTheHistoryVisibilityTo(String username, String rules) { + return '$username வரலாற்று தெரிவுநிலையை மாற்றியது: $rules'; + } + + @override + String changedTheJoinRules(String username) { + return '$username சேர விதிகளை மாற்றியது'; + } + + @override + String changedTheJoinRulesTo(String username, String joinRules) { + return '$username சேர விதிகளை மாற்றியது: $joinRules'; + } + + @override + String changedTheProfileAvatar(String username) { + return '$username அவர்களின் அவதாரத்தை மாற்றியது'; + } + + @override + String changedTheRoomAliases(String username) { + return '$username அறை மாற்றுப்பெயர்களை மாற்றியது'; + } + + @override + String changedTheRoomInvitationLink(String username) { + return '$username அழைப்பிதழ் இணைப்பை மாற்றியது'; + } + + @override + String get changePassword => 'கடவுச்சொல்லை மாற்றவும்'; + + @override + String get changeTheHomeserver => 'ஓம்சர்வரை மாற்றவும்'; + + @override + String get changeTheme => 'உங்கள் பாணியை மாற்றவும்'; + + @override + String get changeTheNameOfTheGroup => 'குழுவின் பெயரை மாற்றவும்'; + + @override + String get changeYourAvatar => 'உங்கள் அவதாரத்தை மாற்றவும்'; + + @override + String get channelCorruptedDecryptError => 'குறியாக்கம் சிதைந்துள்ளது'; + + @override + String get chat => 'அரட்டை'; + + @override + String get yourChatBackupHasBeenSetUp => + 'உங்கள் அரட்டை காப்புப்பிரதி அமைக்கப்பட்டுள்ளது.'; + + @override + String get chatBackup => 'அரட்டை காப்புப்பிரதி'; + + @override + String get chatBackupDescription => + 'உங்கள் பழைய செய்திகள் மீட்பு விசையுடன் பாதுகாக்கப்படுகின்றன. நீங்கள் அதை இழக்கவில்லை என்பதை உறுதிப்படுத்திக் கொள்ளுங்கள்.'; + + @override + String get chatDetails => 'அரட்டை விவரங்கள்'; + + @override + String get chatHasBeenAddedToThisSpace => + 'இந்த இடத்தில் அரட்டை சேர்க்கப்பட்டுள்ளது'; + + @override + String get chats => 'அரட்டைகள்'; + + @override + String get chooseAStrongPassword => 'வலுவான கடவுச்சொல்லைத் தேர்வுசெய்க'; + + @override + String get clearArchive => 'தெளிவான காப்பகம்'; + + @override + String get close => 'மூடு'; + + @override + String get commandHint_markasdm => + 'கொடுக்கப்பட்ட மேட்ரிக்சிற்கான நேரடி செய்தி அறையாக குறிக்கவும்'; + + @override + String get commandHint_markasgroup => 'குழுவாக குறி'; + + @override + String get commandHint_ban => + 'கொடுக்கப்பட்ட பயனரை இந்த அறையிலிருந்து தடை செய்யுங்கள்'; + + @override + String get commandHint_clearcache => 'தெளிவான தற்காலிக சேமிப்பு'; + + @override + String get commandHint_create => + 'வெற்று குழு அரட்டையை உருவாக்கவும்\n குறியாக்கத்தை முடக்க-இல்லை-குறியாக்கத்தைப் பயன்படுத்தவும்'; + + @override + String get commandHint_discardsession => 'அமர்வை நிராகரிக்கவும்'; + + @override + String get commandHint_dm => + 'நேரடி அரட்டையைத் தொடங்கவும்\n குறியாக்கத்தை முடக்க-இல்லை-குறியாக்கத்தைப் பயன்படுத்தவும்'; + + @override + String get commandHint_html => 'உஉகுமொ வடிவமைக்கப்பட்ட உரையை அனுப்பவும்'; + + @override + String get commandHint_invite => + 'கொடுக்கப்பட்ட பயனரை இந்த அறைக்கு அழைக்கவும்'; + + @override + String get commandHint_join => 'கொடுக்கப்பட்ட அறையில் சேரவும்'; + + @override + String get commandHint_kick => + 'இந்த அறையிலிருந்து கொடுக்கப்பட்ட பயனரை அகற்றவும்'; + + @override + String get commandHint_leave => 'இந்த அறையை விட்டு விடுங்கள்'; + + @override + String get commandHint_me => 'உங்களை விவரிக்கவும்'; + + @override + String get commandHint_myroomavatar => + 'இந்த அறைக்கு உங்கள் படத்தை அமைக்கவும் (MXC-URI எழுதியது)'; + + @override + String get commandHint_myroomnick => + 'இந்த அறைக்கு உங்கள் காட்சி பெயரை அமைக்கவும்'; + + @override + String get commandHint_op => + 'கொடுக்கப்பட்ட பயனரின் ஆற்றல் மட்டத்தை அமைக்கவும் (இயல்புநிலை: 50)'; + + @override + String get commandHint_plain => 'வடிவமைக்கப்படாத உரையை அனுப்பவும்'; + + @override + String get commandHint_react => 'ஒரு எதிர்வினையாக பதிலை அனுப்பவும்'; + + @override + String get commandHint_send => 'உரையை அனுப்பவும்'; + + @override + String get commandHint_unban => + 'இந்த அறையிலிருந்து கொடுக்கப்பட்ட பயனரைத் தடுக்கிறது'; + + @override + String get commandInvalid => 'கட்டளை தவறானது'; + + @override + String commandMissing(String command) { + return '$command என்பது கட்டளை அல்ல.'; + } + + @override + String get compareEmojiMatch => 'தயவுசெய்து ஈமோசிகளை ஒப்பிடுக'; + + @override + String get compareNumbersMatch => 'எண்களை ஒப்பிடுக'; + + @override + String get configureChat => 'அரட்டையை உள்ளமைக்கவும்'; + + @override + String get confirm => 'உறுதிப்படுத்தவும்'; + + @override + String get connect => 'இணை'; + + @override + String get contactHasBeenInvitedToTheGroup => + 'குழுவிற்கு தொடர்பு அழைக்கப்பட்டுள்ளது'; + + @override + String get containsDisplayName => 'காட்சி பெயரைக் கொண்டுள்ளது'; + + @override + String get containsUserName => 'பயனர்பெயர் உள்ளது'; + + @override + String get contentHasBeenReported => + 'உள்ளடக்கம் சேவையக நிர்வாகிகளுக்கு தெரிவிக்கப்பட்டுள்ளது'; + + @override + String get copiedToClipboard => 'இடைநிலைப்பலகைக்கு நகலெடுக்கப்பட்டது'; + + @override + String get copy => 'நகலெடு'; + + @override + String get copyToClipboard => 'இடைநிலைப்பலகைக்கு நகலெடுக்கவும்'; + + @override + String couldNotDecryptMessage(String error) { + return 'செய்தியை மறைகுறியாக்க முடியவில்லை: $error'; + } + + @override + String countParticipants(int count) { + return '$count பங்கேற்பாளர்கள்'; + } + + @override + String get create => 'உருவாக்கு'; + + @override + String createdTheChat(String username) { + return '💬 $username அரட்டையை உருவாக்கினார்'; + } + + @override + String get createGroup => 'குழுவை உருவாக்கவும்'; + + @override + String get createNewSpace => 'புதிய இடம்'; + + @override + String get currentlyActive => 'தற்போது செயலில் உள்ளது'; + + @override + String get darkTheme => 'இருண்ட'; + + @override + String dateAndTimeOfDay(String date, String timeOfDay) { + return '$date, $timeOfDay'; + } + + @override + String dateWithoutYear(String month, String day) { + return '$month-$day'; + } + + @override + String dateWithYear(String year, String month, String day) { + return '$year-$month-$day'; + } + + @override + String get deactivateAccountWarning => + 'இது உங்கள் பயனர் கணக்கை செயலிழக்கச் செய்யும். இதை செயல்தவிர்க்க முடியாது! நீங்கள் உறுதியாக இருக்கிறீர்களா?'; + + @override + String get defaultPermissionLevel => + 'புதிய பயனர்களுக்கான இயல்புநிலை இசைவு நிலை'; + + @override + String get delete => 'நீக்கு'; + + @override + String get deleteAccount => 'கணக்கை நீக்கு'; + + @override + String get deleteMessage => 'செய்தியை நீக்கு'; + + @override + String get device => 'சாதனம்'; + + @override + String get deviceId => 'சாதன ஐடி'; + + @override + String get devices => 'சாதனங்கள்'; + + @override + String get directChats => 'நேரடி அரட்டைகள்'; + + @override + String get allRooms => 'அனைத்து குழு அரட்டைகளும்'; + + @override + String get displaynameHasBeenChanged => 'காட்சி பெயர் மாற்றப்பட்டுள்ளது'; + + @override + String get downloadFile => 'கோப்பைப் பதிவிறக்கவும்'; + + @override + String get edit => 'தொகு'; + + @override + String get editBlockedServers => 'தடுக்கப்பட்ட சேவையகங்களைத் திருத்து'; + + @override + String get chatPermissions => 'அரட்டை அனுமதிகள்'; + + @override + String get editDisplayname => 'காட்சி பெயர் திருத்து'; + + @override + String get editRoomAliases => 'அறை மாற்றுப்பெயர்களைத் திருத்து'; + + @override + String get editRoomAvatar => 'அறை அவதார் திருத்து'; + + @override + String get emoteExists => 'எமோட் ஏற்கனவே உள்ளது!'; + + @override + String get emoteInvalid => 'தவறான எமோட் சார்ட்கோட்!'; + + @override + String get emoteKeyboardNoRecents => + 'அண்மைக் காலத்தில் பயன்படுத்தப்பட்ட உணர்ச்சிகள் இங்கே தோன்றும் ...'; + + @override + String get emotePacks => 'அறைக்கு எமோட் பொதிகள்'; + + @override + String get emoteSettings => 'எமோட் அமைப்புகள்'; + + @override + String get globalChatId => 'உலகளாவிய அரட்டை ஐடி'; + + @override + String get accessAndVisibility => 'அணுகல் மற்றும் தெரிவுநிலை'; + + @override + String get accessAndVisibilityDescription => + 'இந்த அரட்டையில் யார் சேர அனுமதிக்கப்படுகிறார்கள், அரட்டையை எவ்வாறு கண்டுபிடிப்பது.'; + + @override + String get calls => 'அழைப்புகள்'; + + @override + String get customEmojisAndStickers => + 'தனிப்பயன் ஈமோசிகள் மற்றும் ச்டிக்கர்கள்'; + + @override + String get customEmojisAndStickersBody => + 'எந்தவொரு அரட்டையிலும் பயன்படுத்தக்கூடிய தனிப்பயன் ஈமோசிகள் அல்லது ச்டிக்கர்களைச் சேர்க்கவும் அல்லது பகிரவும்.'; + + @override + String get emoteShortcode => 'சார்ட்கோட் எமோட்'; + + @override + String get emoteWarnNeedToPick => + 'நீங்கள் ஒரு எமோட் சார்ட்கோட் மற்றும் ஒரு படத்தை எடுக்க வேண்டும்!'; + + @override + String get emptyChat => 'வெற்று அரட்டை'; + + @override + String get enableEmotesGlobally => 'உலகளவில் எமோட் பேக்கை இயக்கவும்'; + + @override + String get enableEncryption => 'குறியாக்கத்தை இயக்கவும்'; + + @override + String get enableEncryptionWarning => + 'நீங்கள் இனி குறியாக்கத்தை முடக்க முடியாது. நீங்கள் உறுதியாக இருக்கிறீர்களா?'; + + @override + String get encrypted => 'குறியாக்கப்பட்டது'; + + @override + String get encryption => 'குறியாக்கம்'; + + @override + String get encryptionNotEnabled => 'குறியாக்கம் இயக்கப்படவில்லை'; + + @override + String endedTheCall(String senderName) { + return '$senderName அழைப்பை முடித்தார்'; + } + + @override + String get enterAnEmailAddress => 'மின்னஞ்சல் முகவரியை உள்ளிடவும்'; + + @override + String get homeserver => 'ஓம்சர்வர்'; + + @override + String get enterYourHomeserver => 'உங்கள் ஓம்சர்வரை உள்ளிடவும்'; + + @override + String errorObtainingLocation(String error) { + return 'இருப்பிடத்தைப் பெறுவதில் பிழை: $error'; + } + + @override + String get everythingReady => 'எல்லாம் தயாராக!'; + + @override + String get extremeOffensive => 'மிகவும் தாக்குதல்'; + + @override + String get fileName => 'கோப்பு பெயர்'; + + @override + String get fluffychat => 'பஞ்சுபோன்ற'; + + @override + String get fontSize => 'எழுத்துரு அளவு'; + + @override + String get forward => 'முன்னோக்கி'; + + @override + String get fromJoining => 'சேருவதிலிருந்து'; + + @override + String get fromTheInvitation => 'அழைப்பிலிருந்து'; + + @override + String get goToTheNewRoom => 'புதிய அறைக்குச் செல்லுங்கள்'; + + @override + String get group => 'குழு'; + + @override + String get chatDescription => 'அரட்டை விளக்கம்'; + + @override + String get chatDescriptionHasBeenChanged => 'அரட்டை விளக்கம் மாற்றப்பட்டது'; + + @override + String get groupIsPublic => 'குழு பொது'; + + @override + String get groups => 'குழுக்கள்'; + + @override + String groupWith(String displayname) { + return '$displayname உடன் குழு'; + } + + @override + String get guestsAreForbidden => 'விருந்தினர்கள் தடைசெய்யப்பட்டுள்ளனர்'; + + @override + String get guestsCanJoin => 'விருந்தினர்கள் சேரலாம்'; + + @override + String hasWithdrawnTheInvitationFor(String username, String targetName) { + return '$targetName க்கான அழைப்பை $username திரும்பப் பெற்றுள்ளார்'; + } + + @override + String get help => 'உதவி'; + + @override + String get hideRedactedEvents => 'திருத்தப்பட்ட நிகழ்வுகளை மறைக்கவும்'; + + @override + String get hideRedactedMessages => 'சரிசெய்யப்பட்ட செய்திகளை மறைக்கவும்'; + + @override + String get hideRedactedMessagesBody => + 'யாராவது ஒரு செய்தியை மாற்றியமைத்தால், இந்த செய்தி இனி அரட்டையில் காணப்படாது.'; + + @override + String get hideInvalidOrUnknownMessageFormats => + 'தவறான அல்லது அறியப்படாத செய்தி வடிவங்களை மறைக்கவும்'; + + @override + String get howOffensiveIsThisContent => 'இந்த உள்ளடக்கம் எவ்வளவு ஆபத்தானது?'; + + @override + String get id => 'ஐடி'; + + @override + String get identity => 'முற்றொருமை'; + + @override + String get block => 'தொகுதி'; + + @override + String get blockedUsers => 'தடுக்கப்பட்ட பயனர்கள்'; + + @override + String get blockListDescription => + 'உங்களை தொந்தரவு செய்யும் பயனர்களைத் தடுக்கலாம். உங்கள் தனிப்பட்ட தொகுதி பட்டியலில் பயனர்களிடமிருந்து எந்த செய்திகளையும் அல்லது அறை அழைப்புகளையும் நீங்கள் பெற முடியாது.'; + + @override + String get blockUsername => 'பயனர்பெயரை புறக்கணிக்கவும்'; + + @override + String get iHaveClickedOnLink => 'நான் இணைப்பைக் சொடுக்கு செய்துள்ளேன்'; + + @override + String get incorrectPassphraseOrKey => 'தவறான கடவுச்சொல் அல்லது மீட்பு விசை'; + + @override + String get inoffensive => 'செயலற்றது'; + + @override + String get inviteContact => 'தொடர்பை அழைக்கவும்'; + + @override + String inviteContactToGroupQuestion(Object contact, Object groupName) { + return '\"$groupName\" அரட்டைக்கு $contact ஐ அழைக்க விரும்புகிறீர்களா?'; + } + + @override + String inviteContactToGroup(String groupName) { + return '$groupName க்கு தொடர்பை அழை'; + } + + @override + String get noChatDescriptionYet => + 'அரட்டை விளக்கம் இதுவரை உருவாக்கப்படவில்லை.'; + + @override + String get tryAgain => 'மீண்டும் முயற்சிக்கவும்'; + + @override + String get invalidServerName => 'தவறான சேவையக பெயர்'; + + @override + String get invited => 'அழைக்கப்பட்டார்'; + + @override + String get redactMessageDescription => + 'இந்த உரையாடலில் பங்கேற்பாளர்கள் அனைவருக்கும் செய்தி திருத்தப்படும். இதை செயல்தவிர்க்க முடியாது.'; + + @override + String get optionalRedactReason => + '(விரும்பினால்) இந்த செய்தியை மாற்றியமைப்பதற்கான காரணம் ...'; + + @override + String invitedUser(String username, String targetName) { + return '📩 $username $targetName அழைக்கப்பட்டார்'; + } + + @override + String get invitedUsersOnly => 'பயனர்களை மட்டுமே அழைத்தது'; + + @override + String get inviteForMe => 'எனக்கு அழைக்கவும்'; + + @override + String inviteText(String username, String link) { + return '$username உங்களை பஞ்சுபோன்றதாக அழைத்தது.\n 1. FulufyChat.im ஐப் பார்வையிட்டு பயன்பாட்டை நிறுவவும்\n 2. பதிவு செய்யுங்கள் அல்லது உள்நுழைக\n 3. அழைப்பிதழ் இணைப்பைத் திறக்கவும்:\n $link'; + } + + @override + String get isTyping => 'தட்டச்சு செய்கிறது…'; + + @override + String joinedTheChat(String username) { + return '👋 $username அரட்டையில் சேர்ந்தார்'; + } + + @override + String get joinRoom => 'அறையில் சேரவும்'; + + @override + String kicked(String username, String targetName) { + return '👞 $username $targetName ஐ உதைத்தார்'; + } + + @override + String kickedAndBanned(String username, String targetName) { + return '🙅 $username உதைத்து $targetName ஐத் தடை செய்தார்'; + } + + @override + String get kickFromChat => 'அரட்டையிலிருந்து கிக்'; + + @override + String lastActiveAgo(String localizedTimeShort) { + return 'கடைசியாக செயலில்: $localizedTimeShort'; + } + + @override + String get leave => 'விடுப்பு'; + + @override + String get leftTheChat => 'அரட்டையை விட்டு வெளியேறினார்'; + + @override + String get license => 'உரிமம்'; + + @override + String get lightTheme => 'ஒளி'; + + @override + String loadCountMoreParticipants(int count) { + return 'ஏற்றவும் $count மேலும் பங்கேற்பாளர்கள்'; + } + + @override + String get dehydrate => 'ஏற்றுமதி அமர்வு மற்றும் சாதனத்தை துடைக்கவும்'; + + @override + String get dehydrateWarning => + 'இந்த செயலை செயல்தவிர்க்க முடியாது. காப்புப்பிரதி கோப்பை பாதுகாப்பாக சேமித்து வைக்கவும்.'; + + @override + String get dehydrateTor => 'டோர் பயனர்கள்: ஏற்றுமதி அமர்வு'; + + @override + String get dehydrateTorLong => + 'TOR பயனர்களுக்கு, சாளரத்தை மூடுவதற்கு முன் அமர்வை ஏற்றுமதி செய்ய பரிந்துரைக்கப்படுகிறது.'; + + @override + String get hydrateTor => 'டோர் பயனர்கள்: இறக்குமதி அமர்வு ஏற்றுமதி'; + + @override + String get hydrateTorLong => + 'உங்கள் அமர்வை கடைசியாக டோரில் ஏற்றுமதி செய்தீர்களா? விரைவாக அதை இறக்குமதி செய்து அரட்டையடிக்கவும்.'; + + @override + String get hydrate => 'காப்பு கோப்பிலிருந்து மீட்டமைக்கவும்'; + + @override + String get loadingPleaseWait => 'ஏற்றுகிறது… தயவுசெய்து காத்திருங்கள்.'; + + @override + String get loadMore => 'மேலும் ஏற்றவும்…'; + + @override + String get locationDisabledNotice => + 'இருப்பிட சேவைகள் முடக்கப்பட்டுள்ளன. தயவுசெய்து உங்கள் இருப்பிடத்தைப் பகிர்ந்து கொள்ள அவர்களுக்கு உதவவும்.'; + + @override + String get locationPermissionDeniedNotice => + 'இருப்பிட இசைவு மறுக்கப்பட்டது. உங்கள் இருப்பிடத்தைப் பகிர்ந்து கொள்ள தயவுசெய்து அவர்களுக்கு வழங்குங்கள்.'; + + @override + String get login => 'புகுபதிவு'; + + @override + String logInTo(String homeserver) { + return '$homeserver இல் உள்நுழைக'; + } + + @override + String get logout => 'வெளியேற்றம்'; + + @override + String get memberChanges => 'உறுப்பினர் மாற்றங்கள்'; + + @override + String get mention => 'குறிப்பு'; + + @override + String get messages => 'செய்திகள்'; + + @override + String get messagesStyle => 'செய்திகள்:'; + + @override + String get moderator => 'மதிப்பீட்டாளர்'; + + @override + String get muteChat => 'முடக்கு அரட்டை'; + + @override + String get needPantalaimonWarning => + 'இப்போதைக்கு இறுதி முதல் இறுதி குறியாக்கத்தைப் பயன்படுத்த உங்களுக்கு பாண்டலாயமன் தேவை என்பதை நினைவில் கொள்க.'; + + @override + String get newChat => 'புதிய அரட்டை'; + + @override + String get newMessageInFluffyChat => 'Fuf பஞ்சுபோன்ற புதிய செய்தி'; + + @override + String get newVerificationRequest => 'புதிய சரிபார்ப்பு கோரிக்கை!'; + + @override + String get next => 'அடுத்தது'; + + @override + String get no => 'இல்லை'; + + @override + String get noConnectionToTheServer => 'சேவையகத்துடன் எந்த தொடர்பும் இல்லை'; + + @override + String get noEmotesFound => 'உணர்ச்சிகள் எதுவும் காணப்படவில்லை. .'; + + @override + String get noEncryptionForPublicRooms => + 'அறை இனி பகிரங்கமாக அணுக முடியாதவுடன் மட்டுமே நீங்கள் குறியாக்கத்தை செயல்படுத்த முடியும்.'; + + @override + String get noGoogleServicesWarning => + 'ஃபயர்பேச் முகில் செய்தி உங்கள் சாதனத்தில் கிடைக்கவில்லை. இன்னும் புச் அறிவிப்புகளைப் பெற, NTFY ஐ நிறுவ பரிந்துரைக்கிறோம். NTFY அல்லது மற்றொரு ஒருங்கிணைந்த புச் வழங்குநருடன் நீங்கள் தரவு பாதுகாப்பான வழியில் புச் அறிவிப்புகளைப் பெறலாம். நீங்கள் பிளேச்டோரிலிருந்து அல்லது எஃப்-டிராய்டிலிருந்து NTFY ஐ பதிவிறக்கம் செய்யலாம்.'; + + @override + String noMatrixServer(String server1, String server2) { + return '$server1 என்பது மேட்ரிக்ஸ் சர்வர் இல்லை, அதற்கு பதிலாக $server2 ஐ பயன்படுத்தவா?'; + } + + @override + String get shareInviteLink => 'இணைப்பைப் பகிரவும்'; + + @override + String get scanQrCode => 'QR குறியீட்டை ச்கேன் செய்யுங்கள்'; + + @override + String get none => 'எதுவுமில்லை'; + + @override + String get noPasswordRecoveryDescription => + 'உங்கள் கடவுச்சொல்லை மீட்டெடுப்பதற்கான வழியை நீங்கள் இன்னும் சேர்க்கவில்லை.'; + + @override + String get noPermission => 'இசைவு இல்லை'; + + @override + String get noRoomsFound => 'அறைகள் எதுவும் கிடைக்கவில்லை…'; + + @override + String get notifications => 'அறிவிப்புகள்'; + + @override + String get notificationsEnabledForThisAccount => + 'இந்த கணக்கிற்கு அறிவிப்புகள் இயக்கப்பட்டன'; + + @override + String numUsersTyping(int count) { + return '$count பயனர்கள் தட்டச்சு செய்கிறார்கள்…'; + } + + @override + String get obtainingLocation => 'இருப்பிடத்தைப் பெறுதல்…'; + + @override + String get offensive => 'தாக்குதல்'; + + @override + String get offline => 'இணையமில்லாமல்'; + + @override + String get ok => 'சரி'; + + @override + String get online => 'ஆன்லைனில்'; + + @override + String get onlineKeyBackupEnabled => + 'நிகழ்நிலை விசை காப்புப்பிரதி இயக்கப்பட்டது'; + + @override + String get oopsPushError => + 'அச்சச்சோ! துரதிர்ச்டவசமாக, புச் அறிவிப்புகளை அமைக்கும் போது பிழை ஏற்பட்டது.'; + + @override + String get oopsSomethingWentWrong => 'அச்சச்சோ, ஏதோ தவறு நடந்தது…'; + + @override + String get openAppToReadMessages => + 'செய்திகளைப் படிக்க பயன்பாட்டைத் திறக்கவும்'; + + @override + String get openCamera => 'திறந்த கேமரா'; + + @override + String get openVideoCamera => 'வீடியோவுக்கு கேமரா திறக்கவும்'; + + @override + String get oneClientLoggedOut => + 'உங்கள் வாடிக்கையாளர்களில் ஒருவர் உள்நுழைந்துள்ளார்'; + + @override + String get addAccount => 'கணக்கைச் சேர்க்கவும்'; + + @override + String get editBundlesForAccount => + 'இந்த கணக்கிற்கான மூட்டைகளைத் திருத்தவும்'; + + @override + String get addToBundle => 'மூட்டையில் சேர்க்கவும்'; + + @override + String get removeFromBundle => 'இந்த மூட்டையிலிருந்து அகற்றவும்'; + + @override + String get bundleName => 'மூட்டை பெயர்'; + + @override + String get enableMultiAccounts => + '(பீட்டா) இந்த சாதனத்தில் பல கணக்குகளை இயக்கவும்'; + + @override + String get openInMaps => 'வரைபடங்களில் திறந்திருக்கும்'; + + @override + String get link => 'இணைப்பு'; + + @override + String get serverRequiresEmail => + 'இந்த சேவையகம் பதிவுக்கு உங்கள் மின்னஞ்சல் முகவரியை சரிபார்க்க வேண்டும்.'; + + @override + String get or => 'அல்லது'; + + @override + String get participant => 'பங்கேற்பாளர்'; + + @override + String get passphraseOrKey => 'கடவுச்சொல் அல்லது மீட்பு விசை'; + + @override + String get password => 'கடவுச்சொல்'; + + @override + String get passwordForgotten => 'கடவுச்சொல் மறந்துவிட்டது'; + + @override + String get passwordHasBeenChanged => 'கடவுச்சொல் மாற்றப்பட்டுள்ளது'; + + @override + String get hideMemberChangesInPublicChats => + 'பொது அரட்டைகளில் உறுப்பினர் மாற்றங்களை மறைக்கவும்'; + + @override + String get hideMemberChangesInPublicChatsBody => + 'வாசிப்புத்திறனை மேம்படுத்த யாராவது ஒரு பொது அரட்டையில் சேர்ந்தால் அல்லது விட்டுவிட்டால் அரட்டை காலவரிசையில் காட்ட வேண்டாம்.'; + + @override + String get overview => 'கண்ணோட்டம்'; + + @override + String get notifyMeFor => 'எனக்கு அறிவிக்கவும்'; + + @override + String get passwordRecoverySettings => 'கடவுச்சொல் மீட்பு அமைப்புகள்'; + + @override + String get passwordRecovery => 'கடவுச்சொல் மீட்பு'; + + @override + String get people => 'மக்கள்'; + + @override + String get pickImage => 'ஒரு படத்தைத் தேர்ந்தெடுக்கவும்'; + + @override + String get pin => 'முள்'; + + @override + String play(String fileName) { + return 'Play $fileName'; + } + + @override + String get pleaseChoose => 'தயவுசெய்து தேர்வு செய்யவும்'; + + @override + String get pleaseChooseAPasscode => 'பாச் குறியீட்டைத் தேர்வுசெய்க'; + + @override + String get pleaseClickOnLink => + 'மின்னஞ்சலில் உள்ள இணைப்பைக் சொடுக்கு செய்து தொடரவும்.'; + + @override + String get pleaseEnter4Digits => + 'பயன்பாட்டு பூட்டை முடக்க 4 இலக்கங்களை உள்ளிடவும் அல்லது காலியாக விடவும்.'; + + @override + String get pleaseEnterRecoveryKey => 'உங்கள் மீட்பு விசையை உள்ளிடவும்:'; + + @override + String get pleaseEnterYourPassword => 'உங்கள் கடவுச்சொல்லை உள்ளிடவும்'; + + @override + String get pleaseEnterYourPin => 'உங்கள் முள் உள்ளிடவும்'; + + @override + String get pleaseEnterYourUsername => 'உங்கள் பயனர்பெயரை உள்ளிடவும்'; + + @override + String get pleaseFollowInstructionsOnWeb => + 'வலைத்தளத்தின் வழிமுறைகளைப் பின்பற்றி அடுத்து தட்டவும்.'; + + @override + String get privacy => 'தனியுரிமை'; + + @override + String get publicRooms => 'பொது அறைகள்'; + + @override + String get pushRules => 'தள்ளி விதிகள்'; + + @override + String get reason => 'காரணம்'; + + @override + String get recording => 'பதிவு'; + + @override + String redactedBy(String username) { + return '$username ஆல் திருத்தப்பட்டது'; + } + + @override + String get directChat => 'நேரடி அரட்டை'; + + @override + String redactedByBecause(String username, String reason) { + return '$username ஆல் திருத்தப்பட்டது ஏனெனில்: \"$reason\"'; + } + + @override + String redactedAnEvent(String username) { + return '$username ஒரு நிகழ்வை மறுவடிவமைத்தது'; + } + + @override + String get redactMessage => 'திருத்தும் செய்தி'; + + @override + String get register => 'பதிவு செய்யுங்கள்'; + + @override + String get reject => 'நிராகரிக்கவும்'; + + @override + String rejectedTheInvitation(String username) { + return '$username அழைப்பை நிராகரித்தது'; + } + + @override + String get rejoin => 'மீண்டும் சேரவும்'; + + @override + String get removeAllOtherDevices => 'மற்ற எல்லா சாதனங்களையும் அகற்றவும்'; + + @override + String removedBy(String username) { + return '$username ஆல் அகற்றப்பட்டது'; + } + + @override + String get removeDevice => 'சாதனத்தை அகற்று'; + + @override + String get unbanFromChat => 'அரட்டையிலிருந்து தடையின்றி'; + + @override + String get removeYourAvatar => 'உங்கள் அவதாரத்தை அகற்று'; + + @override + String get replaceRoomWithNewerVersion => 'புதிய பதிப்போடு அறையை மாற்றவும்'; + + @override + String get reply => 'பதில்'; + + @override + String get reportMessage => 'செய்தி அறிக்கை'; + + @override + String get translateMessage => 'Translate message'; + + @override + String get translatedMessage => 'Translated message'; + + @override + String get errorTranslatingMessage => + 'An error has occured while translating the message.'; + + @override + String get recoverMessage => 'Recover message'; + + @override + String get recoveredMessage => 'Recovered message'; + + @override + String get errorRecoveringMessage => + 'An error has occured while recovering the message.'; + + @override + String get errorRecoveringMessageNoAdmin => + 'This feature is available on Synapse homeservers only for adminstrators.'; + + @override + String get requestPermission => 'இசைவு கோருங்கள்'; + + @override + String get roomHasBeenUpgraded => 'அறை மேம்படுத்தப்பட்டுள்ளது'; + + @override + String get roomVersion => 'அறை பதிப்பு'; + + @override + String get saveFile => 'கோப்பை சேமி'; + + @override + String get retry => 'Retry'; + + @override + String get search => 'தேடல்'; + + @override + String get security => 'பாதுகாப்பு'; + + @override + String get recoveryKey => 'மீட்பு விசை'; + + @override + String get recoveryKeyLost => 'மீட்பு விசை இழந்ததா?'; + + @override + String seenByUser(String username) { + return '$username ஆல் பார்த்தது'; + } + + @override + String get send => 'அனுப்பு'; + + @override + String get sendAMessage => 'ஒரு செய்தியை அனுப்பவும்'; + + @override + String get sendAsText => 'உரையாக அனுப்பவும்'; + + @override + String get sendAudio => 'ஆடியோ அனுப்பவும்'; + + @override + String get sendFile => 'கோப்பு அனுப்பவும்'; + + @override + String get sendImage => 'படத்தை அனுப்பு'; + + @override + String sendImages(int count) { + return '$count படத்தை அனுப்பு'; + } + + @override + String get sendMessages => 'செய்திகளை அனுப்பவும்'; + + @override + String get sendOriginal => 'அசல் அனுப்பு'; + + @override + String get sendSticker => 'ச்டிக்கரை அனுப்பவும்'; + + @override + String get sendVideo => 'வீடியோ அனுப்பவும்'; + + @override + String sentAFile(String username) { + return '📁 $username கோப்பை அனுப்பியுள்ளார்'; + } + + @override + String sentAnAudio(String username) { + return '🎤 $username ஆடியோவை அனுப்பியுள்ளார்'; + } + + @override + String sentAPicture(String username) { + return '🖼️ $username படத்தை அனுப்பியுள்ளார்'; + } + + @override + String sentASticker(String username) { + return '😊 $username ஒரு ச்டிக்கரை அனுப்பியது'; + } + + @override + String sentAVideo(String username) { + return '🎥 $username ஒரு வீடியோவை அனுப்பியுள்ளார்'; + } + + @override + String sentCallInformations(String senderName) { + return '$senderName அனுப்பப்பட்ட அழைப்பு செய்தி'; + } + + @override + String get separateChatTypes => + 'நேரடி அரட்டைகள் மற்றும் குழுக்களை பிரிக்கவும்'; + + @override + String get setAsCanonicalAlias => 'முதன்மையான மாற்றுப்பெயராக அமைக்கவும்'; + + @override + String get setCustomEmotes => 'தனிப்பயன் உணர்ச்சிகளை அமைக்கவும்'; + + @override + String get setChatDescription => 'அரட்டை விளக்கத்தை அமைக்கவும்'; + + @override + String get setInvitationLink => 'அழைப்பிதழ் இணைப்பை அமைக்கவும்'; + + @override + String get setPermissionsLevel => 'இசைவு அளவை அமைக்கவும்'; + + @override + String get setStatus => 'நிலையை அமைக்கவும்'; + + @override + String get settings => 'அமைப்புகள்'; + + @override + String get share => 'பங்கு'; + + @override + String sharedTheLocation(String username) { + return '$username அவற்றின் இருப்பிடத்தைப் பகிர்ந்து கொண்டது'; + } + + @override + String get shareLocation => 'இருப்பிடத்தைப் பகிரவும்'; + + @override + String get showPassword => 'கடவுச்சொல்லைக் காட்டு'; + + @override + String get presenceStyle => 'இருப்பு:'; + + @override + String get hideAvatarsInInvites => 'Hide avatars in invites'; + + @override + String get hideAvatarsInInvitesDescription => + 'Do not show room avatars in invites'; + + @override + String get presencesToggle => 'பிற பயனர்களிடமிருந்து நிலை செய்திகளைக் காட்டு'; + + @override + String get pureBlackToggle => 'Pure Black'; + + @override + String get singlesignon => 'ஒற்றை அடையாளம்'; + + @override + String get skip => 'தவிர்'; + + @override + String get sourceCode => 'மூலக் குறியீடு'; + + @override + String get spaceIsPublic => 'இடம் பொது'; + + @override + String get spaceName => 'விண்வெளி பெயர்'; + + @override + String startedACall(String senderName) { + return '$senderName அழைப்பைத் தொடங்கினார்'; + } + + @override + String get startFirstChat => 'உங்கள் முதல் அரட்டையைத் தொடங்கவும்'; + + @override + String get status => 'நிலை'; + + @override + String get statusExampleMessage => 'இன்று நீங்கள் எப்படி இருக்கிறீர்கள்?'; + + @override + String get submit => 'சமர்ப்பிக்கவும்'; + + @override + String get synchronizingPleaseWait => + 'ஒத்திசைத்தல்… தயவுசெய்து காத்திருங்கள்.'; + + @override + String synchronizingPleaseWaitCounter(String percentage) { + return ' Synchronizing… ($percentage%)'; + } + + @override + String get systemTheme => 'மண்டலம்'; + + @override + String get theyDontMatch => 'அவர்கள் பொருந்தவில்லை'; + + @override + String get theyMatch => 'அவர்கள் பொருந்துகிறார்கள்'; + + @override + String get title => 'பஞ்சுபோன்ற'; + + @override + String get toggleFavorite => 'பிடித்ததை மாற்றவும்'; + + @override + String get toggleMuted => 'முடக்கியது'; + + @override + String get toggleUnread => 'மார்க் படிக்க/படிக்கவில்லை'; + + @override + String get tooManyRequestsWarning => + 'பல கோரிக்கைகள். தயவுசெய்து பின்னர் மீண்டும் முயற்சிக்கவும்!'; + + @override + String get transferFromAnotherDevice => 'மற்றொரு சாதனத்திலிருந்து மாற்றவும்'; + + @override + String get tryToSendAgain => 'மீண்டும் அனுப்ப முயற்சிக்கவும்'; + + @override + String get unavailable => 'கிடைக்கவில்லை'; + + @override + String unbannedUser(String username, String targetName) { + return '$username தடைசெய்யப்படாத $targetName'; + } + + @override + String get unblockDevice => 'சாதனத்தைத் தடைசெய்க'; + + @override + String get unknownDevice => 'தெரியாத சாதனம்'; + + @override + String get unknownEncryptionAlgorithm => 'அறியப்படாத குறியாக்க வழிமுறை'; + + @override + String unknownEvent(String type) { + return 'அறியப்படாத நிகழ்வு \'$type\''; + } + + @override + String get unmuteChat => 'மாறுதல் அரட்டை'; + + @override + String get unpin => 'Unpin'; + + @override + String unreadChats(int unreadCount) { + String _temp0 = intl.Intl.pluralLogic( + unreadCount, + locale: localeName, + other: '$unreadCount unread chats', + one: '1 unread chat', + ); + return '$_temp0'; + } + + @override + String userAndOthersAreTyping(String username, int count) { + return '$username மற்றும் $count மற்றவர்கள் தட்டச்சு செய்கிறார்கள்…'; + } + + @override + String userAndUserAreTyping(String username, String username2) { + return '$username மற்றும் $username2 தட்டச்சு செய்கின்றன…'; + } + + @override + String userIsTyping(String username) { + return '$username தட்டச்சு செய்கிறது…'; + } + + @override + String userLeftTheChat(String username) { + return '🚪 $username அரட்டையை விட்டு வெளியேறினார்'; + } + + @override + String get username => 'பயனர்பெயர்'; + + @override + String userSentUnknownEvent(String username, String type) { + return '$username ஒரு $type நிகழ்வை அனுப்பியது'; + } + + @override + String get unverified => 'சரிபார்க்கப்படாதது'; + + @override + String get verified => 'சரிபார்க்கப்பட்டது'; + + @override + String get verify => 'சரிபார்க்கவும்'; + + @override + String get verifyStart => 'சரிபார்ப்பைத் தொடங்கவும்'; + + @override + String get verifySuccess => 'நீங்கள் வெற்றிகரமாக சரிபார்த்தீர்கள்!'; + + @override + String get verifyTitle => 'பிற கணக்கை சரிபார்க்கிறது'; + + @override + String get videoCall => 'வீடியோ அழைப்பு'; + + @override + String get visibilityOfTheChatHistory => 'அரட்டை வரலாற்றின் தெரிவுநிலை'; + + @override + String get visibleForAllParticipants => + 'பங்கேற்பாளர்கள் அனைவருக்கும் தெரியும்'; + + @override + String get visibleForEveryone => 'அனைவருக்கும் தெரியும்'; + + @override + String get voiceMessage => 'குரல் செய்தி'; + + @override + String get waitingPartnerAcceptRequest => + 'கூட்டாளர் கோரிக்கையை ஏற்றுக்கொள்வதற்காக காத்திருக்கிறார்…'; + + @override + String get waitingPartnerEmoji => + 'பங்குதாரர் ஈமோசியை ஏற்றுக்கொள்வதற்காக காத்திருக்கிறார்…'; + + @override + String get waitingPartnerNumbers => + 'பங்குதாரர் எண்களை ஏற்றுக்கொள்வதற்காக காத்திருக்கிறார்…'; + + @override + String get wallpaper => 'வால்பேப்பர்:'; + + @override + String get warning => 'எச்சரிக்கை!'; + + @override + String get weSentYouAnEmail => + 'நாங்கள் உங்களுக்கு ஒரு மின்னஞ்சல் அனுப்பினோம்'; + + @override + String get whoCanPerformWhichAction => 'எந்த செயலைச் செய்ய முடியும்'; + + @override + String get whoIsAllowedToJoinThisGroup => + 'இந்த குழுவில் சேர யார் அனுமதிக்கப்படுகிறார்கள்'; + + @override + String get whyDoYouWantToReportThis => + 'இதை ஏன் புகாரளிக்க விரும்புகிறீர்கள்?'; + + @override + String get wipeChatBackup => + 'புதிய மீட்பு விசையை உருவாக்க உங்கள் அரட்டை காப்புப்பிரதியைத் துடைக்கவா?'; + + @override + String get withTheseAddressesRecoveryDescription => + 'இந்த முகவரிகள் மூலம் உங்கள் கடவுச்சொல்லை மீட்டெடுக்கலாம்.'; + + @override + String get writeAMessage => 'ஒரு செய்தியை எழுதுங்கள்…'; + + @override + String get yes => 'ஆம்'; + + @override + String get you => 'நீங்கள்'; + + @override + String get youAreNoLongerParticipatingInThisChat => + 'இந்த அரட்டையில் நீங்கள் இனி பங்கேற்கவில்லை'; + + @override + String get youHaveBeenBannedFromThisChat => + 'இந்த அரட்டையிலிருந்து உங்களுக்கு தடை விதிக்கப்பட்டுள்ளது'; + + @override + String get yourPublicKey => 'உங்கள் பொது விசை'; + + @override + String get messageInfo => 'செய்தி செய்தி'; + + @override + String get time => 'நேரம்'; + + @override + String get messageType => 'செய்தி வகை'; + + @override + String get sender => 'அனுப்புநர்'; + + @override + String get openGallery => 'திறந்த கேலரி'; + + @override + String get removeFromSpace => 'இடத்திலிருந்து அகற்று'; + + @override + String get addToSpaceDescription => + 'இந்த அரட்டையைச் சேர்க்க ஒரு இடத்தைத் தேர்ந்தெடுக்கவும்.'; + + @override + String get start => 'தொடங்கு'; + + @override + String get pleaseEnterRecoveryKeyDescription => + 'உங்கள் பழைய செய்திகளைத் திறக்க, முந்தைய அமர்வில் உருவாக்கப்பட்ட உங்கள் மீட்பு விசையை உள்ளிடவும். உங்கள் மீட்பு விசை உங்கள் கடவுச்சொல் அல்ல.'; + + @override + String get publish => 'வெளியிடுங்கள்'; + + @override + String videoWithSize(String size) { + return 'வீடியோ ($size)'; + } + + @override + String get openChat => 'திறந்த அரட்டை'; + + @override + String get markAsRead => 'படித்தபடி குறி'; + + @override + String get reportUser => 'பயனர் புகாரளிக்கவும்'; + + @override + String get dismiss => 'தள்ளுபடி'; + + @override + String reactedWith(String sender, String reaction) { + return '$sender $reaction உடன் பதிலளித்தார்'; + } + + @override + String get pinMessage => 'அறைக்கு முள்'; + + @override + String get confirmEventUnpin => 'நிகழ்வை நிரந்தரமாக அவிழ்ப்பது உறுதி?'; + + @override + String get emojis => 'ஈமோசிகள்'; + + @override + String get placeCall => 'அழைப்பு அழைப்பு'; + + @override + String get voiceCall => 'குரல் அழைப்பு'; + + @override + String get unsupportedAndroidVersion => 'ஆதரிக்கப்படாத ஆண்ட்ராய்டு பதிப்பு'; + + @override + String get unsupportedAndroidVersionLong => + 'இந்த அம்சத்திற்கு புதிய ஆண்ட்ராய்டு பதிப்பு தேவைப்படுகிறது. புதுப்பிப்புகள் அல்லது பரம்பரை OS ஆதரவை சரிபார்க்கவும்.'; + + @override + String get videoCallsBetaWarning => + 'வீடியோ அழைப்புகள் தற்போது பீட்டாவில் உள்ளன என்பதை நினைவில் கொள்க. அவர்கள் எதிர்பார்த்தபடி வேலை செய்யக்கூடாது அல்லது எல்லா தளங்களிலும் வேலை செய்யக்கூடாது.'; + + @override + String get experimentalVideoCalls => 'சோதனை வீடியோ அழைப்புகள்'; + + @override + String get emailOrUsername => 'மின்னஞ்சல் அல்லது பயனர்பெயர்'; + + @override + String get indexedDbErrorTitle => 'தனியார் பயன்முறை சிக்கல்கள்'; + + @override + String get indexedDbErrorLong => + 'செய்தி சேமிப்பு துரதிர்ச்டவசமாக இயல்புநிலையாக தனிப்பட்ட பயன்முறையில் இயக்கப்படவில்லை.\n தயவுசெய்து பார்வையிடவும்\n - பற்றி: கட்டமைப்பு\n - கணம் dom.indexedDB.privateBrowsing.enabled பெறுநர் true\n இல்லையெனில், பஞ்சுபோன்றவை இயக்க முடியாது.'; + + @override + String switchToAccount(String number) { + return 'கணக்குக்கு மாறவும் $number'; + } + + @override + String get nextAccount => 'அடுத்த கணக்கு'; + + @override + String get previousAccount => 'முந்தைய கணக்கு'; + + @override + String get addWidget => 'விட்செட்டைச் சேர்க்கவும்'; + + @override + String get widgetVideo => 'ஒளிதோற்றம்'; + + @override + String get widgetEtherpad => 'உரை குறிப்பு'; + + @override + String get widgetJitsi => 'சிட்சி சந்திக்கிறார்'; + + @override + String get widgetCustom => 'தனிப்பயன்'; + + @override + String get widgetName => 'பெயர்'; + + @override + String get widgetUrlError => 'இது சரியான முகவரி அல்ல.'; + + @override + String get widgetNameError => 'காட்சி பெயரை வழங்கவும்.'; + + @override + String get errorAddingWidget => 'விட்செட்டைச் சேர்ப்பதில் பிழை.'; + + @override + String get youRejectedTheInvitation => 'நீங்கள் அழைப்பை நிராகரித்தீர்கள்'; + + @override + String get youJoinedTheChat => 'நீங்கள் அரட்டையில் சேர்ந்தீர்கள்'; + + @override + String get youAcceptedTheInvitation => + '👍 நீங்கள் அழைப்பை ஏற்றுக்கொண்டீர்கள்'; + + @override + String youBannedUser(String user) { + return 'நீங்கள் $user தடை செய்தீர்கள்'; + } + + @override + String youHaveWithdrawnTheInvitationFor(String user) { + return '$userக்கான அழைப்பை திரும்பப் பெற்றுவிட்டீர்கள்'; + } + + @override + String youInvitedToBy(String alias) { + return 'In இணைப்பு வழியாக நீங்கள் அழைக்கப்பட்டுள்ளீர்கள்:\n $alias'; + } + + @override + String youInvitedBy(String user) { + return '📩 நீங்கள் $user ஆல் அழைக்கப்பட்டுள்ளீர்கள்'; + } + + @override + String invitedBy(String user) { + return '$user அழைத்தார்'; + } + + @override + String youInvitedUser(String user) { + return '📩 $user ஐ அழைத்தீர்கள்'; + } + + @override + String youKicked(String user) { + return '👞 $userஐ உதைத்துள்ளீர்கள்'; + } + + @override + String youKickedAndBanned(String user) { + return '🙅 நீங்கள் உதைத்து தடைசெய்துள்ளீர்கள் $user'; + } + + @override + String youUnbannedUser(String user) { + return 'நீங்கள் $user தடைசெய்யவில்லை'; + } + + @override + String hasKnocked(String user) { + return '🚪 $user தட்டியது'; + } + + @override + String get usersMustKnock => 'பயனர்கள் தட்ட வேண்டும்'; + + @override + String get noOneCanJoin => 'யாரும் சேர முடியாது'; + + @override + String userWouldLikeToChangeTheChat(String user) { + return '$user அரட்டையில் சேர விரும்புகிறார்.'; + } + + @override + String get noPublicLinkHasBeenCreatedYet => + 'பொது இணைப்பு இதுவரை உருவாக்கப்படவில்லை'; + + @override + String get knock => 'தட்டவும்'; + + @override + String get users => 'பயனர்கள்'; + + @override + String get unlockOldMessages => 'பழைய செய்திகளைத் திறக்கவும்'; + + @override + String get storeInSecureStorageDescription => + 'மீட்பு விசையை இந்த சாதனத்தின் பாதுகாப்பான சேமிப்பகத்தில் சேமிக்கவும்.'; + + @override + String get saveKeyManuallyDescription => + 'கணினி பகிர்வு உரையாடல் அல்லது கிளிப்போர்டைத் தூண்டுவதன் மூலம் இந்த விசையை கைமுறையாக சேமிக்கவும்.'; + + @override + String get storeInAndroidKeystore => 'ஆண்ட்ராய்டு கீச்டோரில் சேமிக்கவும்'; + + @override + String get storeInAppleKeyChain => 'ஆப்பிள் கீச்சினில் சேமிக்கவும்'; + + @override + String get storeSecurlyOnThisDevice => + 'இந்த சாதனத்தில் பாதுகாப்பாக சேமிக்கவும்'; + + @override + String countFiles(int count) { + return '$count கோப்புகள்'; + } + + @override + String get user => 'பயனர்'; + + @override + String get custom => 'தனிப்பயன்'; + + @override + String get foregroundServiceRunning => + 'முன்புற பணி இயங்கும்போது இந்த அறிவிப்பு தோன்றும்.'; + + @override + String get screenSharingTitle => 'திரை பகிர்வு'; + + @override + String get screenSharingDetail => + 'உங்கள் திரையை FUFFYCHAT இல் பகிர்கிறீர்கள்'; + + @override + String get callingPermissions => 'அழைப்பு அனுமதிகள்'; + + @override + String get callingAccount => 'அழைப்பு கணக்கு'; + + @override + String get callingAccountDetails => + 'சொந்த ஆண்ட்ராய்டு டயலர் பயன்பாட்டைப் பயன்படுத்த பஞ்சுபோன்றது அனுமதிக்கிறது.'; + + @override + String get appearOnTop => 'மேலே தோன்றும்'; + + @override + String get appearOnTopDetails => + 'பயன்பாடு மேலே தோன்ற அனுமதிக்கிறது (நீங்கள் ஏற்கனவே ஒரு அழைப்பு கணக்காக பஞ்சுபோன்ற அமைப்பைக் கொண்டிருந்தால் தேவையில்லை)'; + + @override + String get otherCallingPermissions => + 'மைக்ரோஃபோன், கேமரா மற்றும் பிற பஞ்சுபோன்ற அனுமதிகள்'; + + @override + String get whyIsThisMessageEncrypted => 'இந்த செய்தி ஏன் படிக்க முடியாதது?'; + + @override + String get noKeyForThisMessage => + 'இந்த சாதனத்தில் உங்கள் கணக்கில் கையொப்பமிடுவதற்கு முன்பு செய்தி அனுப்பப்பட்டால் இது நிகழலாம்.\n\n அனுப்புநர் உங்கள் சாதனத்தைத் தடுத்துள்ளார் அல்லது இணைய இணைப்பில் ஏதேனும் தவறு ஏற்பட்டுள்ளது.\n\n மற்றொரு அமர்வில் செய்தியைப் படிக்க முடியுமா? அதிலிருந்து செய்தியை மாற்றலாம்! அமைப்புகள்> சாதனங்களுக்குச் சென்று, உங்கள் சாதனங்கள் ஒருவருக்கொருவர் சரிபார்த்துள்ளன என்பதை உறுதிப்படுத்தவும். அடுத்த முறை நீங்கள் அறையைத் திறக்கும்போது, இரண்டு அமர்வுகளும் முன்னணியில் இருக்கும்போது, விசைகள் தானாகவே அனுப்பப்படும்.\n\n வெளியேறும்போது அல்லது சாதனங்களை மாற்றும்போது விசைகளை இழக்க நீங்கள் விரும்பவில்லையா? அமைப்புகளில் அரட்டை காப்புப்பிரதியை நீங்கள் இயக்கியுள்ளீர்கள் என்பதை உறுதிப்படுத்திக் கொள்ளுங்கள்.'; + + @override + String get newGroup => 'புதிய குழு'; + + @override + String get newSpace => 'புதிய இடம்'; + + @override + String get enterSpace => 'இடத்தை உள்ளிடவும்'; + + @override + String get enterRoom => 'அறையை உள்ளிடவும்'; + + @override + String get allSpaces => 'அனைத்து இடங்களும்'; + + @override + String numChats(String number) { + return '$number அரட்டைகள்'; + } + + @override + String get hideUnimportantStateEvents => + 'முக்கியமற்ற மாநில நிகழ்வுகளை மறைக்கவும்'; + + @override + String get hidePresences => 'நிலை பட்டியலை மறைக்கவா?'; + + @override + String get doNotShowAgain => 'மீண்டும் காட்ட வேண்டாம்'; + + @override + String wasDirectChatDisplayName(String oldDisplayName) { + return 'வெற்று அரட்டை ($oldDisplayName)'; + } + + @override + String get newSpaceDescription => + 'உங்கள் அரட்டைகளை ஒருங்கிணைத்து தனியார் அல்லது பொது சமூகங்களை உருவாக்க இடைவெளிகள் உங்களை அனுமதிக்கிறது.'; + + @override + String get encryptThisChat => 'இந்த அரட்டையை குறியாக்கவும்'; + + @override + String get disableEncryptionWarning => + 'பாதுகாப்பு காரணங்களுக்காக நீங்கள் ஒரு அரட்டையில் குறியாக்கத்தை முடக்க முடியாது, அது இதற்கு முன்பு இயக்கப்பட்டிருக்கிறது.'; + + @override + String get sorryThatsNotPossible => 'மன்னிக்கவும் ... அது சாத்தியமில்லை'; + + @override + String get deviceKeys => 'சாதன விசைகள்:'; + + @override + String get reopenChat => 'அரட்டையை மீண்டும் திறக்கவும்'; + + @override + String get noBackupWarning => + 'எச்சரிக்கை! அரட்டை காப்புப்பிரதியை இயக்காமல், உங்கள் மறைகுறியாக்கப்பட்ட செய்திகளுக்கான அணுகலை இழப்பீர்கள். வெளியேறுவதற்கு முன் முதலில் அரட்டை காப்புப்பிரதியை இயக்க மிகவும் பரிந்துரைக்கப்படுகிறது.'; + + @override + String get noOtherDevicesFound => 'வேறு சாதனங்கள் எதுவும் கிடைக்கவில்லை'; + + @override + String fileIsTooBigForServer(String max) { + return 'அனுப்ப முடியவில்லை! சேவையகம் $max வரை இணைப்புகளை மட்டுமே ஆதரிக்கிறது.'; + } + + @override + String fileHasBeenSavedAt(String path) { + return 'கோப்பு $path'; + } + + @override + String get jumpToLastReadMessage => 'கடைசி வாசிப்பு செய்திக்கு செல்லவும்'; + + @override + String get readUpToHere => 'இங்கே படிக்கவும்'; + + @override + String get jump => 'தாவு'; + + @override + String get openLinkInBrowser => 'உலாவியில் திறந்த இணைப்பை திறக்கவும்'; + + @override + String get reportErrorDescription => + '😭 ஓ இல்லை. ஏதோ தவறு நடந்தது. நீங்கள் விரும்பினால், இந்த பிழையை டெவலப்பர்களிடம் புகாரளிக்கலாம்.'; + + @override + String get report => 'அறிக்கை'; + + @override + String get signInWithPassword => 'கடவுச்சொல்லுடன் உள்நுழைக'; + + @override + String get pleaseTryAgainLaterOrChooseDifferentServer => + 'தயவுசெய்து பின்னர் மீண்டும் முயற்சிக்கவும் அல்லது வேறு சேவையகத்தைத் தேர்வுசெய்க.'; + + @override + String signInWith(String provider) { + return '$provider மூலம் உள்நுழையவும்'; + } + + @override + String get profileNotFound => + 'பயனரை சேவையகத்தில் காண முடியவில்லை. ஒரு இணைப்பு சிக்கல் இருக்கலாம் அல்லது பயனர் இல்லை.'; + + @override + String get setTheme => 'கருப்பொருள் அமைக்கவும்:'; + + @override + String get setColorTheme => 'வண்ண கருப்பொருள் அமைக்கவும்:'; + + @override + String get invite => 'அழைக்கவும்'; + + @override + String get inviteGroupChat => 'Compect குழு அரட்டையை அழைக்கவும்'; + + @override + String get invitePrivateChat => 'தனிப்பட்ட தனியார் அரட்டையை அழைக்கவும்'; + + @override + String get invalidInput => 'தவறான உள்ளீடு!'; + + @override + String wrongPinEntered(int seconds) { + return 'தவறான முள் நுழைந்தது! $seconds விநாடிகளில் மீண்டும் முயற்சிக்கவும் ...'; + } + + @override + String get pleaseEnterANumber => + 'தயவுசெய்து 0 ஐ விட அதிகமான எண்ணை உள்ளிடவும்'; + + @override + String get archiveRoomDescription => + 'அரட்டை காப்பகத்திற்கு நகர்த்தப்படும். மற்ற பயனர்கள் நீங்கள் அரட்டையை விட்டுவிட்டீர்கள் என்பதைக் காண முடியும்.'; + + @override + String get roomUpgradeDescription => + 'அரட்டை பின்னர் புதிய அறை பதிப்பில் மீண்டும் உருவாக்கப்படும். பங்கேற்பாளர்கள் அனைவருக்கும் புதிய அரட்டைக்கு மாற வேண்டும் என்று அறிவிக்கப்படும். அறை பதிப்புகள் பற்றி மேலும் அறிய https://spec.matrix.org/latest/rooms/'; + + @override + String get removeDevicesDescription => + 'நீங்கள் இந்த சாதனத்திலிருந்து வெளியேறுவீர்கள், இனி செய்திகளைப் பெற முடியாது.'; + + @override + String get banUserDescription => + 'பயனர் அரட்டையிலிருந்து தடைசெய்யப்படுவார், மேலும் அவை தடைசெய்யப்படாத வரை மீண்டும் அரட்டையில் நுழைய முடியாது.'; + + @override + String get unbanUserDescription => + 'அவர்கள் முயற்சித்தால் பயனர் மீண்டும் அரட்டையை உள்ளிட முடியும்.'; + + @override + String get kickUserDescription => + 'பயனர் அரட்டையிலிருந்து வெளியேற்றப்படுகிறார், ஆனால் தடை செய்யப்படவில்லை. பொது அரட்டைகளில், பயனர் எந்த நேரத்திலும் மீண்டும் சேரலாம்.'; + + @override + String get makeAdminDescription => + 'இந்த பயனர் நிர்வாகியை நீங்கள் செய்தவுடன், இதை நீங்கள் செயல்தவிர்க்க முடியாமல் போகலாம், ஏனெனில் அவை உங்களைப் போன்ற அதே அனுமதிகளைக் கொண்டிருக்கும்.'; + + @override + String get pushNotificationsNotAvailable => 'புச் அறிவிப்புகள் கிடைக்கவில்லை'; + + @override + String get learnMore => 'மேலும் அறிக'; + + @override + String get yourGlobalUserIdIs => 'உங்கள் உலகளாவிய பயனர் ஐடி: '; + + @override + String noUsersFoundWithQuery(String query) { + return 'துரதிர்ச்டவசமாக \"$query\" உடன் எந்த பயனரையும் காண முடியவில்லை. நீங்கள் ஒரு எழுத்துப்பிழை செய்தீர்களா என்பதை சரிபார்க்கவும்.'; + } + + @override + String get knocking => 'தட்டுதல்'; + + @override + String chatCanBeDiscoveredViaSearchOnServer(String server) { + return '$server'; + } + + @override + String get searchChatsRooms => '#Chats, Us பயனர்களைத் தேடுங்கள் ...'; + + @override + String get nothingFound => 'எதுவும் கிடைக்கவில்லை ...'; + + @override + String get groupName => 'குழு பெயர்'; + + @override + String get createGroupAndInviteUsers => + 'ஒரு குழுவை உருவாக்கி பயனர்களை அழைக்கவும்'; + + @override + String get groupCanBeFoundViaSearch => 'தேடல் வழியாக குழுவை காணலாம்'; + + @override + String get wrongRecoveryKey => + 'மன்னிக்கவும் ... இது சரியான மீட்பு விசையாகத் தெரியவில்லை.'; + + @override + String get startConversation => 'உரையாடலைத் தொடங்குங்கள்'; + + @override + String get commandHint_sendraw => 'மூல சாதொபொகு ஐ அனுப்புங்கள்'; + + @override + String get databaseMigrationTitle => 'தரவுத்தளம் உகந்ததாக உள்ளது'; + + @override + String get databaseMigrationBody => + 'தயவுசெய்து காத்திருங்கள். இது ஒரு கணம் ஆகலாம்.'; + + @override + String get leaveEmptyToClearStatus => 'உங்கள் நிலையை அழிக்க காலியாக விடவும்.'; + + @override + String get select => 'தேர்ந்தெடு'; + + @override + String get searchForUsers => '@Users ஐத் தேடுங்கள் ...'; + + @override + String get pleaseEnterYourCurrentPassword => + 'உங்கள் தற்போதைய கடவுச்சொல்லை உள்ளிடவும்'; + + @override + String get newPassword => 'புதிய கடவுச்சொல்'; + + @override + String get pleaseChooseAStrongPassword => 'வலுவான கடவுச்சொல்லைத் தேர்வுசெய்க'; + + @override + String get passwordsDoNotMatch => 'கடவுச்சொற்கள் பொருந்தவில்லை'; + + @override + String get passwordIsWrong => 'நீங்கள் உள்ளிட்ட கடவுச்சொல் தவறு'; + + @override + String get publicLink => 'பொது இணைப்பு'; + + @override + String get publicChatAddresses => 'பொது அரட்டை முகவரிகள்'; + + @override + String get createNewAddress => 'புதிய முகவரியை உருவாக்கவும்'; + + @override + String get joinSpace => 'விண்வெளியில் சேரவும்'; + + @override + String get publicSpaces => 'பொது இடங்கள்'; + + @override + String get addChatOrSubSpace => 'அரட்டை அல்லது துணை இடத்தைச் சேர்க்கவும்'; + + @override + String get subspace => 'துணை'; + + @override + String get decline => 'வீழ்ச்சி'; + + @override + String get thisDevice => 'இந்த சாதனம்:'; + + @override + String get initAppError => 'பயன்பாட்டைத் தொடங்கும்போது பிழை ஏற்பட்டது'; + + @override + String get userRole => 'பயனர் பங்கு'; + + @override + String minimumPowerLevel(String level) { + return '$level என்பது குறைந்தபட்ச ஆற்றல் நிலை.'; + } + + @override + String searchIn(String chat) { + return 'அரட்டையில் தேடு \"$chat\" ...'; + } + + @override + String get searchMore => 'மேலும் தேடுங்கள் ...'; + + @override + String get gallery => 'கேலரி'; + + @override + String get files => 'கோப்புகள்'; + + @override + String databaseBuildErrorBody(String url, String error) { + return 'SQlite தரவுத்தளத்தை உருவாக்க முடியவில்லை. ஆப்ஸ் தற்போதைக்கு மரபு தரவுத்தளத்தைப் பயன்படுத்த முயற்சிக்கிறது. $url இல் டெவலப்பர்களிடம் இந்தப் பிழையைப் புகாரளிக்கவும். பிழை செய்தி: $error'; + } + + @override + String sessionLostBody(String url, String error) { + return 'உங்கள் அமர்வு தொலைந்துவிட்டது. $url இல் டெவலப்பர்களிடம் இந்தப் பிழையைப் புகாரளிக்கவும். பிழை செய்தி: $error'; + } + + @override + String restoreSessionBody(String url, String error) { + return 'ஆப்ஸ் இப்போது உங்கள் அமர்வை காப்புப்பிரதியிலிருந்து மீட்டெடுக்க முயற்சிக்கிறது. $url இல் டெவலப்பர்களிடம் இந்தப் பிழையைப் புகாரளிக்கவும். பிழை செய்தி: $error'; + } + + @override + String forwardMessageTo(String roomName) { + return 'செய்தியை $roomNameக்கு அனுப்பவா?'; + } + + @override + String get sendReadReceipts => 'வாசிப்பு ரசீதுகளை அனுப்பவும்'; + + @override + String get sendTypingNotificationsDescription => + 'அரட்டையில் பங்கேற்பாளர்கள் நீங்கள் ஒரு புதிய செய்தியைத் தட்டச்சு செய்யும் போது காணலாம்.'; + + @override + String get sendReadReceiptsDescription => + 'அரட்டையில் பங்கேற்பாளர்கள் நீங்கள் ஒரு செய்தியைப் படிக்கும்போது பார்க்கலாம்.'; + + @override + String get formattedMessages => 'வடிவமைக்கப்பட்ட செய்திகள்'; + + @override + String get formattedMessagesDescription => + 'மார்க் டவுனைப் பயன்படுத்தி தைரியமான உரை போன்ற பணக்கார செய்தி உள்ளடக்கத்தைக் காண்பி.'; + + @override + String get verifyOtherUser => 'Poser மற்ற பயனரை சரிபார்க்கவும்'; + + @override + String get verifyOtherUserDescription => + 'நீங்கள் மற்றொரு பயனரைச் சரிபார்த்தால், நீங்கள் உண்மையில் யாருக்கு எழுதுகிறீர்கள் என்பது உங்களுக்குத் தெரியும் என்பதை நீங்கள் உறுதியாக நம்பலாம். .\n\n நீங்கள் ஒரு சரிபார்ப்பைத் தொடங்கும்போது, நீங்களும் மற்ற பயனரும் பயன்பாட்டில் ஒரு பாப்அப்பைக் காண்பீர்கள். நீங்கள் ஒருவருக்கொருவர் ஒப்பிட வேண்டிய தொடர்ச்சியான ஈமோசிகள் அல்லது எண்களைக் காண்பீர்கள்.\n\n இதைச் செய்வதற்கான சிறந்த வழி வீடியோ அழைப்பைச் சந்திப்பது அல்லது தொடங்குவது. .'; + + @override + String get verifyOtherDevice => 'Sevice பிற சாதனத்தை சரிபார்க்கவும்'; + + @override + String get verifyOtherDeviceDescription => + 'நீங்கள் மற்றொரு சாதனத்தை சரிபார்க்கும்போது, அந்த சாதனங்கள் விசைகளை பரிமாறிக்கொள்ளலாம், உங்கள் ஒட்டுமொத்த பாதுகாப்பை அதிகரிக்கும். So நீங்கள் ஒரு சரிபார்ப்பைத் தொடங்கும்போது, இரண்டு சாதனங்களிலும் பயன்பாட்டில் ஒரு பாப்அப் தோன்றும். நீங்கள் ஒருவருக்கொருவர் ஒப்பிட வேண்டிய தொடர்ச்சியான ஈமோசிகள் அல்லது எண்களைக் காண்பீர்கள். நீங்கள் சரிபார்ப்பைத் தொடங்குவதற்கு முன்பு இரண்டு சாதனங்களையும் எளிதில் வைத்திருப்பது நல்லது. .'; + + @override + String acceptedKeyVerification(String sender) { + return '$sender ஏற்றுக்கொள்ளப்பட்ட விசை சரிபார்ப்பு'; + } + + @override + String canceledKeyVerification(String sender) { + return '$sender ரத்து செய்யப்பட்ட விசை சரிபார்ப்பு'; + } + + @override + String completedKeyVerification(String sender) { + return '$sender நிறைவு செய்யப்பட்ட விசை சரிபார்ப்பு'; + } + + @override + String isReadyForKeyVerification(String sender) { + return 'விசை சரிபார்ப்பிற்கு $sender தயாராக உள்ளார்'; + } + + @override + String requestedKeyVerification(String sender) { + return '$sender கோரப்பட்ட விசை சரிபார்ப்பு'; + } + + @override + String startedKeyVerification(String sender) { + return '$sender விசை சரிபார்ப்பைத் தொடங்கினார்'; + } + + @override + String get transparent => 'வெளிப்படையானது'; + + @override + String get incomingMessages => 'உள்வரும் செய்திகள்'; + + @override + String get stickers => 'ச்டிக்கர்கள்'; + + @override + String get discover => 'கண்டுபிடி'; + + @override + String get commandHint_ignore => + 'கொடுக்கப்பட்ட மேட்ரிக்ச் ஐடியை புறக்கணிக்கவும்'; + + @override + String get commandHint_unignore => + 'கொடுக்கப்பட்ட மேட்ரிக்ச் ஐடியை இணைக்கவும்'; + + @override + String unreadChatsInApp(String appname, String unread) { + return '$appname: $unread படிக்காத அரட்டைகள்'; + } + + @override + String get noDatabaseEncryption => + 'இந்த மேடையில் தரவுத்தள குறியாக்கம் ஆதரிக்கப்படவில்லை'; + + @override + String thereAreCountUsersBlocked(Object count) { + return 'இப்போது $count பயனர்கள் தடுக்கப்பட்டுள்ளனர்.'; + } + + @override + String get restricted => 'தடைசெய்யப்பட்டது'; + + @override + String get knockRestricted => 'நாக் தடை'; + + @override + String goToSpace(Object space) { + return 'விண்வெளிக்குச் செல்லுங்கள்: $space'; + } + + @override + String get markAsUnread => 'படிக்காத எனக் குறிக்கவும்'; + + @override + String userLevel(int level) { + return '$level - பயனர்'; + } + + @override + String moderatorLevel(int level) { + return '$level - மதிப்பீட்டாளர்'; + } + + @override + String adminLevel(int level) { + return '$level - நிர்வாகி'; + } + + @override + String get changeGeneralChatSettings => 'பொது அரட்டை அமைப்புகளை மாற்றவும்'; + + @override + String get inviteOtherUsers => 'இந்த அரட்டைக்கு மற்ற பயனர்களை அழைக்கவும்'; + + @override + String get changeTheChatPermissions => 'அரட்டை அனுமதிகளை மாற்றவும்'; + + @override + String get changeTheVisibilityOfChatHistory => + 'அரட்டை வரலாற்றின் தெரிவுநிலையை மாற்றவும்'; + + @override + String get changeTheCanonicalRoomAlias => + 'முக்கிய பொது அரட்டை முகவரியை மாற்றவும்'; + + @override + String get sendRoomNotifications => 'ஒரு @ROOM அறிவிப்புகளை அனுப்பவும்'; + + @override + String get changeTheDescriptionOfTheGroup => + 'அரட்டையின் விளக்கத்தை மாற்றவும்'; + + @override + String get chatPermissionsDescription => + 'இந்த அரட்டையில் சில செயல்களுக்கு எந்த ஆற்றல் நிலை தேவை என்பதை வரையறுக்கவும். 0, 50 மற்றும் 100 ஆற்றல் நிலைகள் பொதுவாக பயனர்கள், மதிப்பீட்டாளர்கள் மற்றும் நிர்வாகிகளைக் குறிக்கின்றன, ஆனால் எந்த தரமும் சாத்தியமாகும்.'; + + @override + String updateInstalled(String version) { + return '🎉 புதுப்பிப்பு $version நிறுவப்பட்டது!'; + } + + @override + String get changelog => 'மாற்றபதிவு'; + + @override + String get sendCanceled => 'அனுப்பப்பட்டது ரத்து செய்யப்பட்டது'; + + @override + String get loginWithMatrixId => 'மேட்ரிக்ச்-ஐடியுடன் உள்நுழைக'; + + @override + String get discoverHomeservers => 'ஓம்சர்சர்களைக் கண்டறியவும்'; + + @override + String get whatIsAHomeserver => 'ஓம்சர்வர் என்றால் என்ன?'; + + @override + String get homeserverDescription => + 'உங்கள் எல்லா தரவுகளும் ஒரு மின்னஞ்சல் வழங்குநரைப் போலவே ஓம்சர்வரில் சேமிக்கப்படுகின்றன. நீங்கள் எந்த ஓம்சர்வரை பயன்படுத்த விரும்புகிறீர்கள் என்பதை நீங்கள் தேர்வு செய்யலாம், அதே நேரத்தில் நீங்கள் எல்லோரிடமும் தொடர்பு கொள்ளலாம். Https://matrix.org இல் மேலும் அறிக.'; + + @override + String get doesNotSeemToBeAValidHomeserver => + 'இணக்கமான ஓம்சர்வர் என்று தெரியவில்லை. தவறான URL?'; + + @override + String get calculatingFileSize => 'கோப்பு அளவைக் கணக்கிடுகிறது ...'; + + @override + String get prepareSendingAttachment => 'அனுப்பும் இணைப்பைத் தயாரிக்கவும் ...'; + + @override + String get sendingAttachment => 'இணைப்பை அனுப்புகிறது ...'; + + @override + String get generatingVideoThumbnail => + 'வீடியோ சிறு உருவத்தை உருவாக்குதல் ...'; + + @override + String get compressVideo => 'அமைக்கும் வீடியோ ...'; + + @override + String sendingAttachmentCountOfCount(int index, int length) { + return '$length இன் இணைப்பு $indexஐ அனுப்புகிறது...'; + } + + @override + String serverLimitReached(int seconds) { + return 'சேவையக வரம்பு அடைந்தது! $seconds விநாடிகள் காத்திருக்கிறது ...'; + } + + @override + String get oneOfYourDevicesIsNotVerified => + 'உங்கள் சாதனங்களில் ஒன்று சரிபார்க்கப்படவில்லை'; + + @override + String get noticeChatBackupDeviceVerification => + 'குறிப்பு: உங்கள் எல்லா சாதனங்களையும் அரட்டை காப்புப்பிரதியுடன் இணைக்கும்போது, அவை தானாகவே சரிபார்க்கப்படும்.'; + + @override + String get continueText => 'தொடரவும்'; + + @override + String get welcomeText => + 'ஏய் ஏய் 👋 இது பஞ்சுபோன்றது. Https://matrix.org உடன் இணக்கமான எந்த ஓம்சர்வரில் நீங்கள் உள்நுழையலாம். பின்னர் யாருடனும் அரட்டையடிக்கவும். இது ஒரு பெரிய பரவலாக்கப்பட்ட செய்தியிடல் நெட்வொர்க்!'; + + @override + String get blur => 'மங்கலானது:'; + + @override + String get opacity => 'ஒளிபுகாநிலை:'; + + @override + String get setWallpaper => 'வால்பேப்பரை அமைக்கவும்'; + + @override + String get manageAccount => 'கணக்கை நிர்வகிக்கவும்'; + + @override + String get noContactInformationProvided => + 'சேவையகம் எந்த சரியான தொடர்பு தகவலையும் வழங்காது'; + + @override + String get contactServerAdmin => 'சேவையக நிர்வாகி தொடர்பு'; + + @override + String get contactServerSecurity => 'சேவையக பாதுகாப்பைத் தொடர்பு கொள்ளுங்கள்'; + + @override + String get supportPage => 'உதவி பக்கம்'; + + @override + String get serverInformation => 'சேவையக தகவல்:'; + + @override + String get name => 'பெயர்'; + + @override + String get version => 'பதிப்பு'; + + @override + String get website => 'வலைத்தளம்'; + + @override + String get compress => 'சுருக்க'; + + @override + String get boldText => 'தைரியமான உரை'; + + @override + String get italicText => 'சாய்வு உரை'; + + @override + String get strikeThrough => 'ச்ட்ரைகெத்ரோ'; + + @override + String get pleaseFillOut => 'தயவுசெய்து நிரப்பவும்'; + + @override + String get invalidUrl => 'தவறான முகவரி'; + + @override + String get addLink => 'இணைப்பைச் சேர்க்கவும்'; + + @override + String get unableToJoinChat => + 'அரட்டையில் சேர முடியவில்லை. ஒருவேளை மற்ற கட்சி ஏற்கனவே உரையாடலை மூடியிருக்கலாம்.'; + + @override + String get previous => 'Previous'; + + @override + String get otherPartyNotLoggedIn => + 'The other party is currently not logged in and therefore cannot receive messages!'; + + @override + String appWantsToUseForLogin(String server) { + return 'Use \'$server\' to log in'; + } + + @override + String get appWantsToUseForLoginDescription => + 'You hereby allow the app and website to share information about you.'; + + @override + String get open => 'Open'; + + @override + String get waitingForServer => 'Waiting for server...'; + + @override + String get appIntroduction => + 'Extera lets you chat with your friends across different messengers. Learn more at https://matrix.org or just tap *Continue*.'; + + @override + String get newChatRequest => '📩 New chat request'; + + @override + String get contentNotificationSettings => 'Content notification settings'; + + @override + String get generalNotificationSettings => 'General notification settings'; + + @override + String get roomNotificationSettings => 'Room notification settings'; + + @override + String get userSpecificNotificationSettings => + 'User specific notification settings'; + + @override + String get otherNotificationSettings => 'Other notification settings'; + + @override + String get notificationRuleContainsUserName => 'Contains User Name'; + + @override + String get notificationRuleContainsUserNameDescription => + 'Notifies the user when a message contains their username.'; + + @override + String get notificationRuleMaster => 'Mute all notifications'; + + @override + String get notificationRuleMasterDescription => + 'Overrides all other rules and disables all notifications.'; + + @override + String get notificationRuleSuppressNotices => 'Suppress Automated Messages'; + + @override + String get notificationRuleSuppressNoticesDescription => + 'Suppresses notifications from automated clients like bots.'; + + @override + String get notificationRuleInviteForMe => 'Invite for Me'; + + @override + String get notificationRuleInviteForMeDescription => + 'Notifies the user when they are invited to a room.'; + + @override + String get notificationRuleMemberEvent => 'Member Event'; + + @override + String get notificationRuleMemberEventDescription => + 'Suppresses notifications for membership events.'; + + @override + String get notificationRuleIsUserMention => 'User Mention'; + + @override + String get notificationRuleIsUserMentionDescription => + 'Notifies the user when they are directly mentioned in a message.'; + + @override + String get notificationRuleContainsDisplayName => 'Contains Display Name'; + + @override + String get notificationRuleContainsDisplayNameDescription => + 'Notifies the user when a message contains their display name.'; + + @override + String get notificationRuleIsRoomMention => 'Room Mention'; + + @override + String get notificationRuleIsRoomMentionDescription => + 'Notifies the user when there is a room mention.'; + + @override + String get notificationRuleRoomnotif => 'Room Notification'; + + @override + String get notificationRuleRoomnotifDescription => + 'Notifies the user when a message contains \'@room\'.'; + + @override + String get notificationRuleTombstone => 'Tombstone'; + + @override + String get notificationRuleTombstoneDescription => + 'Notifies the user about room deactivation messages.'; + + @override + String get notificationRuleReaction => 'Reaction'; + + @override + String get notificationRuleReactionDescription => + 'Suppresses notifications for reactions.'; + + @override + String get notificationRuleRoomServerAcl => 'Room Server ACL'; + + @override + String get notificationRuleRoomServerAclDescription => + 'Suppresses notifications for room server access control lists (ACL).'; + + @override + String get notificationRuleSuppressEdits => 'Suppress Edits'; + + @override + String get notificationRuleSuppressEditsDescription => + 'Suppresses notifications for edited messages.'; + + @override + String get notificationRuleCall => 'Call'; + + @override + String get notificationRuleCallDescription => + 'Notifies the user about calls.'; + + @override + String get notificationRuleEncryptedRoomOneToOne => + 'Encrypted Room One-to-One'; + + @override + String get notificationRuleEncryptedRoomOneToOneDescription => + 'Notifies the user about messages in encrypted one-to-one rooms.'; + + @override + String get notificationRuleRoomOneToOne => 'Room One-to-One'; + + @override + String get notificationRuleRoomOneToOneDescription => + 'Notifies the user about messages in one-to-one rooms.'; + + @override + String get notificationRuleMessage => 'Message'; + + @override + String get notificationRuleMessageDescription => + 'Notifies the user about general messages.'; + + @override + String get notificationRuleEncrypted => 'Encrypted'; + + @override + String get notificationRuleEncryptedDescription => + 'Notifies the user about messages in encrypted rooms.'; + + @override + String get notificationRuleJitsi => 'Jitsi'; + + @override + String get notificationRuleJitsiDescription => + 'Notifies the user about Jitsi widget events.'; + + @override + String get notificationRuleServerAcl => 'Suppress Server ACL Events'; + + @override + String get notificationRuleServerAclDescription => + 'Suppresses notifications for Server ACL events.'; + + @override + String unknownPushRule(String rule) { + return 'Unknown push rule \'$rule\''; + } + + @override + String get deletePushRuleCanNotBeUndone => + 'If you delete this notification setting, this can not be undone.'; + + @override + String get more => 'More'; + + @override + String get shareKeysWith => 'Share keys with...'; + + @override + String get shareKeysWithDescription => + 'Which devices should be trusted so that they can read along your messages in encrypted chats?'; + + @override + String get allDevices => 'All devices'; + + @override + String get crossVerifiedDevicesIfEnabled => + 'Cross verified devices if enabled'; + + @override + String get crossVerifiedDevices => 'Cross verified devices'; + + @override + String get verifiedDevicesOnly => 'Verified devices only'; + + @override + String get takeAPhoto => 'Take a photo'; + + @override + String get recordAVideo => 'Record a video'; + + @override + String get optionalMessage => '(Optional) message...'; + + @override + String get notSupportedOnThisDevice => 'Not supported on this device'; + + @override + String get enterNewChat => 'Enter new chat'; + + @override + String get approve => 'Approve'; + + @override + String get youHaveKnocked => 'You have knocked'; + + @override + String get pleaseWaitUntilInvited => + 'Please wait now, until someone from the room invites you.'; +} diff --git a/lib/generated/l10n/l10n_te.dart b/lib/generated/l10n/l10n_te.dart new file mode 100644 index 0000000..e85c9cc --- /dev/null +++ b/lib/generated/l10n/l10n_te.dart @@ -0,0 +1,2745 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'l10n.dart'; + +// ignore_for_file: type=lint + +/// The translations for Telugu (`te`). +class L10nTe extends L10n { + L10nTe([String locale = 'te']) : super(locale); + + @override + String get noSendPermission => 'You can\'t send messages here'; + + @override + String get alwaysUse24HourFormat => 'తప్పుడు'; + + @override + String get repeatPassword => 'పాస్‌వర్డ్‌ను పునరావృతం చేయండి'; + + @override + String get notAnImage => 'ఇమేజ్ ఫైల్ కాదు.'; + + @override + String get setCustomPermissionLevel => 'Set custom permission level'; + + @override + String get setPermissionsLevelDescription => + 'Please choose a predefined role below or enter a custom permission level between 0 and 100.'; + + @override + String get ignoreUser => 'Ignore user'; + + @override + String get normalUser => 'Normal user'; + + @override + String get remove => 'తొలగించు'; + + @override + String get importNow => 'Import now'; + + @override + String get importEmojis => 'Import Emojis'; + + @override + String get importFromZipFile => 'Import from .zip file'; + + @override + String get exportEmotePack => 'Export Emote pack as .zip'; + + @override + String get replace => 'Replace'; + + @override + String get about => 'About'; + + @override + String aboutHomeserver(String homeserver) { + return 'About $homeserver'; + } + + @override + String get accept => 'Accept'; + + @override + String acceptedTheInvitation(String username) { + return '👍 $username accepted the invitation'; + } + + @override + String get account => 'Account'; + + @override + String activatedEndToEndEncryption(String username) { + return '🔐 $username activated end to end encryption'; + } + + @override + String get addEmail => 'Add email'; + + @override + String get confirmMatrixId => + 'Please confirm your Matrix ID in order to delete your account.'; + + @override + String supposedMxid(String mxid) { + return 'This should be $mxid'; + } + + @override + String get addChatDescription => 'Add a chat description...'; + + @override + String get addToSpace => 'Add to space'; + + @override + String get admin => 'Admin'; + + @override + String get alias => 'alias'; + + @override + String get all => 'All'; + + @override + String get allChats => 'All chats'; + + @override + String get commandHint_roomupgrade => + 'Upgrade this room to the given room version'; + + @override + String get commandHint_googly => 'Send some googly eyes'; + + @override + String get commandHint_cuddle => 'Send a cuddle'; + + @override + String get commandHint_hug => 'Send a hug'; + + @override + String googlyEyesContent(String senderName) { + return '$senderName sends you googly eyes'; + } + + @override + String cuddleContent(String senderName) { + return '$senderName cuddles you'; + } + + @override + String hugContent(String senderName) { + return '$senderName hugs you'; + } + + @override + String answeredTheCall(String senderName) { + return '$senderName answered the call'; + } + + @override + String get anyoneCanJoin => 'Anyone can join'; + + @override + String get appLock => 'App lock'; + + @override + String get appLockDescription => + 'Lock the app when not using with a pin code'; + + @override + String get archive => 'Archive'; + + @override + String get areGuestsAllowedToJoin => 'Are guest users allowed to join'; + + @override + String get areYouSure => 'Are you sure?'; + + @override + String get areYouSureYouWantToLogout => 'Are you sure you want to log out?'; + + @override + String get askSSSSSign => + 'To be able to sign the other person, please enter your secure store passphrase or recovery key.'; + + @override + String askVerificationRequest(String username) { + return 'Accept this verification request from $username?'; + } + + @override + String get autoplayImages => + 'Automatically play animated stickers and emotes'; + + @override + String badServerLoginTypesException(String serverVersions, + String supportedVersions, Object suportedVersions) { + return 'The homeserver supports the login types:\n$serverVersions\nBut this app supports only:\n$supportedVersions'; + } + + @override + String get sendTypingNotifications => 'Send typing notifications'; + + @override + String get swipeRightToLeftToReply => 'Swipe right to left to reply'; + + @override + String get sendOnEnter => 'Send on enter'; + + @override + String badServerVersionsException(String serverVersions, + String supportedVersions, Object serverVerions, Object suportedVersions) { + return 'The homeserver supports the Spec versions:\n$serverVersions\nBut this app supports only $supportedVersions'; + } + + @override + String countChatsAndCountParticipants(int chats, int participants) { + return '$chats chats and $participants participants'; + } + + @override + String get noMoreChatsFound => 'No more chats found...'; + + @override + String get noChatsFoundHere => + 'No chats found here yet. Start a new chat with someone by using the button below. ⤵️'; + + @override + String get joinedChats => 'Joined chats'; + + @override + String get unread => 'Unread'; + + @override + String get space => 'Space'; + + @override + String get spaces => 'Spaces'; + + @override + String get banFromChat => 'Ban from chat'; + + @override + String get banned => 'Banned'; + + @override + String bannedUser(String username, String targetName) { + return '$username banned $targetName'; + } + + @override + String get blockDevice => 'Block Device'; + + @override + String get blocked => 'Blocked'; + + @override + String get botMessages => 'Bot messages'; + + @override + String get cancel => 'Cancel'; + + @override + String cantOpenUri(String uri) { + return 'Can\'t open the URI $uri'; + } + + @override + String get changeDeviceName => 'Change device name'; + + @override + String changedTheChatAvatar(String username) { + return '$username changed the chat avatar'; + } + + @override + String changedTheChatDescriptionTo(String username, String description) { + return '$username changed the chat description to: \'$description\''; + } + + @override + String changedTheChatNameTo(String username, String chatname) { + return '$username changed the chat name to: \'$chatname\''; + } + + @override + String changedTheChatPermissions(String username) { + return '$username changed the chat permissions'; + } + + @override + String changedTheDisplaynameTo(String username, String displayname) { + return '$username changed their displayname to: \'$displayname\''; + } + + @override + String changedTheGuestAccessRules(String username) { + return '$username changed the guest access rules'; + } + + @override + String changedTheGuestAccessRulesTo(String username, String rules) { + return '$username changed the guest access rules to: $rules'; + } + + @override + String changedTheHistoryVisibility(String username) { + return '$username changed the history visibility'; + } + + @override + String changedTheHistoryVisibilityTo(String username, String rules) { + return '$username changed the history visibility to: $rules'; + } + + @override + String changedTheJoinRules(String username) { + return '$username changed the join rules'; + } + + @override + String changedTheJoinRulesTo(String username, String joinRules) { + return '$username changed the join rules to: $joinRules'; + } + + @override + String changedTheProfileAvatar(String username) { + return '$username changed their avatar'; + } + + @override + String changedTheRoomAliases(String username) { + return '$username changed the room aliases'; + } + + @override + String changedTheRoomInvitationLink(String username) { + return '$username changed the invitation link'; + } + + @override + String get changePassword => 'Change password'; + + @override + String get changeTheHomeserver => 'Change the homeserver'; + + @override + String get changeTheme => 'Change your style'; + + @override + String get changeTheNameOfTheGroup => 'Change the name of the group'; + + @override + String get changeYourAvatar => 'Change your avatar'; + + @override + String get channelCorruptedDecryptError => + 'The encryption has been corrupted'; + + @override + String get chat => 'Chat'; + + @override + String get yourChatBackupHasBeenSetUp => 'Your chat backup has been set up.'; + + @override + String get chatBackup => 'Chat backup'; + + @override + String get chatBackupDescription => + 'Your old messages are secured with a recovery key. Please make sure you don\'t lose it.'; + + @override + String get chatDetails => 'Chat details'; + + @override + String get chatHasBeenAddedToThisSpace => 'Chat has been added to this space'; + + @override + String get chats => 'Chats'; + + @override + String get chooseAStrongPassword => 'Choose a strong password'; + + @override + String get clearArchive => 'Clear archive'; + + @override + String get close => 'Close'; + + @override + String get commandHint_markasdm => + 'Mark as direct message room for the giving Matrix ID'; + + @override + String get commandHint_markasgroup => 'Mark as group'; + + @override + String get commandHint_ban => 'Ban the given user from this room'; + + @override + String get commandHint_clearcache => 'Clear cache'; + + @override + String get commandHint_create => + 'Create an empty group chat\nUse --no-encryption to disable encryption'; + + @override + String get commandHint_discardsession => 'Discard session'; + + @override + String get commandHint_dm => + 'Start a direct chat\nUse --no-encryption to disable encryption'; + + @override + String get commandHint_html => 'Send HTML-formatted text'; + + @override + String get commandHint_invite => 'Invite the given user to this room'; + + @override + String get commandHint_join => 'Join the given room'; + + @override + String get commandHint_kick => 'Remove the given user from this room'; + + @override + String get commandHint_leave => 'Leave this room'; + + @override + String get commandHint_me => 'Describe yourself'; + + @override + String get commandHint_myroomavatar => + 'Set your picture for this room (by mxc-uri)'; + + @override + String get commandHint_myroomnick => 'Set your display name for this room'; + + @override + String get commandHint_op => + 'Set the given user\'s power level (default: 50)'; + + @override + String get commandHint_plain => 'Send unformatted text'; + + @override + String get commandHint_react => 'Send reply as a reaction'; + + @override + String get commandHint_send => 'Send text'; + + @override + String get commandHint_unban => 'Unban the given user from this room'; + + @override + String get commandInvalid => 'Command invalid'; + + @override + String commandMissing(String command) { + return '$command is not a command.'; + } + + @override + String get compareEmojiMatch => 'Please compare the emojis'; + + @override + String get compareNumbersMatch => 'Please compare the numbers'; + + @override + String get configureChat => 'Configure chat'; + + @override + String get confirm => 'Confirm'; + + @override + String get connect => 'Connect'; + + @override + String get contactHasBeenInvitedToTheGroup => + 'Contact has been invited to the group'; + + @override + String get containsDisplayName => 'Contains display name'; + + @override + String get containsUserName => 'Contains username'; + + @override + String get contentHasBeenReported => + 'The content has been reported to the server admins'; + + @override + String get copiedToClipboard => 'Copied to clipboard'; + + @override + String get copy => 'Copy'; + + @override + String get copyToClipboard => 'Copy to clipboard'; + + @override + String couldNotDecryptMessage(String error) { + return 'Could not decrypt message: $error'; + } + + @override + String countParticipants(int count) { + return '$count participants'; + } + + @override + String get create => 'Create'; + + @override + String createdTheChat(String username) { + return '💬 $username created the chat'; + } + + @override + String get createGroup => 'Create group'; + + @override + String get createNewSpace => 'New space'; + + @override + String get currentlyActive => 'Currently active'; + + @override + String get darkTheme => 'Dark'; + + @override + String dateAndTimeOfDay(String date, String timeOfDay) { + return '$date, $timeOfDay'; + } + + @override + String dateWithoutYear(String month, String day) { + return '$month-$day'; + } + + @override + String dateWithYear(String year, String month, String day) { + return '$year-$month-$day'; + } + + @override + String get deactivateAccountWarning => + 'This will deactivate your user account. This can not be undone! Are you sure?'; + + @override + String get defaultPermissionLevel => 'Default permission level for new users'; + + @override + String get delete => 'Delete'; + + @override + String get deleteAccount => 'Delete account'; + + @override + String get deleteMessage => 'Delete message'; + + @override + String get device => 'Device'; + + @override + String get deviceId => 'Device ID'; + + @override + String get devices => 'Devices'; + + @override + String get directChats => 'Direct Chats'; + + @override + String get allRooms => 'All Group Chats'; + + @override + String get displaynameHasBeenChanged => 'Displayname has been changed'; + + @override + String get downloadFile => 'Download file'; + + @override + String get edit => 'Edit'; + + @override + String get editBlockedServers => 'Edit blocked servers'; + + @override + String get chatPermissions => 'Chat permissions'; + + @override + String get editDisplayname => 'Edit displayname'; + + @override + String get editRoomAliases => 'Edit room aliases'; + + @override + String get editRoomAvatar => 'Edit room avatar'; + + @override + String get emoteExists => 'Emote already exists!'; + + @override + String get emoteInvalid => 'Invalid emote shortcode!'; + + @override + String get emoteKeyboardNoRecents => + 'Recently-used emotes will appear here...'; + + @override + String get emotePacks => 'Emote packs for room'; + + @override + String get emoteSettings => 'Emote Settings'; + + @override + String get globalChatId => 'Global chat ID'; + + @override + String get accessAndVisibility => 'Access and visibility'; + + @override + String get accessAndVisibilityDescription => + 'Who is allowed to join this chat and how the chat can be discovered.'; + + @override + String get calls => 'Calls'; + + @override + String get customEmojisAndStickers => 'Custom emojis and stickers'; + + @override + String get customEmojisAndStickersBody => + 'Add or share custom emojis or stickers which can be used in any chat.'; + + @override + String get emoteShortcode => 'Emote shortcode'; + + @override + String get emoteWarnNeedToPick => + 'You need to pick an emote shortcode and an image!'; + + @override + String get emptyChat => 'Empty chat'; + + @override + String get enableEmotesGlobally => 'Enable emote pack globally'; + + @override + String get enableEncryption => 'Enable encryption'; + + @override + String get enableEncryptionWarning => + 'You won\'t be able to disable the encryption anymore. Are you sure?'; + + @override + String get encrypted => 'Encrypted'; + + @override + String get encryption => 'Encryption'; + + @override + String get encryptionNotEnabled => 'Encryption is not enabled'; + + @override + String endedTheCall(String senderName) { + return '$senderName ended the call'; + } + + @override + String get enterAnEmailAddress => 'Enter an email address'; + + @override + String get homeserver => 'Homeserver'; + + @override + String get enterYourHomeserver => 'Enter your homeserver'; + + @override + String errorObtainingLocation(String error) { + return 'Error obtaining location: $error'; + } + + @override + String get everythingReady => 'Everything ready!'; + + @override + String get extremeOffensive => 'Extremely offensive'; + + @override + String get fileName => 'File name'; + + @override + String get fluffychat => 'Extera'; + + @override + String get fontSize => 'Font size'; + + @override + String get forward => 'Forward'; + + @override + String get fromJoining => 'From joining'; + + @override + String get fromTheInvitation => 'From the invitation'; + + @override + String get goToTheNewRoom => 'Go to the new room'; + + @override + String get group => 'Group'; + + @override + String get chatDescription => 'Chat description'; + + @override + String get chatDescriptionHasBeenChanged => 'Chat description changed'; + + @override + String get groupIsPublic => 'Group is public'; + + @override + String get groups => 'Groups'; + + @override + String groupWith(String displayname) { + return 'Group with $displayname'; + } + + @override + String get guestsAreForbidden => 'Guests are forbidden'; + + @override + String get guestsCanJoin => 'Guests can join'; + + @override + String hasWithdrawnTheInvitationFor(String username, String targetName) { + return '$username has withdrawn the invitation for $targetName'; + } + + @override + String get help => 'Help'; + + @override + String get hideRedactedEvents => 'Hide redacted events'; + + @override + String get hideRedactedMessages => 'Hide redacted messages'; + + @override + String get hideRedactedMessagesBody => + 'If someone redacts a message, this message won\'t be visible in the chat anymore.'; + + @override + String get hideInvalidOrUnknownMessageFormats => + 'Hide invalid or unknown message formats'; + + @override + String get howOffensiveIsThisContent => 'How offensive is this content?'; + + @override + String get id => 'ID'; + + @override + String get identity => 'Identity'; + + @override + String get block => 'Block'; + + @override + String get blockedUsers => 'Blocked users'; + + @override + String get blockListDescription => + 'You can block users who are disturbing you. You won\'t be able to receive any messages or room invites from the users on your personal block list.'; + + @override + String get blockUsername => 'Ignore username'; + + @override + String get iHaveClickedOnLink => 'I have clicked on the link'; + + @override + String get incorrectPassphraseOrKey => 'Incorrect passphrase or recovery key'; + + @override + String get inoffensive => 'Inoffensive'; + + @override + String get inviteContact => 'Invite contact'; + + @override + String inviteContactToGroupQuestion(Object contact, Object groupName) { + return 'Do you want to invite $contact to the chat \"$groupName\"?'; + } + + @override + String inviteContactToGroup(String groupName) { + return 'Invite contact to $groupName'; + } + + @override + String get noChatDescriptionYet => 'No chat description created yet.'; + + @override + String get tryAgain => 'Try again'; + + @override + String get invalidServerName => 'Invalid server name'; + + @override + String get invited => 'Invited'; + + @override + String get redactMessageDescription => + 'The message will be redacted for all participants in this conversation. This cannot be undone.'; + + @override + String get optionalRedactReason => + '(Optional) Reason for redacting this message...'; + + @override + String invitedUser(String username, String targetName) { + return '📩 $username invited $targetName'; + } + + @override + String get invitedUsersOnly => 'Invited users only'; + + @override + String get inviteForMe => 'Invite for me'; + + @override + String inviteText(String username, String link) { + return '$username invited you to Extera.\n1. Visit fluffychat.im and install the app \n2. Sign up or sign in \n3. Open the invite link: \n $link'; + } + + @override + String get isTyping => 'is typing…'; + + @override + String joinedTheChat(String username) { + return '👋 $username joined the chat'; + } + + @override + String get joinRoom => 'Join room'; + + @override + String kicked(String username, String targetName) { + return '👞 $username kicked $targetName'; + } + + @override + String kickedAndBanned(String username, String targetName) { + return '🙅 $username kicked and banned $targetName'; + } + + @override + String get kickFromChat => 'Kick from chat'; + + @override + String lastActiveAgo(String localizedTimeShort) { + return 'Last active: $localizedTimeShort'; + } + + @override + String get leave => 'Leave'; + + @override + String get leftTheChat => 'Left the chat'; + + @override + String get license => 'License'; + + @override + String get lightTheme => 'Light'; + + @override + String loadCountMoreParticipants(int count) { + return 'Load $count more participants'; + } + + @override + String get dehydrate => 'Export session and wipe device'; + + @override + String get dehydrateWarning => + 'This action cannot be undone. Ensure you safely store the backup file.'; + + @override + String get dehydrateTor => 'TOR Users: Export session'; + + @override + String get dehydrateTorLong => + 'For TOR users, it is recommended to export the session before closing the window.'; + + @override + String get hydrateTor => 'TOR Users: Import session export'; + + @override + String get hydrateTorLong => + 'Did you export your session last time on TOR? Quickly import it and continue chatting.'; + + @override + String get hydrate => 'Restore from backup file'; + + @override + String get loadingPleaseWait => 'Loading… Please wait.'; + + @override + String get loadMore => 'Load more…'; + + @override + String get locationDisabledNotice => + 'Location services are disabled. Please enable them to be able to share your location.'; + + @override + String get locationPermissionDeniedNotice => + 'Location permission denied. Please grant them to be able to share your location.'; + + @override + String get login => 'Login'; + + @override + String logInTo(String homeserver) { + return 'Log in to $homeserver'; + } + + @override + String get logout => 'Logout'; + + @override + String get memberChanges => 'Member changes'; + + @override + String get mention => 'Mention'; + + @override + String get messages => 'Messages'; + + @override + String get messagesStyle => 'Messages:'; + + @override + String get moderator => 'Moderator'; + + @override + String get muteChat => 'Mute chat'; + + @override + String get needPantalaimonWarning => + 'Please be aware that you need Pantalaimon to use end-to-end encryption for now.'; + + @override + String get newChat => 'New chat'; + + @override + String get newMessageInFluffyChat => '💬 New message in Extera'; + + @override + String get newVerificationRequest => 'New verification request!'; + + @override + String get next => 'Next'; + + @override + String get no => 'No'; + + @override + String get noConnectionToTheServer => 'No connection to the server'; + + @override + String get noEmotesFound => 'No emotes found. 😕'; + + @override + String get noEncryptionForPublicRooms => + 'You can only activate encryption as soon as the room is no longer publicly accessible.'; + + @override + String get noGoogleServicesWarning => + 'Firebase Cloud Messaging doesn\'t appear to be available on your device. To still receive push notifications, we recommend installing ntfy. With ntfy or another Unified Push provider you can receive push notifications in a data secure way. You can download ntfy from the PlayStore or from F-Droid.'; + + @override + String noMatrixServer(String server1, String server2) { + return '$server1 is no matrix server, use $server2 instead?'; + } + + @override + String get shareInviteLink => 'Share invite link'; + + @override + String get scanQrCode => 'Scan QR code'; + + @override + String get none => 'None'; + + @override + String get noPasswordRecoveryDescription => + 'You have not added a way to recover your password yet.'; + + @override + String get noPermission => 'No permission'; + + @override + String get noRoomsFound => 'No rooms found…'; + + @override + String get notifications => 'Notifications'; + + @override + String get notificationsEnabledForThisAccount => + 'Notifications enabled for this account'; + + @override + String numUsersTyping(int count) { + return '$count users are typing…'; + } + + @override + String get obtainingLocation => 'Obtaining location…'; + + @override + String get offensive => 'Offensive'; + + @override + String get offline => 'Offline'; + + @override + String get ok => 'Ok'; + + @override + String get online => 'Online'; + + @override + String get onlineKeyBackupEnabled => 'Online Key Backup is enabled'; + + @override + String get oopsPushError => + 'Oops! Unfortunately, an error occurred when setting up the push notifications.'; + + @override + String get oopsSomethingWentWrong => 'Oops, something went wrong…'; + + @override + String get openAppToReadMessages => 'Open app to read messages'; + + @override + String get openCamera => 'Open camera'; + + @override + String get openVideoCamera => 'Open camera for a video'; + + @override + String get oneClientLoggedOut => 'One of your clients has been logged out'; + + @override + String get addAccount => 'Add account'; + + @override + String get editBundlesForAccount => 'Edit bundles for this account'; + + @override + String get addToBundle => 'Add to bundle'; + + @override + String get removeFromBundle => 'Remove from this bundle'; + + @override + String get bundleName => 'Bundle name'; + + @override + String get enableMultiAccounts => + '(BETA) Enable multi accounts on this device'; + + @override + String get openInMaps => 'Open in maps'; + + @override + String get link => 'Link'; + + @override + String get serverRequiresEmail => + 'This server needs to validate your email address for registration.'; + + @override + String get or => 'Or'; + + @override + String get participant => 'Participant'; + + @override + String get passphraseOrKey => 'passphrase or recovery key'; + + @override + String get password => 'Password'; + + @override + String get passwordForgotten => 'Password forgotten'; + + @override + String get passwordHasBeenChanged => 'Password has been changed'; + + @override + String get hideMemberChangesInPublicChats => + 'Hide member changes in public chats'; + + @override + String get hideMemberChangesInPublicChatsBody => + 'Do not show in the chat timeline if someone joins or leaves a public chat to improve readability.'; + + @override + String get overview => 'Overview'; + + @override + String get notifyMeFor => 'Notify me for'; + + @override + String get passwordRecoverySettings => 'Password recovery settings'; + + @override + String get passwordRecovery => 'Password recovery'; + + @override + String get people => 'People'; + + @override + String get pickImage => 'Pick an image'; + + @override + String get pin => 'Pin'; + + @override + String play(String fileName) { + return 'Play $fileName'; + } + + @override + String get pleaseChoose => 'Please choose'; + + @override + String get pleaseChooseAPasscode => 'Please choose a pass code'; + + @override + String get pleaseClickOnLink => + 'Please click on the link in the email and then proceed.'; + + @override + String get pleaseEnter4Digits => + 'Please enter 4 digits or leave empty to disable app lock.'; + + @override + String get pleaseEnterRecoveryKey => 'Please enter your recovery key:'; + + @override + String get pleaseEnterYourPassword => 'Please enter your password'; + + @override + String get pleaseEnterYourPin => 'Please enter your pin'; + + @override + String get pleaseEnterYourUsername => 'Please enter your username'; + + @override + String get pleaseFollowInstructionsOnWeb => + 'Please follow the instructions on the website and tap on next.'; + + @override + String get privacy => 'Privacy'; + + @override + String get publicRooms => 'Public Rooms'; + + @override + String get pushRules => 'Push rules'; + + @override + String get reason => 'Reason'; + + @override + String get recording => 'Recording'; + + @override + String redactedBy(String username) { + return 'Redacted by $username'; + } + + @override + String get directChat => 'Direct chat'; + + @override + String redactedByBecause(String username, String reason) { + return 'Redacted by $username because: \"$reason\"'; + } + + @override + String redactedAnEvent(String username) { + return '$username redacted an event'; + } + + @override + String get redactMessage => 'Redact message'; + + @override + String get register => 'Register'; + + @override + String get reject => 'Reject'; + + @override + String rejectedTheInvitation(String username) { + return '$username rejected the invitation'; + } + + @override + String get rejoin => 'Rejoin'; + + @override + String get removeAllOtherDevices => 'Remove all other devices'; + + @override + String removedBy(String username) { + return 'Removed by $username'; + } + + @override + String get removeDevice => 'Remove device'; + + @override + String get unbanFromChat => 'Unban from chat'; + + @override + String get removeYourAvatar => 'Remove your avatar'; + + @override + String get replaceRoomWithNewerVersion => 'Replace room with newer version'; + + @override + String get reply => 'Reply'; + + @override + String get reportMessage => 'Report message'; + + @override + String get translateMessage => 'Translate message'; + + @override + String get translatedMessage => 'Translated message'; + + @override + String get errorTranslatingMessage => + 'An error has occured while translating the message.'; + + @override + String get recoverMessage => 'Recover message'; + + @override + String get recoveredMessage => 'Recovered message'; + + @override + String get errorRecoveringMessage => + 'An error has occured while recovering the message.'; + + @override + String get errorRecoveringMessageNoAdmin => + 'This feature is available on Synapse homeservers only for adminstrators.'; + + @override + String get requestPermission => 'Request permission'; + + @override + String get roomHasBeenUpgraded => 'Room has been upgraded'; + + @override + String get roomVersion => 'Room version'; + + @override + String get saveFile => 'Save file'; + + @override + String get retry => 'Retry'; + + @override + String get search => 'Search'; + + @override + String get security => 'Security'; + + @override + String get recoveryKey => 'Recovery key'; + + @override + String get recoveryKeyLost => 'Recovery key lost?'; + + @override + String seenByUser(String username) { + return 'Seen by $username'; + } + + @override + String get send => 'Send'; + + @override + String get sendAMessage => 'Send a message'; + + @override + String get sendAsText => 'Send as text'; + + @override + String get sendAudio => 'Send audio'; + + @override + String get sendFile => 'Send file'; + + @override + String get sendImage => 'Send image'; + + @override + String sendImages(int count) { + return 'Send $count image'; + } + + @override + String get sendMessages => 'Send messages'; + + @override + String get sendOriginal => 'Send original'; + + @override + String get sendSticker => 'Send sticker'; + + @override + String get sendVideo => 'Send video'; + + @override + String sentAFile(String username) { + return '📁 $username sent a file'; + } + + @override + String sentAnAudio(String username) { + return '🎤 $username sent an audio'; + } + + @override + String sentAPicture(String username) { + return '🖼️ $username sent a picture'; + } + + @override + String sentASticker(String username) { + return '😊 $username sent a sticker'; + } + + @override + String sentAVideo(String username) { + return '🎥 $username sent a video'; + } + + @override + String sentCallInformations(String senderName) { + return '$senderName sent call information'; + } + + @override + String get separateChatTypes => 'Separate Direct Chats and Groups'; + + @override + String get setAsCanonicalAlias => 'Set as main alias'; + + @override + String get setCustomEmotes => 'Set custom emotes'; + + @override + String get setChatDescription => 'Set chat description'; + + @override + String get setInvitationLink => 'Set invitation link'; + + @override + String get setPermissionsLevel => 'Set permissions level'; + + @override + String get setStatus => 'Set status'; + + @override + String get settings => 'Settings'; + + @override + String get share => 'Share'; + + @override + String sharedTheLocation(String username) { + return '$username shared their location'; + } + + @override + String get shareLocation => 'Share location'; + + @override + String get showPassword => 'Show password'; + + @override + String get presenceStyle => 'Presence:'; + + @override + String get hideAvatarsInInvites => 'Hide avatars in invites'; + + @override + String get hideAvatarsInInvitesDescription => + 'Do not show room avatars in invites'; + + @override + String get presencesToggle => 'Show status messages from other users'; + + @override + String get pureBlackToggle => 'Pure Black'; + + @override + String get singlesignon => 'Single Sign on'; + + @override + String get skip => 'Skip'; + + @override + String get sourceCode => 'Source code'; + + @override + String get spaceIsPublic => 'Space is public'; + + @override + String get spaceName => 'Space name'; + + @override + String startedACall(String senderName) { + return '$senderName started a call'; + } + + @override + String get startFirstChat => 'Start your first chat'; + + @override + String get status => 'Status'; + + @override + String get statusExampleMessage => 'How are you today?'; + + @override + String get submit => 'Submit'; + + @override + String get synchronizingPleaseWait => 'Synchronizing… Please wait.'; + + @override + String synchronizingPleaseWaitCounter(String percentage) { + return ' Synchronizing… ($percentage%)'; + } + + @override + String get systemTheme => 'System'; + + @override + String get theyDontMatch => 'They Don\'t Match'; + + @override + String get theyMatch => 'They Match'; + + @override + String get title => 'Extera'; + + @override + String get toggleFavorite => 'Toggle Favorite'; + + @override + String get toggleMuted => 'Toggle Muted'; + + @override + String get toggleUnread => 'Mark Read/Unread'; + + @override + String get tooManyRequestsWarning => + 'Too many requests. Please try again later!'; + + @override + String get transferFromAnotherDevice => 'Transfer from another device'; + + @override + String get tryToSendAgain => 'Try to send again'; + + @override + String get unavailable => 'Unavailable'; + + @override + String unbannedUser(String username, String targetName) { + return '$username unbanned $targetName'; + } + + @override + String get unblockDevice => 'Unblock Device'; + + @override + String get unknownDevice => 'Unknown device'; + + @override + String get unknownEncryptionAlgorithm => 'Unknown encryption algorithm'; + + @override + String unknownEvent(String type) { + return 'Unknown event \'$type\''; + } + + @override + String get unmuteChat => 'Unmute chat'; + + @override + String get unpin => 'Unpin'; + + @override + String unreadChats(int unreadCount) { + String _temp0 = intl.Intl.pluralLogic( + unreadCount, + locale: localeName, + other: '$unreadCount unread chats', + one: '1 unread chat', + ); + return '$_temp0'; + } + + @override + String userAndOthersAreTyping(String username, int count) { + return '$username and $count others are typing…'; + } + + @override + String userAndUserAreTyping(String username, String username2) { + return '$username and $username2 are typing…'; + } + + @override + String userIsTyping(String username) { + return '$username is typing…'; + } + + @override + String userLeftTheChat(String username) { + return '🚪 $username left the chat'; + } + + @override + String get username => 'Username'; + + @override + String userSentUnknownEvent(String username, String type) { + return '$username sent a $type event'; + } + + @override + String get unverified => 'Unverified'; + + @override + String get verified => 'Verified'; + + @override + String get verify => 'Verify'; + + @override + String get verifyStart => 'Start Verification'; + + @override + String get verifySuccess => 'You successfully verified!'; + + @override + String get verifyTitle => 'Verifying other account'; + + @override + String get videoCall => 'Video call'; + + @override + String get visibilityOfTheChatHistory => 'Visibility of the chat history'; + + @override + String get visibleForAllParticipants => 'Visible for all participants'; + + @override + String get visibleForEveryone => 'Visible for everyone'; + + @override + String get voiceMessage => 'Voice message'; + + @override + String get waitingPartnerAcceptRequest => + 'Waiting for partner to accept the request…'; + + @override + String get waitingPartnerEmoji => 'Waiting for partner to accept the emoji…'; + + @override + String get waitingPartnerNumbers => + 'Waiting for partner to accept the numbers…'; + + @override + String get wallpaper => 'Wallpaper:'; + + @override + String get warning => 'Warning!'; + + @override + String get weSentYouAnEmail => 'We sent you an email'; + + @override + String get whoCanPerformWhichAction => 'Who can perform which action'; + + @override + String get whoIsAllowedToJoinThisGroup => 'Who is allowed to join this group'; + + @override + String get whyDoYouWantToReportThis => 'Why do you want to report this?'; + + @override + String get wipeChatBackup => + 'Wipe your chat backup to create a new recovery key?'; + + @override + String get withTheseAddressesRecoveryDescription => + 'With these addresses you can recover your password.'; + + @override + String get writeAMessage => 'Write a message…'; + + @override + String get yes => 'Yes'; + + @override + String get you => 'You'; + + @override + String get youAreNoLongerParticipatingInThisChat => + 'You are no longer participating in this chat'; + + @override + String get youHaveBeenBannedFromThisChat => + 'You have been banned from this chat'; + + @override + String get yourPublicKey => 'Your public key'; + + @override + String get messageInfo => 'Message info'; + + @override + String get time => 'Time'; + + @override + String get messageType => 'Message Type'; + + @override + String get sender => 'Sender'; + + @override + String get openGallery => 'Open gallery'; + + @override + String get removeFromSpace => 'Remove from space'; + + @override + String get addToSpaceDescription => 'Select a space to add this chat to it.'; + + @override + String get start => 'Start'; + + @override + String get pleaseEnterRecoveryKeyDescription => + 'To unlock your old messages, please enter your recovery key that has been generated in a previous session. Your recovery key is NOT your password.'; + + @override + String get publish => 'Publish'; + + @override + String videoWithSize(String size) { + return 'Video ($size)'; + } + + @override + String get openChat => 'Open Chat'; + + @override + String get markAsRead => 'Mark as read'; + + @override + String get reportUser => 'Report user'; + + @override + String get dismiss => 'Dismiss'; + + @override + String reactedWith(String sender, String reaction) { + return '$sender reacted with $reaction'; + } + + @override + String get pinMessage => 'Pin to room'; + + @override + String get confirmEventUnpin => + 'Are you sure to permanently unpin the event?'; + + @override + String get emojis => 'Emojis'; + + @override + String get placeCall => 'Place call'; + + @override + String get voiceCall => 'Voice call'; + + @override + String get unsupportedAndroidVersion => 'Unsupported Android version'; + + @override + String get unsupportedAndroidVersionLong => + 'This feature requires a newer Android version. Please check for updates or Lineage OS support.'; + + @override + String get videoCallsBetaWarning => + 'Please note that video calls are currently in beta. They might not work as expected or work at all on all platforms.'; + + @override + String get experimentalVideoCalls => 'Experimental video calls'; + + @override + String get emailOrUsername => 'Email or username'; + + @override + String get indexedDbErrorTitle => 'Private mode issues'; + + @override + String get indexedDbErrorLong => + 'The message storage is unfortunately not enabled in private mode by default.\nPlease visit\n - about:config\n - set dom.indexedDB.privateBrowsing.enabled to true\nOtherwise, it is not possible to run Extera.'; + + @override + String switchToAccount(String number) { + return 'Switch to account $number'; + } + + @override + String get nextAccount => 'Next account'; + + @override + String get previousAccount => 'Previous account'; + + @override + String get addWidget => 'Add widget'; + + @override + String get widgetVideo => 'Video'; + + @override + String get widgetEtherpad => 'Text note'; + + @override + String get widgetJitsi => 'Jitsi Meet'; + + @override + String get widgetCustom => 'Custom'; + + @override + String get widgetName => 'Name'; + + @override + String get widgetUrlError => 'This is not a valid URL.'; + + @override + String get widgetNameError => 'Please provide a display name.'; + + @override + String get errorAddingWidget => 'Error adding the widget.'; + + @override + String get youRejectedTheInvitation => 'You rejected the invitation'; + + @override + String get youJoinedTheChat => 'You joined the chat'; + + @override + String get youAcceptedTheInvitation => '👍 You accepted the invitation'; + + @override + String youBannedUser(String user) { + return 'You banned $user'; + } + + @override + String youHaveWithdrawnTheInvitationFor(String user) { + return 'You have withdrawn the invitation for $user'; + } + + @override + String youInvitedToBy(String alias) { + return '📩 You have been invited via link to:\n$alias'; + } + + @override + String youInvitedBy(String user) { + return '📩 You have been invited by $user'; + } + + @override + String invitedBy(String user) { + return '📩 Invited by $user'; + } + + @override + String youInvitedUser(String user) { + return '📩 You invited $user'; + } + + @override + String youKicked(String user) { + return '👞 You kicked $user'; + } + + @override + String youKickedAndBanned(String user) { + return '🙅 You kicked and banned $user'; + } + + @override + String youUnbannedUser(String user) { + return 'You unbanned $user'; + } + + @override + String hasKnocked(String user) { + return '🚪 $user has knocked'; + } + + @override + String get usersMustKnock => 'Users must knock'; + + @override + String get noOneCanJoin => 'No one can join'; + + @override + String userWouldLikeToChangeTheChat(String user) { + return '$user would like to join the chat.'; + } + + @override + String get noPublicLinkHasBeenCreatedYet => + 'No public link has been created yet'; + + @override + String get knock => 'Knock'; + + @override + String get users => 'Users'; + + @override + String get unlockOldMessages => 'Unlock old messages'; + + @override + String get storeInSecureStorageDescription => + 'Store the recovery key in the secure storage of this device.'; + + @override + String get saveKeyManuallyDescription => + 'Save this key manually by triggering the system share dialog or clipboard.'; + + @override + String get storeInAndroidKeystore => 'Store in Android KeyStore'; + + @override + String get storeInAppleKeyChain => 'Store in Apple KeyChain'; + + @override + String get storeSecurlyOnThisDevice => 'Store securely on this device'; + + @override + String countFiles(int count) { + return '$count files'; + } + + @override + String get user => 'User'; + + @override + String get custom => 'Custom'; + + @override + String get foregroundServiceRunning => + 'This notification appears when the foreground service is running.'; + + @override + String get screenSharingTitle => 'screen sharing'; + + @override + String get screenSharingDetail => 'You are sharing your screen in Extera'; + + @override + String get callingPermissions => 'Calling permissions'; + + @override + String get callingAccount => 'Calling account'; + + @override + String get callingAccountDetails => + 'Allows Extera to use the native android dialer app.'; + + @override + String get appearOnTop => 'Appear on top'; + + @override + String get appearOnTopDetails => + 'Allows the app to appear on top (not needed if you already have Fluffychat setup as a calling account)'; + + @override + String get otherCallingPermissions => + 'Microphone, camera and other Extera permissions'; + + @override + String get whyIsThisMessageEncrypted => 'Why is this message unreadable?'; + + @override + String get noKeyForThisMessage => + 'This can happen if the message was sent before you have signed in to your account at this device.\n\nIt is also possible that the sender has blocked your device or something went wrong with the internet connection.\n\nAre you able to read the message on another session? Then you can transfer the message from it! Go to Settings > Devices and make sure that your devices have verified each other. When you open the room the next time and both sessions are in the foreground, the keys will be transmitted automatically.\n\nDo you not want to lose the keys when logging out or switching devices? Make sure that you have enabled the chat backup in the settings.'; + + @override + String get newGroup => 'New group'; + + @override + String get newSpace => 'New space'; + + @override + String get enterSpace => 'Enter space'; + + @override + String get enterRoom => 'Enter room'; + + @override + String get allSpaces => 'All spaces'; + + @override + String numChats(String number) { + return '$number chats'; + } + + @override + String get hideUnimportantStateEvents => 'Hide unimportant state events'; + + @override + String get hidePresences => 'Hide Status List?'; + + @override + String get doNotShowAgain => 'Do not show again'; + + @override + String wasDirectChatDisplayName(String oldDisplayName) { + return 'Empty chat (was $oldDisplayName)'; + } + + @override + String get newSpaceDescription => + 'Spaces allows you to consolidate your chats and build private or public communities.'; + + @override + String get encryptThisChat => 'Encrypt this chat'; + + @override + String get disableEncryptionWarning => + 'For security reasons you can not disable encryption in a chat, where it has been enabled before.'; + + @override + String get sorryThatsNotPossible => 'Sorry... that is not possible'; + + @override + String get deviceKeys => 'Device keys:'; + + @override + String get reopenChat => 'Reopen chat'; + + @override + String get noBackupWarning => + 'Warning! Without enabling chat backup, you will lose access to your encrypted messages. It is highly recommended to enable the chat backup first before logging out.'; + + @override + String get noOtherDevicesFound => 'No other devices found'; + + @override + String fileIsTooBigForServer(String max) { + return 'Unable to send! The server only supports attachments up to $max.'; + } + + @override + String fileHasBeenSavedAt(String path) { + return 'File has been saved at $path'; + } + + @override + String get jumpToLastReadMessage => 'Jump to last read message'; + + @override + String get readUpToHere => 'Read up to here'; + + @override + String get jump => 'Jump'; + + @override + String get openLinkInBrowser => 'Open link in browser'; + + @override + String get reportErrorDescription => + '😭 Oh no. Something went wrong. If you want, you can report this bug to the developers.'; + + @override + String get report => 'Report'; + + @override + String get signInWithPassword => 'Sign in with password'; + + @override + String get pleaseTryAgainLaterOrChooseDifferentServer => + 'Please try again later or choose a different server.'; + + @override + String signInWith(String provider) { + return 'Sign in with $provider'; + } + + @override + String get profileNotFound => + 'The user could not be found on the server. Maybe there is a connection problem or the user doesn\'t exist.'; + + @override + String get setTheme => 'Set theme:'; + + @override + String get setColorTheme => 'Set color theme:'; + + @override + String get invite => 'Invite'; + + @override + String get inviteGroupChat => '📨 Invite group chat'; + + @override + String get invitePrivateChat => '📨 Invite private chat'; + + @override + String get invalidInput => 'Invalid input!'; + + @override + String wrongPinEntered(int seconds) { + return 'Wrong pin entered! Try again in $seconds seconds...'; + } + + @override + String get pleaseEnterANumber => 'Please enter a number greater than 0'; + + @override + String get archiveRoomDescription => + 'The chat will be moved to the archive. Other users will be able to see that you have left the chat.'; + + @override + String get roomUpgradeDescription => + 'The chat will then be recreated with the new room version. All participants will be notified that they need to switch to the new chat. You can find out more about room versions at https://spec.matrix.org/latest/rooms/'; + + @override + String get removeDevicesDescription => + 'You will be logged out of this device and will no longer be able to receive messages.'; + + @override + String get banUserDescription => + 'The user will be banned from the chat and will not be able to enter the chat again until they are unbanned.'; + + @override + String get unbanUserDescription => + 'The user will be able to enter the chat again if they try.'; + + @override + String get kickUserDescription => + 'The user is kicked out of the chat but not banned. In public chats, the user can rejoin at any time.'; + + @override + String get makeAdminDescription => + 'Once you make this user admin, you may not be able to undo this as they will then have the same permissions as you.'; + + @override + String get pushNotificationsNotAvailable => + 'Push notifications not available'; + + @override + String get learnMore => 'Learn more'; + + @override + String get yourGlobalUserIdIs => 'Your global user-ID is: '; + + @override + String noUsersFoundWithQuery(String query) { + return 'Unfortunately no user could be found with \"$query\". Please check whether you made a typo.'; + } + + @override + String get knocking => 'Knocking'; + + @override + String chatCanBeDiscoveredViaSearchOnServer(String server) { + return 'Chat can be discovered via the search on $server'; + } + + @override + String get searchChatsRooms => 'Search for #chats, @users...'; + + @override + String get nothingFound => 'Nothing found...'; + + @override + String get groupName => 'Group name'; + + @override + String get createGroupAndInviteUsers => 'Create a group and invite users'; + + @override + String get groupCanBeFoundViaSearch => 'Group can be found via search'; + + @override + String get wrongRecoveryKey => + 'Sorry... this does not seem to be the correct recovery key.'; + + @override + String get startConversation => 'Start conversation'; + + @override + String get commandHint_sendraw => 'Send raw json'; + + @override + String get databaseMigrationTitle => 'Database is optimized'; + + @override + String get databaseMigrationBody => 'Please wait. This may take a moment.'; + + @override + String get leaveEmptyToClearStatus => 'Leave empty to clear your status.'; + + @override + String get select => 'Select'; + + @override + String get searchForUsers => 'Search for @users...'; + + @override + String get pleaseEnterYourCurrentPassword => + 'Please enter your current password'; + + @override + String get newPassword => 'New password'; + + @override + String get pleaseChooseAStrongPassword => 'Please choose a strong password'; + + @override + String get passwordsDoNotMatch => 'Passwords do not match'; + + @override + String get passwordIsWrong => 'Your entered password is wrong'; + + @override + String get publicLink => 'Public link'; + + @override + String get publicChatAddresses => 'Public chat addresses'; + + @override + String get createNewAddress => 'Create new address'; + + @override + String get joinSpace => 'Join space'; + + @override + String get publicSpaces => 'Public spaces'; + + @override + String get addChatOrSubSpace => 'Add chat or sub space'; + + @override + String get subspace => 'Subspace'; + + @override + String get decline => 'Decline'; + + @override + String get thisDevice => 'This device:'; + + @override + String get initAppError => 'An error occured while init the app'; + + @override + String get userRole => 'User role'; + + @override + String minimumPowerLevel(String level) { + return '$level is the minimum power level.'; + } + + @override + String searchIn(String chat) { + return 'Search in chat \"$chat\"...'; + } + + @override + String get searchMore => 'Search more...'; + + @override + String get gallery => 'Gallery'; + + @override + String get files => 'Files'; + + @override + String databaseBuildErrorBody(String url, String error) { + return 'Unable to build the SQlite database. The app tries to use the legacy database for now. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String sessionLostBody(String url, String error) { + return 'Your session is lost. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String restoreSessionBody(String url, String error) { + return 'The app now tries to restore your session from the backup. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String forwardMessageTo(String roomName) { + return 'Forward message to $roomName?'; + } + + @override + String get sendReadReceipts => 'Send read receipts'; + + @override + String get sendTypingNotificationsDescription => + 'Other participants in a chat can see when you are typing a new message.'; + + @override + String get sendReadReceiptsDescription => + 'Other participants in a chat can see when you have read a message.'; + + @override + String get formattedMessages => 'Formatted messages'; + + @override + String get formattedMessagesDescription => + 'Display rich message content like bold text using markdown.'; + + @override + String get verifyOtherUser => '🔐 Verify other user'; + + @override + String get verifyOtherUserDescription => + 'If you verify another user, you can be sure that you know who you are really writing to. 💪\n\nWhen you start a verification, you and the other user will see a popup in the app. There you will then see a series of emojis or numbers that you have to compare with each other.\n\nThe best way to do this is to meet up or start a video call. 👭'; + + @override + String get verifyOtherDevice => '🔐 Verify other device'; + + @override + String get verifyOtherDeviceDescription => + 'When you verify another device, those devices can exchange keys, increasing your overall security. 💪 When you start a verification, a popup will appear in the app on both devices. There you will then see a series of emojis or numbers that you have to compare with each other. It\'s best to have both devices handy before you start the verification. 🤳'; + + @override + String acceptedKeyVerification(String sender) { + return '$sender accepted key verification'; + } + + @override + String canceledKeyVerification(String sender) { + return '$sender canceled key verification'; + } + + @override + String completedKeyVerification(String sender) { + return '$sender completed key verification'; + } + + @override + String isReadyForKeyVerification(String sender) { + return '$sender is ready for key verification'; + } + + @override + String requestedKeyVerification(String sender) { + return '$sender requested key verification'; + } + + @override + String startedKeyVerification(String sender) { + return '$sender started key verification'; + } + + @override + String get transparent => 'Transparent'; + + @override + String get incomingMessages => 'Incoming messages'; + + @override + String get stickers => 'Stickers'; + + @override + String get discover => 'Discover'; + + @override + String get commandHint_ignore => 'Ignore the given matrix ID'; + + @override + String get commandHint_unignore => 'Unignore the given matrix ID'; + + @override + String unreadChatsInApp(String appname, String unread) { + return '$appname: $unread unread chats'; + } + + @override + String get noDatabaseEncryption => + 'Database encryption is not supported on this platform'; + + @override + String thereAreCountUsersBlocked(Object count) { + return 'Right now there are $count users blocked.'; + } + + @override + String get restricted => 'Restricted'; + + @override + String get knockRestricted => 'Knock restricted'; + + @override + String goToSpace(Object space) { + return 'Go to space: $space'; + } + + @override + String get markAsUnread => 'Mark as unread'; + + @override + String userLevel(int level) { + return '$level - User'; + } + + @override + String moderatorLevel(int level) { + return '$level - Moderator'; + } + + @override + String adminLevel(int level) { + return '$level - Admin'; + } + + @override + String get changeGeneralChatSettings => 'Change general chat settings'; + + @override + String get inviteOtherUsers => 'Invite other users to this chat'; + + @override + String get changeTheChatPermissions => 'Change the chat permissions'; + + @override + String get changeTheVisibilityOfChatHistory => + 'Change the visibility of the chat history'; + + @override + String get changeTheCanonicalRoomAlias => + 'Change the main public chat address'; + + @override + String get sendRoomNotifications => 'Send a @room notifications'; + + @override + String get changeTheDescriptionOfTheGroup => + 'Change the description of the chat'; + + @override + String get chatPermissionsDescription => + 'Define which power level is necessary for certain actions in this chat. The power levels 0, 50 and 100 are usually representing users, moderators and admins, but any gradation is possible.'; + + @override + String updateInstalled(String version) { + return '🎉 Update $version installed!'; + } + + @override + String get changelog => 'Changelog'; + + @override + String get sendCanceled => 'Sending canceled'; + + @override + String get loginWithMatrixId => 'Login with Matrix-ID'; + + @override + String get discoverHomeservers => 'Discover homeservers'; + + @override + String get whatIsAHomeserver => 'What is a homeserver?'; + + @override + String get homeserverDescription => + 'All your data is stored on the homeserver, just like an email provider. You can choose which homeserver you want to use, while you can still communicate with everyone. Learn more at at https://matrix.org.'; + + @override + String get doesNotSeemToBeAValidHomeserver => + 'Doesn\'t seem to be a compatible homeserver. Wrong URL?'; + + @override + String get calculatingFileSize => 'Calculating file size...'; + + @override + String get prepareSendingAttachment => 'Prepare sending attachment...'; + + @override + String get sendingAttachment => 'Sending attachment...'; + + @override + String get generatingVideoThumbnail => 'Generating video thumbnail...'; + + @override + String get compressVideo => 'Compressing video...'; + + @override + String sendingAttachmentCountOfCount(int index, int length) { + return 'Sending attachment $index of $length...'; + } + + @override + String serverLimitReached(int seconds) { + return 'Server limit reached! Waiting $seconds seconds...'; + } + + @override + String get oneOfYourDevicesIsNotVerified => + 'One of your devices is not verified'; + + @override + String get noticeChatBackupDeviceVerification => + 'Note: When you connect all your devices to the chat backup, they are automatically verified.'; + + @override + String get continueText => 'Continue'; + + @override + String get welcomeText => + 'Hey Hey 👋 This is Extera. You can sign in to any homeserver, which is compatible with https://matrix.org. And then chat with anyone. It\'s a huge decentralized messaging network!'; + + @override + String get blur => 'Blur:'; + + @override + String get opacity => 'Opacity:'; + + @override + String get setWallpaper => 'Set wallpaper'; + + @override + String get manageAccount => 'Manage account'; + + @override + String get noContactInformationProvided => + 'Server does not provide any valid contact information'; + + @override + String get contactServerAdmin => 'Contact server admin'; + + @override + String get contactServerSecurity => 'Contact server security'; + + @override + String get supportPage => 'Support page'; + + @override + String get serverInformation => 'Server information:'; + + @override + String get name => 'Name'; + + @override + String get version => 'Version'; + + @override + String get website => 'Website'; + + @override + String get compress => 'Compress'; + + @override + String get boldText => 'Bold text'; + + @override + String get italicText => 'Italic text'; + + @override + String get strikeThrough => 'Strikethrough'; + + @override + String get pleaseFillOut => 'Please fill out'; + + @override + String get invalidUrl => 'Invalid url'; + + @override + String get addLink => 'Add link'; + + @override + String get unableToJoinChat => + 'Unable to join chat. Maybe the other party has already closed the conversation.'; + + @override + String get previous => 'Previous'; + + @override + String get otherPartyNotLoggedIn => + 'The other party is currently not logged in and therefore cannot receive messages!'; + + @override + String appWantsToUseForLogin(String server) { + return 'Use \'$server\' to log in'; + } + + @override + String get appWantsToUseForLoginDescription => + 'You hereby allow the app and website to share information about you.'; + + @override + String get open => 'Open'; + + @override + String get waitingForServer => 'Waiting for server...'; + + @override + String get appIntroduction => + 'Extera lets you chat with your friends across different messengers. Learn more at https://matrix.org or just tap *Continue*.'; + + @override + String get newChatRequest => '📩 New chat request'; + + @override + String get contentNotificationSettings => 'Content notification settings'; + + @override + String get generalNotificationSettings => 'General notification settings'; + + @override + String get roomNotificationSettings => 'Room notification settings'; + + @override + String get userSpecificNotificationSettings => + 'User specific notification settings'; + + @override + String get otherNotificationSettings => 'Other notification settings'; + + @override + String get notificationRuleContainsUserName => 'Contains User Name'; + + @override + String get notificationRuleContainsUserNameDescription => + 'Notifies the user when a message contains their username.'; + + @override + String get notificationRuleMaster => 'Mute all notifications'; + + @override + String get notificationRuleMasterDescription => + 'Overrides all other rules and disables all notifications.'; + + @override + String get notificationRuleSuppressNotices => 'Suppress Automated Messages'; + + @override + String get notificationRuleSuppressNoticesDescription => + 'Suppresses notifications from automated clients like bots.'; + + @override + String get notificationRuleInviteForMe => 'Invite for Me'; + + @override + String get notificationRuleInviteForMeDescription => + 'Notifies the user when they are invited to a room.'; + + @override + String get notificationRuleMemberEvent => 'Member Event'; + + @override + String get notificationRuleMemberEventDescription => + 'Suppresses notifications for membership events.'; + + @override + String get notificationRuleIsUserMention => 'User Mention'; + + @override + String get notificationRuleIsUserMentionDescription => + 'Notifies the user when they are directly mentioned in a message.'; + + @override + String get notificationRuleContainsDisplayName => 'Contains Display Name'; + + @override + String get notificationRuleContainsDisplayNameDescription => + 'Notifies the user when a message contains their display name.'; + + @override + String get notificationRuleIsRoomMention => 'Room Mention'; + + @override + String get notificationRuleIsRoomMentionDescription => + 'Notifies the user when there is a room mention.'; + + @override + String get notificationRuleRoomnotif => 'Room Notification'; + + @override + String get notificationRuleRoomnotifDescription => + 'Notifies the user when a message contains \'@room\'.'; + + @override + String get notificationRuleTombstone => 'Tombstone'; + + @override + String get notificationRuleTombstoneDescription => + 'Notifies the user about room deactivation messages.'; + + @override + String get notificationRuleReaction => 'Reaction'; + + @override + String get notificationRuleReactionDescription => + 'Suppresses notifications for reactions.'; + + @override + String get notificationRuleRoomServerAcl => 'Room Server ACL'; + + @override + String get notificationRuleRoomServerAclDescription => + 'Suppresses notifications for room server access control lists (ACL).'; + + @override + String get notificationRuleSuppressEdits => 'Suppress Edits'; + + @override + String get notificationRuleSuppressEditsDescription => + 'Suppresses notifications for edited messages.'; + + @override + String get notificationRuleCall => 'Call'; + + @override + String get notificationRuleCallDescription => + 'Notifies the user about calls.'; + + @override + String get notificationRuleEncryptedRoomOneToOne => + 'Encrypted Room One-to-One'; + + @override + String get notificationRuleEncryptedRoomOneToOneDescription => + 'Notifies the user about messages in encrypted one-to-one rooms.'; + + @override + String get notificationRuleRoomOneToOne => 'Room One-to-One'; + + @override + String get notificationRuleRoomOneToOneDescription => + 'Notifies the user about messages in one-to-one rooms.'; + + @override + String get notificationRuleMessage => 'Message'; + + @override + String get notificationRuleMessageDescription => + 'Notifies the user about general messages.'; + + @override + String get notificationRuleEncrypted => 'Encrypted'; + + @override + String get notificationRuleEncryptedDescription => + 'Notifies the user about messages in encrypted rooms.'; + + @override + String get notificationRuleJitsi => 'Jitsi'; + + @override + String get notificationRuleJitsiDescription => + 'Notifies the user about Jitsi widget events.'; + + @override + String get notificationRuleServerAcl => 'Suppress Server ACL Events'; + + @override + String get notificationRuleServerAclDescription => + 'Suppresses notifications for Server ACL events.'; + + @override + String unknownPushRule(String rule) { + return 'Unknown push rule \'$rule\''; + } + + @override + String get deletePushRuleCanNotBeUndone => + 'If you delete this notification setting, this can not be undone.'; + + @override + String get more => 'More'; + + @override + String get shareKeysWith => 'Share keys with...'; + + @override + String get shareKeysWithDescription => + 'Which devices should be trusted so that they can read along your messages in encrypted chats?'; + + @override + String get allDevices => 'All devices'; + + @override + String get crossVerifiedDevicesIfEnabled => + 'Cross verified devices if enabled'; + + @override + String get crossVerifiedDevices => 'Cross verified devices'; + + @override + String get verifiedDevicesOnly => 'Verified devices only'; + + @override + String get takeAPhoto => 'Take a photo'; + + @override + String get recordAVideo => 'Record a video'; + + @override + String get optionalMessage => '(Optional) message...'; + + @override + String get notSupportedOnThisDevice => 'Not supported on this device'; + + @override + String get enterNewChat => 'Enter new chat'; + + @override + String get approve => 'Approve'; + + @override + String get youHaveKnocked => 'You have knocked'; + + @override + String get pleaseWaitUntilInvited => + 'Please wait now, until someone from the room invites you.'; +} diff --git a/lib/generated/l10n/l10n_th.dart b/lib/generated/l10n/l10n_th.dart new file mode 100644 index 0000000..ff0cc9f --- /dev/null +++ b/lib/generated/l10n/l10n_th.dart @@ -0,0 +1,2747 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'l10n.dart'; + +// ignore_for_file: type=lint + +/// The translations for Thai (`th`). +class L10nTh extends L10n { + L10nTh([String locale = 'th']) : super(locale); + + @override + String get noSendPermission => 'You can\'t send messages here'; + + @override + String get alwaysUse24HourFormat => 'false'; + + @override + String get repeatPassword => 'ใส่รหัสผ่านอีกรอบ'; + + @override + String get notAnImage => 'ไม่ใช่ไฟล์รูปภาพ'; + + @override + String get setCustomPermissionLevel => 'Set custom permission level'; + + @override + String get setPermissionsLevelDescription => + 'Please choose a predefined role below or enter a custom permission level between 0 and 100.'; + + @override + String get ignoreUser => 'Ignore user'; + + @override + String get normalUser => 'Normal user'; + + @override + String get remove => 'ลบออก'; + + @override + String get importNow => 'นำเข้าเลย'; + + @override + String get importEmojis => 'นำเข้าอ๊โมจิ'; + + @override + String get importFromZipFile => 'นำเข้าจากไฟล์ .zip'; + + @override + String get exportEmotePack => 'ส่งอิโมจิแพ็คออกเป็นไฟล์ .zip'; + + @override + String get replace => 'แทนที่'; + + @override + String get about => 'เกี่ยวกับ'; + + @override + String aboutHomeserver(String homeserver) { + return 'About $homeserver'; + } + + @override + String get accept => 'ยอมรับ'; + + @override + String acceptedTheInvitation(String username) { + return '👍 $username ได้รับการชวนแล้ว'; + } + + @override + String get account => 'บัญชี'; + + @override + String activatedEndToEndEncryption(String username) { + return '🔐 $username เปิดใช้งาน end to end encryption'; + } + + @override + String get addEmail => 'เพิ่มอีเมล'; + + @override + String get confirmMatrixId => + 'กรุณายืนยัน Matrix ID ของคุณเพื่อลบบัญชีของคุณ'; + + @override + String supposedMxid(String mxid) { + return 'อันนี้ควรเป็น $mxid'; + } + + @override + String get addChatDescription => 'เพิ่มคำอธิบายการแชท'; + + @override + String get addToSpace => 'เพิ่มไปที่ space'; + + @override + String get admin => 'แอดมิน'; + + @override + String get alias => 'นามแฝง'; + + @override + String get all => 'ทั้งหมด'; + + @override + String get allChats => 'แชททั้งหมด'; + + @override + String get commandHint_roomupgrade => + 'Upgrade this room to the given room version'; + + @override + String get commandHint_googly => 'ส่งสายตากวนๆ มาให้หน่อย'; + + @override + String get commandHint_cuddle => 'ส่งเคล้าเคลียให้'; + + @override + String get commandHint_hug => 'ส่งกอดให้'; + + @override + String googlyEyesContent(String senderName) { + return '$senderName ส่งตากวนๆให้คุณ'; + } + + @override + String cuddleContent(String senderName) { + return '$senderName เคล้าเคลียคุณ'; + } + + @override + String hugContent(String senderName) { + return '$senderName กอดคุณ'; + } + + @override + String answeredTheCall(String senderName) { + return '$senderName รับสายแล้ว'; + } + + @override + String get anyoneCanJoin => 'ใครๆ ก็สามารถเข้าร่วมได้'; + + @override + String get appLock => 'ล็อคแอป'; + + @override + String get appLockDescription => + 'Lock the app when not using with a pin code'; + + @override + String get archive => 'คลังเก็บ'; + + @override + String get areGuestsAllowedToJoin => + 'ผู้ใช้ทั่วไปได้รับอนุญาตให้เข้าร่วมหรือไม่'; + + @override + String get areYouSure => 'คุณแน่ใจไหม?'; + + @override + String get areYouSureYouWantToLogout => + 'คุณแน่ใจว่าคุณต้องการที่จะออกจากระบบ?'; + + @override + String get askSSSSSign => + 'เพื่อให้สามารถลงนามบุคคลอื่นได้ โปรดป้อนรหัสผ่านร้านค้าที่ปลอดภัยหรือรหัสกู้คืนของคุณ'; + + @override + String askVerificationRequest(String username) { + return 'ยอมรับคำขอยืนยันนี้จาก $username หรือไม่'; + } + + @override + String get autoplayImages => + 'เล่นสติ๊กเกอร์และอิโมจิแบบเคลื่อนไหวโดยอัตโนมัติ'; + + @override + String badServerLoginTypesException(String serverVersions, + String supportedVersions, Object suportedVersions) { + return 'โฮมเซิร์ฟเวอร์รองรับประเภทการเข้าสู่ระบบ:\n$serverVersions\nแต่แอปนี้รองรับเฉพาะ:\n$supportedVersions'; + } + + @override + String get sendTypingNotifications => 'ส่งการแจ้งเตือนการพิมพ์'; + + @override + String get swipeRightToLeftToReply => 'Swipe right to left to reply'; + + @override + String get sendOnEnter => 'ส่งเมื่อกด enter'; + + @override + String badServerVersionsException(String serverVersions, + String supportedVersions, Object serverVerions, Object suportedVersions) { + return 'The homeserver supports the Spec versions:\n$serverVersions\nBut this app supports only $supportedVersions'; + } + + @override + String countChatsAndCountParticipants(int chats, int participants) { + return '$chats chats and $participants participants'; + } + + @override + String get noMoreChatsFound => 'No more chats found...'; + + @override + String get noChatsFoundHere => + 'No chats found here yet. Start a new chat with someone by using the button below. ⤵️'; + + @override + String get joinedChats => 'Joined chats'; + + @override + String get unread => 'Unread'; + + @override + String get space => 'Space'; + + @override + String get spaces => 'Spaces'; + + @override + String get banFromChat => 'Ban from chat'; + + @override + String get banned => 'Banned'; + + @override + String bannedUser(String username, String targetName) { + return '$username banned $targetName'; + } + + @override + String get blockDevice => 'Block Device'; + + @override + String get blocked => 'Blocked'; + + @override + String get botMessages => 'Bot messages'; + + @override + String get cancel => 'Cancel'; + + @override + String cantOpenUri(String uri) { + return 'Can\'t open the URI $uri'; + } + + @override + String get changeDeviceName => 'Change device name'; + + @override + String changedTheChatAvatar(String username) { + return '$username changed the chat avatar'; + } + + @override + String changedTheChatDescriptionTo(String username, String description) { + return '$username changed the chat description to: \'$description\''; + } + + @override + String changedTheChatNameTo(String username, String chatname) { + return '$username changed the chat name to: \'$chatname\''; + } + + @override + String changedTheChatPermissions(String username) { + return '$username changed the chat permissions'; + } + + @override + String changedTheDisplaynameTo(String username, String displayname) { + return '$username changed their displayname to: \'$displayname\''; + } + + @override + String changedTheGuestAccessRules(String username) { + return '$username changed the guest access rules'; + } + + @override + String changedTheGuestAccessRulesTo(String username, String rules) { + return '$username changed the guest access rules to: $rules'; + } + + @override + String changedTheHistoryVisibility(String username) { + return '$username changed the history visibility'; + } + + @override + String changedTheHistoryVisibilityTo(String username, String rules) { + return '$username changed the history visibility to: $rules'; + } + + @override + String changedTheJoinRules(String username) { + return '$username changed the join rules'; + } + + @override + String changedTheJoinRulesTo(String username, String joinRules) { + return '$username changed the join rules to: $joinRules'; + } + + @override + String changedTheProfileAvatar(String username) { + return '$username changed their avatar'; + } + + @override + String changedTheRoomAliases(String username) { + return '$username changed the room aliases'; + } + + @override + String changedTheRoomInvitationLink(String username) { + return '$username changed the invitation link'; + } + + @override + String get changePassword => 'Change password'; + + @override + String get changeTheHomeserver => 'Change the homeserver'; + + @override + String get changeTheme => 'Change your style'; + + @override + String get changeTheNameOfTheGroup => 'Change the name of the group'; + + @override + String get changeYourAvatar => 'Change your avatar'; + + @override + String get channelCorruptedDecryptError => + 'The encryption has been corrupted'; + + @override + String get chat => 'แชท'; + + @override + String get yourChatBackupHasBeenSetUp => 'Your chat backup has been set up.'; + + @override + String get chatBackup => 'Chat backup'; + + @override + String get chatBackupDescription => + 'Your old messages are secured with a recovery key. Please make sure you don\'t lose it.'; + + @override + String get chatDetails => 'รายละเอียดแชท'; + + @override + String get chatHasBeenAddedToThisSpace => 'Chat has been added to this space'; + + @override + String get chats => 'Chats'; + + @override + String get chooseAStrongPassword => 'Choose a strong password'; + + @override + String get clearArchive => 'Clear archive'; + + @override + String get close => 'Close'; + + @override + String get commandHint_markasdm => + 'Mark as direct message room for the giving Matrix ID'; + + @override + String get commandHint_markasgroup => 'Mark as group'; + + @override + String get commandHint_ban => 'Ban the given user from this room'; + + @override + String get commandHint_clearcache => 'Clear cache'; + + @override + String get commandHint_create => + 'Create an empty group chat\nUse --no-encryption to disable encryption'; + + @override + String get commandHint_discardsession => 'Discard session'; + + @override + String get commandHint_dm => + 'Start a direct chat\nUse --no-encryption to disable encryption'; + + @override + String get commandHint_html => 'Send HTML-formatted text'; + + @override + String get commandHint_invite => 'Invite the given user to this room'; + + @override + String get commandHint_join => 'Join the given room'; + + @override + String get commandHint_kick => 'Remove the given user from this room'; + + @override + String get commandHint_leave => 'Leave this room'; + + @override + String get commandHint_me => 'Describe yourself'; + + @override + String get commandHint_myroomavatar => + 'Set your picture for this room (by mxc-uri)'; + + @override + String get commandHint_myroomnick => 'Set your display name for this room'; + + @override + String get commandHint_op => + 'Set the given user\'s power level (default: 50)'; + + @override + String get commandHint_plain => 'Send unformatted text'; + + @override + String get commandHint_react => 'Send reply as a reaction'; + + @override + String get commandHint_send => 'Send text'; + + @override + String get commandHint_unban => 'Unban the given user from this room'; + + @override + String get commandInvalid => 'Command invalid'; + + @override + String commandMissing(String command) { + return '$command is not a command.'; + } + + @override + String get compareEmojiMatch => 'Please compare the emojis'; + + @override + String get compareNumbersMatch => 'Please compare the numbers'; + + @override + String get configureChat => 'Configure chat'; + + @override + String get confirm => 'Confirm'; + + @override + String get connect => 'Connect'; + + @override + String get contactHasBeenInvitedToTheGroup => + 'Contact has been invited to the group'; + + @override + String get containsDisplayName => 'Contains display name'; + + @override + String get containsUserName => 'Contains username'; + + @override + String get contentHasBeenReported => + 'The content has been reported to the server admins'; + + @override + String get copiedToClipboard => 'Copied to clipboard'; + + @override + String get copy => 'คัดลอก'; + + @override + String get copyToClipboard => 'Copy to clipboard'; + + @override + String couldNotDecryptMessage(String error) { + return 'Could not decrypt message: $error'; + } + + @override + String countParticipants(int count) { + return '$count participants'; + } + + @override + String get create => 'Create'; + + @override + String createdTheChat(String username) { + return '💬 $username created the chat'; + } + + @override + String get createGroup => 'Create group'; + + @override + String get createNewSpace => 'New space'; + + @override + String get currentlyActive => 'Currently active'; + + @override + String get darkTheme => 'Dark'; + + @override + String dateAndTimeOfDay(String date, String timeOfDay) { + return '$date, $timeOfDay'; + } + + @override + String dateWithoutYear(String month, String day) { + return '$month-$day'; + } + + @override + String dateWithYear(String year, String month, String day) { + return '$year-$month-$day'; + } + + @override + String get deactivateAccountWarning => + 'This will deactivate your user account. This can not be undone! Are you sure?'; + + @override + String get defaultPermissionLevel => 'Default permission level for new users'; + + @override + String get delete => 'ลบออก'; + + @override + String get deleteAccount => 'Delete account'; + + @override + String get deleteMessage => 'Delete message'; + + @override + String get device => 'Device'; + + @override + String get deviceId => 'Device ID'; + + @override + String get devices => 'Devices'; + + @override + String get directChats => 'Direct Chats'; + + @override + String get allRooms => 'All Group Chats'; + + @override + String get displaynameHasBeenChanged => 'Displayname has been changed'; + + @override + String get downloadFile => 'Download file'; + + @override + String get edit => 'แก้ไข'; + + @override + String get editBlockedServers => 'Edit blocked servers'; + + @override + String get chatPermissions => 'Chat permissions'; + + @override + String get editDisplayname => 'Edit displayname'; + + @override + String get editRoomAliases => 'Edit room aliases'; + + @override + String get editRoomAvatar => 'Edit room avatar'; + + @override + String get emoteExists => 'Emote already exists!'; + + @override + String get emoteInvalid => 'Invalid emote shortcode!'; + + @override + String get emoteKeyboardNoRecents => + 'Recently-used emotes will appear here...'; + + @override + String get emotePacks => 'Emote packs for room'; + + @override + String get emoteSettings => 'Emote Settings'; + + @override + String get globalChatId => 'Global chat ID'; + + @override + String get accessAndVisibility => 'Access and visibility'; + + @override + String get accessAndVisibilityDescription => + 'Who is allowed to join this chat and how the chat can be discovered.'; + + @override + String get calls => 'Calls'; + + @override + String get customEmojisAndStickers => 'Custom emojis and stickers'; + + @override + String get customEmojisAndStickersBody => + 'Add or share custom emojis or stickers which can be used in any chat.'; + + @override + String get emoteShortcode => 'Emote shortcode'; + + @override + String get emoteWarnNeedToPick => + 'You need to pick an emote shortcode and an image!'; + + @override + String get emptyChat => 'Empty chat'; + + @override + String get enableEmotesGlobally => 'Enable emote pack globally'; + + @override + String get enableEncryption => 'Enable encryption'; + + @override + String get enableEncryptionWarning => + 'You won\'t be able to disable the encryption anymore. Are you sure?'; + + @override + String get encrypted => 'Encrypted'; + + @override + String get encryption => 'Encryption'; + + @override + String get encryptionNotEnabled => 'Encryption is not enabled'; + + @override + String endedTheCall(String senderName) { + return '$senderName ended the call'; + } + + @override + String get enterAnEmailAddress => 'Enter an email address'; + + @override + String get homeserver => 'Homeserver'; + + @override + String get enterYourHomeserver => 'Enter your homeserver'; + + @override + String errorObtainingLocation(String error) { + return 'Error obtaining location: $error'; + } + + @override + String get everythingReady => 'Everything ready!'; + + @override + String get extremeOffensive => 'Extremely offensive'; + + @override + String get fileName => 'File name'; + + @override + String get fluffychat => 'FluffyChat'; + + @override + String get fontSize => 'Font size'; + + @override + String get forward => 'Forward'; + + @override + String get fromJoining => 'From joining'; + + @override + String get fromTheInvitation => 'From the invitation'; + + @override + String get goToTheNewRoom => 'Go to the new room'; + + @override + String get group => 'Group'; + + @override + String get chatDescription => 'Chat description'; + + @override + String get chatDescriptionHasBeenChanged => 'Chat description changed'; + + @override + String get groupIsPublic => 'Group is public'; + + @override + String get groups => 'Groups'; + + @override + String groupWith(String displayname) { + return 'Group with $displayname'; + } + + @override + String get guestsAreForbidden => 'Guests are forbidden'; + + @override + String get guestsCanJoin => 'Guests can join'; + + @override + String hasWithdrawnTheInvitationFor(String username, String targetName) { + return '$username has withdrawn the invitation for $targetName'; + } + + @override + String get help => 'ช่วยเหลือ'; + + @override + String get hideRedactedEvents => 'Hide redacted events'; + + @override + String get hideRedactedMessages => 'Hide redacted messages'; + + @override + String get hideRedactedMessagesBody => + 'If someone redacts a message, this message won\'t be visible in the chat anymore.'; + + @override + String get hideInvalidOrUnknownMessageFormats => + 'Hide invalid or unknown message formats'; + + @override + String get howOffensiveIsThisContent => 'How offensive is this content?'; + + @override + String get id => 'ID'; + + @override + String get identity => 'Identity'; + + @override + String get block => 'Block'; + + @override + String get blockedUsers => 'Blocked users'; + + @override + String get blockListDescription => + 'You can block users who are disturbing you. You won\'t be able to receive any messages or room invites from the users on your personal block list.'; + + @override + String get blockUsername => 'Ignore username'; + + @override + String get iHaveClickedOnLink => 'I have clicked on the link'; + + @override + String get incorrectPassphraseOrKey => 'Incorrect passphrase or recovery key'; + + @override + String get inoffensive => 'Inoffensive'; + + @override + String get inviteContact => 'Invite contact'; + + @override + String inviteContactToGroupQuestion(Object contact, Object groupName) { + return 'Do you want to invite $contact to the chat \"$groupName\"?'; + } + + @override + String inviteContactToGroup(String groupName) { + return 'Invite contact to $groupName'; + } + + @override + String get noChatDescriptionYet => 'No chat description created yet.'; + + @override + String get tryAgain => 'Try again'; + + @override + String get invalidServerName => 'Invalid server name'; + + @override + String get invited => 'Invited'; + + @override + String get redactMessageDescription => + 'The message will be redacted for all participants in this conversation. This cannot be undone.'; + + @override + String get optionalRedactReason => + '(Optional) Reason for redacting this message...'; + + @override + String invitedUser(String username, String targetName) { + return '📩 $username invited $targetName'; + } + + @override + String get invitedUsersOnly => 'Invited users only'; + + @override + String get inviteForMe => 'Invite for me'; + + @override + String inviteText(String username, String link) { + return '$username invited you to Extera.\n1. Visit fluffychat.im and install the app \n2. Sign up or sign in \n3. Open the invite link: \n $link'; + } + + @override + String get isTyping => 'is typing…'; + + @override + String joinedTheChat(String username) { + return '👋 $username joined the chat'; + } + + @override + String get joinRoom => 'Join room'; + + @override + String kicked(String username, String targetName) { + return '👞 $username kicked $targetName'; + } + + @override + String kickedAndBanned(String username, String targetName) { + return '🙅 $username kicked and banned $targetName'; + } + + @override + String get kickFromChat => 'Kick from chat'; + + @override + String lastActiveAgo(String localizedTimeShort) { + return 'Last active: $localizedTimeShort'; + } + + @override + String get leave => 'Leave'; + + @override + String get leftTheChat => 'Left the chat'; + + @override + String get license => 'License'; + + @override + String get lightTheme => 'Light'; + + @override + String loadCountMoreParticipants(int count) { + return 'Load $count more participants'; + } + + @override + String get dehydrate => 'Export session and wipe device'; + + @override + String get dehydrateWarning => + 'This action cannot be undone. Ensure you safely store the backup file.'; + + @override + String get dehydrateTor => 'TOR Users: Export session'; + + @override + String get dehydrateTorLong => + 'For TOR users, it is recommended to export the session before closing the window.'; + + @override + String get hydrateTor => 'TOR Users: Import session export'; + + @override + String get hydrateTorLong => + 'Did you export your session last time on TOR? Quickly import it and continue chatting.'; + + @override + String get hydrate => 'Restore from backup file'; + + @override + String get loadingPleaseWait => 'Loading… Please wait.'; + + @override + String get loadMore => 'Load more…'; + + @override + String get locationDisabledNotice => + 'Location services are disabled. Please enable them to be able to share your location.'; + + @override + String get locationPermissionDeniedNotice => + 'Location permission denied. Please grant them to be able to share your location.'; + + @override + String get login => 'Login'; + + @override + String logInTo(String homeserver) { + return 'Log in to $homeserver'; + } + + @override + String get logout => 'Logout'; + + @override + String get memberChanges => 'Member changes'; + + @override + String get mention => 'Mention'; + + @override + String get messages => 'Messages'; + + @override + String get messagesStyle => 'Messages:'; + + @override + String get moderator => 'Moderator'; + + @override + String get muteChat => 'Mute chat'; + + @override + String get needPantalaimonWarning => + 'Please be aware that you need Pantalaimon to use end-to-end encryption for now.'; + + @override + String get newChat => 'New chat'; + + @override + String get newMessageInFluffyChat => '💬 New message in Extera'; + + @override + String get newVerificationRequest => 'New verification request!'; + + @override + String get next => 'Next'; + + @override + String get no => 'No'; + + @override + String get noConnectionToTheServer => 'No connection to the server'; + + @override + String get noEmotesFound => 'No emotes found. 😕'; + + @override + String get noEncryptionForPublicRooms => + 'You can only activate encryption as soon as the room is no longer publicly accessible.'; + + @override + String get noGoogleServicesWarning => + 'Firebase Cloud Messaging doesn\'t appear to be available on your device. To still receive push notifications, we recommend installing ntfy. With ntfy or another Unified Push provider you can receive push notifications in a data secure way. You can download ntfy from the PlayStore or from F-Droid.'; + + @override + String noMatrixServer(String server1, String server2) { + return '$server1 is no matrix server, use $server2 instead?'; + } + + @override + String get shareInviteLink => 'Share invite link'; + + @override + String get scanQrCode => 'Scan QR code'; + + @override + String get none => 'None'; + + @override + String get noPasswordRecoveryDescription => + 'You have not added a way to recover your password yet.'; + + @override + String get noPermission => 'No permission'; + + @override + String get noRoomsFound => 'No rooms found…'; + + @override + String get notifications => 'Notifications'; + + @override + String get notificationsEnabledForThisAccount => + 'Notifications enabled for this account'; + + @override + String numUsersTyping(int count) { + return '$count users are typing…'; + } + + @override + String get obtainingLocation => 'Obtaining location…'; + + @override + String get offensive => 'Offensive'; + + @override + String get offline => 'Offline'; + + @override + String get ok => 'Ok'; + + @override + String get online => 'Online'; + + @override + String get onlineKeyBackupEnabled => 'Online Key Backup is enabled'; + + @override + String get oopsPushError => + 'Oops! Unfortunately, an error occurred when setting up the push notifications.'; + + @override + String get oopsSomethingWentWrong => 'Oops, something went wrong…'; + + @override + String get openAppToReadMessages => 'Open app to read messages'; + + @override + String get openCamera => 'Open camera'; + + @override + String get openVideoCamera => 'Open camera for a video'; + + @override + String get oneClientLoggedOut => 'One of your clients has been logged out'; + + @override + String get addAccount => 'Add account'; + + @override + String get editBundlesForAccount => 'Edit bundles for this account'; + + @override + String get addToBundle => 'Add to bundle'; + + @override + String get removeFromBundle => 'Remove from this bundle'; + + @override + String get bundleName => 'Bundle name'; + + @override + String get enableMultiAccounts => + '(BETA) Enable multi accounts on this device'; + + @override + String get openInMaps => 'Open in maps'; + + @override + String get link => 'Link'; + + @override + String get serverRequiresEmail => + 'This server needs to validate your email address for registration.'; + + @override + String get or => 'Or'; + + @override + String get participant => 'Participant'; + + @override + String get passphraseOrKey => 'passphrase or recovery key'; + + @override + String get password => 'Password'; + + @override + String get passwordForgotten => 'Password forgotten'; + + @override + String get passwordHasBeenChanged => 'Password has been changed'; + + @override + String get hideMemberChangesInPublicChats => + 'Hide member changes in public chats'; + + @override + String get hideMemberChangesInPublicChatsBody => + 'Do not show in the chat timeline if someone joins or leaves a public chat to improve readability.'; + + @override + String get overview => 'Overview'; + + @override + String get notifyMeFor => 'Notify me for'; + + @override + String get passwordRecoverySettings => 'Password recovery settings'; + + @override + String get passwordRecovery => 'Password recovery'; + + @override + String get people => 'People'; + + @override + String get pickImage => 'Pick an image'; + + @override + String get pin => 'ปักหมุด'; + + @override + String play(String fileName) { + return 'Play $fileName'; + } + + @override + String get pleaseChoose => 'Please choose'; + + @override + String get pleaseChooseAPasscode => 'Please choose a pass code'; + + @override + String get pleaseClickOnLink => + 'Please click on the link in the email and then proceed.'; + + @override + String get pleaseEnter4Digits => + 'Please enter 4 digits or leave empty to disable app lock.'; + + @override + String get pleaseEnterRecoveryKey => 'Please enter your recovery key:'; + + @override + String get pleaseEnterYourPassword => 'Please enter your password'; + + @override + String get pleaseEnterYourPin => 'Please enter your pin'; + + @override + String get pleaseEnterYourUsername => 'Please enter your username'; + + @override + String get pleaseFollowInstructionsOnWeb => + 'Please follow the instructions on the website and tap on next.'; + + @override + String get privacy => 'Privacy'; + + @override + String get publicRooms => 'Public Rooms'; + + @override + String get pushRules => 'Push rules'; + + @override + String get reason => 'Reason'; + + @override + String get recording => 'Recording'; + + @override + String redactedBy(String username) { + return 'Redacted by $username'; + } + + @override + String get directChat => 'Direct chat'; + + @override + String redactedByBecause(String username, String reason) { + return 'Redacted by $username because: \"$reason\"'; + } + + @override + String redactedAnEvent(String username) { + return '$username redacted an event'; + } + + @override + String get redactMessage => 'Redact message'; + + @override + String get register => 'Register'; + + @override + String get reject => 'Reject'; + + @override + String rejectedTheInvitation(String username) { + return '$username rejected the invitation'; + } + + @override + String get rejoin => 'Rejoin'; + + @override + String get removeAllOtherDevices => 'Remove all other devices'; + + @override + String removedBy(String username) { + return 'Removed by $username'; + } + + @override + String get removeDevice => 'Remove device'; + + @override + String get unbanFromChat => 'Unban from chat'; + + @override + String get removeYourAvatar => 'Remove your avatar'; + + @override + String get replaceRoomWithNewerVersion => 'Replace room with newer version'; + + @override + String get reply => 'Reply'; + + @override + String get reportMessage => 'Report message'; + + @override + String get translateMessage => 'Translate message'; + + @override + String get translatedMessage => 'Translated message'; + + @override + String get errorTranslatingMessage => + 'An error has occured while translating the message.'; + + @override + String get recoverMessage => 'Recover message'; + + @override + String get recoveredMessage => 'Recovered message'; + + @override + String get errorRecoveringMessage => + 'An error has occured while recovering the message.'; + + @override + String get errorRecoveringMessageNoAdmin => + 'This feature is available on Synapse homeservers only for adminstrators.'; + + @override + String get requestPermission => 'Request permission'; + + @override + String get roomHasBeenUpgraded => 'Room has been upgraded'; + + @override + String get roomVersion => 'Room version'; + + @override + String get saveFile => 'Save file'; + + @override + String get retry => 'Retry'; + + @override + String get search => 'Search'; + + @override + String get security => 'Security'; + + @override + String get recoveryKey => 'Recovery key'; + + @override + String get recoveryKeyLost => 'Recovery key lost?'; + + @override + String seenByUser(String username) { + return 'Seen by $username'; + } + + @override + String get send => 'ส่ง'; + + @override + String get sendAMessage => 'Send a message'; + + @override + String get sendAsText => 'Send as text'; + + @override + String get sendAudio => 'Send audio'; + + @override + String get sendFile => 'Send file'; + + @override + String get sendImage => 'Send image'; + + @override + String sendImages(int count) { + return 'Send $count image'; + } + + @override + String get sendMessages => 'Send messages'; + + @override + String get sendOriginal => 'Send original'; + + @override + String get sendSticker => 'Send sticker'; + + @override + String get sendVideo => 'Send video'; + + @override + String sentAFile(String username) { + return '📁 $username sent a file'; + } + + @override + String sentAnAudio(String username) { + return '🎤 $username sent an audio'; + } + + @override + String sentAPicture(String username) { + return '🖼️ $username sent a picture'; + } + + @override + String sentASticker(String username) { + return '😊 $username sent a sticker'; + } + + @override + String sentAVideo(String username) { + return '🎥 $username sent a video'; + } + + @override + String sentCallInformations(String senderName) { + return '$senderName sent call information'; + } + + @override + String get separateChatTypes => 'Separate Direct Chats and Groups'; + + @override + String get setAsCanonicalAlias => 'Set as main alias'; + + @override + String get setCustomEmotes => 'Set custom emotes'; + + @override + String get setChatDescription => 'Set chat description'; + + @override + String get setInvitationLink => 'Set invitation link'; + + @override + String get setPermissionsLevel => 'Set permissions level'; + + @override + String get setStatus => 'Set status'; + + @override + String get settings => 'Settings'; + + @override + String get share => 'Share'; + + @override + String sharedTheLocation(String username) { + return '$username shared their location'; + } + + @override + String get shareLocation => 'Share location'; + + @override + String get showPassword => 'Show password'; + + @override + String get presenceStyle => 'Presence:'; + + @override + String get hideAvatarsInInvites => 'Hide avatars in invites'; + + @override + String get hideAvatarsInInvitesDescription => + 'Do not show room avatars in invites'; + + @override + String get presencesToggle => 'Show status messages from other users'; + + @override + String get pureBlackToggle => 'Pure Black'; + + @override + String get singlesignon => 'Single Sign on'; + + @override + String get skip => 'Skip'; + + @override + String get sourceCode => 'Source code'; + + @override + String get spaceIsPublic => 'Space is public'; + + @override + String get spaceName => 'Space name'; + + @override + String startedACall(String senderName) { + return '$senderName started a call'; + } + + @override + String get startFirstChat => 'Start your first chat'; + + @override + String get status => 'Status'; + + @override + String get statusExampleMessage => 'How are you today?'; + + @override + String get submit => 'Submit'; + + @override + String get synchronizingPleaseWait => 'Synchronizing… Please wait.'; + + @override + String synchronizingPleaseWaitCounter(String percentage) { + return ' Synchronizing… ($percentage%)'; + } + + @override + String get systemTheme => 'System'; + + @override + String get theyDontMatch => 'They Don\'t Match'; + + @override + String get theyMatch => 'They Match'; + + @override + String get title => 'Extera'; + + @override + String get toggleFavorite => 'Toggle Favorite'; + + @override + String get toggleMuted => 'Toggle Muted'; + + @override + String get toggleUnread => 'Mark Read/Unread'; + + @override + String get tooManyRequestsWarning => + 'Too many requests. Please try again later!'; + + @override + String get transferFromAnotherDevice => 'Transfer from another device'; + + @override + String get tryToSendAgain => 'Try to send again'; + + @override + String get unavailable => 'Unavailable'; + + @override + String unbannedUser(String username, String targetName) { + return '$username unbanned $targetName'; + } + + @override + String get unblockDevice => 'Unblock Device'; + + @override + String get unknownDevice => 'Unknown device'; + + @override + String get unknownEncryptionAlgorithm => 'Unknown encryption algorithm'; + + @override + String unknownEvent(String type) { + return 'Unknown event \'$type\''; + } + + @override + String get unmuteChat => 'Unmute chat'; + + @override + String get unpin => 'Unpin'; + + @override + String unreadChats(int unreadCount) { + String _temp0 = intl.Intl.pluralLogic( + unreadCount, + locale: localeName, + other: '$unreadCount unread chats', + one: '1 unread chat', + ); + return '$_temp0'; + } + + @override + String userAndOthersAreTyping(String username, int count) { + return '$username and $count others are typing…'; + } + + @override + String userAndUserAreTyping(String username, String username2) { + return '$username and $username2 are typing…'; + } + + @override + String userIsTyping(String username) { + return '$username is typing…'; + } + + @override + String userLeftTheChat(String username) { + return '🚪 $username left the chat'; + } + + @override + String get username => 'Username'; + + @override + String userSentUnknownEvent(String username, String type) { + return '$username sent a $type event'; + } + + @override + String get unverified => 'Unverified'; + + @override + String get verified => 'Verified'; + + @override + String get verify => 'Verify'; + + @override + String get verifyStart => 'Start Verification'; + + @override + String get verifySuccess => 'You successfully verified!'; + + @override + String get verifyTitle => 'Verifying other account'; + + @override + String get videoCall => 'Video call'; + + @override + String get visibilityOfTheChatHistory => 'Visibility of the chat history'; + + @override + String get visibleForAllParticipants => 'Visible for all participants'; + + @override + String get visibleForEveryone => 'Visible for everyone'; + + @override + String get voiceMessage => 'Voice message'; + + @override + String get waitingPartnerAcceptRequest => + 'Waiting for partner to accept the request…'; + + @override + String get waitingPartnerEmoji => 'Waiting for partner to accept the emoji…'; + + @override + String get waitingPartnerNumbers => + 'Waiting for partner to accept the numbers…'; + + @override + String get wallpaper => 'Wallpaper:'; + + @override + String get warning => 'Warning!'; + + @override + String get weSentYouAnEmail => 'We sent you an email'; + + @override + String get whoCanPerformWhichAction => 'Who can perform which action'; + + @override + String get whoIsAllowedToJoinThisGroup => 'Who is allowed to join this group'; + + @override + String get whyDoYouWantToReportThis => 'Why do you want to report this?'; + + @override + String get wipeChatBackup => + 'Wipe your chat backup to create a new recovery key?'; + + @override + String get withTheseAddressesRecoveryDescription => + 'With these addresses you can recover your password.'; + + @override + String get writeAMessage => 'Write a message…'; + + @override + String get yes => 'Yes'; + + @override + String get you => 'You'; + + @override + String get youAreNoLongerParticipatingInThisChat => + 'You are no longer participating in this chat'; + + @override + String get youHaveBeenBannedFromThisChat => + 'You have been banned from this chat'; + + @override + String get yourPublicKey => 'Your public key'; + + @override + String get messageInfo => 'Message info'; + + @override + String get time => 'Time'; + + @override + String get messageType => 'Message Type'; + + @override + String get sender => 'Sender'; + + @override + String get openGallery => 'Open gallery'; + + @override + String get removeFromSpace => 'Remove from space'; + + @override + String get addToSpaceDescription => 'Select a space to add this chat to it.'; + + @override + String get start => 'Start'; + + @override + String get pleaseEnterRecoveryKeyDescription => + 'To unlock your old messages, please enter your recovery key that has been generated in a previous session. Your recovery key is NOT your password.'; + + @override + String get publish => 'Publish'; + + @override + String videoWithSize(String size) { + return 'Video ($size)'; + } + + @override + String get openChat => 'Open Chat'; + + @override + String get markAsRead => 'Mark as read'; + + @override + String get reportUser => 'Report user'; + + @override + String get dismiss => 'Dismiss'; + + @override + String reactedWith(String sender, String reaction) { + return '$sender reacted with $reaction'; + } + + @override + String get pinMessage => 'Pin to room'; + + @override + String get confirmEventUnpin => + 'Are you sure to permanently unpin the event?'; + + @override + String get emojis => 'Emojis'; + + @override + String get placeCall => 'Place call'; + + @override + String get voiceCall => 'Voice call'; + + @override + String get unsupportedAndroidVersion => 'Unsupported Android version'; + + @override + String get unsupportedAndroidVersionLong => + 'This feature requires a newer Android version. Please check for updates or Lineage OS support.'; + + @override + String get videoCallsBetaWarning => + 'Please note that video calls are currently in beta. They might not work as expected or work at all on all platforms.'; + + @override + String get experimentalVideoCalls => 'Experimental video calls'; + + @override + String get emailOrUsername => 'Email or username'; + + @override + String get indexedDbErrorTitle => 'Private mode issues'; + + @override + String get indexedDbErrorLong => + 'The message storage is unfortunately not enabled in private mode by default.\nPlease visit\n - about:config\n - set dom.indexedDB.privateBrowsing.enabled to true\nOtherwise, it is not possible to run Extera.'; + + @override + String switchToAccount(String number) { + return 'Switch to account $number'; + } + + @override + String get nextAccount => 'Next account'; + + @override + String get previousAccount => 'Previous account'; + + @override + String get addWidget => 'Add widget'; + + @override + String get widgetVideo => 'Video'; + + @override + String get widgetEtherpad => 'Text note'; + + @override + String get widgetJitsi => 'Jitsi Meet'; + + @override + String get widgetCustom => 'Custom'; + + @override + String get widgetName => 'Name'; + + @override + String get widgetUrlError => 'This is not a valid URL.'; + + @override + String get widgetNameError => 'Please provide a display name.'; + + @override + String get errorAddingWidget => 'Error adding the widget.'; + + @override + String get youRejectedTheInvitation => 'You rejected the invitation'; + + @override + String get youJoinedTheChat => 'You joined the chat'; + + @override + String get youAcceptedTheInvitation => '👍 You accepted the invitation'; + + @override + String youBannedUser(String user) { + return 'You banned $user'; + } + + @override + String youHaveWithdrawnTheInvitationFor(String user) { + return 'You have withdrawn the invitation for $user'; + } + + @override + String youInvitedToBy(String alias) { + return '📩 You have been invited via link to:\n$alias'; + } + + @override + String youInvitedBy(String user) { + return '📩 You have been invited by $user'; + } + + @override + String invitedBy(String user) { + return '📩 Invited by $user'; + } + + @override + String youInvitedUser(String user) { + return '📩 You invited $user'; + } + + @override + String youKicked(String user) { + return '👞 You kicked $user'; + } + + @override + String youKickedAndBanned(String user) { + return '🙅 You kicked and banned $user'; + } + + @override + String youUnbannedUser(String user) { + return 'You unbanned $user'; + } + + @override + String hasKnocked(String user) { + return '🚪 $user has knocked'; + } + + @override + String get usersMustKnock => 'Users must knock'; + + @override + String get noOneCanJoin => 'No one can join'; + + @override + String userWouldLikeToChangeTheChat(String user) { + return '$user would like to join the chat.'; + } + + @override + String get noPublicLinkHasBeenCreatedYet => + 'No public link has been created yet'; + + @override + String get knock => 'Knock'; + + @override + String get users => 'Users'; + + @override + String get unlockOldMessages => 'Unlock old messages'; + + @override + String get storeInSecureStorageDescription => + 'Store the recovery key in the secure storage of this device.'; + + @override + String get saveKeyManuallyDescription => + 'Save this key manually by triggering the system share dialog or clipboard.'; + + @override + String get storeInAndroidKeystore => 'Store in Android KeyStore'; + + @override + String get storeInAppleKeyChain => 'Store in Apple KeyChain'; + + @override + String get storeSecurlyOnThisDevice => 'Store securely on this device'; + + @override + String countFiles(int count) { + return '$count files'; + } + + @override + String get user => 'User'; + + @override + String get custom => 'Custom'; + + @override + String get foregroundServiceRunning => + 'This notification appears when the foreground service is running.'; + + @override + String get screenSharingTitle => 'screen sharing'; + + @override + String get screenSharingDetail => 'You are sharing your screen in Extera'; + + @override + String get callingPermissions => 'Calling permissions'; + + @override + String get callingAccount => 'Calling account'; + + @override + String get callingAccountDetails => + 'Allows Extera to use the native android dialer app.'; + + @override + String get appearOnTop => 'Appear on top'; + + @override + String get appearOnTopDetails => + 'Allows the app to appear on top (not needed if you already have Fluffychat setup as a calling account)'; + + @override + String get otherCallingPermissions => + 'Microphone, camera and other Extera permissions'; + + @override + String get whyIsThisMessageEncrypted => 'Why is this message unreadable?'; + + @override + String get noKeyForThisMessage => + 'This can happen if the message was sent before you have signed in to your account at this device.\n\nIt is also possible that the sender has blocked your device or something went wrong with the internet connection.\n\nAre you able to read the message on another session? Then you can transfer the message from it! Go to Settings > Devices and make sure that your devices have verified each other. When you open the room the next time and both sessions are in the foreground, the keys will be transmitted automatically.\n\nDo you not want to lose the keys when logging out or switching devices? Make sure that you have enabled the chat backup in the settings.'; + + @override + String get newGroup => 'New group'; + + @override + String get newSpace => 'New space'; + + @override + String get enterSpace => 'Enter space'; + + @override + String get enterRoom => 'Enter room'; + + @override + String get allSpaces => 'All spaces'; + + @override + String numChats(String number) { + return '$number chats'; + } + + @override + String get hideUnimportantStateEvents => 'Hide unimportant state events'; + + @override + String get hidePresences => 'Hide Status List?'; + + @override + String get doNotShowAgain => 'Do not show again'; + + @override + String wasDirectChatDisplayName(String oldDisplayName) { + return 'Empty chat (was $oldDisplayName)'; + } + + @override + String get newSpaceDescription => + 'Spaces allows you to consolidate your chats and build private or public communities.'; + + @override + String get encryptThisChat => 'Encrypt this chat'; + + @override + String get disableEncryptionWarning => + 'For security reasons you can not disable encryption in a chat, where it has been enabled before.'; + + @override + String get sorryThatsNotPossible => 'Sorry... that is not possible'; + + @override + String get deviceKeys => 'Device keys:'; + + @override + String get reopenChat => 'Reopen chat'; + + @override + String get noBackupWarning => + 'Warning! Without enabling chat backup, you will lose access to your encrypted messages. It is highly recommended to enable the chat backup first before logging out.'; + + @override + String get noOtherDevicesFound => 'No other devices found'; + + @override + String fileIsTooBigForServer(String max) { + return 'Unable to send! The server only supports attachments up to $max.'; + } + + @override + String fileHasBeenSavedAt(String path) { + return 'File has been saved at $path'; + } + + @override + String get jumpToLastReadMessage => 'Jump to last read message'; + + @override + String get readUpToHere => 'Read up to here'; + + @override + String get jump => 'Jump'; + + @override + String get openLinkInBrowser => 'Open link in browser'; + + @override + String get reportErrorDescription => + '😭 Oh no. Something went wrong. If you want, you can report this bug to the developers.'; + + @override + String get report => 'Report'; + + @override + String get signInWithPassword => 'Sign in with password'; + + @override + String get pleaseTryAgainLaterOrChooseDifferentServer => + 'Please try again later or choose a different server.'; + + @override + String signInWith(String provider) { + return 'Sign in with $provider'; + } + + @override + String get profileNotFound => + 'The user could not be found on the server. Maybe there is a connection problem or the user doesn\'t exist.'; + + @override + String get setTheme => 'Set theme:'; + + @override + String get setColorTheme => 'Set color theme:'; + + @override + String get invite => 'Invite'; + + @override + String get inviteGroupChat => '📨 Invite group chat'; + + @override + String get invitePrivateChat => '📨 Invite private chat'; + + @override + String get invalidInput => 'Invalid input!'; + + @override + String wrongPinEntered(int seconds) { + return 'Wrong pin entered! Try again in $seconds seconds...'; + } + + @override + String get pleaseEnterANumber => 'Please enter a number greater than 0'; + + @override + String get archiveRoomDescription => + 'The chat will be moved to the archive. Other users will be able to see that you have left the chat.'; + + @override + String get roomUpgradeDescription => + 'The chat will then be recreated with the new room version. All participants will be notified that they need to switch to the new chat. You can find out more about room versions at https://spec.matrix.org/latest/rooms/'; + + @override + String get removeDevicesDescription => + 'You will be logged out of this device and will no longer be able to receive messages.'; + + @override + String get banUserDescription => + 'The user will be banned from the chat and will not be able to enter the chat again until they are unbanned.'; + + @override + String get unbanUserDescription => + 'The user will be able to enter the chat again if they try.'; + + @override + String get kickUserDescription => + 'The user is kicked out of the chat but not banned. In public chats, the user can rejoin at any time.'; + + @override + String get makeAdminDescription => + 'Once you make this user admin, you may not be able to undo this as they will then have the same permissions as you.'; + + @override + String get pushNotificationsNotAvailable => + 'Push notifications not available'; + + @override + String get learnMore => 'Learn more'; + + @override + String get yourGlobalUserIdIs => 'Your global user-ID is: '; + + @override + String noUsersFoundWithQuery(String query) { + return 'Unfortunately no user could be found with \"$query\". Please check whether you made a typo.'; + } + + @override + String get knocking => 'Knocking'; + + @override + String chatCanBeDiscoveredViaSearchOnServer(String server) { + return 'Chat can be discovered via the search on $server'; + } + + @override + String get searchChatsRooms => 'Search for #chats, @users...'; + + @override + String get nothingFound => 'Nothing found...'; + + @override + String get groupName => 'Group name'; + + @override + String get createGroupAndInviteUsers => 'Create a group and invite users'; + + @override + String get groupCanBeFoundViaSearch => 'Group can be found via search'; + + @override + String get wrongRecoveryKey => + 'Sorry... this does not seem to be the correct recovery key.'; + + @override + String get startConversation => 'Start conversation'; + + @override + String get commandHint_sendraw => 'Send raw json'; + + @override + String get databaseMigrationTitle => 'Database is optimized'; + + @override + String get databaseMigrationBody => 'Please wait. This may take a moment.'; + + @override + String get leaveEmptyToClearStatus => 'Leave empty to clear your status.'; + + @override + String get select => 'Select'; + + @override + String get searchForUsers => 'Search for @users...'; + + @override + String get pleaseEnterYourCurrentPassword => + 'Please enter your current password'; + + @override + String get newPassword => 'New password'; + + @override + String get pleaseChooseAStrongPassword => 'Please choose a strong password'; + + @override + String get passwordsDoNotMatch => 'Passwords do not match'; + + @override + String get passwordIsWrong => 'Your entered password is wrong'; + + @override + String get publicLink => 'Public link'; + + @override + String get publicChatAddresses => 'Public chat addresses'; + + @override + String get createNewAddress => 'Create new address'; + + @override + String get joinSpace => 'Join space'; + + @override + String get publicSpaces => 'Public spaces'; + + @override + String get addChatOrSubSpace => 'Add chat or sub space'; + + @override + String get subspace => 'Subspace'; + + @override + String get decline => 'Decline'; + + @override + String get thisDevice => 'This device:'; + + @override + String get initAppError => 'An error occured while init the app'; + + @override + String get userRole => 'User role'; + + @override + String minimumPowerLevel(String level) { + return '$level is the minimum power level.'; + } + + @override + String searchIn(String chat) { + return 'Search in chat \"$chat\"...'; + } + + @override + String get searchMore => 'Search more...'; + + @override + String get gallery => 'Gallery'; + + @override + String get files => 'Files'; + + @override + String databaseBuildErrorBody(String url, String error) { + return 'Unable to build the SQlite database. The app tries to use the legacy database for now. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String sessionLostBody(String url, String error) { + return 'Your session is lost. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String restoreSessionBody(String url, String error) { + return 'The app now tries to restore your session from the backup. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String forwardMessageTo(String roomName) { + return 'Forward message to $roomName?'; + } + + @override + String get sendReadReceipts => 'Send read receipts'; + + @override + String get sendTypingNotificationsDescription => + 'Other participants in a chat can see when you are typing a new message.'; + + @override + String get sendReadReceiptsDescription => + 'Other participants in a chat can see when you have read a message.'; + + @override + String get formattedMessages => 'Formatted messages'; + + @override + String get formattedMessagesDescription => + 'Display rich message content like bold text using markdown.'; + + @override + String get verifyOtherUser => '🔐 Verify other user'; + + @override + String get verifyOtherUserDescription => + 'If you verify another user, you can be sure that you know who you are really writing to. 💪\n\nWhen you start a verification, you and the other user will see a popup in the app. There you will then see a series of emojis or numbers that you have to compare with each other.\n\nThe best way to do this is to meet up or start a video call. 👭'; + + @override + String get verifyOtherDevice => '🔐 Verify other device'; + + @override + String get verifyOtherDeviceDescription => + 'When you verify another device, those devices can exchange keys, increasing your overall security. 💪 When you start a verification, a popup will appear in the app on both devices. There you will then see a series of emojis or numbers that you have to compare with each other. It\'s best to have both devices handy before you start the verification. 🤳'; + + @override + String acceptedKeyVerification(String sender) { + return '$sender accepted key verification'; + } + + @override + String canceledKeyVerification(String sender) { + return '$sender canceled key verification'; + } + + @override + String completedKeyVerification(String sender) { + return '$sender completed key verification'; + } + + @override + String isReadyForKeyVerification(String sender) { + return '$sender is ready for key verification'; + } + + @override + String requestedKeyVerification(String sender) { + return '$sender requested key verification'; + } + + @override + String startedKeyVerification(String sender) { + return '$sender started key verification'; + } + + @override + String get transparent => 'Transparent'; + + @override + String get incomingMessages => 'Incoming messages'; + + @override + String get stickers => 'Stickers'; + + @override + String get discover => 'Discover'; + + @override + String get commandHint_ignore => 'Ignore the given matrix ID'; + + @override + String get commandHint_unignore => 'Unignore the given matrix ID'; + + @override + String unreadChatsInApp(String appname, String unread) { + return '$appname: $unread unread chats'; + } + + @override + String get noDatabaseEncryption => + 'Database encryption is not supported on this platform'; + + @override + String thereAreCountUsersBlocked(Object count) { + return 'Right now there are $count users blocked.'; + } + + @override + String get restricted => 'Restricted'; + + @override + String get knockRestricted => 'Knock restricted'; + + @override + String goToSpace(Object space) { + return 'Go to space: $space'; + } + + @override + String get markAsUnread => 'Mark as unread'; + + @override + String userLevel(int level) { + return '$level - User'; + } + + @override + String moderatorLevel(int level) { + return '$level - Moderator'; + } + + @override + String adminLevel(int level) { + return '$level - Admin'; + } + + @override + String get changeGeneralChatSettings => 'Change general chat settings'; + + @override + String get inviteOtherUsers => 'Invite other users to this chat'; + + @override + String get changeTheChatPermissions => 'Change the chat permissions'; + + @override + String get changeTheVisibilityOfChatHistory => + 'Change the visibility of the chat history'; + + @override + String get changeTheCanonicalRoomAlias => + 'Change the main public chat address'; + + @override + String get sendRoomNotifications => 'Send a @room notifications'; + + @override + String get changeTheDescriptionOfTheGroup => + 'Change the description of the chat'; + + @override + String get chatPermissionsDescription => + 'Define which power level is necessary for certain actions in this chat. The power levels 0, 50 and 100 are usually representing users, moderators and admins, but any gradation is possible.'; + + @override + String updateInstalled(String version) { + return '🎉 Update $version installed!'; + } + + @override + String get changelog => 'Changelog'; + + @override + String get sendCanceled => 'Sending canceled'; + + @override + String get loginWithMatrixId => 'Login with Matrix-ID'; + + @override + String get discoverHomeservers => 'Discover homeservers'; + + @override + String get whatIsAHomeserver => 'What is a homeserver?'; + + @override + String get homeserverDescription => + 'All your data is stored on the homeserver, just like an email provider. You can choose which homeserver you want to use, while you can still communicate with everyone. Learn more at at https://matrix.org.'; + + @override + String get doesNotSeemToBeAValidHomeserver => + 'Doesn\'t seem to be a compatible homeserver. Wrong URL?'; + + @override + String get calculatingFileSize => 'Calculating file size...'; + + @override + String get prepareSendingAttachment => 'Prepare sending attachment...'; + + @override + String get sendingAttachment => 'Sending attachment...'; + + @override + String get generatingVideoThumbnail => 'Generating video thumbnail...'; + + @override + String get compressVideo => 'Compressing video...'; + + @override + String sendingAttachmentCountOfCount(int index, int length) { + return 'Sending attachment $index of $length...'; + } + + @override + String serverLimitReached(int seconds) { + return 'Server limit reached! Waiting $seconds seconds...'; + } + + @override + String get oneOfYourDevicesIsNotVerified => + 'One of your devices is not verified'; + + @override + String get noticeChatBackupDeviceVerification => + 'Note: When you connect all your devices to the chat backup, they are automatically verified.'; + + @override + String get continueText => 'Continue'; + + @override + String get welcomeText => + 'Hey Hey 👋 This is Extera. You can sign in to any homeserver, which is compatible with https://matrix.org. And then chat with anyone. It\'s a huge decentralized messaging network!'; + + @override + String get blur => 'Blur:'; + + @override + String get opacity => 'Opacity:'; + + @override + String get setWallpaper => 'Set wallpaper'; + + @override + String get manageAccount => 'Manage account'; + + @override + String get noContactInformationProvided => + 'Server does not provide any valid contact information'; + + @override + String get contactServerAdmin => 'Contact server admin'; + + @override + String get contactServerSecurity => 'Contact server security'; + + @override + String get supportPage => 'Support page'; + + @override + String get serverInformation => 'Server information:'; + + @override + String get name => 'Name'; + + @override + String get version => 'Version'; + + @override + String get website => 'Website'; + + @override + String get compress => 'Compress'; + + @override + String get boldText => 'Bold text'; + + @override + String get italicText => 'Italic text'; + + @override + String get strikeThrough => 'Strikethrough'; + + @override + String get pleaseFillOut => 'Please fill out'; + + @override + String get invalidUrl => 'Invalid url'; + + @override + String get addLink => 'Add link'; + + @override + String get unableToJoinChat => + 'Unable to join chat. Maybe the other party has already closed the conversation.'; + + @override + String get previous => 'Previous'; + + @override + String get otherPartyNotLoggedIn => + 'The other party is currently not logged in and therefore cannot receive messages!'; + + @override + String appWantsToUseForLogin(String server) { + return 'Use \'$server\' to log in'; + } + + @override + String get appWantsToUseForLoginDescription => + 'You hereby allow the app and website to share information about you.'; + + @override + String get open => 'Open'; + + @override + String get waitingForServer => 'Waiting for server...'; + + @override + String get appIntroduction => + 'Extera lets you chat with your friends across different messengers. Learn more at https://matrix.org or just tap *Continue*.'; + + @override + String get newChatRequest => '📩 New chat request'; + + @override + String get contentNotificationSettings => 'Content notification settings'; + + @override + String get generalNotificationSettings => 'General notification settings'; + + @override + String get roomNotificationSettings => 'Room notification settings'; + + @override + String get userSpecificNotificationSettings => + 'User specific notification settings'; + + @override + String get otherNotificationSettings => 'Other notification settings'; + + @override + String get notificationRuleContainsUserName => 'Contains User Name'; + + @override + String get notificationRuleContainsUserNameDescription => + 'Notifies the user when a message contains their username.'; + + @override + String get notificationRuleMaster => 'Mute all notifications'; + + @override + String get notificationRuleMasterDescription => + 'Overrides all other rules and disables all notifications.'; + + @override + String get notificationRuleSuppressNotices => 'Suppress Automated Messages'; + + @override + String get notificationRuleSuppressNoticesDescription => + 'Suppresses notifications from automated clients like bots.'; + + @override + String get notificationRuleInviteForMe => 'Invite for Me'; + + @override + String get notificationRuleInviteForMeDescription => + 'Notifies the user when they are invited to a room.'; + + @override + String get notificationRuleMemberEvent => 'Member Event'; + + @override + String get notificationRuleMemberEventDescription => + 'Suppresses notifications for membership events.'; + + @override + String get notificationRuleIsUserMention => 'User Mention'; + + @override + String get notificationRuleIsUserMentionDescription => + 'Notifies the user when they are directly mentioned in a message.'; + + @override + String get notificationRuleContainsDisplayName => 'Contains Display Name'; + + @override + String get notificationRuleContainsDisplayNameDescription => + 'Notifies the user when a message contains their display name.'; + + @override + String get notificationRuleIsRoomMention => 'Room Mention'; + + @override + String get notificationRuleIsRoomMentionDescription => + 'Notifies the user when there is a room mention.'; + + @override + String get notificationRuleRoomnotif => 'Room Notification'; + + @override + String get notificationRuleRoomnotifDescription => + 'Notifies the user when a message contains \'@room\'.'; + + @override + String get notificationRuleTombstone => 'Tombstone'; + + @override + String get notificationRuleTombstoneDescription => + 'Notifies the user about room deactivation messages.'; + + @override + String get notificationRuleReaction => 'Reaction'; + + @override + String get notificationRuleReactionDescription => + 'Suppresses notifications for reactions.'; + + @override + String get notificationRuleRoomServerAcl => 'Room Server ACL'; + + @override + String get notificationRuleRoomServerAclDescription => + 'Suppresses notifications for room server access control lists (ACL).'; + + @override + String get notificationRuleSuppressEdits => 'Suppress Edits'; + + @override + String get notificationRuleSuppressEditsDescription => + 'Suppresses notifications for edited messages.'; + + @override + String get notificationRuleCall => 'Call'; + + @override + String get notificationRuleCallDescription => + 'Notifies the user about calls.'; + + @override + String get notificationRuleEncryptedRoomOneToOne => + 'Encrypted Room One-to-One'; + + @override + String get notificationRuleEncryptedRoomOneToOneDescription => + 'Notifies the user about messages in encrypted one-to-one rooms.'; + + @override + String get notificationRuleRoomOneToOne => 'Room One-to-One'; + + @override + String get notificationRuleRoomOneToOneDescription => + 'Notifies the user about messages in one-to-one rooms.'; + + @override + String get notificationRuleMessage => 'Message'; + + @override + String get notificationRuleMessageDescription => + 'Notifies the user about general messages.'; + + @override + String get notificationRuleEncrypted => 'Encrypted'; + + @override + String get notificationRuleEncryptedDescription => + 'Notifies the user about messages in encrypted rooms.'; + + @override + String get notificationRuleJitsi => 'Jitsi'; + + @override + String get notificationRuleJitsiDescription => + 'Notifies the user about Jitsi widget events.'; + + @override + String get notificationRuleServerAcl => 'Suppress Server ACL Events'; + + @override + String get notificationRuleServerAclDescription => + 'Suppresses notifications for Server ACL events.'; + + @override + String unknownPushRule(String rule) { + return 'Unknown push rule \'$rule\''; + } + + @override + String get deletePushRuleCanNotBeUndone => + 'If you delete this notification setting, this can not be undone.'; + + @override + String get more => 'More'; + + @override + String get shareKeysWith => 'Share keys with...'; + + @override + String get shareKeysWithDescription => + 'Which devices should be trusted so that they can read along your messages in encrypted chats?'; + + @override + String get allDevices => 'All devices'; + + @override + String get crossVerifiedDevicesIfEnabled => + 'Cross verified devices if enabled'; + + @override + String get crossVerifiedDevices => 'Cross verified devices'; + + @override + String get verifiedDevicesOnly => 'Verified devices only'; + + @override + String get takeAPhoto => 'Take a photo'; + + @override + String get recordAVideo => 'Record a video'; + + @override + String get optionalMessage => '(Optional) message...'; + + @override + String get notSupportedOnThisDevice => 'Not supported on this device'; + + @override + String get enterNewChat => 'Enter new chat'; + + @override + String get approve => 'Approve'; + + @override + String get youHaveKnocked => 'You have knocked'; + + @override + String get pleaseWaitUntilInvited => + 'Please wait now, until someone from the room invites you.'; +} diff --git a/lib/generated/l10n/l10n_tr.dart b/lib/generated/l10n/l10n_tr.dart new file mode 100644 index 0000000..4eae67f --- /dev/null +++ b/lib/generated/l10n/l10n_tr.dart @@ -0,0 +1,2754 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'l10n.dart'; + +// ignore_for_file: type=lint + +/// The translations for Turkish (`tr`). +class L10nTr extends L10n { + L10nTr([String locale = 'tr']) : super(locale); + + @override + String get noSendPermission => 'You can\'t send messages here'; + + @override + String get alwaysUse24HourFormat => 'false'; + + @override + String get repeatPassword => 'Parolayı tekrarlayın'; + + @override + String get notAnImage => 'Bir resim dosyası değil.'; + + @override + String get setCustomPermissionLevel => 'Set custom permission level'; + + @override + String get setPermissionsLevelDescription => + 'Please choose a predefined role below or enter a custom permission level between 0 and 100.'; + + @override + String get ignoreUser => 'Ignore user'; + + @override + String get normalUser => 'Normal user'; + + @override + String get remove => 'Kaldır'; + + @override + String get importNow => 'Şimdi içe aktar'; + + @override + String get importEmojis => 'İfadeleri İçe Aktar'; + + @override + String get importFromZipFile => '.zip dosyasından içe aktar'; + + @override + String get exportEmotePack => 'İfade paketini .zip olarak dışa aktar'; + + @override + String get replace => 'Değiştir'; + + @override + String get about => 'Hakkında'; + + @override + String aboutHomeserver(String homeserver) { + return '$homeserver Hakkında'; + } + + @override + String get accept => 'Kabul et'; + + @override + String acceptedTheInvitation(String username) { + return '👍 $username katılma davetini kabul etti'; + } + + @override + String get account => 'Hesap'; + + @override + String activatedEndToEndEncryption(String username) { + return '🔐 $username uçtan uca şifrelemeyi etkinleştirdi'; + } + + @override + String get addEmail => 'E-posta ekle'; + + @override + String get confirmMatrixId => + 'Hesabınızı silmek için lütfen Matrix kimliğinizi doğrulayın.'; + + @override + String supposedMxid(String mxid) { + return 'Bu $mxid olmalıdır'; + } + + @override + String get addChatDescription => 'Sohbet açıklaması ekle...'; + + @override + String get addToSpace => 'Alana ekle'; + + @override + String get admin => 'Yönetici'; + + @override + String get alias => 'takma ad'; + + @override + String get all => 'Tümü'; + + @override + String get allChats => 'Tüm sohbetler'; + + @override + String get commandHint_roomupgrade => + 'Upgrade this room to the given room version'; + + @override + String get commandHint_googly => 'Şaşkın gözler gönder'; + + @override + String get commandHint_cuddle => 'Kucaklama gönder'; + + @override + String get commandHint_hug => 'Sarılma gönder'; + + @override + String googlyEyesContent(String senderName) { + return '$senderName size şaşkın gözler gönderiyor'; + } + + @override + String cuddleContent(String senderName) { + return '$senderName sizi kucaklıyor'; + } + + @override + String hugContent(String senderName) { + return '$senderName size sarılıyor'; + } + + @override + String answeredTheCall(String senderName) { + return '$senderName aramayı yanıtladı'; + } + + @override + String get anyoneCanJoin => 'Herkes katılabilir'; + + @override + String get appLock => 'Uygulama kilidi'; + + @override + String get appLockDescription => + 'Kullanılmadığında PIN kodu ile uygulamayı kilitle'; + + @override + String get archive => 'Arşiv'; + + @override + String get areGuestsAllowedToJoin => + 'Misafir kullanıcıların katılmasına izin veriliyor mu'; + + @override + String get areYouSure => 'Emin misiniz?'; + + @override + String get areYouSureYouWantToLogout => + 'Oturumu açmak istediğinizden emin misiniz?'; + + @override + String get askSSSSSign => + 'Diğer kişiyi imzalayabilmek için lütfen güvenli depolama parolanızı veya kurtarma anahtarınızı girin.'; + + @override + String askVerificationRequest(String username) { + return '$username kişisinden gelen bu doğrulama isteği kabul edilsin mi?'; + } + + @override + String get autoplayImages => + 'Canlandırmalı çıkartmaları ve ifadeleri otomatik olarak oynat'; + + @override + String badServerLoginTypesException(String serverVersions, + String supportedVersions, Object suportedVersions) { + return 'Ana sunucu aşağıdaki oturum açma türlerini destekliyor:\n$serverVersions\nAncak bu uygulama yalnızca aşağıdakileri destekliyor:\n$supportedVersions'; + } + + @override + String get sendTypingNotifications => 'Yazma bildirimleri gönder'; + + @override + String get swipeRightToLeftToReply => 'Yanıtlamak için sağdan sola kaydır'; + + @override + String get sendOnEnter => 'Enter tuşu ile gönder'; + + @override + String badServerVersionsException(String serverVersions, + String supportedVersions, Object serverVerions, Object suportedVersions) { + return 'Ana sunucu aşağıdaki Spec sürümlerini destekliyor:\n$serverVersions\nAncak bu uygulama yalnızca $supportedVersions destekliyor'; + } + + @override + String countChatsAndCountParticipants(int chats, int participants) { + return '$chats sohbet ve $participants katılımcı'; + } + + @override + String get noMoreChatsFound => 'Başka sohbet bulunamadı...'; + + @override + String get noChatsFoundHere => + 'Burada henüz sohbet bulunamadı. Aşağıdaki düğmeyi kullanarak biriyle yeni bir sohbet başlatın. ⤵️'; + + @override + String get joinedChats => 'Katılınan sohbetler'; + + @override + String get unread => 'Okunmadı'; + + @override + String get space => 'Alan'; + + @override + String get spaces => 'Alanlar'; + + @override + String get banFromChat => 'Sohbetten engelle'; + + @override + String get banned => 'Engellendi'; + + @override + String bannedUser(String username, String targetName) { + return '$username, $targetName kişisini engelledi'; + } + + @override + String get blockDevice => 'Aygıtı Engelle'; + + @override + String get blocked => 'Engellendi'; + + @override + String get botMessages => 'Bot mesajları'; + + @override + String get cancel => 'İptal'; + + @override + String cantOpenUri(String uri) { + return '$uri URI\'si açılamıyor'; + } + + @override + String get changeDeviceName => 'Aygıt adını değiştir'; + + @override + String changedTheChatAvatar(String username) { + return '$username sohbet avatarını değiştirdi'; + } + + @override + String changedTheChatDescriptionTo(String username, String description) { + return '$username sohbet açıklamasını değiştirdi: \'$description\''; + } + + @override + String changedTheChatNameTo(String username, String chatname) { + return '$username sohbet adını değiştirdi: \'$chatname\''; + } + + @override + String changedTheChatPermissions(String username) { + return '$username sohbet izinlerini değiştirdi'; + } + + @override + String changedTheDisplaynameTo(String username, String displayname) { + return '$username görünen adını \'$displayname\' olarak değiştirdi'; + } + + @override + String changedTheGuestAccessRules(String username) { + return '$username misafir erişim kurallarını değiştirdi'; + } + + @override + String changedTheGuestAccessRulesTo(String username, String rules) { + return '$username misafir erişim kurallarını değiştirdi: $rules'; + } + + @override + String changedTheHistoryVisibility(String username) { + return '$username geçmiş görünürlüğünü değiştirdi'; + } + + @override + String changedTheHistoryVisibilityTo(String username, String rules) { + return '$username geçmiş görünürlüğünü değiştirdi: $rules'; + } + + @override + String changedTheJoinRules(String username) { + return '$username katılım kurallarını değiştirdi'; + } + + @override + String changedTheJoinRulesTo(String username, String joinRules) { + return '$username katılım kurallarını değiştirdi: $joinRules'; + } + + @override + String changedTheProfileAvatar(String username) { + return '$username avatarını değiştirdi'; + } + + @override + String changedTheRoomAliases(String username) { + return '$username oda takma adlarını değiştirdi'; + } + + @override + String changedTheRoomInvitationLink(String username) { + return '$username davet bağlantısını değiştirdi'; + } + + @override + String get changePassword => 'Parolayı değiştir'; + + @override + String get changeTheHomeserver => 'Ana sunucuyu değiştir'; + + @override + String get changeTheme => 'Tarzınızı değiştirin'; + + @override + String get changeTheNameOfTheGroup => 'Grubun adını değiştir'; + + @override + String get changeYourAvatar => 'Avatarınızı değiştirin'; + + @override + String get channelCorruptedDecryptError => 'Şifreleme bozuldu'; + + @override + String get chat => 'Sohbet'; + + @override + String get yourChatBackupHasBeenSetUp => 'Sohbet yedeklemeniz ayarlandı.'; + + @override + String get chatBackup => 'Sohbet yedekleme'; + + @override + String get chatBackupDescription => + 'Eski mesajlarınız bir kurtarma anahtarı ile güvence altına alındı. Lütfen kaybetmediğinizden emin olun.'; + + @override + String get chatDetails => 'Sohbet ayrıntıları'; + + @override + String get chatHasBeenAddedToThisSpace => 'Sohbet bu alana eklendi'; + + @override + String get chats => 'Sohbetler'; + + @override + String get chooseAStrongPassword => 'Güçlü bir parola seçin'; + + @override + String get clearArchive => 'Arşivi temizle'; + + @override + String get close => 'Kapat'; + + @override + String get commandHint_markasdm => + 'Verilen Matrix kimliği için doğrudan mesaj odası olarak işaretle'; + + @override + String get commandHint_markasgroup => 'Grup olarak işaretle'; + + @override + String get commandHint_ban => 'Verilen kullanıcıyı bu odadan yasaklayın'; + + @override + String get commandHint_clearcache => 'Önbelleği temizleyin'; + + @override + String get commandHint_create => + 'Boş bir grup sohbeti oluşturun\nŞifrelemeyi devre dışı bırakmak için --no-encryption kullanın'; + + @override + String get commandHint_discardsession => 'Oturumu silin'; + + @override + String get commandHint_dm => + 'Doğrudan sohbet başlatın\nŞifrelemeyi devre dışı bırakmak için --no-encryption kullanın'; + + @override + String get commandHint_html => 'HTML biçimli metin gönderin'; + + @override + String get commandHint_invite => 'Verilen kullanıcıyı bu odaya davet edin'; + + @override + String get commandHint_join => 'Verilen odaya katılın'; + + @override + String get commandHint_kick => 'Verilen kullanıcıyı bu odadan kaldırın'; + + @override + String get commandHint_leave => 'Bu odadan ayrılın'; + + @override + String get commandHint_me => 'Kendinizi tanımlayın'; + + @override + String get commandHint_myroomavatar => + 'Bu oda için resminizi ayarlayın (mxc-uri ile)'; + + @override + String get commandHint_myroomnick => 'Bu oda için görünen adınızı ayarlayın'; + + @override + String get commandHint_op => + 'Verilen kullanıcının güç seviyesini ayarlayın (öntanımlı: 50)'; + + @override + String get commandHint_plain => 'Biçimlendirilmemiş metin gönderin'; + + @override + String get commandHint_react => 'Tepki olarak yanıt gönderin'; + + @override + String get commandHint_send => 'Metin gönderin'; + + @override + String get commandHint_unban => + 'Verilen kullanıcının bu odadaki yasağını kaldırın'; + + @override + String get commandInvalid => 'Komut geçersiz'; + + @override + String commandMissing(String command) { + return '$command bir komut değil.'; + } + + @override + String get compareEmojiMatch => 'Lütfen emojileri karşılaştırın'; + + @override + String get compareNumbersMatch => 'Lütfen sayıları karşılaştırın'; + + @override + String get configureChat => 'Sohbeti yapılandır'; + + @override + String get confirm => 'Onayla'; + + @override + String get connect => 'Bağlan'; + + @override + String get contactHasBeenInvitedToTheGroup => 'Kişi gruba davet edildi'; + + @override + String get containsDisplayName => 'Görünen ad içerir'; + + @override + String get containsUserName => 'Kullanıcı adı içerir'; + + @override + String get contentHasBeenReported => + 'İçerik, sunucu yöneticilerine bildirildi'; + + @override + String get copiedToClipboard => 'Panoya kopyalandı'; + + @override + String get copy => 'Kopyala'; + + @override + String get copyToClipboard => 'Panoya kopyala'; + + @override + String couldNotDecryptMessage(String error) { + return 'Mesajın şifresi çözülemedi: $error'; + } + + @override + String countParticipants(int count) { + return '$count katılımcı'; + } + + @override + String get create => 'Oluştur'; + + @override + String createdTheChat(String username) { + return '💬 $username sohbeti oluşturdu'; + } + + @override + String get createGroup => 'Grup oluştur'; + + @override + String get createNewSpace => 'Yeni alan'; + + @override + String get currentlyActive => 'Şu anda etkin'; + + @override + String get darkTheme => 'Koyu'; + + @override + String dateAndTimeOfDay(String date, String timeOfDay) { + return '$date, $timeOfDay'; + } + + @override + String dateWithoutYear(String month, String day) { + return '$day $month'; + } + + @override + String dateWithYear(String year, String month, String day) { + return '$day/$month/$year'; + } + + @override + String get deactivateAccountWarning => + 'Bu, kullanıcı hesabınızı devre dışı bırakacak. Bu geri alınamaz! Emin misiniz?'; + + @override + String get defaultPermissionLevel => + 'Yeni kullanıcılar içi öntanımlı izin seviyesi'; + + @override + String get delete => 'Sil'; + + @override + String get deleteAccount => 'Hesabı sil'; + + @override + String get deleteMessage => 'Mesajı sil'; + + @override + String get device => 'Aygıt'; + + @override + String get deviceId => 'Aygıt kimliği'; + + @override + String get devices => 'Aygıtlar'; + + @override + String get directChats => 'Doğrudan Sohbetler'; + + @override + String get allRooms => 'Tüm Grup Sohbetleri'; + + @override + String get displaynameHasBeenChanged => 'Görünen ad değiştirildi'; + + @override + String get downloadFile => 'Dosyayı indir'; + + @override + String get edit => 'Düzenle'; + + @override + String get editBlockedServers => 'Engellenen sunucuları düzenle'; + + @override + String get chatPermissions => 'Sohbet izinleri'; + + @override + String get editDisplayname => 'Görünen adı düzenle'; + + @override + String get editRoomAliases => 'Oda takma adlarını düzenle'; + + @override + String get editRoomAvatar => 'Oda avatarını düzenle'; + + @override + String get emoteExists => 'İfade zaten var!'; + + @override + String get emoteInvalid => 'Geçersiz ifade kısa kodu!'; + + @override + String get emoteKeyboardNoRecents => + 'Son kullanılan ifadeler burada görünecek...'; + + @override + String get emotePacks => 'Oda için ifade paketleri'; + + @override + String get emoteSettings => 'İfade Ayarları'; + + @override + String get globalChatId => 'Genel sohbet kimliği'; + + @override + String get accessAndVisibility => 'Erişim ve görünürlük'; + + @override + String get accessAndVisibilityDescription => + 'Bu sohbete kimlerin katılmasına izin verilir ve sohbet nasıl keşfedilebilir.'; + + @override + String get calls => 'Aramalar'; + + @override + String get customEmojisAndStickers => 'Özel emojiler ve çıkartmalar'; + + @override + String get customEmojisAndStickersBody => + 'Herhangi bir sohbette kullanılabilecek özel emojiler veya çıkartmalar ekleyin veya paylaşın.'; + + @override + String get emoteShortcode => 'İfade kısa kodu'; + + @override + String get emoteWarnNeedToPick => + 'Bir ifade kısa kodu ve bir resim seçmeniz gerekiyor!'; + + @override + String get emptyChat => 'Boş sohbet'; + + @override + String get enableEmotesGlobally => + 'İfade paketini küresel olarak etkinleştir'; + + @override + String get enableEncryption => 'Şifrelemeyi etkinleştir'; + + @override + String get enableEncryptionWarning => + 'Artık şifrelemeyi devre dışı bırakamayacaksınız. Emin misiniz?'; + + @override + String get encrypted => 'Şifreli'; + + @override + String get encryption => 'Şifreleme'; + + @override + String get encryptionNotEnabled => 'Şifreleme etkinleştirilmedi'; + + @override + String endedTheCall(String senderName) { + return '$senderName aramayı sonlandırdı'; + } + + @override + String get enterAnEmailAddress => 'Bir e-posta adresi girin'; + + @override + String get homeserver => 'Ana sunucu'; + + @override + String get enterYourHomeserver => 'Ana sunucunuzu girin'; + + @override + String errorObtainingLocation(String error) { + return 'Konum alınırken hata oluştu: $error'; + } + + @override + String get everythingReady => 'Herşey hazır!'; + + @override + String get extremeOffensive => 'Aşırı rahatsız edici'; + + @override + String get fileName => 'Dosya adı'; + + @override + String get fluffychat => 'FluffyChat'; + + @override + String get fontSize => 'Yazı tipi boyutu'; + + @override + String get forward => 'İlet'; + + @override + String get fromJoining => 'Katılmadan'; + + @override + String get fromTheInvitation => 'Davetten'; + + @override + String get goToTheNewRoom => 'Yeni odaya git'; + + @override + String get group => 'Grup'; + + @override + String get chatDescription => 'Sohbet açıklaması'; + + @override + String get chatDescriptionHasBeenChanged => 'Sohbet açıklaması değişti'; + + @override + String get groupIsPublic => 'Grup herkese açık'; + + @override + String get groups => 'Gruplar'; + + @override + String groupWith(String displayname) { + return '$displayname ile grup'; + } + + @override + String get guestsAreForbidden => 'Misafirlere izin verilmiyor'; + + @override + String get guestsCanJoin => 'Misafirler katılabilir'; + + @override + String hasWithdrawnTheInvitationFor(String username, String targetName) { + return '$username, $targetName için daveti geri çekti'; + } + + @override + String get help => 'Yardım'; + + @override + String get hideRedactedEvents => 'Düzenlenmiş etkinlikleri gizle'; + + @override + String get hideRedactedMessages => 'Düzenlenen mesajları gizle'; + + @override + String get hideRedactedMessagesBody => + 'Birisi bir mesajı düzenlerse, bu mesaj artık sohbette görünmeyecektir.'; + + @override + String get hideInvalidOrUnknownMessageFormats => + 'Geçersiz veya bilinmeyen mesaj biçimlerini gizle'; + + @override + String get howOffensiveIsThisContent => 'Bu içerik ne kadar rahatsız edici?'; + + @override + String get id => 'Kimlik'; + + @override + String get identity => 'Kimlik'; + + @override + String get block => 'Engelle'; + + @override + String get blockedUsers => 'Engellenen kullanıcılar'; + + @override + String get blockListDescription => + 'Sizi rahatsız eden kullanıcıları engelleyebilirsiniz. Kişisel engelleme listenizdeki kullanıcılardan herhangi bir mesaj veya oda daveti alamazsınız.'; + + @override + String get blockUsername => 'Kullanıcı adını görmezden gel'; + + @override + String get iHaveClickedOnLink => 'Bağlantıya tıkladım'; + + @override + String get incorrectPassphraseOrKey => 'Yanlış parola veya kurtarma anahtarı'; + + @override + String get inoffensive => 'Rahatsız edici değil'; + + @override + String get inviteContact => 'Kişi davet et'; + + @override + String inviteContactToGroupQuestion(Object contact, Object groupName) { + return '$contact kişisini \"$groupName\" sohbetine davet etmek istiyor musunuz?'; + } + + @override + String inviteContactToGroup(String groupName) { + return 'Kişiyi $groupName grubuna davet et'; + } + + @override + String get noChatDescriptionYet => 'Daha sohbet açıklaması oluşturulmadı.'; + + @override + String get tryAgain => 'Tekrar deneyin'; + + @override + String get invalidServerName => 'Geçersiz sunucu adı'; + + @override + String get invited => 'Davet edildi'; + + @override + String get redactMessageDescription => + 'Bu mesaj bu görüşmedeki herkes için düzenlenecek. Bu işlem geri alınamaz.'; + + @override + String get optionalRedactReason => + '(İsteğe bağlı) Bu mesajı düzenleme nedeni…'; + + @override + String invitedUser(String username, String targetName) { + return '📩 $username, $targetName kişisini davet etti'; + } + + @override + String get invitedUsersOnly => 'Sadece davet edilen kullanıcılar'; + + @override + String get inviteForMe => 'Benim için davet et'; + + @override + String inviteText(String username, String link) { + return '$username sizi FluffyChat\'e davet etti.\n1. fluffychat.im adresini ziyaret edin ve uygulamayı kurun \n2. Kaydolun veya oturum açın \n3. Davet bağlantısını açın: \n $link'; + } + + @override + String get isTyping => 'yazıyor…'; + + @override + String joinedTheChat(String username) { + return '👋 $username sohbete katıldı'; + } + + @override + String get joinRoom => 'Odaya katıl'; + + @override + String kicked(String username, String targetName) { + return '👞 $username, $targetName kişisini attı'; + } + + @override + String kickedAndBanned(String username, String targetName) { + return '🙅 $username, $targetName kişisini attı ve engelledi'; + } + + @override + String get kickFromChat => 'Sohbetten at'; + + @override + String lastActiveAgo(String localizedTimeShort) { + return 'Son görülen: $localizedTimeShort'; + } + + @override + String get leave => 'Ayrıl'; + + @override + String get leftTheChat => 'Sohbetten ayrıldı'; + + @override + String get license => 'Lisans'; + + @override + String get lightTheme => 'Açık'; + + @override + String loadCountMoreParticipants(int count) { + return '$count katılımcı daha yükle'; + } + + @override + String get dehydrate => 'Oturumu dışa aktar ve aygıtı sil'; + + @override + String get dehydrateWarning => + 'Bu eylem geri alınamaz. Yedekleme dosyasını güvenli bir şekilde sakladığınızdan emin olun.'; + + @override + String get dehydrateTor => 'TOR Kullanıcıları: Oturumu dışa aktar'; + + @override + String get dehydrateTorLong => + 'TOR kullanıcıları için, pencereyi kapatmadan önce oturumu dışa aktarmaları tavsiye edilir.'; + + @override + String get hydrateTor => + 'TOR Kullanıcıları: Dışa aktarılan oturumu içe aktar'; + + @override + String get hydrateTorLong => + 'TOR\'da en son oturumunuzu dışa aktardınız mı? Hızlıca içe aktarın ve sohbete devam edin.'; + + @override + String get hydrate => 'Yedekleme dosyasından geri yükle'; + + @override + String get loadingPleaseWait => 'Yükleniyor… Lütfen bekleyin.'; + + @override + String get loadMore => 'Daha fazla yükle…'; + + @override + String get locationDisabledNotice => + 'Konum hizmetleri devre dışı. Lütfen konumunuzu paylaşabilmek için etkinleştirin.'; + + @override + String get locationPermissionDeniedNotice => + 'Konum izni reddedildi. Lütfen konumunuzu paylaşabilmek için izin verin.'; + + @override + String get login => 'Oturum aç'; + + @override + String logInTo(String homeserver) { + return '$homeserver üzerinde oturum aç'; + } + + @override + String get logout => 'Oturumu kapat'; + + @override + String get memberChanges => 'Üye değişiklikleri'; + + @override + String get mention => 'Bahset'; + + @override + String get messages => 'Mesajlar'; + + @override + String get messagesStyle => 'Mesajlar:'; + + @override + String get moderator => 'Moderatör'; + + @override + String get muteChat => 'Sohbeti sessize al'; + + @override + String get needPantalaimonWarning => + 'Uçtan uca şifreleme kullanmak için şimdilik Pantalaimon\'a ihtiyacınız olduğunu lütfen unutmayın.'; + + @override + String get newChat => 'Yeni sohbet'; + + @override + String get newMessageInFluffyChat => '💬 FluffyChat\'te yeni mesaj'; + + @override + String get newVerificationRequest => 'Yeni doğrulama isteği!'; + + @override + String get next => 'İleri'; + + @override + String get no => 'Hayır'; + + @override + String get noConnectionToTheServer => 'Sunucuyla bağlantı yok'; + + @override + String get noEmotesFound => 'İfade bulunamadı. 😕'; + + @override + String get noEncryptionForPublicRooms => + 'Şifrelemeyi yalnızca oda artık herkese açık olmadığında etkinleştirebilirsiniz.'; + + @override + String get noGoogleServicesWarning => + 'Görünüşe göre cihazınızda Firebase Cloud Messaging yok. Buna rağmen bildirim almaya devam etmek için ntfy yüklemenizi öneriyoruz. ntfy veya başka bir Unified Push sağlayıcısı ile anlık bildirimlerinizi güvenli bir şekilde alabilirsiniz. ntfy\'ı PlayStore veya F-Droid\'den indirebilirsiniz.'; + + @override + String noMatrixServer(String server1, String server2) { + return '$server1 matrix sunucusu değil, onun yerine $server2 kullanılsın mı?'; + } + + @override + String get shareInviteLink => 'Davet bağlantısını paylaş'; + + @override + String get scanQrCode => 'QR kodunu tarayın'; + + @override + String get none => 'Yok'; + + @override + String get noPasswordRecoveryDescription => + 'Henüz parolanızı kurtarmak için bir yol eklemediniz.'; + + @override + String get noPermission => 'İzin yok'; + + @override + String get noRoomsFound => 'Oda bulunamadı…'; + + @override + String get notifications => 'Bildirimler'; + + @override + String get notificationsEnabledForThisAccount => + 'Bu hesap için bildirimler etkinleştirildi'; + + @override + String numUsersTyping(int count) { + return '$count kullanıcı yazıyor…'; + } + + @override + String get obtainingLocation => 'Konum alınıyor…'; + + @override + String get offensive => 'Rahatsız edici'; + + @override + String get offline => 'Çevrim dışı'; + + @override + String get ok => 'Tamam'; + + @override + String get online => 'Çevrim içi'; + + @override + String get onlineKeyBackupEnabled => + 'Çevrim içi anahtar yedekleme etkinleştirildi'; + + @override + String get oopsPushError => + 'Tüh! Maalesef anlık bildirimlerini ayarlarken bir hata oluştu.'; + + @override + String get oopsSomethingWentWrong => 'Tüh, bir şeyler yanlış gitti…'; + + @override + String get openAppToReadMessages => 'Mesajları okumak için uygulamayı aç'; + + @override + String get openCamera => 'Kamerayı aç'; + + @override + String get openVideoCamera => 'Bir video için kamerayı aç'; + + @override + String get oneClientLoggedOut => + 'İstemcilerinizden birinin oturumu kapatıldı'; + + @override + String get addAccount => 'Hesap ekle'; + + @override + String get editBundlesForAccount => 'Bu hesap için paketleri düzenle'; + + @override + String get addToBundle => 'Pakete ekle'; + + @override + String get removeFromBundle => 'Bu paketten kaldır'; + + @override + String get bundleName => 'Paket adı'; + + @override + String get enableMultiAccounts => + '(BETA) Bu aygıtta çoklu hesapları etkinleştir'; + + @override + String get openInMaps => 'Haritalarda aç'; + + @override + String get link => 'Bağlantı'; + + @override + String get serverRequiresEmail => + 'Bu sunucunun kayıt için e-posta adresinizi doğrulaması gerekiyor.'; + + @override + String get or => 'Veya'; + + @override + String get participant => 'Katılımcı'; + + @override + String get passphraseOrKey => 'parola veya kurtarma anahtarı'; + + @override + String get password => 'Parola'; + + @override + String get passwordForgotten => 'Parola unutuldu'; + + @override + String get passwordHasBeenChanged => 'Parola değiştirildi'; + + @override + String get hideMemberChangesInPublicChats => + 'Herkese açık sohbetlerde üye değişikliklerini gizle'; + + @override + String get hideMemberChangesInPublicChatsBody => + 'Okunabilirliği artırmak için birisi herkese açık bir sohbete katıldığında veya sohbetten ayrıldığında sohbet zaman çizelgesinde gösterme.'; + + @override + String get overview => 'Genel görünüm'; + + @override + String get notifyMeFor => 'Beni bilgilendir'; + + @override + String get passwordRecoverySettings => 'Parola kurtarma ayarları'; + + @override + String get passwordRecovery => 'Parola kurtarma'; + + @override + String get people => 'İnsanlar'; + + @override + String get pickImage => 'Bir resim seç'; + + @override + String get pin => 'Sabitle'; + + @override + String play(String fileName) { + return '$fileName dosyasını oynat'; + } + + @override + String get pleaseChoose => 'Lütfen seçin'; + + @override + String get pleaseChooseAPasscode => 'Lütfen bir geçiş kodu seçin'; + + @override + String get pleaseClickOnLink => + 'Lütfen e-postadaki bağlantıya tıklayın ve devam edin.'; + + @override + String get pleaseEnter4Digits => + 'Lütfen 4 basamak girin veya uygulama kilidini devre dışı bırakmak için boş bırakın.'; + + @override + String get pleaseEnterRecoveryKey => 'Lütfen kurtarma anahtarınızı girin:'; + + @override + String get pleaseEnterYourPassword => 'Lütfen parolanızı girin'; + + @override + String get pleaseEnterYourPin => 'Lütfen PIN kodunuzu girin'; + + @override + String get pleaseEnterYourUsername => 'Lütfen kullanıcı adınızı girin'; + + @override + String get pleaseFollowInstructionsOnWeb => + 'Lütfen web sitesindeki talimatları izleyin ve \"İleri\" düğmesine dokunun.'; + + @override + String get privacy => 'Gizlilik'; + + @override + String get publicRooms => 'Herkese Açık Odalar'; + + @override + String get pushRules => 'Gönderme kuralları'; + + @override + String get reason => 'Neden'; + + @override + String get recording => 'Kaydediliyor'; + + @override + String redactedBy(String username) { + return '$username tarafından düzenlendi'; + } + + @override + String get directChat => 'Doğrudan sohbet'; + + @override + String redactedByBecause(String username, String reason) { + return '$username tarafından \"$reason\" nedeniyle düzenlendi'; + } + + @override + String redactedAnEvent(String username) { + return '$username bir etkinliği düzenledi'; + } + + @override + String get redactMessage => 'Mesajı düzenle'; + + @override + String get register => 'Kaydol'; + + @override + String get reject => 'Reddet'; + + @override + String rejectedTheInvitation(String username) { + return '$username daveti reddetti'; + } + + @override + String get rejoin => 'Yeniden katıl'; + + @override + String get removeAllOtherDevices => 'Diğer tüm aygıtları kaldır'; + + @override + String removedBy(String username) { + return '$username tarafından kaldırıldı'; + } + + @override + String get removeDevice => 'Aygıtı kaldır'; + + @override + String get unbanFromChat => 'Sohbet engelini kaldır'; + + @override + String get removeYourAvatar => 'Avatarınızı kaldırın'; + + @override + String get replaceRoomWithNewerVersion => 'Odayı yeni sürümle değiştir'; + + @override + String get reply => 'Yanıtla'; + + @override + String get reportMessage => 'Mesajı bildir'; + + @override + String get translateMessage => 'Translate message'; + + @override + String get translatedMessage => 'Translated message'; + + @override + String get errorTranslatingMessage => + 'An error has occured while translating the message.'; + + @override + String get recoverMessage => 'Recover message'; + + @override + String get recoveredMessage => 'Recovered message'; + + @override + String get errorRecoveringMessage => + 'An error has occured while recovering the message.'; + + @override + String get errorRecoveringMessageNoAdmin => + 'This feature is available on Synapse homeservers only for adminstrators.'; + + @override + String get requestPermission => 'İzin iste'; + + @override + String get roomHasBeenUpgraded => 'Oda yükseltildi'; + + @override + String get roomVersion => 'Oda sürümü'; + + @override + String get saveFile => 'Dosyayı kaydet'; + + @override + String get retry => 'Retry'; + + @override + String get search => 'Ara'; + + @override + String get security => 'Güvenlik'; + + @override + String get recoveryKey => 'Kurtarma anahtarı'; + + @override + String get recoveryKeyLost => 'Kurtarma anahtarı kayıp mı?'; + + @override + String seenByUser(String username) { + return '$username tarafından görüldü'; + } + + @override + String get send => 'Gönder'; + + @override + String get sendAMessage => 'Bir mesaj gönder'; + + @override + String get sendAsText => 'Metin olarak gönder'; + + @override + String get sendAudio => 'Ses gönder'; + + @override + String get sendFile => 'Dosya gönder'; + + @override + String get sendImage => 'Resim gönder'; + + @override + String sendImages(int count) { + return '$count görsel gönder'; + } + + @override + String get sendMessages => 'Mesajları gönder'; + + @override + String get sendOriginal => 'Orijinali gönder'; + + @override + String get sendSticker => 'Çıkartma gönder'; + + @override + String get sendVideo => 'Video gönder'; + + @override + String sentAFile(String username) { + return '📁 $username bir dosya gönderdi'; + } + + @override + String sentAnAudio(String username) { + return '🎤 $username bir ses gönderdi'; + } + + @override + String sentAPicture(String username) { + return '🖼️ $username bir resim gönderdi'; + } + + @override + String sentASticker(String username) { + return '😊 $username bir çıkartma gönderdi'; + } + + @override + String sentAVideo(String username) { + return '🎥 $username bir video gönderdi'; + } + + @override + String sentCallInformations(String senderName) { + return '$senderName arama bilgilerini gönderdi'; + } + + @override + String get separateChatTypes => 'Doğrudan Sohbetleri ve Grupları Ayır'; + + @override + String get setAsCanonicalAlias => 'Ana takma ad olarak ayarla'; + + @override + String get setCustomEmotes => 'Özel ifadeler ayarla'; + + @override + String get setChatDescription => 'Sohbet açıklamasını ayarla'; + + @override + String get setInvitationLink => 'Davet bağlantısı ayarla'; + + @override + String get setPermissionsLevel => 'İzin seviyesini ayarla'; + + @override + String get setStatus => 'Durumu ayarla'; + + @override + String get settings => 'Ayarlar'; + + @override + String get share => 'Paylaş'; + + @override + String sharedTheLocation(String username) { + return '$username konumunu paylaştı'; + } + + @override + String get shareLocation => 'Konumu paylaş'; + + @override + String get showPassword => 'Parolayı göster'; + + @override + String get presenceStyle => 'Bulunma:'; + + @override + String get hideAvatarsInInvites => 'Hide avatars in invites'; + + @override + String get hideAvatarsInInvitesDescription => + 'Do not show room avatars in invites'; + + @override + String get presencesToggle => 'Diğer kullanıcıların durum mesajlarını göster'; + + @override + String get pureBlackToggle => 'Pure Black'; + + @override + String get singlesignon => 'Tek oturum açma'; + + @override + String get skip => 'Atla'; + + @override + String get sourceCode => 'Kaynak kodları'; + + @override + String get spaceIsPublic => 'Alan herkese açık'; + + @override + String get spaceName => 'Alan adı'; + + @override + String startedACall(String senderName) { + return '$senderName bir arama başlattı'; + } + + @override + String get startFirstChat => 'İlk sohbetinizi başlatın'; + + @override + String get status => 'Durum'; + + @override + String get statusExampleMessage => 'Bugün nasılsınız?'; + + @override + String get submit => 'Gönder'; + + @override + String get synchronizingPleaseWait => 'Eşzamanlanıyor… Lütfen bekleyin.'; + + @override + String synchronizingPleaseWaitCounter(String percentage) { + return ' Synchronizing… ($percentage%)'; + } + + @override + String get systemTheme => 'Sistem'; + + @override + String get theyDontMatch => 'Eşleşmediler'; + + @override + String get theyMatch => 'Eşleştiler'; + + @override + String get title => 'FluffyChat'; + + @override + String get toggleFavorite => 'Sık Kullanılanlara Ekle/Çıkar'; + + @override + String get toggleMuted => 'Sessize Al/Sessizden Çıkar'; + + @override + String get toggleUnread => 'Okundu/Okunmadı Olarak İşaretle'; + + @override + String get tooManyRequestsWarning => + 'Çok fazla istek. Lütfen daha sonra tekrar deneyin!'; + + @override + String get transferFromAnotherDevice => 'Başka bir aygıttan aktar'; + + @override + String get tryToSendAgain => 'Tekrar göndermeyi deneyin'; + + @override + String get unavailable => 'Yok'; + + @override + String unbannedUser(String username, String targetName) { + return '$username, $targetName kişisinin engelini kaldırdı'; + } + + @override + String get unblockDevice => 'Aygıtın Engellemesini Kaldır'; + + @override + String get unknownDevice => 'Bilinmeyen aygıt'; + + @override + String get unknownEncryptionAlgorithm => 'Bilinmeyen şifreleme algoritması'; + + @override + String unknownEvent(String type) { + return 'Bilinmeyen etkinlik \'$type\''; + } + + @override + String get unmuteChat => 'Sohbeti sessizden çıkar'; + + @override + String get unpin => 'Sabitlemeyi kaldır'; + + @override + String unreadChats(int unreadCount) { + String _temp0 = intl.Intl.pluralLogic( + unreadCount, + locale: localeName, + other: '$unreadCount okunmamış sohbet', + one: '1 okunmamış sohbet', + ); + return '$_temp0'; + } + + @override + String userAndOthersAreTyping(String username, int count) { + return '$username ve $count diğer kişi yazıyor…'; + } + + @override + String userAndUserAreTyping(String username, String username2) { + return '$username ve $username2 yazıyor…'; + } + + @override + String userIsTyping(String username) { + return '$username yazıyor…'; + } + + @override + String userLeftTheChat(String username) { + return '🚪 $username sohbetten ayrıldı'; + } + + @override + String get username => 'Kullanıcı adı'; + + @override + String userSentUnknownEvent(String username, String type) { + return '$username bir $type etkinliği gönderdi'; + } + + @override + String get unverified => 'Doğrulanmadı'; + + @override + String get verified => 'Doğrulandı'; + + @override + String get verify => 'Doğrula'; + + @override + String get verifyStart => 'Doğrulamayı Başlat'; + + @override + String get verifySuccess => 'Başarıyla doğrulandı!'; + + @override + String get verifyTitle => 'Diğer hesap doğrulanıyor'; + + @override + String get videoCall => 'Görüntülü arama'; + + @override + String get visibilityOfTheChatHistory => 'Sohbet geçmişi görünürlüğü'; + + @override + String get visibleForAllParticipants => 'Tüm katılımcılar için görünür'; + + @override + String get visibleForEveryone => 'Herkes için görünür'; + + @override + String get voiceMessage => 'Sesli mesaj'; + + @override + String get waitingPartnerAcceptRequest => + 'Ortağın isteği kabul etmesi bekleniyor…'; + + @override + String get waitingPartnerEmoji => 'Ortağın emojiyi kabul etmesi bekleniyor…'; + + @override + String get waitingPartnerNumbers => + 'Ortağın numaraları kabul etmesi bekleniyor…'; + + @override + String get wallpaper => 'Duvar kağıdı:'; + + @override + String get warning => 'Uyarı!'; + + @override + String get weSentYouAnEmail => 'Size bir e-posta gönderdik'; + + @override + String get whoCanPerformWhichAction => 'Kim hangi eylemi gerçekleştirebilir'; + + @override + String get whoIsAllowedToJoinThisGroup => 'Bu gruba kimler katılabilir'; + + @override + String get whyDoYouWantToReportThis => 'Bunu neden bildirmek istiyorsunuz?'; + + @override + String get wipeChatBackup => + 'Yeni bir kurtarma anahtarı oluşturmak için sohbet yedeğiniz silinsin mi?'; + + @override + String get withTheseAddressesRecoveryDescription => + 'Bu adresler ile parolanızı kurtarabilirsiniz.'; + + @override + String get writeAMessage => 'Bir mesaj yaz…'; + + @override + String get yes => 'Evet'; + + @override + String get you => 'Sen'; + + @override + String get youAreNoLongerParticipatingInThisChat => + 'Artık bu sohbette katılımcı değilsiniz'; + + @override + String get youHaveBeenBannedFromThisChat => 'Bu sohbetten engellendiniz'; + + @override + String get yourPublicKey => 'Ortak anahtarınız'; + + @override + String get messageInfo => 'Mesaj bilgileri'; + + @override + String get time => 'Zaman'; + + @override + String get messageType => 'Mesaj Türü'; + + @override + String get sender => 'Gönderen'; + + @override + String get openGallery => 'Galeriyi aç'; + + @override + String get removeFromSpace => 'Alandan kaldır'; + + @override + String get addToSpaceDescription => 'Bu sohbeti eklemek için bir alan seçin.'; + + @override + String get start => 'Başla'; + + @override + String get pleaseEnterRecoveryKeyDescription => + 'Eski mesajlarınızın kilidini açmak için lütfen önceki bir oturumda oluşturulan kurtarma anahtarınızı girin. Kurtarma anahtarınız parolanız DEĞİLDİR.'; + + @override + String get publish => 'Yayınla'; + + @override + String videoWithSize(String size) { + return 'Video ($size)'; + } + + @override + String get openChat => 'Sohbeti Aç'; + + @override + String get markAsRead => 'Okundu olarak işaretle'; + + @override + String get reportUser => 'Kullanıcıyı bildir'; + + @override + String get dismiss => 'Kapat'; + + @override + String reactedWith(String sender, String reaction) { + return '$sender, $reaction ile tepki verdi'; + } + + @override + String get pinMessage => 'Odaya sabitle'; + + @override + String get confirmEventUnpin => + 'Etkinliğin sabitlemesini kalıcı olarak kaldırmak istediğinizden emin misiniz?'; + + @override + String get emojis => 'Emojiler'; + + @override + String get placeCall => 'Arama yap'; + + @override + String get voiceCall => 'Sesli arama'; + + @override + String get unsupportedAndroidVersion => 'Desteklenmeyen Android sürümü'; + + @override + String get unsupportedAndroidVersionLong => + 'Bu özellik daha yeni bir Android sürümü gerektiriyor. Lütfen güncellemelere veya LineageOS desteğine bakın.'; + + @override + String get videoCallsBetaWarning => + 'Görüntülü aramaların şu anda beta aşamasında olduğunu lütfen unutmayın. Tüm platformlarda beklendiği gibi veya hiç çalışmayabilirler.'; + + @override + String get experimentalVideoCalls => 'Deneysel görüntülü aramalar'; + + @override + String get emailOrUsername => 'E-posta veya kullanıcı adı'; + + @override + String get indexedDbErrorTitle => 'Gizli mod sorunları'; + + @override + String get indexedDbErrorLong => + 'Mesaj saklama özelliği ne yazık ki öntanımlı olarak gizli modda etkin değildir.\nLütfen\n - about:config sayfasına gidin ve\n - dom.indexedDB.privateBrowsing.enabled seçeneğini true olarak ayarlayın\nAksi takdirde FluffyChat çalıştırılamaz.'; + + @override + String switchToAccount(String number) { + return '$number. hesaba geç'; + } + + @override + String get nextAccount => 'Sonraki hesap'; + + @override + String get previousAccount => 'Önceki hesap'; + + @override + String get addWidget => 'Widget ekle'; + + @override + String get widgetVideo => 'Video'; + + @override + String get widgetEtherpad => 'Metin notu'; + + @override + String get widgetJitsi => 'Jitsi Meet'; + + @override + String get widgetCustom => 'Özel'; + + @override + String get widgetName => 'Ad'; + + @override + String get widgetUrlError => 'Bu geçerli bir URL değil.'; + + @override + String get widgetNameError => 'Lütfen görünecek bir ad girin.'; + + @override + String get errorAddingWidget => 'Widget eklenirken hata oluştu.'; + + @override + String get youRejectedTheInvitation => 'Daveti reddettiniz'; + + @override + String get youJoinedTheChat => 'Sohbete katıldınız'; + + @override + String get youAcceptedTheInvitation => '👍 Daveti kabul ettiniz'; + + @override + String youBannedUser(String user) { + return '$user kullanıcısını yasakladınız'; + } + + @override + String youHaveWithdrawnTheInvitationFor(String user) { + return '$user için daveti geri çektiniz'; + } + + @override + String youInvitedToBy(String alias) { + return '📩 Bağlantı aracılığıyla davet edildiniz:\n$alias'; + } + + @override + String youInvitedBy(String user) { + return '📩 $user tarafından davet edildiniz'; + } + + @override + String invitedBy(String user) { + return '📩 $user davet etti'; + } + + @override + String youInvitedUser(String user) { + return '📩 $user kullanıcısını davet ettiniz'; + } + + @override + String youKicked(String user) { + return '👞 $user kullanıcısını attınız'; + } + + @override + String youKickedAndBanned(String user) { + return '🙅 $user kullanıcısını attınız ve yasakladınız'; + } + + @override + String youUnbannedUser(String user) { + return '$user kullanıcısının yasağını kaldırdınız'; + } + + @override + String hasKnocked(String user) { + return '🚪 $user tıklattı'; + } + + @override + String get usersMustKnock => 'Kullanıcılar tıklatmalı'; + + @override + String get noOneCanJoin => 'Kimse katılamaz'; + + @override + String userWouldLikeToChangeTheChat(String user) { + return '$user sohbete katılmak istiyor.'; + } + + @override + String get noPublicLinkHasBeenCreatedYet => + 'Henüz herkese açık bir bağlantı oluşturulmadı'; + + @override + String get knock => 'Tıklat'; + + @override + String get users => 'Kullanıcılar'; + + @override + String get unlockOldMessages => 'Eski mesajların kilidini aç'; + + @override + String get storeInSecureStorageDescription => + 'Kurtarma anahtarını bu aygıtın güvenli deposunda saklayın.'; + + @override + String get saveKeyManuallyDescription => + 'Sistem paylaşımı iletişim kutusunu veya panoyu tetikleyerek bu anahtarı elle kaydedin.'; + + @override + String get storeInAndroidKeystore => 'Android KeyStore\'da sakla'; + + @override + String get storeInAppleKeyChain => 'Apple KeyChain\'de sakla'; + + @override + String get storeSecurlyOnThisDevice => 'Bu aygıtta güvenli bir şekilde sakla'; + + @override + String countFiles(int count) { + return '$count dosya'; + } + + @override + String get user => 'Kullanıcı'; + + @override + String get custom => 'Özel'; + + @override + String get foregroundServiceRunning => + 'Bu bildirim, ön plan hizmeti çalışırken görünür.'; + + @override + String get screenSharingTitle => 'ekran paylaşımı'; + + @override + String get screenSharingDetail => 'Ekranınızı FuffyChat\'te paylaşıyorsunuz'; + + @override + String get callingPermissions => 'Arama izinleri'; + + @override + String get callingAccount => 'Arama hesabı'; + + @override + String get callingAccountDetails => + 'FluffyChat\'in yerel android telefon uygulamasını kullanmasına izin verir.'; + + @override + String get appearOnTop => 'Üstte görün'; + + @override + String get appearOnTopDetails => + 'Uygulamanın üstte görünmesine izin verir (Fluffychat\'ı zaten bir arama hesabı olarak ayarladıysanız gerekli değildir)'; + + @override + String get otherCallingPermissions => + 'Mikrofon, kamera ve diğer FluffyChat izinleri'; + + @override + String get whyIsThisMessageEncrypted => 'Bu mesaj neden okunamıyor?'; + + @override + String get noKeyForThisMessage => + 'Bu durum, mesaj siz bu aygıtta hesabınızda oturum açmadan önce gönderildiyse meydana gelebilir.\n\nGönderenin aygıtınızı engellemiş olması veya internet bağlantısında bir sorun olması da mümkündür.\n\nMesajı başka bir oturumda okuyabiliyor musunuz? O zaman mesajı oradan aktarabilirsiniz! Ayarlar > Aygıtlar bölümüne gidin ve aygıtlarınızın birbirini doğruladığından emin olun. Odayı bir sonraki sefer açtığınızda ve her iki oturum da ön planda olduğunda, anahtarlar otomatik olarak iletilecektir.\n\nOturumu kapatırken veya aygıt değiştirirken anahtarları kaybetmek istemiyor musunuz? Ayarlarda sohbet yedeklemesini etkinleştirdiğinizden emin olun.'; + + @override + String get newGroup => 'Yeni grup'; + + @override + String get newSpace => 'Yeni alan'; + + @override + String get enterSpace => 'Alana gir'; + + @override + String get enterRoom => 'Odaya gir'; + + @override + String get allSpaces => 'Tüm alanlar'; + + @override + String numChats(String number) { + return '$number sohbet'; + } + + @override + String get hideUnimportantStateEvents => 'Önemsiz durum etkinliklerini gizle'; + + @override + String get hidePresences => 'Durum listesi gizlensin mi?'; + + @override + String get doNotShowAgain => 'Tekrar gösterme'; + + @override + String wasDirectChatDisplayName(String oldDisplayName) { + return 'Boş sohbet ($oldDisplayName idi)'; + } + + @override + String get newSpaceDescription => + 'Alanlar, sohbetlerinizi birleştirmenize ve özel veya genel topluluklar oluşturmanıza olanak tanır.'; + + @override + String get encryptThisChat => 'Bu sohbeti şifrele'; + + @override + String get disableEncryptionWarning => + 'Güvenlik nedeniyle, daha önce etkinleştirildiği bir sohbette şifrelemeyi devre dışı bırakamazsınız.'; + + @override + String get sorryThatsNotPossible => 'Üzgünüm... bu mümkün değil'; + + @override + String get deviceKeys => 'Aygıt anahtarları:'; + + @override + String get reopenChat => 'Sohbeti yeniden aç'; + + @override + String get noBackupWarning => + 'Uyarı! Sohbet yedeklemesini etkinleştirmezseniz, şifrelenen mesajlarınıza erişiminizi kaybedersiniz. Oturumu kapatmadan önce sohbet yedeklemesini etkinleştirmeniz önemle tavsiye edilir.'; + + @override + String get noOtherDevicesFound => 'Başka aygıt bulunamadı'; + + @override + String fileIsTooBigForServer(String max) { + return 'Gönderilemiyor! Sunucu yalnızca $max değerine kadar olan ekleri destekliyor.'; + } + + @override + String fileHasBeenSavedAt(String path) { + return 'Dosya $path konumuna kaydedildi'; + } + + @override + String get jumpToLastReadMessage => 'Son okunan mesaja atla'; + + @override + String get readUpToHere => 'Buraya kadar oku'; + + @override + String get jump => 'Atla'; + + @override + String get openLinkInBrowser => 'Bağlantıyı tarayıcıda aç'; + + @override + String get reportErrorDescription => + '😭 Olamaz. Bir şeyler yanlış gitti. İsterseniz bu hatayı geliştiricilere bildirebilirsiniz.'; + + @override + String get report => 'bildir'; + + @override + String get signInWithPassword => 'Parola ile oturum aç'; + + @override + String get pleaseTryAgainLaterOrChooseDifferentServer => + 'Lütfen daha sonra tekrar deneyin veya farklı bir sunucu seçin.'; + + @override + String signInWith(String provider) { + return '$provider ile oturum aç'; + } + + @override + String get profileNotFound => + 'Kullanıcı sunucuda bulunamadı. Belki bir bağlantı sorunu vardır veya kullanıcı mevcut değildir.'; + + @override + String get setTheme => 'Temayı ayarla:'; + + @override + String get setColorTheme => 'Renk temasını ayarla:'; + + @override + String get invite => 'Davet et'; + + @override + String get inviteGroupChat => '📨 Grup sohbetine davet et'; + + @override + String get invitePrivateChat => '📨 Gizli sohbete davet et'; + + @override + String get invalidInput => 'Geçersiz giriş!'; + + @override + String wrongPinEntered(int seconds) { + return 'Yanlış PIN girildi! $seconds saniye sonra tekrar deneyin...'; + } + + @override + String get pleaseEnterANumber => 'Lütfen 0\'dan büyük bir sayı girin'; + + @override + String get archiveRoomDescription => + 'Sohbet arşive taşınacak. Diğer kullanıcıları sohbeti terk ettiğinizi görebilecek.'; + + @override + String get roomUpgradeDescription => + 'Sohbet daha sonra yeni oda sürümüyle yeniden oluşturulacaktır. Tüm katılımcılara yeni sohbete geçmeleri gerektiği bildirilecektir. Oda sürümleri hakkında daha fazla bilgiyi https://spec.matrix.org/latest/rooms/ adresinde bulabilirsiniz.'; + + @override + String get removeDevicesDescription => + 'Bu aygıttan çıkış yapacaksınız ve artık mesaj alamayacaksınız.'; + + @override + String get banUserDescription => + 'Kullanıcı sohbetten yasaklanacak ve yasağı kaldırılana kadar sohbete tekrar giremeyecek.'; + + @override + String get unbanUserDescription => + 'Kullanıcı denerse sohbete tekrar girebilecektir.'; + + @override + String get kickUserDescription => + 'Kullanıcı sohbetten atılır ancak yasaklanmaz. Herkese açık sohbetlerde kullanıcı istediği zaman yeniden katılabilir.'; + + @override + String get makeAdminDescription => + 'Bu kullanıcıyı yönetici yaptıktan sonra, sizinle aynı izinlere sahip olacağı için bunu geri alamayabilirsiniz.'; + + @override + String get pushNotificationsNotAvailable => + 'Anlık bildirimler kullanılamıyor'; + + @override + String get learnMore => 'Daha fazla bilgi'; + + @override + String get yourGlobalUserIdIs => 'Genel kullanıcı kimliğiniz: '; + + @override + String noUsersFoundWithQuery(String query) { + return 'Ne yazık ki \"$query\" ile kullanıcı bulunamadı. Lütfen bir yazım hatası yapıp yapmadığınızı kontrol edin.'; + } + + @override + String get knocking => 'Tıklat'; + + @override + String chatCanBeDiscoveredViaSearchOnServer(String server) { + return 'Sohbet $server üzerinde aranarak keşfedilebilir'; + } + + @override + String get searchChatsRooms => + '#sohbetler, @kullanıcılar... için arama yapın'; + + @override + String get nothingFound => 'Hiçbir şey bulunamadı...'; + + @override + String get groupName => 'Grup ismi'; + + @override + String get createGroupAndInviteUsers => + 'Bir grup oluşturun ve kullanıcıları davet edin'; + + @override + String get groupCanBeFoundViaSearch => 'Grup, arama ile bulunabilir'; + + @override + String get wrongRecoveryKey => + 'Üzgünüm... bu doğru kurtarma anahtarı gibi görünmüyor.'; + + @override + String get startConversation => 'Görüşme başlat'; + + @override + String get commandHint_sendraw => 'Ham JSON gönder'; + + @override + String get databaseMigrationTitle => 'Veri tabanı iyileştirildi'; + + @override + String get databaseMigrationBody => + 'Lütfen bekleyin. Bu biraz zaman alabilir.'; + + @override + String get leaveEmptyToClearStatus => + 'Durumunuzu temizlemek için boş bırakın.'; + + @override + String get select => 'Seç'; + + @override + String get searchForUsers => '@kullanıcıları ara...'; + + @override + String get pleaseEnterYourCurrentPassword => + 'Lütfen geçerli parolanızı girin'; + + @override + String get newPassword => 'Yeni parola'; + + @override + String get pleaseChooseAStrongPassword => 'Lütfen güçlü bir parola seçin'; + + @override + String get passwordsDoNotMatch => 'Parolalar eşleşmiyor'; + + @override + String get passwordIsWrong => 'Girdiğiniz parola yanlış'; + + @override + String get publicLink => 'Herkese açık bağlantı'; + + @override + String get publicChatAddresses => 'Herkese açık sohbet adresleri'; + + @override + String get createNewAddress => 'Yeni adres oluştur'; + + @override + String get joinSpace => 'Alana katıl'; + + @override + String get publicSpaces => 'Herkese açık alanlar'; + + @override + String get addChatOrSubSpace => 'Sohbet veya alt alan ekle'; + + @override + String get subspace => 'Alt alan'; + + @override + String get decline => 'Reddet'; + + @override + String get thisDevice => 'Bu aygıt:'; + + @override + String get initAppError => 'Uygulama başlatılırken bir hata oluştu'; + + @override + String get userRole => 'Kullanıcı rolü'; + + @override + String minimumPowerLevel(String level) { + return '$level en düşük güç seviyesidir.'; + } + + @override + String searchIn(String chat) { + return '\"$chat\" sohbeti içinde ara...'; + } + + @override + String get searchMore => 'Daha fazla ara...'; + + @override + String get gallery => 'Galeri'; + + @override + String get files => 'Dosyalar'; + + @override + String databaseBuildErrorBody(String url, String error) { + return 'SQlite veri tabanı oluşturulamadı. Uygulama şimdilik eski veri tabanını kullanmaya çalışıyor. Lütfen bu hatayı $url adresinde geliştiricilere bildirin. Hata mesajı: $error'; + } + + @override + String sessionLostBody(String url, String error) { + return 'Oturumunuz kayboldu. Lütfen bu hatayı $url adresinde geliştiricilere bildirin. Hata mesajı: $error'; + } + + @override + String restoreSessionBody(String url, String error) { + return 'Uygulama şimdi oturumunuzu yedekten geri yüklemeye çalışıyor. Lütfen bu hatayı $url adresinde geliştiricilere bildirin. Hata mesajı: $error'; + } + + @override + String forwardMessageTo(String roomName) { + return 'Mesajlar $roomName kişisine iletilsin mi?'; + } + + @override + String get sendReadReceipts => 'Okundu bilgisi gönder'; + + @override + String get sendTypingNotificationsDescription => + 'Sohbetteki diğer katılımcılar yeni bir mesaj yazdığınızı görebilir.'; + + @override + String get sendReadReceiptsDescription => + 'Sohbetteki diğer katılımcılar bir mesajı okuduğunuzu görebilir.'; + + @override + String get formattedMessages => 'Biçimlendirilen mesajlar'; + + @override + String get formattedMessagesDescription => + 'Markdown kullanarak kalın metin gibi zengin mesaj içeriğini görüntüle.'; + + @override + String get verifyOtherUser => '🔐 Diğer kullanıcıyı doğrula'; + + @override + String get verifyOtherUserDescription => + 'Başka bir kullanıcıyı doğrularsanız, gerçekten kime yazdığınızı bildiğinizden emin olabilirsiniz. 💪\n\nBir doğrulama başlattığınızda, siz ve diğer kullanıcı uygulamada bir açılır pencere görecektir. Orada birbirinizle karşılaştırmanız gereken bir dizi emoji veya sayı göreceksiniz.\n\nBunu yapmanın en iyi yolu buluşmak veya bir görüntülü arama başlatmaktır. 👭'; + + @override + String get verifyOtherDevice => '🔐 Diğer aygıtı doğrula'; + + @override + String get verifyOtherDeviceDescription => + 'Başka bir aygıtı doğruladığınızda, bu aygıtlar anahtarları değiş tokuş ederek genel güvenliğinizi artırır. 💪 Bir doğrulama başlattığınızda, her iki aygıttaki uygulamada bir açılır pencere görünecektir. Orada birbirleriyle karşılaştırmanız gereken bir dizi emoji veya sayı göreceksiniz. Doğrulamaya başlamadan önce her iki aygıtın da elinizin altında olması en iyisidir. 🤳'; + + @override + String acceptedKeyVerification(String sender) { + return '$sender anahtar doğrulamayı kabul etti'; + } + + @override + String canceledKeyVerification(String sender) { + return '$sender anahtar doğrulamayı iptal etti'; + } + + @override + String completedKeyVerification(String sender) { + return '$sender anahtar doğrulamayı tamamladı'; + } + + @override + String isReadyForKeyVerification(String sender) { + return '$sender anahtar doğrulama için hazır'; + } + + @override + String requestedKeyVerification(String sender) { + return '$sender anahtar doğrulama istedi'; + } + + @override + String startedKeyVerification(String sender) { + return '$sender anahtar doğrulama başlattı'; + } + + @override + String get transparent => 'Şeffaf'; + + @override + String get incomingMessages => 'Gelen mesajlar'; + + @override + String get stickers => 'Çıkartmalar'; + + @override + String get discover => 'Keşfet'; + + @override + String get commandHint_ignore => 'Verilen matrix kimliğini görmezden gel'; + + @override + String get commandHint_unignore => + 'Verilen matrix kimliğini görmezden gelmeyi iptal et'; + + @override + String unreadChatsInApp(String appname, String unread) { + return '$appname: $unread okunmayan sohbet'; + } + + @override + String get noDatabaseEncryption => + 'Veri tabanı şifrelemesi bu platformda desteklenmiyor'; + + @override + String thereAreCountUsersBlocked(Object count) { + return 'Şu anda $count engellenen kullanıcı var.'; + } + + @override + String get restricted => 'Kısıtlı'; + + @override + String get knockRestricted => 'Tıklatma kısıtlı'; + + @override + String goToSpace(Object space) { + return 'Alana git: $space'; + } + + @override + String get markAsUnread => 'Okunmadı olarak işaretle'; + + @override + String userLevel(int level) { + return '$level - Kullanıcı'; + } + + @override + String moderatorLevel(int level) { + return '$level - Moderatör'; + } + + @override + String adminLevel(int level) { + return '$level - Yönetici'; + } + + @override + String get changeGeneralChatSettings => 'Genel sohbet ayarlarını değiştir'; + + @override + String get inviteOtherUsers => 'Diğer kullanıcıları bu sohbete davet et'; + + @override + String get changeTheChatPermissions => 'Sohbet izinlerini değiştir'; + + @override + String get changeTheVisibilityOfChatHistory => + 'Sohbet geçmişinin görünürlüğünü değiştir'; + + @override + String get changeTheCanonicalRoomAlias => + 'Ana herkese açık sohbet adresini değiştir'; + + @override + String get sendRoomNotifications => '@oda bildirimleri gönder'; + + @override + String get changeTheDescriptionOfTheGroup => 'Sohbetin açıklamasını değiştir'; + + @override + String get chatPermissionsDescription => + 'Bu sohbette belirli eylemler için hangi güç düzeyinin gerekli olduğunu tanımlayın. 0, 50 ve 100 güç düzeyleri genellikle kullanıcıları, moderatörleri ve yöneticileri temsil eder, ancak herhangi bir derecelendirme mümkündür.'; + + @override + String updateInstalled(String version) { + return '🎉 Güncelleme $version kuruldu!'; + } + + @override + String get changelog => 'Değişiklik günlüğü'; + + @override + String get sendCanceled => 'Gönderme iptal edildi'; + + @override + String get loginWithMatrixId => 'Matrix kimliği ile oturum aç'; + + @override + String get discoverHomeservers => 'Ana sunucuları keşfet'; + + @override + String get whatIsAHomeserver => 'Ana sunucu nedir?'; + + @override + String get homeserverDescription => + 'Tüm verileriniz tıpkı bir e-posta sağlayıcısı gibi ana sunucuda saklanır. Hangi ana sunucuyu kullanmak istediğinizi seçebilir ve herkesle iletişim kurmaya devam edebilirsiniz. https://matrix.org adresinden daha fazla bilgi edinin.'; + + @override + String get doesNotSeemToBeAValidHomeserver => + 'Uyumlu bir ana sunucu gibi görünmüyor. Yanlış URL mi?'; + + @override + String get calculatingFileSize => 'Dosya boyutu hesaplanıyor...'; + + @override + String get prepareSendingAttachment => 'Ek gönderilmeye hazırlanıyor...'; + + @override + String get sendingAttachment => 'Ek gönderiliyor...'; + + @override + String get generatingVideoThumbnail => 'Video küçük resmi oluşturuluyor...'; + + @override + String get compressVideo => 'Video sıkıştırılıyor...'; + + @override + String sendingAttachmentCountOfCount(int index, int length) { + return 'Ek $index / $length gönderiliyor...'; + } + + @override + String serverLimitReached(int seconds) { + return 'Sunucu sınırına ulaşıldı! $seconds saniye bekleniyor...'; + } + + @override + String get oneOfYourDevicesIsNotVerified => + 'Aygıtlarınızdan biri doğrulanmadı'; + + @override + String get noticeChatBackupDeviceVerification => + 'Not: Tüm aygıtlarınızı sohbet yedeklemesine bağladığınızda, otomatik olarak doğrulanırlar.'; + + @override + String get continueText => 'Devam et'; + + @override + String get welcomeText => + 'Hey Hey 👋 Karşınızda FluffyChat. https://matrix.org ile uyumlu herhangi bir homeserver\'a giriş yapabilirsiniz. Ve herkesle konuşabilirsiniz. Bu koca bir merkeziyetsiz mesajlaşma ağı!'; + + @override + String get blur => 'Blur:'; + + @override + String get opacity => 'Şeffaflık:'; + + @override + String get setWallpaper => 'Duvar kağıdı seç'; + + @override + String get manageAccount => 'Hesabı yönet'; + + @override + String get noContactInformationProvided => + 'Sunucu geçerli bir iletişim bilgisi sunmadı'; + + @override + String get contactServerAdmin => 'Sunucu yöneticisiyle iletişime geçin'; + + @override + String get contactServerSecurity => 'Sunucu güvenliğiyle iletişime geçin'; + + @override + String get supportPage => 'Destek sayfası'; + + @override + String get serverInformation => 'Sunucu bilgisi:'; + + @override + String get name => 'İsim'; + + @override + String get version => 'Versiyon'; + + @override + String get website => 'Web sitesi'; + + @override + String get compress => 'Sıkıştırma'; + + @override + String get boldText => 'Kalın metin'; + + @override + String get italicText => 'İtalik metin'; + + @override + String get strikeThrough => 'Üstü çizili'; + + @override + String get pleaseFillOut => 'Lütfen doldurun'; + + @override + String get invalidUrl => 'Geçersiz url'; + + @override + String get addLink => 'Link ekle'; + + @override + String get unableToJoinChat => + 'Sohbete girilemiyor. Belki başka birileri konuşmayı kapatmış olabilir.'; + + @override + String get previous => 'Previous'; + + @override + String get otherPartyNotLoggedIn => + 'The other party is currently not logged in and therefore cannot receive messages!'; + + @override + String appWantsToUseForLogin(String server) { + return 'Use \'$server\' to log in'; + } + + @override + String get appWantsToUseForLoginDescription => + 'You hereby allow the app and website to share information about you.'; + + @override + String get open => 'Open'; + + @override + String get waitingForServer => 'Waiting for server...'; + + @override + String get appIntroduction => + 'Extera lets you chat with your friends across different messengers. Learn more at https://matrix.org or just tap *Continue*.'; + + @override + String get newChatRequest => '📩 New chat request'; + + @override + String get contentNotificationSettings => 'Content notification settings'; + + @override + String get generalNotificationSettings => 'General notification settings'; + + @override + String get roomNotificationSettings => 'Room notification settings'; + + @override + String get userSpecificNotificationSettings => + 'User specific notification settings'; + + @override + String get otherNotificationSettings => 'Other notification settings'; + + @override + String get notificationRuleContainsUserName => 'Contains User Name'; + + @override + String get notificationRuleContainsUserNameDescription => + 'Notifies the user when a message contains their username.'; + + @override + String get notificationRuleMaster => 'Mute all notifications'; + + @override + String get notificationRuleMasterDescription => + 'Overrides all other rules and disables all notifications.'; + + @override + String get notificationRuleSuppressNotices => 'Suppress Automated Messages'; + + @override + String get notificationRuleSuppressNoticesDescription => + 'Suppresses notifications from automated clients like bots.'; + + @override + String get notificationRuleInviteForMe => 'Invite for Me'; + + @override + String get notificationRuleInviteForMeDescription => + 'Notifies the user when they are invited to a room.'; + + @override + String get notificationRuleMemberEvent => 'Member Event'; + + @override + String get notificationRuleMemberEventDescription => + 'Suppresses notifications for membership events.'; + + @override + String get notificationRuleIsUserMention => 'User Mention'; + + @override + String get notificationRuleIsUserMentionDescription => + 'Notifies the user when they are directly mentioned in a message.'; + + @override + String get notificationRuleContainsDisplayName => 'Contains Display Name'; + + @override + String get notificationRuleContainsDisplayNameDescription => + 'Notifies the user when a message contains their display name.'; + + @override + String get notificationRuleIsRoomMention => 'Room Mention'; + + @override + String get notificationRuleIsRoomMentionDescription => + 'Notifies the user when there is a room mention.'; + + @override + String get notificationRuleRoomnotif => 'Room Notification'; + + @override + String get notificationRuleRoomnotifDescription => + 'Notifies the user when a message contains \'@room\'.'; + + @override + String get notificationRuleTombstone => 'Tombstone'; + + @override + String get notificationRuleTombstoneDescription => + 'Notifies the user about room deactivation messages.'; + + @override + String get notificationRuleReaction => 'Reaction'; + + @override + String get notificationRuleReactionDescription => + 'Suppresses notifications for reactions.'; + + @override + String get notificationRuleRoomServerAcl => 'Room Server ACL'; + + @override + String get notificationRuleRoomServerAclDescription => + 'Suppresses notifications for room server access control lists (ACL).'; + + @override + String get notificationRuleSuppressEdits => 'Suppress Edits'; + + @override + String get notificationRuleSuppressEditsDescription => + 'Suppresses notifications for edited messages.'; + + @override + String get notificationRuleCall => 'Call'; + + @override + String get notificationRuleCallDescription => + 'Notifies the user about calls.'; + + @override + String get notificationRuleEncryptedRoomOneToOne => + 'Encrypted Room One-to-One'; + + @override + String get notificationRuleEncryptedRoomOneToOneDescription => + 'Notifies the user about messages in encrypted one-to-one rooms.'; + + @override + String get notificationRuleRoomOneToOne => 'Room One-to-One'; + + @override + String get notificationRuleRoomOneToOneDescription => + 'Notifies the user about messages in one-to-one rooms.'; + + @override + String get notificationRuleMessage => 'Message'; + + @override + String get notificationRuleMessageDescription => + 'Notifies the user about general messages.'; + + @override + String get notificationRuleEncrypted => 'Encrypted'; + + @override + String get notificationRuleEncryptedDescription => + 'Notifies the user about messages in encrypted rooms.'; + + @override + String get notificationRuleJitsi => 'Jitsi'; + + @override + String get notificationRuleJitsiDescription => + 'Notifies the user about Jitsi widget events.'; + + @override + String get notificationRuleServerAcl => 'Suppress Server ACL Events'; + + @override + String get notificationRuleServerAclDescription => + 'Suppresses notifications for Server ACL events.'; + + @override + String unknownPushRule(String rule) { + return 'Unknown push rule \'$rule\''; + } + + @override + String get deletePushRuleCanNotBeUndone => + 'If you delete this notification setting, this can not be undone.'; + + @override + String get more => 'More'; + + @override + String get shareKeysWith => 'Share keys with...'; + + @override + String get shareKeysWithDescription => + 'Which devices should be trusted so that they can read along your messages in encrypted chats?'; + + @override + String get allDevices => 'All devices'; + + @override + String get crossVerifiedDevicesIfEnabled => + 'Cross verified devices if enabled'; + + @override + String get crossVerifiedDevices => 'Cross verified devices'; + + @override + String get verifiedDevicesOnly => 'Verified devices only'; + + @override + String get takeAPhoto => 'Take a photo'; + + @override + String get recordAVideo => 'Record a video'; + + @override + String get optionalMessage => '(Optional) message...'; + + @override + String get notSupportedOnThisDevice => 'Not supported on this device'; + + @override + String get enterNewChat => 'Enter new chat'; + + @override + String get approve => 'Approve'; + + @override + String get youHaveKnocked => 'You have knocked'; + + @override + String get pleaseWaitUntilInvited => + 'Please wait now, until someone from the room invites you.'; +} diff --git a/lib/generated/l10n/l10n_uk.dart b/lib/generated/l10n/l10n_uk.dart new file mode 100644 index 0000000..43e7422 --- /dev/null +++ b/lib/generated/l10n/l10n_uk.dart @@ -0,0 +1,2759 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'l10n.dart'; + +// ignore_for_file: type=lint + +/// The translations for Ukrainian (`uk`). +class L10nUk extends L10n { + L10nUk([String locale = 'uk']) : super(locale); + + @override + String get noSendPermission => 'You can\'t send messages here'; + + @override + String get alwaysUse24HourFormat => 'ні'; + + @override + String get repeatPassword => 'Повторіть пароль'; + + @override + String get notAnImage => 'Не файл зображення.'; + + @override + String get setCustomPermissionLevel => 'Set custom permission level'; + + @override + String get setPermissionsLevelDescription => + 'Please choose a predefined role below or enter a custom permission level between 0 and 100.'; + + @override + String get ignoreUser => 'Ignore user'; + + @override + String get normalUser => 'Normal user'; + + @override + String get remove => 'Вилучити'; + + @override + String get importNow => 'Імпортувати зараз'; + + @override + String get importEmojis => 'Імпорт емодзі'; + + @override + String get importFromZipFile => 'Імпорт з файлу .zip'; + + @override + String get exportEmotePack => 'Експортувати набір смайликів у форматі .zip'; + + @override + String get replace => 'Замінити'; + + @override + String get about => 'Про застосунок'; + + @override + String aboutHomeserver(String homeserver) { + return 'Про $homeserver'; + } + + @override + String get accept => 'Прийняти'; + + @override + String acceptedTheInvitation(String username) { + return '👍 $username приймає запрошення'; + } + + @override + String get account => 'Обліковий запис'; + + @override + String activatedEndToEndEncryption(String username) { + return '🔐 $username активує наскрізне шифрування'; + } + + @override + String get addEmail => 'Додати е-пошту'; + + @override + String get confirmMatrixId => + 'Підтвердьте свій Matrix ID, щоб видалити свій обліковий запис.'; + + @override + String supposedMxid(String mxid) { + return 'Це має бути $mxid'; + } + + @override + String get addChatDescription => 'Додати опис бесіди...'; + + @override + String get addToSpace => 'Додати простір'; + + @override + String get admin => 'Адміністратор'; + + @override + String get alias => 'псевдонім'; + + @override + String get all => 'Усі'; + + @override + String get allChats => 'Усі бесіди'; + + @override + String get commandHint_roomupgrade => + 'Оновити цю кімнату до версії даної кімнати'; + + @override + String get commandHint_googly => 'Надіслати кілька гугл-очей'; + + @override + String get commandHint_cuddle => 'Надіслати пригортайку'; + + @override + String get commandHint_hug => 'Надіслати обійми'; + + @override + String googlyEyesContent(String senderName) { + return '$senderName надсилає вам гугл-очі'; + } + + @override + String cuddleContent(String senderName) { + return '$senderName пригортається до вас'; + } + + @override + String hugContent(String senderName) { + return '$senderName обіймає вас'; + } + + @override + String answeredTheCall(String senderName) { + return '$senderName відповідає на виклик'; + } + + @override + String get anyoneCanJoin => 'Будь-хто може приєднатись'; + + @override + String get appLock => 'Блокування застосунку'; + + @override + String get appLockDescription => + 'Блокувати застосунок, коли не використовується ПІН-код'; + + @override + String get archive => 'Архів'; + + @override + String get areGuestsAllowedToJoin => 'Чи дозволено гостям приєднуватись'; + + @override + String get areYouSure => 'Ви впевнені?'; + + @override + String get areYouSureYouWantToLogout => 'Ви впевнені, що хочете вийти?'; + + @override + String get askSSSSSign => + 'Для підпису ключа іншого користувача введіть свою парольну фразу або ключ відновлення.'; + + @override + String askVerificationRequest(String username) { + return 'Прийняти цей запит на підтвердження від $username?'; + } + + @override + String get autoplayImages => + 'Автоматично відтворювати анімовані наліпки та емоджі'; + + @override + String badServerLoginTypesException(String serverVersions, + String supportedVersions, Object suportedVersions) { + return 'Домашній сервер підтримує такі типи входу:\n$serverVersions\nАле цей застосунок підтримує лише:\n$supportedVersions'; + } + + @override + String get sendTypingNotifications => 'Надсилати сповіщення про ввід тексту'; + + @override + String get swipeRightToLeftToReply => + 'Посунути праворуч або ліворуч, щоб відповісти'; + + @override + String get sendOnEnter => 'Надсилати натисканням Enter'; + + @override + String badServerVersionsException(String serverVersions, + String supportedVersions, Object serverVerions, Object suportedVersions) { + return 'Домашній сервер підтримує такі версії специфікацій:\n$serverVersions\nАле цей застосунок підтримує лише $supportedVersions'; + } + + @override + String countChatsAndCountParticipants(int chats, int participants) { + return '$chats чати та $participants учасників'; + } + + @override + String get noMoreChatsFound => 'Більше чатів не знайдено...'; + + @override + String get noChatsFoundHere => + 'Бесід ще немає. Розпочніть спілкування натиснувши кнопку нижче. ⤵️'; + + @override + String get joinedChats => 'Приєднані чати'; + + @override + String get unread => 'Непрочитані'; + + @override + String get space => 'Простір'; + + @override + String get spaces => 'Простори'; + + @override + String get banFromChat => 'Заблокувати в бесіді'; + + @override + String get banned => 'Заблоковано'; + + @override + String bannedUser(String username, String targetName) { + return '$username блокує $targetName'; + } + + @override + String get blockDevice => 'Заблокувати пристрій'; + + @override + String get blocked => 'Заблоковано'; + + @override + String get botMessages => 'Повідомлення ботів'; + + @override + String get cancel => 'Скасувати'; + + @override + String cantOpenUri(String uri) { + return 'Не вдалося відкрити URI $uri'; + } + + @override + String get changeDeviceName => 'Змінити назву пристрою'; + + @override + String changedTheChatAvatar(String username) { + return '$username змінює аватар бесіди'; + } + + @override + String changedTheChatDescriptionTo(String username, String description) { + return '$username змінює опис бесіди на: \'$description\''; + } + + @override + String changedTheChatNameTo(String username, String chatname) { + return '$username змінює назву бесіди на: \'$chatname\''; + } + + @override + String changedTheChatPermissions(String username) { + return '$username змінює права доступу бесіди'; + } + + @override + String changedTheDisplaynameTo(String username, String displayname) { + return '$username змінює показуване ім\'я на: \'$displayname\''; + } + + @override + String changedTheGuestAccessRules(String username) { + return '$username змінює правила гостьового доступу'; + } + + @override + String changedTheGuestAccessRulesTo(String username, String rules) { + return '$username змінює правила гостьового доступу на: $rules'; + } + + @override + String changedTheHistoryVisibility(String username) { + return '$username змінює видимість історії'; + } + + @override + String changedTheHistoryVisibilityTo(String username, String rules) { + return '$username змінює видимість історії на: $rules'; + } + + @override + String changedTheJoinRules(String username) { + return '$username змінює правила приєднання'; + } + + @override + String changedTheJoinRulesTo(String username, String joinRules) { + return '$username змінює правила приєднання на: $joinRules'; + } + + @override + String changedTheProfileAvatar(String username) { + return '$username змінює аватар'; + } + + @override + String changedTheRoomAliases(String username) { + return '$username змінює псевдоніми кімнати'; + } + + @override + String changedTheRoomInvitationLink(String username) { + return '$username змінює посилання для запрошення'; + } + + @override + String get changePassword => 'Змінити пароль'; + + @override + String get changeTheHomeserver => 'Змінити домашній сервер'; + + @override + String get changeTheme => 'Змінити стиль'; + + @override + String get changeTheNameOfTheGroup => 'Змінити назву групи'; + + @override + String get changeYourAvatar => 'Змінити аватар'; + + @override + String get channelCorruptedDecryptError => 'Шифрування було пошкоджено'; + + @override + String get chat => 'Бесіда'; + + @override + String get yourChatBackupHasBeenSetUp => 'Рез. копію чату налаштовано.'; + + @override + String get chatBackup => 'Резервне копіювання бесіди'; + + @override + String get chatBackupDescription => + 'Ваші старі повідомлення захищені ключем відновлення. Переконайтеся, що ви не втратите його.'; + + @override + String get chatDetails => 'Подробиці бесіди'; + + @override + String get chatHasBeenAddedToThisSpace => 'Бесіду додано до цього простору'; + + @override + String get chats => 'Бесіди'; + + @override + String get chooseAStrongPassword => 'Виберіть надійний пароль'; + + @override + String get clearArchive => 'Очистити архів'; + + @override + String get close => 'Закрити'; + + @override + String get commandHint_markasdm => + 'Позначити кімнатою особистого спілкування для надання Matrix ID'; + + @override + String get commandHint_markasgroup => 'Позначити групою'; + + @override + String get commandHint_ban => 'Заблокувати цього користувача кімнати'; + + @override + String get commandHint_clearcache => 'Очистити кеш'; + + @override + String get commandHint_create => + 'Створіть порожню групову бесіду\nВикористовуйте --no-encryption, щоб вимкнути шифрування'; + + @override + String get commandHint_discardsession => 'Відкинути сеанс'; + + @override + String get commandHint_dm => + 'Початок особистої бесіди\nВикористовуйте --no-encryption, що вимкнути шифрування'; + + @override + String get commandHint_html => 'Надіслати текст у форматі HTML'; + + @override + String get commandHint_invite => + 'Запросіть цього користувача до цієї кімнати'; + + @override + String get commandHint_join => 'Приєднатися до цієї кімнати'; + + @override + String get commandHint_kick => 'Вилучити цього користувача з цієї кімнати'; + + @override + String get commandHint_leave => 'Вийти з цієї кімнати'; + + @override + String get commandHint_me => 'Опишіть себе'; + + @override + String get commandHint_myroomavatar => + 'Встановіть зображення для цієї кімнати (від mxc-uri)'; + + @override + String get commandHint_myroomnick => + 'Укажіть показуване ім\'я для цієї кімнати'; + + @override + String get commandHint_op => + 'Укажіть рівень повноважень цього користувача (типово: 50)'; + + @override + String get commandHint_plain => 'Надіслати неформатований текст'; + + @override + String get commandHint_react => 'Надіслати відповідь як реакцію'; + + @override + String get commandHint_send => 'Надіслати текст'; + + @override + String get commandHint_unban => + 'Розблокувати цього користувача у цій кімнаті'; + + @override + String get commandInvalid => 'Неприпустима команда'; + + @override + String commandMissing(String command) { + return '$command не є командою.'; + } + + @override + String get compareEmojiMatch => 'Порівняйте емодзі'; + + @override + String get compareNumbersMatch => 'Порівняйте цифри'; + + @override + String get configureChat => 'Налаштувати бесіду'; + + @override + String get confirm => 'Підтвердити'; + + @override + String get connect => 'Під\'єднатись'; + + @override + String get contactHasBeenInvitedToTheGroup => + 'Контакт був запрошений в групу'; + + @override + String get containsDisplayName => 'Містить показуване ім’я'; + + @override + String get containsUserName => 'Містить ім’я користувача'; + + @override + String get contentHasBeenReported => + 'Скаргу на вміст надіслано адміністраторам сервера'; + + @override + String get copiedToClipboard => 'Скопійовано в буфер обміну'; + + @override + String get copy => 'Копіювати'; + + @override + String get copyToClipboard => 'Копіювати до буфера обміну'; + + @override + String couldNotDecryptMessage(String error) { + return 'Помилка розшифрування повідомлення: $error'; + } + + @override + String countParticipants(int count) { + return 'Учасників: $count'; + } + + @override + String get create => 'Створити'; + + @override + String createdTheChat(String username) { + return '💬 $username створює бесіду'; + } + + @override + String get createGroup => 'Створити групу'; + + @override + String get createNewSpace => 'Новий простір'; + + @override + String get currentlyActive => 'Зараз у мережі'; + + @override + String get darkTheme => 'Темний'; + + @override + String dateAndTimeOfDay(String date, String timeOfDay) { + return '$timeOfDay, $date'; + } + + @override + String dateWithoutYear(String month, String day) { + return '$day-$month'; + } + + @override + String dateWithYear(String year, String month, String day) { + return '$day-$month-$year'; + } + + @override + String get deactivateAccountWarning => + 'Це деактивує ваш обліковий запис. Це неможливо скасувати! Ви впевнені?'; + + @override + String get defaultPermissionLevel => + 'Типовий рівень дозволів для нових користувачів'; + + @override + String get delete => 'Видалити'; + + @override + String get deleteAccount => 'Видалити обліковий запис'; + + @override + String get deleteMessage => 'Видалити повідомлення'; + + @override + String get device => 'Пристрій'; + + @override + String get deviceId => 'ID пристрою'; + + @override + String get devices => 'Пристрої'; + + @override + String get directChats => 'Особисті бесіди'; + + @override + String get allRooms => 'Усі групові бесіди'; + + @override + String get displaynameHasBeenChanged => 'Показуване ім\'я було змінено'; + + @override + String get downloadFile => 'Завантажити файл'; + + @override + String get edit => 'Редагувати'; + + @override + String get editBlockedServers => 'Редагувати заблоковані сервери'; + + @override + String get chatPermissions => 'Дозволи бесіди'; + + @override + String get editDisplayname => 'Змінити показуване ім\'я'; + + @override + String get editRoomAliases => 'Змінити псевдоніми кімнати'; + + @override + String get editRoomAvatar => 'Змінити аватар кімнати'; + + @override + String get emoteExists => 'Емодзі вже існує!'; + + @override + String get emoteInvalid => 'Неприпустимий короткий код емодзі!'; + + @override + String get emoteKeyboardNoRecents => + 'Тут з\'являться нещодавно використані смайлики...'; + + @override + String get emotePacks => 'Набори емоджі для кімнати'; + + @override + String get emoteSettings => 'Налаштування емодзі'; + + @override + String get globalChatId => 'Глобальний ID бесіди'; + + @override + String get accessAndVisibility => 'Доступ і видимість'; + + @override + String get accessAndVisibilityDescription => + 'Хто може приєднатися до цієї бесіди і як її можна знайти.'; + + @override + String get calls => 'Виклики'; + + @override + String get customEmojisAndStickers => 'Власні емоджі та наліпки'; + + @override + String get customEmojisAndStickersBody => + 'Додавайте або діліться власними емоджі або наліпками, які можна використовувати в будь-якій бесіді.'; + + @override + String get emoteShortcode => 'Короткий код для емодзі'; + + @override + String get emoteWarnNeedToPick => + 'Укажіть короткий код емодзі та зображення!'; + + @override + String get emptyChat => 'Порожня бесіда'; + + @override + String get enableEmotesGlobally => 'Увімкнути пакунок емоджі глобально'; + + @override + String get enableEncryption => 'Увімкнути шифрування'; + + @override + String get enableEncryptionWarning => + 'Ви більше не зможете вимкнути шифрування. Ви впевнені?'; + + @override + String get encrypted => 'Зашифровано'; + + @override + String get encryption => 'Шифрування'; + + @override + String get encryptionNotEnabled => 'Шифрування вимкнено'; + + @override + String endedTheCall(String senderName) { + return '$senderName завершує виклик'; + } + + @override + String get enterAnEmailAddress => 'Введіть адресу е-пошти'; + + @override + String get homeserver => 'Домашній сервер'; + + @override + String get enterYourHomeserver => 'Введіть адресу домашнього сервера'; + + @override + String errorObtainingLocation(String error) { + return 'Помилка під час отримання розташування: $error'; + } + + @override + String get everythingReady => 'Усе готово!'; + + @override + String get extremeOffensive => 'Украй образливий'; + + @override + String get fileName => 'Назва файлу'; + + @override + String get fluffychat => 'FluffyChat'; + + @override + String get fontSize => 'Розмір шрифту'; + + @override + String get forward => 'Переслати'; + + @override + String get fromJoining => 'З моменту приєднання'; + + @override + String get fromTheInvitation => 'З моменту запрошення'; + + @override + String get goToTheNewRoom => 'Перейти до нової кімнати'; + + @override + String get group => 'Група'; + + @override + String get chatDescription => 'Опис бесіди'; + + @override + String get chatDescriptionHasBeenChanged => 'Опис бесіди змінено'; + + @override + String get groupIsPublic => 'Загальнодоступна група'; + + @override + String get groups => 'Групи'; + + @override + String groupWith(String displayname) { + return 'Група з $displayname'; + } + + @override + String get guestsAreForbidden => 'Гості не можуть приєднуватись'; + + @override + String get guestsCanJoin => 'Гості можуть приєднуватись'; + + @override + String hasWithdrawnTheInvitationFor(String username, String targetName) { + return '$username відкликає запрошення для $targetName'; + } + + @override + String get help => 'Довідка'; + + @override + String get hideRedactedEvents => 'Сховати змінені події'; + + @override + String get hideRedactedMessages => 'Сховати змінені повідомлення'; + + @override + String get hideRedactedMessagesBody => + 'Якщо хтось змінить повідомлення, його більше не буде видно в бесіді.'; + + @override + String get hideInvalidOrUnknownMessageFormats => + 'Сховати недійсні або невідомі формати повідомлень'; + + @override + String get howOffensiveIsThisContent => 'Наскільки образливий цей вміст?'; + + @override + String get id => 'ID'; + + @override + String get identity => 'Ідентифікація'; + + @override + String get block => 'Заблокувати'; + + @override + String get blockedUsers => 'Заблоковані користувачі'; + + @override + String get blockListDescription => + 'Ви можете заблокувати користувачів, які вас турбують. Ви не зможете отримувати жодних повідомлень або запрошень до кімнати від користувачів з вашого персонального списку блокування.'; + + @override + String get blockUsername => 'Ігнорувати ім\'я користувача'; + + @override + String get iHaveClickedOnLink => 'Мною виконано перехід за посиланням'; + + @override + String get incorrectPassphraseOrKey => + 'Неправильна парольна фраза або ключ відновлення'; + + @override + String get inoffensive => 'Необразливий'; + + @override + String get inviteContact => 'Запросити контакт'; + + @override + String inviteContactToGroupQuestion(Object contact, Object groupName) { + return 'Хочете запросити $contact до бесіди \"$groupName\"?'; + } + + @override + String inviteContactToGroup(String groupName) { + return 'Запросити контакт до $groupName'; + } + + @override + String get noChatDescriptionYet => 'Опис бесіди ще не створено.'; + + @override + String get tryAgain => 'Повторіть спробу'; + + @override + String get invalidServerName => 'Недійсна назва сервера'; + + @override + String get invited => 'Запрошено'; + + @override + String get redactMessageDescription => + 'Повідомлення буде відредаговано для всіх учасників цієї розмови. Це не можна скасувати.'; + + @override + String get optionalRedactReason => + '(Необов\'язково) Причина редагування цього повідомлення...'; + + @override + String invitedUser(String username, String targetName) { + return '📩 $username запрошує $targetName'; + } + + @override + String get invitedUsersOnly => 'Лише запрошені користувачі'; + + @override + String get inviteForMe => 'Запрошення для мене'; + + @override + String inviteText(String username, String link) { + return '$username запрошує вас у FluffyChat. \n1. Перейдіть на fluffychat.im й установіть застосунок \n2. Зареєструйтесь або ввійдіть \n3. Відкрийте запрошувальне посилання:\n $link'; + } + + @override + String get isTyping => 'пише…'; + + @override + String joinedTheChat(String username) { + return '👋 $username приєднується до бесіди'; + } + + @override + String get joinRoom => 'Приєднатися до кімнати'; + + @override + String kicked(String username, String targetName) { + return '👞 $username вилучає $targetName'; + } + + @override + String kickedAndBanned(String username, String targetName) { + return '🙅 $username вилучає та блокує $targetName'; + } + + @override + String get kickFromChat => 'Вилучити з бесіди'; + + @override + String lastActiveAgo(String localizedTimeShort) { + return 'Остання активність: $localizedTimeShort'; + } + + @override + String get leave => 'Вийти'; + + @override + String get leftTheChat => 'Виходить з бесіди'; + + @override + String get license => 'Ліцензія'; + + @override + String get lightTheme => 'Світлий'; + + @override + String loadCountMoreParticipants(int count) { + return 'Завантажити ще $count учасників'; + } + + @override + String get dehydrate => 'Експортувати сеанс та очистити пристрій'; + + @override + String get dehydrateWarning => + 'Цю дію не можна скасувати. Переконайтеся, що ви безпечно зберігаєте файл резервної копії.'; + + @override + String get dehydrateTor => 'Користувачі TOR: експорт сеансу'; + + @override + String get dehydrateTorLong => + 'Для користувачів TOR рекомендується експортувати сеанс перед закриттям вікна.'; + + @override + String get hydrateTor => 'Користувачі TOR: імпорт експортованого сеансу'; + + @override + String get hydrateTorLong => + 'Минулого разу ви експортували свій сеанс із TOR? Швидко імпортуйте його та продовжуйте спілкування.'; + + @override + String get hydrate => 'Відновлення з файлу резервної копії'; + + @override + String get loadingPleaseWait => 'Завантаження… Будь ласка, зачекайте.'; + + @override + String get loadMore => 'Завантажити ще…'; + + @override + String get locationDisabledNotice => + 'Служби визначення розташування вимкнені. Увімкніть їх, щоб мати змогу ділитися своїм розташуванням.'; + + @override + String get locationPermissionDeniedNotice => + 'Дозвіл на розташування відхилено. Надайте можливість ділитися своїм розташуванням.'; + + @override + String get login => 'Увійти'; + + @override + String logInTo(String homeserver) { + return 'Увійти до $homeserver'; + } + + @override + String get logout => 'Вийти'; + + @override + String get memberChanges => 'Зміни учасників'; + + @override + String get mention => 'Згадати'; + + @override + String get messages => 'Повідомлення'; + + @override + String get messagesStyle => 'Повідомлення:'; + + @override + String get moderator => 'Модератор'; + + @override + String get muteChat => 'Вимкнути сповіщення'; + + @override + String get needPantalaimonWarning => + 'Майте на увазі, що на цей час вам потрібен Pantalaimon, щоб використовувати наскрізне шифрування.'; + + @override + String get newChat => 'Нова бесіда'; + + @override + String get newMessageInFluffyChat => '💬 Нове повідомлення у FluffyChat'; + + @override + String get newVerificationRequest => 'Новий запит перевірки!'; + + @override + String get next => 'Далі'; + + @override + String get no => 'Ні'; + + @override + String get noConnectionToTheServer => 'Немає з\'єднання з сервером'; + + @override + String get noEmotesFound => 'Емоджі не знайдено. 😕'; + + @override + String get noEncryptionForPublicRooms => + 'Активувати шифрування можна лише тоді, коли кімната більше не буде загальнодоступною.'; + + @override + String get noGoogleServicesWarning => + 'Схоже, Firebase Cloud Messaging недоступна на вашому пристрої. Щоб отримувати push-сповіщення, радимо встановити ntfy. За допомогою ntfy або іншого постачальника Unified Push ви можете отримувати push-сповіщення у безпечний спосіб. Ви можете завантажити ntfy з PlayStore або з F-Droid.'; + + @override + String noMatrixServer(String server1, String server2) { + return '$server1 не є сервером matrix, використовувати $server2 натомість?'; + } + + @override + String get shareInviteLink => 'Надіслати запрошувальне посилання'; + + @override + String get scanQrCode => 'Сканувати QR-код'; + + @override + String get none => 'Нічого'; + + @override + String get noPasswordRecoveryDescription => + 'Ви ще не додали спосіб відновлення пароля.'; + + @override + String get noPermission => 'Немає прав доступу'; + + @override + String get noRoomsFound => 'Кімнат не знайдено…'; + + @override + String get notifications => 'Сповіщення'; + + @override + String get notificationsEnabledForThisAccount => + 'Сповіщення ввімкнені для цього облікового запису'; + + @override + String numUsersTyping(int count) { + return '$count користувачів пишуть…'; + } + + @override + String get obtainingLocation => 'Отримання розташування…'; + + @override + String get offensive => 'Образливий'; + + @override + String get offline => 'Офлайн'; + + @override + String get ok => 'Гаразд'; + + @override + String get online => 'Онлайн'; + + @override + String get onlineKeyBackupEnabled => + 'Резервне онлайн-копіювання ключів увімкнено'; + + @override + String get oopsPushError => + 'Дідько! На жаль, сталася помилка під час налаштування push-сповіщень.'; + + @override + String get oopsSomethingWentWrong => 'Халепа, щось пішло не так…'; + + @override + String get openAppToReadMessages => + 'Відкрийте застосунок читання повідомлень'; + + @override + String get openCamera => 'Відкрити камеру'; + + @override + String get openVideoCamera => 'Відкрити камеру для відео'; + + @override + String get oneClientLoggedOut => + 'На одному з ваших клієнтів виконано вихід із системи'; + + @override + String get addAccount => 'Додати обліковий запис'; + + @override + String get editBundlesForAccount => + 'Змінити вузол для цього облікового запису'; + + @override + String get addToBundle => 'Додати до вузлів'; + + @override + String get removeFromBundle => 'Вилучити з цього вузла'; + + @override + String get bundleName => 'Назва вузла'; + + @override + String get enableMultiAccounts => + '(БЕТА) Увімкнути кілька облікових записів на цьому пристрої'; + + @override + String get openInMaps => 'Відкрити в картах'; + + @override + String get link => 'Посилання'; + + @override + String get serverRequiresEmail => + 'Цей сервер потребує перевірки вашої адресу е-пошти для реєстрації.'; + + @override + String get or => 'Або'; + + @override + String get participant => 'Учасник'; + + @override + String get passphraseOrKey => 'парольна фраза або ключ відновлення'; + + @override + String get password => 'Пароль'; + + @override + String get passwordForgotten => 'Забули пароль'; + + @override + String get passwordHasBeenChanged => 'Пароль змінено'; + + @override + String get hideMemberChangesInPublicChats => + 'Сховати зміни користувачів у загальнодоступних бесідах'; + + @override + String get hideMemberChangesInPublicChatsBody => + 'Не показувати в хронології бесіди, якщо хтось приєднується до загальнодоступної бесіди або виходить з неї, щоб покращити її читабельність.'; + + @override + String get overview => 'Огляд'; + + @override + String get notifyMeFor => 'Сповіщати мене про'; + + @override + String get passwordRecoverySettings => 'Налаштування відновлення пароля'; + + @override + String get passwordRecovery => 'Відновлення пароля'; + + @override + String get people => 'Люди'; + + @override + String get pickImage => 'Вибрати зображення'; + + @override + String get pin => 'Закріпити'; + + @override + String play(String fileName) { + return 'Відтворити $fileName'; + } + + @override + String get pleaseChoose => 'Виберіть'; + + @override + String get pleaseChooseAPasscode => 'Виберіть код доступу'; + + @override + String get pleaseClickOnLink => + 'Натисніть на посилання в електронному листі, а потім продовжуйте.'; + + @override + String get pleaseEnter4Digits => + 'Введіть 4 цифри або залиште порожнім, щоб вимкнути блокування застосунку.'; + + @override + String get pleaseEnterRecoveryKey => 'Введіть ключ відновлення:'; + + @override + String get pleaseEnterYourPassword => 'Введіть свій пароль'; + + @override + String get pleaseEnterYourPin => 'Введіть свій PIN-код'; + + @override + String get pleaseEnterYourUsername => 'Введіть своє ім\'я користувача'; + + @override + String get pleaseFollowInstructionsOnWeb => + 'Виконайте вказівки вебсайту та торкніться далі.'; + + @override + String get privacy => 'Приватність'; + + @override + String get publicRooms => 'Загальнодоступні кімнати'; + + @override + String get pushRules => 'Правила сповіщень'; + + @override + String get reason => 'Причина'; + + @override + String get recording => 'Запис'; + + @override + String redactedBy(String username) { + return 'Відредаговано $username'; + } + + @override + String get directChat => 'Особисте повідомлення'; + + @override + String redactedByBecause(String username, String reason) { + return 'Відредаговано $username, тому що: \"$reason\"'; + } + + @override + String redactedAnEvent(String username) { + return '$username змінює подію'; + } + + @override + String get redactMessage => 'Редагувати повідомлення'; + + @override + String get register => 'Зареєструватися'; + + @override + String get reject => 'Відхилити'; + + @override + String rejectedTheInvitation(String username) { + return '$username відхиляє запрошення'; + } + + @override + String get rejoin => 'Приєднатися знову'; + + @override + String get removeAllOtherDevices => 'Вилучити всі інші пристрої'; + + @override + String removedBy(String username) { + return 'Вилучено користувачем $username'; + } + + @override + String get removeDevice => 'Вилучити пристрій'; + + @override + String get unbanFromChat => 'Розблокувати у бесіді'; + + @override + String get removeYourAvatar => 'Вилучити свій аватар'; + + @override + String get replaceRoomWithNewerVersion => 'Замінити кімнату новішою версією'; + + @override + String get reply => 'Відповісти'; + + @override + String get reportMessage => 'Поскаржитися на повідомлення'; + + @override + String get translateMessage => 'Translate message'; + + @override + String get translatedMessage => 'Translated message'; + + @override + String get errorTranslatingMessage => + 'An error has occured while translating the message.'; + + @override + String get recoverMessage => 'Recover message'; + + @override + String get recoveredMessage => 'Recovered message'; + + @override + String get errorRecoveringMessage => + 'An error has occured while recovering the message.'; + + @override + String get errorRecoveringMessageNoAdmin => + 'This feature is available on Synapse homeservers only for adminstrators.'; + + @override + String get requestPermission => 'Запит дозволу'; + + @override + String get roomHasBeenUpgraded => 'Кімнату було оновлено'; + + @override + String get roomVersion => 'Версія кімнати'; + + @override + String get saveFile => 'Зберегти файл'; + + @override + String get retry => 'Retry'; + + @override + String get search => 'Пошук'; + + @override + String get security => 'Безпека'; + + @override + String get recoveryKey => 'Ключ відновлення'; + + @override + String get recoveryKeyLost => 'Ключ відновлення втрачено?'; + + @override + String seenByUser(String username) { + return 'Переглянуто $username'; + } + + @override + String get send => 'Надіслати'; + + @override + String get sendAMessage => 'Надіслати повідомлення'; + + @override + String get sendAsText => 'Надіслати як текст'; + + @override + String get sendAudio => 'Надіслати аудіо'; + + @override + String get sendFile => 'Надіслати файл'; + + @override + String get sendImage => 'Надіслати зображення'; + + @override + String sendImages(int count) { + return 'Надіслати $count зображення'; + } + + @override + String get sendMessages => 'Надсилати повідомлення'; + + @override + String get sendOriginal => 'Надіслати оригінал'; + + @override + String get sendSticker => 'Надіслати наліпку'; + + @override + String get sendVideo => 'Надіслати відео'; + + @override + String sentAFile(String username) { + return '📁 $username надсилає файл'; + } + + @override + String sentAnAudio(String username) { + return '🎤 $username надсилає аудіо'; + } + + @override + String sentAPicture(String username) { + return '🖼️ $username надсилає зображення'; + } + + @override + String sentASticker(String username) { + return '😊 $username надсилає наліпку'; + } + + @override + String sentAVideo(String username) { + return '🎥 $username надсилає відео'; + } + + @override + String sentCallInformations(String senderName) { + return '$senderName надсилає відомості про виклик'; + } + + @override + String get separateChatTypes => 'Розділіть особисті бесіди та групи'; + + @override + String get setAsCanonicalAlias => 'Установити основним псевдонімом'; + + @override + String get setCustomEmotes => 'Установити користувацькі емоджі'; + + @override + String get setChatDescription => 'Налаштувати опис бесіди'; + + @override + String get setInvitationLink => 'Указати посилання для запрошення'; + + @override + String get setPermissionsLevel => 'Указати рівні дозволів'; + + @override + String get setStatus => 'Указати статус'; + + @override + String get settings => 'Налаштування'; + + @override + String get share => 'Поділитися'; + + @override + String sharedTheLocation(String username) { + return '$username ділиться своїм місцеперебуванням'; + } + + @override + String get shareLocation => 'Поділитися місцеперебуванням'; + + @override + String get showPassword => 'Показати пароль'; + + @override + String get presenceStyle => 'Присутність:'; + + @override + String get hideAvatarsInInvites => 'Hide avatars in invites'; + + @override + String get hideAvatarsInInvitesDescription => + 'Do not show room avatars in invites'; + + @override + String get presencesToggle => + 'Показувати повідомлення про стан від інших користувачів'; + + @override + String get pureBlackToggle => 'Pure Black'; + + @override + String get singlesignon => 'Єдиний вхід'; + + @override + String get skip => 'Пропустити'; + + @override + String get sourceCode => 'Джерельний код'; + + @override + String get spaceIsPublic => 'Простір загальнодоступний'; + + @override + String get spaceName => 'Назва простору'; + + @override + String startedACall(String senderName) { + return '$senderName розпочинає виклик'; + } + + @override + String get startFirstChat => 'Розпочніть свою першу бесіду'; + + @override + String get status => 'Статус'; + + @override + String get statusExampleMessage => 'Як справи сьогодні?'; + + @override + String get submit => 'Надіслати'; + + @override + String get synchronizingPleaseWait => 'Синхронізація… Будь ласка, зачекайте.'; + + @override + String synchronizingPleaseWaitCounter(String percentage) { + return ' Синхронізація… ($percentage%)'; + } + + @override + String get systemTheme => 'Системна'; + + @override + String get theyDontMatch => 'Вони відрізняються'; + + @override + String get theyMatch => 'Вони збігаються'; + + @override + String get title => 'FluffyChat'; + + @override + String get toggleFavorite => 'Перемикнути вибране'; + + @override + String get toggleMuted => 'Увімкнути/вимкнути звук'; + + @override + String get toggleUnread => 'Позначити прочитаним/непрочитаним'; + + @override + String get tooManyRequestsWarning => 'Забагато запитів. Спробуйте пізніше!'; + + @override + String get transferFromAnotherDevice => 'Перенесення з іншого пристрою'; + + @override + String get tryToSendAgain => 'Спробуйте надіслати ще раз'; + + @override + String get unavailable => 'Недоступний'; + + @override + String unbannedUser(String username, String targetName) { + return '$username розблоковує $targetName'; + } + + @override + String get unblockDevice => 'Розблокувати пристрій'; + + @override + String get unknownDevice => 'Невідомий пристрій'; + + @override + String get unknownEncryptionAlgorithm => 'Невідомий алгоритм шифрування'; + + @override + String unknownEvent(String type) { + return 'Невідома подія \'$type\''; + } + + @override + String get unmuteChat => 'Увімкнути сповіщення'; + + @override + String get unpin => 'Відкріпити'; + + @override + String unreadChats(int unreadCount) { + String _temp0 = intl.Intl.pluralLogic( + unreadCount, + locale: localeName, + other: '$unreadCount непрочитані бесіди', + many: '$unreadCount непрочитаних бесід', + few: '$unreadCount непрочитані бесіди', + one: '1 непрочитана бесіда', + ); + return '$_temp0'; + } + + @override + String userAndOthersAreTyping(String username, int count) { + return '$username та $count інших пишуть…'; + } + + @override + String userAndUserAreTyping(String username, String username2) { + return '$username і $username2 пишуть…'; + } + + @override + String userIsTyping(String username) { + return '$username пише…'; + } + + @override + String userLeftTheChat(String username) { + return '🚪 $username виходить з бесіди'; + } + + @override + String get username => 'Ім\'я користувача'; + + @override + String userSentUnknownEvent(String username, String type) { + return '$username надсилає подію $type'; + } + + @override + String get unverified => 'Неперевірений'; + + @override + String get verified => 'Перевірений'; + + @override + String get verify => 'Перевірити'; + + @override + String get verifyStart => 'Почати перевірку'; + + @override + String get verifySuccess => 'Ви успішно перевірені!'; + + @override + String get verifyTitle => 'Перевірка іншого облікового запису'; + + @override + String get videoCall => 'Відеовиклик'; + + @override + String get visibilityOfTheChatHistory => 'Видимість історії бесіди'; + + @override + String get visibleForAllParticipants => 'Видима для всіх учасників'; + + @override + String get visibleForEveryone => 'Видима для всіх'; + + @override + String get voiceMessage => 'Голосове повідомлення'; + + @override + String get waitingPartnerAcceptRequest => + 'Очікування прийняття запиту партнером…'; + + @override + String get waitingPartnerEmoji => 'Очікування прийняття емоджі партнером…'; + + @override + String get waitingPartnerNumbers => 'Очікування прийняття чисел партнером…'; + + @override + String get wallpaper => 'Шпалери:'; + + @override + String get warning => 'Попередження!'; + + @override + String get weSentYouAnEmail => 'Ми надіслали вам електронний лист'; + + @override + String get whoCanPerformWhichAction => 'Хто і яку дію може виконувати'; + + @override + String get whoIsAllowedToJoinThisGroup => + 'Кому дозволено приєднуватися до цієї групи'; + + @override + String get whyDoYouWantToReportThis => 'Чому ви хочете поскаржитися?'; + + @override + String get wipeChatBackup => + 'Стерти резервну копію бесіди, щоб створити новий ключ відновлення?'; + + @override + String get withTheseAddressesRecoveryDescription => + 'За допомогою цих адрес ви можете відновити свій пароль.'; + + @override + String get writeAMessage => 'Написати повідомлення…'; + + @override + String get yes => 'Так'; + + @override + String get you => 'Ви'; + + @override + String get youAreNoLongerParticipatingInThisChat => + 'Ви більше не берете участь у цій бесіді'; + + @override + String get youHaveBeenBannedFromThisChat => + 'Ви були заблоковані у цій бесіді'; + + @override + String get yourPublicKey => 'Ваш відкритий ключ'; + + @override + String get messageInfo => 'Відомості про повідомлення'; + + @override + String get time => 'Час'; + + @override + String get messageType => 'Тип повідомлення'; + + @override + String get sender => 'Відправник'; + + @override + String get openGallery => 'Відкрити галерею'; + + @override + String get removeFromSpace => 'Вилучити з простору'; + + @override + String get addToSpaceDescription => + 'Виберіть простір, щоб додати до нього цю бесіду.'; + + @override + String get start => 'Почати'; + + @override + String get pleaseEnterRecoveryKeyDescription => + 'Щоб розблокувати старі повідомлення, введіть ключ відновлення, згенерований у попередньому сеансі. Ваш ключ відновлення це НЕ ваш пароль.'; + + @override + String get publish => 'Опублікувати'; + + @override + String videoWithSize(String size) { + return 'Відео ($size)'; + } + + @override + String get openChat => 'Відкрити бесіду'; + + @override + String get markAsRead => 'Позначити прочитаним'; + + @override + String get reportUser => 'Поскаржився на користувача'; + + @override + String get dismiss => 'Відхилити'; + + @override + String reactedWith(String sender, String reaction) { + return '$sender реагує з $reaction'; + } + + @override + String get pinMessage => 'Прикріпити в кімнаті'; + + @override + String get confirmEventUnpin => + 'Ви впевнені, що бажаєте назавжди відкріпите подію?'; + + @override + String get emojis => 'Емоджі'; + + @override + String get placeCall => 'Здійснити виклик'; + + @override + String get voiceCall => 'Голосовий виклик'; + + @override + String get unsupportedAndroidVersion => 'Непідтримувана версія Android'; + + @override + String get unsupportedAndroidVersionLong => + 'Для цієї функції потрібна новіша версія Android. Перевірте наявність оновлень або підтримку Lineage OS.'; + + @override + String get videoCallsBetaWarning => + 'Зауважте, що відеовиклики на ранньому етапі розробки. Вони можуть працювати не так, як очікувалося, або взагалі не працювати на всіх платформах.'; + + @override + String get experimentalVideoCalls => 'Експериментальні відеовиклики'; + + @override + String get emailOrUsername => 'Електронна адреса або ім’я користувача'; + + @override + String get indexedDbErrorTitle => 'Проблеми приватного режиму'; + + @override + String get indexedDbErrorLong => + 'На жаль, сховище повідомлень не ввімкнуто у приватному режимі типово.\nВідкрийте\n - about:config\n - установіть для dom.indexedDB.privateBrowsing.enabled значення true\nІнакше запустити FluffyChat буде неможливо.'; + + @override + String switchToAccount(String number) { + return 'Перемкнутися на обліковий запис $number'; + } + + @override + String get nextAccount => 'Наступний обліковий запис'; + + @override + String get previousAccount => 'Попередній обліковий запис'; + + @override + String get addWidget => 'Додати віджет'; + + @override + String get widgetVideo => 'Відео'; + + @override + String get widgetEtherpad => 'Текстова примітка'; + + @override + String get widgetJitsi => 'Jitsi Meet'; + + @override + String get widgetCustom => 'Користувацький'; + + @override + String get widgetName => 'Назва'; + + @override + String get widgetUrlError => 'Це недійсна URL-адреса.'; + + @override + String get widgetNameError => 'Укажіть коротку назву.'; + + @override + String get errorAddingWidget => 'Помилка додавання віджета.'; + + @override + String get youRejectedTheInvitation => 'Ви відхилили запрошення'; + + @override + String get youJoinedTheChat => 'Ви приєдналися до бесіди'; + + @override + String get youAcceptedTheInvitation => '👍 Ви погодилися на запрошення'; + + @override + String youBannedUser(String user) { + return 'Ви заблокували $user'; + } + + @override + String youHaveWithdrawnTheInvitationFor(String user) { + return 'Ви відкликали запрошення для $user'; + } + + @override + String youInvitedToBy(String alias) { + return '📩 Вас запрошено за посиланням на:\n$alias'; + } + + @override + String youInvitedBy(String user) { + return '📩 Ви були запрошені $user'; + } + + @override + String invitedBy(String user) { + return '📩 Запрошений $user'; + } + + @override + String youInvitedUser(String user) { + return '📩 Ви запросили $user'; + } + + @override + String youKicked(String user) { + return '👞 Ви вилучили $user'; + } + + @override + String youKickedAndBanned(String user) { + return '🙅 Ви вилучили й заблокували $user'; + } + + @override + String youUnbannedUser(String user) { + return 'Ви розблокували $user'; + } + + @override + String hasKnocked(String user) { + return '🚪$user стукає до вас'; + } + + @override + String get usersMustKnock => 'Користувачі повинні постукатись'; + + @override + String get noOneCanJoin => 'Ніхто не може приєднатись'; + + @override + String userWouldLikeToChangeTheChat(String user) { + return '$user хоче приєднатися до бесіди.'; + } + + @override + String get noPublicLinkHasBeenCreatedYet => + 'Загальнодоступне посилання ще не створено'; + + @override + String get knock => 'Постукатись'; + + @override + String get users => 'Користувачі'; + + @override + String get unlockOldMessages => 'Розблокувати старі повідомлення'; + + @override + String get storeInSecureStorageDescription => + 'Збережіть ключ відновлення в безпечному сховищі цього пристрою.'; + + @override + String get saveKeyManuallyDescription => + 'Збережіть цей ключ вручну, запустивши діалогове вікно спільного доступу до системи або буфер обміну.'; + + @override + String get storeInAndroidKeystore => 'Зберегти в Android KeyStore'; + + @override + String get storeInAppleKeyChain => 'Зберегти в Apple KeyChain'; + + @override + String get storeSecurlyOnThisDevice => 'Зберегти безпечно на цей пристрій'; + + @override + String countFiles(int count) { + return '$count файлів'; + } + + @override + String get user => 'Користувач'; + + @override + String get custom => 'Користувацький'; + + @override + String get foregroundServiceRunning => + 'Це сповіщення з\'являється під час роботи основної служби.'; + + @override + String get screenSharingTitle => 'спільний доступ до екрана'; + + @override + String get screenSharingDetail => 'Ви ділитеся своїм екраном FuffyChat'; + + @override + String get callingPermissions => 'Дозволи на виклик'; + + @override + String get callingAccount => 'Обліковий запис для виклику'; + + @override + String get callingAccountDetails => + 'Дозволяє FluffyChat використовувати основний застосунок Android для набору номера.'; + + @override + String get appearOnTop => 'З\'являтися зверху'; + + @override + String get appearOnTopDetails => + 'Дозволяє застосунку показуватися зверху (не потрібно, якщо Fluffychat вже налаштований обліковим записом для викликів)'; + + @override + String get otherCallingPermissions => + 'Мікрофон, камера та інші дозволи FluffyChat'; + + @override + String get whyIsThisMessageEncrypted => 'Чому це повідомлення нечитабельне?'; + + @override + String get noKeyForThisMessage => + 'Це може статися, якщо повідомлення було надіслано до того, як ви ввійшли у свій обліковий запис на цьому пристрої.\n\nТакож можливо, що відправник заблокував ваш пристрій або щось пішло не так з під\'єднанням до інтернету.\n\nЧи можете ви прочитати повідомлення на іншому сеансі? Тоді ви зможете перенести повідомлення з нього! Перейдіть до Налаштування > Пристрої та переконайтеся, що ваші пристрої перевірили один одного. Коли ви відкриєте кімнату наступного разу й обидва сеанси будуть на активні, ключі будуть передані автоматично.\n\nВи ж не хочете втрачати ключі після виходу або зміни пристроїв? Переконайтеся, що ви ввімкнули резервне копіювання бесід у налаштуваннях.'; + + @override + String get newGroup => 'Нова група'; + + @override + String get newSpace => 'Новий простір'; + + @override + String get enterSpace => 'Увійти в простір'; + + @override + String get enterRoom => 'Увійти в кімнату'; + + @override + String get allSpaces => 'Усі простори'; + + @override + String numChats(String number) { + return '$number бесід'; + } + + @override + String get hideUnimportantStateEvents => 'Сховати неважливі державні свята'; + + @override + String get hidePresences => 'Сховати список станів?'; + + @override + String get doNotShowAgain => 'Не показувати знову'; + + @override + String wasDirectChatDisplayName(String oldDisplayName) { + return 'Порожня бесіда (раніше $oldDisplayName)'; + } + + @override + String get newSpaceDescription => + 'Простори дозволяють об\'єднувати ваші бесіди та створювати приватні або загальнодоступні спільноти.'; + + @override + String get encryptThisChat => 'Зашифрувати цю бесіду'; + + @override + String get disableEncryptionWarning => + 'З міркувань безпеки ви не можете вимкнути шифрування в бесіді, ув якій воно було ввімкнене раніше.'; + + @override + String get sorryThatsNotPossible => 'Вибачте... це неможливо'; + + @override + String get deviceKeys => 'Ключі пристрою:'; + + @override + String get reopenChat => 'Відновити бесіду'; + + @override + String get noBackupWarning => + 'Увага! Якщо ви не ввімкнете резервне копіювання бесіди, ви втратите доступ до своїх зашифрованих повідомлень. Наполегливо радимо ввімкнути резервне копіювання бесіди перед виходом.'; + + @override + String get noOtherDevicesFound => 'Інших пристроїв не знайдено'; + + @override + String fileIsTooBigForServer(String max) { + return 'Не вдалося надіслати! Сервер підтримує вкладення розміром до $max.'; + } + + @override + String fileHasBeenSavedAt(String path) { + return 'Файл збережено в $path'; + } + + @override + String get jumpToLastReadMessage => + 'Перейти до останнього прочитаного повідомлення'; + + @override + String get readUpToHere => 'Читати тут'; + + @override + String get jump => 'Перейти'; + + @override + String get openLinkInBrowser => 'Відкрити посилання у браузері'; + + @override + String get reportErrorDescription => + 'О, ні. Щось пішло не так. Якщо хочете, можете повідомити про помилку розробникам.'; + + @override + String get report => 'повідомити'; + + @override + String get signInWithPassword => 'Увійти за допомогою пароля'; + + @override + String get pleaseTryAgainLaterOrChooseDifferentServer => + 'Спробуйте пізніше або виберіть інший сервер.'; + + @override + String signInWith(String provider) { + return 'Увійти через $provider'; + } + + @override + String get profileNotFound => + 'Не вдалося знайти користувача на сервері. Можливо, проблема зі з\'єднанням або користувач не існує.'; + + @override + String get setTheme => 'Налаштувати тему:'; + + @override + String get setColorTheme => 'Налаштувати колірну тему:'; + + @override + String get invite => 'Запросити'; + + @override + String get inviteGroupChat => '📨 Запросити до групової бесіди'; + + @override + String get invitePrivateChat => '📨 Запросити до приватної бесіди'; + + @override + String get invalidInput => 'Недійсний ввід!'; + + @override + String wrongPinEntered(int seconds) { + return 'Введено неправильний PIN! Повторіть спробу за $seconds секунд...'; + } + + @override + String get pleaseEnterANumber => 'Введіть число більше ніж 0'; + + @override + String get archiveRoomDescription => + 'Бесіду буде переміщено до архіву. Інші користувачі зможуть побачити, що ви вийшли з неї.'; + + @override + String get roomUpgradeDescription => + 'Після цього бесіду буде відтворено з новою версією кімнати. Усі учасники отримають сповіщення, що їм потрібно перейти до нової бесіди. Ви можете дізнатися більше про версії кімнат на https://spec.matrix.org/latest/rooms/'; + + @override + String get removeDevicesDescription => + 'Ви вийдете з цього пристрою і більше не зможете отримувати повідомлення.'; + + @override + String get banUserDescription => + 'Користувача буде заблоковано в бесіді, і він не зможе знову увійти в неї, поки його не буде розблоковано.'; + + @override + String get unbanUserDescription => + 'Користувач зможе знову увійти в бесіду, якщо спробує.'; + + @override + String get kickUserDescription => + 'Користувача вигнали з бесіди, але не заблокували. До загальнодоступних бесід користувач може приєднатися будь-коли.'; + + @override + String get makeAdminDescription => + 'Після того, як ви зробите цього користувача адміністратором, ви, можливо, не зможете це скасувати, оскільки він матиме ті самі права, що й ви.'; + + @override + String get pushNotificationsNotAvailable => 'Push-сповіщення недоступні'; + + @override + String get learnMore => 'Докладніше'; + + @override + String get yourGlobalUserIdIs => 'Ваш глобальний ID користувача: '; + + @override + String noUsersFoundWithQuery(String query) { + return 'На жаль, не знайдено жодного користувача з запитом \"$query\".Перевірте, чи не було допущено помилки.'; + } + + @override + String get knocking => 'Стукаються'; + + @override + String chatCanBeDiscoveredViaSearchOnServer(String server) { + return 'Бесіду можна знайти за допомогою пошуку на $server'; + } + + @override + String get searchChatsRooms => 'Пошук для #chats, @users...'; + + @override + String get nothingFound => 'Нічого не знайдено...'; + + @override + String get groupName => 'Назва групи'; + + @override + String get createGroupAndInviteUsers => + 'Створити групу та запросити користувачів'; + + @override + String get groupCanBeFoundViaSearch => 'Групу можна знайти через пошук'; + + @override + String get wrongRecoveryKey => + 'Вибачте... схоже, це неправильний ключ відновлення.'; + + @override + String get startConversation => 'Розпочати розмову'; + + @override + String get commandHint_sendraw => 'Надіслати необроблений json'; + + @override + String get databaseMigrationTitle => 'Базу даних оптимізовано'; + + @override + String get databaseMigrationBody => + 'Зачекайте, будь ласка. Це може тривати деякий час.'; + + @override + String get leaveEmptyToClearStatus => 'Лишіть порожнім, щоб оновити статус.'; + + @override + String get select => 'Вибрати'; + + @override + String get searchForUsers => 'Пошук @користувачів...'; + + @override + String get pleaseEnterYourCurrentPassword => 'Введіть поточний пароль'; + + @override + String get newPassword => 'Новий пароль'; + + @override + String get pleaseChooseAStrongPassword => 'Виберіть надійний пароль'; + + @override + String get passwordsDoNotMatch => 'Паролі відрізняються'; + + @override + String get passwordIsWrong => 'Введений пароль неправильний'; + + @override + String get publicLink => 'Загальнодоступне посилання'; + + @override + String get publicChatAddresses => 'Адреси загальнодоступної бесіди'; + + @override + String get createNewAddress => 'Створити нову адресу'; + + @override + String get joinSpace => 'Приєднатися до простору'; + + @override + String get publicSpaces => 'Загальнодоступний простір'; + + @override + String get addChatOrSubSpace => 'Додати бесіду або підпростір'; + + @override + String get subspace => 'Підпростір'; + + @override + String get decline => 'Відхилити'; + + @override + String get thisDevice => 'Цей пристрій:'; + + @override + String get initAppError => 'Виникла помилка під час запуску застосунку'; + + @override + String get userRole => 'Роль користувача'; + + @override + String minimumPowerLevel(String level) { + return '$level — це найнижчий рівень повноважень.'; + } + + @override + String searchIn(String chat) { + return 'Пошук у бесіді \"$chat\"...'; + } + + @override + String get searchMore => 'Шукати ще...'; + + @override + String get gallery => 'Галерея'; + + @override + String get files => 'Файли'; + + @override + String databaseBuildErrorBody(String url, String error) { + return 'Не вдалося створити базу даних SQlite. Застосунок намагається використовувати стару базу даних. Будь ласка, повідомте про цю помилку розробникам за адресою $url. Текст помилки: $error'; + } + + @override + String sessionLostBody(String url, String error) { + return 'Ваш сеанс втрачено. Будь ласка, повідомте про цю помилку розробникам за адресою $url. Текст помилки: $error'; + } + + @override + String restoreSessionBody(String url, String error) { + return 'Наразі застосунок намагається відновити ваш сеанс з резервної копії. Будь ласка, повідомте про цю помилку розробникам за адресою $url. Текст помилки: $error'; + } + + @override + String forwardMessageTo(String roomName) { + return 'Переслати повідомлення до $roomName?'; + } + + @override + String get sendReadReceipts => 'Надіслати підтвердження прочитання'; + + @override + String get sendTypingNotificationsDescription => + 'Інші учасники бесіди бачитимуть, коли ви набираєте нове повідомлення.'; + + @override + String get sendReadReceiptsDescription => + 'Інші учасники бесіди бачитимуть, що ви прочитали повідомлення.'; + + @override + String get formattedMessages => 'Форматовані повідомлення'; + + @override + String get formattedMessagesDescription => + 'Показувати розширений вміст повідомлень, наприклад, жирний текст, використовуючи markdown.'; + + @override + String get verifyOtherUser => '🔐 Звірити іншого користувача'; + + @override + String get verifyOtherUserDescription => + 'Якщо ви звіряєте іншого користувача, ви можете бути впевнені, що знаєте, кому ви насправді пишете. 💪\n\nКоли ви почнете звірення, ви та інший користувач побачите спливне вікно в застосунку. Там ви побачите набір смайликів або чисел, які вам потрібно буде порівняти між собою.\n\nНайкращий спосіб зробити це — зустрітися або розпочати відеовиклик. 👭'; + + @override + String get verifyOtherDevice => '🔐 Звірити інший пристрій'; + + @override + String get verifyOtherDeviceDescription => + 'Коли ви звіряєте інший пристрій, ці пристрої можуть обмінюватися ключами, підвищуючи вашу загальну безпеку. 💪 Коли ви розпочнете звірення, в застосунку на обох пристроях з\'явиться спливне вікно. Там ви побачите набір смайликів або чисел, які вам потрібно буде порівняти між собою. Найкраще мати обидва пристрої під рукою перед початком звірення. 🤳'; + + @override + String acceptedKeyVerification(String sender) { + return '$sender погоджується звірити ключі'; + } + + @override + String canceledKeyVerification(String sender) { + return '$sender скасовує звірення ключів'; + } + + @override + String completedKeyVerification(String sender) { + return '$sender завершує звірення ключів'; + } + + @override + String isReadyForKeyVerification(String sender) { + return '$sender готовий до звірення ключів'; + } + + @override + String requestedKeyVerification(String sender) { + return '$sender просить звірити ключі'; + } + + @override + String startedKeyVerification(String sender) { + return '$sender розпочинає звірення ключів'; + } + + @override + String get transparent => 'Прозорий'; + + @override + String get incomingMessages => 'Вхідні повідомлення'; + + @override + String get stickers => 'Наліпки'; + + @override + String get discover => 'Огляд'; + + @override + String get commandHint_ignore => 'Ігнорувати цей Matrix ID'; + + @override + String get commandHint_unignore => 'Не ігнорувати цей Matrix ID'; + + @override + String unreadChatsInApp(String appname, String unread) { + return '$appname: $unread непрочитаних бесід'; + } + + @override + String get noDatabaseEncryption => + 'Шифрування бази даних не підтримується на цій платформі'; + + @override + String thereAreCountUsersBlocked(Object count) { + return 'Наразі заблоковано $count користувачів.'; + } + + @override + String get restricted => 'Обмежено'; + + @override + String get knockRestricted => 'Стук обмежено'; + + @override + String goToSpace(Object space) { + return 'Перейти до простору: $space'; + } + + @override + String get markAsUnread => 'Позначити непрочитаним'; + + @override + String userLevel(int level) { + return '$level - Користувач'; + } + + @override + String moderatorLevel(int level) { + return '$level - Модератор'; + } + + @override + String adminLevel(int level) { + return '$level - Адміністратор'; + } + + @override + String get changeGeneralChatSettings => 'Змінити загальні налаштування чату'; + + @override + String get inviteOtherUsers => 'Запросити інших користувачів до цього чату'; + + @override + String get changeTheChatPermissions => 'Змінити права доступу до чату'; + + @override + String get changeTheVisibilityOfChatHistory => + 'Змінити видимість історії чату'; + + @override + String get changeTheCanonicalRoomAlias => + 'Змінити основну адресу загальнодоступного чату'; + + @override + String get sendRoomNotifications => 'Надсилати сповіщення @room'; + + @override + String get changeTheDescriptionOfTheGroup => 'Змінити опис чату'; + + @override + String get chatPermissionsDescription => + 'Визначте, який рівень повноважень необхідний для певних дій у цьому чаті. Рівні повноважень 0, 50 і 100 зазвичай представляють користувачів, модераторів та адміністраторів, але можливі будь-які градації.'; + + @override + String updateInstalled(String version) { + return '🎉 Оновлення $version встановлено!'; + } + + @override + String get changelog => 'Зміни'; + + @override + String get sendCanceled => 'Надсилання скасовано'; + + @override + String get loginWithMatrixId => 'Увійти за допомогою Matrix-ID'; + + @override + String get discoverHomeservers => 'Знайти домашні сервери'; + + @override + String get whatIsAHomeserver => 'Що таке домашній сервер?'; + + @override + String get homeserverDescription => + 'Усі ваші дані зберігаються на домашньому сервері, так само як у постачальника послуг електронної пошти. Ви можете вибрати, який домашній сервер ви хочете використовувати, водночас ви можете спілкуватися з усіма. Докладніше на https://matrix.org.'; + + @override + String get doesNotSeemToBeAValidHomeserver => + 'Здається, це несумісний домашній сервер. Неправильна URL-адреса?'; + + @override + String get calculatingFileSize => 'Обчислення розміру файлу...'; + + @override + String get prepareSendingAttachment => + 'Підготовка до надсилання вкладення...'; + + @override + String get sendingAttachment => 'Надсилання вкладення...'; + + @override + String get generatingVideoThumbnail => 'Генерування мініатюри відео...'; + + @override + String get compressVideo => 'Стиснення відео...'; + + @override + String sendingAttachmentCountOfCount(int index, int length) { + return 'Надсилання вкладення $index з $length...'; + } + + @override + String serverLimitReached(int seconds) { + return 'Досягнуто ліміту сервера! Очікування $seconds секунд...'; + } + + @override + String get oneOfYourDevicesIsNotVerified => + 'Один із ваших пристроїв не верифікований'; + + @override + String get noticeChatBackupDeviceVerification => + 'Примітка: Коли ви під\'єднуєте всі свої пристрої до резервної копії бесіди, вони автоматично верифікуються.'; + + @override + String get continueText => 'Продовжити'; + + @override + String get welcomeText => + 'Привіт-привіт 👋 Це FluffyChat. Ви можете увійти на будь-який сервер, сумісний із https://matrix.org. А потім спілкуватися з будь-ким. Це величезна децентралізована мережа для обміну повідомленнями!'; + + @override + String get blur => 'Розмиття:'; + + @override + String get opacity => 'Прозорість:'; + + @override + String get setWallpaper => 'Встановити шпалери'; + + @override + String get manageAccount => 'Керувати обліковим записом'; + + @override + String get noContactInformationProvided => + 'Сервер не надає жодної дійсної контактної інформації'; + + @override + String get contactServerAdmin => 'Зв’язатися з адміністратором сервера'; + + @override + String get contactServerSecurity => 'Зв’язатися з відділом безпеки сервера'; + + @override + String get supportPage => 'Сторінка підтримки'; + + @override + String get serverInformation => 'Інформація про сервер:'; + + @override + String get name => 'Ім\'я'; + + @override + String get version => 'Версія'; + + @override + String get website => 'Вебсайт'; + + @override + String get compress => 'Стиснути'; + + @override + String get boldText => 'Жирний текст'; + + @override + String get italicText => 'Курсивний текст'; + + @override + String get strikeThrough => 'Перекреслений текст'; + + @override + String get pleaseFillOut => 'Будь ласка, заповніть'; + + @override + String get invalidUrl => 'Недійсний URL'; + + @override + String get addLink => 'Додати посилання'; + + @override + String get unableToJoinChat => + 'Неможливо приєднатися до бесіди. Можливо, інша сторона вже закрила розмову.'; + + @override + String get previous => 'Попередній'; + + @override + String get otherPartyNotLoggedIn => + 'Інша сторона наразі не увійшла в систему, тому не може отримувати повідомлення!'; + + @override + String appWantsToUseForLogin(String server) { + return 'Використати \'$server\', щоб увійти'; + } + + @override + String get appWantsToUseForLoginDescription => + 'Цим ви дозволяєте застосунку та вебсайту ділитися інформацією про вас.'; + + @override + String get open => 'Відкрити'; + + @override + String get waitingForServer => 'Очікування сервера...'; + + @override + String get appIntroduction => + 'FluffyChat дає змогу спілкуватися з друзями у різних месенджерах. Дізнайтеся більше на https://matrix.org або просто натисніть *Продовжити*.'; + + @override + String get newChatRequest => '📩 Новий запит на спілкування'; + + @override + String get contentNotificationSettings => 'Налаштування сповіщень про вміст'; + + @override + String get generalNotificationSettings => 'Загальні налаштування сповіщень'; + + @override + String get roomNotificationSettings => 'Налаштування сповіщень кімнати'; + + @override + String get userSpecificNotificationSettings => + 'Налаштування сповіщень для користувача'; + + @override + String get otherNotificationSettings => 'Інші налаштування сповіщень'; + + @override + String get notificationRuleContainsUserName => 'Містить ім\'я користувача'; + + @override + String get notificationRuleContainsUserNameDescription => + 'Сповіщає користувача, коли повідомлення містить його ім\'я користувача.'; + + @override + String get notificationRuleMaster => 'Вимкнути всі сповіщення'; + + @override + String get notificationRuleMasterDescription => + 'Перевизначає всі інші правила і вимикає всі сповіщення.'; + + @override + String get notificationRuleSuppressNotices => + 'Заборонити автоматичні повідомлення'; + + @override + String get notificationRuleSuppressNoticesDescription => + 'Забороняє сповіщення від автоматизованих клієнтів, таких як боти.'; + + @override + String get notificationRuleInviteForMe => 'Запрошення мене'; + + @override + String get notificationRuleInviteForMeDescription => + 'Сповіщає користувача, коли його запрошують до кімнати.'; + + @override + String get notificationRuleMemberEvent => 'Події участі'; + + @override + String get notificationRuleMemberEventDescription => + 'Забороняє сповіщення про події учасників.'; + + @override + String get notificationRuleIsUserMention => 'Згадки користувачів'; + + @override + String get notificationRuleIsUserMentionDescription => + 'Сповіщає користувачів, коли безпосередньо їх згадують у повідомленні.'; + + @override + String get notificationRuleContainsDisplayName => 'Містить показуване ім’я'; + + @override + String get notificationRuleContainsDisplayNameDescription => + 'Сповіщає користувача, коли повідомлення містить показуване ім\'я.'; + + @override + String get notificationRuleIsRoomMention => 'Згадки кімнати'; + + @override + String get notificationRuleIsRoomMentionDescription => + 'Сповіщає користувача, коли є згадка всієї кімнати.'; + + @override + String get notificationRuleRoomnotif => 'Сповіщення кімнати'; + + @override + String get notificationRuleRoomnotifDescription => + 'Сповіщає користувача, коли повідомлення містить \'@room\'.'; + + @override + String get notificationRuleTombstone => 'Tombstone'; + + @override + String get notificationRuleTombstoneDescription => + 'Notifies the user about room deactivation messages.'; + + @override + String get notificationRuleReaction => 'Reaction'; + + @override + String get notificationRuleReactionDescription => + 'Suppresses notifications for reactions.'; + + @override + String get notificationRuleRoomServerAcl => 'Room Server ACL'; + + @override + String get notificationRuleRoomServerAclDescription => + 'Suppresses notifications for room server access control lists (ACL).'; + + @override + String get notificationRuleSuppressEdits => 'Suppress Edits'; + + @override + String get notificationRuleSuppressEditsDescription => + 'Suppresses notifications for edited messages.'; + + @override + String get notificationRuleCall => 'Call'; + + @override + String get notificationRuleCallDescription => + 'Notifies the user about calls.'; + + @override + String get notificationRuleEncryptedRoomOneToOne => + 'Encrypted Room One-to-One'; + + @override + String get notificationRuleEncryptedRoomOneToOneDescription => + 'Notifies the user about messages in encrypted one-to-one rooms.'; + + @override + String get notificationRuleRoomOneToOne => 'Room One-to-One'; + + @override + String get notificationRuleRoomOneToOneDescription => + 'Notifies the user about messages in one-to-one rooms.'; + + @override + String get notificationRuleMessage => 'Message'; + + @override + String get notificationRuleMessageDescription => + 'Notifies the user about general messages.'; + + @override + String get notificationRuleEncrypted => 'Encrypted'; + + @override + String get notificationRuleEncryptedDescription => + 'Notifies the user about messages in encrypted rooms.'; + + @override + String get notificationRuleJitsi => 'Jitsi'; + + @override + String get notificationRuleJitsiDescription => + 'Notifies the user about Jitsi widget events.'; + + @override + String get notificationRuleServerAcl => 'Suppress Server ACL Events'; + + @override + String get notificationRuleServerAclDescription => + 'Suppresses notifications for Server ACL events.'; + + @override + String unknownPushRule(String rule) { + return 'Unknown push rule \'$rule\''; + } + + @override + String get deletePushRuleCanNotBeUndone => + 'If you delete this notification setting, this can not be undone.'; + + @override + String get more => 'More'; + + @override + String get shareKeysWith => 'Share keys with...'; + + @override + String get shareKeysWithDescription => + 'Яким пристроям довіряти, щоб вони могли читати ваші повідомлення в зашифрованих бесідах?'; + + @override + String get allDevices => 'Усім пристроям'; + + @override + String get crossVerifiedDevicesIfEnabled => + 'З перехресною верифікацією пристроїв, якщо ввімкнено'; + + @override + String get crossVerifiedDevices => 'З перехресною верифікацією пристроїв'; + + @override + String get verifiedDevicesOnly => 'Лише верифіковані пристрої'; + + @override + String get takeAPhoto => 'Take a photo'; + + @override + String get recordAVideo => 'Record a video'; + + @override + String get optionalMessage => '(Optional) message...'; + + @override + String get notSupportedOnThisDevice => 'Not supported on this device'; + + @override + String get enterNewChat => 'Enter new chat'; + + @override + String get approve => 'Approve'; + + @override + String get youHaveKnocked => 'You have knocked'; + + @override + String get pleaseWaitUntilInvited => + 'Please wait now, until someone from the room invites you.'; +} diff --git a/lib/generated/l10n/l10n_vi.dart b/lib/generated/l10n/l10n_vi.dart new file mode 100644 index 0000000..c749c7f --- /dev/null +++ b/lib/generated/l10n/l10n_vi.dart @@ -0,0 +1,2744 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'l10n.dart'; + +// ignore_for_file: type=lint + +/// The translations for Vietnamese (`vi`). +class L10nVi extends L10n { + L10nVi([String locale = 'vi']) : super(locale); + + @override + String get noSendPermission => 'You can\'t send messages here'; + + @override + String get alwaysUse24HourFormat => 'Không'; + + @override + String get repeatPassword => 'Nhập lại mật khẩu'; + + @override + String get notAnImage => 'Không phải tệp ảnh.'; + + @override + String get setCustomPermissionLevel => 'Set custom permission level'; + + @override + String get setPermissionsLevelDescription => + 'Please choose a predefined role below or enter a custom permission level between 0 and 100.'; + + @override + String get ignoreUser => 'Ignore user'; + + @override + String get normalUser => 'Normal user'; + + @override + String get remove => 'Loại bỏ'; + + @override + String get importNow => 'Nhập vào'; + + @override + String get importEmojis => 'Nhập Biểu cảm'; + + @override + String get importFromZipFile => 'Nhập vào từ tệp .zip'; + + @override + String get exportEmotePack => 'Xuất gói biểu cảm bằng tệp .zip'; + + @override + String get replace => 'Thay thế'; + + @override + String get about => 'Giới thiệu'; + + @override + String aboutHomeserver(String homeserver) { + return 'Về $homeserver'; + } + + @override + String get accept => 'Đồng ý'; + + @override + String acceptedTheInvitation(String username) { + return '$username đã đồng ý lời mời'; + } + + @override + String get account => 'Tài khoản'; + + @override + String activatedEndToEndEncryption(String username) { + return '$username đã kích hoạt mã hóa đầu cuối 2 chiều'; + } + + @override + String get addEmail => 'Thêm email'; + + @override + String get confirmMatrixId => 'Hãy xác nhận Matrix ID để xoá tài khoản.'; + + @override + String supposedMxid(String mxid) { + return 'Đây nên là $mxid'; + } + + @override + String get addChatDescription => 'Thêm mô tả hội thoại...'; + + @override + String get addToSpace => 'Thêm vào không gian'; + + @override + String get admin => 'Quản trị viên'; + + @override + String get alias => 'bí danh'; + + @override + String get all => 'Tất cả'; + + @override + String get allChats => 'Tất cả hội thoại'; + + @override + String get commandHint_roomupgrade => + 'Upgrade this room to the given room version'; + + @override + String get commandHint_googly => 'Send some googly eyes'; + + @override + String get commandHint_cuddle => 'Send a cuddle'; + + @override + String get commandHint_hug => 'Gửi một cái ôm'; + + @override + String googlyEyesContent(String senderName) { + return '$senderName sends you googly eyes'; + } + + @override + String cuddleContent(String senderName) { + return '$senderName cuddles you'; + } + + @override + String hugContent(String senderName) { + return '$senderName ôm bạn'; + } + + @override + String answeredTheCall(String senderName) { + return '$senderName đã trả lời cuộc gọi'; + } + + @override + String get anyoneCanJoin => 'Mọi người đều có thể gia nhập'; + + @override + String get appLock => 'Khoá ứng dụng'; + + @override + String get appLockDescription => 'Khoá ứng dụng khi không dùng bằng mã pin'; + + @override + String get archive => 'Lưu trữ'; + + @override + String get areGuestsAllowedToJoin => 'Khách vãng lai có được tham gia không'; + + @override + String get areYouSure => 'Bạn chắc chứ?'; + + @override + String get areYouSureYouWantToLogout => + 'Bạn có chắc bạn muốn đăng xuất không?'; + + @override + String get askSSSSSign => + 'To be able to sign the other person, please enter your secure store passphrase or recovery key.'; + + @override + String askVerificationRequest(String username) { + return 'Bạn có đồng ý yêu cầu chứng thực từ $username không?'; + } + + @override + String get autoplayImages => + 'Automatically play animated stickers and emotes'; + + @override + String badServerLoginTypesException(String serverVersions, + String supportedVersions, Object suportedVersions) { + return 'Máy chủ nhà hỗ trợ kiểu đăng nhập:\n$serverVersions\nNhưng ứng dụng này chỉ hỗ trợ:\n$supportedVersions'; + } + + @override + String get sendTypingNotifications => 'Send typing notifications'; + + @override + String get swipeRightToLeftToReply => 'Swipe right to left to reply'; + + @override + String get sendOnEnter => 'Send on enter'; + + @override + String badServerVersionsException(String serverVersions, + String supportedVersions, Object serverVerions, Object suportedVersions) { + return 'Máy chủ nhà hỗ trợ Spec phiên bản:\n$serverVerions\nNhưng ứng dụng này chỉ hỗ trợ $supportedVersions'; + } + + @override + String countChatsAndCountParticipants(int chats, int participants) { + return '$chats chats and $participants participants'; + } + + @override + String get noMoreChatsFound => 'No more chats found...'; + + @override + String get noChatsFoundHere => + 'No chats found here yet. Start a new chat with someone by using the button below. ⤵️'; + + @override + String get joinedChats => 'Joined chats'; + + @override + String get unread => 'Unread'; + + @override + String get space => 'Space'; + + @override + String get spaces => 'Spaces'; + + @override + String get banFromChat => 'Cấm khỏi cuộc trò chuyện'; + + @override + String get banned => 'Đã bị cấm'; + + @override + String bannedUser(String username, String targetName) { + return '$username đã cấm $targetName'; + } + + @override + String get blockDevice => 'Thiết bị bị chặn'; + + @override + String get blocked => 'Đã chặn'; + + @override + String get botMessages => 'Bot messages'; + + @override + String get cancel => 'Hủy'; + + @override + String cantOpenUri(String uri) { + return 'Can\'t open the URI $uri'; + } + + @override + String get changeDeviceName => 'Thay đổi tên thiết bị'; + + @override + String changedTheChatAvatar(String username) { + return '$username đã thay đổi ảnh phòng chat'; + } + + @override + String changedTheChatDescriptionTo(String username, String description) { + return '$username đã thay đổi mô tả phòng chat thành: \'$description\''; + } + + @override + String changedTheChatNameTo(String username, String chatname) { + return '$username đã thay đổi tên phòng chat thành: \'$chatname\''; + } + + @override + String changedTheChatPermissions(String username) { + return '$username đã thay đổi quyền trong phòng chat'; + } + + @override + String changedTheDisplaynameTo(String username, String displayname) { + return '$username changed their displayname to: \'$displayname\''; + } + + @override + String changedTheGuestAccessRules(String username) { + return '$username đã thay đổi quy tắc truy cập đối với khách'; + } + + @override + String changedTheGuestAccessRulesTo(String username, String rules) { + return '$username đã thay đổi quy tắc truy cập đối với khách thành: $rules'; + } + + @override + String changedTheHistoryVisibility(String username) { + return '$username changed the history visibility'; + } + + @override + String changedTheHistoryVisibilityTo(String username, String rules) { + return '$username changed the history visibility to: $rules'; + } + + @override + String changedTheJoinRules(String username) { + return '$username changed the join rules'; + } + + @override + String changedTheJoinRulesTo(String username, String joinRules) { + return '$username changed the join rules to: $joinRules'; + } + + @override + String changedTheProfileAvatar(String username) { + return '$username đã thay đổi ảnh đại diện của mình'; + } + + @override + String changedTheRoomAliases(String username) { + return '$username đã đổi địa chỉ phòng chat'; + } + + @override + String changedTheRoomInvitationLink(String username) { + return '$username đã thay đổi đường dẫn mời'; + } + + @override + String get changePassword => 'Thay đổi mật khẩu'; + + @override + String get changeTheHomeserver => 'Thay đổi máy chủ nhà'; + + @override + String get changeTheme => 'Change your style'; + + @override + String get changeTheNameOfTheGroup => 'Thay đổi tên nhóm'; + + @override + String get changeYourAvatar => 'Change your avatar'; + + @override + String get channelCorruptedDecryptError => + 'The encryption has been corrupted'; + + @override + String get chat => 'Chat'; + + @override + String get yourChatBackupHasBeenSetUp => 'Your chat backup has been set up.'; + + @override + String get chatBackup => 'Sao lưu cuộc trò chuyện'; + + @override + String get chatBackupDescription => + 'Bản sao lưu cuộc trò chuyện của bạn được bảo mật bằng một khoá bảo mật. Bạn đừng làm mất nó.'; + + @override + String get chatDetails => 'Chi tiết cuộc trò chuyện'; + + @override + String get chatHasBeenAddedToThisSpace => 'Chat has been added to this space'; + + @override + String get chats => 'Chats'; + + @override + String get chooseAStrongPassword => 'Chọn một mật khẩu mạnh'; + + @override + String get clearArchive => 'Clear archive'; + + @override + String get close => 'Đóng'; + + @override + String get commandHint_markasdm => + 'Mark as direct message room for the giving Matrix ID'; + + @override + String get commandHint_markasgroup => 'Mark as group'; + + @override + String get commandHint_ban => 'Ban the given user from this room'; + + @override + String get commandHint_clearcache => 'Clear cache'; + + @override + String get commandHint_create => + 'Create an empty group chat\nUse --no-encryption to disable encryption'; + + @override + String get commandHint_discardsession => 'Discard session'; + + @override + String get commandHint_dm => + 'Start a direct chat\nUse --no-encryption to disable encryption'; + + @override + String get commandHint_html => 'Send HTML-formatted text'; + + @override + String get commandHint_invite => 'Invite the given user to this room'; + + @override + String get commandHint_join => 'Join the given room'; + + @override + String get commandHint_kick => 'Remove the given user from this room'; + + @override + String get commandHint_leave => 'Leave this room'; + + @override + String get commandHint_me => 'Describe yourself'; + + @override + String get commandHint_myroomavatar => + 'Set your picture for this room (by mxc-uri)'; + + @override + String get commandHint_myroomnick => 'Set your display name for this room'; + + @override + String get commandHint_op => + 'Set the given user\'s power level (default: 50)'; + + @override + String get commandHint_plain => 'Send unformatted text'; + + @override + String get commandHint_react => 'Send reply as a reaction'; + + @override + String get commandHint_send => 'Send text'; + + @override + String get commandHint_unban => 'Unban the given user from this room'; + + @override + String get commandInvalid => 'Command invalid'; + + @override + String commandMissing(String command) { + return '$command is not a command.'; + } + + @override + String get compareEmojiMatch => + 'So sánh và đảm bảo các biểu tượng cảm xúc sau đây giống với các biểu tượng trên máy còn lại'; + + @override + String get compareNumbersMatch => + 'So sánh và đảm bảo các số sau đây giống trên máy còn lại'; + + @override + String get configureChat => 'Configure chat'; + + @override + String get confirm => 'Xác nhận'; + + @override + String get connect => 'Kết nối'; + + @override + String get contactHasBeenInvitedToTheGroup => 'Liên hệ đã được mời vào nhóm'; + + @override + String get containsDisplayName => 'Contains display name'; + + @override + String get containsUserName => 'Contains username'; + + @override + String get contentHasBeenReported => + 'The content has been reported to the server admins'; + + @override + String get copiedToClipboard => 'Copied to clipboard'; + + @override + String get copy => 'Sao chép'; + + @override + String get copyToClipboard => 'Copy to clipboard'; + + @override + String couldNotDecryptMessage(String error) { + return 'Không thể giải mã tin nhắn: $error'; + } + + @override + String countParticipants(int count) { + return '$count thành viên'; + } + + @override + String get create => 'Tạo'; + + @override + String createdTheChat(String username) { + return '$username đã tạo cuộc trò chuyện'; + } + + @override + String get createGroup => 'Create group'; + + @override + String get createNewSpace => 'New space'; + + @override + String get currentlyActive => 'Đang hoạt động'; + + @override + String get darkTheme => 'Dark'; + + @override + String dateAndTimeOfDay(String date, String timeOfDay) { + return '$date, $timeOfDay'; + } + + @override + String dateWithoutYear(String month, String day) { + return '$day/$month'; + } + + @override + String dateWithYear(String year, String month, String day) { + return '$day/$month/$year'; + } + + @override + String get deactivateAccountWarning => + 'Việc này sẽ vô hiệu hoá tài khoản của bạn. Điều này không thể đảo ngược được! Bạn chắc là vẫn muốn tiếp tục chứ?'; + + @override + String get defaultPermissionLevel => 'Default permission level for new users'; + + @override + String get delete => 'Xoá'; + + @override + String get deleteAccount => 'Xoá tài khoản'; + + @override + String get deleteMessage => 'Xoá tin nhắn'; + + @override + String get device => 'Thiết bị'; + + @override + String get deviceId => 'Mã xác định thiết bị'; + + @override + String get devices => 'Các thiết bị'; + + @override + String get directChats => 'Direct Chats'; + + @override + String get allRooms => 'All Group Chats'; + + @override + String get displaynameHasBeenChanged => 'Tên hiển thị đã được thay đổi'; + + @override + String get downloadFile => 'Tải ảnh xuống'; + + @override + String get edit => 'Edit'; + + @override + String get editBlockedServers => 'Edit blocked servers'; + + @override + String get chatPermissions => 'Chat permissions'; + + @override + String get editDisplayname => 'Sửa tên hiển thị'; + + @override + String get editRoomAliases => 'Edit room aliases'; + + @override + String get editRoomAvatar => 'Edit room avatar'; + + @override + String get emoteExists => 'Emote already exists!'; + + @override + String get emoteInvalid => 'Invalid emote shortcode!'; + + @override + String get emoteKeyboardNoRecents => + 'Recently-used emotes will appear here...'; + + @override + String get emotePacks => 'Emote packs for room'; + + @override + String get emoteSettings => 'Cài đặt biểu tượng cảm xúc'; + + @override + String get globalChatId => 'Global chat ID'; + + @override + String get accessAndVisibility => 'Access and visibility'; + + @override + String get accessAndVisibilityDescription => + 'Who is allowed to join this chat and how the chat can be discovered.'; + + @override + String get calls => 'Calls'; + + @override + String get customEmojisAndStickers => 'Custom emojis and stickers'; + + @override + String get customEmojisAndStickersBody => + 'Add or share custom emojis or stickers which can be used in any chat.'; + + @override + String get emoteShortcode => 'Emote shortcode'; + + @override + String get emoteWarnNeedToPick => + 'You need to pick an emote shortcode and an image!'; + + @override + String get emptyChat => 'Empty chat'; + + @override + String get enableEmotesGlobally => 'Enable emote pack globally'; + + @override + String get enableEncryption => 'Enable encryption'; + + @override + String get enableEncryptionWarning => + 'You won\'t be able to disable the encryption anymore. Are you sure?'; + + @override + String get encrypted => 'Encrypted'; + + @override + String get encryption => 'Encryption'; + + @override + String get encryptionNotEnabled => 'Encryption is not enabled'; + + @override + String endedTheCall(String senderName) { + return '$senderName ended the call'; + } + + @override + String get enterAnEmailAddress => 'Enter an email address'; + + @override + String get homeserver => 'Homeserver'; + + @override + String get enterYourHomeserver => 'Enter your homeserver'; + + @override + String errorObtainingLocation(String error) { + return 'Error obtaining location: $error'; + } + + @override + String get everythingReady => 'Mọi thứ đã sẵn sàng!'; + + @override + String get extremeOffensive => 'Extremely offensive'; + + @override + String get fileName => 'File name'; + + @override + String get fluffychat => 'Extera'; + + @override + String get fontSize => 'Font size'; + + @override + String get forward => 'Forward'; + + @override + String get fromJoining => 'From joining'; + + @override + String get fromTheInvitation => 'From the invitation'; + + @override + String get goToTheNewRoom => 'Go to the new room'; + + @override + String get group => 'Group'; + + @override + String get chatDescription => 'Chat description'; + + @override + String get chatDescriptionHasBeenChanged => 'Chat description changed'; + + @override + String get groupIsPublic => 'Group is public'; + + @override + String get groups => 'Groups'; + + @override + String groupWith(String displayname) { + return 'Group with $displayname'; + } + + @override + String get guestsAreForbidden => 'Guests are forbidden'; + + @override + String get guestsCanJoin => 'Guests can join'; + + @override + String hasWithdrawnTheInvitationFor(String username, String targetName) { + return '$username has withdrawn the invitation for $targetName'; + } + + @override + String get help => 'Help'; + + @override + String get hideRedactedEvents => 'Hide redacted events'; + + @override + String get hideRedactedMessages => 'Hide redacted messages'; + + @override + String get hideRedactedMessagesBody => + 'If someone redacts a message, this message won\'t be visible in the chat anymore.'; + + @override + String get hideInvalidOrUnknownMessageFormats => + 'Hide invalid or unknown message formats'; + + @override + String get howOffensiveIsThisContent => 'How offensive is this content?'; + + @override + String get id => 'ID'; + + @override + String get identity => 'Identity'; + + @override + String get block => 'Block'; + + @override + String get blockedUsers => 'Blocked users'; + + @override + String get blockListDescription => + 'You can block users who are disturbing you. You won\'t be able to receive any messages or room invites from the users on your personal block list.'; + + @override + String get blockUsername => 'Ignore username'; + + @override + String get iHaveClickedOnLink => 'I have clicked on the link'; + + @override + String get incorrectPassphraseOrKey => 'Incorrect passphrase or recovery key'; + + @override + String get inoffensive => 'Inoffensive'; + + @override + String get inviteContact => 'Invite contact'; + + @override + String inviteContactToGroupQuestion(Object contact, Object groupName) { + return 'Do you want to invite $contact to the chat \"$groupName\"?'; + } + + @override + String inviteContactToGroup(String groupName) { + return 'Invite contact to $groupName'; + } + + @override + String get noChatDescriptionYet => 'No chat description created yet.'; + + @override + String get tryAgain => 'Try again'; + + @override + String get invalidServerName => 'Invalid server name'; + + @override + String get invited => 'Invited'; + + @override + String get redactMessageDescription => + 'The message will be redacted for all participants in this conversation. This cannot be undone.'; + + @override + String get optionalRedactReason => + '(Optional) Reason for redacting this message...'; + + @override + String invitedUser(String username, String targetName) { + return '📩 $username invited $targetName'; + } + + @override + String get invitedUsersOnly => 'Invited users only'; + + @override + String get inviteForMe => 'Invite for me'; + + @override + String inviteText(String username, String link) { + return '$username invited you to Extera.\n1. Visit fluffychat.im and install the app \n2. Sign up or sign in \n3. Open the invite link: \n $link'; + } + + @override + String get isTyping => 'is typing…'; + + @override + String joinedTheChat(String username) { + return '👋 $username joined the chat'; + } + + @override + String get joinRoom => 'Join room'; + + @override + String kicked(String username, String targetName) { + return '👞 $username kicked $targetName'; + } + + @override + String kickedAndBanned(String username, String targetName) { + return '🙅 $username kicked and banned $targetName'; + } + + @override + String get kickFromChat => 'Kick from chat'; + + @override + String lastActiveAgo(String localizedTimeShort) { + return 'Last active: $localizedTimeShort'; + } + + @override + String get leave => 'Leave'; + + @override + String get leftTheChat => 'Left the chat'; + + @override + String get license => 'License'; + + @override + String get lightTheme => 'Light'; + + @override + String loadCountMoreParticipants(int count) { + return 'Load $count more participants'; + } + + @override + String get dehydrate => 'Export session and wipe device'; + + @override + String get dehydrateWarning => + 'This action cannot be undone. Ensure you safely store the backup file.'; + + @override + String get dehydrateTor => 'TOR Users: Export session'; + + @override + String get dehydrateTorLong => + 'For TOR users, it is recommended to export the session before closing the window.'; + + @override + String get hydrateTor => 'TOR Users: Import session export'; + + @override + String get hydrateTorLong => + 'Did you export your session last time on TOR? Quickly import it and continue chatting.'; + + @override + String get hydrate => 'Restore from backup file'; + + @override + String get loadingPleaseWait => 'Loading… Please wait.'; + + @override + String get loadMore => 'Load more…'; + + @override + String get locationDisabledNotice => + 'Location services are disabled. Please enable them to be able to share your location.'; + + @override + String get locationPermissionDeniedNotice => + 'Location permission denied. Please grant them to be able to share your location.'; + + @override + String get login => 'Login'; + + @override + String logInTo(String homeserver) { + return 'Log in to $homeserver'; + } + + @override + String get logout => 'Logout'; + + @override + String get memberChanges => 'Member changes'; + + @override + String get mention => 'Mention'; + + @override + String get messages => 'Messages'; + + @override + String get messagesStyle => 'Messages:'; + + @override + String get moderator => 'Moderator'; + + @override + String get muteChat => 'Mute chat'; + + @override + String get needPantalaimonWarning => + 'Please be aware that you need Pantalaimon to use end-to-end encryption for now.'; + + @override + String get newChat => 'New chat'; + + @override + String get newMessageInFluffyChat => '💬 New message in Extera'; + + @override + String get newVerificationRequest => 'New verification request!'; + + @override + String get next => 'Tiếp'; + + @override + String get no => 'No'; + + @override + String get noConnectionToTheServer => 'No connection to the server'; + + @override + String get noEmotesFound => 'No emotes found. 😕'; + + @override + String get noEncryptionForPublicRooms => + 'Bạn chỉ có thể kích hoạt mã hoá khi phòng này không mở'; + + @override + String get noGoogleServicesWarning => + 'Firebase Cloud Messaging doesn\'t appear to be available on your device. To still receive push notifications, we recommend installing ntfy. With ntfy or another Unified Push provider you can receive push notifications in a data secure way. You can download ntfy from the PlayStore or from F-Droid.'; + + @override + String noMatrixServer(String server1, String server2) { + return '$server1 is no matrix server, use $server2 instead?'; + } + + @override + String get shareInviteLink => 'Share invite link'; + + @override + String get scanQrCode => 'Scan QR code'; + + @override + String get none => 'None'; + + @override + String get noPasswordRecoveryDescription => + 'You have not added a way to recover your password yet.'; + + @override + String get noPermission => 'No permission'; + + @override + String get noRoomsFound => 'No rooms found…'; + + @override + String get notifications => 'Thông báo'; + + @override + String get notificationsEnabledForThisAccount => + 'Notifications enabled for this account'; + + @override + String numUsersTyping(int count) { + return '$count users are typing…'; + } + + @override + String get obtainingLocation => 'Obtaining location…'; + + @override + String get offensive => 'Offensive'; + + @override + String get offline => 'Offline'; + + @override + String get ok => 'Ok'; + + @override + String get online => 'Online'; + + @override + String get onlineKeyBackupEnabled => 'Online Key Backup is enabled'; + + @override + String get oopsPushError => + 'Oops! Unfortunately, an error occurred when setting up the push notifications.'; + + @override + String get oopsSomethingWentWrong => 'Oops, something went wrong…'; + + @override + String get openAppToReadMessages => 'Open app to read messages'; + + @override + String get openCamera => 'Open camera'; + + @override + String get openVideoCamera => 'Open camera for a video'; + + @override + String get oneClientLoggedOut => 'One of your clients has been logged out'; + + @override + String get addAccount => 'Add account'; + + @override + String get editBundlesForAccount => 'Edit bundles for this account'; + + @override + String get addToBundle => 'Add to bundle'; + + @override + String get removeFromBundle => 'Remove from this bundle'; + + @override + String get bundleName => 'Bundle name'; + + @override + String get enableMultiAccounts => + '(BETA) Enable multi accounts on this device'; + + @override + String get openInMaps => 'Open in maps'; + + @override + String get link => 'Link'; + + @override + String get serverRequiresEmail => + 'This server needs to validate your email address for registration.'; + + @override + String get or => 'Or'; + + @override + String get participant => 'Participant'; + + @override + String get passphraseOrKey => 'passphrase or recovery key'; + + @override + String get password => 'Password'; + + @override + String get passwordForgotten => 'Password forgotten'; + + @override + String get passwordHasBeenChanged => 'Password has been changed'; + + @override + String get hideMemberChangesInPublicChats => + 'Hide member changes in public chats'; + + @override + String get hideMemberChangesInPublicChatsBody => + 'Do not show in the chat timeline if someone joins or leaves a public chat to improve readability.'; + + @override + String get overview => 'Overview'; + + @override + String get notifyMeFor => 'Bật thông báo cho'; + + @override + String get passwordRecoverySettings => 'Password recovery settings'; + + @override + String get passwordRecovery => 'Password recovery'; + + @override + String get people => 'People'; + + @override + String get pickImage => 'Pick an image'; + + @override + String get pin => 'Pin'; + + @override + String play(String fileName) { + return 'Play $fileName'; + } + + @override + String get pleaseChoose => 'Please choose'; + + @override + String get pleaseChooseAPasscode => 'Please choose a pass code'; + + @override + String get pleaseClickOnLink => + 'Please click on the link in the email and then proceed.'; + + @override + String get pleaseEnter4Digits => + 'Please enter 4 digits or leave empty to disable app lock.'; + + @override + String get pleaseEnterRecoveryKey => 'Please enter your recovery key:'; + + @override + String get pleaseEnterYourPassword => 'Please enter your password'; + + @override + String get pleaseEnterYourPin => 'Please enter your pin'; + + @override + String get pleaseEnterYourUsername => 'Please enter your username'; + + @override + String get pleaseFollowInstructionsOnWeb => + 'Vui lòng làm theo hướng dẫn trên trang web và bấm tiếp'; + + @override + String get privacy => 'Privacy'; + + @override + String get publicRooms => 'Public Rooms'; + + @override + String get pushRules => 'Push rules'; + + @override + String get reason => 'Reason'; + + @override + String get recording => 'Recording'; + + @override + String redactedBy(String username) { + return 'Redacted by $username'; + } + + @override + String get directChat => 'Direct chat'; + + @override + String redactedByBecause(String username, String reason) { + return 'Redacted by $username because: \"$reason\"'; + } + + @override + String redactedAnEvent(String username) { + return '$username redacted an event'; + } + + @override + String get redactMessage => 'Redact message'; + + @override + String get register => 'Register'; + + @override + String get reject => 'Reject'; + + @override + String rejectedTheInvitation(String username) { + return '$username rejected the invitation'; + } + + @override + String get rejoin => 'Rejoin'; + + @override + String get removeAllOtherDevices => 'Remove all other devices'; + + @override + String removedBy(String username) { + return 'Removed by $username'; + } + + @override + String get removeDevice => 'Remove device'; + + @override + String get unbanFromChat => 'Unban from chat'; + + @override + String get removeYourAvatar => 'Remove your avatar'; + + @override + String get replaceRoomWithNewerVersion => 'Replace room with newer version'; + + @override + String get reply => 'Reply'; + + @override + String get reportMessage => 'Report message'; + + @override + String get translateMessage => 'Translate message'; + + @override + String get translatedMessage => 'Translated message'; + + @override + String get errorTranslatingMessage => + 'An error has occured while translating the message.'; + + @override + String get recoverMessage => 'Recover message'; + + @override + String get recoveredMessage => 'Recovered message'; + + @override + String get errorRecoveringMessage => + 'An error has occured while recovering the message.'; + + @override + String get errorRecoveringMessageNoAdmin => + 'This feature is available on Synapse homeservers only for adminstrators.'; + + @override + String get requestPermission => 'Request permission'; + + @override + String get roomHasBeenUpgraded => 'Room has been upgraded'; + + @override + String get roomVersion => 'Room version'; + + @override + String get saveFile => 'Save file'; + + @override + String get retry => 'Retry'; + + @override + String get search => 'Search'; + + @override + String get security => 'Security'; + + @override + String get recoveryKey => 'Recovery key'; + + @override + String get recoveryKeyLost => 'Recovery key lost?'; + + @override + String seenByUser(String username) { + return 'Seen by $username'; + } + + @override + String get send => 'Send'; + + @override + String get sendAMessage => 'Send a message'; + + @override + String get sendAsText => 'Send as text'; + + @override + String get sendAudio => 'Send audio'; + + @override + String get sendFile => 'Send file'; + + @override + String get sendImage => 'Send image'; + + @override + String sendImages(int count) { + return 'Send $count image'; + } + + @override + String get sendMessages => 'Send messages'; + + @override + String get sendOriginal => 'Send original'; + + @override + String get sendSticker => 'Gửi nhãn dán'; + + @override + String get sendVideo => 'Send video'; + + @override + String sentAFile(String username) { + return '📁 $username sent a file'; + } + + @override + String sentAnAudio(String username) { + return '🎤 $username sent an audio'; + } + + @override + String sentAPicture(String username) { + return '🖼️ $username sent a picture'; + } + + @override + String sentASticker(String username) { + return '😊 $username sent a sticker'; + } + + @override + String sentAVideo(String username) { + return '🎥 $username sent a video'; + } + + @override + String sentCallInformations(String senderName) { + return '$senderName sent call information'; + } + + @override + String get separateChatTypes => 'Separate Direct Chats and Groups'; + + @override + String get setAsCanonicalAlias => 'Set as main alias'; + + @override + String get setCustomEmotes => 'Set custom emotes'; + + @override + String get setChatDescription => 'Set chat description'; + + @override + String get setInvitationLink => 'Set invitation link'; + + @override + String get setPermissionsLevel => 'Set permissions level'; + + @override + String get setStatus => 'Set status'; + + @override + String get settings => 'Cài đặt'; + + @override + String get share => 'Share'; + + @override + String sharedTheLocation(String username) { + return '$username shared their location'; + } + + @override + String get shareLocation => 'Share location'; + + @override + String get showPassword => 'Hiển thị mật khẩu'; + + @override + String get presenceStyle => 'Presence:'; + + @override + String get hideAvatarsInInvites => 'Hide avatars in invites'; + + @override + String get hideAvatarsInInvitesDescription => + 'Do not show room avatars in invites'; + + @override + String get presencesToggle => 'Show status messages from other users'; + + @override + String get pureBlackToggle => 'Pure Black'; + + @override + String get singlesignon => 'Single Sign on'; + + @override + String get skip => 'Skip'; + + @override + String get sourceCode => 'Source code'; + + @override + String get spaceIsPublic => 'Space is public'; + + @override + String get spaceName => 'Space name'; + + @override + String startedACall(String senderName) { + return '$senderName started a call'; + } + + @override + String get startFirstChat => 'Start your first chat'; + + @override + String get status => 'Status'; + + @override + String get statusExampleMessage => 'How are you today?'; + + @override + String get submit => 'Submit'; + + @override + String get synchronizingPleaseWait => 'Synchronizing… Please wait.'; + + @override + String synchronizingPleaseWaitCounter(String percentage) { + return ' Synchronizing… ($percentage%)'; + } + + @override + String get systemTheme => 'System'; + + @override + String get theyDontMatch => 'They Don\'t Match'; + + @override + String get theyMatch => 'They Match'; + + @override + String get title => 'Extera'; + + @override + String get toggleFavorite => 'Toggle Favorite'; + + @override + String get toggleMuted => 'Toggle Muted'; + + @override + String get toggleUnread => 'Mark Read/Unread'; + + @override + String get tooManyRequestsWarning => + 'Too many requests. Please try again later!'; + + @override + String get transferFromAnotherDevice => 'Chuyển từ thiết bị khác'; + + @override + String get tryToSendAgain => 'Try to send again'; + + @override + String get unavailable => 'Unavailable'; + + @override + String unbannedUser(String username, String targetName) { + return '$username unbanned $targetName'; + } + + @override + String get unblockDevice => 'Unblock Device'; + + @override + String get unknownDevice => 'Unknown device'; + + @override + String get unknownEncryptionAlgorithm => 'Unknown encryption algorithm'; + + @override + String unknownEvent(String type) { + return 'Unknown event \'$type\''; + } + + @override + String get unmuteChat => 'Unmute chat'; + + @override + String get unpin => 'Unpin'; + + @override + String unreadChats(int unreadCount) { + String _temp0 = intl.Intl.pluralLogic( + unreadCount, + locale: localeName, + other: '$unreadCount unread chats', + one: '1 unread chat', + ); + return '$_temp0'; + } + + @override + String userAndOthersAreTyping(String username, int count) { + return '$username and $count others are typing…'; + } + + @override + String userAndUserAreTyping(String username, String username2) { + return '$username and $username2 are typing…'; + } + + @override + String userIsTyping(String username) { + return '$username is typing…'; + } + + @override + String userLeftTheChat(String username) { + return '🚪 $username left the chat'; + } + + @override + String get username => 'Username'; + + @override + String userSentUnknownEvent(String username, String type) { + return '$username sent a $type event'; + } + + @override + String get unverified => 'Unverified'; + + @override + String get verified => 'Đã xác thực'; + + @override + String get verify => 'Verify'; + + @override + String get verifyStart => 'Start Verification'; + + @override + String get verifySuccess => 'You successfully verified!'; + + @override + String get verifyTitle => 'Verifying other account'; + + @override + String get videoCall => 'Video call'; + + @override + String get visibilityOfTheChatHistory => 'Visibility of the chat history'; + + @override + String get visibleForAllParticipants => 'Visible for all participants'; + + @override + String get visibleForEveryone => 'Visible for everyone'; + + @override + String get voiceMessage => 'Voice message'; + + @override + String get waitingPartnerAcceptRequest => + 'Waiting for partner to accept the request…'; + + @override + String get waitingPartnerEmoji => 'Waiting for partner to accept the emoji…'; + + @override + String get waitingPartnerNumbers => + 'Waiting for partner to accept the numbers…'; + + @override + String get wallpaper => 'Wallpaper:'; + + @override + String get warning => 'Warning!'; + + @override + String get weSentYouAnEmail => 'We sent you an email'; + + @override + String get whoCanPerformWhichAction => 'Who can perform which action'; + + @override + String get whoIsAllowedToJoinThisGroup => 'Who is allowed to join this group'; + + @override + String get whyDoYouWantToReportThis => 'Why do you want to report this?'; + + @override + String get wipeChatBackup => + 'Wipe your chat backup to create a new recovery key?'; + + @override + String get withTheseAddressesRecoveryDescription => + 'With these addresses you can recover your password.'; + + @override + String get writeAMessage => 'Write a message…'; + + @override + String get yes => 'Yes'; + + @override + String get you => 'You'; + + @override + String get youAreNoLongerParticipatingInThisChat => + 'You are no longer participating in this chat'; + + @override + String get youHaveBeenBannedFromThisChat => + 'You have been banned from this chat'; + + @override + String get yourPublicKey => 'Your public key'; + + @override + String get messageInfo => 'Message info'; + + @override + String get time => 'Time'; + + @override + String get messageType => 'Message Type'; + + @override + String get sender => 'Sender'; + + @override + String get openGallery => 'Open gallery'; + + @override + String get removeFromSpace => 'Remove from space'; + + @override + String get addToSpaceDescription => 'Select a space to add this chat to it.'; + + @override + String get start => 'Start'; + + @override + String get pleaseEnterRecoveryKeyDescription => + 'To unlock your old messages, please enter your recovery key that has been generated in a previous session. Your recovery key is NOT your password.'; + + @override + String get publish => 'Publish'; + + @override + String videoWithSize(String size) { + return 'Video ($size)'; + } + + @override + String get openChat => 'Open Chat'; + + @override + String get markAsRead => 'Mark as read'; + + @override + String get reportUser => 'Report user'; + + @override + String get dismiss => 'Dismiss'; + + @override + String reactedWith(String sender, String reaction) { + return '$sender reacted with $reaction'; + } + + @override + String get pinMessage => 'Pin to room'; + + @override + String get confirmEventUnpin => + 'Are you sure to permanently unpin the event?'; + + @override + String get emojis => 'Emojis'; + + @override + String get placeCall => 'Place call'; + + @override + String get voiceCall => 'Voice call'; + + @override + String get unsupportedAndroidVersion => 'Unsupported Android version'; + + @override + String get unsupportedAndroidVersionLong => + 'This feature requires a newer Android version. Please check for updates or Lineage OS support.'; + + @override + String get videoCallsBetaWarning => + 'Please note that video calls are currently in beta. They might not work as expected or work at all on all platforms.'; + + @override + String get experimentalVideoCalls => 'Experimental video calls'; + + @override + String get emailOrUsername => 'Email or username'; + + @override + String get indexedDbErrorTitle => 'Private mode issues'; + + @override + String get indexedDbErrorLong => + 'The message storage is unfortunately not enabled in private mode by default.\nPlease visit\n - about:config\n - set dom.indexedDB.privateBrowsing.enabled to true\nOtherwise, it is not possible to run Extera.'; + + @override + String switchToAccount(String number) { + return 'Switch to account $number'; + } + + @override + String get nextAccount => 'Next account'; + + @override + String get previousAccount => 'Previous account'; + + @override + String get addWidget => 'Add widget'; + + @override + String get widgetVideo => 'Video'; + + @override + String get widgetEtherpad => 'Text note'; + + @override + String get widgetJitsi => 'Jitsi Meet'; + + @override + String get widgetCustom => 'Custom'; + + @override + String get widgetName => 'Name'; + + @override + String get widgetUrlError => 'This is not a valid URL.'; + + @override + String get widgetNameError => 'Please provide a display name.'; + + @override + String get errorAddingWidget => 'Error adding the widget.'; + + @override + String get youRejectedTheInvitation => 'You rejected the invitation'; + + @override + String get youJoinedTheChat => 'You joined the chat'; + + @override + String get youAcceptedTheInvitation => '👍 You accepted the invitation'; + + @override + String youBannedUser(String user) { + return 'You banned $user'; + } + + @override + String youHaveWithdrawnTheInvitationFor(String user) { + return 'You have withdrawn the invitation for $user'; + } + + @override + String youInvitedToBy(String alias) { + return '📩 You have been invited via link to:\n$alias'; + } + + @override + String youInvitedBy(String user) { + return '📩 You have been invited by $user'; + } + + @override + String invitedBy(String user) { + return '📩 Invited by $user'; + } + + @override + String youInvitedUser(String user) { + return '📩 You invited $user'; + } + + @override + String youKicked(String user) { + return '👞 You kicked $user'; + } + + @override + String youKickedAndBanned(String user) { + return '🙅 You kicked and banned $user'; + } + + @override + String youUnbannedUser(String user) { + return 'You unbanned $user'; + } + + @override + String hasKnocked(String user) { + return '🚪 $user has knocked'; + } + + @override + String get usersMustKnock => 'Users must knock'; + + @override + String get noOneCanJoin => 'No one can join'; + + @override + String userWouldLikeToChangeTheChat(String user) { + return '$user would like to join the chat.'; + } + + @override + String get noPublicLinkHasBeenCreatedYet => + 'No public link has been created yet'; + + @override + String get knock => 'Knock'; + + @override + String get users => 'Users'; + + @override + String get unlockOldMessages => 'Unlock old messages'; + + @override + String get storeInSecureStorageDescription => + 'Store the recovery key in the secure storage of this device.'; + + @override + String get saveKeyManuallyDescription => + 'Save this key manually by triggering the system share dialog or clipboard.'; + + @override + String get storeInAndroidKeystore => 'Store in Android KeyStore'; + + @override + String get storeInAppleKeyChain => 'Store in Apple KeyChain'; + + @override + String get storeSecurlyOnThisDevice => 'Store securely on this device'; + + @override + String countFiles(int count) { + return '$count files'; + } + + @override + String get user => 'User'; + + @override + String get custom => 'Custom'; + + @override + String get foregroundServiceRunning => + 'This notification appears when the foreground service is running.'; + + @override + String get screenSharingTitle => 'screen sharing'; + + @override + String get screenSharingDetail => 'You are sharing your screen in Extera'; + + @override + String get callingPermissions => 'Quyền gọi điện'; + + @override + String get callingAccount => 'Gọi tài khoản'; + + @override + String get callingAccountDetails => + 'Allows Extera to use the native android dialer app.'; + + @override + String get appearOnTop => 'Appear on top'; + + @override + String get appearOnTopDetails => + 'Allows the app to appear on top (not needed if you already have Fluffychat setup as a calling account)'; + + @override + String get otherCallingPermissions => + 'Microphone, camera and other Extera permissions'; + + @override + String get whyIsThisMessageEncrypted => 'Why is this message unreadable?'; + + @override + String get noKeyForThisMessage => + 'This can happen if the message was sent before you have signed in to your account at this device.\n\nIt is also possible that the sender has blocked your device or something went wrong with the internet connection.\n\nAre you able to read the message on another session? Then you can transfer the message from it! Go to Settings > Devices and make sure that your devices have verified each other. When you open the room the next time and both sessions are in the foreground, the keys will be transmitted automatically.\n\nDo you not want to lose the keys when logging out or switching devices? Make sure that you have enabled the chat backup in the settings.'; + + @override + String get newGroup => 'Nhóm mới'; + + @override + String get newSpace => 'Không gian mới'; + + @override + String get enterSpace => 'Nhập không gian'; + + @override + String get enterRoom => 'Nhập phòng'; + + @override + String get allSpaces => 'Tất cả không gian'; + + @override + String numChats(String number) { + return '$number cuộc hội thoại'; + } + + @override + String get hideUnimportantStateEvents => 'Ẩn các sự kiện không quan trọng'; + + @override + String get hidePresences => 'Ẩn danh sách trạng thái?'; + + @override + String get doNotShowAgain => 'Không hiện lại nữa'; + + @override + String wasDirectChatDisplayName(String oldDisplayName) { + return 'Hội thoại trống (từng là $oldDisplayName)'; + } + + @override + String get newSpaceDescription => + 'Không gian cho phép bạn hợp nhất các cuộc trò chuyện của mình và xây dựng cộng đồng riêng tư hoặc công khai.'; + + @override + String get encryptThisChat => 'Mã hóa cuộc trò chuyện này'; + + @override + String get disableEncryptionWarning => + 'Vì lý do bảo mật, bạn không thể tắt tính năng mã hóa trong cuộc trò chuyện đã được bật tính năng này trước đó.'; + + @override + String get sorryThatsNotPossible => 'Xin lỗi... không khả dụng'; + + @override + String get deviceKeys => 'Device keys:'; + + @override + String get reopenChat => 'Mở lại cuộc trò chuyện'; + + @override + String get noBackupWarning => + 'Cẩn thận! Nếu không bật sao lưu trò chuyện, bạn sẽ mất quyền truy cập vào tin nhắn được mã hóa của mình. Chúng tôi khuyên bạn nên bật sao lưu trò chuyện trước khi đăng xuất.'; + + @override + String get noOtherDevicesFound => 'Không tìm thấy thiết bị khác'; + + @override + String fileIsTooBigForServer(String max) { + return 'Máy chủ báo cáo rằng tệp tin quá lớn để gửi.'; + } + + @override + String fileHasBeenSavedAt(String path) { + return 'Tệp đã được lưu tại $path'; + } + + @override + String get jumpToLastReadMessage => 'Đi tới tin nhắn đã đọc mới nhất'; + + @override + String get readUpToHere => 'Đọc tới đây'; + + @override + String get jump => 'Đi tới'; + + @override + String get openLinkInBrowser => 'Mở đường dẫn trong trình duyệt'; + + @override + String get reportErrorDescription => + '😭 Ôi. Có lỗi xảy ra. Bạn có thể báo cáo lỗi tới nhà phát triển nếu muốn.'; + + @override + String get report => 'báo cáo'; + + @override + String get signInWithPassword => 'Đăng nhập với mật khẩu'; + + @override + String get pleaseTryAgainLaterOrChooseDifferentServer => + 'Hãy thử lại sau hoặc chọn 1 máy chủ khác.'; + + @override + String signInWith(String provider) { + return 'Đăng nhập với $provider'; + } + + @override + String get profileNotFound => + 'Không tìm thấy người dùng này tại máy chủ. Có thể do lỗi kết nối hoặc người dùng không tồn tại.'; + + @override + String get setTheme => 'Chọn giao diện:'; + + @override + String get setColorTheme => 'Chọn màu giao diện:'; + + @override + String get invite => 'Mời'; + + @override + String get inviteGroupChat => '📨 Mời nhóm trò chuyện'; + + @override + String get invitePrivateChat => '📨 Mời trò chuyện riêng tư'; + + @override + String get invalidInput => 'Dữ liệu nhập không hợp lệ!'; + + @override + String wrongPinEntered(int seconds) { + return 'Nhập sai mã pin! Thử lại sau $seconds giây...'; + } + + @override + String get pleaseEnterANumber => 'Hãy nhập số lớn hơn 0'; + + @override + String get archiveRoomDescription => + 'Cuộc trò chuyện sẽ được chuyển tới mục lưu trữ. Người dùng khác sẽ thấy được bạn đã rời khỏi cuộc trò chuyện.'; + + @override + String get roomUpgradeDescription => + 'Cuộc trò chuyện sẽ được tạo lại với phiên bản phòng mới. Tất cả những người tham gia sẽ được thông báo rằng họ cần chuyển sang cuộc trò chuyện mới. Bạn có thể tìm hiểu thêm về các phiên bản phòng tại https://spec.matrix.org/latest/rooms/'; + + @override + String get removeDevicesDescription => + 'Bạn sẽ đăng xuất khỏi thiết bị này và không nhận được tin nhắn nữa.'; + + @override + String get banUserDescription => + 'Người dùng sẽ bị cấm khỏi cuộc trò chuyện và không thể tham gia lại cho tới khi được gỡ cấm.'; + + @override + String get unbanUserDescription => + 'Người dùng sẽ có thể vào lại cuộc trò chuyện nếu họ thử.'; + + @override + String get kickUserDescription => + 'Người dùng bị đuổi khỏi cuộc trò chuyện nhưng không bị cấm. Trong các cuộc trò chuyện công khai, người dùng có thể vào lại bất cứ lúc nào.'; + + @override + String get makeAdminDescription => + 'Khi bạn đặt người dùng này làm quản trị viên, bạn không thể hoàn tác việc này vì khi đó họ sẽ có quyền ngang bạn.'; + + @override + String get pushNotificationsNotAvailable => 'Thông báo đẩy không khả dụng'; + + @override + String get learnMore => 'Tìm hiểu thêm'; + + @override + String get yourGlobalUserIdIs => 'Your global user-ID is: '; + + @override + String noUsersFoundWithQuery(String query) { + return 'Không tìm thấy người dùng nào với \"$query\". Hãy kiểm tra xem bạn có nhập nhầm không.'; + } + + @override + String get knocking => 'Knocking'; + + @override + String chatCanBeDiscoveredViaSearchOnServer(String server) { + return 'Chat can be discovered via the search on $server'; + } + + @override + String get searchChatsRooms => 'Search for #chats, @users...'; + + @override + String get nothingFound => 'Nothing found...'; + + @override + String get groupName => 'Group name'; + + @override + String get createGroupAndInviteUsers => 'Create a group and invite users'; + + @override + String get groupCanBeFoundViaSearch => 'Group can be found via search'; + + @override + String get wrongRecoveryKey => + 'Sorry... this does not seem to be the correct recovery key.'; + + @override + String get startConversation => 'Start conversation'; + + @override + String get commandHint_sendraw => 'Send raw json'; + + @override + String get databaseMigrationTitle => 'Database is optimized'; + + @override + String get databaseMigrationBody => 'Please wait. This may take a moment.'; + + @override + String get leaveEmptyToClearStatus => 'Leave empty to clear your status.'; + + @override + String get select => 'Select'; + + @override + String get searchForUsers => 'Search for @users...'; + + @override + String get pleaseEnterYourCurrentPassword => + 'Please enter your current password'; + + @override + String get newPassword => 'New password'; + + @override + String get pleaseChooseAStrongPassword => 'Please choose a strong password'; + + @override + String get passwordsDoNotMatch => 'Passwords do not match'; + + @override + String get passwordIsWrong => 'Your entered password is wrong'; + + @override + String get publicLink => 'Public link'; + + @override + String get publicChatAddresses => 'Public chat addresses'; + + @override + String get createNewAddress => 'Create new address'; + + @override + String get joinSpace => 'Join space'; + + @override + String get publicSpaces => 'Public spaces'; + + @override + String get addChatOrSubSpace => 'Add chat or sub space'; + + @override + String get subspace => 'Subspace'; + + @override + String get decline => 'Decline'; + + @override + String get thisDevice => 'This device:'; + + @override + String get initAppError => 'An error occured while init the app'; + + @override + String get userRole => 'User role'; + + @override + String minimumPowerLevel(String level) { + return '$level is the minimum power level.'; + } + + @override + String searchIn(String chat) { + return 'Search in chat \"$chat\"...'; + } + + @override + String get searchMore => 'Search more...'; + + @override + String get gallery => 'Gallery'; + + @override + String get files => 'Files'; + + @override + String databaseBuildErrorBody(String url, String error) { + return 'Unable to build the SQlite database. The app tries to use the legacy database for now. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String sessionLostBody(String url, String error) { + return 'Your session is lost. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String restoreSessionBody(String url, String error) { + return 'The app now tries to restore your session from the backup. Please report this error to the developers at $url. The error message is: $error'; + } + + @override + String forwardMessageTo(String roomName) { + return 'Forward message to $roomName?'; + } + + @override + String get sendReadReceipts => 'Send read receipts'; + + @override + String get sendTypingNotificationsDescription => + 'Other participants in a chat can see when you are typing a new message.'; + + @override + String get sendReadReceiptsDescription => + 'Other participants in a chat can see when you have read a message.'; + + @override + String get formattedMessages => 'Formatted messages'; + + @override + String get formattedMessagesDescription => + 'Display rich message content like bold text using markdown.'; + + @override + String get verifyOtherUser => '🔐 Verify other user'; + + @override + String get verifyOtherUserDescription => + 'If you verify another user, you can be sure that you know who you are really writing to. 💪\n\nWhen you start a verification, you and the other user will see a popup in the app. There you will then see a series of emojis or numbers that you have to compare with each other.\n\nThe best way to do this is to meet up or start a video call. 👭'; + + @override + String get verifyOtherDevice => '🔐 Verify other device'; + + @override + String get verifyOtherDeviceDescription => + 'When you verify another device, those devices can exchange keys, increasing your overall security. 💪 When you start a verification, a popup will appear in the app on both devices. There you will then see a series of emojis or numbers that you have to compare with each other. It\'s best to have both devices handy before you start the verification. 🤳'; + + @override + String acceptedKeyVerification(String sender) { + return '$sender accepted key verification'; + } + + @override + String canceledKeyVerification(String sender) { + return '$sender canceled key verification'; + } + + @override + String completedKeyVerification(String sender) { + return '$sender completed key verification'; + } + + @override + String isReadyForKeyVerification(String sender) { + return '$sender is ready for key verification'; + } + + @override + String requestedKeyVerification(String sender) { + return '$sender requested key verification'; + } + + @override + String startedKeyVerification(String sender) { + return '$sender started key verification'; + } + + @override + String get transparent => 'Transparent'; + + @override + String get incomingMessages => 'Tin nhắn đến'; + + @override + String get stickers => 'Nhãn dán'; + + @override + String get discover => 'Khám phá'; + + @override + String get commandHint_ignore => 'Phớt lờ matrix ID này'; + + @override + String get commandHint_unignore => 'Bỏ phớt lờ matrix ID này'; + + @override + String unreadChatsInApp(String appname, String unread) { + return '$appname: $unread unread chats'; + } + + @override + String get noDatabaseEncryption => + 'Database encryption is not supported on this platform'; + + @override + String thereAreCountUsersBlocked(Object count) { + return 'Right now there are $count users blocked.'; + } + + @override + String get restricted => 'Bị hạn chế'; + + @override + String get knockRestricted => 'Knock restricted'; + + @override + String goToSpace(Object space) { + return 'Go to space: $space'; + } + + @override + String get markAsUnread => 'Mark as unread'; + + @override + String userLevel(int level) { + return '$level - User'; + } + + @override + String moderatorLevel(int level) { + return '$level - Moderator'; + } + + @override + String adminLevel(int level) { + return '$level - Admin'; + } + + @override + String get changeGeneralChatSettings => 'Change general chat settings'; + + @override + String get inviteOtherUsers => 'Invite other users to this chat'; + + @override + String get changeTheChatPermissions => 'Change the chat permissions'; + + @override + String get changeTheVisibilityOfChatHistory => + 'Change the visibility of the chat history'; + + @override + String get changeTheCanonicalRoomAlias => + 'Change the main public chat address'; + + @override + String get sendRoomNotifications => 'Send a @room notifications'; + + @override + String get changeTheDescriptionOfTheGroup => + 'Change the description of the chat'; + + @override + String get chatPermissionsDescription => + 'Define which power level is necessary for certain actions in this chat. The power levels 0, 50 and 100 are usually representing users, moderators and admins, but any gradation is possible.'; + + @override + String updateInstalled(String version) { + return '🎉 Update $version installed!'; + } + + @override + String get changelog => 'Changelog'; + + @override + String get sendCanceled => 'Sending canceled'; + + @override + String get loginWithMatrixId => 'Login with Matrix-ID'; + + @override + String get discoverHomeservers => 'Discover homeservers'; + + @override + String get whatIsAHomeserver => 'What is a homeserver?'; + + @override + String get homeserverDescription => + 'All your data is stored on the homeserver, just like an email provider. You can choose which homeserver you want to use, while you can still communicate with everyone. Learn more at at https://matrix.org.'; + + @override + String get doesNotSeemToBeAValidHomeserver => + 'Doesn\'t seem to be a compatible homeserver. Wrong URL?'; + + @override + String get calculatingFileSize => 'Calculating file size...'; + + @override + String get prepareSendingAttachment => 'Prepare sending attachment...'; + + @override + String get sendingAttachment => 'Sending attachment...'; + + @override + String get generatingVideoThumbnail => 'Generating video thumbnail...'; + + @override + String get compressVideo => 'Compressing video...'; + + @override + String sendingAttachmentCountOfCount(int index, int length) { + return 'Sending attachment $index of $length...'; + } + + @override + String serverLimitReached(int seconds) { + return 'Server limit reached! Waiting $seconds seconds...'; + } + + @override + String get oneOfYourDevicesIsNotVerified => + 'One of your devices is not verified'; + + @override + String get noticeChatBackupDeviceVerification => + 'Note: When you connect all your devices to the chat backup, they are automatically verified.'; + + @override + String get continueText => 'Continue'; + + @override + String get welcomeText => + 'Hey Hey 👋 This is Extera. You can sign in to any homeserver, which is compatible with https://matrix.org. And then chat with anyone. It\'s a huge decentralized messaging network!'; + + @override + String get blur => 'Blur:'; + + @override + String get opacity => 'Opacity:'; + + @override + String get setWallpaper => 'Set wallpaper'; + + @override + String get manageAccount => 'Manage account'; + + @override + String get noContactInformationProvided => + 'Server does not provide any valid contact information'; + + @override + String get contactServerAdmin => 'Contact server admin'; + + @override + String get contactServerSecurity => 'Contact server security'; + + @override + String get supportPage => 'Support page'; + + @override + String get serverInformation => 'Server information:'; + + @override + String get name => 'Name'; + + @override + String get version => 'Version'; + + @override + String get website => 'Website'; + + @override + String get compress => 'Compress'; + + @override + String get boldText => 'Bold text'; + + @override + String get italicText => 'Italic text'; + + @override + String get strikeThrough => 'Strikethrough'; + + @override + String get pleaseFillOut => 'Please fill out'; + + @override + String get invalidUrl => 'Invalid url'; + + @override + String get addLink => 'Add link'; + + @override + String get unableToJoinChat => + 'Unable to join chat. Maybe the other party has already closed the conversation.'; + + @override + String get previous => 'Previous'; + + @override + String get otherPartyNotLoggedIn => + 'The other party is currently not logged in and therefore cannot receive messages!'; + + @override + String appWantsToUseForLogin(String server) { + return 'Use \'$server\' to log in'; + } + + @override + String get appWantsToUseForLoginDescription => + 'You hereby allow the app and website to share information about you.'; + + @override + String get open => 'Open'; + + @override + String get waitingForServer => 'Waiting for server...'; + + @override + String get appIntroduction => + 'Extera lets you chat with your friends across different messengers. Learn more at https://matrix.org or just tap *Continue*.'; + + @override + String get newChatRequest => '📩 New chat request'; + + @override + String get contentNotificationSettings => 'Content notification settings'; + + @override + String get generalNotificationSettings => 'General notification settings'; + + @override + String get roomNotificationSettings => 'Room notification settings'; + + @override + String get userSpecificNotificationSettings => + 'User specific notification settings'; + + @override + String get otherNotificationSettings => 'Other notification settings'; + + @override + String get notificationRuleContainsUserName => 'Contains User Name'; + + @override + String get notificationRuleContainsUserNameDescription => + 'Notifies the user when a message contains their username.'; + + @override + String get notificationRuleMaster => 'Mute all notifications'; + + @override + String get notificationRuleMasterDescription => + 'Overrides all other rules and disables all notifications.'; + + @override + String get notificationRuleSuppressNotices => 'Suppress Automated Messages'; + + @override + String get notificationRuleSuppressNoticesDescription => + 'Suppresses notifications from automated clients like bots.'; + + @override + String get notificationRuleInviteForMe => 'Invite for Me'; + + @override + String get notificationRuleInviteForMeDescription => + 'Notifies the user when they are invited to a room.'; + + @override + String get notificationRuleMemberEvent => 'Member Event'; + + @override + String get notificationRuleMemberEventDescription => + 'Suppresses notifications for membership events.'; + + @override + String get notificationRuleIsUserMention => 'User Mention'; + + @override + String get notificationRuleIsUserMentionDescription => + 'Notifies the user when they are directly mentioned in a message.'; + + @override + String get notificationRuleContainsDisplayName => 'Contains Display Name'; + + @override + String get notificationRuleContainsDisplayNameDescription => + 'Notifies the user when a message contains their display name.'; + + @override + String get notificationRuleIsRoomMention => 'Room Mention'; + + @override + String get notificationRuleIsRoomMentionDescription => + 'Notifies the user when there is a room mention.'; + + @override + String get notificationRuleRoomnotif => 'Room Notification'; + + @override + String get notificationRuleRoomnotifDescription => + 'Notifies the user when a message contains \'@room\'.'; + + @override + String get notificationRuleTombstone => 'Tombstone'; + + @override + String get notificationRuleTombstoneDescription => + 'Notifies the user about room deactivation messages.'; + + @override + String get notificationRuleReaction => 'Reaction'; + + @override + String get notificationRuleReactionDescription => + 'Suppresses notifications for reactions.'; + + @override + String get notificationRuleRoomServerAcl => 'Room Server ACL'; + + @override + String get notificationRuleRoomServerAclDescription => + 'Suppresses notifications for room server access control lists (ACL).'; + + @override + String get notificationRuleSuppressEdits => 'Suppress Edits'; + + @override + String get notificationRuleSuppressEditsDescription => + 'Suppresses notifications for edited messages.'; + + @override + String get notificationRuleCall => 'Call'; + + @override + String get notificationRuleCallDescription => + 'Notifies the user about calls.'; + + @override + String get notificationRuleEncryptedRoomOneToOne => + 'Encrypted Room One-to-One'; + + @override + String get notificationRuleEncryptedRoomOneToOneDescription => + 'Notifies the user about messages in encrypted one-to-one rooms.'; + + @override + String get notificationRuleRoomOneToOne => 'Room One-to-One'; + + @override + String get notificationRuleRoomOneToOneDescription => + 'Notifies the user about messages in one-to-one rooms.'; + + @override + String get notificationRuleMessage => 'Message'; + + @override + String get notificationRuleMessageDescription => + 'Notifies the user about general messages.'; + + @override + String get notificationRuleEncrypted => 'Encrypted'; + + @override + String get notificationRuleEncryptedDescription => + 'Notifies the user about messages in encrypted rooms.'; + + @override + String get notificationRuleJitsi => 'Jitsi'; + + @override + String get notificationRuleJitsiDescription => + 'Notifies the user about Jitsi widget events.'; + + @override + String get notificationRuleServerAcl => 'Suppress Server ACL Events'; + + @override + String get notificationRuleServerAclDescription => + 'Suppresses notifications for Server ACL events.'; + + @override + String unknownPushRule(String rule) { + return 'Unknown push rule \'$rule\''; + } + + @override + String get deletePushRuleCanNotBeUndone => + 'If you delete this notification setting, this can not be undone.'; + + @override + String get more => 'More'; + + @override + String get shareKeysWith => 'Share keys with...'; + + @override + String get shareKeysWithDescription => + 'Which devices should be trusted so that they can read along your messages in encrypted chats?'; + + @override + String get allDevices => 'All devices'; + + @override + String get crossVerifiedDevicesIfEnabled => + 'Cross verified devices if enabled'; + + @override + String get crossVerifiedDevices => 'Cross verified devices'; + + @override + String get verifiedDevicesOnly => 'Verified devices only'; + + @override + String get takeAPhoto => 'Take a photo'; + + @override + String get recordAVideo => 'Record a video'; + + @override + String get optionalMessage => '(Optional) message...'; + + @override + String get notSupportedOnThisDevice => 'Not supported on this device'; + + @override + String get enterNewChat => 'Enter new chat'; + + @override + String get approve => 'Approve'; + + @override + String get youHaveKnocked => 'You have knocked'; + + @override + String get pleaseWaitUntilInvited => + 'Please wait now, until someone from the room invites you.'; +} diff --git a/lib/generated/l10n/l10n_zh.dart b/lib/generated/l10n/l10n_zh.dart new file mode 100644 index 0000000..a0792a6 --- /dev/null +++ b/lib/generated/l10n/l10n_zh.dart @@ -0,0 +1,5082 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'l10n.dart'; + +// ignore_for_file: type=lint + +/// The translations for Chinese (`zh`). +class L10nZh extends L10n { + L10nZh([String locale = 'zh']) : super(locale); + + @override + String get noSendPermission => 'You can\'t send messages here'; + + @override + String get alwaysUse24HourFormat => 'false'; + + @override + String get repeatPassword => '重复输入密码'; + + @override + String get notAnImage => '不是图像文件。'; + + @override + String get setCustomPermissionLevel => 'Set custom permission level'; + + @override + String get setPermissionsLevelDescription => + 'Please choose a predefined role below or enter a custom permission level between 0 and 100.'; + + @override + String get ignoreUser => 'Ignore user'; + + @override + String get normalUser => 'Normal user'; + + @override + String get remove => '移除'; + + @override + String get importNow => '立即导入'; + + @override + String get importEmojis => '导入表情包'; + + @override + String get importFromZipFile => '从 .zip 文件导入'; + + @override + String get exportEmotePack => '以 .zip 格式导出表情包'; + + @override + String get replace => '替换'; + + @override + String get about => '关于'; + + @override + String aboutHomeserver(String homeserver) { + return '关于 $homeserver'; + } + + @override + String get accept => '接受'; + + @override + String acceptedTheInvitation(String username) { + return '👍 $username 接受了邀请'; + } + + @override + String get account => '账户'; + + @override + String activatedEndToEndEncryption(String username) { + return '🔐 $username 激活了端到端加密'; + } + + @override + String get addEmail => '添加电子邮件'; + + @override + String get confirmMatrixId => '请确认你的 Matrix ID 以删除账户。'; + + @override + String supposedMxid(String mxid) { + return '应为 $mxid'; + } + + @override + String get addChatDescription => '添加聊天说明…'; + + @override + String get addToSpace => '添加到空间'; + + @override + String get admin => '管理员'; + + @override + String get alias => '别名'; + + @override + String get all => '全部'; + + @override + String get allChats => '所有聊天'; + + @override + String get commandHint_roomupgrade => '将此聊天室升级到给定的聊天室版本'; + + @override + String get commandHint_googly => '发送“大眼”表情'; + + @override + String get commandHint_cuddle => '发送“搂抱”'; + + @override + String get commandHint_hug => '发送“拥抱”'; + + @override + String googlyEyesContent(String senderName) { + return '$senderName 向你发送了“大眼”表情'; + } + + @override + String cuddleContent(String senderName) { + return '$senderName 搂抱了你'; + } + + @override + String hugContent(String senderName) { + return '$senderName 拥抱了你'; + } + + @override + String answeredTheCall(String senderName) { + return '$senderName 接听了通话'; + } + + @override + String get anyoneCanJoin => '任何人都可以加入'; + + @override + String get appLock => '应用锁'; + + @override + String get appLockDescription => '用 pin 码在不用 FluffyChat 时锁定它'; + + @override + String get archive => '存档'; + + @override + String get areGuestsAllowedToJoin => '是否允许访客加入'; + + @override + String get areYouSure => '你确定吗?'; + + @override + String get areYouSureYouWantToLogout => '你确定要注销吗?'; + + @override + String get askSSSSSign => '请输入你的安全存储的密码短语或恢复密钥,以向对方签名。'; + + @override + String askVerificationRequest(String username) { + return '是否接受来自 $username 的验证请求?'; + } + + @override + String get autoplayImages => '自动播放动态贴纸和表情'; + + @override + String badServerLoginTypesException(String serverVersions, + String supportedVersions, Object suportedVersions) { + return '主服务器支持的登录方式:\n$serverVersions\n但此应用仅支持:\n$supportedVersions'; + } + + @override + String get sendTypingNotifications => '发送正在输入通知'; + + @override + String get swipeRightToLeftToReply => '从右向左滑动进行回复'; + + @override + String get sendOnEnter => '按 Enter 键发送'; + + @override + String badServerVersionsException(String serverVersions, + String supportedVersions, Object serverVerions, Object suportedVersions) { + return '主服务器支持的 Spec 版本:\n$serverVersions\n但此应用仅支持 $supportedVersions 版本'; + } + + @override + String countChatsAndCountParticipants(int chats, int participants) { + return '$chats 个聊天和 $participants 名参与者'; + } + + @override + String get noMoreChatsFound => '找不到更多聊天…'; + + @override + String get noChatsFoundHere => '此处尚未找到聊天。使用下方按钮 ⤵️ 开始和某人的新聊天'; + + @override + String get joinedChats => '已加入的聊天'; + + @override + String get unread => '未读'; + + @override + String get space => '空间'; + + @override + String get spaces => '空间'; + + @override + String get banFromChat => '从聊天中封禁'; + + @override + String get banned => '已封禁'; + + @override + String bannedUser(String username, String targetName) { + return '$username 封禁了 $targetName'; + } + + @override + String get blockDevice => '屏蔽设备'; + + @override + String get blocked => '已屏蔽'; + + @override + String get botMessages => '机器人消息'; + + @override + String get cancel => '取消'; + + @override + String cantOpenUri(String uri) { + return '无法打开 URI $uri'; + } + + @override + String get changeDeviceName => '更改设备名称'; + + @override + String changedTheChatAvatar(String username) { + return '$username 更改了聊天头像'; + } + + @override + String changedTheChatDescriptionTo(String username, String description) { + return '$username 将聊天描述更改为:\'$description\''; + } + + @override + String changedTheChatNameTo(String username, String chatname) { + return '$username 将聊天名称更改为:\'$chatname\''; + } + + @override + String changedTheChatPermissions(String username) { + return '$username 更改了聊天权限'; + } + + @override + String changedTheDisplaynameTo(String username, String displayname) { + return '$username 将昵称更改为:\'$displayname\''; + } + + @override + String changedTheGuestAccessRules(String username) { + return '$username 更改了访客访问规则'; + } + + @override + String changedTheGuestAccessRulesTo(String username, String rules) { + return '$username 更改了访客访问规则为:$rules'; + } + + @override + String changedTheHistoryVisibility(String username) { + return '$username 更改了历史记录可见性'; + } + + @override + String changedTheHistoryVisibilityTo(String username, String rules) { + return '$username 更改了历史记录可见性为:$rules'; + } + + @override + String changedTheJoinRules(String username) { + return '$username 更改了加入的规则'; + } + + @override + String changedTheJoinRulesTo(String username, String joinRules) { + return '$username 更改了加入的规则为:$joinRules'; + } + + @override + String changedTheProfileAvatar(String username) { + return '$username 更改了头像'; + } + + @override + String changedTheRoomAliases(String username) { + return '$username 更改了聊天室别名'; + } + + @override + String changedTheRoomInvitationLink(String username) { + return '$username 更改了邀请链接'; + } + + @override + String get changePassword => '更改密码'; + + @override + String get changeTheHomeserver => '更改主服务器'; + + @override + String get changeTheme => '改变风格'; + + @override + String get changeTheNameOfTheGroup => '更改群组名称'; + + @override + String get changeYourAvatar => '更改你的头像'; + + @override + String get channelCorruptedDecryptError => '加密已被破坏'; + + @override + String get chat => '聊天'; + + @override + String get yourChatBackupHasBeenSetUp => '你的聊天记录备份已设置。'; + + @override + String get chatBackup => '聊天记录备份'; + + @override + String get chatBackupDescription => '你的旧消息受恢复密钥保护。请确保你不会丢失它。'; + + @override + String get chatDetails => '聊天详情'; + + @override + String get chatHasBeenAddedToThisSpace => '聊天已添加到此空间'; + + @override + String get chats => '聊天'; + + @override + String get chooseAStrongPassword => '输入一个强密码'; + + @override + String get clearArchive => '清除存档'; + + @override + String get close => '关闭'; + + @override + String get commandHint_markasdm => '将给定的 Matrix ID 标为私信聊天室'; + + @override + String get commandHint_markasgroup => '标记为群组'; + + @override + String get commandHint_ban => '在此聊天室封禁指定用户'; + + @override + String get commandHint_clearcache => '清除缓存'; + + @override + String get commandHint_create => '创建空的群聊\n使用 --no-encryption 选项来禁用加密'; + + @override + String get commandHint_discardsession => '丢弃会话'; + + @override + String get commandHint_dm => '创建私聊\n使用 --no-encryption 选项来禁用加密'; + + @override + String get commandHint_html => '发送 HTML 格式化文本'; + + @override + String get commandHint_invite => '邀请指定用户加入此聊天室'; + + @override + String get commandHint_join => '加入指定聊天室'; + + @override + String get commandHint_kick => '在此聊天室移除指定用户'; + + @override + String get commandHint_leave => '退出此聊天室'; + + @override + String get commandHint_me => '介绍自己'; + + @override + String get commandHint_myroomavatar => '设置你在此聊天室的头像(通过 mxc-uri)'; + + @override + String get commandHint_myroomnick => '设置你在此聊天室的昵称'; + + @override + String get commandHint_op => '设置指定用户的权限等级(默认:50)'; + + @override + String get commandHint_plain => '发送纯文本'; + + @override + String get commandHint_react => '将回复作为回应发送'; + + @override + String get commandHint_send => '发送文本'; + + @override + String get commandHint_unban => '在此聊天室解封指定用户'; + + @override + String get commandInvalid => '指令无效'; + + @override + String commandMissing(String command) { + return '$command 不是指令。'; + } + + @override + String get compareEmojiMatch => '请比较表情符号'; + + @override + String get compareNumbersMatch => '请比较以下数字'; + + @override + String get configureChat => '配置聊天'; + + @override + String get confirm => '确认'; + + @override + String get connect => '连接'; + + @override + String get contactHasBeenInvitedToTheGroup => '联系人已被邀请至群组'; + + @override + String get containsDisplayName => '包含昵称'; + + @override + String get containsUserName => '包含用户名'; + + @override + String get contentHasBeenReported => '此内容已被报告至服务器管理员处'; + + @override + String get copiedToClipboard => '已复制到剪贴板'; + + @override + String get copy => '复制'; + + @override + String get copyToClipboard => '复制到剪贴板'; + + @override + String couldNotDecryptMessage(String error) { + return '不能解密消息: $error'; + } + + @override + String countParticipants(int count) { + return '$count 名参与者'; + } + + @override + String get create => '创建'; + + @override + String createdTheChat(String username) { + return '💬 $username 创建了聊天'; + } + + @override + String get createGroup => '创建群组'; + + @override + String get createNewSpace => '创建新空间'; + + @override + String get currentlyActive => '目前活跃'; + + @override + String get darkTheme => '深色'; + + @override + String dateAndTimeOfDay(String date, String timeOfDay) { + return '$date, $timeOfDay'; + } + + @override + String dateWithoutYear(String month, String day) { + return '$month-$day'; + } + + @override + String dateWithYear(String year, String month, String day) { + return '$year-$month-$day'; + } + + @override + String get deactivateAccountWarning => '这将停用你的用户账户。这不能被撤销!你确定吗?'; + + @override + String get defaultPermissionLevel => '新用户默认权限级别'; + + @override + String get delete => '删除'; + + @override + String get deleteAccount => '删除账户'; + + @override + String get deleteMessage => '删除消息'; + + @override + String get device => '设备'; + + @override + String get deviceId => '设备 ID'; + + @override + String get devices => '设备'; + + @override + String get directChats => '私聊'; + + @override + String get allRooms => '所有群聊'; + + @override + String get displaynameHasBeenChanged => '昵称已更改'; + + @override + String get downloadFile => '下载文件'; + + @override + String get edit => '编辑'; + + @override + String get editBlockedServers => '编辑被屏蔽的服务器'; + + @override + String get chatPermissions => '聊天权限'; + + @override + String get editDisplayname => '编辑昵称'; + + @override + String get editRoomAliases => '编辑聊天室别名'; + + @override + String get editRoomAvatar => '编辑聊天室头像'; + + @override + String get emoteExists => '表情已存在!'; + + @override + String get emoteInvalid => '无效的表情快捷码!'; + + @override + String get emoteKeyboardNoRecents => '最近使用过的表情会出现在这里...'; + + @override + String get emotePacks => '聊天室的表情包'; + + @override + String get emoteSettings => '表情设置'; + + @override + String get globalChatId => '全局聊天 ID'; + + @override + String get accessAndVisibility => '访问和可见性'; + + @override + String get accessAndVisibilityDescription => '谁可以加入此聊天以及怎样发现该聊天。'; + + @override + String get calls => '通话'; + + @override + String get customEmojisAndStickers => '自定义表情符号和贴纸'; + + @override + String get customEmojisAndStickersBody => '添加或分享可用于任何聊天的表情符号或贴纸。'; + + @override + String get emoteShortcode => '表情快捷码'; + + @override + String get emoteWarnNeedToPick => '你需要选择一个表情快捷码和一张图片!'; + + @override + String get emptyChat => '空聊天'; + + @override + String get enableEmotesGlobally => '在全局启用表情包'; + + @override + String get enableEncryption => '启用加密'; + + @override + String get enableEncryptionWarning => '你之后将无法停用加密,确定吗?'; + + @override + String get encrypted => '已加密'; + + @override + String get encryption => '加密'; + + @override + String get encryptionNotEnabled => '加密未启用'; + + @override + String endedTheCall(String senderName) { + return '$senderName 结束了通话'; + } + + @override + String get enterAnEmailAddress => '输入一个电子邮件地址'; + + @override + String get homeserver => '服务器'; + + @override + String get enterYourHomeserver => '输入你的主服务器地址'; + + @override + String errorObtainingLocation(String error) { + return '取得地址错误: $error'; + } + + @override + String get everythingReady => '一切就绪!'; + + @override + String get extremeOffensive => '令人极度反感'; + + @override + String get fileName => '文件名'; + + @override + String get fluffychat => 'FluffyChat'; + + @override + String get fontSize => '字体大小'; + + @override + String get forward => '转发'; + + @override + String get fromJoining => '自加入起'; + + @override + String get fromTheInvitation => '自邀请起'; + + @override + String get goToTheNewRoom => '前往新的聊天室'; + + @override + String get group => '群组'; + + @override + String get chatDescription => '聊天描述'; + + @override + String get chatDescriptionHasBeenChanged => '聊天描述已被更改'; + + @override + String get groupIsPublic => '群组是公开的'; + + @override + String get groups => '群组'; + + @override + String groupWith(String displayname) { + return '名称为 $displayname 的群组'; + } + + @override + String get guestsAreForbidden => '访客禁止加入'; + + @override + String get guestsCanJoin => '访客可以加入'; + + @override + String hasWithdrawnTheInvitationFor(String username, String targetName) { + return '$username 撤回了对 $targetName 的邀请'; + } + + @override + String get help => '帮助'; + + @override + String get hideRedactedEvents => '隐藏已删除的事件'; + + @override + String get hideRedactedMessages => '隐藏被涂黑的消息'; + + @override + String get hideRedactedMessagesBody => '如果某人涂黑了一条消息,那么在聊天中再也看不到这条消息。'; + + @override + String get hideInvalidOrUnknownMessageFormats => '隐藏无效或未知的消息格式'; + + @override + String get howOffensiveIsThisContent => '这些内容有多令人反感?'; + + @override + String get id => 'ID'; + + @override + String get identity => '身份'; + + @override + String get block => '屏蔽'; + + @override + String get blockedUsers => '已屏蔽的用户'; + + @override + String get blockListDescription => '你可以屏蔽打扰你的用户。你将不会收到来自屏蔽列表中用户的任何消息或聊天室邀请。'; + + @override + String get blockUsername => '忽略用户名'; + + @override + String get iHaveClickedOnLink => '我已经点击了链接'; + + @override + String get incorrectPassphraseOrKey => '不正确的密码短语或恢复密钥'; + + @override + String get inoffensive => '不令人反感'; + + @override + String get inviteContact => '邀请联系人'; + + @override + String inviteContactToGroupQuestion(Object contact, Object groupName) { + return '你是否要邀请 $contact 参与聊天 \"$groupName\"?'; + } + + @override + String inviteContactToGroup(String groupName) { + return '邀请联系人到 $groupName'; + } + + @override + String get noChatDescriptionYet => '尚未创建聊天描述。'; + + @override + String get tryAgain => '重试'; + + @override + String get invalidServerName => '服务器名称无效'; + + @override + String get invited => '已邀请'; + + @override + String get redactMessageDescription => '消息将为此对话中所有参与者删除。此操作无法撤销。'; + + @override + String get optionalRedactReason => '(可选)删除此消息的原因...'; + + @override + String invitedUser(String username, String targetName) { + return '📩 $username 邀请了 $targetName'; + } + + @override + String get invitedUsersOnly => '仅被邀请用户'; + + @override + String get inviteForMe => '发给我的邀请'; + + @override + String inviteText(String username, String link) { + return '$username 邀请你使用 FluffyChat。 \n1. 安装 FluffyChat:https://fluffychat.im \n2. 注册或登录 \n3. 打开邀请链接:\n $link'; + } + + @override + String get isTyping => '正在输入…'; + + @override + String joinedTheChat(String username) { + return '👋 $username 加入了聊天'; + } + + @override + String get joinRoom => '加入聊天室'; + + @override + String kicked(String username, String targetName) { + return '👞 $username 踢出了 $targetName'; + } + + @override + String kickedAndBanned(String username, String targetName) { + return '🙅 $username 踢出并封禁了 $targetName'; + } + + @override + String get kickFromChat => '从聊天室踢出'; + + @override + String lastActiveAgo(String localizedTimeShort) { + return '上次活跃: $localizedTimeShort'; + } + + @override + String get leave => '离开'; + + @override + String get leftTheChat => '离开了聊天'; + + @override + String get license => '许可证'; + + @override + String get lightTheme => '浅色'; + + @override + String loadCountMoreParticipants(int count) { + return '加载 $count 个更多的参与者'; + } + + @override + String get dehydrate => '导出会话并擦除设备'; + + @override + String get dehydrateWarning => '此操作无法撤消。 确保你安全地存储备份文件。'; + + @override + String get dehydrateTor => 'TOR 用户:导出会话'; + + @override + String get dehydrateTorLong => '建议 TOR 用户在关闭窗口之前导出会话。'; + + @override + String get hydrateTor => 'TOR 用户:导入会话导出'; + + @override + String get hydrateTorLong => '你上次是否导出 TOR 会话? 快速导入它并继续聊天。'; + + @override + String get hydrate => '从备份文件恢复'; + + @override + String get loadingPleaseWait => '加载中…请等待。'; + + @override + String get loadMore => '加载更多…'; + + @override + String get locationDisabledNotice => '位置服务已禁用。请启用此服务以分享你的位置.'; + + @override + String get locationPermissionDeniedNotice => '位置权限被拒绝。请授予此权限以分享你的位置.'; + + @override + String get login => '登录'; + + @override + String logInTo(String homeserver) { + return '登录 $homeserver'; + } + + @override + String get logout => '注销'; + + @override + String get memberChanges => '成员变更'; + + @override + String get mention => '提及'; + + @override + String get messages => '消息'; + + @override + String get messagesStyle => '消息:'; + + @override + String get moderator => '协管员'; + + @override + String get muteChat => '静音聊天'; + + @override + String get needPantalaimonWarning => '请注意当前你需要 Pantalaimon 以使用端到端加密功能。'; + + @override + String get newChat => '新的聊天'; + + @override + String get newMessageInFluffyChat => '💬 FluffyChat 新消息'; + + @override + String get newVerificationRequest => '新的验证请求!'; + + @override + String get next => '下一步'; + + @override + String get no => '否'; + + @override + String get noConnectionToTheServer => '无法连接服务器'; + + @override + String get noEmotesFound => '未找到表情。😕'; + + @override + String get noEncryptionForPublicRooms => '你只能在聊天室不可被公众访问时才能启用加密。'; + + @override + String get noGoogleServicesWarning => + '看起来你手机上没有 Firebase Cloud Messaging。如果仍希望接收 FluffyChat 的推送通知,推荐安装 ntfy。借助 ntfy 或另一个 Unified Push 程序,你可以以一种数据安全的方式接收推送通知。你可以从 PlayStore 或 F-Droid 商店下载 ntfy。'; + + @override + String noMatrixServer(String server1, String server2) { + return '$server1 不是一个 Matrix 服务器,试试 $server2?'; + } + + @override + String get shareInviteLink => '分享邀请链接'; + + @override + String get scanQrCode => '扫描二维码'; + + @override + String get none => '无'; + + @override + String get noPasswordRecoveryDescription => '你尚未添加恢复密码的方法。'; + + @override + String get noPermission => '没有权限'; + + @override + String get noRoomsFound => '未找到聊天室…'; + + @override + String get notifications => '通知'; + + @override + String get notificationsEnabledForThisAccount => '已为此账户启用通知'; + + @override + String numUsersTyping(int count) { + return '$count 人正在输入…'; + } + + @override + String get obtainingLocation => '获取位置中…'; + + @override + String get offensive => '令人反感'; + + @override + String get offline => '离线'; + + @override + String get ok => '好'; + + @override + String get online => '在线'; + + @override + String get onlineKeyBackupEnabled => '在线密钥备份已启用'; + + @override + String get oopsPushError => '哎呀!十分不幸,配置推送通知时发生了错误。'; + + @override + String get oopsSomethingWentWrong => '哎呀,出了点差错…'; + + @override + String get openAppToReadMessages => '打开应用以查看消息'; + + @override + String get openCamera => '打开相机'; + + @override + String get openVideoCamera => '打开相机拍摄视频'; + + @override + String get oneClientLoggedOut => '你的一个客户端已登出'; + + @override + String get addAccount => '添加账户'; + + @override + String get editBundlesForAccount => '编辑此账户的集合'; + + @override + String get addToBundle => '添加到集合'; + + @override + String get removeFromBundle => '从此集合中移除'; + + @override + String get bundleName => '集合名称'; + + @override + String get enableMultiAccounts => '(测试功能)在此设备上添加多个账户'; + + @override + String get openInMaps => '在地图中打开'; + + @override + String get link => '链接'; + + @override + String get serverRequiresEmail => '此服务器需要验证你的电子邮件地址以进行注册。'; + + @override + String get or => '或'; + + @override + String get participant => '参与者'; + + @override + String get passphraseOrKey => '密码短语或恢复密钥'; + + @override + String get password => '密码'; + + @override + String get passwordForgotten => '忘记密码'; + + @override + String get passwordHasBeenChanged => '密码已被更改'; + + @override + String get hideMemberChangesInPublicChats => '在公开聊天中隐藏成员变化'; + + @override + String get hideMemberChangesInPublicChatsBody => + '不在聊天时间线中显示某人是否加入或离开了公开聊天来改进可读性。'; + + @override + String get overview => '概览'; + + @override + String get notifyMeFor => '提示内容'; + + @override + String get passwordRecoverySettings => '密码发现设置'; + + @override + String get passwordRecovery => '密码恢复'; + + @override + String get people => '联系人'; + + @override + String get pickImage => '选择图像'; + + @override + String get pin => '置顶'; + + @override + String play(String fileName) { + return '播放 $fileName'; + } + + @override + String get pleaseChoose => '请选择'; + + @override + String get pleaseChooseAPasscode => '请选择一个密码'; + + @override + String get pleaseClickOnLink => '请点击电子邮件中的链接,然后继续。'; + + @override + String get pleaseEnter4Digits => '请输入 4 位数字或留空以停用应用锁。'; + + @override + String get pleaseEnterRecoveryKey => '请输入你的恢复密钥:'; + + @override + String get pleaseEnterYourPassword => '请输入你的密码'; + + @override + String get pleaseEnterYourPin => '请输入你的 PIN'; + + @override + String get pleaseEnterYourUsername => '请输入你的用户名'; + + @override + String get pleaseFollowInstructionsOnWeb => '请按照网站上的提示,点击下一步。'; + + @override + String get privacy => '隐私'; + + @override + String get publicRooms => '公开聊天室'; + + @override + String get pushRules => '推送规则'; + + @override + String get reason => '原因'; + + @override + String get recording => '录制'; + + @override + String redactedBy(String username) { + return '已被 $username 删除'; + } + + @override + String get directChat => '私聊'; + + @override + String redactedByBecause(String username, String reason) { + return '已被 $username 删除,原因:\"$reason\"'; + } + + @override + String redactedAnEvent(String username) { + return '$username 删除了一个事件'; + } + + @override + String get redactMessage => '删除消息'; + + @override + String get register => '注册'; + + @override + String get reject => '拒绝'; + + @override + String rejectedTheInvitation(String username) { + return '$username 拒绝了邀请'; + } + + @override + String get rejoin => '重新加入'; + + @override + String get removeAllOtherDevices => '移除所有其它设备'; + + @override + String removedBy(String username) { + return '被 $username 移除'; + } + + @override + String get removeDevice => '移除设备'; + + @override + String get unbanFromChat => '从聊天中解封'; + + @override + String get removeYourAvatar => '移除你的头像'; + + @override + String get replaceRoomWithNewerVersion => '更新聊天室至新版本'; + + @override + String get reply => '回复'; + + @override + String get reportMessage => '举报信息'; + + @override + String get translateMessage => 'Translate message'; + + @override + String get translatedMessage => 'Translated message'; + + @override + String get errorTranslatingMessage => + 'An error has occured while translating the message.'; + + @override + String get recoverMessage => 'Recover message'; + + @override + String get recoveredMessage => 'Recovered message'; + + @override + String get errorRecoveringMessage => + 'An error has occured while recovering the message.'; + + @override + String get errorRecoveringMessageNoAdmin => + 'This feature is available on Synapse homeservers only for adminstrators.'; + + @override + String get requestPermission => '请求权限'; + + @override + String get roomHasBeenUpgraded => '聊天室已升级'; + + @override + String get roomVersion => '聊天室版本'; + + @override + String get saveFile => '保存文件'; + + @override + String get retry => 'Retry'; + + @override + String get search => '搜索'; + + @override + String get security => '安全'; + + @override + String get recoveryKey => '恢复密钥'; + + @override + String get recoveryKeyLost => '丢失了恢复密钥?'; + + @override + String seenByUser(String username) { + return '被 $username 看见'; + } + + @override + String get send => '发送'; + + @override + String get sendAMessage => '发送一条消息'; + + @override + String get sendAsText => '以文本发送'; + + @override + String get sendAudio => '发送音频'; + + @override + String get sendFile => '发送文件'; + + @override + String get sendImage => '发送图像'; + + @override + String sendImages(int count) { + return '发送 $count 张图片'; + } + + @override + String get sendMessages => '发送消息'; + + @override + String get sendOriginal => '发送原图'; + + @override + String get sendSticker => '发送贴纸'; + + @override + String get sendVideo => '发送视频'; + + @override + String sentAFile(String username) { + return '📁$username 发送了文件'; + } + + @override + String sentAnAudio(String username) { + return '🎤$username 发送了音频'; + } + + @override + String sentAPicture(String username) { + return '🖼️ $username 发送了图片'; + } + + @override + String sentASticker(String username) { + return '😊 $username 发送了贴纸'; + } + + @override + String sentAVideo(String username) { + return '🎥 $username 发送了视频'; + } + + @override + String sentCallInformations(String senderName) { + return '$senderName 发送了通话信息'; + } + + @override + String get separateChatTypes => '分开私聊和群组'; + + @override + String get setAsCanonicalAlias => '设为主要别名'; + + @override + String get setCustomEmotes => '设置自定义表情'; + + @override + String get setChatDescription => '设置聊天描述'; + + @override + String get setInvitationLink => '设置邀请链接'; + + @override + String get setPermissionsLevel => '设置权限级别'; + + @override + String get setStatus => '设置状态'; + + @override + String get settings => '设置'; + + @override + String get share => '分享'; + + @override + String sharedTheLocation(String username) { + return '$username 分享了位置'; + } + + @override + String get shareLocation => '分享位置'; + + @override + String get showPassword => '显示密码'; + + @override + String get presenceStyle => '是否在线:'; + + @override + String get hideAvatarsInInvites => 'Hide avatars in invites'; + + @override + String get hideAvatarsInInvitesDescription => + 'Do not show room avatars in invites'; + + @override + String get presencesToggle => '显示其他用户的状态消息'; + + @override + String get pureBlackToggle => 'Pure Black'; + + @override + String get singlesignon => '单点登录'; + + @override + String get skip => '跳过'; + + @override + String get sourceCode => '源代码'; + + @override + String get spaceIsPublic => '空间是公开的'; + + @override + String get spaceName => '空间名称'; + + @override + String startedACall(String senderName) { + return '$senderName 开始了通话'; + } + + @override + String get startFirstChat => '发起你的第一个聊天'; + + @override + String get status => '状态'; + + @override + String get statusExampleMessage => '你今天怎么样?'; + + @override + String get submit => '提交'; + + @override + String get synchronizingPleaseWait => '同步中…请等待。'; + + @override + String synchronizingPleaseWaitCounter(String percentage) { + return ' 同步中… ($percentage%)'; + } + + @override + String get systemTheme => '系统'; + + @override + String get theyDontMatch => '它们不匹配'; + + @override + String get theyMatch => '它们匹配'; + + @override + String get title => 'FluffyChat'; + + @override + String get toggleFavorite => '切换收藏'; + + @override + String get toggleMuted => '切换静音'; + + @override + String get toggleUnread => '标记已读/未读'; + + @override + String get tooManyRequestsWarning => '请求过多。请稍后再试!'; + + @override + String get transferFromAnotherDevice => '从其它设备传输'; + + @override + String get tryToSendAgain => '尝试重新发送'; + + @override + String get unavailable => '不可用'; + + @override + String unbannedUser(String username, String targetName) { + return '$username 解封了 $targetName'; + } + + @override + String get unblockDevice => '解除屏蔽设备'; + + @override + String get unknownDevice => '未知设备'; + + @override + String get unknownEncryptionAlgorithm => '未知加密算法'; + + @override + String unknownEvent(String type) { + return '未知事件 \'$type\''; + } + + @override + String get unmuteChat => '取消静音聊天'; + + @override + String get unpin => '取消置顶'; + + @override + String unreadChats(int unreadCount) { + String _temp0 = intl.Intl.pluralLogic( + unreadCount, + locale: localeName, + other: '$unreadCount 个未读聊天', + one: '1 个未读聊天', + ); + return '$_temp0'; + } + + @override + String userAndOthersAreTyping(String username, int count) { + return '$username 和其他 $count 人正在输入…'; + } + + @override + String userAndUserAreTyping(String username, String username2) { + return '$username 和 $username2 正在输入…'; + } + + @override + String userIsTyping(String username) { + return '$username 正在输入…'; + } + + @override + String userLeftTheChat(String username) { + return '🚪$username 离开了聊天'; + } + + @override + String get username => '用户名'; + + @override + String userSentUnknownEvent(String username, String type) { + return '$username 发送了一个 $type 事件'; + } + + @override + String get unverified => '未经验证'; + + @override + String get verified => '已验证'; + + @override + String get verify => '验证'; + + @override + String get verifyStart => '开始验证'; + + @override + String get verifySuccess => '你已成功验证!'; + + @override + String get verifyTitle => '验证其它账户'; + + @override + String get videoCall => '视频通话'; + + @override + String get visibilityOfTheChatHistory => '聊天记录的可见性'; + + @override + String get visibleForAllParticipants => '对所有参与者可见'; + + @override + String get visibleForEveryone => '对所有人可见'; + + @override + String get voiceMessage => '语音消息'; + + @override + String get waitingPartnerAcceptRequest => '等待对方接受请求…'; + + @override + String get waitingPartnerEmoji => '等待对方接受 emoji…'; + + @override + String get waitingPartnerNumbers => '等待对方接受数字…'; + + @override + String get wallpaper => '壁纸:'; + + @override + String get warning => '警告!'; + + @override + String get weSentYouAnEmail => '我们向你发送了一封电子邮件'; + + @override + String get whoCanPerformWhichAction => '谁可以执行哪些操作'; + + @override + String get whoIsAllowedToJoinThisGroup => '谁可以加入此群组'; + + @override + String get whyDoYouWantToReportThis => '你举报的理由是什么?'; + + @override + String get wipeChatBackup => '确定要清除你的聊天记录备份以创建新的恢复密钥吗?'; + + @override + String get withTheseAddressesRecoveryDescription => '通过这些地址,你可以恢复密码。'; + + @override + String get writeAMessage => '写一条消息…'; + + @override + String get yes => '是'; + + @override + String get you => '你'; + + @override + String get youAreNoLongerParticipatingInThisChat => '你已不再参与此聊天'; + + @override + String get youHaveBeenBannedFromThisChat => '你已被此聊天封禁'; + + @override + String get yourPublicKey => '你的公钥'; + + @override + String get messageInfo => '消息信息'; + + @override + String get time => '时间'; + + @override + String get messageType => '消息类型'; + + @override + String get sender => '发送者'; + + @override + String get openGallery => '打开图库'; + + @override + String get removeFromSpace => '从此空间中移除'; + + @override + String get addToSpaceDescription => '选择一个空间以添加此聊天。'; + + @override + String get start => '开始'; + + @override + String get pleaseEnterRecoveryKeyDescription => + '要解锁你的旧邮件,请输入你在之前会话中生成的恢复密钥。 你的恢复密钥不是你的密码。'; + + @override + String get publish => '发布'; + + @override + String videoWithSize(String size) { + return '视频 ($size)'; + } + + @override + String get openChat => '打开聊天'; + + @override + String get markAsRead => '标为已读'; + + @override + String get reportUser => '举报用户'; + + @override + String get dismiss => '忽略'; + + @override + String reactedWith(String sender, String reaction) { + return '$sender 回应了 $reaction'; + } + + @override + String get pinMessage => '置顶到聊天室'; + + @override + String get confirmEventUnpin => '你确定要永久性取消置顶此事件吗?'; + + @override + String get emojis => '表情符号'; + + @override + String get placeCall => '发起通话'; + + @override + String get voiceCall => '语音通话'; + + @override + String get unsupportedAndroidVersion => '不受支持的 Android 版本'; + + @override + String get unsupportedAndroidVersionLong => + '这个功能需要较新版本的 Android 系统。请检查更新或 Lineage OS 支持。'; + + @override + String get videoCallsBetaWarning => + '请注意,视频通话目前处于测试阶段。它们可能不能像预期的那样工作,或者在所有平台上都不能工作。'; + + @override + String get experimentalVideoCalls => '实验性的视频通话'; + + @override + String get emailOrUsername => '电子邮箱或用户名'; + + @override + String get indexedDbErrorTitle => '私有模式问题'; + + @override + String get indexedDbErrorLong => + '遗憾的是,默认情况下未在私有模式下启用消息存储。\n请访问\n - about:config\n - 将 dom.indexedDB.privateBrowsing.enabled 设置为 true\n否则,无法运行 FluffyChat。'; + + @override + String switchToAccount(String number) { + return '切换到账户 $number'; + } + + @override + String get nextAccount => '下个账户'; + + @override + String get previousAccount => '上个账户'; + + @override + String get addWidget => '添加小部件'; + + @override + String get widgetVideo => '视频'; + + @override + String get widgetEtherpad => '文本笔记'; + + @override + String get widgetJitsi => 'Jitsi Meet'; + + @override + String get widgetCustom => '自定义'; + + @override + String get widgetName => '名称'; + + @override + String get widgetUrlError => '这不是有效的 URL。'; + + @override + String get widgetNameError => '请提供昵称。'; + + @override + String get errorAddingWidget => '添加小部件出错。'; + + @override + String get youRejectedTheInvitation => '你拒绝了邀请'; + + @override + String get youJoinedTheChat => '你加入了聊天'; + + @override + String get youAcceptedTheInvitation => '👍 你接受了邀请'; + + @override + String youBannedUser(String user) { + return '你封禁了 $user'; + } + + @override + String youHaveWithdrawnTheInvitationFor(String user) { + return '你撤回了对 $user 的邀请'; + } + + @override + String youInvitedToBy(String alias) { + return '📩 你已通过链接被邀请到:\n$alias'; + } + + @override + String youInvitedBy(String user) { + return '📩 你受到了 $user 的邀请'; + } + + @override + String invitedBy(String user) { + return '📩 邀请人 $user'; + } + + @override + String youInvitedUser(String user) { + return '📩 你邀请了 $user'; + } + + @override + String youKicked(String user) { + return '👞 你踢出了 $user'; + } + + @override + String youKickedAndBanned(String user) { + return '🙅 你踢出并封禁了 $user'; + } + + @override + String youUnbannedUser(String user) { + return '你解除了对 $user 的封禁'; + } + + @override + String hasKnocked(String user) { + return '$user 请求了加入聊天室的邀请'; + } + + @override + String get usersMustKnock => '用户必须请求加入'; + + @override + String get noOneCanJoin => '无人可以加入'; + + @override + String userWouldLikeToChangeTheChat(String user) { + return '$user 想加入聊天。'; + } + + @override + String get noPublicLinkHasBeenCreatedYet => '尚未创建公开链接'; + + @override + String get knock => '请求'; + + @override + String get users => '用户'; + + @override + String get unlockOldMessages => '解锁旧消息'; + + @override + String get storeInSecureStorageDescription => '将恢复密钥存储在此设备的安全存储中。'; + + @override + String get saveKeyManuallyDescription => '通过触发系统共享对话框或剪贴板手动保存此密钥。'; + + @override + String get storeInAndroidKeystore => '存储在 Android KeyStore 中'; + + @override + String get storeInAppleKeyChain => '存储在 Apple KeyChain 中'; + + @override + String get storeSecurlyOnThisDevice => '安全地存储在此设备上'; + + @override + String countFiles(int count) { + return '$count 个文件'; + } + + @override + String get user => '用户'; + + @override + String get custom => '自定义'; + + @override + String get foregroundServiceRunning => '此通知在前台服务运行时出现。'; + + @override + String get screenSharingTitle => '屏幕共享'; + + @override + String get screenSharingDetail => '你正在 FluffyChat 中共享屏幕'; + + @override + String get callingPermissions => '呼叫权限'; + + @override + String get callingAccount => '呼叫账户'; + + @override + String get callingAccountDetails => '允许 FluffyChat 使用本机 android 拨号器应用。'; + + @override + String get appearOnTop => '显示在其它应用上方'; + + @override + String get appearOnTopDetails => + '允许应用显示在顶部(如果你已经将 Fluffychat 设置为呼叫账户,则不需要授予此权限)'; + + @override + String get otherCallingPermissions => '麦克风、摄像头和其它 FluffyChat 权限'; + + @override + String get whyIsThisMessageEncrypted => '为什么此消息不可读?'; + + @override + String get noKeyForThisMessage => + '如果消息是在你在此设备上登录账户前发送的,就可能发生这种情况。\n\n也有可能是发送者屏蔽了你的设备或网络连接出了问题。\n\n你能在另一个会话中读取消息吗?如果是的话,你可以从它那里传递信息!点击设置 > 设备,并确保你的设备已经相互验证。当你下次打开聊天室,且两个会话都在前台,密钥就会自动传输。\n\n你不想在注销或切换设备时丢失密钥?请确保在设置中启用了聊天备份。'; + + @override + String get newGroup => '新群组'; + + @override + String get newSpace => '新的空间'; + + @override + String get enterSpace => '进入空间'; + + @override + String get enterRoom => '进入聊天室'; + + @override + String get allSpaces => '所有空间'; + + @override + String numChats(String number) { + return '$number 个聊天'; + } + + @override + String get hideUnimportantStateEvents => '隐藏不重要的状态事件'; + + @override + String get hidePresences => '隐藏状态列表?'; + + @override + String get doNotShowAgain => '不再显示'; + + @override + String wasDirectChatDisplayName(String oldDisplayName) { + return '空聊天(曾是 $oldDisplayName)'; + } + + @override + String get newSpaceDescription => '空间让你可以整合聊天并建立私人或公共社区。'; + + @override + String get encryptThisChat => '加密此聊天'; + + @override + String get disableEncryptionWarning => '出于安全考虑 ,你不能在之前已启用加密的聊天中禁用加密。'; + + @override + String get sorryThatsNotPossible => '非常抱歉……这是做不到的'; + + @override + String get deviceKeys => '设备密钥:'; + + @override + String get reopenChat => '重新打开聊天'; + + @override + String get noBackupWarning => '警告!如果不启用聊天备份,你将无法访问加密消息。强烈建议在注销前先启用聊天备份。'; + + @override + String get noOtherDevicesFound => '未找到其它设备'; + + @override + String fileIsTooBigForServer(String max) { + return '无法发送!服务器只支持最大 $max 的文件。'; + } + + @override + String fileHasBeenSavedAt(String path) { + return '文件已保存在 $path'; + } + + @override + String get jumpToLastReadMessage => '跳转到上次已读的消息'; + + @override + String get readUpToHere => '读到此处'; + + @override + String get jump => '跳转'; + + @override + String get openLinkInBrowser => '在浏览器中打开链接'; + + @override + String get reportErrorDescription => '😭 哦不。出了点差错。如果你愿意,可以向开发人员报告此错误。'; + + @override + String get report => '报错'; + + @override + String get signInWithPassword => '使用密码登录'; + + @override + String get pleaseTryAgainLaterOrChooseDifferentServer => '请稍后再试或选择其它服务器。'; + + @override + String signInWith(String provider) { + return '使用 $provider 登录'; + } + + @override + String get profileNotFound => '服务器上找不到此用户。可能是连接有问题或者用户不存在。'; + + @override + String get setTheme => '设置主题:'; + + @override + String get setColorTheme => '设置主题颜色:'; + + @override + String get invite => '邀请'; + + @override + String get inviteGroupChat => '📨 邀请至群聊'; + + @override + String get invitePrivateChat => '📨 邀请至私聊'; + + @override + String get invalidInput => '无效的输入!'; + + @override + String wrongPinEntered(int seconds) { + return '输入的 PIN 码不正确!请 $seconds 秒后重试…'; + } + + @override + String get pleaseEnterANumber => '请输入大于 0 的数'; + + @override + String get archiveRoomDescription => '聊天将被移至存档。其他用户将能看到你已离开聊天。'; + + @override + String get roomUpgradeDescription => + '将使用新版聊天室来重新创建当前聊天室。所有参与者都会收到通知以切换到新的聊天室。有关聊天室版本的更多信息,请访问 https://spec.matrix.org/latest/rooms/'; + + @override + String get removeDevicesDescription => '你将从此设备登出,无法再接收消息。'; + + @override + String get banUserDescription => '该用户将被禁止进入聊天室,在解除封禁之前将不能再进入聊天室。'; + + @override + String get unbanUserDescription => '如果用户尝试加入则可以再次进入聊天。'; + + @override + String get kickUserDescription => '该用户会被踢出聊天但没被封禁。在公开聊天中,该用户可以随时重新加入。'; + + @override + String get makeAdminDescription => '一旦你将该用户设为管理员,你可能无法撤销,因为他们将拥有与你相同的权限。'; + + @override + String get pushNotificationsNotAvailable => '通知推送不可用'; + + @override + String get learnMore => '了解更多'; + + @override + String get yourGlobalUserIdIs => '你的全局用户 ID 是: '; + + @override + String noUsersFoundWithQuery(String query) { + return '很遗憾,没有找到有关\"$query\"的用户。请检查是否输入错误。'; + } + + @override + String get knocking => '正在请求'; + + @override + String chatCanBeDiscoveredViaSearchOnServer(String server) { + return '可通过搜索 $server 发现聊天'; + } + + @override + String get searchChatsRooms => '搜索 #聊天,@用户…'; + + @override + String get nothingFound => '未找到任何内容…'; + + @override + String get groupName => '群组名称'; + + @override + String get createGroupAndInviteUsers => '创建群组并邀请用户'; + + @override + String get groupCanBeFoundViaSearch => '可通过搜索找到该群组'; + + @override + String get wrongRecoveryKey => '抱歉…这似乎不是正确的恢复密钥。'; + + @override + String get startConversation => '开始对话'; + + @override + String get commandHint_sendraw => '发送原始 json'; + + @override + String get databaseMigrationTitle => '数据库已优化'; + + @override + String get databaseMigrationBody => '请稍候。可能需要稍等片刻。'; + + @override + String get leaveEmptyToClearStatus => '留空以清除你的状态。'; + + @override + String get select => '选择'; + + @override + String get searchForUsers => '搜索 @用户…'; + + @override + String get pleaseEnterYourCurrentPassword => '请输入你当前的密码'; + + @override + String get newPassword => '新的密码'; + + @override + String get pleaseChooseAStrongPassword => '请选择一个强密码'; + + @override + String get passwordsDoNotMatch => '密码不匹配'; + + @override + String get passwordIsWrong => '你输入的密码有误'; + + @override + String get publicLink => '公开链接'; + + @override + String get publicChatAddresses => '公开聊天的地址'; + + @override + String get createNewAddress => '新建地址'; + + @override + String get joinSpace => '加入空间'; + + @override + String get publicSpaces => '公开空间'; + + @override + String get addChatOrSubSpace => '添加聊天或子空间'; + + @override + String get subspace => '子空间'; + + @override + String get decline => '拒绝'; + + @override + String get thisDevice => '此设备:'; + + @override + String get initAppError => '在初始化应用时发生错误'; + + @override + String get userRole => '用户角色'; + + @override + String minimumPowerLevel(String level) { + return '$level 是最低权限等级。'; + } + + @override + String searchIn(String chat) { + return '在 “$chat” 聊天中搜索…'; + } + + @override + String get searchMore => '搜索更多…'; + + @override + String get gallery => '图库'; + + @override + String get files => '文件'; + + @override + String databaseBuildErrorBody(String url, String error) { + return '无法构建 SQLite 数据库。目前应用尝试使用旧数据库。请将此错误报告给开发者,网址为 $url。错误消息为:$error'; + } + + @override + String sessionLostBody(String url, String error) { + return '你的会话已丢失。请将此错误报告给开发者,网址为 $url。错误消息为:$error'; + } + + @override + String restoreSessionBody(String url, String error) { + return '应用现在尝试从备份中恢复你的会话。请将此错误报告给开发者,网址为 $url。错误消息为:$error'; + } + + @override + String forwardMessageTo(String roomName) { + return '转发消息至 $roomName ?'; + } + + @override + String get sendReadReceipts => '发送已读回执'; + + @override + String get sendTypingNotificationsDescription => '聊天中的其他参与者可以看到你正在输入新消息。'; + + @override + String get sendReadReceiptsDescription => '聊天中的其他参与者可以看到你是否读过消息。'; + + @override + String get formattedMessages => '格式化的消息'; + + @override + String get formattedMessagesDescription => '使用 Markdown 显示富文本内容,例如加粗文本。'; + + @override + String get verifyOtherUser => '🔐 验证其他用户'; + + @override + String get verifyOtherUserDescription => + '如果你验证了其他用户,就可以确保你清楚自己正在与谁进行通信。💪\n\n当你开始验证时,你和其他用户将在应用中看到一个弹出窗口。然后你会看到一系列表情符号或数字,你和其他用户需要比较它们是否一致。\n\n最好的方式是线下会面或开始视频通话。👭'; + + @override + String get verifyOtherDevice => '🔐 验证其它设备'; + + @override + String get verifyOtherDeviceDescription => + '当你验证另一个设备时,这些设备可以交换密钥,从而提高整体安全性。 💪 当你开始验证时,两个设备上的应用都将显示一个弹出窗口。然后你会看到一系列表情符号或数字,你需要比较两个设备上显示的内容。在开始验证之前,最好将两个设备都放在手边。🤳'; + + @override + String acceptedKeyVerification(String sender) { + return '$sender 接受了密钥验证'; + } + + @override + String canceledKeyVerification(String sender) { + return '$sender 取消了密钥验证'; + } + + @override + String completedKeyVerification(String sender) { + return '$sender 完成了密钥验证'; + } + + @override + String isReadyForKeyVerification(String sender) { + return '$sender 已准备好进行密钥验证'; + } + + @override + String requestedKeyVerification(String sender) { + return '$sender 请求了密钥验证'; + } + + @override + String startedKeyVerification(String sender) { + return '$sender 开始了密钥验证'; + } + + @override + String get transparent => '透明'; + + @override + String get incomingMessages => '传入消息'; + + @override + String get stickers => '贴纸'; + + @override + String get discover => '发现'; + + @override + String get commandHint_ignore => '忽略给定的 matrix ID'; + + @override + String get commandHint_unignore => '取消忽略给定的 matrix ID'; + + @override + String unreadChatsInApp(String appname, String unread) { + return '$appname: $unread 未读聊天'; + } + + @override + String get noDatabaseEncryption => '数据库加密在此平台上不受支持'; + + @override + String thereAreCountUsersBlocked(Object count) { + return '目前有 $count 名用户被封禁。'; + } + + @override + String get restricted => '受限'; + + @override + String get knockRestricted => '“请求加入”请求受限'; + + @override + String goToSpace(Object space) { + return '转到空间:$space'; + } + + @override + String get markAsUnread => '标为未读'; + + @override + String userLevel(int level) { + return '$level - 用户'; + } + + @override + String moderatorLevel(int level) { + return '$level - 主持人'; + } + + @override + String adminLevel(int level) { + return '$level - 管理员'; + } + + @override + String get changeGeneralChatSettings => '更改常规聊天设置'; + + @override + String get inviteOtherUsers => '邀请其他用户到这个聊天'; + + @override + String get changeTheChatPermissions => '更改聊天权限'; + + @override + String get changeTheVisibilityOfChatHistory => '更改聊天历史的可见性'; + + @override + String get changeTheCanonicalRoomAlias => '更改主公共聊天地址'; + + @override + String get sendRoomNotifications => '发送通知聊天室所有人的通知'; + + @override + String get changeTheDescriptionOfTheGroup => '更改聊天描述'; + + @override + String get chatPermissionsDescription => + '定义此聊天中哪个权限等级对特定操作是必需的。权限等级 0、50 和 100 通常代表用户、主持人和管理员,但你可以自定义任何等级。'; + + @override + String updateInstalled(String version) { + return '🎉 已安装更新 $version !'; + } + + @override + String get changelog => '更新记录'; + + @override + String get sendCanceled => '发送被取消'; + + @override + String get loginWithMatrixId => '使用 Matrix-ID 登录'; + + @override + String get discoverHomeservers => '发现主服务器'; + + @override + String get whatIsAHomeserver => '什么是主服务器?'; + + @override + String get homeserverDescription => + '主服务器上就像电子邮件提供商,你的所有数据都存储在上面。你可以选择你想使用哪个主服务器。在 https://matrix.org 上了解更多信息。'; + + @override + String get doesNotSeemToBeAValidHomeserver => '似乎不是兼容的主服务器。URL 不正确?'; + + @override + String get calculatingFileSize => '计算文件尺寸中…'; + + @override + String get prepareSendingAttachment => '准备发送附件…'; + + @override + String get sendingAttachment => '发送附件中…'; + + @override + String get generatingVideoThumbnail => '生成视频缩略图中…'; + + @override + String get compressVideo => '压缩视频中…'; + + @override + String sendingAttachmentCountOfCount(int index, int length) { + return '正在发送附件 $index,共 $length 个附件…'; + } + + @override + String serverLimitReached(int seconds) { + return '达到了服务器限制!等待 $seconds 秒…'; + } + + @override + String get oneOfYourDevicesIsNotVerified => '您设备中的一台未验证'; + + @override + String get noticeChatBackupDeviceVerification => + '注意:当你连接所有设备到聊天备份时,这些设备将被自动验证。'; + + @override + String get continueText => '继续'; + + @override + String get welcomeText => + '你好呀 👋 欢迎来到 FluffyChat。你可以登录任意兼容 https://matrix.org 的 homeserver,然后和任何人聊天。这是个巨大的去中心化消息网络!'; + + @override + String get blur => '模糊:'; + + @override + String get opacity => '不透明:'; + + @override + String get setWallpaper => '设置壁纸'; + + @override + String get manageAccount => '管理账户'; + + @override + String get noContactInformationProvided => '服务器未提供任何有效的联系信息'; + + @override + String get contactServerAdmin => '联系服务器管理员'; + + @override + String get contactServerSecurity => '联系服务器安全管理'; + + @override + String get supportPage => '支持页面'; + + @override + String get serverInformation => '服务器信息:'; + + @override + String get name => '名称'; + + @override + String get version => '版本'; + + @override + String get website => '网站'; + + @override + String get compress => '压缩'; + + @override + String get boldText => '文本加粗'; + + @override + String get italicText => '文件倾斜'; + + @override + String get strikeThrough => '删除线'; + + @override + String get pleaseFillOut => '请填写'; + + @override + String get invalidUrl => '无效 url'; + + @override + String get addLink => '添加链接'; + + @override + String get unableToJoinChat => '无法加入聊天。可能其他方面已经关闭了对话。'; + + @override + String get previous => '前一个'; + + @override + String get otherPartyNotLoggedIn => '另一方当前未登录,因而无法接收消息!'; + + @override + String appWantsToUseForLogin(String server) { + return '使用 \'$server\'服务器登录'; + } + + @override + String get appWantsToUseForLoginDescription => '您特此允许本应用和网站分享关于您的信息。'; + + @override + String get open => '打开'; + + @override + String get waitingForServer => '正在等待服务器…'; + + @override + String get appIntroduction => + 'FluffyChat 让使用不同即时通信工具的你和你的好友得以聊天。 访问 https://matrix.org 了解详情或轻按 *继续*。'; + + @override + String get newChatRequest => '📩 新的聊天请求'; + + @override + String get contentNotificationSettings => '内容通知设置'; + + @override + String get generalNotificationSettings => '常规通知设置'; + + @override + String get roomNotificationSettings => '聊天室通知设置'; + + @override + String get userSpecificNotificationSettings => '使用特定通知设置'; + + @override + String get otherNotificationSettings => '其他通知设置'; + + @override + String get notificationRuleContainsUserName => '包含用户名'; + + @override + String get notificationRuleContainsUserNameDescription => + '当消息包含用户名时通知使用该用户名的用户。'; + + @override + String get notificationRuleMaster => '静音所有通知'; + + @override + String get notificationRuleMasterDescription => '覆盖所有其他规则并禁用所有通知。'; + + @override + String get notificationRuleSuppressNotices => '隐藏自动消息'; + + @override + String get notificationRuleSuppressNoticesDescription => + '隐藏来自 bot 等自动客户端的通知。'; + + @override + String get notificationRuleInviteForMe => '给我的邀请'; + + @override + String get notificationRuleInviteForMeDescription => '当用户被邀请加入聊天室时提醒用户。'; + + @override + String get notificationRuleMemberEvent => '成员事件'; + + @override + String get notificationRuleMemberEventDescription => '隐藏成员身份事件通知。'; + + @override + String get notificationRuleIsUserMention => '用户提及'; + + @override + String get notificationRuleIsUserMentionDescription => + '当消息中直接提到用户名时通知使用该用户名的用户。'; + + @override + String get notificationRuleContainsDisplayName => '包含展示名称'; + + @override + String get notificationRuleContainsDisplayNameDescription => + '当消息包含用户的展示名时提醒使用该展示名的用户。'; + + @override + String get notificationRuleIsRoomMention => '聊天室提及'; + + @override + String get notificationRuleIsRoomMentionDescription => '有聊天室提及时通知用户。'; + + @override + String get notificationRuleRoomnotif => '聊天室通知'; + + @override + String get notificationRuleRoomnotifDescription => '消息包含 \"@room\" 时提醒用户。'; + + @override + String get notificationRuleTombstone => '墓碑'; + + @override + String get notificationRuleTombstoneDescription => '提醒用户聊天室解散的消息。'; + + @override + String get notificationRuleReaction => '回应'; + + @override + String get notificationRuleReactionDescription => '隐藏回应通知。'; + + @override + String get notificationRuleRoomServerAcl => '聊天室服务器 ACL'; + + @override + String get notificationRuleRoomServerAclDescription => + '隐藏聊天室服务器访问控制列表(ACL)通知。'; + + @override + String get notificationRuleSuppressEdits => '隐藏编辑'; + + @override + String get notificationRuleSuppressEditsDescription => '隐藏消息编辑通知。'; + + @override + String get notificationRuleCall => '通话'; + + @override + String get notificationRuleCallDescription => '提醒用户通话的消息。'; + + @override + String get notificationRuleEncryptedRoomOneToOne => '已加密一对一聊天室'; + + @override + String get notificationRuleEncryptedRoomOneToOneDescription => + '在已加密一对一聊天室中提醒用户消息。'; + + @override + String get notificationRuleRoomOneToOne => '一对一聊天室'; + + @override + String get notificationRuleRoomOneToOneDescription => '在一对一聊天室中提醒用户消息。'; + + @override + String get notificationRuleMessage => '消息'; + + @override + String get notificationRuleMessageDescription => '提醒用户常规消息。'; + + @override + String get notificationRuleEncrypted => '已加密'; + + @override + String get notificationRuleEncryptedDescription => '在已加密聊天室中提醒用户消息。'; + + @override + String get notificationRuleJitsi => 'Jitsi'; + + @override + String get notificationRuleJitsiDescription => '提醒用户 Jitsi 小部件的事件。'; + + @override + String get notificationRuleServerAcl => '隐藏服务器 ACL 事件'; + + @override + String get notificationRuleServerAclDescription => '隐藏服务器 ACL 事件的通知。'; + + @override + String unknownPushRule(String rule) { + return '未知推送规则 \'$rule\''; + } + + @override + String get deletePushRuleCanNotBeUndone => '删除这个通知设置的操作无法撤销。'; + + @override + String get more => '更多'; + + @override + String get shareKeysWith => '与哪些设备分享密钥…'; + + @override + String get shareKeysWithDescription => '选择应当信任哪些设备允许它们读取你在加密聊天中的消息?'; + + @override + String get allDevices => '所有设备'; + + @override + String get crossVerifiedDevicesIfEnabled => '交叉验证设备(如启用)'; + + @override + String get crossVerifiedDevices => '交叉验证设备'; + + @override + String get verifiedDevicesOnly => '仅已验证设备'; + + @override + String get takeAPhoto => '拍照'; + + @override + String get recordAVideo => '录像'; + + @override + String get optionalMessage => '(可选)消息…'; + + @override + String get notSupportedOnThisDevice => '此设备上不受支持'; + + @override + String get enterNewChat => '进入新聊天'; + + @override + String get approve => 'Approve'; + + @override + String get youHaveKnocked => 'You have knocked'; + + @override + String get pleaseWaitUntilInvited => + 'Please wait now, until someone from the room invites you.'; +} + +/// The translations for Chinese, using the Han script (`zh_Hant`). +class L10nZhHant extends L10nZh { + L10nZhHant() : super('zh_Hant'); + + @override + String get alwaysUse24HourFormat => 'false'; + + @override + String get repeatPassword => '再次輸入密碼'; + + @override + String get notAnImage => '不是圖片檔案。'; + + @override + String get remove => '移除'; + + @override + String get importNow => '立即匯入'; + + @override + String get importEmojis => '匯入表情包'; + + @override + String get importFromZipFile => '從 .zip 檔案匯入'; + + @override + String get exportEmotePack => '將表情包匯出成 .zip 檔案'; + + @override + String get replace => '取代'; + + @override + String get about => '關於'; + + @override + String aboutHomeserver(String homeserver) { + return '關於$homeserver'; + } + + @override + String get accept => '同意'; + + @override + String acceptedTheInvitation(String username) { + return '👍 $username 已接受邀請'; + } + + @override + String get account => '帳號'; + + @override + String activatedEndToEndEncryption(String username) { + return '🔐 $username 已啟用點對點加密'; + } + + @override + String get addEmail => '新增電子郵件'; + + @override + String get confirmMatrixId => '如需刪除你的帳戶,請確認你的 Matrix ID。'; + + @override + String supposedMxid(String mxid) { + return '此處應爲 $mxid'; + } + + @override + String get addChatDescription => '新增聊天室描述......'; + + @override + String get addToSpace => '加入空間'; + + @override + String get admin => '管理員'; + + @override + String get alias => '別稱'; + + @override + String get all => '全部'; + + @override + String get allChats => '所有會話'; + + @override + String get commandHint_roomupgrade => '升級此聊天室至指定版本'; + + @override + String get commandHint_googly => '傳送一些瞪眼表情'; + + @override + String get commandHint_cuddle => '傳送一個摟抱表情'; + + @override + String get commandHint_hug => '傳送一個擁抱表情'; + + @override + String googlyEyesContent(String senderName) { + return '$senderName 向您傳送了瞪眼表情'; + } + + @override + String cuddleContent(String senderName) { + return '$senderName 摟抱您'; + } + + @override + String hugContent(String senderName) { + return '$senderName 擁抱您'; + } + + @override + String answeredTheCall(String senderName) { + return '已開始與 $senderName 通話'; + } + + @override + String get anyoneCanJoin => '任何人可以加入'; + + @override + String get appLock => '密碼鎖定'; + + @override + String get appLockDescription => '未使用時以密碼鎖定應用程式'; + + @override + String get archive => '封存'; + + @override + String get areGuestsAllowedToJoin => '是否允許訪客加入'; + + @override + String get areYouSure => '您確定嗎?'; + + @override + String get areYouSureYouWantToLogout => '您確定要登出嗎?'; + + @override + String get askSSSSSign => '請輸入您安全儲存的密碼短語或恢復金鑰,以向對方簽名。'; + + @override + String askVerificationRequest(String username) { + return '是否接受來自 $username 的驗證申請?'; + } + + @override + String get autoplayImages => '自動播放動態貼圖和表情'; + + @override + String badServerLoginTypesException(String serverVersions, + String supportedVersions, Object suportedVersions) { + return '目前伺服器支援的登入類型:\n$serverVersions\n但本應用程式僅支援:\n$supportedVersions'; + } + + @override + String get sendTypingNotifications => '傳送「輸入中」通知'; + + @override + String get swipeRightToLeftToReply => '向右滑至左以回覆'; + + @override + String get sendOnEnter => '按 Enter 鍵傳送'; + + @override + String badServerVersionsException(String serverVersions, + String supportedVersions, Object serverVerions, Object suportedVersions) { + return '目前伺服器支援的協議版本:\n$serverVersions\n但本應用程式僅支援 $supportedVersions'; + } + + @override + String countChatsAndCountParticipants(int chats, int participants) { + return '$chats 個聊天室和 $participants 位參與者'; + } + + @override + String get noMoreChatsFound => '沒有更多聊天室了...'; + + @override + String get noChatsFoundHere => '還沒開始聊天嗎?點擊下方按鈕找個人聊聊吧⤵'; + + @override + String get joinedChats => '已加入的聊天室'; + + @override + String get unread => '未讀'; + + @override + String get space => '空間'; + + @override + String get spaces => '空間'; + + @override + String get banFromChat => '已從聊天室中封鎖'; + + @override + String get banned => '已被封鎖'; + + @override + String bannedUser(String username, String targetName) { + return '$username 封鎖了 $targetName'; + } + + @override + String get blockDevice => '封鎖裝置'; + + @override + String get blocked => '已封鎖'; + + @override + String get botMessages => '機器人訊息'; + + @override + String get cancel => '取消'; + + @override + String cantOpenUri(String uri) { + return '無法打開 URI $uri'; + } + + @override + String get changeDeviceName => '變更裝置名稱'; + + @override + String changedTheChatAvatar(String username) { + return '$username 變更了對話頭貼'; + } + + @override + String changedTheChatDescriptionTo(String username, String description) { + return '$username 把聊天室介紹變更為:「$description」'; + } + + @override + String changedTheChatNameTo(String username, String chatname) { + return '$username 把聊天室名稱變更為:「$chatname」'; + } + + @override + String changedTheChatPermissions(String username) { + return '$username 變更了對話權限'; + } + + @override + String changedTheDisplaynameTo(String username, String displayname) { + return '$username 變更了顯示名稱為:「$displayname」'; + } + + @override + String changedTheGuestAccessRules(String username) { + return '$username 變更了訪客訪問規則'; + } + + @override + String changedTheGuestAccessRulesTo(String username, String rules) { + return '$username 變更了訪客訪問規則為:$rules'; + } + + @override + String changedTheHistoryVisibility(String username) { + return '$username 變更了歷史記錄觀察狀態'; + } + + @override + String changedTheHistoryVisibilityTo(String username, String rules) { + return '$username 變更了歷史紀錄觀察狀態到:$rules'; + } + + @override + String changedTheJoinRules(String username) { + return '$username 變更了加入的規則'; + } + + @override + String changedTheJoinRulesTo(String username, String joinRules) { + return '$username 變更了加入的規則為:$joinRules'; + } + + @override + String changedTheProfileAvatar(String username) { + return '$username 變更了頭貼'; + } + + @override + String changedTheRoomAliases(String username) { + return '$username 變更了聊天室名'; + } + + @override + String changedTheRoomInvitationLink(String username) { + return '$username 變更了邀請連結'; + } + + @override + String get changePassword => '變更密碼'; + + @override + String get changeTheHomeserver => '變更主機位址'; + + @override + String get changeTheme => '變更主題'; + + @override + String get changeTheNameOfTheGroup => '變更了群組名稱'; + + @override + String get changeYourAvatar => '更改您的大頭貼'; + + @override + String get channelCorruptedDecryptError => '加密已被破壞'; + + @override + String get chat => '聊天室'; + + @override + String get yourChatBackupHasBeenSetUp => '您的聊天室記錄備份已設定。'; + + @override + String get chatBackup => '備份聊天室'; + + @override + String get chatBackupDescription => '您的過往聊天室記錄已被恢復金鑰加密。請您確保不會弄丟它。'; + + @override + String get chatDetails => '對話詳細'; + + @override + String get chatHasBeenAddedToThisSpace => '聊天室已新增到此空間'; + + @override + String get chats => '聊天室'; + + @override + String get chooseAStrongPassword => '輸入一個較強的密碼'; + + @override + String get clearArchive => '清除存檔'; + + @override + String get close => '關閉'; + + @override + String get commandHint_markasdm => '將給定的 Matrix ID 標示為直接訊息房間'; + + @override + String get commandHint_markasgroup => '標示為群組'; + + @override + String get commandHint_ban => '在此聊天室封鎖該使用者'; + + @override + String get commandHint_clearcache => '清除快取'; + + @override + String get commandHint_create => '建立一個空的群聊\n使用 --no-encryption 選項來停用加密'; + + @override + String get commandHint_discardsession => '丟棄工作階段'; + + @override + String get commandHint_dm => '啟動一對一聊天室\n使用 --no-encryption 選項來停用加密'; + + @override + String get commandHint_html => '傳送 HTML 格式的文字'; + + @override + String get commandHint_invite => '邀請該使用者加入此聊天室'; + + @override + String get commandHint_join => '加入此聊天室'; + + @override + String get commandHint_kick => '將這個使用者移出此聊天室'; + + @override + String get commandHint_leave => '退出此聊天室'; + + @override + String get commandHint_me => '描述自己'; + + @override + String get commandHint_myroomavatar => '設定您的聊天室頭貼(通過 mxc-uri)'; + + @override + String get commandHint_myroomnick => '設定您的聊天室暱稱'; + + @override + String get commandHint_op => '設定給定使用者的權限等級(預設:50)'; + + @override + String get commandHint_plain => '傳送未格式化的文字'; + + @override + String get commandHint_react => '以反應的形式傳送回覆'; + + @override + String get commandHint_send => '傳送文字'; + + @override + String get commandHint_unban => '在此聊天室解除封鎖該使用者'; + + @override + String get commandInvalid => '命令無效'; + + @override + String commandMissing(String command) { + return '$command 不是正確的命令。'; + } + + @override + String get compareEmojiMatch => '請對比這些表情'; + + @override + String get compareNumbersMatch => '請對比這些數字'; + + @override + String get configureChat => '設定聊天室'; + + @override + String get confirm => '確認'; + + @override + String get connect => '連接'; + + @override + String get contactHasBeenInvitedToTheGroup => '聯絡人已被邀請至群組'; + + @override + String get containsDisplayName => '包含顯示名稱'; + + @override + String get containsUserName => '包含使用者名稱'; + + @override + String get contentHasBeenReported => '此內容已被回報給伺服器管理員們'; + + @override + String get copiedToClipboard => '已複製到剪貼簿'; + + @override + String get copy => '複製'; + + @override + String get copyToClipboard => '複製到剪貼簿'; + + @override + String couldNotDecryptMessage(String error) { + return '不能解密訊息:$error'; + } + + @override + String countParticipants(int count) { + return '$count 個參與者'; + } + + @override + String get create => '建立'; + + @override + String createdTheChat(String username) { + return '💬 $username 建立了聊天室'; + } + + @override + String get createGroup => '建立群組'; + + @override + String get createNewSpace => '新建空間'; + + @override + String get currentlyActive => '目前活躍'; + + @override + String get darkTheme => '夜間模式'; + + @override + String dateAndTimeOfDay(String date, String timeOfDay) { + return '$date , $timeOfDay'; + } + + @override + String dateWithoutYear(String month, String day) { + return '$month - $day'; + } + + @override + String dateWithYear(String year, String month, String day) { + return '$year - $month - $day'; + } + + @override + String get deactivateAccountWarning => '這將停用您的帳號。這個決定是不能挽回的!您確定嗎?'; + + @override + String get defaultPermissionLevel => '預設權限等級'; + + @override + String get delete => '刪除'; + + @override + String get deleteAccount => '刪除帳號'; + + @override + String get deleteMessage => '刪除訊息'; + + @override + String get device => '裝置'; + + @override + String get deviceId => '裝置ID'; + + @override + String get devices => '裝置'; + + @override + String get directChats => '直接傳訊'; + + @override + String get allRooms => '所有群組聊天室'; + + @override + String get displaynameHasBeenChanged => '顯示名稱已被變更'; + + @override + String get downloadFile => '下載文件'; + + @override + String get edit => '編輯'; + + @override + String get editBlockedServers => '編輯被封鎖的伺服器'; + + @override + String get chatPermissions => '聊天室權限'; + + @override + String get editDisplayname => '編輯顯示名稱'; + + @override + String get editRoomAliases => '編輯聊天室名'; + + @override + String get editRoomAvatar => '編輯聊天室頭貼'; + + @override + String get emoteExists => '表情已存在!'; + + @override + String get emoteInvalid => '無效的表情快捷鍵!'; + + @override + String get emoteKeyboardNoRecents => '最近使用的表情將顯示在這裡...'; + + @override + String get emotePacks => '聊天室的表情符號'; + + @override + String get emoteSettings => '表情設定'; + + @override + String get globalChatId => '全球聊天室 ID'; + + @override + String get accessAndVisibility => '訪問權限和可見性'; + + @override + String get accessAndVisibilityDescription => '誰被允許加入此聊天室以及如何發現聊天室。'; + + @override + String get calls => '通話'; + + @override + String get customEmojisAndStickers => '自訂表情符號和貼圖'; + + @override + String get customEmojisAndStickersBody => '新增或分享可在任何聊天室中使用的自訂表情符號或貼圖。'; + + @override + String get emoteShortcode => '表情快捷鍵'; + + @override + String get emoteWarnNeedToPick => '您需要選取一個表情快捷鍵和一張圖片!'; + + @override + String get emptyChat => '空的聊天室'; + + @override + String get enableEmotesGlobally => '在全域啟用表情符號'; + + @override + String get enableEncryption => '啟用加密'; + + @override + String get enableEncryptionWarning => '您將不能再停用加密,確定嗎?'; + + @override + String get encrypted => '已加密的'; + + @override + String get encryption => '加密'; + + @override + String get encryptionNotEnabled => '加密未啟用'; + + @override + String endedTheCall(String senderName) { + return '$senderName 結束了通話'; + } + + @override + String get enterAnEmailAddress => '輸入一個電子郵件位址'; + + @override + String get homeserver => '伺服器'; + + @override + String get enterYourHomeserver => '輸入伺服器位址'; + + @override + String errorObtainingLocation(String error) { + return '取得位置錯誤:$error'; + } + + @override + String get everythingReady => '一切就緒!'; + + @override + String get extremeOffensive => '極端令人反感'; + + @override + String get fileName => '檔案名稱'; + + @override + String get fluffychat => 'FluffyChat'; + + @override + String get fontSize => '字體大小'; + + @override + String get forward => '轉發'; + + @override + String get fromJoining => '自加入起'; + + @override + String get fromTheInvitation => '自邀請起'; + + @override + String get goToTheNewRoom => '前往新聊天室'; + + @override + String get group => '群組'; + + @override + String get chatDescription => '聊天室描述'; + + @override + String get chatDescriptionHasBeenChanged => '聊天室描述已變更'; + + @override + String get groupIsPublic => '群組是公開的'; + + @override + String get groups => '群組'; + + @override + String groupWith(String displayname) { + return '名稱為 $displayname 的群組'; + } + + @override + String get guestsAreForbidden => '訪客已被禁止'; + + @override + String get guestsCanJoin => '訪客可以加入'; + + @override + String hasWithdrawnTheInvitationFor(String username, String targetName) { + return '$username 收回了對 $targetName 的邀請'; + } + + @override + String get help => '幫助'; + + @override + String get hideRedactedEvents => '隱藏編輯過的事件'; + + @override + String get hideRedactedMessages => '隱藏被刪除的訊息'; + + @override + String get hideRedactedMessagesBody => '如果有人收回一條訊息,該訊息將不再在聊天室中顯示。'; + + @override + String get hideInvalidOrUnknownMessageFormats => '隱藏無效或未知的訊息格式'; + + @override + String get howOffensiveIsThisContent => '這個內容有多令人反感?'; + + @override + String get id => 'ID'; + + @override + String get identity => '身份'; + + @override + String get block => '封鎖'; + + @override + String get blockedUsers => '已封鎖的使用者'; + + @override + String get blockListDescription => '你可以封鎖打擾你的使用者。你不會再收到任何從已封鎖使用者發來的訊息或聊天室邀請。'; + + @override + String get blockUsername => '無視使用者名稱'; + + @override + String get iHaveClickedOnLink => '我已經點擊了網址'; + + @override + String get incorrectPassphraseOrKey => '錯誤的密碼短語或恢復金鑰'; + + @override + String get inoffensive => '不令人反感'; + + @override + String get inviteContact => '邀請聯絡人'; + + @override + String inviteContactToGroupQuestion(Object contact, Object groupName) { + return '您想邀請 $contact 加入 「$groupName」 聊天室嗎?'; + } + + @override + String inviteContactToGroup(String groupName) { + return '邀請聯絡人到 $groupName'; + } + + @override + String get noChatDescriptionYet => '尚未建立聊天室描述。'; + + @override + String get tryAgain => '再試一次'; + + @override + String get invalidServerName => '伺服器名稱錯誤'; + + @override + String get invited => '已邀請'; + + @override + String get redactMessageDescription => '該訊息將對此對話中的所有參與者收回。這不能被反悔。'; + + @override + String get optionalRedactReason => '(非必填)收回此訊息的原因...'; + + @override + String invitedUser(String username, String targetName) { + return '📩 $username 邀請了 $targetName'; + } + + @override + String get invitedUsersOnly => '只有被邀請的使用者'; + + @override + String get inviteForMe => '來自我的邀請'; + + @override + String inviteText(String username, String link) { + return '$username 邀請您使用 FluffyChat\n1. 安裝 FluffyChat:https://fluffychat.im\n2. 登入或註冊\n3. 打開該邀請網址:\n$link'; + } + + @override + String get isTyping => '正在輸入...…'; + + @override + String joinedTheChat(String username) { + return '👋 $username 加入了聊天室'; + } + + @override + String get joinRoom => '加入聊天室'; + + @override + String kicked(String username, String targetName) { + return '👞 $username 踢了 $targetName'; + } + + @override + String kickedAndBanned(String username, String targetName) { + return '🙅 $username 踢了 $targetName 並將其封鎖'; + } + + @override + String get kickFromChat => '從聊天室踢出'; + + @override + String lastActiveAgo(String localizedTimeShort) { + return '最後活動時間:$localizedTimeShort'; + } + + @override + String get leave => '離開'; + + @override + String get leftTheChat => '離開了聊天室'; + + @override + String get license => '授權'; + + @override + String get lightTheme => '日間模式'; + + @override + String loadCountMoreParticipants(int count) { + return '載入 $count 個更多的參與者'; + } + + @override + String get dehydrate => '匯出會話並清除裝置'; + + @override + String get dehydrateWarning => '此操作不能反悔。請確保安全地存儲備份文件。'; + + @override + String get dehydrateTor => 'TOR 使用者:匯出會話'; + + @override + String get dehydrateTorLong => '對 TOR 使用者,建議在關閉窗口前匯出會話。'; + + @override + String get hydrateTor => 'TOR 使用者:匯入會話'; + + @override + String get hydrateTorLong => '上次在 TOR 上匯出會話了嗎?快速匯入它已繼續使用聊天室。'; + + @override + String get hydrate => '從備份文件恢復'; + + @override + String get loadingPleaseWait => '載入中...... 請稍候。'; + + @override + String get loadMore => '載入更多...…'; + + @override + String get locationDisabledNotice => '位置服務被停用。請啟用它們以能夠分享您的位置。'; + + @override + String get locationPermissionDeniedNotice => '位置權限被拒絕。請授予它們以能夠分享您的位置。'; + + @override + String get login => '登入'; + + @override + String logInTo(String homeserver) { + return '登入 $homeserver'; + } + + @override + String get logout => '登出'; + + @override + String get memberChanges => '變更成員'; + + @override + String get mention => '提及'; + + @override + String get messages => '訊息'; + + @override + String get messagesStyle => '訊息樣式:'; + + @override + String get moderator => '版主'; + + @override + String get muteChat => '將該聊天室靜音'; + + @override + String get needPantalaimonWarning => '請注意您需要 Pantalaimon 才能使用點對點加密功能。'; + + @override + String get newChat => '新聊天'; + + @override + String get newMessageInFluffyChat => '💬 來自 FluffyChat 的新訊息'; + + @override + String get newVerificationRequest => '新的驗證請求!'; + + @override + String get next => '下一個'; + + @override + String get no => '否'; + + @override + String get noConnectionToTheServer => '無法連接到伺服器'; + + @override + String get noEmotesFound => '表情符號不存在。😕'; + + @override + String get noEncryptionForPublicRooms => '您只能在這個聊天室不再被允許公開訪問後,才能啟用加密。'; + + @override + String get noGoogleServicesWarning => + '您手機上沒有安裝 Google 服務框架。這或許對於保護您的隱私而言是個好事!但為了收到 FluffyChat 的推播通知,我們建議您使用 https://microg.org 或 https://unifiedpush.org。'; + + @override + String noMatrixServer(String server1, String server2) { + return '$server1 不是 Matrix 服務器,改用 $server2 嗎?'; + } + + @override + String get shareInviteLink => '分享邀請網址'; + + @override + String get scanQrCode => '掃描 QR 碼'; + + @override + String get none => '無'; + + @override + String get noPasswordRecoveryDescription => '您尚未新增恢復密碼的方法。'; + + @override + String get noPermission => '沒有權限'; + + @override + String get noRoomsFound => '找不到聊天室...…'; + + @override + String get notifications => '通知'; + + @override + String get notificationsEnabledForThisAccount => '已為此帳號啟用通知'; + + @override + String numUsersTyping(int count) { + return '$count 個人正在輸入...…'; + } + + @override + String get obtainingLocation => '正在取得位置…'; + + @override + String get offensive => '令人反感'; + + @override + String get offline => '離線'; + + @override + String get ok => 'OK'; + + @override + String get online => '線上'; + + @override + String get onlineKeyBackupEnabled => '線上金鑰備份已啟用'; + + @override + String get oopsPushError => '哎呀!設定推送通知時不幸發生錯誤。'; + + @override + String get oopsSomethingWentWrong => '哎呀!出了一點差錯...…'; + + @override + String get openAppToReadMessages => '打開應用程式以讀取訊息'; + + @override + String get openCamera => '開啟相機'; + + @override + String get openVideoCamera => '打開錄影'; + + @override + String get oneClientLoggedOut => '您的一個客戶端已登出'; + + @override + String get addAccount => '新增帳號'; + + @override + String get editBundlesForAccount => '為此帳號編輯套組'; + + @override + String get addToBundle => '新增到套組'; + + @override + String get removeFromBundle => '從此套組中移除'; + + @override + String get bundleName => '套組名稱'; + + @override + String get enableMultiAccounts => '(實驗性功能)在此裝置上啟用多個帳號'; + + @override + String get openInMaps => '在地圖中打開'; + + @override + String get link => '網址'; + + @override + String get serverRequiresEmail => '該伺服器需要驗證您的註冊電子郵件地址。'; + + @override + String get or => '或'; + + @override + String get participant => '參與者'; + + @override + String get passphraseOrKey => '密碼短語或恢復金鑰'; + + @override + String get password => '密碼'; + + @override + String get passwordForgotten => '忘記密碼'; + + @override + String get passwordHasBeenChanged => '密碼已被變更'; + + @override + String get hideMemberChangesInPublicChats => '在公開聊天室中隱藏成員變動'; + + @override + String get hideMemberChangesInPublicChatsBody => + '若有人加入或離開公開聊天室,將不在聊天室時間軸顯示,以提升資訊可讀性。'; + + @override + String get overview => '概觀'; + + @override + String get notifyMeFor => '通知我'; + + @override + String get passwordRecoverySettings => '恢復密碼設定'; + + @override + String get passwordRecovery => '恢復密碼'; + + @override + String get people => '人'; + + @override + String get pickImage => '選擇圖片'; + + @override + String get pin => '釘選'; + + @override + String play(String fileName) { + return '播放 $fileName'; + } + + @override + String get pleaseChoose => '請選擇'; + + @override + String get pleaseChooseAPasscode => '請選擇一個密碼'; + + @override + String get pleaseClickOnLink => '請點擊電子郵件中的網址,然後繼續。'; + + @override + String get pleaseEnter4Digits => '請輸入4位數字,或留空以停用密碼鎖定。'; + + @override + String get pleaseEnterRecoveryKey => '請輸入您的恢復金鑰:'; + + @override + String get pleaseEnterYourPassword => '請輸入您的密碼'; + + @override + String get pleaseEnterYourPin => '請輸入您的密碼'; + + @override + String get pleaseEnterYourUsername => '請輸入您的使用者名稱'; + + @override + String get pleaseFollowInstructionsOnWeb => '請按照網站上的說明進行操作,然後點擊下一步。'; + + @override + String get privacy => '隱私'; + + @override + String get publicRooms => '公開的聊天室'; + + @override + String get pushRules => '推播規則'; + + @override + String get reason => '原因'; + + @override + String get recording => '錄音中'; + + @override + String redactedBy(String username) { + return '由 $username 編輯'; + } + + @override + String get directChat => '私訊'; + + @override + String redactedByBecause(String username, String reason) { + return '由 $username 編輯,原因:「$reason」'; + } + + @override + String redactedAnEvent(String username) { + return '$username 編輯了一個事件'; + } + + @override + String get redactMessage => '重新編輯訊息'; + + @override + String get register => '註冊'; + + @override + String get reject => '拒絕'; + + @override + String rejectedTheInvitation(String username) { + return '$username 拒絕了邀請'; + } + + @override + String get rejoin => '重新加入'; + + @override + String get removeAllOtherDevices => '移除所有其他裝置'; + + @override + String removedBy(String username) { + return '被 $username 移除'; + } + + @override + String get removeDevice => '移除裝置'; + + @override + String get unbanFromChat => '解封聊天室'; + + @override + String get removeYourAvatar => '移除您的頭像'; + + @override + String get replaceRoomWithNewerVersion => '用較新的版本取代聊天室'; + + @override + String get reply => '回覆'; + + @override + String get reportMessage => '檢舉訊息'; + + @override + String get requestPermission => '請求權限'; + + @override + String get roomHasBeenUpgraded => '聊天室已更新'; + + @override + String get roomVersion => '聊天室的版本'; + + @override + String get saveFile => '儲存檔案'; + + @override + String get search => '搜尋'; + + @override + String get security => '安全'; + + @override + String get recoveryKey => '恢復金鑰'; + + @override + String get recoveryKeyLost => '遺失恢復金鑰?'; + + @override + String seenByUser(String username) { + return '$username 已讀'; + } + + @override + String get send => '傳送'; + + @override + String get sendAMessage => '傳送訊息'; + + @override + String get sendAsText => '以文字傳送'; + + @override + String get sendAudio => '傳送音訊'; + + @override + String get sendFile => '傳送文件'; + + @override + String get sendImage => '傳送圖片'; + + @override + String sendImages(int count) { + return '傳送$count張圖片'; + } + + @override + String get sendMessages => '傳送訊息'; + + @override + String get sendOriginal => '傳送原始內容'; + + @override + String get sendSticker => '傳送貼圖'; + + @override + String get sendVideo => '傳送影片'; + + @override + String sentAFile(String username) { + return '$username 傳送了一個文件'; + } + + @override + String sentAnAudio(String username) { + return '🎤$username 傳送了一個音訊'; + } + + @override + String sentAPicture(String username) { + return '🖼️$username 傳送了一張圖片'; + } + + @override + String sentASticker(String username) { + return '😊$username 傳送了貼圖'; + } + + @override + String sentAVideo(String username) { + return '🎥$username 傳送了影片'; + } + + @override + String sentCallInformations(String senderName) { + return '$senderName 傳送了通話資訊'; + } + + @override + String get separateChatTypes => '分開私訊和群組'; + + @override + String get setAsCanonicalAlias => '設為主要別名'; + + @override + String get setCustomEmotes => '自訂表情符號'; + + @override + String get setChatDescription => '設定聊天室描述'; + + @override + String get setInvitationLink => '設定邀請連結'; + + @override + String get setPermissionsLevel => '設定權限等級'; + + @override + String get setStatus => '設定狀態'; + + @override + String get settings => '設定'; + + @override + String get share => '分享'; + + @override + String sharedTheLocation(String username) { + return '$username 分享了位置'; + } + + @override + String get shareLocation => '分享位置'; + + @override + String get showPassword => '顯示密碼'; + + @override + String get presenceStyle => '目前狀態:'; + + @override + String get presencesToggle => '顯示其他使用者的狀態訊息'; + + @override + String get singlesignon => '單一登入'; + + @override + String get skip => '跳過'; + + @override + String get sourceCode => '原始碼'; + + @override + String get spaceIsPublic => '空間是公開的'; + + @override + String get spaceName => '空間名稱'; + + @override + String startedACall(String senderName) { + return '$senderName 開始了通話'; + } + + @override + String get startFirstChat => '開始您的第一次聊天室'; + + @override + String get status => '狀態'; + + @override + String get statusExampleMessage => '今天過得如何?'; + + @override + String get submit => '送出'; + + @override + String get synchronizingPleaseWait => '正在同步... 請稍候。'; + + @override + String synchronizingPleaseWaitCounter(String percentage) { + return ' 同步中… ($percentage%)'; + } + + @override + String get systemTheme => '自動'; + + @override + String get theyDontMatch => '它們不相符'; + + @override + String get theyMatch => '它們相符'; + + @override + String get title => 'FluffyChat'; + + @override + String get toggleFavorite => '切換收藏夾'; + + @override + String get toggleMuted => '切換靜音'; + + @override + String get toggleUnread => '標示為已讀/未讀'; + + @override + String get tooManyRequestsWarning => '太多請求了。請稍候再試!'; + + @override + String get transferFromAnotherDevice => '從其他裝置傳輸'; + + @override + String get tryToSendAgain => '再次嘗試傳送'; + + @override + String get unavailable => '無法取得'; + + @override + String unbannedUser(String username, String targetName) { + return '$username 解除封鎖了 $targetName'; + } + + @override + String get unblockDevice => '解除鎖定裝置'; + + @override + String get unknownDevice => '未知裝置'; + + @override + String get unknownEncryptionAlgorithm => '未知的加密演算法'; + + @override + String unknownEvent(String type) { + return '未知事件「$type」'; + } + + @override + String get unmuteChat => '取消靜音聊天室'; + + @override + String get unpin => '取消釘選'; + + @override + String unreadChats(int unreadCount) { + String _temp0 = intl.Intl.pluralLogic( + unreadCount, + locale: localeName, + other: ' $unreadCount 個未讀聊天室', + one: '1 unread chat', + ); + return '$_temp0'; + } + + @override + String userAndOthersAreTyping(String username, int count) { + return '$username 和其他 $count 個人正在輸入...…'; + } + + @override + String userAndUserAreTyping(String username, String username2) { + return '$username 和 $username2 正在輸入...…'; + } + + @override + String userIsTyping(String username) { + return '$username 正在輸入...…'; + } + + @override + String userLeftTheChat(String username) { + return '$username 離開了聊天室'; + } + + @override + String get username => '使用者名稱'; + + @override + String userSentUnknownEvent(String username, String type) { + return '$username 傳送了一個 $type 事件'; + } + + @override + String get unverified => '尚未驗證'; + + @override + String get verified => '已驗證'; + + @override + String get verify => '驗證'; + + @override + String get verifyStart => '開始驗證'; + + @override + String get verifySuccess => '您成功驗證了!'; + + @override + String get verifyTitle => '正在驗證其他帳號'; + + @override + String get videoCall => '視訊通話'; + + @override + String get visibilityOfTheChatHistory => '聊天室記錄的可見性'; + + @override + String get visibleForAllParticipants => '對所有參與者可見'; + + @override + String get visibleForEveryone => '對所有人可見'; + + @override + String get voiceMessage => '語音訊息'; + + @override + String get waitingPartnerAcceptRequest => '正在等待夥伴接受請求...…'; + + @override + String get waitingPartnerEmoji => '正在等待夥伴接受表情符號...…'; + + @override + String get waitingPartnerNumbers => '正在等待夥伴接受數字...…'; + + @override + String get wallpaper => '桌布:'; + + @override + String get warning => '警告!'; + + @override + String get weSentYouAnEmail => '我們向您傳送了一封電子郵件'; + + @override + String get whoCanPerformWhichAction => '誰可以執行這個動作'; + + @override + String get whoIsAllowedToJoinThisGroup => '誰可以加入這個群組'; + + @override + String get whyDoYouWantToReportThis => '您檢舉的原因是什麼?'; + + @override + String get wipeChatBackup => '是否清除您的聊天室記錄備份以建立新的安全金鑰嗎?'; + + @override + String get withTheseAddressesRecoveryDescription => '有了這些位址,您就可以恢復密碼。'; + + @override + String get writeAMessage => '輸入訊息...…'; + + @override + String get yes => '是'; + + @override + String get you => '您'; + + @override + String get youAreNoLongerParticipatingInThisChat => '您不再參與這個聊天室了'; + + @override + String get youHaveBeenBannedFromThisChat => '您已經被這個聊天室封鎖'; + + @override + String get yourPublicKey => '您的公鑰'; + + @override + String get messageInfo => '訊息資訊'; + + @override + String get time => '時間'; + + @override + String get messageType => '訊息類型'; + + @override + String get sender => '傳送者'; + + @override + String get openGallery => '開啟畫廊'; + + @override + String get removeFromSpace => '從空間中移除'; + + @override + String get addToSpaceDescription => '選擇一個空間將此聊天室加入。'; + + @override + String get start => '開始'; + + @override + String get pleaseEnterRecoveryKeyDescription => + '要解鎖您的舊訊息,請輸入在之前的會話中生成的恢復密鑰。您的恢復密鑰不是您的密碼。'; + + @override + String get publish => '發布'; + + @override + String videoWithSize(String size) { + return '影片($size)'; + } + + @override + String get openChat => '開啟聊天室'; + + @override + String get markAsRead => '標示為已讀'; + + @override + String get reportUser => '舉報使用者'; + + @override + String get dismiss => '解散'; + + @override + String reactedWith(String sender, String reaction) { + return '$sender 以 $reaction 回應'; + } + + @override + String get pinMessage => '釘選到房間'; + + @override + String get confirmEventUnpin => '您確定要永久取消釘選該事件嗎?'; + + @override + String get emojis => '表情符號'; + + @override + String get placeCall => '發起通話'; + + @override + String get voiceCall => '語音通話'; + + @override + String get unsupportedAndroidVersion => '不支持的Android版本'; + + @override + String get unsupportedAndroidVersionLong => + '此功能需要較新的 Android 版本。請檢查更新或 Lineage OS 支持。'; + + @override + String get videoCallsBetaWarning => + '請注意,視訊通話目前處於測試階段。它們可能不會按預期工作,或者在所有平台上都不工作。'; + + @override + String get experimentalVideoCalls => '實驗性視訊通話'; + + @override + String get emailOrUsername => '電子郵件或使用者名'; + + @override + String get indexedDbErrorTitle => '私密模式問題'; + + @override + String get indexedDbErrorLong => + '預設情況下,私密模式不啟用消息存儲。\n請訪問\n - about:config\n - 將 dom.indexedDB.privateBrowsing.enabled 設定為 true\n否則,無法運行 FluffyChat。'; + + @override + String switchToAccount(String number) { + return '切換到帳戶 $number'; + } + + @override + String get nextAccount => '下一個帳戶'; + + @override + String get previousAccount => '上一個帳戶'; + + @override + String get addWidget => '新增小工具'; + + @override + String get widgetVideo => '影片'; + + @override + String get widgetEtherpad => '文字筆記'; + + @override + String get widgetJitsi => 'Jitsi Meet'; + + @override + String get widgetCustom => '自訂'; + + @override + String get widgetName => '名稱'; + + @override + String get widgetUrlError => '這不是一個有效的URL。'; + + @override + String get widgetNameError => '請提供一個顯示名稱。'; + + @override + String get errorAddingWidget => '新增小工具時發生錯誤。'; + + @override + String get youRejectedTheInvitation => '您拒絕了邀請'; + + @override + String get youJoinedTheChat => '您加入了聊天室'; + + @override + String get youAcceptedTheInvitation => '👍 您接受了邀請'; + + @override + String youBannedUser(String user) { + return '您封鎖了 $user'; + } + + @override + String youHaveWithdrawnTheInvitationFor(String user) { + return '您已收回對 $user 的邀請'; + } + + @override + String youInvitedToBy(String alias) { + return '📩 您通過網址被邀請至:\n$alias'; + } + + @override + String youInvitedBy(String user) { + return '📩 您被 $user 邀請'; + } + + @override + String invitedBy(String user) { + return '📩 由 $user 邀請'; + } + + @override + String youInvitedUser(String user) { + return '📩 您邀請了 $user'; + } + + @override + String youKicked(String user) { + return '👞 您踢出了 $user'; + } + + @override + String youKickedAndBanned(String user) { + return '🙅 您踢出並封鎖了 $user'; + } + + @override + String youUnbannedUser(String user) { + return '您解除封鎖了 $user'; + } + + @override + String hasKnocked(String user) { + return '🚪 $user 敲門了'; + } + + @override + String get usersMustKnock => '使用者必須敲門'; + + @override + String get noOneCanJoin => '沒有人可以加入'; + + @override + String userWouldLikeToChangeTheChat(String user) { + return '$user 想要加入聊天室。'; + } + + @override + String get noPublicLinkHasBeenCreatedYet => '尚未建立公開網址'; + + @override + String get knock => '敲門'; + + @override + String get users => '使用者'; + + @override + String get unlockOldMessages => '解鎖舊消息'; + + @override + String get storeInSecureStorageDescription => '將恢復密鑰存儲在此裝置的安全存儲中。'; + + @override + String get saveKeyManuallyDescription => '通過觸發系統分享對話框或剪貼板手動保存此密鑰。'; + + @override + String get storeInAndroidKeystore => '存儲在 Android KeyStore'; + + @override + String get storeInAppleKeyChain => '存儲在 Apple KeyChain'; + + @override + String get storeSecurlyOnThisDevice => '在此裝置上安全存儲'; + + @override + String countFiles(int count) { + return '$count 個文件'; + } + + @override + String get user => '使用者'; + + @override + String get custom => '自訂'; + + @override + String get foregroundServiceRunning => '當前景服務正在運行時會顯示此通知。'; + + @override + String get screenSharingTitle => '螢幕分享'; + + @override + String get screenSharingDetail => '您正在 FuffyChat 中分享您的螢幕'; + + @override + String get callingPermissions => '通話權限'; + + @override + String get callingAccount => '通話帳戶'; + + @override + String get callingAccountDetails => '允許 FluffyChat 使用原生 Android 撥號應用程式。'; + + @override + String get appearOnTop => '顯示在最上層'; + + @override + String get appearOnTopDetails => '允許應用程式顯示在最上層(如果您已將 Fluffychat 設定為通話帳戶則不需要)'; + + @override + String get otherCallingPermissions => '麥克風、相機和其他 FluffyChat 權限'; + + @override + String get whyIsThisMessageEncrypted => '為什麼這條訊息無法讀取?'; + + @override + String get noKeyForThisMessage => + '如果訊息是在您登入此裝置之前傳送的,就可能會發生這種情況。\n\n也有可能是傳送者已經封鎖了您的裝置,或者網絡連接出了問題。\n\n如果您能在另一個會話中讀取該訊息,那麼您可以從中轉移訊息!前往設定 > 裝置,並確保您的裝置已相互驗證。當您下次打開房間且兩個會話都在前景時,密鑰將自動傳輸。\n\n不想在登出或切換裝置時丟失密鑰?請確保您已在設定中啟用了聊天室備份。'; + + @override + String get newGroup => '新群組'; + + @override + String get newSpace => '新空間'; + + @override + String get enterSpace => '進入空間'; + + @override + String get enterRoom => '進入房間'; + + @override + String get allSpaces => '所有空間'; + + @override + String numChats(String number) { + return '$number 個聊天室'; + } + + @override + String get hideUnimportantStateEvents => '隱藏不重要的狀態事件'; + + @override + String get hidePresences => '隱藏狀態列表?'; + + @override + String get doNotShowAgain => '不再顯示'; + + @override + String wasDirectChatDisplayName(String oldDisplayName) { + return '空的聊天室(原名稱為 $oldDisplayName )'; + } + + @override + String get newSpaceDescription => '空間允許您整合您的聊天室並建立私人或公開社群。'; + + @override + String get encryptThisChat => '加密此聊天室'; + + @override + String get disableEncryptionWarning => '出於安全原因,您不能在之前已加密的聊天室中停用加密。'; + + @override + String get sorryThatsNotPossible => '抱歉......這是不可能的'; + + @override + String get deviceKeys => '裝置密鑰:'; + + @override + String get reopenChat => '重新開啟聊天室'; + + @override + String get noBackupWarning => '警告!如果不啟用聊天室備份,您將失去對加密訊息的訪問。強烈建議在登出前先啟用聊天室備份。'; + + @override + String get noOtherDevicesFound => '未找到其他裝置'; + + @override + String fileIsTooBigForServer(String max) { + return '無法發送!該伺服器僅支援最大到 $max 的附件。'; + } + + @override + String fileHasBeenSavedAt(String path) { + return '文件已保存在 $path'; + } + + @override + String get jumpToLastReadMessage => '跳至最後讀取的訊息'; + + @override + String get readUpToHere => '讀到這裡'; + + @override + String get jump => '跳轉'; + + @override + String get openLinkInBrowser => '在瀏覽器中開啟連結'; + + @override + String get reportErrorDescription => '😭 哦不。出了些問題。如果您願意,可以將此錯誤報告給開發者。'; + + @override + String get report => '報告'; + + @override + String get signInWithPassword => '使用密碼登入'; + + @override + String get pleaseTryAgainLaterOrChooseDifferentServer => '請稍後再試,或選擇不同的伺服器。'; + + @override + String signInWith(String provider) { + return '使用 $provider 登入'; + } + + @override + String get profileNotFound => '在伺服器上找不到該使用者。可能是連接問題或該使用者不存在。'; + + @override + String get setTheme => '設定主題:'; + + @override + String get setColorTheme => '設定主題顏色:'; + + @override + String get invite => '邀請'; + + @override + String get inviteGroupChat => '📨 邀請群組聊天室'; + + @override + String get invitePrivateChat => '📨 邀請私人聊天室'; + + @override + String get invalidInput => '無效的輸入!'; + + @override + String wrongPinEntered(int seconds) { + return '輸入的密碼錯誤! $seconds 秒後再試一次......'; + } + + @override + String get pleaseEnterANumber => '請輸入大於 0 的數字'; + + @override + String get archiveRoomDescription => '聊天室將被移動到存檔中。其他使用者將能看到您已離開聊天室。'; + + @override + String get roomUpgradeDescription => + '將使用新版本聊天室來重新建立聊天室。所有本聊天室的參與者都會收到通知,他們都需要換到新的聊天室裡。若您想知道有關新版本的更多資訊,請前往 https://spec.matrix.org/latest/rooms/'; + + @override + String get removeDevicesDescription => '您將從這個裝置登出,並將不再能夠接收消息。'; + + @override + String get banUserDescription => '該使用者將被禁止進入聊天室,直到他們被解封之前都無法再次進入聊天室。'; + + @override + String get unbanUserDescription => '如果該使用者嘗試,他們將能夠再次進入聊天室。'; + + @override + String get kickUserDescription => '該使用者被踢出聊天室,但未被禁止。在公開聊天室中,該使用者可以隨時重新加入。'; + + @override + String get makeAdminDescription => + '一旦您讓這個使用者成為管理員,您可能無法撤銷此操作,因為他們將擁有與您相同的權限。'; + + @override + String get pushNotificationsNotAvailable => '推送通知不可用'; + + @override + String get learnMore => '了解更多'; + + @override + String get yourGlobalUserIdIs => '您的全域使用者ID是: '; + + @override + String noUsersFoundWithQuery(String query) { + return '很遺憾,找不到與「$query」相符的使用者。請檢查是否有打錯字。'; + } + + @override + String get knocking => '敲門'; + + @override + String chatCanBeDiscoveredViaSearchOnServer(String server) { + return '可以透過在 $server 上的搜尋發現聊天室'; + } + + @override + String get searchChatsRooms => '搜尋 #chats, @users...'; + + @override + String get nothingFound => '什麼都沒找到......'; + + @override + String get groupName => '群組名稱'; + + @override + String get createGroupAndInviteUsers => '建立群組並邀請使用者'; + + @override + String get groupCanBeFoundViaSearch => '可以透過搜尋找到群組'; + + @override + String get wrongRecoveryKey => '抱歉......這似乎不是正確的恢復密鑰。'; + + @override + String get startConversation => '開始對話'; + + @override + String get commandHint_sendraw => '傳送原始 json'; + + @override + String get databaseMigrationTitle => '資料庫已最佳化'; + + @override + String get databaseMigrationBody => '請稍候。這可能需要一點時間。'; + + @override + String get leaveEmptyToClearStatus => '留空以清除您的狀態。'; + + @override + String get select => '選擇'; + + @override + String get searchForUsers => '搜尋 @users...'; + + @override + String get pleaseEnterYourCurrentPassword => '請輸入您當前的密碼'; + + @override + String get newPassword => '新密碼'; + + @override + String get pleaseChooseAStrongPassword => '請選擇一個強密碼'; + + @override + String get passwordsDoNotMatch => '密碼不匹配'; + + @override + String get passwordIsWrong => '您輸入的密碼錯誤'; + + @override + String get publicLink => '公開網址'; + + @override + String get publicChatAddresses => '公開聊天室地址'; + + @override + String get createNewAddress => '建立新地址'; + + @override + String get joinSpace => '加入空間'; + + @override + String get publicSpaces => '公共空間'; + + @override + String get addChatOrSubSpace => '新增聊天室或子空間'; + + @override + String get subspace => '子空間'; + + @override + String get decline => '拒絕'; + + @override + String get thisDevice => '這個裝置:'; + + @override + String get initAppError => '初始化應用時發生錯誤'; + + @override + String get userRole => '使用者角色'; + + @override + String minimumPowerLevel(String level) { + return '$level 是最低權限等級。'; + } + + @override + String searchIn(String chat) { + return '在聊天室「$chat」中搜尋......'; + } + + @override + String get searchMore => '搜尋更多......'; + + @override + String get gallery => '畫廊'; + + @override + String get files => '文件'; + + @override + String databaseBuildErrorBody(String url, String error) { + return '無法建立 SQLite 資料庫。應用程式目前嘗試使用遺留資料庫。請將此錯誤報告給開發人員,網址為 $url。錯誤訊息為:$error'; + } + + @override + String sessionLostBody(String url, String error) { + return '您的會話已丟失。請將此錯誤報告給開發人員,網址為 $url。錯誤訊息為:$error'; + } + + @override + String restoreSessionBody(String url, String error) { + return '應用程式現在嘗試從備份中恢復您的會話。請將此錯誤報告給開發人員,網址為 $url。錯誤訊息為:$error'; + } + + @override + String forwardMessageTo(String roomName) { + return '將訊息轉發至 $roomName?'; + } + + @override + String get sendReadReceipts => '傳送已讀回條'; + + @override + String get sendTypingNotificationsDescription => '聊天室中的其他參與者可以看到您正在輸入新訊息。'; + + @override + String get sendReadReceiptsDescription => '聊天室中的其他參與者可以看到您已讀取一條訊息。'; + + @override + String get formattedMessages => '格式化訊息'; + + @override + String get formattedMessagesDescription => '使用 markdown 顯示豐富的訊息內容,如粗體文字。'; + + @override + String get verifyOtherUser => '🔐 驗證其他使用者'; + + @override + String get verifyOtherUserDescription => + '如果您驗證了另一個使用者,您可以確定您真正與誰通信。💪\n\n當您開始驗證時,您和另一個使用者將在應用程式中看到一個彈出視窗。在那裡,您將看到一系列的表情符號或數字,您需要相互比較。\n\n最好的方式是見面或開始視訊通話。👭'; + + @override + String get verifyOtherDevice => '🔐 驗證其他裝置'; + + @override + String get verifyOtherDeviceDescription => + '當您驗證另一個裝置時,這些裝置可以交換密鑰,提升您的整體安全性。💪 當您開始驗證時,一個彈出視窗將在兩個裝置上的應用程式中出現。在那裡,您將看到一系列的表情符號或數字,您需要相互比較。在開始驗證之前最好有兩個裝置在手邊。🤳'; + + @override + String acceptedKeyVerification(String sender) { + return '$sender 接受了密鑰驗證'; + } + + @override + String canceledKeyVerification(String sender) { + return '$sender 取消了密鑰驗證'; + } + + @override + String completedKeyVerification(String sender) { + return '$sender 完成了密鑰驗證'; + } + + @override + String isReadyForKeyVerification(String sender) { + return '$sender 已準備好進行密鑰驗證'; + } + + @override + String requestedKeyVerification(String sender) { + return '$sender 請求了密鑰驗證'; + } + + @override + String startedKeyVerification(String sender) { + return '$sender 開始了密鑰驗證'; + } + + @override + String get transparent => '透明'; + + @override + String get incomingMessages => '收到的訊息'; + + @override + String get stickers => '貼圖'; + + @override + String get discover => '發現'; + + @override + String get commandHint_ignore => '無視已提供的 Matrix ID'; + + @override + String get commandHint_unignore => '取消無視已提供的 Matrix ID'; + + @override + String unreadChatsInApp(String appname, String unread) { + return '$appname:$unread 未讀聊天室'; + } + + @override + String get noDatabaseEncryption => '此平台不支援資料庫加密'; + + @override + String thereAreCountUsersBlocked(Object count) { + return '目前有 $count 名使用者被封鎖。'; + } + + @override + String get restricted => '受限'; + + @override + String get knockRestricted => '敲門受限'; + + @override + String goToSpace(Object space) { + return '前往空間:$space'; + } + + @override + String get markAsUnread => '標示為未讀'; + + @override + String userLevel(int level) { + return '$level - 用戶'; + } + + @override + String moderatorLevel(int level) { + return '$level - 管理員'; + } + + @override + String adminLevel(int level) { + return '$level - 管理員'; + } + + @override + String get changeGeneralChatSettings => '變更一般聊天設定'; + + @override + String get inviteOtherUsers => '邀請其他用戶進入本聊天'; + + @override + String get changeTheChatPermissions => '變更聊天室權限'; + + @override + String get changeTheVisibilityOfChatHistory => '變更過往聊天記錄可見度'; + + @override + String get changeTheCanonicalRoomAlias => '變更公開聊天室的主要地址'; + + @override + String get sendRoomNotifications => '傳送一條 @room 群提醒'; + + @override + String get changeTheDescriptionOfTheGroup => '變更聊天室說明'; + + @override + String get chatPermissionsDescription => + '定義此聊天中某些操作需要哪個權限等級。 權限等級0、50和100通常代表使用者、版主和管理員,但任何分級都是可能的。'; + + @override + String updateInstalled(String version) { + return '🎉已成功安裝$version版本!'; + } + + @override + String get changelog => '變更日誌'; + + @override + String get sendCanceled => '傳送取消'; + + @override + String get loginWithMatrixId => '以Matrix-ID登入'; + + @override + String get discoverHomeservers => '探索歸屬伺服器'; + + @override + String get whatIsAHomeserver => '什麼是歸屬伺服器?'; + + @override + String get homeserverDescription => + '您的所有資料都儲存在歸屬伺服器上,就像電子郵件提供商一樣。 您可以選擇要使用的歸屬伺服器,同時您仍然可以與每個人溝通。 請訪問https://matrix.org瞭解更多資訊。'; + + @override + String get doesNotSeemToBeAValidHomeserver => '似乎不是能匹配的歸屬伺服器。伺服器域名打錯了嗎?'; + + @override + String get calculatingFileSize => '正在計算檔案大小…'; + + @override + String get prepareSendingAttachment => '準備傳送附件…'; + + @override + String get sendingAttachment => '附件傳送中…'; + + @override + String get generatingVideoThumbnail => '生成影片縮圖中…'; + + @override + String get compressVideo => '影片壓縮中…'; + + @override + String sendingAttachmentCountOfCount(int index, int length) { + return '附件傳送中 $index/$length…'; + } + + @override + String serverLimitReached(int seconds) { + return '已達伺服器上限! 請稍等$seconds秒…'; + } + + @override + String get oneOfYourDevicesIsNotVerified => '你的其中一個裝置尚未驗證'; + + @override + String get noticeChatBackupDeviceVerification => + '注意:當您將所有裝置連線到聊天備份時,它們會自動驗證。'; + + @override + String get continueText => '繼續'; + + @override + String get welcomeText => + '嘿,嘿👋這是FluffyChat。 您可以登入任何與https://matrix.org相容的歸屬伺服器後和任何人聊天。 這是一個巨大的去中心化訊息網路!'; + + @override + String get blur => '模糊:'; + + @override + String get opacity => '不透明度:'; + + @override + String get setWallpaper => '設定背景樣式'; + + @override + String get manageAccount => '帳號管理'; + + @override + String get noContactInformationProvided => '伺服器沒有提供任何有效的聯絡資訊'; + + @override + String get contactServerAdmin => '聯繫伺服器管理員'; + + @override + String get contactServerSecurity => '聯繫伺服器安管'; + + @override + String get supportPage => '幫助頁面'; + + @override + String get serverInformation => '伺服器資訊 :'; + + @override + String get name => '名稱'; + + @override + String get version => '版本'; + + @override + String get website => '網站'; + + @override + String get compress => '壓縮'; + + @override + String get boldText => '粗體'; + + @override + String get italicText => '斜體'; + + @override + String get strikeThrough => '刪除線'; + + @override + String get pleaseFillOut => '請填充'; + + @override + String get invalidUrl => '無效 url'; + + @override + String get addLink => '插入連結'; + + @override + String get unableToJoinChat => '無法加入聊天室。對話可能以被其他方結束。'; + + @override + String get previous => '上一個'; + + @override + String get otherPartyNotLoggedIn => '對方現未登入,未能接收訊息 !'; + + @override + String appWantsToUseForLogin(String server) { + return '使用伺服器「$server 」登入'; + } + + @override + String get appWantsToUseForLoginDescription => '你特此允許該應用程式和網站分享關於你的信息。'; + + @override + String get open => '打開'; + + @override + String get waitingForServer => '等待伺服器中...'; + + @override + String get appIntroduction => + 'FluffyChat 讓你和你的朋友跨越工具聊天。在 https://matrix.org 了解更多或*繼續*。'; + + @override + String get newChatRequest => '📩 新的聊天邀請'; + + @override + String get contentNotificationSettings => '內容通知設定'; + + @override + String get generalNotificationSettings => '常規通知設定'; + + @override + String get roomNotificationSettings => '聊天室通知設定'; + + @override + String get userSpecificNotificationSettings => '用戶特定通知設定'; + + @override + String get otherNotificationSettings => '其他通知設定'; + + @override + String get notificationRuleContainsUserName => '包含用户名稱'; + + @override + String get notificationRuleContainsUserNameDescription => '當訊息帶有用户名稱時通知用戶。'; + + @override + String get notificationRuleMaster => '靜音所有通知'; + + @override + String get notificationRuleMasterDescription => '覆蓋所有其他規則並禁止所有通知。'; + + @override + String get notificationRuleSuppressNotices => '隱藏自動化消息'; + + @override + String get notificationRuleSuppressNoticesDescription => '隱藏來自bot等的自動化消息。'; + + @override + String get notificationRuleInviteForMe => '邀請我'; + + @override + String get notificationRuleInviteForMeDescription => '當用户被邀請到聊天室時,通知他們。'; + + @override + String get notificationRuleMemberEvent => '成員事件'; + + @override + String get notificationRuleMemberEventDescription => '隱藏成員事件的通知。'; + + @override + String get notificationRuleIsUserMention => '用户提及'; + + @override + String get enterNewChat => '進入新聊天室'; +} diff --git a/lib/main.dart b/lib/main.dart new file mode 100644 index 0000000..d9ac10b --- /dev/null +++ b/lib/main.dart @@ -0,0 +1,105 @@ +import 'package:flutter/material.dart'; + +import 'package:collection/collection.dart'; +import 'package:flutter_secure_storage/flutter_secure_storage.dart'; +import 'package:matrix/matrix.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/utils/client_manager.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/widgets/error_widget.dart'; +import 'config/setting_keys.dart'; +import 'utils/background_push.dart'; +import 'widgets/fluffy_chat_app.dart'; + +void main() async { + Logs().i('Welcome to ${AppConfig.applicationName} <3'); + + // Our background push shared isolate accesses flutter-internal things very early in the startup proccess + // To make sure that the parts of flutter needed are started up already, we need to ensure that the + // widget bindings are initialized already. + WidgetsFlutterBinding.ensureInitialized(); + + Logs().nativeColors = !PlatformInfos.isIOS; + final store = await SharedPreferences.getInstance(); + final clients = await ClientManager.getClients(store: store); + + // If the app starts in detached mode, we assume that it is in + // background fetch mode for processing push notifications. This is + // currently only supported on Android. + if (PlatformInfos.isAndroid && + AppLifecycleState.detached == WidgetsBinding.instance.lifecycleState) { + // Do not send online presences when app is in background fetch mode. + for (final client in clients) { + client.backgroundSync = false; + client.syncPresence = PresenceType.offline; + } + + // In the background fetch mode we do not want to waste ressources with + // starting the Flutter engine but process incoming push notifications. + BackgroundPush.clientOnly(clients.first); + // To start the flutter engine afterwards we add an custom observer. + WidgetsBinding.instance.addObserver(AppStarter(clients, store)); + Logs().i( + '${AppConfig.applicationName} started in background-fetch mode. No GUI will be created unless the app is no longer detached.', + ); + return; + } + + // Started in foreground mode. + Logs().i( + '${AppConfig.applicationName} started in foreground mode. Rendering GUI...', + ); + await startGui(clients, store); +} + +/// Fetch the pincode for the applock and start the flutter engine. +Future startGui(List clients, SharedPreferences store) async { + // Fetch the pin for the applock if existing for mobile applications. + String? pin; + if (PlatformInfos.isMobile) { + try { + pin = + await const FlutterSecureStorage().read(key: SettingKeys.appLockKey); + } catch (e, s) { + Logs().d('Unable to read PIN from Secure storage', e, s); + } + } + + // Preload first client + final firstClient = clients.firstOrNull; + await firstClient?.roomsLoading; + await firstClient?.accountDataLoading; + + ErrorWidget.builder = (details) => FluffyChatErrorWidget(details); + runApp(FluffyChatApp(clients: clients, pincode: pin, store: store)); +} + +/// Watches the lifecycle changes to start the application when it +/// is no longer detached. +class AppStarter with WidgetsBindingObserver { + final List clients; + final SharedPreferences store; + bool guiStarted = false; + + AppStarter(this.clients, this.store); + + @override + void didChangeAppLifecycleState(AppLifecycleState state) { + if (guiStarted) return; + if (state == AppLifecycleState.detached) return; + + Logs().i( + '${AppConfig.applicationName} switches from the detached background-fetch mode to ${state.name} mode. Rendering GUI...', + ); + // Switching to foreground mode needs to reenable send online sync presence. + for (final client in clients) { + client.backgroundSync = true; + client.syncPresence = PresenceType.online; + } + startGui(clients, store); + // We must make sure that the GUI is only started once. + guiStarted = true; + } +} diff --git a/lib/pages/archive/archive.dart b/lib/pages/archive/archive.dart new file mode 100644 index 0000000..7e51ab0 --- /dev/null +++ b/lib/pages/archive/archive.dart @@ -0,0 +1,69 @@ +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/pages/archive/archive_view.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import 'package:fluffychat/widgets/matrix.dart'; + +class Archive extends StatefulWidget { + const Archive({super.key}); + + @override + ArchiveController createState() => ArchiveController(); +} + +class ArchiveController extends State { + List archive = []; + + Future> getArchive(BuildContext context) async { + if (archive.isNotEmpty) return archive; + return archive = await Matrix.of(context).client.loadArchive(); + } + + void forgetRoomAction(int i) async { + await showFutureLoadingDialog( + context: context, + future: () async { + Logs().v('Forget room ${archive.last.getLocalizedDisplayname()}'); + await archive[i].forget(); + archive.removeAt(i); + }, + ); + setState(() {}); + } + + void forgetAllAction() async { + final archive = this.archive; + final client = Matrix.of(context).client; + if (archive.isEmpty) return; + if (await showOkCancelAlertDialog( + useRootNavigator: false, + context: context, + title: L10n.of(context).areYouSure, + okLabel: L10n.of(context).yes, + cancelLabel: L10n.of(context).cancel, + message: L10n.of(context).clearArchive, + ) != + OkCancelResult.ok) { + return; + } + await showFutureLoadingDialog( + context: context, + future: () async { + while (archive.isNotEmpty) { + Logs().v('Forget room ${archive.last.getLocalizedDisplayname()}'); + await archive.last.forget(); + archive.removeLast(); + } + }, + ); + client.clearArchivesFromCache(); + setState(() {}); + } + + @override + Widget build(BuildContext context) => ArchiveView(this); +} diff --git a/lib/pages/archive/archive_view.dart b/lib/pages/archive/archive_view.dart new file mode 100644 index 0000000..410fd6c --- /dev/null +++ b/lib/pages/archive/archive_view.dart @@ -0,0 +1,74 @@ +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/pages/archive/archive.dart'; +import 'package:fluffychat/pages/chat_list/chat_list_item.dart'; +import 'package:fluffychat/widgets/layouts/max_width_body.dart'; + +class ArchiveView extends StatelessWidget { + final ArchiveController controller; + + const ArchiveView(this.controller, {super.key}); + + @override + Widget build(BuildContext context) { + return FutureBuilder>( + future: controller.getArchive(context), + builder: (BuildContext context, snapshot) => Scaffold( + appBar: AppBar( + leading: const Center(child: BackButton()), + title: Text(L10n.of(context).archive), + actions: [ + if (snapshot.data?.isNotEmpty ?? false) + Padding( + padding: const EdgeInsets.all(8.0), + child: TextButton.icon( + onPressed: controller.forgetAllAction, + label: Text(L10n.of(context).clearArchive), + icon: const Icon(Icons.cleaning_services_outlined), + ), + ), + ], + ), + body: MaxWidthBody( + withScrolling: false, + child: Builder( + builder: (BuildContext context) { + if (snapshot.hasError) { + return Center( + child: Text( + L10n.of(context).oopsSomethingWentWrong, + textAlign: TextAlign.center, + ), + ); + } + if (!snapshot.hasData) { + return const Center( + child: CircularProgressIndicator.adaptive(strokeWidth: 2), + ); + } else { + if (controller.archive.isEmpty) { + return const Center( + child: Icon(Icons.archive_outlined, size: 80), + ); + } + return ListView.builder( + itemCount: controller.archive.length, + itemBuilder: (BuildContext context, int i) => ChatListItem( + controller.archive[i], + onForget: () => controller.forgetRoomAction(i), + onTap: () => context + .go('/rooms/archive/${controller.archive[i].id}'), + ), + ); + } + }, + ), + ), + ), + ); + } +} diff --git a/lib/pages/bootstrap/bootstrap_dialog.dart b/lib/pages/bootstrap/bootstrap_dialog.dart new file mode 100644 index 0000000..c1d5ead --- /dev/null +++ b/lib/pages/bootstrap/bootstrap_dialog.dart @@ -0,0 +1,510 @@ +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:flutter_secure_storage/flutter_secure_storage.dart'; +import 'package:matrix/encryption.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/utils/error_reporter.dart'; +import 'package:fluffychat/utils/fluffy_share.dart'; +import 'package:fluffychat/utils/localized_exception_extension.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import '../../utils/adaptive_bottom_sheet.dart'; +import '../key_verification/key_verification_dialog.dart'; + +class BootstrapDialog extends StatefulWidget { + final bool wipe; + final Client client; + + const BootstrapDialog({ + super.key, + this.wipe = false, + required this.client, + }); + + Future show(BuildContext context) => showAdaptiveBottomSheet( + context: context, + builder: (context) => this, + ); + + @override + BootstrapDialogState createState() => BootstrapDialogState(); +} + +class BootstrapDialogState extends State { + final TextEditingController _recoveryKeyTextEditingController = + TextEditingController(); + + late Bootstrap bootstrap; + + String? _recoveryKeyInputError; + + bool _recoveryKeyInputLoading = false; + + String? titleText; + + bool _recoveryKeyStored = false; + bool _recoveryKeyCopied = false; + + bool? _storeInSecureStorage = false; + + bool? _wipe; + + String get _secureStorageKey => + 'ssss_recovery_key_${bootstrap.client.userID}'; + + bool get _supportsSecureStorage => + PlatformInfos.isMobile || PlatformInfos.isDesktop; + + String _getSecureStorageLocalizedName() { + if (PlatformInfos.isAndroid) { + return L10n.of(context).storeInAndroidKeystore; + } + if (PlatformInfos.isIOS || PlatformInfos.isMacOS) { + return L10n.of(context).storeInAppleKeyChain; + } + return L10n.of(context).storeSecurlyOnThisDevice; + } + + @override + void initState() { + _createBootstrap(widget.wipe); + super.initState(); + } + + void _createBootstrap(bool wipe) async { + _wipe = wipe; + titleText = null; + _recoveryKeyStored = false; + bootstrap = + widget.client.encryption!.bootstrap(onUpdate: (_) => setState(() {})); + final key = await const FlutterSecureStorage().read(key: _secureStorageKey); + if (key == null) return; + _recoveryKeyTextEditingController.text = key; + } + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + _wipe ??= widget.wipe; + final buttons = []; + Widget body = const CircularProgressIndicator.adaptive(); + titleText = L10n.of(context).loadingPleaseWait; + + if (bootstrap.newSsssKey?.recoveryKey != null && + _recoveryKeyStored == false) { + final key = bootstrap.newSsssKey!.recoveryKey; + titleText = L10n.of(context).recoveryKey; + return Scaffold( + appBar: AppBar( + centerTitle: true, + leading: IconButton( + icon: const Icon(Icons.close), + onPressed: Navigator.of(context).pop, + ), + title: Text(L10n.of(context).recoveryKey), + ), + body: Center( + child: ConstrainedBox( + constraints: + const BoxConstraints(maxWidth: FluffyThemes.columnWidth * 1.5), + child: ListView( + padding: const EdgeInsets.all(16.0), + children: [ + ListTile( + contentPadding: const EdgeInsets.symmetric(horizontal: 8.0), + trailing: CircleAvatar( + backgroundColor: Colors.transparent, + child: Icon( + Icons.info_outlined, + color: theme.colorScheme.primary, + ), + ), + subtitle: Text(L10n.of(context).chatBackupDescription), + ), + const Divider( + height: 32, + thickness: 1, + ), + TextField( + minLines: 2, + maxLines: 4, + readOnly: true, + style: const TextStyle(fontFamily: 'RobotoMono'), + controller: TextEditingController(text: key), + decoration: const InputDecoration( + contentPadding: EdgeInsets.all(16), + suffixIcon: Icon(Icons.key_outlined), + ), + ), + const SizedBox(height: 16), + if (_supportsSecureStorage) + CheckboxListTile.adaptive( + contentPadding: const EdgeInsets.symmetric(horizontal: 8.0), + value: _storeInSecureStorage, + activeColor: theme.colorScheme.primary, + onChanged: (b) { + setState(() { + _storeInSecureStorage = b; + }); + }, + title: Text(_getSecureStorageLocalizedName()), + subtitle: + Text(L10n.of(context).storeInSecureStorageDescription), + ), + const SizedBox(height: 16), + CheckboxListTile.adaptive( + contentPadding: const EdgeInsets.symmetric(horizontal: 8.0), + value: _recoveryKeyCopied, + activeColor: theme.colorScheme.primary, + onChanged: (b) { + FluffyShare.share(key!, context); + setState(() => _recoveryKeyCopied = true); + }, + title: Text(L10n.of(context).copyToClipboard), + subtitle: Text(L10n.of(context).saveKeyManuallyDescription), + ), + const SizedBox(height: 16), + ElevatedButton.icon( + icon: const Icon(Icons.check_outlined), + label: Text(L10n.of(context).next), + onPressed: + (_recoveryKeyCopied || _storeInSecureStorage == true) + ? () { + if (_storeInSecureStorage == true) { + const FlutterSecureStorage().write( + key: _secureStorageKey, + value: key, + ); + } + setState(() => _recoveryKeyStored = true); + } + : null, + ), + ], + ), + ), + ), + ); + } else { + switch (bootstrap.state) { + case BootstrapState.loading: + break; + case BootstrapState.askWipeSsss: + WidgetsBinding.instance.addPostFrameCallback( + (_) => bootstrap.wipeSsss(_wipe!), + ); + break; + case BootstrapState.askBadSsss: + WidgetsBinding.instance.addPostFrameCallback( + (_) => bootstrap.ignoreBadSecrets(true), + ); + break; + case BootstrapState.askUseExistingSsss: + WidgetsBinding.instance.addPostFrameCallback( + (_) => bootstrap.useExistingSsss(!_wipe!), + ); + break; + case BootstrapState.askUnlockSsss: + WidgetsBinding.instance.addPostFrameCallback( + (_) => bootstrap.unlockedSsss(), + ); + break; + case BootstrapState.askNewSsss: + WidgetsBinding.instance.addPostFrameCallback( + (_) => bootstrap.newSsss(), + ); + break; + case BootstrapState.openExistingSsss: + _recoveryKeyStored = true; + return Scaffold( + appBar: AppBar( + centerTitle: true, + leading: IconButton( + icon: const Icon(Icons.close), + onPressed: Navigator.of(context).pop, + ), + title: Text(L10n.of(context).chatBackup), + ), + body: Center( + child: ConstrainedBox( + constraints: const BoxConstraints( + maxWidth: FluffyThemes.columnWidth * 1.5, + ), + child: ListView( + padding: const EdgeInsets.all(16.0), + children: [ + ListTile( + contentPadding: + const EdgeInsets.symmetric(horizontal: 8.0), + trailing: Icon( + Icons.info_outlined, + color: theme.colorScheme.primary, + ), + subtitle: Text( + L10n.of(context).pleaseEnterRecoveryKeyDescription, + ), + ), + const Divider(height: 32), + TextField( + minLines: 1, + maxLines: 2, + autocorrect: false, + readOnly: _recoveryKeyInputLoading, + autofillHints: _recoveryKeyInputLoading + ? null + : [AutofillHints.password], + controller: _recoveryKeyTextEditingController, + style: const TextStyle(fontFamily: 'RobotoMono'), + decoration: InputDecoration( + contentPadding: const EdgeInsets.all(16), + hintStyle: TextStyle( + fontFamily: theme.textTheme.bodyLarge?.fontFamily, + ), + prefixIcon: const Icon(Icons.key_outlined), + labelText: L10n.of(context).recoveryKey, + hintText: 'Es** **** **** ****', + errorText: _recoveryKeyInputError, + errorMaxLines: 2, + ), + ), + const SizedBox(height: 16), + ElevatedButton.icon( + style: ElevatedButton.styleFrom( + foregroundColor: theme.colorScheme.onPrimary, + iconColor: theme.colorScheme.onPrimary, + backgroundColor: theme.colorScheme.primary, + ), + icon: _recoveryKeyInputLoading + ? const CircularProgressIndicator.adaptive() + : const Icon(Icons.lock_open_outlined), + label: Text(L10n.of(context).unlockOldMessages), + onPressed: _recoveryKeyInputLoading + ? null + : () async { + setState(() { + _recoveryKeyInputError = null; + _recoveryKeyInputLoading = true; + }); + try { + final key = _recoveryKeyTextEditingController + .text + .trim(); + if (key.isEmpty) return; + await bootstrap.newSsssKey!.unlock( + keyOrPassphrase: key, + ); + await bootstrap.openExistingSsss(); + Logs().d('SSSS unlocked'); + if (bootstrap.encryption.crossSigning.enabled) { + Logs().v( + 'Cross signing is already enabled. Try to self-sign', + ); + try { + await bootstrap + .client.encryption!.crossSigning + .selfSign(recoveryKey: key); + Logs().d('Successful selfsigned'); + } catch (e, s) { + Logs().e( + 'Unable to self sign with recovery key after successfully open existing SSSS', + e, + s, + ); + } + } + } on InvalidPassphraseException catch (e) { + setState( + () => _recoveryKeyInputError = + e.toLocalizedString(context), + ); + } on FormatException catch (_) { + setState( + () => _recoveryKeyInputError = + L10n.of(context).wrongRecoveryKey, + ); + } catch (e, s) { + ErrorReporter( + context, + 'Unable to open SSSS with recovery key', + ).onErrorCallback(e, s); + setState( + () => _recoveryKeyInputError = + e.toLocalizedString(context), + ); + } finally { + setState( + () => _recoveryKeyInputLoading = false, + ); + } + }, + ), + const SizedBox(height: 16), + Row( + children: [ + const Expanded(child: Divider()), + Padding( + padding: const EdgeInsets.all(12.0), + child: Text(L10n.of(context).or), + ), + const Expanded(child: Divider()), + ], + ), + const SizedBox(height: 16), + ElevatedButton.icon( + icon: const Icon(Icons.cast_connected_outlined), + label: Text(L10n.of(context).transferFromAnotherDevice), + onPressed: _recoveryKeyInputLoading + ? null + : () async { + final consent = await showOkCancelAlertDialog( + context: context, + title: L10n.of(context).verifyOtherDevice, + message: L10n.of(context) + .verifyOtherDeviceDescription, + okLabel: L10n.of(context).ok, + cancelLabel: L10n.of(context).cancel, + ); + if (consent != OkCancelResult.ok) return; + final req = await showFutureLoadingDialog( + context: context, + delay: false, + future: () async { + await widget.client.updateUserDeviceKeys(); + return widget.client + .userDeviceKeys[widget.client.userID!]! + .startVerification(); + }, + ); + if (req.error != null) return; + await KeyVerificationDialog(request: req.result!) + .show(context); + Navigator.of(context, rootNavigator: false).pop(); + }, + ), + const SizedBox(height: 16), + ElevatedButton.icon( + style: ElevatedButton.styleFrom( + backgroundColor: theme.colorScheme.errorContainer, + foregroundColor: theme.colorScheme.onErrorContainer, + iconColor: theme.colorScheme.onErrorContainer, + ), + icon: const Icon(Icons.delete_outlined), + label: Text(L10n.of(context).recoveryKeyLost), + onPressed: _recoveryKeyInputLoading + ? null + : () async { + if (OkCancelResult.ok == + await showOkCancelAlertDialog( + useRootNavigator: false, + context: context, + title: L10n.of(context).recoveryKeyLost, + message: L10n.of(context).wipeChatBackup, + okLabel: L10n.of(context).ok, + cancelLabel: L10n.of(context).cancel, + isDestructive: true, + )) { + setState(() => _createBootstrap(true)); + } + }, + ), + ], + ), + ), + ), + ); + case BootstrapState.askWipeCrossSigning: + WidgetsBinding.instance.addPostFrameCallback( + (_) => bootstrap.wipeCrossSigning(_wipe!), + ); + break; + case BootstrapState.askSetupCrossSigning: + WidgetsBinding.instance.addPostFrameCallback( + (_) => bootstrap.askSetupCrossSigning( + setupMasterKey: true, + setupSelfSigningKey: true, + setupUserSigningKey: true, + ), + ); + break; + case BootstrapState.askWipeOnlineKeyBackup: + WidgetsBinding.instance.addPostFrameCallback( + (_) => bootstrap.wipeOnlineKeyBackup(_wipe!), + ); + + break; + case BootstrapState.askSetupOnlineKeyBackup: + WidgetsBinding.instance.addPostFrameCallback( + (_) => bootstrap.askSetupOnlineKeyBackup(true), + ); + break; + case BootstrapState.error: + titleText = L10n.of(context).oopsSomethingWentWrong; + body = const Icon(Icons.error_outline, color: Colors.red, size: 80); + buttons.add( + ElevatedButton( + onPressed: () => + Navigator.of(context, rootNavigator: false).pop(false), + child: Text(L10n.of(context).close), + ), + ); + break; + case BootstrapState.done: + titleText = L10n.of(context).everythingReady; + body = Column( + mainAxisSize: MainAxisSize.min, + children: [ + const Icon( + Icons.check_circle_rounded, + size: 120, + color: Colors.green, + ), + const SizedBox(height: 16), + Text( + L10n.of(context).yourChatBackupHasBeenSetUp, + style: const TextStyle(fontSize: 20), + ), + const SizedBox(height: 16), + ], + ); + buttons.add( + ElevatedButton( + onPressed: () => + Navigator.of(context, rootNavigator: false).pop(false), + child: Text(L10n.of(context).close), + ), + ); + break; + } + } + + return Scaffold( + appBar: AppBar( + leading: Center( + child: CloseButton( + onPressed: () => + Navigator.of(context, rootNavigator: false).pop(true), + ), + ), + title: Text(titleText ?? L10n.of(context).loadingPleaseWait), + ), + body: Center( + child: Padding( + padding: const EdgeInsets.all(20.0), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + body, + const SizedBox(height: 8), + ...buttons, + ], + ), + ), + ), + ); + } +} diff --git a/lib/pages/chat/add_widget_tile.dart b/lib/pages/chat/add_widget_tile.dart new file mode 100644 index 0000000..b41d500 --- /dev/null +++ b/lib/pages/chat/add_widget_tile.dart @@ -0,0 +1,85 @@ +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/pages/chat/add_widget_tile_view.dart'; + +class AddWidgetTile extends StatefulWidget { + final Room room; + + const AddWidgetTile({super.key, required this.room}); + + @override + State createState() => AddWidgetTileState(); +} + +class AddWidgetTileState extends State { + final TextEditingController urlController = TextEditingController(); + final TextEditingController nameController = TextEditingController(); + String widgetType = 'm.etherpad'; + + late final bool initiallyExpanded; + + String? nameError; + String? urlError; + + @override + void initState() { + initiallyExpanded = widget.room.widgets.isEmpty; + super.initState(); + } + + void setWidgetType(String value) => setState(() => widgetType = value); + + void addWidget() { + try { + nameError = null; + urlError = null; + + final room = widget.room; + final name = nameController.text; + final uri = Uri.tryParse(urlController.text); + + if (name.length < 3) { + setState(() { + nameError = L10n.of(context).widgetNameError; + }); + return; + } + + if (uri == null || uri.scheme != 'https') { + setState(() { + urlError = L10n.of(context).widgetUrlError; + }); + return; + } + setState(() {}); + + late MatrixWidget matrixWidget; + switch (widgetType) { + case 'm.etherpad': + matrixWidget = MatrixWidget.etherpad(room, name, uri); + break; + case 'm.jitsi': + matrixWidget = MatrixWidget.jitsi(room, name, uri); + break; + case 'm.video': + matrixWidget = MatrixWidget.video(room, name, uri); + break; + default: + matrixWidget = MatrixWidget.custom(room, name, uri); + break; + } + widget.room.addWidget(matrixWidget); + Navigator.of(context).pop(); + } catch (e) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text(L10n.of(context).errorAddingWidget)), + ); + } + } + + @override + Widget build(BuildContext context) => AddWidgetTileView(controller: this); +} diff --git a/lib/pages/chat/add_widget_tile_view.dart b/lib/pages/chat/add_widget_tile_view.dart new file mode 100644 index 0000000..7163a1f --- /dev/null +++ b/lib/pages/chat/add_widget_tile_view.dart @@ -0,0 +1,73 @@ +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +import 'package:fluffychat/pages/chat/add_widget_tile.dart'; + +class AddWidgetTileView extends StatelessWidget { + final AddWidgetTileState controller; + + const AddWidgetTileView({super.key, required this.controller}); + + @override + Widget build(BuildContext context) { + + return ExpansionTile( + title: Text(L10n.of(context).addWidget), + leading: const Icon(Icons.add), + initiallyExpanded: controller.initiallyExpanded, + children: [ + CupertinoSegmentedControl( + groupValue: controller.widgetType, + padding: const EdgeInsets.all(8), + children: { + 'm.etherpad': Text(L10n.of(context).widgetEtherpad), + 'm.jitsi': Text(L10n.of(context).widgetJitsi), + 'm.video': Text(L10n.of(context).widgetVideo), + 'm.custom': Text(L10n.of(context).widgetCustom), + }.map( + (key, value) => MapEntry( + key, + Padding( + padding: const EdgeInsets.symmetric(horizontal: 4.0), + child: value, + ), + ), + ), + onValueChanged: controller.setWidgetType, + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: TextField( + controller: controller.nameController, + autofocus: true, + decoration: InputDecoration( + prefixIcon: const Icon(Icons.label), + label: Text(L10n.of(context).widgetName), + errorText: controller.nameError, + ), + ), + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: TextField( + controller: controller.urlController, + decoration: InputDecoration( + prefixIcon: const Icon(Icons.add_link), + label: Text(L10n.of(context).link), + errorText: controller.urlError, + ), + ), + ), + OverflowBar( + children: [ + TextButton( + onPressed: controller.addWidget, + child: Text(L10n.of(context).addWidget), + ), + ], + ), + ], + ); + } +} diff --git a/lib/pages/chat/chat.dart b/lib/pages/chat/chat.dart new file mode 100644 index 0000000..ce6a95b --- /dev/null +++ b/lib/pages/chat/chat.dart @@ -0,0 +1,1424 @@ +import 'dart:async'; +import 'dart:io'; + +import 'package:fluffychat/pages/chat/recovered_event_dialog.dart'; +import 'package:fluffychat/pages/chat/translated_event_dialog.dart'; +import 'package:fluffychat/utils/file_description.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/synapse_admin_extension.dart'; +import 'package:fluffychat/utils/translator.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +import 'package:collection/collection.dart'; +import 'package:desktop_drop/desktop_drop.dart'; +import 'package:device_info_plus/device_info_plus.dart'; +import 'package:emoji_picker_flutter/emoji_picker_flutter.dart'; +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:go_router/go_router.dart'; +import 'package:image_picker/image_picker.dart'; +import 'package:matrix/matrix.dart'; +import 'package:record/record.dart'; +import 'package:scroll_to_index/scroll_to_index.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/themes.dart'; +import 'package:fluffychat/pages/chat/chat_view.dart'; +import 'package:fluffychat/pages/chat/event_info_dialog.dart'; +import 'package:fluffychat/pages/chat/recording_dialog.dart'; +import 'package:fluffychat/pages/chat_details/chat_details.dart'; +import 'package:fluffychat/utils/error_reporter.dart'; +import 'package:fluffychat/utils/file_selector.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/event_extension.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/filtered_timeline_extension.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; +import 'package:fluffychat/utils/other_party_can_receive.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/utils/show_scaffold_dialog.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_modal_action_popup.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_text_input_dialog.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import 'package:fluffychat/widgets/matrix.dart'; +import 'package:fluffychat/widgets/share_scaffold_dialog.dart'; +import '../../utils/account_bundles.dart'; +import '../../utils/localized_exception_extension.dart'; +import 'send_file_dialog.dart'; +import 'send_location_dialog.dart'; + +class ChatPage extends StatelessWidget { + final String roomId; + final List? shareItems; + final String? eventId; + + const ChatPage({ + super.key, + required this.roomId, + this.eventId, + this.shareItems, + }); + + @override + Widget build(BuildContext context) { + final room = Matrix.of(context).client.getRoomById(roomId); + if (room == null) { + return Scaffold( + appBar: AppBar(title: Text(L10n.of(context).oopsSomethingWentWrong)), + body: Center( + child: Padding( + padding: const EdgeInsets.all(16), + child: Text(L10n.of(context).youAreNoLongerParticipatingInThisChat), + ), + ), + ); + } + + return ChatPageWithRoom( + key: Key('chat_page_${roomId}_$eventId'), + room: room, + shareItems: shareItems, + eventId: eventId, + ); + } +} + +class ChatPageWithRoom extends StatefulWidget { + final Room room; + final List? shareItems; + final String? eventId; + + const ChatPageWithRoom({ + super.key, + required this.room, + this.shareItems, + this.eventId, + }); + + @override + ChatController createState() => ChatController(); +} + +class ChatController extends State + with WidgetsBindingObserver { + Room get room => sendingClient.getRoomById(roomId) ?? widget.room; + + late Client sendingClient; + + Timeline? timeline; + + late final String readMarkerEventId; + + String get roomId => widget.room.id; + + final AutoScrollController scrollController = AutoScrollController(); + + late final FocusNode inputFocus; + StreamSubscription? onFocusSub; + + Timer? typingCoolDown; + Timer? typingTimeout; + bool currentlyTyping = false; + bool dragging = false; + + void onDragEntered(_) => setState(() => dragging = true); + + void onDragExited(_) => setState(() => dragging = false); + + void onDragDone(DropDoneDetails details) async { + setState(() => dragging = false); + if (details.files.isEmpty) return; + + await showAdaptiveDialog( + context: context, + builder: (c) => SendFileDialog( + files: details.files, + room: room, + outerContext: context, + ), + ); + } + + bool get canSaveSelectedEvent => + selectedEvents.length == 1 && + { + MessageTypes.Video, + MessageTypes.Image, + MessageTypes.Sticker, + MessageTypes.Audio, + MessageTypes.File, + }.contains(selectedEvents.single.messageType); + + void saveSelectedEvent(context) => selectedEvents.single.saveFile(context); + + List selectedEvents = []; + + final Set unfolded = {}; + + Event? replyEvent; + + Event? editEvent; + + bool _scrolledUp = false; + + bool get showScrollDownButton => + _scrolledUp || timeline?.allowNewEvent == false; + + bool get selectMode => selectedEvents.isNotEmpty; + + final int _loadHistoryCount = 100; + + String pendingText = ''; + + bool showEmojiPicker = false; + + void recreateChat() async { + final room = this.room; + final userId = room.directChatMatrixID; + if (userId == null) { + throw Exception( + 'Try to recreate a room with is not a DM room. This should not be possible from the UI!', + ); + } + await showFutureLoadingDialog( + context: context, + future: () => room.invite(userId), + ); + } + + void leaveChat() async { + final success = await showFutureLoadingDialog( + context: context, + future: room.leave, + ); + if (success.error != null) return; + context.go('/rooms'); + } + + EmojiPickerType emojiPickerType = EmojiPickerType.keyboard; + + void requestHistory([_]) async { + Logs().v('Requesting history...'); + await timeline?.requestHistory(historyCount: _loadHistoryCount); + } + + void requestFuture() async { + final timeline = this.timeline; + if (timeline == null) return; + Logs().v('Requesting future...'); + final mostRecentEventId = timeline.events.first.eventId; + await timeline.requestFuture(historyCount: _loadHistoryCount); + setReadMarker(eventId: mostRecentEventId); + } + + void _updateScrollController() { + if (!mounted) { + return; + } + if (!scrollController.hasClients) return; + if (timeline?.allowNewEvent == false || + scrollController.position.pixels > 0 && _scrolledUp == false) { + setState(() => _scrolledUp = true); + } else if (scrollController.position.pixels <= 0 && _scrolledUp == true) { + setState(() => _scrolledUp = false); + setReadMarker(); + } + + if (scrollController.position.pixels == 0 || + scrollController.position.pixels == 64) { + requestFuture(); + } + } + + void _loadDraft() async { + final prefs = await SharedPreferences.getInstance(); + final draft = prefs.getString('draft_$roomId'); + if (draft != null && draft.isNotEmpty) { + sendController.text = draft; + } + } + + void _shareItems([_]) { + final shareItems = widget.shareItems; + if (shareItems == null || shareItems.isEmpty) return; + if (!room.otherPartyCanReceiveMessages) { + final theme = Theme.of(context); + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + backgroundColor: theme.colorScheme.errorContainer, + closeIconColor: theme.colorScheme.onErrorContainer, + content: Text( + L10n.of(context).otherPartyNotLoggedIn, + style: TextStyle( + color: theme.colorScheme.onErrorContainer, + ), + ), + showCloseIcon: true, + ), + ); + return; + } + for (final item in shareItems) { + if (item is FileShareItem) continue; + if (item is TextShareItem) room.sendTextEvent(item.value); + if (item is ContentShareItem) room.sendEvent(item.value); + } + final files = shareItems + .whereType() + .map((item) => item.value) + .toList(); + if (files.isEmpty) return; + showAdaptiveDialog( + context: context, + builder: (c) => SendFileDialog( + files: files, + room: room, + outerContext: context, + replyEvent: replyEvent), + ); + } + + KeyEventResult _shiftEnterKeyHandling(FocusNode node, KeyEvent evt) { + if (!HardwareKeyboard.instance.isShiftPressed && + evt.logicalKey.keyLabel == 'Enter') { + if (evt is KeyDownEvent) { + send(); + } + return KeyEventResult.handled; + } else { + return KeyEventResult.ignored; + } + } + + @override + void initState() { + inputFocus = FocusNode( + onKeyEvent: (AppConfig.sendOnEnter ?? !PlatformInfos.isMobile) + ? _shiftEnterKeyHandling + : null, + ); + + scrollController.addListener(_updateScrollController); + inputFocus.addListener(_inputFocusListener); + + _loadDraft(); + WidgetsBinding.instance.addPostFrameCallback(_shareItems); + super.initState(); + _displayChatDetailsColumn = ValueNotifier( + AppSettings.displayChatDetailsColumn.getItem(Matrix.of(context).store), + ); + + sendingClient = Matrix.of(context).client; + readMarkerEventId = room.hasNewMessages ? room.fullyRead : ''; + WidgetsBinding.instance.addObserver(this); + _tryLoadTimeline(); + if (kIsWeb) { + onFocusSub = html.window.onFocus.listen((_) => setReadMarker()); + } + } + + void _tryLoadTimeline() async { + final initialEventId = widget.eventId; + loadTimelineFuture = _getTimeline(); + try { + await loadTimelineFuture; + if (initialEventId != null) scrollToEventId(initialEventId); + + var readMarkerEventIndex = readMarkerEventId.isEmpty + ? -1 + : timeline!.events + .filterByVisibleInGui(exceptionEventId: readMarkerEventId) + .indexWhere((e) => e.eventId == readMarkerEventId); + + // Read marker is existing but not found in first events. Try a single + // requestHistory call before opening timeline on event context: + if (readMarkerEventId.isNotEmpty && readMarkerEventIndex == -1) { + await timeline?.requestHistory(historyCount: _loadHistoryCount); + readMarkerEventIndex = timeline!.events + .filterByVisibleInGui(exceptionEventId: readMarkerEventId) + .indexWhere((e) => e.eventId == readMarkerEventId); + } + + if (readMarkerEventIndex > 1) { + Logs().v('Scroll up to visible event', readMarkerEventId); + scrollToEventId(readMarkerEventId, highlightEvent: false); + return; + } else if (readMarkerEventId.isNotEmpty && readMarkerEventIndex == -1) { + _showScrollUpMaterialBanner(readMarkerEventId); + } + + // Mark room as read on first visit if requirements are fulfilled + setReadMarker(); + + if (!mounted) return; + } catch (e, s) { + ErrorReporter(context, 'Unable to load timeline').onErrorCallback(e, s); + rethrow; + } + } + + String? scrollUpBannerEventId; + + void discardScrollUpBannerEventId() => setState(() { + scrollUpBannerEventId = null; + }); + + void _showScrollUpMaterialBanner(String eventId) => setState(() { + scrollUpBannerEventId = eventId; + }); + + void updateView() { + if (!mounted) return; + setReadMarker(); + setState(() {}); + } + + Future? loadTimelineFuture; + + int? animateInEventIndex; + + void onInsert(int i) { + // setState will be called by updateView() anyway + animateInEventIndex = i; + } + + Future _getTimeline({ + String? eventContextId, + }) async { + await Matrix.of(context).client.roomsLoading; + await Matrix.of(context).client.accountDataLoading; + if (eventContextId != null && + (!eventContextId.isValidMatrixId || eventContextId.sigil != '\$')) { + eventContextId = null; + } + try { + timeline?.cancelSubscriptions(); + timeline = await room.getTimeline( + onUpdate: updateView, + eventContextId: eventContextId, + onInsert: onInsert, + ); + } catch (e, s) { + Logs().w('Unable to load timeline on event ID $eventContextId', e, s); + if (!mounted) return; + timeline = await room.getTimeline( + onUpdate: updateView, + onInsert: onInsert, + ); + if (!mounted) return; + if (e is TimeoutException || e is IOException) { + _showScrollUpMaterialBanner(eventContextId!); + } + } + timeline!.requestKeys(onlineKeyBackupOnly: false); + if (room.markedUnread) room.markUnread(false); + + return; + } + + String? scrollToEventIdMarker; + + @override + void didChangeAppLifecycleState(AppLifecycleState state) { + if (state != AppLifecycleState.resumed) return; + setReadMarker(); + } + + Future? _setReadMarkerFuture; + + void setReadMarker({String? eventId}) { + if (_setReadMarkerFuture != null) return; + if (_scrolledUp) return; + if (scrollUpBannerEventId != null) return; + + if (eventId == null && + !room.hasNewMessages && + room.notificationCount == 0) { + return; + } + + // Do not send read markers when app is not in foreground + if (kIsWeb && !Matrix.of(context).webHasFocus) return; + if (!kIsWeb && + WidgetsBinding.instance.lifecycleState != AppLifecycleState.resumed) { + return; + } + + final timeline = this.timeline; + if (timeline == null || timeline.events.isEmpty) return; + + Logs().d('Set read marker...', eventId); + // ignore: unawaited_futures + _setReadMarkerFuture = timeline + .setReadMarker( + eventId: eventId, + public: AppConfig.sendPublicReadReceipts, + ) + .then((_) { + _setReadMarkerFuture = null; + }); + if (eventId == null || eventId == timeline.room.lastEvent?.eventId) { + Matrix.of(context).backgroundPush?.cancelNotification(roomId); + } + } + + @override + void dispose() { + timeline?.cancelSubscriptions(); + timeline = null; + inputFocus.removeListener(_inputFocusListener); + onFocusSub?.cancel(); + super.dispose(); + } + + TextEditingController sendController = TextEditingController(); + + void setSendingClient(Client c) { + // first cancel typing with the old sending client + if (currentlyTyping) { + // no need to have the setting typing to false be blocking + typingCoolDown?.cancel(); + typingCoolDown = null; + room.setTyping(false); + currentlyTyping = false; + } + // then cancel the old timeline + // fixes bug with read reciepts and quick switching + loadTimelineFuture = _getTimeline(eventContextId: room.fullyRead).onError( + ErrorReporter( + context, + 'Unable to load timeline after changing sending Client', + ).onErrorCallback, + ); + + // then set the new sending client + setState(() => sendingClient = c); + } + + void setActiveClient(Client c) => setState(() { + Matrix.of(context).setActiveClient(c); + }); + + Future send() async { + if (sendController.text.trim().isEmpty) return; + if (inputFocus.hasFocus) { + inputFocus.unfocus(); + } + FocusScope.of(context).requestFocus(inputFocus); + _storeInputTimeoutTimer?.cancel(); + final prefs = await SharedPreferences.getInstance(); + prefs.remove('draft_$roomId'); + var parseCommands = true; + + final commandMatch = RegExp(r'^\/(\w+)').firstMatch(sendController.text); + if (commandMatch != null && + !sendingClient.commands.keys.contains(commandMatch[1]!.toLowerCase())) { + final l10n = L10n.of(context); + final dialogResult = await showOkCancelAlertDialog( + context: context, + title: l10n.commandInvalid, + message: l10n.commandMissing(commandMatch[0]!), + okLabel: l10n.sendAsText, + cancelLabel: l10n.cancel, + ); + if (dialogResult == OkCancelResult.cancel) return; + parseCommands = false; + } + + // ignore: unawaited_futures + room.sendTextEvent( + sendController.text, + inReplyTo: replyEvent, + editEventId: editEvent?.eventId, + parseCommands: parseCommands, + ); + sendController.value = TextEditingValue( + text: pendingText, + selection: const TextSelection.collapsed(offset: 0), + ); + + setState(() { + sendController.text = pendingText; + _inputTextIsEmpty = pendingText.isEmpty; + replyEvent = null; + editEvent = null; + pendingText = ''; + }); + } + + void sendFileAction({FileSelectorType type = FileSelectorType.any}) async { + final files = await selectFiles( + context, + allowMultiple: true, + type: type, + ); + if (files.isEmpty) return; + await showAdaptiveDialog( + context: context, + builder: (c) => SendFileDialog( + files: files, + room: room, + outerContext: context, + replyEvent: replyEvent, + ), + ); + replyEvent = null; + } + + void sendImageFromClipBoard(Uint8List? image) async { + if (image == null) return; + await showAdaptiveDialog( + context: context, + builder: (c) => SendFileDialog( + files: [XFile.fromData(image)], + room: room, + outerContext: context, + ), + ); + } + + void openCameraAction() async { + // Make sure the textfield is unfocused before opening the camera + FocusScope.of(context).requestFocus(FocusNode()); + final file = await ImagePicker().pickImage(source: ImageSource.camera); + if (file == null) return; + + await showAdaptiveDialog( + context: context, + builder: (c) => SendFileDialog( + files: [file], + room: room, + outerContext: context, + ), + ); + } + + void openVideoCameraAction() async { + // Make sure the textfield is unfocused before opening the camera + FocusScope.of(context).requestFocus(FocusNode()); + final file = await ImagePicker().pickVideo( + source: ImageSource.camera, + maxDuration: const Duration(minutes: 1), + ); + if (file == null) return; + + await showAdaptiveDialog( + context: context, + builder: (c) => SendFileDialog( + files: [file], + room: room, + outerContext: context, + ), + ); + } + + void voiceMessageAction() async { + final scaffoldMessenger = ScaffoldMessenger.of(context); + if (PlatformInfos.isAndroid) { + final info = await DeviceInfoPlugin().androidInfo; + if (info.version.sdkInt < 19) { + showOkAlertDialog( + context: context, + title: L10n.of(context).unsupportedAndroidVersion, + message: L10n.of(context).unsupportedAndroidVersionLong, + okLabel: L10n.of(context).close, + ); + return; + } + } + + if (await AudioRecorder().hasPermission() == false) return; + final result = await showDialog( + context: context, + barrierDismissible: false, + builder: (c) => const RecordingDialog(), + ); + if (result == null) return; + final audioFile = XFile(result.path); + final file = MatrixAudioFile( + bytes: await audioFile.readAsBytes(), + name: result.fileName ?? audioFile.path, + ); + await room.sendFileEvent( + file, + inReplyTo: replyEvent, + extraContent: { + 'info': { + ...file.info, + 'duration': result.duration, + }, + 'org.matrix.msc3245.voice': {}, + 'org.matrix.msc1767.audio': { + 'duration': result.duration, + 'waveform': result.waveform, + }, + }, + ).catchError((e) { + scaffoldMessenger.showSnackBar( + SnackBar( + content: Text( + (e as Object).toLocalizedString(context), + ), + ), + ); + return null; + }); + setState(() { + replyEvent = null; + }); + } + + void hideEmojiPicker() { + setState(() => showEmojiPicker = false); + } + + void emojiPickerAction() { + if (showEmojiPicker) { + inputFocus.requestFocus(); + } else { + inputFocus.unfocus(); + } + emojiPickerType = EmojiPickerType.keyboard; + setState(() => showEmojiPicker = !showEmojiPicker); + } + + void _inputFocusListener() { + if (showEmojiPicker && inputFocus.hasFocus) { + emojiPickerType = EmojiPickerType.keyboard; + setState(() => showEmojiPicker = false); + } + } + + void sendLocationAction() async { + await showAdaptiveDialog( + context: context, + builder: (c) => SendLocationDialog(room: room), + ); + } + + String _getSelectedEventString() { + var copyString = ''; + if (selectedEvents.length == 1) { + return selectedEvents.first + .getDisplayEvent(timeline!) + .calcLocalizedBodyFallback(MatrixLocals(L10n.of(context))); + } + for (final event in selectedEvents) { + if (copyString.isNotEmpty) copyString += '\n\n'; + copyString += event.getDisplayEvent(timeline!).calcLocalizedBodyFallback( + MatrixLocals(L10n.of(context)), + withSenderNamePrefix: true, + ); + } + return copyString; + } + + void copyEventsAction() { + Clipboard.setData(ClipboardData(text: _getSelectedEventString())); + setState(() { + showEmojiPicker = false; + selectedEvents.clear(); + }); + } + + void recoverEventAction() async { + final mx = Matrix.of(context); + if (!await mx.client.isSynapseAdministrator()) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text(L10n.of(context).errorRecoveringMessageNoAdmin)), + ); + return; + } + final event = selectedEvents.single; + await mx.client.reportEvent(roomId, event.eventId, + reason: "Extera (Next) Redacted Event Recover"); + + final reports = await mx.client.getEventReports(); + final report = reports.firstWhere( + (rep) => rep['room_id'] == roomId && rep['event_id'] == event.eventId); + final recoveredEvent = await mx.client.getReportedEvent(report['id']); + + if (recoveredEvent == null) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text(L10n.of(context).errorRecoveringMessage)), + ); + return; + } + + Navigator.of(context).push(new MaterialPageRoute( + builder: (BuildContext ctx) { + return RecoveredEventDialog( + event: recoveredEvent!, timeline: timeline!); + }, + fullscreenDialog: true)); + } + + void translateEventAction() async { + final event = selectedEvents.single; + var text = event.isRichMessage ? event.formattedText : event.text; + if (text == null) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text(L10n.of(context).errorTranslatingMessage)), + ); + return; + } + var content = {...event.content}; + try { + text = await Translator.translate(text, PlatformDispatcher.instance.locale.languageCode); + } catch (e) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text(L10n.of(context).errorTranslatingMessage)), + ); + return; + } + if (event.isRichMessage) { + content['formatted_body'] = text; + } else { + content['body'] = text; + } + content['xyz.extera.translated'] = true; + Navigator.of(context).push(new MaterialPageRoute( + builder: (BuildContext ctx) { + return TranslatedEventDialog( + event: new Event(content: content, type: 'm.room.message', eventId: event.eventId, senderId: event.senderId, originServerTs: event.originServerTs, room: room), timeline: timeline!); + }, + fullscreenDialog: true)); + } + + void reportEventAction() async { + final event = selectedEvents.single; + final score = await showModalActionPopup( + context: context, + title: L10n.of(context).reportMessage, + message: L10n.of(context).howOffensiveIsThisContent, + cancelLabel: L10n.of(context).cancel, + actions: [ + AdaptiveModalAction( + value: -100, + label: L10n.of(context).extremeOffensive, + ), + AdaptiveModalAction( + value: -50, + label: L10n.of(context).offensive, + ), + AdaptiveModalAction( + value: 0, + label: L10n.of(context).inoffensive, + ), + ], + ); + if (score == null) return; + final reason = await showTextInputDialog( + context: context, + title: L10n.of(context).whyDoYouWantToReportThis, + okLabel: L10n.of(context).ok, + cancelLabel: L10n.of(context).cancel, + hintText: L10n.of(context).reason, + ); + if (reason == null || reason.isEmpty) return; + final result = await showFutureLoadingDialog( + context: context, + future: () => Matrix.of(context).client.reportEvent( + event.roomId!, + event.eventId, + reason: reason, + score: score, + ), + ); + if (result.error != null) return; + setState(() { + showEmojiPicker = false; + selectedEvents.clear(); + }); + } + + void deleteErrorEventsAction() async { + try { + if (selectedEvents.any((event) => event.status != EventStatus.error)) { + throw Exception( + 'Tried to delete failed to send events but one event is not failed to sent', + ); + } + for (final event in selectedEvents) { + await event.cancelSend(); + } + setState(selectedEvents.clear); + } catch (e, s) { + ErrorReporter( + context, + 'Error while delete error events action', + ).onErrorCallback(e, s); + } + } + + void redactEventsAction() async { + final reasonInput = selectedEvents.any((event) => event.status.isSent) + ? await showTextInputDialog( + context: context, + title: L10n.of(context).redactMessage, + message: L10n.of(context).redactMessageDescription, + isDestructive: true, + hintText: L10n.of(context).optionalRedactReason, + okLabel: L10n.of(context).remove, + cancelLabel: L10n.of(context).cancel, + ) + : null; + if (reasonInput == null) return; + final reason = reasonInput.isEmpty ? null : reasonInput; + for (final event in selectedEvents) { + await showFutureLoadingDialog( + context: context, + future: () async { + if (event.status.isSent) { + if (event.canRedact) { + await event.redactEvent(reason: reason); + } else { + final client = currentRoomBundle.firstWhere( + (cl) => selectedEvents.first.senderId == cl!.userID, + orElse: () => null, + ); + if (client == null) { + return; + } + final room = client.getRoomById(roomId)!; + await Event.fromJson(event.toJson(), room).redactEvent( + reason: reason, + ); + } + } else { + await event.cancelSend(); + } + }, + ); + } + setState(() { + showEmojiPicker = false; + selectedEvents.clear(); + }); + } + + List get currentRoomBundle { + final clients = Matrix.of(context).currentBundle!; + clients.removeWhere((c) => c!.getRoomById(roomId) == null); + return clients; + } + + bool get canRedactSelectedEvents { + if (isArchived) return false; + final clients = Matrix.of(context).currentBundle; + for (final event in selectedEvents) { + if (!event.status.isSent) return false; + if (event.canRedact == false && + !(clients!.any((cl) => event.senderId == cl!.userID))) { + return false; + } + } + return true; + } + + bool get canPinSelectedEvents { + if (isArchived || + !room.canChangeStateEvent(EventTypes.RoomPinnedEvents) || + selectedEvents.length != 1 || + !selectedEvents.single.status.isSent) { + return false; + } + return true; + } + + bool get canEditSelectedEvents { + if (isArchived || + selectedEvents.length != 1 || + !selectedEvents.first.status.isSent) { + return false; + } + return currentRoomBundle + .any((cl) => selectedEvents.first.senderId == cl!.userID); + } + + void forwardEventsAction() async { + if (selectedEvents.isEmpty) return; + await showScaffoldDialog( + context: context, + builder: (context) => ShareScaffoldDialog( + items: selectedEvents + .map((event) => ContentShareItem(event.content)) + .toList(), + ), + ); + if (!mounted) return; + setState(() => selectedEvents.clear()); + } + + void sendAgainAction() { + final event = selectedEvents.first; + if (event.status.isError) { + event.sendAgain(); + } + final allEditEvents = event + .aggregatedEvents(timeline!, RelationshipTypes.edit) + .where((e) => e.status.isError); + for (final e in allEditEvents) { + e.sendAgain(); + } + setState(() => selectedEvents.clear()); + } + + void replyAction({Event? replyTo}) { + setState(() { + replyEvent = replyTo ?? selectedEvents.first; + selectedEvents.clear(); + }); + inputFocus.requestFocus(); + } + + void scrollToEventId( + String eventId, { + bool highlightEvent = true, + }) async { + final foundEvent = + timeline!.events.firstWhereOrNull((event) => event.eventId == eventId); + + final eventIndex = foundEvent == null + ? -1 + : timeline!.events + .filterByVisibleInGui(exceptionEventId: eventId) + .indexOf(foundEvent); + + if (eventIndex == -1) { + setState(() { + timeline = null; + _scrolledUp = false; + loadTimelineFuture = _getTimeline(eventContextId: eventId).onError( + ErrorReporter(context, 'Unable to load timeline after scroll to ID') + .onErrorCallback, + ); + }); + await loadTimelineFuture; + WidgetsBinding.instance.addPostFrameCallback((timeStamp) { + scrollToEventId(eventId); + }); + return; + } + if (highlightEvent) { + setState(() { + scrollToEventIdMarker = eventId; + }); + } + await scrollController.scrollToIndex( + eventIndex + 1, + duration: FluffyThemes.animationDuration, + preferPosition: AutoScrollPosition.middle, + ); + _updateScrollController(); + } + + void scrollDown() async { + if (!timeline!.allowNewEvent) { + setState(() { + timeline = null; + _scrolledUp = false; + loadTimelineFuture = _getTimeline().onError( + ErrorReporter(context, 'Unable to load timeline after scroll down') + .onErrorCallback, + ); + }); + await loadTimelineFuture; + } + scrollController.jumpTo(0); + } + + void onEmojiSelected(_, Emoji? emoji) { + switch (emojiPickerType) { + case EmojiPickerType.reaction: + senEmojiReaction(emoji); + break; + case EmojiPickerType.keyboard: + typeEmoji(emoji); + onInputBarChanged(sendController.text); + break; + } + } + + void senEmojiReaction(Emoji? emoji) { + setState(() => showEmojiPicker = false); + if (emoji == null) return; + // make sure we don't send the same emoji twice + if (_allReactionEvents.any( + (e) => e.content.tryGetMap('m.relates_to')?['key'] == emoji.emoji, + )) { + return; + } + return sendEmojiAction(emoji.emoji); + } + + void typeEmoji(Emoji? emoji) { + if (emoji == null) return; + final text = sendController.text; + final selection = sendController.selection; + final newText = sendController.text.isEmpty + ? emoji.emoji + : text.replaceRange(selection.start, selection.end, emoji.emoji); + sendController.value = TextEditingValue( + text: newText, + selection: TextSelection.collapsed( + // don't forget an UTF-8 combined emoji might have a length > 1 + offset: selection.baseOffset + emoji.emoji.length, + ), + ); + } + + late Iterable _allReactionEvents; + + void emojiPickerBackspace() { + switch (emojiPickerType) { + case EmojiPickerType.reaction: + setState(() => showEmojiPicker = false); + break; + case EmojiPickerType.keyboard: + sendController + ..text = sendController.text.characters.skipLast(1).toString() + ..selection = TextSelection.fromPosition( + TextPosition(offset: sendController.text.length), + ); + break; + } + } + + void pickEmojiReactionAction(Iterable allReactionEvents) async { + _allReactionEvents = allReactionEvents; + emojiPickerType = EmojiPickerType.reaction; + setState(() => showEmojiPicker = true); + } + + void sendEmojiAction(String? emoji) async { + final events = List.from(selectedEvents); + setState(() => selectedEvents.clear()); + for (final event in events) { + await room.sendReaction( + event.eventId, + emoji!, + ); + } + } + + void clearSelectedEvents() => setState(() { + selectedEvents.clear(); + showEmojiPicker = false; + }); + + void clearSingleSelectedEvent() { + if (selectedEvents.length <= 1) { + clearSelectedEvents(); + } + } + + void editSelectedEventAction() { + final client = currentRoomBundle.firstWhere( + (cl) => selectedEvents.first.senderId == cl!.userID, + orElse: () => null, + ); + if (client == null) { + return; + } + setSendingClient(client); + setState(() { + pendingText = sendController.text; + editEvent = selectedEvents.first; + sendController.text = + editEvent!.getDisplayEvent(timeline!).calcLocalizedBodyFallback( + MatrixLocals(L10n.of(context)), + withSenderNamePrefix: false, + hideReply: true, + ); + selectedEvents.clear(); + }); + inputFocus.requestFocus(); + } + + void goToNewRoomAction() async { + final result = await showFutureLoadingDialog( + context: context, + future: () => room.client.joinRoomById( + room + .getState(EventTypes.RoomTombstone)! + .parsedTombstoneContent + .replacementRoom, + ), + ); + if (result.error != null) return; + if (!mounted) return; + context.go('/rooms/${result.result!}'); + + await showFutureLoadingDialog( + context: context, + future: room.leave, + ); + } + + void onSelectMessage(Event event) { + if (selectedEvents.contains(event)) { + setState( + () => selectedEvents.remove(event), + ); + } else { + setState( + () => selectedEvents.add(event), + ); + } + selectedEvents.sort( + (a, b) => a.originServerTs.compareTo(b.originServerTs), + ); + } + + int? findChildIndexCallback(Key key, Map thisEventsKeyMap) { + // this method is called very often. As such, it has to be optimized for speed. + if (key is! ValueKey) { + return null; + } + final eventId = key.value; + if (eventId is! String) { + return null; + } + // first fetch the last index the event was at + final index = thisEventsKeyMap[eventId]; + if (index == null) { + return null; + } + // we need to +1 as 0 is the typing thing at the bottom + return index + 1; + } + + void onInputBarSubmitted(_) { + send(); + } + + void onAddPopupMenuButtonSelected(String choice) { + if (choice == 'file') { + sendFileAction(); + } + if (choice == 'image') { + sendFileAction(type: FileSelectorType.images); + } + if (choice == 'video') { + sendFileAction(type: FileSelectorType.videos); + } + if (choice == 'camera') { + openCameraAction(); + } + if (choice == 'camera-video') { + openVideoCameraAction(); + } + if (choice == 'location') { + sendLocationAction(); + } + } + + unpinEvent(String eventId) async { + final response = await showOkCancelAlertDialog( + context: context, + title: L10n.of(context).unpin, + message: L10n.of(context).confirmEventUnpin, + okLabel: L10n.of(context).unpin, + cancelLabel: L10n.of(context).cancel, + ); + if (response == OkCancelResult.ok) { + final events = room.pinnedEventIds + ..removeWhere((oldEvent) => oldEvent == eventId); + showFutureLoadingDialog( + context: context, + future: () => room.setPinnedEvents(events), + ); + } + } + + void pinEvent() { + final pinnedEventIds = room.pinnedEventIds; + final selectedEventIds = selectedEvents.map((e) => e.eventId).toSet(); + final unpin = selectedEventIds.length == 1 && + pinnedEventIds.contains(selectedEventIds.single); + if (unpin) { + pinnedEventIds.removeWhere(selectedEventIds.contains); + } else { + pinnedEventIds.addAll(selectedEventIds); + } + showFutureLoadingDialog( + context: context, + future: () => room.setPinnedEvents(pinnedEventIds), + ); + } + + Timer? _storeInputTimeoutTimer; + static const Duration _storeInputTimeout = Duration(milliseconds: 500); + + void onInputBarChanged(String text) { + if (_inputTextIsEmpty != text.isEmpty) { + setState(() { + _inputTextIsEmpty = text.isEmpty; + }); + } + + _storeInputTimeoutTimer?.cancel(); + _storeInputTimeoutTimer = Timer(_storeInputTimeout, () async { + final prefs = await SharedPreferences.getInstance(); + await prefs.setString('draft_$roomId', text); + }); + if (text.endsWith(' ') && Matrix.of(context).hasComplexBundles) { + final clients = currentRoomBundle; + for (final client in clients) { + final prefix = client!.sendPrefix; + if ((prefix.isNotEmpty) && + text.toLowerCase() == '${prefix.toLowerCase()} ') { + setSendingClient(client); + setState(() { + sendController.clear(); + }); + return; + } + } + } + if (AppConfig.sendTypingNotifications) { + typingCoolDown?.cancel(); + typingCoolDown = Timer(const Duration(seconds: 2), () { + typingCoolDown = null; + currentlyTyping = false; + room.setTyping(false); + }); + typingTimeout ??= Timer(const Duration(seconds: 30), () { + typingTimeout = null; + currentlyTyping = false; + }); + if (!currentlyTyping) { + currentlyTyping = true; + room.setTyping( + true, + timeout: const Duration(seconds: 30).inMilliseconds, + ); + } + } + } + + bool _inputTextIsEmpty = true; + + bool get isArchived => + {Membership.leave, Membership.ban}.contains(room.membership); + + void showEventInfo([Event? event]) => + (event ?? selectedEvents.single).showInfoDialog(context); + + void onPhoneButtonTap() async { + // VoIP required Android SDK 21 + if (PlatformInfos.isAndroid) { + DeviceInfoPlugin().androidInfo.then((value) { + if (value.version.sdkInt < 21) { + Navigator.pop(context); + showOkAlertDialog( + context: context, + title: L10n.of(context).unsupportedAndroidVersion, + message: L10n.of(context).unsupportedAndroidVersionLong, + okLabel: L10n.of(context).close, + ); + } + }); + } + final callType = await showModalActionPopup( + context: context, + title: L10n.of(context).warning, + message: L10n.of(context).videoCallsBetaWarning, + cancelLabel: L10n.of(context).cancel, + actions: [ + AdaptiveModalAction( + label: L10n.of(context).voiceCall, + icon: const Icon(Icons.phone_outlined), + value: CallType.kVoice, + ), + AdaptiveModalAction( + label: L10n.of(context).videoCall, + icon: const Icon(Icons.video_call_outlined), + value: CallType.kVideo, + ), + ], + ); + if (callType == null) return; + + final voipPlugin = Matrix.of(context).voipPlugin; + try { + await voipPlugin!.voip.inviteToCall(room, callType); + } catch (e) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text(e.toLocalizedString(context))), + ); + } + } + + void cancelReplyEventAction() => setState(() { + if (editEvent != null) { + sendController.text = pendingText; + pendingText = ''; + } + replyEvent = null; + editEvent = null; + }); + + late final ValueNotifier _displayChatDetailsColumn; + + void toggleDisplayChatDetailsColumn() async { + await AppSettings.displayChatDetailsColumn.setItem( + Matrix.of(context).store, + !_displayChatDetailsColumn.value, + ); + _displayChatDetailsColumn.value = !_displayChatDetailsColumn.value; + } + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + return Row( + children: [ + Expanded( + child: ChatView(this), + ), + AnimatedSize( + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + child: ValueListenableBuilder( + valueListenable: _displayChatDetailsColumn, + builder: (context, displayChatDetailsColumn, _) { + if (!FluffyThemes.isThreeColumnMode(context) || + room.membership != Membership.join || + !displayChatDetailsColumn) { + return const SizedBox( + height: double.infinity, + width: 0, + ); + } + return Container( + width: FluffyThemes.columnWidth, + clipBehavior: Clip.hardEdge, + decoration: BoxDecoration( + border: Border( + left: BorderSide( + width: 1, + color: theme.dividerColor, + ), + ), + ), + child: ChatDetails( + roomId: roomId, + embeddedCloseButton: IconButton( + icon: const Icon(Icons.close), + onPressed: toggleDisplayChatDetailsColumn, + ), + ), + ); + }, + ), + ), + ], + ); + } +} + +enum EmojiPickerType { reaction, keyboard } diff --git a/lib/pages/chat/chat_app_bar_list_tile.dart b/lib/pages/chat/chat_app_bar_list_tile.dart new file mode 100644 index 0000000..a1fc21b --- /dev/null +++ b/lib/pages/chat/chat_app_bar_list_tile.dart @@ -0,0 +1,65 @@ +import 'package:flutter/material.dart'; + +import 'package:flutter_linkify/flutter_linkify.dart'; + +import 'package:fluffychat/utils/url_launcher.dart'; + +class ChatAppBarListTile extends StatelessWidget { + final Widget? leading; + final String title; + final Widget? trailing; + final void Function()? onTap; + + static const double fixedHeight = 40.0; + + const ChatAppBarListTile({ + super.key, + this.leading, + required this.title, + this.trailing, + this.onTap, + }); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + final leading = this.leading; + final trailing = this.trailing; + return SizedBox( + height: fixedHeight, + child: InkWell( + onTap: onTap, + child: Row( + children: [ + if (leading != null) leading, + Expanded( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 4.0), + child: Linkify( + text: title, + textScaleFactor: MediaQuery.textScalerOf(context).scale(1), + options: const LinkifyOptions(humanize: false), + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle( + color: theme.colorScheme.onSurfaceVariant, + overflow: TextOverflow.ellipsis, + fontSize: 14, + ), + linkStyle: TextStyle( + color: theme.colorScheme.onSurfaceVariant, + fontSize: 14, + decoration: TextDecoration.underline, + decorationColor: theme.colorScheme.onSurfaceVariant, + ), + onOpen: (url) => UrlLauncher(context, url.url).launchUrl(), + ), + ), + ), + if (trailing != null) trailing, + ], + ), + ), + ); + } +} diff --git a/lib/pages/chat/chat_app_bar_title.dart b/lib/pages/chat/chat_app_bar_title.dart new file mode 100644 index 0000000..8777e25 --- /dev/null +++ b/lib/pages/chat/chat_app_bar_title.dart @@ -0,0 +1,139 @@ +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/pages/chat/chat.dart'; +import 'package:fluffychat/utils/date_time_extension.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; +import 'package:fluffychat/utils/sync_status_localization.dart'; +import 'package:fluffychat/widgets/avatar.dart'; +import 'package:fluffychat/widgets/presence_builder.dart'; + +class ChatAppBarTitle extends StatelessWidget { + final ChatController controller; + const ChatAppBarTitle(this.controller, {super.key}); + + @override + Widget build(BuildContext context) { + final room = controller.room; + if (controller.selectedEvents.isNotEmpty) { + return Text( + controller.selectedEvents.length.toString(), + style: TextStyle( + color: Theme.of(context).colorScheme.tertiary, + ), + ); + } + return InkWell( + hoverColor: Colors.transparent, + splashColor: Colors.transparent, + highlightColor: Colors.transparent, + onTap: controller.isArchived + ? null + : () => FluffyThemes.isThreeColumnMode(context) + ? controller.toggleDisplayChatDetailsColumn() + : context.go('/rooms/${room.id}/details'), + child: Row( + children: [ + Hero( + tag: 'content_banner', + child: Avatar( + mxContent: room.avatar, + name: room.getLocalizedDisplayname( + MatrixLocals(L10n.of(context)), + ), + size: 32, + ), + ), + const SizedBox(width: 12), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + room.getLocalizedDisplayname(MatrixLocals(L10n.of(context))), + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: const TextStyle( + fontSize: 16, + ), + ), + StreamBuilder( + stream: room.client.onSyncStatus.stream, + builder: (context, snapshot) { + final status = room.client.onSyncStatus.value ?? + const SyncStatusUpdate(SyncStatus.waitingForResponse); + final hide = FluffyThemes.isColumnMode(context) || + (room.client.onSync.value != null && + status.status != SyncStatus.error && + room.client.prevBatch != null); + return AnimatedSize( + duration: FluffyThemes.animationDuration, + child: hide + ? PresenceBuilder( + userId: room.directChatMatrixID, + builder: (context, presence) { + final lastActiveTimestamp = + presence?.lastActiveTimestamp; + final style = + Theme.of(context).textTheme.bodySmall; + if (presence?.currentlyActive == true) { + return Text( + L10n.of(context).currentlyActive, + style: style, + ); + } + if (lastActiveTimestamp != null) { + return Text( + L10n.of(context).lastActiveAgo( + lastActiveTimestamp + .localizedTimeShort(context), + ), + style: style, + ); + } + return const SizedBox.shrink(); + }, + ) + : Row( + children: [ + SizedBox.square( + dimension: 10, + child: CircularProgressIndicator.adaptive( + strokeWidth: 1, + value: status.progress, + valueColor: status.error != null + ? AlwaysStoppedAnimation( + Theme.of(context).colorScheme.error, + ) + : null, + ), + ), + const SizedBox(width: 4), + Expanded( + child: Text( + status.calcLocalizedString(context), + style: TextStyle( + fontSize: 12, + color: status.error != null + ? Theme.of(context).colorScheme.error + : null, + ), + ), + ), + ], + ), + ); + }, + ), + ], + ), + ), + ], + ), + ); + } +} diff --git a/lib/pages/chat/chat_emoji_picker.dart b/lib/pages/chat/chat_emoji_picker.dart new file mode 100644 index 0000000..7d21fab --- /dev/null +++ b/lib/pages/chat/chat_emoji_picker.dart @@ -0,0 +1,111 @@ +import 'package:flutter/material.dart'; + +import 'package:emoji_picker_flutter/emoji_picker_flutter.dart'; +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/pages/chat/sticker_picker_dialog.dart'; +import 'chat.dart'; + +class ChatEmojiPicker extends StatelessWidget { + final ChatController controller; + const ChatEmojiPicker(this.controller, {super.key}); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + return AnimatedContainer( + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + clipBehavior: Clip.hardEdge, + decoration: const BoxDecoration(), + height: controller.showEmojiPicker + ? MediaQuery.of(context).size.height / 2 + : 0, + child: controller.showEmojiPicker + ? DefaultTabController( + length: 2, + child: Column( + children: [ + TabBar( + tabs: [ + Tab(text: L10n.of(context).emojis), + Tab(text: L10n.of(context).stickers), + ], + ), + Expanded( + child: TabBarView( + children: [ + EmojiPicker( + onEmojiSelected: controller.onEmojiSelected, + onBackspacePressed: controller.emojiPickerBackspace, + config: Config( + emojiViewConfig: EmojiViewConfig( + noRecents: const NoRecent(), + backgroundColor: + theme.colorScheme.onInverseSurface, + ), + bottomActionBarConfig: const BottomActionBarConfig( + enabled: false, + ), + categoryViewConfig: CategoryViewConfig( + backspaceColor: theme.colorScheme.primary, + iconColor: + theme.colorScheme.primary.withAlpha(128), + iconColorSelected: theme.colorScheme.primary, + indicatorColor: theme.colorScheme.primary, + backgroundColor: theme.colorScheme.surface, + ), + skinToneConfig: SkinToneConfig( + dialogBackgroundColor: Color.lerp( + theme.colorScheme.surface, + theme.colorScheme.primaryContainer, + 0.75, + )!, + indicatorColor: theme.colorScheme.onSurface, + ), + ), + ), + StickerPickerDialog( + room: controller.room, + onSelected: (sticker) { + controller.room.sendEvent( + { + 'body': sticker.body, + 'info': sticker.info ?? {}, + 'url': sticker.url.toString(), + }, + type: EventTypes.Sticker, + ); + controller.hideEmojiPicker(); + }, + ), + ], + ), + ), + ], + ), + ) + : null, + ); + } +} + +class NoRecent extends StatelessWidget { + const NoRecent({super.key}); + + @override + Widget build(BuildContext context) { + return Center( + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Text( + L10n.of(context).emoteKeyboardNoRecents, + style: Theme.of(context).textTheme.bodyLarge, + textAlign: TextAlign.center, + ), + ), + ); + } +} diff --git a/lib/pages/chat/chat_event_list.dart b/lib/pages/chat/chat_event_list.dart new file mode 100644 index 0000000..01feeae --- /dev/null +++ b/lib/pages/chat/chat_event_list.dart @@ -0,0 +1,163 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +import 'package:scroll_to_index/scroll_to_index.dart'; + +import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/pages/chat/chat.dart'; +import 'package:fluffychat/pages/chat/events/message.dart'; +import 'package:fluffychat/pages/chat/seen_by_row.dart'; +import 'package:fluffychat/pages/chat/typing_indicators.dart'; +import 'package:fluffychat/utils/account_config.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/filtered_timeline_extension.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; + +class ChatEventList extends StatelessWidget { + final ChatController controller; + + const ChatEventList({ + super.key, + required this.controller, + }); + + @override + Widget build(BuildContext context) { + final timeline = controller.timeline; + + if (timeline == null) { + return const Center(child: CupertinoActivityIndicator()); + } + final theme = Theme.of(context); + + final colors = [ + theme.secondaryBubbleColor, + theme.bubbleColor, + ]; + + final horizontalPadding = FluffyThemes.isColumnMode(context) ? 8.0 : 0.0; + + final events = timeline.events.filterByVisibleInGui(); + final animateInEventIndex = controller.animateInEventIndex; + + // create a map of eventId --> index to greatly improve performance of + // ListView's findChildIndexCallback + final thisEventsKeyMap = {}; + for (var i = 0; i < events.length; i++) { + //print('${events[i].roomId} ${events[i].senderId} ${events[i].body}'); + thisEventsKeyMap[events[i].eventId] = i; + } + + final hasWallpaper = + controller.room.client.applicationAccountConfig.wallpaperUrl != null; + + return SelectionArea( + child: ListView.custom( + padding: EdgeInsets.only( + top: 16, + bottom: 8, + left: horizontalPadding, + right: horizontalPadding, + ), + reverse: true, + controller: controller.scrollController, + keyboardDismissBehavior: PlatformInfos.isIOS + ? ScrollViewKeyboardDismissBehavior.onDrag + : ScrollViewKeyboardDismissBehavior.manual, + childrenDelegate: SliverChildBuilderDelegate( + (BuildContext context, int i) { + // Footer to display typing indicator and read receipts: + if (i == 0) { + if (timeline.isRequestingFuture) { + return const Center( + child: CircularProgressIndicator.adaptive(strokeWidth: 2), + ); + } + if (timeline.canRequestFuture) { + return Center( + child: IconButton( + onPressed: controller.requestFuture, + icon: const Icon(Icons.refresh_outlined), + ), + ); + } + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + SeenByRow(controller), + TypingIndicators(controller), + ], + ); + } + + // Request history button or progress indicator: + if (i == events.length + 1) { + if (timeline.isRequestingHistory) { + return const Center( + child: CircularProgressIndicator.adaptive(strokeWidth: 2), + ); + } + if (timeline.canRequestHistory) { + return Builder( + builder: (context) { + WidgetsBinding.instance + .addPostFrameCallback(controller.requestHistory); + return Center( + child: IconButton( + onPressed: controller.requestHistory, + icon: const Icon(Icons.refresh_outlined), + ), + ); + }, + ); + } + return const SizedBox.shrink(); + } + i--; + + // The message at this index: + final event = events[i]; + final animateIn = animateInEventIndex != null && + timeline.events.length > animateInEventIndex && + event == timeline.events[animateInEventIndex]; + + return AutoScrollTag( + key: ValueKey(event.eventId), + index: i, + controller: controller.scrollController, + child: Message( + event, + animateIn: animateIn, + resetAnimateIn: () { + controller.animateInEventIndex = null; + }, + onSwipe: () => controller.replyAction(replyTo: event), + onInfoTab: controller.showEventInfo, + onMention: () => controller.sendController.text += + '${event.senderFromMemoryOrFallback.mention} ', + highlightMarker: + controller.scrollToEventIdMarker == event.eventId, + onSelect: controller.onSelectMessage, + scrollToEventId: (String eventId) => + controller.scrollToEventId(eventId), + longPressSelect: controller.selectedEvents.isNotEmpty, + selected: controller.selectedEvents + .any((e) => e.eventId == event.eventId), + timeline: timeline, + displayReadMarker: + i > 0 && controller.readMarkerEventId == event.eventId, + nextEvent: i + 1 < events.length ? events[i + 1] : null, + previousEvent: i > 0 ? events[i - 1] : null, + wallpaperMode: hasWallpaper, + scrollController: controller.scrollController, + colors: colors, + ), + ); + }, + childCount: events.length + 2, + findChildIndexCallback: (key) => + controller.findChildIndexCallback(key, thisEventsKeyMap), + ), + ), + ); + } +} diff --git a/lib/pages/chat/chat_input_row.dart b/lib/pages/chat/chat_input_row.dart new file mode 100644 index 0000000..83dca1d --- /dev/null +++ b/lib/pages/chat/chat_input_row.dart @@ -0,0 +1,402 @@ +import 'package:flutter/material.dart'; + +import 'package:animations/animations.dart'; +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/utils/other_party_can_receive.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/widgets/avatar.dart'; +import 'package:fluffychat/widgets/matrix.dart'; +import '../../config/themes.dart'; +import 'chat.dart'; +import 'input_bar.dart'; + +class ChatInputRow extends StatelessWidget { + final ChatController controller; + + const ChatInputRow(this.controller, {super.key}); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + if (controller.showEmojiPicker && + controller.emojiPickerType == EmojiPickerType.reaction) { + return const SizedBox.shrink(); + } + const height = 48.0; + + if (!controller.room.canSendDefaultMessages) { + return Center( + child: Padding( + padding: const EdgeInsets.all(12.0), + child: Text( + L10n.of(context).noSendPermission, + style: theme.textTheme.bodySmall, + textAlign: TextAlign.center, + ), + ), + ); + } + + if (!controller.room.otherPartyCanReceiveMessages) { + return Center( + child: Padding( + padding: const EdgeInsets.all(12.0), + child: Text( + L10n.of(context).otherPartyNotLoggedIn, + style: theme.textTheme.bodySmall, + textAlign: TextAlign.center, + ), + ), + ); + } + + + + return Row( + crossAxisAlignment: CrossAxisAlignment.end, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: controller.selectMode + ? [ + if (controller.selectedEvents + .every((event) => event.status == EventStatus.error)) + SizedBox( + height: height, + child: TextButton( + style: TextButton.styleFrom( + foregroundColor: theme.colorScheme.error, + ), + onPressed: controller.deleteErrorEventsAction, + child: Row( + children: [ + const Icon(Icons.delete), + Text(L10n.of(context).delete), + ], + ), + ), + ) + else + SizedBox( + height: height, + child: TextButton( + onPressed: controller.forwardEventsAction, + child: Row( + children: [ + const Icon(Icons.keyboard_arrow_left_outlined), + Text(L10n.of(context).forward), + ], + ), + ), + ), + controller.selectedEvents.length == 1 + ? controller.selectedEvents.first + .getDisplayEvent(controller.timeline!) + .status + .isSent + ? SizedBox( + height: height, + child: TextButton( + onPressed: controller.replyAction, + child: Row( + children: [ + Text(L10n.of(context).reply), + const Icon(Icons.keyboard_arrow_right), + ], + ), + ), + ) + : SizedBox( + height: height, + child: TextButton( + onPressed: controller.sendAgainAction, + child: Row( + children: [ + Text(L10n.of(context).tryToSendAgain), + const SizedBox(width: 4), + const Icon(Icons.send_outlined, size: 16), + ], + ), + ), + ) + : const SizedBox.shrink(), + ] + : [ + const SizedBox(width: 4), + AnimatedContainer( + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + width: controller.sendController.text.isNotEmpty ? 0 : height, + height: height, + alignment: Alignment.center, + decoration: const BoxDecoration(), + clipBehavior: Clip.hardEdge, + child: PopupMenuButton( + icon: const Icon(Icons.add_circle_outline), + iconColor: theme.colorScheme.onPrimaryContainer, + onSelected: controller.onAddPopupMenuButtonSelected, + itemBuilder: (BuildContext context) => + >[ + if (PlatformInfos.isMobile) + PopupMenuItem( + value: 'location', + child: ListTile( + leading: CircleAvatar( + backgroundColor: + theme.colorScheme.onPrimaryContainer, + foregroundColor: theme.colorScheme.primaryContainer, + child: const Icon(Icons.gps_fixed_outlined), + ), + title: Text(L10n.of(context).shareLocation), + contentPadding: const EdgeInsets.all(0), + ), + ), + PopupMenuItem( + value: 'image', + child: ListTile( + leading: CircleAvatar( + backgroundColor: theme.colorScheme.onPrimaryContainer, + foregroundColor: theme.colorScheme.primaryContainer, + child: const Icon(Icons.photo_outlined), + ), + title: Text(L10n.of(context).sendImage), + contentPadding: const EdgeInsets.all(0), + ), + ), + PopupMenuItem( + value: 'video', + child: ListTile( + leading: CircleAvatar( + backgroundColor: theme.colorScheme.onPrimaryContainer, + foregroundColor: theme.colorScheme.primaryContainer, + child: const Icon(Icons.video_camera_back_outlined), + ), + title: Text(L10n.of(context).sendVideo), + contentPadding: const EdgeInsets.all(0), + ), + ), + PopupMenuItem( + value: 'file', + child: ListTile( + leading: CircleAvatar( + backgroundColor: theme.colorScheme.onPrimaryContainer, + foregroundColor: theme.colorScheme.primaryContainer, + child: const Icon(Icons.attachment_outlined), + ), + title: Text(L10n.of(context).sendFile), + contentPadding: const EdgeInsets.all(0), + ), + ), + ], + ), + ), + if (PlatformInfos.isMobile) + AnimatedContainer( + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + width: controller.sendController.text.isNotEmpty ? 0 : height, + height: height, + alignment: Alignment.center, + decoration: const BoxDecoration(), + clipBehavior: Clip.hardEdge, + child: PopupMenuButton( + icon: const Icon(Icons.camera_alt_outlined), + onSelected: controller.onAddPopupMenuButtonSelected, + iconColor: theme.colorScheme.onPrimaryContainer, + itemBuilder: (context) => [ + PopupMenuItem( + value: 'camera-video', + child: ListTile( + leading: CircleAvatar( + backgroundColor: + theme.colorScheme.onPrimaryContainer, + foregroundColor: theme.colorScheme.primaryContainer, + child: const Icon(Icons.videocam_outlined), + ), + title: Text(L10n.of(context).recordAVideo), + contentPadding: const EdgeInsets.all(0), + ), + ), + PopupMenuItem( + value: 'camera', + child: ListTile( + leading: CircleAvatar( + backgroundColor: + theme.colorScheme.onPrimaryContainer, + foregroundColor: theme.colorScheme.primaryContainer, + child: const Icon(Icons.camera_alt_outlined), + ), + title: Text(L10n.of(context).takeAPhoto), + contentPadding: const EdgeInsets.all(0), + ), + ), + ], + ), + ), + Container( + height: height, + width: height, + alignment: Alignment.center, + child: IconButton( + tooltip: L10n.of(context).emojis, + color: theme.colorScheme.onPrimaryContainer, + icon: PageTransitionSwitcher( + transitionBuilder: ( + Widget child, + Animation primaryAnimation, + Animation secondaryAnimation, + ) { + return SharedAxisTransition( + animation: primaryAnimation, + secondaryAnimation: secondaryAnimation, + transitionType: SharedAxisTransitionType.scaled, + fillColor: Colors.transparent, + child: child, + ); + }, + child: Icon( + controller.showEmojiPicker + ? Icons.keyboard + : Icons.add_reaction_outlined, + key: ValueKey(controller.showEmojiPicker), + ), + ), + onPressed: controller.emojiPickerAction, + ), + ), + if (Matrix.of(context).isMultiAccount && + Matrix.of(context).hasComplexBundles && + Matrix.of(context).currentBundle!.length > 1) + Container( + width: height, + height: height, + alignment: Alignment.center, + child: _ChatAccountPicker(controller), + ), + Expanded( + child: Padding( + padding: const EdgeInsets.symmetric(vertical: 0.0), + child: InputBar( + room: controller.room, + minLines: 1, + maxLines: 8, + autofocus: !PlatformInfos.isMobile, + keyboardType: TextInputType.multiline, + textInputAction: + AppConfig.sendOnEnter == true && PlatformInfos.isMobile + ? TextInputAction.send + : null, + onSubmitted: controller.onInputBarSubmitted, + onSubmitImage: controller.sendImageFromClipBoard, + focusNode: controller.inputFocus, + controller: controller.sendController, + decoration: InputDecoration( + contentPadding: const EdgeInsets.only( + left: 6.0, + right: 6.0, + bottom: 6.0, + top: 3.0, + ), + hintText: L10n.of(context).writeAMessage, + hintMaxLines: 1, + border: InputBorder.none, + enabledBorder: InputBorder.none, + filled: false, + ), + onChanged: controller.onInputBarChanged, + ), + ), + ), + Container( + height: height, + width: height, + alignment: Alignment.center, + child: PlatformInfos.platformCanRecord && + controller.sendController.text.isEmpty + ? FloatingActionButton.small( + tooltip: L10n.of(context).voiceMessage, + onPressed: controller.voiceMessageAction, + elevation: 0, + heroTag: null, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(height), + ), + backgroundColor: theme.bubbleColor, + foregroundColor: theme.onBubbleColor, + child: const Icon(Icons.mic_none_outlined), + ) + : FloatingActionButton.small( + tooltip: L10n.of(context).send, + onPressed: controller.send, + elevation: 0, + heroTag: null, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(height), + ), + backgroundColor: theme.bubbleColor, + foregroundColor: theme.onBubbleColor, + child: const Icon(Icons.send_outlined), + ), + ), + ], + ); + } +} + +class _ChatAccountPicker extends StatelessWidget { + final ChatController controller; + + const _ChatAccountPicker(this.controller); + + void _popupMenuButtonSelected(String mxid, BuildContext context) { + final client = Matrix.of(context) + .currentBundle! + .firstWhere((cl) => cl!.userID == mxid, orElse: () => null); + if (client == null) { + Logs().w('Attempted to switch to a non-existing client $mxid'); + return; + } + controller.setSendingClient(client); + } + + @override + Widget build(BuildContext context) { + final clients = controller.currentRoomBundle; + return Padding( + padding: const EdgeInsets.all(8.0), + child: FutureBuilder( + future: controller.sendingClient.fetchOwnProfile(), + builder: (context, snapshot) => PopupMenuButton( + onSelected: (mxid) => _popupMenuButtonSelected(mxid, context), + itemBuilder: (BuildContext context) => clients + .map( + (client) => PopupMenuItem( + value: client!.userID, + child: FutureBuilder( + future: client.fetchOwnProfile(), + builder: (context, snapshot) => ListTile( + leading: Avatar( + mxContent: snapshot.data?.avatarUrl, + name: snapshot.data?.displayName ?? + client.userID!.localpart, + size: 20, + ), + title: Text(snapshot.data?.displayName ?? client.userID!), + contentPadding: const EdgeInsets.all(0), + ), + ), + ), + ) + .toList(), + child: Avatar( + mxContent: snapshot.data?.avatarUrl, + name: snapshot.data?.displayName ?? + Matrix.of(context).client.userID!.localpart, + size: 20, + ), + ), + ), + ); + } +} diff --git a/lib/pages/chat/chat_view.dart b/lib/pages/chat/chat_view.dart new file mode 100644 index 0000000..564597e --- /dev/null +++ b/lib/pages/chat/chat_view.dart @@ -0,0 +1,405 @@ +import 'dart:ui' as ui; + +import 'package:flutter/material.dart'; + +import 'package:badges/badges.dart'; +import 'package:desktop_drop/desktop_drop.dart'; +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/pages/chat/chat.dart'; +import 'package:fluffychat/pages/chat/chat_app_bar_list_tile.dart'; +import 'package:fluffychat/pages/chat/chat_app_bar_title.dart'; +import 'package:fluffychat/pages/chat/chat_event_list.dart'; +import 'package:fluffychat/pages/chat/encryption_button.dart'; +import 'package:fluffychat/pages/chat/pinned_events.dart'; +import 'package:fluffychat/pages/chat/reactions_picker.dart'; +import 'package:fluffychat/pages/chat/reply_display.dart'; +import 'package:fluffychat/utils/account_config.dart'; +import 'package:fluffychat/utils/localized_exception_extension.dart'; +import 'package:fluffychat/widgets/chat_settings_popup_menu.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import 'package:fluffychat/widgets/matrix.dart'; +import 'package:fluffychat/widgets/mxc_image.dart'; +import 'package:fluffychat/widgets/unread_rooms_badge.dart'; +import '../../utils/stream_extension.dart'; +import 'chat_emoji_picker.dart'; +import 'chat_input_row.dart'; + +enum _EventContextAction { info, recover, translate, report } + +class ChatView extends StatelessWidget { + final ChatController controller; + + const ChatView(this.controller, {super.key}); + + List _appBarActions(BuildContext context) { + if (controller.selectMode) { + return [ + if (controller.canEditSelectedEvents) + IconButton( + icon: const Icon(Icons.edit_outlined), + tooltip: L10n.of(context).edit, + onPressed: controller.editSelectedEventAction, + ), + IconButton( + icon: const Icon(Icons.copy_outlined), + tooltip: L10n.of(context).copy, + onPressed: controller.copyEventsAction, + ), + if (controller.selectedEvents.length == 1 && controller.selectedEvents.single.content['xyz.extera.translated'] == null) + IconButton( + icon: const Icon(Icons.translate_outlined), + tooltip: L10n.of(context).translateMessage, + onPressed: controller.translateEventAction, + ), + if (controller.canSaveSelectedEvent) + // Use builder context to correctly position the share dialog on iPad + Builder( + builder: (context) => IconButton( + icon: Icon(Icons.adaptive.share), + tooltip: L10n.of(context).share, + onPressed: () => controller.saveSelectedEvent(context), + ), + ), + if (controller.canPinSelectedEvents) + IconButton( + icon: const Icon(Icons.push_pin_outlined), + onPressed: controller.pinEvent, + tooltip: L10n.of(context).pinMessage, + ), + if (controller.canRedactSelectedEvents) + IconButton( + icon: const Icon(Icons.delete_outlined), + tooltip: L10n.of(context).redactMessage, + onPressed: controller.redactEventsAction, + ), + if (controller.selectedEvents.length == 1) + PopupMenuButton<_EventContextAction>( + onSelected: (action) { + switch (action) { + case _EventContextAction.info: + controller.showEventInfo(); + controller.clearSelectedEvents(); + break; + case _EventContextAction.report: + controller.reportEventAction(); + break; + case _EventContextAction.recover: + controller.recoverEventAction(); + break; + case _EventContextAction.translate: + controller.translateEventAction(); + break; + } + }, + itemBuilder: (context) => [ + PopupMenuItem( + value: _EventContextAction.info, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + const Icon(Icons.info_outlined), + const SizedBox(width: 12), + Text(L10n.of(context).messageInfo), + ], + ), + ), + if (controller.selectedEvents.single.redacted) + PopupMenuItem( + value: _EventContextAction.recover, + child: Row(mainAxisSize: MainAxisSize.min, children: [ + const Icon(Icons.redo), + const SizedBox(width: 12), + Text(L10n.of(context).recoverMessage), + ]), + ), + if (controller.selectedEvents.single.status.isSent) + PopupMenuItem( + value: _EventContextAction.report, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + const Icon( + Icons.shield_outlined, + color: Colors.red, + ), + const SizedBox(width: 12), + Text(L10n.of(context).reportMessage), + ], + ), + ), + ], + ), + ]; + } else if (!controller.room.isArchived) { + return [ + if (AppConfig.experimentalVoip && + Matrix.of(context).voipPlugin != null && + controller.room.isDirectChat) + IconButton( + onPressed: controller.onPhoneButtonTap, + icon: const Icon(Icons.call_outlined), + tooltip: L10n.of(context).placeCall, + ), + EncryptionButton(controller.room), + ChatSettingsPopupMenu(controller.room, true), + ]; + } + return []; + } + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + if (controller.room.membership == Membership.invite) { + showFutureLoadingDialog( + context: context, + future: () => controller.room.join(), + exceptionContext: ExceptionContext.joinRoom, + ); + } + final bottomSheetPadding = FluffyThemes.isColumnMode(context) ? 16.0 : 8.0; + final scrollUpBannerEventId = controller.scrollUpBannerEventId; + + final accountConfig = Matrix.of(context).client.applicationAccountConfig; + + return PopScope( + canPop: controller.selectedEvents.isEmpty && !controller.showEmojiPicker, + onPopInvokedWithResult: (pop, _) async { + if (pop) return; + if (controller.selectedEvents.isNotEmpty) { + controller.clearSelectedEvents(); + } else if (controller.showEmojiPicker) { + controller.emojiPickerAction(); + } + }, + child: StreamBuilder( + stream: controller.room.client.onRoomState.stream + .where((update) => update.roomId == controller.room.id) + .rateLimit(const Duration(seconds: 1)), + builder: (context, snapshot) => FutureBuilder( + future: controller.loadTimelineFuture, + builder: (BuildContext context, snapshot) { + var appbarBottomHeight = 0.0; + if (controller.room.pinnedEventIds.isNotEmpty) { + appbarBottomHeight += ChatAppBarListTile.fixedHeight; + } + if (scrollUpBannerEventId != null) { + appbarBottomHeight += ChatAppBarListTile.fixedHeight; + } + return Scaffold( + appBar: AppBar( + actionsIconTheme: IconThemeData( + color: controller.selectedEvents.isEmpty + ? null + : theme.colorScheme.tertiary, + ), + automaticallyImplyLeading: false, + leading: controller.selectMode + ? IconButton( + icon: const Icon(Icons.close), + onPressed: controller.clearSelectedEvents, + tooltip: L10n.of(context).close, + color: theme.colorScheme.tertiary, + ) + : FluffyThemes.isColumnMode(context) + ? null + : StreamBuilder( + stream: + Matrix.of(context).client.onSync.stream.where( + (syncUpdate) => syncUpdate.hasRoomUpdate, + ), + builder: (context, _) => UnreadRoomsBadge( + filter: (r) => r.id != controller.roomId, + badgePosition: + BadgePosition.topEnd(end: 8, top: 4), + child: const Center(child: BackButton()), + ), + ), + titleSpacing: FluffyThemes.isColumnMode(context) ? 24 : 0, + title: ChatAppBarTitle(controller), + actions: _appBarActions(context), + bottom: PreferredSize( + preferredSize: Size.fromHeight(appbarBottomHeight), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + PinnedEvents(controller), + if (scrollUpBannerEventId != null) + ChatAppBarListTile( + leading: IconButton( + color: theme.colorScheme.onSurfaceVariant, + icon: const Icon(Icons.close), + tooltip: L10n.of(context).close, + onPressed: () { + controller.discardScrollUpBannerEventId(); + controller.setReadMarker(); + }, + ), + title: L10n.of(context).jumpToLastReadMessage, + trailing: TextButton( + onPressed: () { + controller.scrollToEventId( + scrollUpBannerEventId, + ); + controller.discardScrollUpBannerEventId(); + }, + child: Text(L10n.of(context).jump), + ), + ), + ], + ), + ), + ), + floatingActionButtonLocation: + FloatingActionButtonLocation.miniCenterFloat, + floatingActionButton: controller.showScrollDownButton && + controller.selectedEvents.isEmpty + ? Padding( + padding: const EdgeInsets.only(bottom: 56.0), + child: FloatingActionButton( + onPressed: controller.scrollDown, + heroTag: null, + mini: true, + backgroundColor: theme.colorScheme.surface, + foregroundColor: theme.colorScheme.onSurface, + child: const Icon(Icons.arrow_downward_outlined), + ), + ) + : null, + body: DropTarget( + onDragDone: controller.onDragDone, + onDragEntered: controller.onDragEntered, + onDragExited: controller.onDragExited, + child: Stack( + children: [ + if (accountConfig.wallpaperUrl != null) + Opacity( + opacity: accountConfig.wallpaperOpacity ?? 0.5, + child: ImageFiltered( + imageFilter: ui.ImageFilter.blur( + sigmaX: accountConfig.wallpaperBlur ?? 0.0, + sigmaY: accountConfig.wallpaperBlur ?? 0.0, + ), + child: MxcImage( + cacheKey: accountConfig.wallpaperUrl.toString(), + uri: accountConfig.wallpaperUrl, + fit: BoxFit.cover, + height: MediaQuery.of(context).size.height, + width: MediaQuery.of(context).size.width, + isThumbnail: false, + placeholder: (_) => Container(), + ), + ), + ), + SafeArea( + child: Column( + children: [ + Expanded( + child: GestureDetector( + onTap: controller.clearSingleSelectedEvent, + child: ChatEventList(controller: controller), + ), + ), + if (controller.showScrollDownButton) + Divider( + height: 1, + color: theme.dividerColor, + ), + if (controller.room.isExtinct) + Container( + margin: EdgeInsets.all(bottomSheetPadding), + width: double.infinity, + child: ElevatedButton.icon( + icon: const Icon(Icons.chevron_right), + label: Text(L10n.of(context).enterNewChat), + onPressed: controller.goToNewRoomAction, + ), + ) + else if (controller.room.canSendDefaultMessages && + controller.room.membership == Membership.join) + Container( + margin: EdgeInsets.all(bottomSheetPadding), + constraints: const BoxConstraints( + maxWidth: FluffyThemes.columnWidth * 2.5, + ), + alignment: Alignment.center, + child: Material( + clipBehavior: Clip.hardEdge, + color: theme.colorScheme.surfaceContainerHigh, + borderRadius: const BorderRadius.all( + Radius.circular(24), + ), + child: controller.room.isAbandonedDMRoom == true + ? Row( + mainAxisAlignment: + MainAxisAlignment.spaceEvenly, + children: [ + TextButton.icon( + style: TextButton.styleFrom( + padding: const EdgeInsets.all( + 16, + ), + foregroundColor: + theme.colorScheme.error, + ), + icon: const Icon( + Icons.archive_outlined, + ), + onPressed: controller.leaveChat, + label: Text( + L10n.of(context).leave, + ), + ), + TextButton.icon( + style: TextButton.styleFrom( + padding: const EdgeInsets.all( + 16, + ), + ), + icon: const Icon( + Icons.forum_outlined, + ), + onPressed: controller.recreateChat, + label: Text( + L10n.of(context).reopenChat, + ), + ), + ], + ) + : Column( + mainAxisSize: MainAxisSize.min, + children: [ + ReactionsPicker(controller), + ReplyDisplay(controller), + ChatInputRow(controller), + ChatEmojiPicker(controller), + ], + ), + ), + ), + ], + ), + ), + if (controller.dragging) + Container( + color: theme.scaffoldBackgroundColor.withAlpha(230), + alignment: Alignment.center, + child: const Icon( + Icons.upload_outlined, + size: 100, + ), + ), + ], + ), + ), + ); + }, + ), + ), + ); + } +} diff --git a/lib/pages/chat/command_hints.dart b/lib/pages/chat/command_hints.dart new file mode 100644 index 0000000..f047810 --- /dev/null +++ b/lib/pages/chat/command_hints.dart @@ -0,0 +1,86 @@ +// This file is auto-generated using scripts/generate_command_hints_glue.sh. + +import 'package:fluffychat/generated/l10n/l10n.dart'; + +String commandExample(String command) { + switch (command) { + case 'markasdm': + case 'kick': + case 'dm': + case 'ban': + case 'unban': + case 'ignore': + case 'unignore': + case 'invite': + return '/$command '; + case 'html': + case 'sendraw': + case 'plain': + return '/$command '; + case 'op': + return '/$command '; + default: + return '/$command'; + } +} + +String commandHint(L10n l10n, String command) { + switch (command) { + case "ban": + return l10n.commandHint_ban; + case "clearcache": + return l10n.commandHint_clearcache; + case "create": + return l10n.commandHint_create; + case "discardsession": + return l10n.commandHint_discardsession; + case "dm": + return l10n.commandHint_dm; + case "html": + return l10n.commandHint_html; + case "invite": + return l10n.commandHint_invite; + case "join": + return l10n.commandHint_join; + case "kick": + return l10n.commandHint_kick; + case "leave": + return l10n.commandHint_leave; + case "me": + return l10n.commandHint_me; + case "myroomavatar": + return l10n.commandHint_myroomavatar; + case "myroomnick": + return l10n.commandHint_myroomnick; + case "op": + return l10n.commandHint_op; + case "plain": + return l10n.commandHint_plain; + case "react": + return l10n.commandHint_react; + case "send": + return l10n.commandHint_send; + case "unban": + return l10n.commandHint_unban; + case 'markasdm': + return l10n.commandHint_markasdm; + case 'markasgroup': + return l10n.commandHint_markasgroup; + case 'googly': + return l10n.commandHint_googly; + case 'hug': + return l10n.commandHint_hug; + case 'cuddle': + return l10n.commandHint_cuddle; + case 'sendraw': + return l10n.commandHint_sendraw; + case 'ignore': + return l10n.commandHint_ignore; + case 'unignore': + return l10n.commandHint_unignore; + case 'roomupgrade': + return l10n.commandHint_roomupgrade; + default: + return ""; + } +} diff --git a/lib/pages/chat/encryption_button.dart b/lib/pages/chat/encryption_button.dart new file mode 100644 index 0000000..c2c0b91 --- /dev/null +++ b/lib/pages/chat/encryption_button.dart @@ -0,0 +1,47 @@ +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart'; + +import '../../widgets/matrix.dart'; + +class EncryptionButton extends StatelessWidget { + final Room room; + const EncryptionButton(this.room, {super.key}); + + @override + Widget build(BuildContext context) { + return StreamBuilder( + stream: Matrix.of(context) + .client + .onSync + .stream + .where((s) => s.deviceLists != null), + builder: (context, snapshot) { + return FutureBuilder( + future: room.encrypted + ? room.calcEncryptionHealthState() + : Future.value(EncryptionHealthState.allVerified), + builder: (BuildContext context, snapshot) => IconButton( + tooltip: room.encrypted + ? L10n.of(context).encrypted + : L10n.of(context).encryptionNotEnabled, + icon: Icon( + room.encrypted ? Icons.lock_outlined : Icons.lock_open_outlined, + size: 20, + color: room.joinRules != JoinRules.public && !room.encrypted + ? Colors.red + : room.joinRules != JoinRules.public && + snapshot.data == + EncryptionHealthState.unverifiedDevices + ? Colors.orange + : null, + ), + onPressed: () => context.go('/rooms/${room.id}/encryption'), + ), + ); + }, + ); + } +} diff --git a/lib/pages/chat/event_info_dialog.dart b/lib/pages/chat/event_info_dialog.dart new file mode 100644 index 0000000..a972221 --- /dev/null +++ b/lib/pages/chat/event_info_dialog.dart @@ -0,0 +1,113 @@ +import 'dart:convert'; + +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/utils/adaptive_bottom_sheet.dart'; +import 'package:fluffychat/utils/date_time_extension.dart'; +import 'package:fluffychat/widgets/avatar.dart'; + +extension EventInfoDialogExtension on Event { + void showInfoDialog(BuildContext context) => showAdaptiveBottomSheet( + context: context, + builder: (context) => + EventInfoDialog(l10n: L10n.of(context), event: this), + ); +} + +class EventInfoDialog extends StatelessWidget { + final Event event; + final L10n l10n; + + const EventInfoDialog({ + required this.event, + required this.l10n, + super.key, + }); + + String prettyJson(MatrixEvent event) { + const decoder = JsonDecoder(); + const encoder = JsonEncoder.withIndent(' '); + final object = decoder.convert(jsonEncode(event.toJson())); + return encoder.convert(object); + } + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + final originalSource = event.originalSource; + return Scaffold( + appBar: AppBar( + title: Text(L10n.of(context).messageInfo), + leading: CloseButton( + onPressed: Navigator.of(context, rootNavigator: false).pop, + ), + ), + body: ListView( + children: [ + ListTile( + leading: Avatar( + mxContent: event.senderFromMemoryOrFallback.avatarUrl, + name: event.senderFromMemoryOrFallback.calcDisplayname(), + client: event.room.client, + presenceUserId: event.senderId, + ), + title: Text(L10n.of(context).sender), + subtitle: Text( + '${event.senderFromMemoryOrFallback.calcDisplayname()} [${event.senderId}]', + ), + ), + ListTile( + title: Text('${L10n.of(context).time}:'), + subtitle: Text(event.originServerTs.localizedTime(context)), + ), + ListTile( + title: Text('${L10n.of(context).status}:'), + subtitle: Text(event.status.name), + ), + ListTile(title: Text('${L10n.of(context).sourceCode}:')), + Padding( + padding: const EdgeInsets.all(12.0), + child: Material( + borderRadius: BorderRadius.circular(AppConfig.borderRadius), + color: theme.colorScheme.surfaceContainer, + child: SingleChildScrollView( + padding: const EdgeInsets.all(16), + scrollDirection: Axis.horizontal, + child: SelectableText( + prettyJson(MatrixEvent.fromJson(event.toJson())), + style: TextStyle( + color: theme.colorScheme.onSurface, + ), + ), + ), + ), + ), + if (originalSource != null) ...[ + ListTile(title: Text('${L10n.of(context).encrypted}:')), + Padding( + padding: const EdgeInsets.all(12.0), + child: Material( + borderRadius: BorderRadius.circular(AppConfig.borderRadius), + color: theme.colorScheme.surfaceContainer, + child: SingleChildScrollView( + padding: const EdgeInsets.all(16), + scrollDirection: Axis.horizontal, + child: SelectableText( + prettyJson(originalSource), + style: TextStyle( + color: theme.colorScheme.onSurface, + ), + ), + ), + ), + ), + ], + ], + ), + ); + } +} diff --git a/lib/pages/chat/events/audio_player.dart b/lib/pages/chat/events/audio_player.dart new file mode 100644 index 0000000..83a1e6e --- /dev/null +++ b/lib/pages/chat/events/audio_player.dart @@ -0,0 +1,473 @@ +import 'dart:async'; +import 'dart:io'; + +import 'package:fluffychat/pages/chat/events/html_message.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; + +import 'package:flutter_linkify/flutter_linkify.dart'; +import 'package:just_audio/just_audio.dart'; +import 'package:matrix/matrix.dart'; +import 'package:opus_caf_converter_dart/opus_caf_converter_dart.dart'; +import 'package:path_provider/path_provider.dart'; + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/utils/error_reporter.dart'; +import 'package:fluffychat/utils/file_description.dart'; +import 'package:fluffychat/utils/localized_exception_extension.dart'; +import 'package:fluffychat/utils/url_launcher.dart'; +import '../../../utils/matrix_sdk_extensions/event_extension.dart'; + +class AudioPlayerWidget extends StatefulWidget { + final Color color; + final Color linkColor; + final double fontSize; + final Event event; + + static String? currentId; + + static const int wavesCount = 40; + + const AudioPlayerWidget( + this.event, { + required this.color, + required this.linkColor, + required this.fontSize, + super.key, + }); + + @override + AudioPlayerState createState() => AudioPlayerState(); +} + +enum AudioPlayerStatus { notDownloaded, downloading, downloaded } + +class AudioPlayerState extends State { + AudioPlayerStatus status = AudioPlayerStatus.notDownloaded; + AudioPlayer? audioPlayer; + + StreamSubscription? onAudioPositionChanged; + StreamSubscription? onDurationChanged; + StreamSubscription? onPlayerStateChanged; + StreamSubscription? onPlayerError; + + String? statusText; + double currentPosition = 0; + double maxPosition = 1; + + MatrixFile? matrixFile; + File? audioFile; + + @override + void dispose() { + if (audioPlayer?.playerState.playing == true) { + audioPlayer?.stop(); + } + onAudioPositionChanged?.cancel(); + onDurationChanged?.cancel(); + onPlayerStateChanged?.cancel(); + onPlayerError?.cancel(); + + super.dispose(); + } + + void _startAction() { + if (status == AudioPlayerStatus.downloaded) { + _playAction(); + } else { + _downloadAction(); + } + } + + Future _downloadAction() async { + if (status != AudioPlayerStatus.notDownloaded) return; + setState(() => status = AudioPlayerStatus.downloading); + try { + final matrixFile = await widget.event.downloadAndDecryptAttachment(); + File? file; + + if (!kIsWeb) { + final tempDir = await getTemporaryDirectory(); + final fileName = Uri.encodeComponent( + widget.event.attachmentOrThumbnailMxcUrl()!.pathSegments.last, + ); + file = File('${tempDir.path}/${fileName}_${matrixFile.name}'); + + await file.writeAsBytes(matrixFile.bytes); + + if (Platform.isIOS && + matrixFile.mimeType.toLowerCase() == 'audio/ogg') { + Logs().v('Convert ogg audio file for iOS...'); + final convertedFile = File('${file.path}.caf'); + if (await convertedFile.exists() == false) { + OpusCaf().convertOpusToCaf(file.path, convertedFile.path); + } + file = convertedFile; + } + } + + setState(() { + audioFile = file; + this.matrixFile = matrixFile; + status = AudioPlayerStatus.downloaded; + }); + _playAction(); + } catch (e, s) { + Logs().v('Could not download audio file', e, s); + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text(e.toLocalizedString(context)), + ), + ); + } + } + + void _playAction() async { + final audioPlayer = this.audioPlayer ??= AudioPlayer(); + if (AudioPlayerWidget.currentId != widget.event.eventId) { + if (AudioPlayerWidget.currentId != null) { + if (audioPlayer.playerState.playing) { + await audioPlayer.stop(); + setState(() {}); + } + } + AudioPlayerWidget.currentId = widget.event.eventId; + } + if (audioPlayer.playerState.playing) { + await audioPlayer.pause(); + return; + } else if (audioPlayer.position != Duration.zero) { + await audioPlayer.play(); + return; + } + + onAudioPositionChanged ??= audioPlayer.positionStream.listen((state) { + if (maxPosition <= 0) return; + setState(() { + statusText = + '${state.inMinutes.toString().padLeft(2, '0')}:${(state.inSeconds % 60).toString().padLeft(2, '0')}'; + currentPosition = state.inMilliseconds.toDouble(); + }); + if (state.inMilliseconds.toDouble() == maxPosition) { + audioPlayer.stop(); + audioPlayer.seek(null); + } + }); + onDurationChanged ??= audioPlayer.durationStream.listen((max) { + if (max == null || max == Duration.zero) return; + setState(() => maxPosition = max.inMilliseconds.toDouble()); + }); + onPlayerStateChanged ??= + audioPlayer.playingStream.listen((_) => setState(() {})); + final audioFile = this.audioFile; + if (audioFile != null) { + audioPlayer.setFilePath(audioFile.path); + } else { + await audioPlayer.setAudioSource(MatrixFileAudioSource(matrixFile!)); + } + audioPlayer.play().onError( + ErrorReporter(context, 'Unable to play audio message') + .onErrorCallback, + ); + } + + static const double buttonSize = 36; + + String? get _durationString { + final durationInt = widget.event.content + .tryGetMap('info') + ?.tryGet('duration'); + if (durationInt == null) return null; + final duration = Duration(milliseconds: durationInt); + return '${duration.inMinutes.toString().padLeft(2, '0')}:${(duration.inSeconds % 60).toString().padLeft(2, '0')}'; + } + + List? _getWaveform() { + final eventWaveForm = widget.event.content + .tryGetMap('org.matrix.msc1767.audio') + ?.tryGetList('waveform'); + if (eventWaveForm == null || eventWaveForm.isEmpty) { + return null; + } + while (eventWaveForm.length < AudioPlayerWidget.wavesCount) { + for (var i = 0; i < eventWaveForm.length; i = i + 2) { + eventWaveForm.insert(i, eventWaveForm[i]); + } + } + var i = 0; + final step = (eventWaveForm.length / AudioPlayerWidget.wavesCount).round(); + while (eventWaveForm.length > AudioPlayerWidget.wavesCount) { + eventWaveForm.removeAt(i); + i = (i + step) % AudioPlayerWidget.wavesCount; + } + return eventWaveForm.map((i) => i > 1024 ? 1024 : i).toList(); + } + + late final List? _waveform; + + void _toggleSpeed() async { + final audioPlayer = this.audioPlayer; + if (audioPlayer == null) return; + switch (audioPlayer.speed) { + case 1.0: + await audioPlayer.setSpeed(1.25); + break; + case 1.25: + await audioPlayer.setSpeed(1.5); + break; + case 1.5: + await audioPlayer.setSpeed(2.0); + break; + case 2.0: + await audioPlayer.setSpeed(0.5); + break; + case 0.5: + default: + await audioPlayer.setSpeed(1.0); + break; + } + setState(() {}); + } + + @override + void initState() { + super.initState(); + _waveform = _getWaveform(); + } + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + final waveform = _waveform; + + final statusText = this.statusText ??= _durationString ?? '00:00'; + final audioPlayer = this.audioPlayer; + + final textColor = widget.color; + final linkColor = widget.linkColor; + + final fileDescription = widget.event.fileDescription; + + final wavePosition = + (currentPosition / maxPosition) * AudioPlayerWidget.wavesCount; + + return Padding( + padding: const EdgeInsets.all(12.0), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ConstrainedBox( + constraints: + const BoxConstraints(maxWidth: FluffyThemes.columnWidth), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + SizedBox( + width: buttonSize, + height: buttonSize, + child: status == AudioPlayerStatus.downloading + ? CircularProgressIndicator( + strokeWidth: 2, + color: widget.color, + ) + : InkWell( + borderRadius: BorderRadius.circular(64), + onLongPress: () => widget.event.saveFile(context), + onTap: _startAction, + child: Material( + color: widget.color.withAlpha(64), + borderRadius: BorderRadius.circular(64), + child: Icon( + audioPlayer?.playerState.playing == true + ? Icons.pause_outlined + : Icons.play_arrow_outlined, + color: widget.color, + ), + ), + ), + ), + const SizedBox(width: 8), + Expanded( + child: Stack( + children: [ + if (waveform != null) + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16.0), + child: Row( + children: [ + for (var i = 0; + i < AudioPlayerWidget.wavesCount; + i++) + Expanded( + child: Container( + height: 32, + alignment: Alignment.center, + child: Container( + margin: const EdgeInsets.symmetric( + horizontal: 1, + ), + decoration: BoxDecoration( + color: i < wavePosition + ? widget.color + : widget.color.withAlpha(128), + borderRadius: BorderRadius.circular(64), + ), + height: 32 * (waveform[i] / 1024), + ), + ), + ), + ], + ), + ), + SizedBox( + height: 32, + child: Slider( + thumbColor: widget.event.senderId == + widget.event.room.client.userID + ? theme.colorScheme.onPrimary + : theme.colorScheme.primary, + activeColor: waveform == null + ? widget.color + : Colors.transparent, + inactiveColor: waveform == null + ? widget.color.withAlpha(128) + : Colors.transparent, + max: maxPosition, + value: currentPosition, + onChanged: (position) => audioPlayer == null + ? _startAction() + : audioPlayer.seek( + Duration(milliseconds: position.round()), + ), + ), + ), + ], + ), + ), + const SizedBox(width: 8), + SizedBox( + width: 36, + child: Text( + statusText, + style: TextStyle( + color: widget.color, + fontSize: 12, + ), + ), + ), + const SizedBox(width: 8), + AnimatedCrossFade( + firstChild: Padding( + padding: const EdgeInsets.only(right: 8.0), + child: Icon( + Icons.mic_none_outlined, + color: widget.color, + ), + ), + secondChild: Material( + color: widget.color.withAlpha(64), + borderRadius: BorderRadius.circular(AppConfig.borderRadius), + child: InkWell( + borderRadius: + BorderRadius.circular(AppConfig.borderRadius), + onTap: _toggleSpeed, + child: SizedBox( + width: 32, + height: 20, + child: Center( + child: Text( + '${audioPlayer?.speed.toString()}x', + style: TextStyle( + color: widget.color, + fontSize: 9, + ), + ), + ), + ), + ), + ), + alignment: Alignment.center, + crossFadeState: audioPlayer == null + ? CrossFadeState.showFirst + : CrossFadeState.showSecond, + duration: FluffyThemes.animationDuration, + ), + ], + ), + ), + if (fileDescription != null && !widget.event.isRichFileDescription) ...[ + const SizedBox(height: 8), + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 8, + ), + child: Linkify( + text: fileDescription, + textScaleFactor: MediaQuery.textScalerOf(context).scale(1), + style: TextStyle( + color: widget.color, + fontSize: widget.fontSize, + ), + options: const LinkifyOptions(humanize: false), + linkStyle: TextStyle( + color: widget.linkColor, + fontSize: widget.fontSize, + decoration: TextDecoration.underline, + decorationColor: widget.linkColor, + ), + onOpen: (url) => UrlLauncher(context, url.url).launchUrl(), + ), + ), + ], + if (fileDescription != null && widget.event.isRichFileDescription) ...[ + const SizedBox(height: 8), + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 8, + ), + child: HtmlMessage( + html: fileDescription, + textColor: textColor, + room: widget.event.room, + fontSize: + AppConfig.fontSizeFactor * AppConfig.messageFontSize, + linkStyle: TextStyle( + color: linkColor, + fontSize: + AppConfig.fontSizeFactor * AppConfig.messageFontSize, + decoration: TextDecoration.underline, + decorationColor: linkColor, + ), + onOpen: (url) => UrlLauncher(context, url.url).launchUrl(), + ), + ), + ], + ], + ), + ); + } +} + +/// To use a MatrixFile as an AudioSource for the just_audio package +class MatrixFileAudioSource extends StreamAudioSource { + final MatrixFile file; + + MatrixFileAudioSource(this.file); + + @override + Future request([int? start, int? end]) async { + start ??= 0; + end ??= file.bytes.length; + return StreamAudioResponse( + sourceLength: file.bytes.length, + contentLength: end - start, + offset: start, + stream: Stream.value(file.bytes.sublist(start, end)), + contentType: file.mimeType, + ); + } +} diff --git a/lib/pages/chat/events/cute_events.dart b/lib/pages/chat/events/cute_events.dart new file mode 100644 index 0000000..3ba43a8 --- /dev/null +++ b/lib/pages/chat/events/cute_events.dart @@ -0,0 +1,194 @@ +import 'dart:math'; + +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/config/app_config.dart'; + +class CuteContent extends StatefulWidget { + final Event event; + + const CuteContent(this.event, {super.key}); + + @override + State createState() => _CuteContentState(); +} + +class _CuteContentState extends State { + static bool _isOverlayShown = false; + + @override + void initState() { + if (AppConfig.autoplayImages && !_isOverlayShown) { + addOverlay(); + } + super.initState(); + } + + @override + Widget build(BuildContext context) { + return FutureBuilder( + future: widget.event.fetchSenderUser(), + builder: (context, snapshot) { + final label = generateLabel(snapshot.data); + + return GestureDetector( + onTap: addOverlay, + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + widget.event.text, + style: const TextStyle(fontSize: 150), + ), + if (label != null) Text(label), + ], + ), + ); + }, + ); + } + + Future addOverlay() async { + _isOverlayShown = true; + await Future.delayed(const Duration(milliseconds: 50)); + + OverlayEntry? overlay; + overlay = OverlayEntry( + builder: (context) => CuteEventOverlay( + emoji: widget.event.text, + onAnimationEnd: () { + _isOverlayShown = false; + overlay?.remove(); + }, + ), + ); + Overlay.of(context).insert(overlay); + } + + generateLabel(User? user) { + switch (widget.event.content['cute_type']) { + case 'googly_eyes': + return L10n.of(context).googlyEyesContent( + user?.displayName ?? + widget.event.senderFromMemoryOrFallback.displayName ?? + '', + ); + case 'cuddle': + return L10n.of(context).cuddleContent( + user?.displayName ?? + widget.event.senderFromMemoryOrFallback.displayName ?? + '', + ); + case 'hug': + return L10n.of(context).hugContent( + user?.displayName ?? + widget.event.senderFromMemoryOrFallback.displayName ?? + '', + ); + } + } +} + +class CuteEventOverlay extends StatefulWidget { + final String emoji; + final VoidCallback onAnimationEnd; + + const CuteEventOverlay({ + super.key, + required this.emoji, + required this.onAnimationEnd, + }); + + @override + State createState() => _CuteEventOverlayState(); +} + +class _CuteEventOverlayState extends State + with TickerProviderStateMixin { + final List items = List.generate( + 50, + (index) => Size( + Random().nextDouble(), + 4 + (Random().nextDouble() * 4), + ), + ); + + AnimationController? controller; + + @override + void initState() { + controller = AnimationController( + duration: const Duration(milliseconds: 2500), + vsync: this, + ); + controller?.forward(); + controller?.addStatusListener(_hideOverlay); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return AnimatedBuilder( + animation: controller!, + builder: (context, _) => LayoutBuilder( + builder: (context, constraints) { + final width = constraints.maxWidth - _CuteOverlayContent.size; + final height = constraints.maxHeight + _CuteOverlayContent.size; + return SizedBox( + height: constraints.maxHeight, + width: constraints.maxWidth, + child: OverflowBox( + child: Stack( + alignment: Alignment.bottomLeft, + fit: StackFit.expand, + children: items + .map( + (position) => Positioned( + left: position.width * width, + bottom: (height * + .25 * + position.height * + (controller?.value ?? 0)) - + _CuteOverlayContent.size, + child: _CuteOverlayContent( + emoji: widget.emoji, + ), + ), + ) + .toList(), + ), + ), + ); + }, + ), + ); + } + + void _hideOverlay(AnimationStatus status) { + if (status == AnimationStatus.completed) { + widget.onAnimationEnd.call(); + } + } +} + +class _CuteOverlayContent extends StatelessWidget { + static const double size = 64.0; + final String emoji; + + const _CuteOverlayContent({required this.emoji}); + + @override + Widget build(BuildContext context) { + return SizedBox.square( + dimension: size, + child: Text( + emoji, + style: const TextStyle(fontSize: 48), + ), + ); + } +} diff --git a/lib/pages/chat/events/html_message.dart b/lib/pages/chat/events/html_message.dart new file mode 100644 index 0000000..7aca315 --- /dev/null +++ b/lib/pages/chat/events/html_message.dart @@ -0,0 +1,518 @@ +import 'package:flutter/material.dart'; + +import 'package:collection/collection.dart'; +import 'package:flutter_highlighter/flutter_highlighter.dart'; +import 'package:flutter_highlighter/themes/shades-of-purple.dart'; +import 'package:flutter_linkify/flutter_linkify.dart'; +import 'package:html/dom.dart' as dom; +import 'package:html/parser.dart' as parser; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/widgets/avatar.dart'; +import 'package:fluffychat/widgets/mxc_image.dart'; +import '../../../utils/url_launcher.dart'; + +class HtmlMessage extends StatelessWidget { + final String html; + final Room room; + final Color textColor; + final double fontSize; + final TextStyle linkStyle; + final void Function(LinkableElement) onOpen; + + const HtmlMessage({ + super.key, + required this.html, + required this.room, + required this.fontSize, + required this.linkStyle, + this.textColor = Colors.black, + required this.onOpen, + }); + + /// Keep in sync with: https://spec.matrix.org/latest/client-server-api/#mroommessage-msgtypes + static const Set allowedHtmlTags = { + 'font', + 'del', + 's', + 'h1', + 'h2', + 'h3', + 'h4', + 'h5', + 'h6', + 'blockquote', + 'p', + 'a', + 'ul', + 'ol', + 'sup', + 'sub', + 'li', + 'b', + 'i', + 'u', + 'strong', + 'em', + 'strike', + 'code', + 'hr', + 'br', + 'div', + 'table', + 'thead', + 'tbody', + 'tr', + 'th', + 'td', + 'caption', + 'pre', + 'span', + 'img', + 'details', + 'summary', + // Not in the allowlist of the matrix spec yet but should be harmless: + 'ruby', + 'rp', + 'rt', + 'html', + 'body', + // Workaround for https://github.com/krille-chan/fluffychat/issues/507 + 'tg-forward', + }; + + /// We add line breaks before these tags: + static const Set blockHtmlTags = { + 'p', + 'ul', + 'ol', + 'pre', + 'div', + 'table', + 'details', + 'blockquote', + }; + + /// We add line breaks before these tags: + static const Set fullLineHtmlTag = { + 'h1', + 'h2', + 'h3', + 'h4', + 'h5', + 'h6', + 'li', + }; + + /// Adding line breaks before block elements. + List _renderWithLineBreaks( + dom.NodeList nodes, + BuildContext context, { + int depth = 1, + }) { + final onlyElements = nodes.whereType().toList(); + return [ + for (var i = 0; i < nodes.length; i++) ...[ + // Actually render the node child: + _renderHtml(nodes[i], context, depth: depth + 1), + // Add linebreaks between blocks: + if (nodes[i] is dom.Element && + onlyElements.indexOf(nodes[i] as dom.Element) < + onlyElements.length - 1) ...[ + if (blockHtmlTags.contains((nodes[i] as dom.Element).localName)) + const TextSpan(text: '\n\n'), + if (fullLineHtmlTag.contains((nodes[i] as dom.Element).localName)) + const TextSpan(text: '\n'), + ], + ], + ]; + } + + /// Transforms a Node to an InlineSpan. + InlineSpan _renderHtml( + dom.Node node, + BuildContext context, { + int depth = 1, + }) { + // We must not render elements nested more than 100 elements deep: + if (depth >= 100) return const TextSpan(); + + // This is a text node, so we render it as text: + if (node is! dom.Element) { + var text = node.text ?? ''; + // Single linebreak nodes between Elements are ignored: + if (text == '\n') text = ''; + + return LinkifySpan( + text: text, + options: const LinkifyOptions(humanize: false), + linkStyle: linkStyle, + onOpen: onOpen, + ); + } + + // We must not render tags which are not in the allow list: + if (!allowedHtmlTags.contains(node.localName)) return const TextSpan(); + + switch (node.localName) { + case 'br': + return const TextSpan(text: '\n'); + case 'a': + final href = node.attributes['href']; + if (href == null) continue block; + final matrixId = node.attributes['href'] + ?.parseIdentifierIntoParts() + ?.primaryIdentifier; + if (matrixId != null) { + if (matrixId.sigil == '@') { + final user = room.unsafeGetUserFromMemoryOrFallback(matrixId); + return WidgetSpan( + child: MatrixPill( + key: Key('user_pill_$matrixId'), + name: user.calcDisplayname(), + avatar: user.avatarUrl, + uri: href, + outerContext: context, + fontSize: fontSize, + color: linkStyle.color, + ), + ); + } + if (matrixId.sigil == '#' || matrixId.sigil == '!') { + final room = matrixId.sigil == '!' + ? this.room.client.getRoomById(matrixId) + : this.room.client.getRoomByAlias(matrixId); + return WidgetSpan( + child: MatrixPill( + name: room?.getLocalizedDisplayname() ?? matrixId, + avatar: room?.avatar, + uri: href, + outerContext: context, + fontSize: fontSize, + color: linkStyle.color, + ), + ); + } + } + return WidgetSpan( + child: Tooltip( + message: href, + child: InkWell( + splashColor: Colors.transparent, + onTap: () => UrlLauncher(context, href, node.text).launchUrl(), + child: Text.rich( + TextSpan( + children: _renderWithLineBreaks( + node.nodes, + context, + depth: depth, + ), + style: linkStyle, + ), + style: const TextStyle(height: 1.25), + ), + ), + ), + ); + case 'li': + if (!{'ol', 'ul'}.contains(node.parent?.localName)) { + continue block; + } + return WidgetSpan( + child: Padding( + padding: EdgeInsets.only(left: fontSize), + child: Text.rich( + TextSpan( + children: [ + if (node.parent?.localName == 'ul') + const TextSpan(text: '• '), + if (node.parent?.localName == 'ol') + TextSpan( + text: + '${(node.parent?.nodes.whereType().toList().indexOf(node) ?? 0) + (int.tryParse(node.parent?.attributes['start'] ?? '1') ?? 1)}. ', + ), + ..._renderWithLineBreaks( + node.nodes, + context, + depth: depth, + ), + ], + style: TextStyle(fontSize: fontSize, color: textColor), + ), + ), + ), + ); + case 'blockquote': + return WidgetSpan( + child: Container( + padding: const EdgeInsets.only(left: 8.0), + decoration: BoxDecoration( + border: Border( + left: BorderSide( + color: textColor, + width: 5, + ), + ), + ), + child: Text.rich( + TextSpan( + children: _renderWithLineBreaks( + node.nodes, + context, + depth: depth, + ), + ), + style: TextStyle( + fontStyle: FontStyle.italic, + fontSize: fontSize, + color: textColor, + ), + ), + ), + ); + case 'code': + final isInline = node.parent?.localName != 'pre'; + return WidgetSpan( + child: Material( + clipBehavior: Clip.hardEdge, + borderRadius: BorderRadius.circular(4), + child: SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: HighlightView( + node.text, + language: node.className + .split(' ') + .singleWhereOrNull( + (className) => className.startsWith('language-'), + ) + ?.split('language-') + .last ?? + 'md', + theme: shadesOfPurpleTheme, + padding: EdgeInsets.symmetric( + horizontal: 8, + vertical: isInline ? 0 : 8, + ), + textStyle: TextStyle( + fontSize: fontSize, + fontFamily: 'RobotoMono', + ), + ), + ), + ), + ); + case 'img': + final mxcUrl = Uri.tryParse(node.attributes['src'] ?? ''); + if (mxcUrl == null || mxcUrl.scheme != 'mxc') { + return TextSpan(text: node.attributes['alt']); + } + + final width = double.tryParse(node.attributes['width'] ?? ''); + final height = double.tryParse(node.attributes['height'] ?? ''); + const defaultDimension = 64.0; + final actualWidth = width ?? height ?? defaultDimension; + final actualHeight = height ?? width ?? defaultDimension; + + return WidgetSpan( + child: SizedBox( + width: actualWidth, + height: actualHeight, + child: MxcImage( + uri: mxcUrl, + width: actualWidth, + height: actualHeight, + isThumbnail: (actualWidth * actualHeight) > (256 * 256), + ), + ), + ); + case 'hr': + return const WidgetSpan(child: Divider()); + case 'details': + var obscure = true; + return WidgetSpan( + child: StatefulBuilder( + builder: (context, setState) => InkWell( + splashColor: Colors.transparent, + onTap: () => setState(() { + obscure = !obscure; + }), + child: Text.rich( + TextSpan( + children: [ + WidgetSpan( + child: Icon( + obscure ? Icons.arrow_right : Icons.arrow_drop_down, + size: fontSize * 1.2, + color: textColor, + ), + ), + if (obscure) + ...node.nodes + .where( + (node) => + node is dom.Element && + node.localName == 'summary', + ) + .map( + (node) => _renderHtml(node, context, depth: depth), + ) + else + ..._renderWithLineBreaks( + node.nodes, + context, + depth: depth, + ), + ], + ), + style: TextStyle( + fontSize: fontSize, + color: textColor, + ), + ), + ), + ), + ); + case 'span': + if (!node.attributes.containsKey('data-mx-spoiler')) { + continue block; + } + var obscure = true; + return WidgetSpan( + child: StatefulBuilder( + builder: (context, setState) => InkWell( + splashColor: Colors.transparent, + onTap: () => setState(() { + obscure = !obscure; + }), + child: Text.rich( + TextSpan( + children: _renderWithLineBreaks( + node.nodes, + context, + depth: depth, + ), + ), + style: TextStyle( + fontSize: fontSize, + color: textColor, + backgroundColor: obscure ? textColor : null, + ), + ), + ), + ), + ); + block: + default: + return TextSpan( + style: switch (node.localName) { + 'body' => TextStyle( + fontSize: fontSize, + color: textColor, + ), + 'a' => linkStyle, + 'strong' => const TextStyle(fontWeight: FontWeight.bold), + 'em' || 'i' => const TextStyle(fontStyle: FontStyle.italic), + 'del' || + 's' || + 'strikethrough' => + const TextStyle(decoration: TextDecoration.lineThrough), + 'u' => const TextStyle(decoration: TextDecoration.underline), + 'h1' => TextStyle(fontSize: fontSize * 1.6, height: 2), + 'h2' => TextStyle(fontSize: fontSize * 1.5, height: 2), + 'h3' => TextStyle(fontSize: fontSize * 1.4, height: 2), + 'h4' => TextStyle(fontSize: fontSize * 1.3, height: 1.75), + 'h5' => TextStyle(fontSize: fontSize * 1.2, height: 1.75), + 'h6' => TextStyle(fontSize: fontSize * 1.1, height: 1.5), + 'span' => TextStyle( + color: node.attributes['color']?.hexToColor ?? + node.attributes['data-mx-color']?.hexToColor ?? + textColor, + backgroundColor: + node.attributes['data-mx-bg-color']?.hexToColor, + ), + 'sup' => + const TextStyle(fontFeatures: [FontFeature.superscripts()]), + 'sub' => const TextStyle(fontFeatures: [FontFeature.subscripts()]), + _ => null, + }, + children: _renderWithLineBreaks( + node.nodes, + context, + depth: depth, + ), + ); + } + } + + @override + Widget build(BuildContext context) { + return Text.rich( + _renderHtml( + parser.parse(html).body ?? dom.Element.html(''), + context, + ), + style: TextStyle( + fontSize: fontSize, + color: textColor, + ), + ); + } +} + +class MatrixPill extends StatelessWidget { + final String name; + final BuildContext outerContext; + final Uri? avatar; + final String uri; + final double? fontSize; + final Color? color; + + const MatrixPill({ + super.key, + required this.name, + required this.outerContext, + this.avatar, + required this.uri, + required this.fontSize, + required this.color, + }); + + @override + Widget build(BuildContext context) { + return InkWell( + splashColor: Colors.transparent, + onTap: UrlLauncher(outerContext, uri).launchUrl, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Avatar( + mxContent: avatar, + name: name, + size: 16, + ), + const SizedBox(width: 6), + Text( + name, + style: TextStyle( + color: color, + decorationColor: color, + decoration: TextDecoration.underline, + fontSize: fontSize, + height: 1.25, + ), + ), + ], + ), + ); + } +} + +extension on String { + Color? get hexToColor { + var hexCode = this; + if (hexCode.startsWith('#')) hexCode = hexCode.substring(1); + if (hexCode.length == 6) hexCode = 'FF$hexCode'; + final colorValue = int.tryParse(hexCode, radix: 16); + return colorValue == null ? null : Color(colorValue); + } +} diff --git a/lib/pages/chat/events/image_bubble.dart b/lib/pages/chat/events/image_bubble.dart new file mode 100644 index 0000000..72a7172 --- /dev/null +++ b/lib/pages/chat/events/image_bubble.dart @@ -0,0 +1,188 @@ +import 'package:fluffychat/pages/chat/events/html_message.dart'; +import 'package:flutter/material.dart'; + +import 'package:flutter_linkify/flutter_linkify.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/pages/image_viewer/image_viewer.dart'; +import 'package:fluffychat/utils/file_description.dart'; +import 'package:fluffychat/utils/url_launcher.dart'; +import 'package:fluffychat/widgets/mxc_image.dart'; +import '../../../widgets/blur_hash.dart'; + +class ImageBubble extends StatelessWidget { + final Event event; + final bool tapToView; + final BoxFit fit; + final Color? backgroundColor; + final Color? textColor; + final Color? linkColor; + final bool thumbnailOnly; + final bool animated; + final double width; + final double height; + final void Function()? onTap; + final BorderRadius? borderRadius; + final Timeline? timeline; + + const ImageBubble( + this.event, { + this.tapToView = true, + this.backgroundColor, + this.fit = BoxFit.contain, + this.thumbnailOnly = true, + this.width = 400, + this.height = 300, + this.animated = false, + this.onTap, + this.borderRadius, + this.timeline, + this.textColor, + this.linkColor, + super.key, + }); + + Widget _buildPlaceholder(BuildContext context) { + final String blurHashString = + event.infoMap['xyz.amorgan.blurhash'] is String + ? event.infoMap['xyz.amorgan.blurhash'] + : 'LEHV6nWB2yk8pyo0adR*.7kCMdnj'; + return SizedBox( + width: width, + height: height, + child: BlurHash( + blurhash: blurHashString, + width: width, + height: height, + fit: fit, + ), + ); + } + + void _onTap(BuildContext context) { + if (onTap != null) { + onTap!(); + return; + } + if (!tapToView) return; + showDialog( + context: context, + builder: (_) => ImageViewer( + event, + timeline: timeline, + outerContext: context, + ), + ); + } + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + var borderRadius = + this.borderRadius ?? BorderRadius.circular(AppConfig.borderRadius); + + final fileDescription = event.fileDescription; + final textColor = this.textColor; + + if (fileDescription != null) { + borderRadius = borderRadius.copyWith( + bottomLeft: Radius.zero, + bottomRight: Radius.zero, + ); + } + + return Column( + mainAxisSize: MainAxisSize.min, + spacing: 8, + children: [ + Material( + color: Colors.transparent, + clipBehavior: Clip.hardEdge, + shape: RoundedRectangleBorder( + borderRadius: borderRadius, + side: BorderSide( + color: event.messageType == MessageTypes.Sticker + ? Colors.transparent + : theme.dividerColor, + ), + ), + child: InkWell( + onTap: () => _onTap(context), + borderRadius: borderRadius, + child: Hero( + tag: event.eventId, + child: MxcImage( + event: event, + width: width, + height: height, + fit: fit, + animated: animated, + isThumbnail: thumbnailOnly, + placeholder: event.messageType == MessageTypes.Sticker + ? null + : _buildPlaceholder, + ), + ), + ), + ), + if (fileDescription != null && + textColor != null && + !event.isRichFileDescription) + SizedBox( + width: width, + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 8, + ), + child: Linkify( + text: fileDescription, + textScaleFactor: MediaQuery.textScalerOf(context).scale(1), + style: TextStyle( + color: textColor, + fontSize: + AppConfig.fontSizeFactor * AppConfig.messageFontSize, + ), + options: const LinkifyOptions(humanize: false), + linkStyle: TextStyle( + color: linkColor, + fontSize: + AppConfig.fontSizeFactor * AppConfig.messageFontSize, + decoration: TextDecoration.underline, + decorationColor: linkColor, + ), + onOpen: (url) => UrlLauncher(context, url.url).launchUrl(), + ), + ), + ), + if (fileDescription != null && textColor != null && event.isRichFileDescription) + SizedBox( + width: width, + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 8, + ), + child: HtmlMessage( + html: fileDescription, + textColor: textColor, + room: event.room, + fontSize: + AppConfig.fontSizeFactor * AppConfig.messageFontSize, + linkStyle: TextStyle( + color: linkColor, + fontSize: + AppConfig.fontSizeFactor * AppConfig.messageFontSize, + decoration: TextDecoration.underline, + decorationColor: linkColor, + ), + onOpen: (url) => UrlLauncher(context, url.url).launchUrl(), + ), + ), + ), + ], + ); + } +} diff --git a/lib/pages/chat/events/map_bubble.dart b/lib/pages/chat/events/map_bubble.dart new file mode 100644 index 0000000..4a2befa --- /dev/null +++ b/lib/pages/chat/events/map_bubble.dart @@ -0,0 +1,90 @@ +import 'package:flutter/material.dart'; + +import 'package:flutter_map/flutter_map.dart'; +import 'package:latlong2/latlong.dart'; + +class MapBubble extends StatelessWidget { + final double latitude; + final double longitude; + final double zoom; + final double width; + final double height; + final double radius; + const MapBubble({ + required this.latitude, + required this.longitude, + this.zoom = 14.0, + this.width = 400, + this.height = 400, + this.radius = 10.0, + super.key, + }); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + return ClipRRect( + borderRadius: BorderRadius.circular(radius), + child: Container( + constraints: BoxConstraints.loose(Size(width, height)), + child: AspectRatio( + aspectRatio: width / height, + child: Stack( + children: [ + FlutterMap( + options: MapOptions( + initialCenter: LatLng(latitude, longitude), + initialZoom: zoom, + ), + children: [ + TileLayer( + maxZoom: 20, + minZoom: 0, + urlTemplate: + 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', + subdomains: const ['a', 'b', 'c'], + ), + MarkerLayer( + rotate: true, + markers: [ + Marker( + point: LatLng(latitude, longitude), + width: 30, + height: 30, + child: Transform.translate( + // No idea why the offset has to be like this, instead of -15 + // It has been determined by trying out, though, that this yields + // the tip of the location pin to be static when zooming. + // Might have to do with psychological perception of where the tip exactly is + offset: const Offset(0, -12.5), + child: const Icon( + Icons.location_pin, + color: Colors.red, + size: 30, + ), + ), + ), + ], + ), + ], + ), + Container( + alignment: Alignment.bottomRight, + child: Text( + ' © OpenStreetMap contributors ', + style: TextStyle( + color: theme.brightness == Brightness.dark + ? Colors.white + : Colors.black, + backgroundColor: theme.appBarTheme.backgroundColor, + ), + ), + ), + ], + ), + ), + ), + ); + } +} diff --git a/lib/pages/chat/events/message.dart b/lib/pages/chat/events/message.dart new file mode 100644 index 0000000..ed3f6c3 --- /dev/null +++ b/lib/pages/chat/events/message.dart @@ -0,0 +1,665 @@ +import 'dart:ui' as ui; + +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:matrix/matrix.dart'; +import 'package:swipe_to_action/swipe_to_action.dart'; + +import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/pages/chat/events/room_creation_state_event.dart'; +import 'package:fluffychat/utils/date_time_extension.dart'; +import 'package:fluffychat/utils/file_description.dart'; +import 'package:fluffychat/utils/string_color.dart'; +import 'package:fluffychat/widgets/avatar.dart'; +import 'package:fluffychat/widgets/matrix.dart'; +import 'package:fluffychat/widgets/member_actions_popup_menu_button.dart'; +import '../../../config/app_config.dart'; +import 'message_content.dart'; +import 'message_reactions.dart'; +import 'reply_content.dart'; +import 'state_message.dart'; + +class Message extends StatelessWidget { + final Event event; + final Event? nextEvent; + final Event? previousEvent; + final bool displayReadMarker; + final void Function(Event) onSelect; + final void Function(Event) onInfoTab; + final void Function(String) scrollToEventId; + final void Function() onSwipe; + final void Function() onMention; + final bool longPressSelect; + final bool selected; + final Timeline timeline; + final bool highlightMarker; + final bool animateIn; + final void Function()? resetAnimateIn; + final bool wallpaperMode; + final ScrollController? scrollController; + final List colors; + + const Message( + this.event, { + this.nextEvent, + this.previousEvent, + this.displayReadMarker = false, + this.longPressSelect = false, + required this.onSelect, + required this.onInfoTab, + required this.scrollToEventId, + required this.onSwipe, + this.selected = false, + required this.timeline, + this.highlightMarker = false, + this.animateIn = false, + this.resetAnimateIn, + this.wallpaperMode = false, + required this.onMention, + this.scrollController, + required this.colors, + super.key, + }); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + if (!{ + EventTypes.Message, + EventTypes.Sticker, + EventTypes.Encrypted, + EventTypes.CallInvite, + }.contains(event.type)) { + if (event.type.startsWith('m.call.')) { + return const SizedBox.shrink(); + } + if (event.type == EventTypes.RoomCreate) { + return RoomCreationStateEvent(event: event); + } + return StateMessage(event); + } + + if (event.type == EventTypes.Message && + event.messageType == EventTypes.KeyVerificationRequest) { + return StateMessage(event); + } + + final client = Matrix.of(context).client; + final ownMessage = event.senderId == client.userID; + final alignment = ownMessage ? Alignment.topRight : Alignment.topLeft; + + var color = theme.colorScheme.surfaceContainerHigh; + final displayTime = event.type == EventTypes.RoomCreate || + nextEvent == null || + !event.originServerTs.sameEnvironment(nextEvent!.originServerTs); + final nextEventSameSender = nextEvent != null && + { + EventTypes.Message, + EventTypes.Sticker, + EventTypes.Encrypted, + }.contains(nextEvent!.type) && + nextEvent!.senderId == event.senderId && + !displayTime; + + final previousEventSameSender = previousEvent != null && + { + EventTypes.Message, + EventTypes.Sticker, + EventTypes.Encrypted, + }.contains(previousEvent!.type) && + previousEvent!.senderId == event.senderId && + previousEvent!.originServerTs.sameEnvironment(event.originServerTs); + + final textColor = + ownMessage ? theme.onBubbleColor : theme.colorScheme.onSurface; + + final linkColor = ownMessage + ? theme.brightness == Brightness.light + ? theme.colorScheme.primaryFixed + : theme.colorScheme.onTertiaryContainer + : theme.colorScheme.primary; + + final rowMainAxisAlignment = + ownMessage ? MainAxisAlignment.end : MainAxisAlignment.start; + + final displayEvent = event.getDisplayEvent(timeline); + const hardCorner = Radius.circular(4); + const roundedCorner = Radius.circular(AppConfig.borderRadius); + final borderRadius = BorderRadius.only( + topLeft: !ownMessage && nextEventSameSender ? hardCorner : roundedCorner, + topRight: ownMessage && nextEventSameSender ? hardCorner : roundedCorner, + bottomLeft: + !ownMessage && previousEventSameSender ? hardCorner : roundedCorner, + bottomRight: + ownMessage && previousEventSameSender ? hardCorner : roundedCorner, + ); + final noBubble = ({ + MessageTypes.Video, + MessageTypes.Image, + MessageTypes.Sticker, + }.contains(event.messageType) && + event.fileDescription == null && + !event.redacted) || + (event.messageType == MessageTypes.Text && + event.relationshipType == null && + event.onlyEmotes && + event.numberEmotes > 0 && + event.numberEmotes <= 3); + + if (ownMessage) { + color = + displayEvent.status.isError ? Colors.redAccent : theme.bubbleColor; + } + + final resetAnimateIn = this.resetAnimateIn; + var animateIn = this.animateIn; + + final row = StatefulBuilder( + builder: (context, setState) { + if (animateIn && resetAnimateIn != null) { + WidgetsBinding.instance.addPostFrameCallback((timeStamp) { + animateIn = false; + setState(resetAnimateIn); + }); + } + return AnimatedSize( + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + clipBehavior: Clip.none, + alignment: ownMessage ? Alignment.bottomRight : Alignment.bottomLeft, + child: animateIn + ? const SizedBox(height: 0, width: double.infinity) + : Stack( + children: [ + Positioned( + top: 0, + bottom: 0, + left: 0, + right: 0, + child: InkWell( + onTap: () => onSelect(event), + onLongPress: () => onSelect(event), + borderRadius: + BorderRadius.circular(AppConfig.borderRadius / 2), + child: Material( + borderRadius: + BorderRadius.circular(AppConfig.borderRadius / 2), + color: selected || highlightMarker + ? theme.colorScheme.secondaryContainer + .withAlpha(128) + : Colors.transparent, + ), + ), + ), + Row( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: rowMainAxisAlignment, + children: [ + if (longPressSelect) + SizedBox( + height: 32, + width: Avatar.defaultSize, + child: Checkbox.adaptive( + value: selected, + shape: const CircleBorder(), + onChanged: (_) => onSelect(event), + ), + ) + else if (nextEventSameSender || ownMessage) + SizedBox( + width: Avatar.defaultSize, + child: Center( + child: SizedBox( + width: 16, + height: 16, + child: event.status == EventStatus.error + ? const Icon(Icons.error, color: Colors.red) + : event.fileSendingStatus != null + ? const CircularProgressIndicator + .adaptive( + strokeWidth: 1, + ) + : null, + ), + ), + ) + else + FutureBuilder( + future: event.fetchSenderUser(), + builder: (context, snapshot) { + final user = snapshot.data ?? + event.senderFromMemoryOrFallback; + return Avatar( + mxContent: user.avatarUrl, + name: user.calcDisplayname(), + onTap: () => showMemberActionsPopupMenu( + context: context, + user: user, + onMention: onMention, + ), + presenceUserId: user.stateKey, + presenceBackgroundColor: + wallpaperMode ? Colors.transparent : null, + ); + }, + ), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + if (!nextEventSameSender) + Padding( + padding: const EdgeInsets.only( + left: 8.0, + bottom: 4, + ), + child: ownMessage || event.room.isDirectChat + ? const SizedBox(height: 12) + : FutureBuilder( + future: event.fetchSenderUser(), + builder: (context, snapshot) { + final displayname = snapshot.data + ?.calcDisplayname() ?? + event.senderFromMemoryOrFallback + .calcDisplayname(); + return Text( + displayname, + style: TextStyle( + fontSize: 11, + fontWeight: FontWeight.bold, + color: (theme.brightness == + Brightness.light + ? displayname.color + : displayname + .lightColorText), + shadows: !wallpaperMode + ? null + : [ + const Shadow( + offset: Offset( + 0.0, + 0.0, + ), + blurRadius: 3, + color: Colors.black, + ), + ], + ), + maxLines: 1, + overflow: TextOverflow.ellipsis, + ); + }, + ), + ), + Container( + alignment: alignment, + padding: const EdgeInsets.only(left: 8), + child: GestureDetector( + onLongPress: longPressSelect + ? null + : () { + HapticFeedback.heavyImpact(); + onSelect(event); + }, + child: AnimatedOpacity( + opacity: animateIn + ? 0 + : event.messageType == + MessageTypes.BadEncrypted || + event.status.isSending + ? 0.5 + : 1, + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + child: Container( + decoration: BoxDecoration( + color: noBubble + ? Colors.transparent + : color, + borderRadius: borderRadius, + ), + clipBehavior: Clip.antiAlias, + child: BubbleBackground( + colors: colors, + ignore: noBubble || !ownMessage, + scrollController: scrollController, + child: Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular( + AppConfig.borderRadius, + ), + ), + constraints: const BoxConstraints( + maxWidth: + FluffyThemes.columnWidth * 1.5, + ), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + if (event.relationshipType == + RelationshipTypes.reply) + FutureBuilder( + future: event + .getReplyEvent(timeline), + builder: ( + BuildContext context, + snapshot, + ) { + final replyEvent = snapshot + .hasData + ? snapshot.data! + : Event( + eventId: event + .relationshipEventId!, + content: { + 'msgtype': + 'm.text', + 'body': '...', + }, + senderId: + event.senderId, + type: + 'm.room.message', + room: event.room, + status: EventStatus + .sent, + originServerTs: + DateTime.now(), + ); + return Padding( + padding: + const EdgeInsets.only( + left: 16, + right: 16, + top: 8, + ), + child: Material( + color: + Colors.transparent, + borderRadius: + ReplyContent + .borderRadius, + child: InkWell( + borderRadius: + ReplyContent + .borderRadius, + onTap: () => + scrollToEventId( + replyEvent.eventId, + ), + child: AbsorbPointer( + child: ReplyContent( + replyEvent, + ownMessage: + ownMessage, + timeline: + timeline, + ), + ), + ), + ), + ); + }, + ), + MessageContent( + displayEvent, + textColor: textColor, + linkColor: linkColor, + onInfoTab: onInfoTab, + borderRadius: borderRadius, + timeline: timeline, + ), + if (event.hasAggregatedEvents( + timeline, + RelationshipTypes.edit, + )) + Padding( + padding: + const EdgeInsets.only( + bottom: 8.0, + left: 16.0, + right: 16.0, + ), + child: Row( + mainAxisSize: + MainAxisSize.min, + spacing: 4.0, + children: [ + Icon( + Icons.edit_outlined, + color: textColor + .withAlpha(164), + size: 14, + ), + Text( + displayEvent + .originServerTs + .localizedTimeShort( + context, + ), + style: TextStyle( + color: textColor + .withAlpha(164), + fontSize: 11, + ), + ), + ], + ), + ), + ], + ), + ), + ), + ), + ), + ), + ), + ], + ), + ), + ], + ), + ], + ), + ); + }, + ); + Widget container; + final showReceiptsRow = + event.hasAggregatedEvents(timeline, RelationshipTypes.reaction); + if (showReceiptsRow || displayTime || selected || displayReadMarker) { + container = Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: + ownMessage ? CrossAxisAlignment.end : CrossAxisAlignment.start, + children: [ + if (displayTime || selected) + Padding( + padding: displayTime + ? const EdgeInsets.symmetric(vertical: 8.0) + : EdgeInsets.zero, + child: Center( + child: Padding( + padding: const EdgeInsets.only(top: 4.0), + child: Material( + borderRadius: + BorderRadius.circular(AppConfig.borderRadius * 2), + color: theme.colorScheme.surface.withAlpha(128), + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 8.0, + vertical: 2.0, + ), + child: Text( + event.originServerTs.localizedTime(context), + style: TextStyle( + fontSize: 12 * AppConfig.fontSizeFactor, + fontWeight: FontWeight.bold, + color: theme.colorScheme.secondary, + ), + ), + ), + ), + ), + ), + ), + row, + AnimatedSize( + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + child: !showReceiptsRow + ? const SizedBox.shrink() + : Padding( + padding: EdgeInsets.only( + top: 4.0, + left: (ownMessage ? 0 : Avatar.defaultSize) + 12.0, + right: ownMessage ? 0 : 12.0, + ), + child: MessageReactions(event, timeline), + ), + ), + if (displayReadMarker) + Row( + children: [ + Expanded( + child: + Divider(color: theme.colorScheme.surfaceContainerHighest), + ), + Container( + margin: const EdgeInsets.symmetric( + horizontal: 4, + vertical: 16.0, + ), + padding: const EdgeInsets.symmetric( + horizontal: 8, + vertical: 2, + ), + decoration: BoxDecoration( + borderRadius: + BorderRadius.circular(AppConfig.borderRadius / 3), + color: theme.colorScheme.surface.withAlpha(128), + ), + child: Text( + L10n.of(context).readUpToHere, + style: TextStyle( + fontSize: 12 * AppConfig.fontSizeFactor, + ), + ), + ), + Expanded( + child: + Divider(color: theme.colorScheme.surfaceContainerHighest), + ), + ], + ), + ], + ); + } else { + container = row; + } + + return Center( + child: Swipeable( + key: ValueKey(event.eventId), + background: const Padding( + padding: EdgeInsets.symmetric(horizontal: 12.0), + child: Center( + child: Icon(Icons.check_outlined), + ), + ), + direction: AppConfig.swipeRightToLeftToReply + ? SwipeDirection.endToStart + : SwipeDirection.startToEnd, + onSwipe: (_) => onSwipe(), + child: Container( + constraints: const BoxConstraints( + maxWidth: FluffyThemes.columnWidth * 2.5, + ), + padding: EdgeInsets.only( + left: 8.0, + right: 8.0, + top: nextEventSameSender ? 1.0 : 4.0, + bottom: previousEventSameSender ? 1.0 : 4.0, + ), + child: container, + ), + ), + ); + } +} + +class BubbleBackground extends StatelessWidget { + const BubbleBackground({ + super.key, + required this.colors, + required this.ignore, + required this.child, + this.scrollController, + }); + + final ScrollController? scrollController; + final List colors; + final bool ignore; + final Widget child; + + @override + Widget build(BuildContext context) { + if (ignore) return child; + return CustomPaint( + painter: BubblePainter( + repaint: scrollController, + colors: colors, + context: context, + ), + child: child, + ); + } +} + +class BubblePainter extends CustomPainter { + BubblePainter({ + required this.context, + required this.colors, + required super.repaint, + }); + + final BuildContext context; + final List colors; + ScrollableState? _scrollable; + + @override + void paint(Canvas canvas, Size size) { + if (!(context.widget is ScrollView || context.widget is SingleChildScrollView)) return; + final scrollable = _scrollable ??= Scrollable.of(context); + final scrollableBox = scrollable.context.findRenderObject() as RenderBox; + final scrollableRect = Offset.zero & scrollableBox.size; + final bubbleBox = context.findRenderObject() as RenderBox; + + final origin = + bubbleBox.localToGlobal(Offset.zero, ancestor: scrollableBox); + final paint = Paint() + ..shader = ui.Gradient.linear( + scrollableRect.topCenter, + scrollableRect.bottomCenter, + colors, + [0.0, 1.0], + TileMode.clamp, + Matrix4.translationValues(-origin.dx, -origin.dy, 0.0).storage, + ); + canvas.drawRect(Offset.zero & size, paint); + } + + @override + bool shouldRepaint(BubblePainter oldDelegate) { + final scrollable = Scrollable.of(context); + final oldScrollable = _scrollable; + _scrollable = scrollable; + return scrollable.position != oldScrollable?.position; + } +} diff --git a/lib/pages/chat/events/message_content.dart b/lib/pages/chat/events/message_content.dart new file mode 100644 index 0000000..7ec7bac --- /dev/null +++ b/lib/pages/chat/events/message_content.dart @@ -0,0 +1,385 @@ +import 'dart:math'; + +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:flutter_linkify/flutter_linkify.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/pages/chat/events/video_player.dart'; +import 'package:fluffychat/utils/adaptive_bottom_sheet.dart'; +import 'package:fluffychat/utils/date_time_extension.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; +import 'package:fluffychat/widgets/avatar.dart'; +import 'package:fluffychat/widgets/matrix.dart'; +import '../../../config/app_config.dart'; +import '../../../utils/platform_infos.dart'; +import '../../../utils/url_launcher.dart'; +import '../../bootstrap/bootstrap_dialog.dart'; +import 'audio_player.dart'; +import 'cute_events.dart'; +import 'html_message.dart'; +import 'image_bubble.dart'; +import 'map_bubble.dart'; +import 'message_download_content.dart'; + +class MessageContent extends StatelessWidget { + final Event event; + final Color textColor; + final Color linkColor; + final void Function(Event)? onInfoTab; + final BorderRadius borderRadius; + final Timeline timeline; + + const MessageContent( + this.event, { + this.onInfoTab, + super.key, + required this.timeline, + required this.textColor, + required this.linkColor, + required this.borderRadius, + }); + + void _verifyOrRequestKey(BuildContext context) async { + final l10n = L10n.of(context); + if (event.content['can_request_session'] != true) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text( + event.calcLocalizedBodyFallback(MatrixLocals(l10n)), + ), + ), + ); + return; + } + final client = Matrix.of(context).client; + if (client.isUnknownSession && client.encryption!.crossSigning.enabled) { + final success = await BootstrapDialog( + client: Matrix.of(context).client, + ).show(context); + if (success != true) return; + } + event.requestKey(); + final sender = event.senderFromMemoryOrFallback; + await showAdaptiveBottomSheet( + context: context, + builder: (context) => Scaffold( + appBar: AppBar( + leading: CloseButton(onPressed: Navigator.of(context).pop), + title: Text( + l10n.whyIsThisMessageEncrypted, + style: const TextStyle(fontSize: 16), + ), + ), + body: SafeArea( + child: ListView( + padding: const EdgeInsets.all(16), + children: [ + ListTile( + contentPadding: EdgeInsets.zero, + leading: Avatar( + mxContent: sender.avatarUrl, + name: sender.calcDisplayname(), + presenceUserId: sender.stateKey, + client: event.room.client, + ), + title: Text(sender.calcDisplayname()), + subtitle: Text(event.originServerTs.localizedTime(context)), + trailing: const Icon(Icons.lock_outlined), + ), + const Divider(), + Text( + event.calcLocalizedBodyFallback( + MatrixLocals(l10n), + ), + ), + ], + ), + ), + ), + ); + } + + @override + Widget build(BuildContext context) { + final fontSize = AppConfig.messageFontSize * AppConfig.fontSizeFactor; + final buttonTextColor = textColor; + switch (event.type) { + case EventTypes.Message: + case EventTypes.Encrypted: + case EventTypes.Sticker: + switch (event.messageType) { + case MessageTypes.Image: + case MessageTypes.Sticker: + if (event.redacted) continue textmessage; + final maxSize = event.messageType == MessageTypes.Image ? 512.0 : 256.0; + final w = event.content + .tryGetMap('info') + ?.tryGet('w'); + final h = event.content + .tryGetMap('info') + ?.tryGet('h'); + var width = maxSize; + var height = maxSize; + var fit = event.messageType == MessageTypes.Sticker + ? BoxFit.contain + : BoxFit.cover; + if (w != null && h != null) { + fit = BoxFit.contain; + if (w > h) { + width = maxSize; + height = max(32, maxSize * (h / w)); + } else { + height = maxSize; + width = max(32, maxSize * (w / h)); + } + } + return ImageBubble( + event, + width: width, + height: height, + fit: fit, + borderRadius: borderRadius, + timeline: timeline, + textColor: textColor, + ); + case CuteEventContent.eventType: + return CuteContent(event); + case MessageTypes.Audio: + if (PlatformInfos.isMobile || + PlatformInfos.isMacOS || + PlatformInfos.isWeb + // Disabled until https://github.com/bleonard252/just_audio_mpv/issues/3 + // is fixed + // || PlatformInfos.isLinux + ) { + return AudioPlayerWidget( + event, + color: textColor, + linkColor: linkColor, + fontSize: fontSize, + ); + } + return MessageDownloadContent( + event, + textColor: textColor, + linkColor: linkColor, + ); + case MessageTypes.Video: + return EventVideoPlayer(event, textColor, linkColor, timeline: timeline,); + case MessageTypes.File: + return MessageDownloadContent( + event, + textColor: textColor, + linkColor: linkColor, + ); + + case MessageTypes.Text: + case MessageTypes.Notice: + case MessageTypes.Emote: + if (AppConfig.renderHtml && + !event.redacted && + event.isRichMessage) { + var html = event.formattedText; + if (event.messageType == MessageTypes.Emote) { + html = '* $html'; + } + return Padding( + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 8, + ), + child: HtmlMessage( + html: html, + textColor: textColor, + room: event.room, + fontSize: + AppConfig.fontSizeFactor * AppConfig.messageFontSize, + linkStyle: TextStyle( + color: linkColor, + fontSize: + AppConfig.fontSizeFactor * AppConfig.messageFontSize, + decoration: TextDecoration.underline, + decorationColor: linkColor, + ), + onOpen: (url) => UrlLauncher(context, url.url).launchUrl(), + ), + ); + } + // else we fall through to the normal message rendering + continue textmessage; + case MessageTypes.BadEncrypted: + case EventTypes.Encrypted: + return _ButtonContent( + textColor: buttonTextColor, + onPressed: () => _verifyOrRequestKey(context), + icon: '🔒', + label: L10n.of(context).encrypted, + fontSize: fontSize, + ); + case MessageTypes.Location: + final geoUri = + Uri.tryParse(event.content.tryGet('geo_uri')!); + if (geoUri != null && geoUri.scheme == 'geo') { + final latlong = geoUri.path + .split(';') + .first + .split(',') + .map((s) => double.tryParse(s)) + .toList(); + if (latlong.length == 2 && + latlong.first != null && + latlong.last != null) { + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + MapBubble( + latitude: latlong.first!, + longitude: latlong.last!, + ), + const SizedBox(height: 6), + OutlinedButton.icon( + icon: Icon(Icons.location_on_outlined, color: textColor), + onPressed: + UrlLauncher(context, geoUri.toString()).launchUrl, + label: Text( + L10n.of(context).openInMaps, + style: TextStyle(color: textColor), + ), + ), + ], + ); + } + } + continue textmessage; + case MessageTypes.None: + textmessage: + default: + if (event.redacted) { + return FutureBuilder( + future: event.redactedBecause?.fetchSenderUser(), + builder: (context, snapshot) { + final reason = + event.redactedBecause?.content.tryGet('reason'); + final redactedBy = snapshot.data?.calcDisplayname() ?? + event.redactedBecause?.senderId.localpart ?? + L10n.of(context).user; + return _ButtonContent( + label: reason == null + ? L10n.of(context).redactedBy(redactedBy) + : L10n.of(context).redactedByBecause( + redactedBy, + reason, + ), + icon: '🗑️', + textColor: buttonTextColor.withAlpha(128), + onPressed: () => onInfoTab!(event), + fontSize: fontSize, + ); + }, + ); + } + final bigEmotes = event.onlyEmotes && + event.numberEmotes > 0 && + event.numberEmotes <= 3; + return Padding( + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 8, + ), + child: Linkify( + text: event.calcLocalizedBodyFallback( + MatrixLocals(L10n.of(context)), + hideReply: true, + ), + textScaleFactor: MediaQuery.textScalerOf(context).scale(1), + style: TextStyle( + color: textColor, + fontSize: bigEmotes ? fontSize * 5 : fontSize, + decoration: + event.redacted ? TextDecoration.lineThrough : null, + ), + options: const LinkifyOptions(humanize: false), + linkStyle: TextStyle( + color: linkColor, + fontSize: fontSize, + decoration: TextDecoration.underline, + decorationColor: linkColor, + ), + onOpen: (url) => UrlLauncher(context, url.url).launchUrl(), + ), + ); + } + case EventTypes.CallInvite: + return FutureBuilder( + future: event.fetchSenderUser(), + builder: (context, snapshot) { + return _ButtonContent( + label: L10n.of(context).startedACall( + snapshot.data?.calcDisplayname() ?? + event.senderFromMemoryOrFallback.calcDisplayname(), + ), + icon: '📞', + textColor: buttonTextColor, + onPressed: () => onInfoTab!(event), + fontSize: fontSize, + ); + }, + ); + default: + return FutureBuilder( + future: event.fetchSenderUser(), + builder: (context, snapshot) { + return _ButtonContent( + label: L10n.of(context).userSentUnknownEvent( + snapshot.data?.calcDisplayname() ?? + event.senderFromMemoryOrFallback.calcDisplayname(), + event.type, + ), + icon: 'ℹ️', + textColor: buttonTextColor, + onPressed: () => onInfoTab!(event), + fontSize: fontSize, + ); + }, + ); + } + } +} + +class _ButtonContent extends StatelessWidget { + final void Function() onPressed; + final String label; + final String icon; + final Color? textColor; + final double fontSize; + + const _ButtonContent({ + required this.label, + required this.icon, + required this.textColor, + required this.onPressed, + required this.fontSize, + }); + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 8, + ), + child: InkWell( + onTap: onPressed, + child: Text( + '$icon $label', + style: TextStyle( + color: textColor, + fontSize: fontSize, + ), + ), + ), + ); + } +} diff --git a/lib/pages/chat/events/message_download_content.dart b/lib/pages/chat/events/message_download_content.dart new file mode 100644 index 0000000..9237cd3 --- /dev/null +++ b/lib/pages/chat/events/message_download_content.dart @@ -0,0 +1,131 @@ +import 'package:fluffychat/pages/chat/events/html_message.dart'; +import 'package:flutter/material.dart'; + +import 'package:flutter_linkify/flutter_linkify.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/utils/file_description.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/event_extension.dart'; +import 'package:fluffychat/utils/url_launcher.dart'; + +class MessageDownloadContent extends StatelessWidget { + final Event event; + final Color textColor; + final Color linkColor; + + const MessageDownloadContent( + this.event, { + required this.textColor, + required this.linkColor, + super.key, + }); + + @override + Widget build(BuildContext context) { + final filename = event.content.tryGet('filename') ?? event.body; + final filetype = (filename.contains('.') + ? filename.split('.').last.toUpperCase() + : event.content + .tryGetMap('info') + ?.tryGet('mimetype') + ?.toUpperCase() ?? + 'UNKNOWN'); + final sizeString = event.sizeString ?? '?MB'; + final fileDescription = event.fileDescription; + return Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 8, + children: [ + Material( + color: Colors.transparent, + child: InkWell( + borderRadius: BorderRadius.circular(AppConfig.borderRadius / 2), + onTap: () => event.saveFile(context), + child: Container( + width: 400, + padding: const EdgeInsets.all(16.0), + child: Row( + mainAxisSize: MainAxisSize.min, + spacing: 16, + children: [ + CircleAvatar( + backgroundColor: textColor.withAlpha(32), + child: Icon(Icons.file_download_outlined, color: textColor), + ), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Text( + filename, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle( + color: textColor, + fontWeight: FontWeight.w500, + ), + ), + Text( + '$sizeString | $filetype', + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle(color: textColor, fontSize: 10), + ), + ], + ), + ], + ), + ), + ), + ), + if (fileDescription != null && !event.isRichFileDescription) ...[ + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 16.0, + vertical: 8.0, + ), + child: Linkify( + text: fileDescription, + textScaleFactor: MediaQuery.textScalerOf(context).scale(1), + style: TextStyle( + color: textColor, + fontSize: AppConfig.fontSizeFactor * AppConfig.messageFontSize, + ), + options: const LinkifyOptions(humanize: false), + linkStyle: TextStyle( + color: linkColor, + fontSize: AppConfig.fontSizeFactor * AppConfig.messageFontSize, + decoration: TextDecoration.underline, + decorationColor: linkColor, + ), + onOpen: (url) => UrlLauncher(context, url.url).launchUrl(), + ), + ), + ], + if (fileDescription != null && event.isRichFileDescription) ...[ + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 16.0, + vertical: 8.0, + ), + child: HtmlMessage( + html: fileDescription, + textColor: textColor, + room: event.room, + fontSize: AppConfig.fontSizeFactor * AppConfig.messageFontSize, + linkStyle: TextStyle( + color: linkColor, + fontSize: AppConfig.fontSizeFactor * AppConfig.messageFontSize, + decoration: TextDecoration.underline, + decorationColor: linkColor, + ), + onOpen: (url) => UrlLauncher(context, url.url).launchUrl(), + ), + ), + ], + ], + ); + } +} diff --git a/lib/pages/chat/events/message_reactions.dart b/lib/pages/chat/events/message_reactions.dart new file mode 100644 index 0000000..e34dad9 --- /dev/null +++ b/lib/pages/chat/events/message_reactions.dart @@ -0,0 +1,230 @@ +import 'package:flutter/material.dart'; + +import 'package:collection/collection.dart' show IterableExtension; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/widgets/avatar.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import 'package:fluffychat/widgets/matrix.dart'; +import 'package:fluffychat/widgets/mxc_image.dart'; + +class MessageReactions extends StatelessWidget { + final Event event; + final Timeline timeline; + + const MessageReactions(this.event, this.timeline, {super.key}); + + @override + Widget build(BuildContext context) { + final allReactionEvents = + event.aggregatedEvents(timeline, RelationshipTypes.reaction); + final reactionMap = {}; + final client = Matrix.of(context).client; + + for (final e in allReactionEvents) { + final key = e.content + .tryGetMap('m.relates_to') + ?.tryGet('key'); + if (key != null) { + if (!reactionMap.containsKey(key)) { + reactionMap[key] = _ReactionEntry( + key: key, + count: 0, + reacted: false, + reactors: [], + ); + } + reactionMap[key]!.count++; + reactionMap[key]!.reactors!.add(e.senderFromMemoryOrFallback); + reactionMap[key]!.reacted |= e.senderId == e.room.client.userID; + } + } + + final reactionList = reactionMap.values.toList(); + reactionList.sort((a, b) => b.count - a.count > 0 ? 1 : -1); + final ownMessage = event.senderId == event.room.client.userID; + return Wrap( + spacing: 4.0, + runSpacing: 4.0, + alignment: ownMessage ? WrapAlignment.end : WrapAlignment.start, + children: [ + ...reactionList.map( + (r) => _Reaction( + reactionKey: r.key, + count: r.count, + reacted: r.reacted, + onTap: () { + if (r.reacted) { + final evt = allReactionEvents.firstWhereOrNull( + (e) => + e.senderId == e.room.client.userID && + e.content.tryGetMap('m.relates_to')?['key'] == r.key, + ); + if (evt != null) { + showFutureLoadingDialog( + context: context, + future: () => evt.redactEvent(), + ); + } + } else { + event.room.sendReaction(event.eventId, r.key); + } + }, + onLongPress: () async => await _AdaptableReactorsDialog( + client: client, + reactionEntry: r, + ).show(context), + ), + ), + if (allReactionEvents.any((e) => e.status.isSending)) + const SizedBox( + width: 24, + height: 24, + child: Padding( + padding: EdgeInsets.all(4.0), + child: CircularProgressIndicator.adaptive(strokeWidth: 1), + ), + ), + ], + ); + } +} + +class _Reaction extends StatelessWidget { + final String reactionKey; + final int count; + final bool? reacted; + final void Function()? onTap; + final void Function()? onLongPress; + + const _Reaction({ + required this.reactionKey, + required this.count, + required this.reacted, + required this.onTap, + required this.onLongPress, + }); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + final textColor = + theme.brightness == Brightness.dark ? Colors.white : Colors.black; + final color = reacted == true + ? theme.bubbleColor + : theme.colorScheme.surfaceContainerHigh; + Widget content; + if (reactionKey.startsWith('mxc://')) { + content = Row( + mainAxisSize: MainAxisSize.min, + children: [ + MxcImage( + uri: Uri.parse(reactionKey), + width: 20, + height: 20, + animated: false, + isThumbnail: false, + ), + if (count > 1) ...[ + const SizedBox(width: 4), + Text( + count.toString(), + style: TextStyle( + color: textColor, + fontSize: DefaultTextStyle.of(context).style.fontSize, + ), + ), + ], + ], + ); + } else { + var renderKey = Characters(reactionKey); + if (renderKey.length > 10) { + renderKey = renderKey.getRange(0, 9) + Characters('…'); + } + content = Text( + renderKey.toString() + (count > 1 ? ' $count' : ''), + style: TextStyle( + color: reacted == true ? theme.onBubbleColor : textColor, + fontSize: DefaultTextStyle.of(context).style.fontSize, + ), + ); + } + return InkWell( + onTap: () => onTap != null ? onTap!() : null, + onLongPress: () => onLongPress != null ? onLongPress!() : null, + borderRadius: BorderRadius.circular(AppConfig.borderRadius / 2), + child: Container( + decoration: BoxDecoration( + color: color, + borderRadius: BorderRadius.circular(AppConfig.borderRadius / 2), + ), + padding: const EdgeInsets.symmetric(horizontal: 4, vertical: 2), + child: content, + ), + ); + } +} + +class _ReactionEntry { + String key; + int count; + bool reacted; + List? reactors; + + _ReactionEntry({ + required this.key, + required this.count, + required this.reacted, + this.reactors, + }); +} + +class _AdaptableReactorsDialog extends StatelessWidget { + final Client? client; + final _ReactionEntry? reactionEntry; + + const _AdaptableReactorsDialog({ + this.client, + this.reactionEntry, + }); + + Future show(BuildContext context) => showAdaptiveDialog( + context: context, + builder: (context) => this, + barrierDismissible: true, + useRootNavigator: false, + ); + + @override + Widget build(BuildContext context) { + final body = SingleChildScrollView( + child: Wrap( + spacing: 8.0, + runSpacing: 4.0, + alignment: WrapAlignment.center, + children: [ + for (final reactor in reactionEntry!.reactors!) + Chip( + avatar: Avatar( + mxContent: reactor.avatarUrl, + name: reactor.displayName, + client: client, + presenceUserId: reactor.stateKey, + ), + label: Text(reactor.displayName!), + ), + ], + ), + ); + + final title = Center(child: Text(reactionEntry!.key)); + + return AlertDialog.adaptive( + title: title, + content: body, + ); + } +} diff --git a/lib/pages/chat/events/reply_content.dart b/lib/pages/chat/events/reply_content.dart new file mode 100644 index 0000000..262aeae --- /dev/null +++ b/lib/pages/chat/events/reply_content.dart @@ -0,0 +1,101 @@ +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; +import '../../../config/app_config.dart'; + +class ReplyContent extends StatelessWidget { + final Event replyEvent; + final bool ownMessage; + final Timeline? timeline; + + const ReplyContent( + this.replyEvent, { + this.ownMessage = false, + super.key, + this.timeline, + }); + + static const BorderRadius borderRadius = BorderRadius.only( + topRight: Radius.circular(AppConfig.borderRadius / 2), + bottomRight: Radius.circular(AppConfig.borderRadius / 2), + ); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + final timeline = this.timeline; + final displayEvent = + timeline != null ? replyEvent.getDisplayEvent(timeline) : replyEvent; + final fontSize = AppConfig.messageFontSize * AppConfig.fontSizeFactor; + final color = theme.brightness == Brightness.dark + ? theme.colorScheme.onTertiaryContainer + : ownMessage + ? theme.colorScheme.tertiaryContainer + : theme.colorScheme.tertiary; + + return Material( + color: Colors.transparent, + borderRadius: borderRadius, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + width: 5, + height: fontSize * 2 + 16, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(AppConfig.borderRadius), + color: color, + ), + ), + const SizedBox(width: 6), + Flexible( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + FutureBuilder( + initialData: displayEvent.senderFromMemoryOrFallback, + future: displayEvent.fetchSenderUser(), + builder: (context, snapshot) { + return Text( + '${snapshot.data?.calcDisplayname() ?? displayEvent.senderFromMemoryOrFallback.calcDisplayname()}:', + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontWeight: FontWeight.bold, + color: color, + fontSize: fontSize, + ), + ); + }, + ), + Text( + displayEvent.calcLocalizedBodyFallback( + MatrixLocals(L10n.of(context)), + withSenderNamePrefix: false, + hideReply: true, + ), + overflow: TextOverflow.ellipsis, + maxLines: 1, + style: TextStyle( + color: theme.brightness == Brightness.dark + ? theme.colorScheme.onSurface + : ownMessage + ? theme.colorScheme.onTertiary + : theme.colorScheme.onSurface, + fontSize: fontSize, + ), + ), + ], + ), + ), + const SizedBox(width: 6), + ], + ), + ); + } +} diff --git a/lib/pages/chat/events/room_creation_state_event.dart b/lib/pages/chat/events/room_creation_state_event.dart new file mode 100644 index 0000000..42215d8 --- /dev/null +++ b/lib/pages/chat/events/room_creation_state_event.dart @@ -0,0 +1,59 @@ +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/utils/date_time_extension.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; +import 'package:fluffychat/widgets/avatar.dart'; + +class RoomCreationStateEvent extends StatelessWidget { + final Event event; + + const RoomCreationStateEvent({required this.event, super.key}); + + @override + Widget build(BuildContext context) { + final l10n = L10n.of(context); + final matrixLocals = MatrixLocals(l10n); + final theme = Theme.of(context); + final roomName = event.room.getLocalizedDisplayname(matrixLocals); + return Padding( + padding: const EdgeInsets.only(bottom: 32.0), + child: Center( + child: ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 256), + child: Material( + color: theme.colorScheme.surfaceContainer, + borderRadius: BorderRadius.circular(AppConfig.borderRadius), + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Avatar( + mxContent: event.room.avatar, + name: roomName, + size: Avatar.defaultSize * 2, + ), + Text( + roomName, + style: theme.textTheme.bodyLarge, + textAlign: TextAlign.center, + ), + const SizedBox(height: 8), + Text( + '${event.originServerTs.localizedTime(context)} | ${l10n.countParticipants((event.room.summary.mJoinedMemberCount ?? 1) + (event.room.summary.mInvitedMemberCount ?? 0))}', + style: theme.textTheme.labelSmall, + textAlign: TextAlign.center, + ), + ], + ), + ), + ), + ), + ), + ); + } +} diff --git a/lib/pages/chat/events/state_message.dart b/lib/pages/chat/events/state_message.dart new file mode 100644 index 0000000..13716f7 --- /dev/null +++ b/lib/pages/chat/events/state_message.dart @@ -0,0 +1,46 @@ +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; +import '../../../config/app_config.dart'; + +class StateMessage extends StatelessWidget { + final Event event; + const StateMessage(this.event, {super.key}); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: Center( + child: Padding( + padding: const EdgeInsets.all(4), + child: Material( + color: theme.colorScheme.surface.withAlpha(128), + borderRadius: BorderRadius.circular(AppConfig.borderRadius / 3), + child: Padding( + padding: + const EdgeInsets.symmetric(horizontal: 8.0, vertical: 4.0), + child: Text( + event.calcLocalizedBodyFallback( + MatrixLocals(L10n.of(context)), + ), + textAlign: TextAlign.center, + maxLines: 2, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontSize: 12 * AppConfig.fontSizeFactor, + decoration: + event.redacted ? TextDecoration.lineThrough : null, + ), + ), + ), + ), + ), + ), + ); + } +} diff --git a/lib/pages/chat/events/video_player.dart b/lib/pages/chat/events/video_player.dart new file mode 100644 index 0000000..df24bc2 --- /dev/null +++ b/lib/pages/chat/events/video_player.dart @@ -0,0 +1,191 @@ +import 'dart:io'; + +import 'package:fluffychat/pages/chat/events/html_message.dart'; +import 'package:fluffychat/pages/image_viewer/image_viewer.dart'; +import 'package:fluffychat/widgets/mxc_image.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; + +import 'package:chewie/chewie.dart'; +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:flutter_linkify/flutter_linkify.dart'; +import 'package:matrix/matrix.dart'; +import 'package:path_provider/path_provider.dart'; +import 'package:universal_html/html.dart' as html; +import 'package:video_player/video_player.dart'; + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/pages/chat/events/image_bubble.dart'; +import 'package:fluffychat/utils/file_description.dart'; +import 'package:fluffychat/utils/localized_exception_extension.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/event_extension.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/utils/url_launcher.dart'; +import 'package:fluffychat/widgets/blur_hash.dart'; +import '../../../utils/error_reporter.dart'; + +class EventVideoPlayer extends StatelessWidget { + final Event event; + final Timeline? timeline; + final Color textColor; + final Color linkColor; + + const EventVideoPlayer( + this.event, + this.textColor, + this.linkColor, { + this.timeline, + super.key, + }); + + static const String fallbackBlurHash = 'L5H2EC=PM+yV0g-mq.wG9c010J}I'; + + @override + Widget build(BuildContext context) { + final supportsVideoPlayer = PlatformInfos.supportsVideoPlayer; + + final blurHash = (event.infoMap as Map) + .tryGet('xyz.amorgan.blurhash') ?? + fallbackBlurHash; + final fileDescription = event.fileDescription; + final infoMap = event.content.tryGetMap('info'); + final videoWidth = infoMap?.tryGet('w') ?? 400; + final videoHeight = infoMap?.tryGet('h') ?? 300; + const height = 300.0; + final width = videoWidth * (height / videoHeight); + + final durationInt = infoMap?.tryGet('duration'); + final duration = + durationInt == null ? null : Duration(milliseconds: durationInt); + + return Column( + mainAxisSize: MainAxisSize.min, + spacing: 8, + children: [ + Material( + color: Colors.black, + borderRadius: BorderRadius.circular(AppConfig.borderRadius), + child: InkWell( + onTap: () => supportsVideoPlayer + ? showDialog( + context: context, + builder: (_) => ImageViewer( + event, + timeline: timeline, + outerContext: context, + ), + ) + : event.saveFile(context), + borderRadius: BorderRadius.circular(AppConfig.borderRadius), + child: SizedBox( + width: width, + height: height, + child: Stack( + children: [ + if (event.hasThumbnail) + MxcImage( + event: event, + isThumbnail: true, + width: width, + height: height, + fit: BoxFit.cover, + placeholder: (context) => BlurHash( + blurhash: blurHash, + width: width, + height: height, + fit: BoxFit.cover, + ), + ) + else + BlurHash( + blurhash: blurHash, + width: width, + height: height, + fit: BoxFit.cover, + ), + Center( + child: CircleAvatar( + child: supportsVideoPlayer + ? const Icon(Icons.play_arrow_outlined) + : const Icon(Icons.file_download_outlined), + ), + ), + if (duration != null) + Positioned( + bottom: 8, + left: 16, + child: Text( + '${duration.inMinutes.toString().padLeft(2, '0')}:${(duration.inSeconds % 60).toString().padLeft(2, '0')}', + style: TextStyle( + color: Colors.white, + backgroundColor: Colors.black.withAlpha(32), + ), + ), + ), + ], + ), + ), + ), + ), + if (fileDescription != null && + textColor != null && + linkColor != null && + !event.isRichFileDescription) + SizedBox( + width: width, + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 8, + ), + child: Linkify( + text: fileDescription, + textScaleFactor: MediaQuery.textScalerOf(context).scale(1), + style: TextStyle( + color: textColor, + fontSize: + AppConfig.fontSizeFactor * AppConfig.messageFontSize, + ), + options: const LinkifyOptions(humanize: false), + linkStyle: TextStyle( + color: linkColor, + fontSize: + AppConfig.fontSizeFactor * AppConfig.messageFontSize, + decoration: TextDecoration.underline, + decorationColor: linkColor, + ), + onOpen: (url) => UrlLauncher(context, url.url).launchUrl(), + ), + ), + ), + if (fileDescription != null && + textColor != null && + linkColor != null && + event.isRichFileDescription) + SizedBox( + width: width, + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 8, + ), + child: HtmlMessage( + html: fileDescription, + textColor: textColor, + room: event.room, + fontSize: AppConfig.fontSizeFactor * AppConfig.messageFontSize, + linkStyle: TextStyle( + color: linkColor, + fontSize: + AppConfig.fontSizeFactor * AppConfig.messageFontSize, + decoration: TextDecoration.underline, + decorationColor: linkColor, + ), + onOpen: (url) => UrlLauncher(context, url.url).launchUrl(), + ), + ), + ), + ], + ); + } +} diff --git a/lib/pages/chat/input_bar.dart b/lib/pages/chat/input_bar.dart new file mode 100644 index 0000000..792fc26 --- /dev/null +++ b/lib/pages/chat/input_bar.dart @@ -0,0 +1,459 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +import 'package:emojis/emoji.dart'; +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:flutter_typeahead/flutter_typeahead.dart'; +import 'package:matrix/matrix.dart'; +import 'package:slugify/slugify.dart'; + +import 'package:fluffychat/utils/markdown_context_builder.dart'; +import 'package:fluffychat/widgets/mxc_image.dart'; +import '../../widgets/avatar.dart'; +import '../../widgets/matrix.dart'; +import 'command_hints.dart'; + +class InputBar extends StatelessWidget { + final Room room; + final int? minLines; + final int? maxLines; + final TextInputType? keyboardType; + final TextInputAction? textInputAction; + final ValueChanged? onSubmitted; + final ValueChanged? onSubmitImage; + final FocusNode? focusNode; + final TextEditingController? controller; + final InputDecoration? decoration; + final ValueChanged? onChanged; + final bool? autofocus; + final bool readOnly; + + const InputBar({ + required this.room, + this.minLines, + this.maxLines, + this.keyboardType, + this.onSubmitted, + this.onSubmitImage, + this.focusNode, + this.controller, + this.decoration, + this.onChanged, + this.autofocus, + this.textInputAction, + this.readOnly = false, + super.key, + }); + + List> getSuggestions(String text) { + if (controller!.selection.baseOffset != + controller!.selection.extentOffset || + controller!.selection.baseOffset < 0) { + return []; // no entries if there is selected text + } + final searchText = + controller!.text.substring(0, controller!.selection.baseOffset); + final ret = >[]; + const maxResults = 30; + + final commandMatch = RegExp(r'^/(\w*)$').firstMatch(searchText); + if (commandMatch != null) { + final commandSearch = commandMatch[1]!.toLowerCase(); + for (final command in room.client.commands.keys) { + if (command.contains(commandSearch)) { + ret.add({ + 'type': 'command', + 'name': command, + }); + } + + if (ret.length > maxResults) return ret; + } + } + final emojiMatch = + RegExp(r'(?:\s|^):(?:([-\w]+)~)?([-\w]+)$').firstMatch(searchText); + if (emojiMatch != null) { + final packSearch = emojiMatch[1]; + final emoteSearch = emojiMatch[2]!.toLowerCase(); + final emotePacks = room.getImagePacks(ImagePackUsage.emoticon); + if (packSearch == null || packSearch.isEmpty) { + for (final pack in emotePacks.entries) { + for (final emote in pack.value.images.entries) { + if (emote.key.toLowerCase().contains(emoteSearch)) { + ret.add({ + 'type': 'emote', + 'name': emote.key, + 'pack': pack.key, + 'pack_avatar_url': pack.value.pack.avatarUrl?.toString(), + 'pack_display_name': pack.value.pack.displayName ?? pack.key, + 'mxc': emote.value.url.toString(), + }); + } + if (ret.length > maxResults) { + break; + } + } + if (ret.length > maxResults) { + break; + } + } + } else if (emotePacks[packSearch] != null) { + for (final emote in emotePacks[packSearch]!.images.entries) { + if (emote.key.toLowerCase().contains(emoteSearch)) { + ret.add({ + 'type': 'emote', + 'name': emote.key, + 'pack': packSearch, + 'pack_avatar_url': + emotePacks[packSearch]!.pack.avatarUrl?.toString(), + 'pack_display_name': + emotePacks[packSearch]!.pack.displayName ?? packSearch, + 'mxc': emote.value.url.toString(), + }); + } + if (ret.length > maxResults) { + break; + } + } + } + // aside of emote packs, also propose normal (tm) unicode emojis + final matchingUnicodeEmojis = Emoji.all() + .where( + (element) => [element.name, ...element.keywords] + .any((element) => element.toLowerCase().contains(emoteSearch)), + ) + .toList(); + // sort by the index of the search term in the name in order to have + // best matches first + // (thanks for the hint by github.com/nextcloud/circles devs) + matchingUnicodeEmojis.sort((a, b) { + final indexA = a.name.indexOf(emoteSearch); + final indexB = b.name.indexOf(emoteSearch); + if (indexA == -1 || indexB == -1) { + if (indexA == indexB) return 0; + if (indexA == -1) { + return 1; + } else { + return 0; + } + } + return indexA.compareTo(indexB); + }); + for (final emoji in matchingUnicodeEmojis) { + ret.add({ + 'type': 'emoji', + 'emoji': emoji.char, + // don't include sub-group names, splitting at `:` hence + 'label': '${emoji.char} - ${emoji.name.split(':').first}', + 'current_word': ':$emoteSearch', + }); + if (ret.length > maxResults) { + break; + } + } + } + final userMatch = RegExp(r'(?:\s|^)@([^ \[\]]+)$', unicode: true).firstMatch(searchText); + if (userMatch != null) { + final userSearch = userMatch[1]!.toLowerCase(); + for (final user in room.getParticipants()) { + if ((user.displayName != null && + (user.displayName!.toLowerCase().contains(userSearch) || + slugify(user.displayName!.toLowerCase()) + .contains(userSearch))) || + user.id.split(':')[0].toLowerCase().contains(userSearch)) { + ret.add({ + 'type': 'user', + 'mxid': user.id, + 'mention': user.mention, + 'displayname': user.displayName, + 'avatar_url': user.avatarUrl?.toString(), + }); + } + if (ret.length > maxResults) { + break; + } + } + } + final roomMatch = RegExp(r'(?:\s|^)#([-\w]+)$').firstMatch(searchText); + if (roomMatch != null) { + final roomSearch = roomMatch[1]!.toLowerCase(); + for (final r in room.client.rooms) { + if (r.getState(EventTypes.RoomTombstone) != null) { + continue; // we don't care about tombstoned rooms + } + final state = r.getState(EventTypes.RoomCanonicalAlias); + if ((state != null && + ((state.content['alias'] is String && + state.content + .tryGet('alias')! + .split(':')[0] + .toLowerCase() + .contains(roomSearch)) || + (state.content['alt_aliases'] is List && + (state.content['alt_aliases'] as List).any( + (l) => + l is String && + l + .split(':')[0] + .toLowerCase() + .contains(roomSearch), + )))) || + (r.name.toLowerCase().contains(roomSearch))) { + ret.add({ + 'type': 'room', + 'mxid': (r.canonicalAlias.isNotEmpty) ? r.canonicalAlias : r.id, + 'displayname': r.getLocalizedDisplayname(), + 'avatar_url': r.avatar?.toString(), + }); + } + if (ret.length > maxResults) { + break; + } + } + } + return ret; + } + + Widget buildSuggestion( + BuildContext context, + Map suggestion, + Client? client, + ) { + final theme = Theme.of(context); + const size = 30.0; + const padding = EdgeInsets.all(4.0); + if (suggestion['type'] == 'command') { + final command = suggestion['name']!; + final hint = commandHint(L10n.of(context), command); + return Tooltip( + message: hint, + waitDuration: const Duration(days: 1), // don't show on hover + child: Container( + padding: padding, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + commandExample(command), + style: const TextStyle(fontFamily: 'RobotoMono'), + ), + Text( + hint, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: theme.textTheme.bodySmall, + ), + ], + ), + ), + ); + } + if (suggestion['type'] == 'emoji') { + final label = suggestion['label']!; + return Tooltip( + message: label, + waitDuration: const Duration(days: 1), // don't show on hover + child: Container( + padding: padding, + child: Text(label, style: const TextStyle(fontFamily: 'RobotoMono')), + ), + ); + } + if (suggestion['type'] == 'emote') { + return Container( + padding: padding, + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + MxcImage( + // ensure proper ordering ... + key: ValueKey(suggestion['name']), + uri: suggestion['mxc'] is String + ? Uri.parse(suggestion['mxc'] ?? '') + : null, + width: size, + height: size, + isThumbnail: false, + ), + const SizedBox(width: 6), + Text(suggestion['name']!), + Expanded( + child: Align( + alignment: Alignment.centerRight, + child: Opacity( + opacity: suggestion['pack_avatar_url'] != null ? 0.8 : 0.5, + child: suggestion['pack_avatar_url'] != null + ? Avatar( + mxContent: Uri.tryParse( + suggestion.tryGet('pack_avatar_url') ?? '', + ), + name: suggestion.tryGet('pack_display_name'), + size: size * 0.9, + client: client, + ) + : Text(suggestion['pack_display_name']!), + ), + ), + ), + ], + ), + ); + } + if (suggestion['type'] == 'user' || suggestion['type'] == 'room') { + final url = Uri.parse(suggestion['avatar_url'] ?? ''); + return Container( + padding: padding, + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Avatar( + mxContent: url, + name: suggestion.tryGet('displayname') ?? + suggestion.tryGet('mxid'), + size: size, + client: client, + ), + const SizedBox(width: 6), + Text(suggestion['displayname'] ?? suggestion['mxid']!), + ], + ), + ); + } + return const SizedBox.shrink(); + } + + void insertSuggestion(_, Map suggestion) { + final replaceText = + controller!.text.substring(0, controller!.selection.baseOffset); + var startText = ''; + final afterText = replaceText == controller!.text + ? '' + : controller!.text.substring(controller!.selection.baseOffset + 1); + var insertText = ''; + if (suggestion['type'] == 'command') { + insertText = '${suggestion['name']!} '; + startText = replaceText.replaceAllMapped( + RegExp(r'^(/\w*)$'), + (Match m) => '/$insertText', + ); + } + if (suggestion['type'] == 'emoji') { + insertText = '${suggestion['emoji']!} '; + startText = replaceText.replaceAllMapped( + suggestion['current_word']!, + (Match m) => insertText, + ); + } + if (suggestion['type'] == 'emote') { + var isUnique = true; + final insertEmote = suggestion['name']; + final insertPack = suggestion['pack']; + final emotePacks = room.getImagePacks(ImagePackUsage.emoticon); + for (final pack in emotePacks.entries) { + if (pack.key == insertPack) { + continue; + } + for (final emote in pack.value.images.entries) { + if (emote.key == insertEmote) { + isUnique = false; + break; + } + } + if (!isUnique) { + break; + } + } + insertText = ':${isUnique ? '' : '${insertPack!}~'}$insertEmote: '; + startText = replaceText.replaceAllMapped( + RegExp(r'(\s|^)(:(?:[-\w]+~)?[-\w]+)$'), + (Match m) => '${m[1]}$insertText', + ); + } + if (suggestion['type'] == 'user') { + insertText = '${suggestion['mention']!} '; + startText = replaceText.replaceAllMapped( + RegExp(r'(\s|^)(@[-\w]+)$'), + (Match m) => '${m[1]}$insertText', + ); + } + if (suggestion['type'] == 'room') { + insertText = '${suggestion['mxid']!} '; + startText = replaceText.replaceAllMapped( + RegExp(r'(\s|^)(#[-\w]+)$'), + (Match m) => '${m[1]}$insertText', + ); + } + if (insertText.isNotEmpty && startText.isNotEmpty) { + controller!.text = startText + afterText; + controller!.selection = TextSelection( + baseOffset: startText.length, + extentOffset: startText.length, + ); + } + } + + @override + Widget build(BuildContext context) { + return TypeAheadField>( + direction: VerticalDirection.up, + hideOnEmpty: true, + hideOnLoading: true, + controller: controller, + focusNode: focusNode, + hideOnSelect: false, + debounceDuration: const Duration(milliseconds: 50), + // show suggestions after 50ms idle time (default is 300) + builder: (context, controller, focusNode) => TextField( + controller: controller, + focusNode: focusNode, + contextMenuBuilder: (c, e) => markdownContextBuilder(c, e, controller), + contentInsertionConfiguration: ContentInsertionConfiguration( + onContentInserted: (KeyboardInsertedContent content) { + final data = content.data; + if (data == null) return; + + final file = MatrixFile( + mimeType: content.mimeType, + bytes: data, + name: content.uri.split('/').last, + ); + room.sendFileEvent( + file, + shrinkImageMaxDimension: 1600, + ); + }, + ), + minLines: minLines, + maxLines: maxLines, + keyboardType: keyboardType!, + textInputAction: textInputAction, + autofocus: autofocus!, + inputFormatters: [ + LengthLimitingTextInputFormatter((maxPDUSize / 3).floor()), + ], + onSubmitted: (text) { + // fix for library for now + // it sets the types for the callback incorrectly + onSubmitted!(text); + }, + decoration: decoration!, + onChanged: (text) { + // fix for the library for now + // it sets the types for the callback incorrectly + onChanged!(text); + }, + textCapitalization: TextCapitalization.sentences, + ), + suggestionsCallback: getSuggestions, + itemBuilder: (c, s) => buildSuggestion(c, s, Matrix.of(context).client), + onSelected: (Map suggestion) => + insertSuggestion(context, suggestion), + errorBuilder: (BuildContext context, Object? error) => + const SizedBox.shrink(), + loadingBuilder: (BuildContext context) => const SizedBox.shrink(), + // fix loading briefly flickering a dark box + emptyBuilder: (BuildContext context) => + const SizedBox.shrink(), // fix loading briefly showing no suggestions + ); + } +} diff --git a/lib/pages/chat/pinned_events.dart b/lib/pages/chat/pinned_events.dart new file mode 100644 index 0000000..7ba0a35 --- /dev/null +++ b/lib/pages/chat/pinned_events.dart @@ -0,0 +1,92 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/pages/chat/chat.dart'; +import 'package:fluffychat/pages/chat/chat_app_bar_list_tile.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_modal_action_popup.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; + +class PinnedEvents extends StatelessWidget { + final ChatController controller; + + const PinnedEvents(this.controller, {super.key}); + + Future _displayPinnedEventsDialog(BuildContext context) async { + final eventsResult = await showFutureLoadingDialog( + context: context, + future: () => Future.wait( + controller.room.pinnedEventIds.map( + (eventId) => controller.room.getEventById(eventId), + ), + ), + ); + final events = eventsResult.result; + if (events == null) return; + + final eventId = events.length == 1 + ? events.single?.eventId + : await showModalActionPopup( + context: context, + title: L10n.of(context).pin, + cancelLabel: L10n.of(context).cancel, + actions: events + .map( + (event) => AdaptiveModalAction( + value: event?.eventId ?? '', + icon: const Icon(Icons.push_pin_outlined), + label: event?.calcLocalizedBodyFallback( + MatrixLocals(L10n.of(context)), + withSenderNamePrefix: true, + hideReply: true, + ) ?? + 'UNKNOWN', + ), + ) + .toList(), + ); + + if (eventId != null) controller.scrollToEventId(eventId); + } + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + final pinnedEventIds = controller.room.pinnedEventIds; + + if (pinnedEventIds.isEmpty) { + return const SizedBox.shrink(); + } + + return FutureBuilder( + future: controller.room.getEventById(pinnedEventIds.last), + builder: (context, snapshot) { + final event = snapshot.data; + return ChatAppBarListTile( + title: event?.calcLocalizedBodyFallback( + MatrixLocals(L10n.of(context)), + withSenderNamePrefix: true, + hideReply: true, + ) ?? + L10n.of(context).loadingPleaseWait, + leading: IconButton( + splashRadius: 18, + iconSize: 18, + color: theme.colorScheme.onSurfaceVariant, + icon: const Icon(Icons.push_pin), + tooltip: L10n.of(context).unpin, + onPressed: controller.room.canSendEvent(EventTypes.RoomPinnedEvents) + ? () => controller.unpinEvent(event!.eventId) + : null, + ), + onTap: () => _displayPinnedEventsDialog(context), + ); + }, + ); + } +} diff --git a/lib/pages/chat/reactions_picker.dart b/lib/pages/chat/reactions_picker.dart new file mode 100644 index 0000000..2610a0d --- /dev/null +++ b/lib/pages/chat/reactions_picker.dart @@ -0,0 +1,104 @@ +import 'package:flutter/material.dart'; + +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/config/app_emojis.dart'; +import 'package:fluffychat/pages/chat/chat.dart'; +import '../../config/themes.dart'; + +class ReactionsPicker extends StatelessWidget { + final ChatController controller; + + const ReactionsPicker(this.controller, {super.key}); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + if (controller.showEmojiPicker) return const SizedBox.shrink(); + final display = controller.editEvent == null && + controller.replyEvent == null && + controller.room.canSendDefaultMessages && + controller.selectedEvents.isNotEmpty; + return AnimatedContainer( + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + height: (display) ? 56 : 0, + child: Material( + color: Colors.transparent, + child: Builder( + builder: (context) { + if (!display) { + return const SizedBox.shrink(); + } + final emojis = List.from(AppEmojis.emojis); + final allReactionEvents = controller.selectedEvents.first + .aggregatedEvents( + controller.timeline!, + RelationshipTypes.reaction, + ) + .where( + (event) => + event.senderId == event.room.client.userID && + event.type == 'm.reaction', + ); + + for (final event in allReactionEvents) { + try { + emojis.remove(event.content.tryGetMap('m.relates_to')!['key']); + } catch (_) {} + } + return Row( + children: [ + Expanded( + child: Container( + decoration: BoxDecoration( + color: theme.colorScheme.onInverseSurface, + borderRadius: const BorderRadius.only( + bottomRight: Radius.circular(AppConfig.borderRadius), + ), + ), + padding: const EdgeInsets.only(right: 1), + child: ListView.builder( + scrollDirection: Axis.horizontal, + itemCount: emojis.length, + itemBuilder: (c, i) => InkWell( + borderRadius: BorderRadius.circular(8), + onTap: () => controller.sendEmojiAction(emojis[i]), + child: Container( + width: 56, + height: 56, + alignment: Alignment.center, + child: Text( + emojis[i], + style: const TextStyle(fontSize: 30), + ), + ), + ), + ), + ), + ), + InkWell( + borderRadius: BorderRadius.circular(8), + child: Container( + margin: const EdgeInsets.symmetric(horizontal: 8), + width: 36, + height: 56, + decoration: BoxDecoration( + color: theme.colorScheme.onInverseSurface, + shape: BoxShape.circle, + ), + child: const Icon(Icons.add_outlined), + ), + onTap: () => + controller.pickEmojiReactionAction(allReactionEvents), + ), + ], + ); + }, + ), + ), + ); + } +} diff --git a/lib/pages/chat/recording_dialog.dart b/lib/pages/chat/recording_dialog.dart new file mode 100644 index 0000000..9c3bc10 --- /dev/null +++ b/lib/pages/chat/recording_dialog.dart @@ -0,0 +1,256 @@ +import 'dart:async'; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:path/path.dart' as path_lib; +import 'package:path_provider/path_provider.dart'; +import 'package:record/record.dart'; +import 'package:wakelock_plus/wakelock_plus.dart'; + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/config/setting_keys.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/widgets/matrix.dart'; +import 'events/audio_player.dart'; + +class RecordingDialog extends StatefulWidget { + const RecordingDialog({ + super.key, + }); + + @override + RecordingDialogState createState() => RecordingDialogState(); +} + +class RecordingDialogState extends State { + Timer? _recorderSubscription; + Duration _duration = Duration.zero; + + bool error = false; + + final _audioRecorder = AudioRecorder(); + final List amplitudeTimeline = []; + + String? fileName; + + Future startRecording() async { + final store = Matrix.of(context).store; + try { + final codec = kIsWeb + // Web seems to create webm instead of ogg when using opus encoder + // which does not play on iOS right now. So we use wav for now: + ? AudioEncoder.wav + // Everywhere else we use opus if supported by the platform: + : await _audioRecorder.isEncoderSupported(AudioEncoder.opus) + ? AudioEncoder.opus + : AudioEncoder.aacLc; + fileName = + 'recording${DateTime.now().microsecondsSinceEpoch}.${codec.fileExtension}'; + String? path; + if (!kIsWeb) { + final tempDir = await getTemporaryDirectory(); + path = path_lib.join(tempDir.path, fileName); + } + + final result = await _audioRecorder.hasPermission(); + if (result != true) { + setState(() => error = true); + return; + } + await WakelockPlus.enable(); + + await _audioRecorder.start( + RecordConfig( + bitRate: AppSettings.audioRecordingBitRate.getItem(store), + sampleRate: AppSettings.audioRecordingSamplingRate.getItem(store), + numChannels: AppSettings.audioRecordingNumChannels.getItem(store), + autoGain: AppSettings.audioRecordingAutoGain.getItem(store), + echoCancel: AppSettings.audioRecordingEchoCancel.getItem(store), + noiseSuppress: AppSettings.audioRecordingNoiseSuppress.getItem(store), + encoder: codec, + ), + path: path ?? '', + ); + setState(() => _duration = Duration.zero); + _recorderSubscription?.cancel(); + _recorderSubscription = + Timer.periodic(const Duration(milliseconds: 100), (_) async { + final amplitude = await _audioRecorder.getAmplitude(); + var value = 100 + amplitude.current * 2; + value = value < 1 ? 1 : value; + amplitudeTimeline.add(value); + setState(() { + _duration += const Duration(milliseconds: 100); + }); + }); + } catch (_) { + setState(() => error = true); + rethrow; + } + } + + @override + void initState() { + super.initState(); + startRecording(); + } + + @override + void dispose() { + WakelockPlus.disable(); + _recorderSubscription?.cancel(); + _audioRecorder.stop(); + super.dispose(); + } + + void _stopAndSend() async { + _recorderSubscription?.cancel(); + final path = await _audioRecorder.stop(); + + if (path == null) throw ('Recording failed!'); + const waveCount = AudioPlayerWidget.wavesCount; + final step = amplitudeTimeline.length < waveCount + ? 1 + : (amplitudeTimeline.length / waveCount).round(); + final waveform = []; + for (var i = 0; i < amplitudeTimeline.length; i += step) { + waveform.add((amplitudeTimeline[i] / 100 * 1024).round()); + } + Navigator.of(context, rootNavigator: false).pop( + RecordingResult( + path: path, + duration: _duration.inMilliseconds, + waveform: waveform, + fileName: fileName, + ), + ); + } + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + const maxDecibalWidth = 64.0; + final time = + '${_duration.inMinutes.toString().padLeft(2, '0')}:${(_duration.inSeconds % 60).toString().padLeft(2, '0')}'; + final content = error + ? Text(L10n.of(context).oopsSomethingWentWrong) + : Row( + children: [ + Container( + width: 16, + height: 16, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(32), + color: Colors.red, + ), + ), + Expanded( + child: Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.end, + children: amplitudeTimeline.reversed + .take(26) + .toList() + .reversed + .map( + (amplitude) => Container( + margin: const EdgeInsets.only(left: 2), + width: 4, + decoration: BoxDecoration( + color: theme.colorScheme.primary, + borderRadius: + BorderRadius.circular(AppConfig.borderRadius), + ), + height: maxDecibalWidth * (amplitude / 100), + ), + ) + .toList(), + ), + ), + const SizedBox(width: 8), + SizedBox( + width: 48, + child: Text(time), + ), + ], + ); + if (PlatformInfos.isCupertinoStyle) { + return CupertinoAlertDialog( + content: content, + actions: [ + CupertinoDialogAction( + onPressed: () => Navigator.of(context, rootNavigator: false).pop(), + child: Text( + L10n.of(context).cancel, + style: TextStyle( + color: theme.textTheme.bodyMedium?.color?.withAlpha(150), + ), + ), + ), + if (error != true) + CupertinoDialogAction( + onPressed: _stopAndSend, + child: Text(L10n.of(context).send), + ), + ], + ); + } + return AlertDialog( + content: content, + actions: [ + TextButton( + onPressed: () => Navigator.of(context, rootNavigator: false).pop(), + child: Text( + L10n.of(context).cancel, + style: TextStyle( + color: theme.colorScheme.error, + ), + ), + ), + if (error != true) + TextButton( + onPressed: _stopAndSend, + child: Text(L10n.of(context).send), + ), + ], + ); + } +} + +class RecordingResult { + final String path; + final int duration; + final List waveform; + final String? fileName; + + const RecordingResult({ + required this.path, + required this.duration, + required this.waveform, + required this.fileName, + }); +} + +extension on AudioEncoder { + String get fileExtension { + switch (this) { + case AudioEncoder.aacLc: + case AudioEncoder.aacEld: + case AudioEncoder.aacHe: + return 'm4a'; + case AudioEncoder.opus: + return 'ogg'; + case AudioEncoder.wav: + return 'wav'; + case AudioEncoder.amrNb: + case AudioEncoder.amrWb: + case AudioEncoder.flac: + case AudioEncoder.pcm16bits: + throw UnsupportedError('Not yet used'); + } + } +} diff --git a/lib/pages/chat/recovered_event_dialog.dart b/lib/pages/chat/recovered_event_dialog.dart new file mode 100644 index 0000000..0f7a090 --- /dev/null +++ b/lib/pages/chat/recovered_event_dialog.dart @@ -0,0 +1,67 @@ +import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/pages/chat/events/message.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/adaptive_dialog_action.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; + +class RecoveredEventDialog extends StatefulWidget { + final Event event; + final Timeline timeline; + + const RecoveredEventDialog({ + required this.event, + required this.timeline, + super.key, + }); + + @override + RecoveredEventDialogState createState() => + RecoveredEventDialogState(event, timeline); +} + +class RecoveredEventDialogState extends State { + final Event event; + final Timeline timeline; + RecoveredEventDialogState(this.event, this.timeline); + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + final colors = [ + theme.secondaryBubbleColor, + theme.bubbleColor, + ]; + + final message = Message( + event, + colors: colors, + onInfoTab: (Event ev) => {}, + onMention: () => {}, + onSelect: (Event ev) => {}, + onSwipe: () => {}, + scrollToEventId: (String p0) => {}, + timeline: timeline, + animateIn: false, + displayReadMarker: false, + highlightMarker: false, + longPressSelect: false, + selected: false, + wallpaperMode: false, + ); + + return Scaffold( + appBar: AppBar( + title: Text(L10n.of(context).recoveredMessage) + ), + body: Container( + child: Column( + children: [ + message, + ], + ), + ), + ); + } +} diff --git a/lib/pages/chat/reply_display.dart b/lib/pages/chat/reply_display.dart new file mode 100644 index 0000000..123c61a --- /dev/null +++ b/lib/pages/chat/reply_display.dart @@ -0,0 +1,86 @@ +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; +import '../../config/themes.dart'; +import 'chat.dart'; +import 'events/reply_content.dart'; + +class ReplyDisplay extends StatelessWidget { + final ChatController controller; + const ReplyDisplay(this.controller, {super.key}); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + return AnimatedContainer( + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + height: controller.editEvent != null || controller.replyEvent != null + ? 56 + : 0, + clipBehavior: Clip.hardEdge, + decoration: BoxDecoration( + color: theme.colorScheme.onInverseSurface, + ), + child: Row( + children: [ + IconButton( + tooltip: L10n.of(context).close, + icon: const Icon(Icons.close), + onPressed: controller.cancelReplyEventAction, + ), + Expanded( + child: controller.replyEvent != null + ? ReplyContent( + controller.replyEvent!, + timeline: controller.timeline!, + ) + : _EditContent( + controller.editEvent?.getDisplayEvent(controller.timeline!), + ), + ), + ], + ), + ); + } +} + +class _EditContent extends StatelessWidget { + final Event? event; + + const _EditContent(this.event); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + final event = this.event; + if (event == null) { + return const SizedBox.shrink(); + } + return Row( + children: [ + Icon( + Icons.edit, + color: theme.colorScheme.primary, + ), + Container(width: 15.0), + Text( + event.calcLocalizedBodyFallback( + MatrixLocals(L10n.of(context)), + withSenderNamePrefix: false, + hideReply: true, + ), + overflow: TextOverflow.ellipsis, + maxLines: 1, + style: TextStyle( + color: theme.textTheme.bodyMedium!.color, + ), + ), + ], + ); + } +} diff --git a/lib/pages/chat/seen_by_row.dart b/lib/pages/chat/seen_by_row.dart new file mode 100644 index 0000000..76fa710 --- /dev/null +++ b/lib/pages/chat/seen_by_row.dart @@ -0,0 +1,69 @@ +import 'package:flutter/material.dart'; + +import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/pages/chat/chat.dart'; +import 'package:fluffychat/utils/room_status_extension.dart'; +import 'package:fluffychat/widgets/avatar.dart'; +import 'package:fluffychat/widgets/matrix.dart'; + +class SeenByRow extends StatelessWidget { + final ChatController controller; + const SeenByRow(this.controller, {super.key}); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + final seenByUsers = controller.room.getSeenByUsers(controller.timeline!); + const maxAvatars = 7; + return Container( + width: double.infinity, + alignment: Alignment.center, + child: AnimatedContainer( + constraints: + const BoxConstraints(maxWidth: FluffyThemes.columnWidth * 2.5), + height: seenByUsers.isEmpty ? 0 : 24, + duration: seenByUsers.isEmpty + ? Duration.zero + : FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + alignment: controller.timeline!.events.isNotEmpty && + controller.timeline!.events.first.senderId == + Matrix.of(context).client.userID + ? Alignment.topRight + : Alignment.topLeft, + padding: const EdgeInsets.only(left: 8, right: 8, bottom: 4), + child: Wrap( + spacing: 4, + children: [ + ...(seenByUsers.length > maxAvatars + ? seenByUsers.sublist(0, maxAvatars) + : seenByUsers) + .map( + (user) => Avatar( + mxContent: user.avatarUrl, + name: user.calcDisplayname(), + size: 16, + ), + ), + if (seenByUsers.length > maxAvatars) + SizedBox( + width: 16, + height: 16, + child: Material( + color: theme.colorScheme.surface, + borderRadius: BorderRadius.circular(32), + child: Center( + child: Text( + '+${seenByUsers.length - maxAvatars}', + style: const TextStyle(fontSize: 9), + ), + ), + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/pages/chat/send_file_dialog.dart b/lib/pages/chat/send_file_dialog.dart new file mode 100644 index 0000000..5277d3d --- /dev/null +++ b/lib/pages/chat/send_file_dialog.dart @@ -0,0 +1,468 @@ +import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +import 'package:cross_file/cross_file.dart'; +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:matrix/matrix.dart'; +import 'package:mime/mime.dart'; + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/utils/localized_exception_extension.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_file_extension.dart'; +import 'package:fluffychat/utils/other_party_can_receive.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/utils/size_string.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/adaptive_dialog_action.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/dialog_text_field.dart'; +import '../../utils/resize_video.dart'; +import 'package:matrix/src/utils/markdown.dart'; +import 'package:html_unescape/html_unescape.dart'; + +class SendFileDialog extends StatefulWidget { + final Room room; + final List files; + final BuildContext outerContext; + final Event? replyEvent; + + const SendFileDialog({ + required this.room, + required this.files, + required this.outerContext, + this.replyEvent, + super.key, + }); + + @override + SendFileDialogState createState() => SendFileDialogState(); +} + +class SendFileDialogState extends State { + bool compress = true; + + /// Images smaller than 20kb don't need compression. + static const int minSizeToCompress = 20 * 1000; + + final TextEditingController _labelTextController = TextEditingController(); + + Future _send() async { + final scaffoldMessenger = ScaffoldMessenger.of(widget.outerContext); + final l10n = L10n.of(context); + + try { + if (!widget.room.otherPartyCanReceiveMessages) { + throw OtherPartyCanNotReceiveMessages(); + } + scaffoldMessenger.showLoadingSnackBar(l10n.prepareSendingAttachment); + Navigator.of(context, rootNavigator: false).pop(); + final clientConfig = await widget.room.client.getConfig(); + final maxUploadSize = clientConfig.mUploadSize ?? 100 * 1000 * 1000; + + for (final xfile in widget.files) { + final MatrixFile file; + MatrixImageFile? thumbnail; + final length = await xfile.length(); + final mimeType = xfile.mimeType ?? lookupMimeType(xfile.path); + + // If file is a video, shrink it! + if (PlatformInfos.isMobile && + mimeType != null && + mimeType.startsWith('video') && + length > minSizeToCompress && + compress) { + scaffoldMessenger.showLoadingSnackBar(l10n.compressVideo); + file = await xfile.resizeVideo(); + scaffoldMessenger.showLoadingSnackBar(l10n.generatingVideoThumbnail); + thumbnail = await xfile.getVideoThumbnail(); + } else { + if (length > maxUploadSize) { + throw FileTooBigMatrixException(length, maxUploadSize); + } + // Else we just create a MatrixFile + file = MatrixFile( + bytes: await xfile.readAsBytes(), + name: xfile.name, + mimeType: mimeType, + ).detectFileType; + } + + if (file.bytes.length > maxUploadSize) { + throw FileTooBigMatrixException(length, maxUploadSize); + } + + if (widget.files.length > 1) { + scaffoldMessenger.showLoadingSnackBar( + l10n.sendingAttachmentCountOfCount( + widget.files.indexOf(xfile) + 1, + widget.files.length, + ), + ); + } else { + scaffoldMessenger.clearSnackBars(); + } + + final label = _labelTextController.text.trim(); + final extraContent = {}; + + if (label.isNotEmpty) { + extraContent['body'] = label; + final html = markdown( + label, + getEmotePacks: () => widget.room.getImagePacksFlat(ImagePackUsage.emoticon), + getMention: widget.room.getMention, + convertLinebreaks: Matrix.of(context).client.convertLinebreaksInFormatting, + ); + + // if the decoded html is the same as the body, there is no need in sending a formatted message + if (HtmlUnescape() + .convert(html.replaceAll(RegExp(r'
\n?'), '\n')) != + label) { + extraContent['format'] = 'org.matrix.custom.html'; + extraContent['formatted_body'] = html; + } + } + + if (widget.replyEvent != null) { + extraContent['m.relates_to'] = { + 'm.in_reply_to': { + 'event_id': widget.replyEvent!.eventId, + }, + }; + } + + try { + await widget.room.sendFileEvent( + file, + thumbnail: thumbnail, + shrinkImageMaxDimension: compress ? 1600 : null, + extraContent: extraContent, + ); + } on MatrixException catch (e) { + final retryAfterMs = e.retryAfterMs; + if (e.error != MatrixError.M_LIMIT_EXCEEDED || retryAfterMs == null) { + rethrow; + } + final retryAfterDuration = + Duration(milliseconds: retryAfterMs + 1000); + + scaffoldMessenger.showSnackBar( + SnackBar( + content: Text( + l10n.serverLimitReached(retryAfterDuration.inSeconds), + ), + ), + ); + await Future.delayed(retryAfterDuration); + + scaffoldMessenger.showLoadingSnackBar(l10n.sendingAttachment); + + await widget.room.sendFileEvent( + file, + thumbnail: thumbnail, + shrinkImageMaxDimension: compress ? 1600 : null, + extraContent: extraContent, + ); + } + } + scaffoldMessenger.clearSnackBars(); + } catch (e) { + print('error: ${e.toString()}'); + scaffoldMessenger.clearSnackBars(); + final theme = Theme.of(context); + scaffoldMessenger.showSnackBar( + SnackBar( + backgroundColor: theme.colorScheme.errorContainer, + closeIconColor: theme.colorScheme.onErrorContainer, + content: Text( + e.toLocalizedString(widget.outerContext), + style: TextStyle(color: theme.colorScheme.onErrorContainer), + ), + duration: const Duration(seconds: 30), + showCloseIcon: true, + ), + ); + rethrow; + } + + return; + } + + Future _calcCombinedFileSize() async { + final lengths = + await Future.wait(widget.files.map((file) => file.length())); + return lengths.fold(0, (p, length) => p + length).sizeString; + } + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + var sendStr = L10n.of(context).sendFile; + final uniqueFileType = widget.files + .map((file) => file.mimeType ?? lookupMimeType(file.name)) + .map((mimeType) => mimeType?.split('/').first) + .toSet() + .singleOrNull; + + final fileName = widget.files.length == 1 + ? widget.files.single.name + : L10n.of(context).countFiles(widget.files.length); + final fileTypes = widget.files + .map((file) => file.name.split('.').last) + .toSet() + .join(', ') + .toUpperCase(); + + if (uniqueFileType == 'image') { + if (widget.files.length == 1) { + sendStr = L10n.of(context).sendImage; + } else { + sendStr = L10n.of(context).sendImages(widget.files.length); + } + } else if (uniqueFileType == 'audio') { + sendStr = L10n.of(context).sendAudio; + } else if (uniqueFileType == 'video') { + sendStr = L10n.of(context).sendVideo; + } + + final compressionSupported = + uniqueFileType != 'video' || PlatformInfos.isMobile; + + return FutureBuilder( + future: _calcCombinedFileSize(), + builder: (context, snapshot) { + final sizeString = + snapshot.data ?? L10n.of(context).calculatingFileSize; + + return AlertDialog.adaptive( + title: Text(sendStr), + content: SizedBox( + width: 256, + child: SingleChildScrollView( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + const SizedBox(height: 12), + if (uniqueFileType == 'image') + Padding( + padding: const EdgeInsets.only(bottom: 16.0), + child: SizedBox( + height: 256, + child: Center( + child: ListView.builder( + shrinkWrap: true, + itemCount: widget.files.length, + scrollDirection: Axis.horizontal, + itemBuilder: (context, i) => Padding( + padding: const EdgeInsets.only(right: 8.0), + child: Material( + borderRadius: BorderRadius.circular( + AppConfig.borderRadius / 2, + ), + color: Colors.black, + clipBehavior: Clip.hardEdge, + child: FutureBuilder( + future: widget.files[i].readAsBytes(), + builder: (context, snapshot) { + final bytes = snapshot.data; + if (bytes == null) { + return const Center( + child: CircularProgressIndicator + .adaptive(), + ); + } + if (snapshot.error != null) { + Logs().w( + 'Unable to preview image', + snapshot.error, + snapshot.stackTrace, + ); + return const Center( + child: SizedBox( + width: 256, + height: 256, + child: Icon( + Icons.broken_image_outlined, + size: 64, + ), + ), + ); + } + return Image.memory( + bytes, + height: 256, + width: widget.files.length == 1 + ? 256 - 36 + : null, + fit: BoxFit.contain, + errorBuilder: (context, e, s) { + Logs() + .w('Unable to preview image', e, s); + return const Center( + child: SizedBox( + width: 256, + height: 256, + child: Icon( + Icons.broken_image_outlined, + size: 64, + ), + ), + ); + }, + ); + }, + ), + ), + ), + ), + ), + ), + ), + if (uniqueFileType != 'image') + Padding( + padding: const EdgeInsets.only(bottom: 16.0), + child: Row( + children: [ + Icon( + uniqueFileType == null + ? Icons.description_outlined + : uniqueFileType == 'video' + ? Icons.video_file_outlined + : uniqueFileType == 'audio' + ? Icons.audio_file_outlined + : Icons.description_outlined, + size: 32, + ), + const SizedBox(width: 8), + Expanded( + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + fileName, + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + Text( + '$sizeString - $fileTypes', + style: theme.textTheme.labelSmall, + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + ], + ), + ), + ], + ), + ), + if (widget.files.length == 1) + Padding( + padding: const EdgeInsets.only(bottom: 8.0), + child: DialogTextField( + controller: _labelTextController, + labelText: L10n.of(context).optionalMessage, + minLines: 1, + maxLines: 3, + maxLength: 255, + counterText: '', + ), + ), + // Workaround for SwitchListTile.adaptive crashes in CupertinoDialog + if ({'image', 'video'}.contains(uniqueFileType)) + Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + if ({TargetPlatform.iOS, TargetPlatform.macOS} + .contains(theme.platform)) + CupertinoSwitch( + value: compressionSupported && compress, + onChanged: compressionSupported + ? (v) => setState(() => compress = v) + : null, + ) + else + Switch.adaptive( + value: compressionSupported && compress, + onChanged: compressionSupported + ? (v) => setState(() => compress = v) + : null, + ), + const SizedBox(width: 16), + Expanded( + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + L10n.of(context).compress, + style: theme.textTheme.titleMedium, + textAlign: TextAlign.left, + ), + ], + ), + if (!compress) + Text( + ' ($sizeString)', + style: theme.textTheme.labelSmall, + ), + if (!compressionSupported) + Text( + L10n.of(context).notSupportedOnThisDevice, + style: theme.textTheme.labelSmall, + ), + ], + ), + ), + ], + ), + ], + ), + ), + ), + actions: [ + AdaptiveDialogAction( + onPressed: () => + Navigator.of(context, rootNavigator: false).pop(), + child: Text(L10n.of(context).cancel), + ), + AdaptiveDialogAction( + onPressed: _send, + child: Text(L10n.of(context).send), + ), + ], + ); + }, + ); + } +} + +extension on ScaffoldMessengerState { + ScaffoldFeatureController showLoadingSnackBar( + String title, + ) { + clearSnackBars(); + return showSnackBar( + SnackBar( + duration: const Duration(minutes: 5), + dismissDirection: DismissDirection.none, + content: Row( + children: [ + const SizedBox( + width: 16, + height: 16, + child: CircularProgressIndicator.adaptive( + strokeWidth: 2, + ), + ), + const SizedBox(width: 16), + Text(title), + ], + ), + ), + ); + } +} diff --git a/lib/pages/chat/send_location_dialog.dart b/lib/pages/chat/send_location_dialog.dart new file mode 100644 index 0000000..e13eeba --- /dev/null +++ b/lib/pages/chat/send_location_dialog.dart @@ -0,0 +1,137 @@ +import 'dart:async'; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:geolocator/geolocator.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/pages/chat/events/map_bubble.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/adaptive_dialog_action.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; + +class SendLocationDialog extends StatefulWidget { + final Room room; + + const SendLocationDialog({ + required this.room, + super.key, + }); + + @override + SendLocationDialogState createState() => SendLocationDialogState(); +} + +class SendLocationDialogState extends State { + bool disabled = false; + bool denied = false; + bool isSending = false; + Position? position; + Object? error; + + @override + void initState() { + super.initState(); + requestLocation(); + } + + Future requestLocation() async { + error = null; + if (!(await Geolocator.isLocationServiceEnabled())) { + setState(() => disabled = true); + return; + } + var permission = await Geolocator.checkPermission(); + if (permission == LocationPermission.denied) { + permission = await Geolocator.requestPermission(); + if (permission == LocationPermission.denied) { + setState(() => denied = true); + return; + } + } + if (permission == LocationPermission.deniedForever) { + setState(() => denied = true); + return; + } + try { + Position position; + try { + position = await Geolocator.getCurrentPosition( + locationSettings: const LocationSettings( + accuracy: LocationAccuracy.high, + timeLimit: Duration(seconds: 5), + ), + ); + } on TimeoutException { + position = await Geolocator.getCurrentPosition( + locationSettings: const LocationSettings( + accuracy: LocationAccuracy.medium, + timeLimit: Duration(seconds: 5), + ), + ); + } + setState(() => this.position = position); + } catch (e) { + setState(() => error = e); + } + } + + void sendAction() async { + setState(() => isSending = true); + final body = + 'https://www.openstreetmap.org/?mlat=${position!.latitude}&mlon=${position!.longitude}#map=16/${position!.latitude}/${position!.longitude}'; + final uri = + 'geo:${position!.latitude},${position!.longitude};u=${position!.accuracy}'; + await showFutureLoadingDialog( + context: context, + future: () => widget.room.sendLocation(body, uri), + ); + Navigator.of(context, rootNavigator: false).pop(); + } + + @override + Widget build(BuildContext context) { + Widget contentWidget; + if (position != null) { + contentWidget = MapBubble( + latitude: position!.latitude, + longitude: position!.longitude, + ); + } else if (disabled) { + contentWidget = Text(L10n.of(context).locationDisabledNotice); + } else if (denied) { + contentWidget = Text(L10n.of(context).locationPermissionDeniedNotice); + } else if (error != null) { + contentWidget = + Text(L10n.of(context).errorObtainingLocation(error.toString())); + } else { + contentWidget = Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const CupertinoActivityIndicator(), + const SizedBox(width: 12), + Text(L10n.of(context).obtainingLocation), + ], + ); + } + return AlertDialog.adaptive( + title: Text(L10n.of(context).shareLocation), + content: contentWidget, + actions: [ + AdaptiveDialogAction( + onPressed: Navigator.of(context, rootNavigator: false).pop, + child: Text(L10n.of(context).cancel), + ), + if (error != null) + AdaptiveDialogAction(onPressed: requestLocation, child: Text(L10n.of(context).retry)), + if (position != null) + AdaptiveDialogAction( + onPressed: isSending ? null : sendAction, + child: Text(L10n.of(context).send), + ), + ], + ); + } +} diff --git a/lib/pages/chat/sticker_picker_dialog.dart b/lib/pages/chat/sticker_picker_dialog.dart new file mode 100644 index 0000000..42ace63 --- /dev/null +++ b/lib/pages/chat/sticker_picker_dialog.dart @@ -0,0 +1,161 @@ +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/utils/url_launcher.dart'; +import 'package:fluffychat/widgets/mxc_image.dart'; +import '../../widgets/avatar.dart'; + +class StickerPickerDialog extends StatefulWidget { + final Room room; + final void Function(ImagePackImageContent) onSelected; + + const StickerPickerDialog({ + required this.onSelected, + required this.room, + super.key, + }); + + @override + StickerPickerDialogState createState() => StickerPickerDialogState(); +} + +class StickerPickerDialogState extends State { + String? searchFilter; + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + final stickerPacks = widget.room.getImagePacks(ImagePackUsage.sticker); + final packSlugs = stickerPacks.keys.toList(); + + // ignore: prefer_function_declarations_over_variables + final packBuilder = (BuildContext context, int packIndex) { + final pack = stickerPacks[packSlugs[packIndex]]!; + final filteredImagePackImageEntried = pack.images.entries.toList(); + if (searchFilter?.isNotEmpty ?? false) { + filteredImagePackImageEntried.removeWhere( + (e) => !(e.key.toLowerCase().contains(searchFilter!.toLowerCase()) || + (e.value.body + ?.toLowerCase() + .contains(searchFilter!.toLowerCase()) ?? + false)), + ); + } + final imageKeys = + filteredImagePackImageEntried.map((e) => e.key).toList(); + if (imageKeys.isEmpty) { + return const SizedBox.shrink(); + } + final packName = pack.pack.displayName ?? packSlugs[packIndex]; + return Column( + children: [ + if (packIndex != 0) const SizedBox(height: 20), + if (packName != 'user') + ListTile( + leading: Avatar( + mxContent: pack.pack.avatarUrl, + name: packName, + client: widget.room.client, + ), + title: Text(packName), + ), + const SizedBox(height: 6), + GridView.builder( + itemCount: imageKeys.length, + gridDelegate: const SliverGridDelegateWithMaxCrossAxisExtent( + maxCrossAxisExtent: 128, + ), + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemBuilder: (BuildContext context, int imageIndex) { + final image = pack.images[imageKeys[imageIndex]]!; + return InkWell( + radius: AppConfig.borderRadius, + key: ValueKey(image.url.toString()), + onTap: () { + // copy the image + final imageCopy = + ImagePackImageContent.fromJson(image.toJson().copy()); + // set the body, if it doesn't exist, to the key + imageCopy.body ??= imageKeys[imageIndex]; + widget.onSelected(imageCopy); + }, + child: AbsorbPointer( + absorbing: true, + child: MxcImage( + uri: image.url, + fit: BoxFit.contain, + width: 128, + height: 128, + animated: true, + isThumbnail: false, + ), + ), + ); + }, + ), + ], + ); + }; + + return Scaffold( + backgroundColor: theme.colorScheme.onInverseSurface, + body: SizedBox( + width: double.maxFinite, + child: CustomScrollView( + slivers: [ + SliverAppBar( + floating: true, + pinned: true, + automaticallyImplyLeading: false, + backgroundColor: Colors.transparent, + title: SizedBox( + height: 42, + child: TextField( + autofocus: false, + decoration: InputDecoration( + hintText: L10n.of(context).search, + prefixIcon: const Icon(Icons.search_outlined), + contentPadding: EdgeInsets.zero, + ), + onChanged: (s) => setState(() => searchFilter = s), + ), + ), + ), + if (packSlugs.isEmpty) + SliverFillRemaining( + child: Center( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text(L10n.of(context).noEmotesFound), + const SizedBox(height: 12), + OutlinedButton.icon( + onPressed: () => UrlLauncher( + context, + 'https://matrix.to/#/#fluffychat-stickers:janian.de', + ).launchUrl(), + icon: const Icon(Icons.explore_outlined), + label: Text(L10n.of(context).discover), + ), + ], + ), + ), + ) + else + SliverList( + delegate: SliverChildBuilderDelegate( + packBuilder, + childCount: packSlugs.length, + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/pages/chat/translated_event_dialog.dart b/lib/pages/chat/translated_event_dialog.dart new file mode 100644 index 0000000..879c828 --- /dev/null +++ b/lib/pages/chat/translated_event_dialog.dart @@ -0,0 +1,67 @@ +import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/pages/chat/events/message.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/adaptive_dialog_action.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; + +class TranslatedEventDialog extends StatefulWidget { + final Event event; + final Timeline timeline; + + const TranslatedEventDialog({ + required this.event, + required this.timeline, + super.key, + }); + + @override + TranslatedEventDialogState createState() => + TranslatedEventDialogState(event, timeline); +} + +class TranslatedEventDialogState extends State { + final Event event; + final Timeline timeline; + TranslatedEventDialogState(this.event, this.timeline); + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + final colors = [ + theme.secondaryBubbleColor, + theme.bubbleColor, + ]; + + final message = Message( + event, + colors: colors, + onInfoTab: (Event ev) => {}, + onMention: () => {}, + onSelect: (Event ev) => {}, + onSwipe: () => {}, + scrollToEventId: (String p0) => {}, + timeline: timeline, + animateIn: false, + displayReadMarker: false, + highlightMarker: false, + longPressSelect: false, + selected: false, + wallpaperMode: false, + ); + + return Scaffold( + appBar: AppBar( + title: Text(L10n.of(context).translatedMessage) + ), + body: Container( + child: Column( + children: [ + message, + ], + ), + ), + ); + } +} diff --git a/lib/pages/chat/typing_indicators.dart b/lib/pages/chat/typing_indicators.dart new file mode 100644 index 0000000..7710ee0 --- /dev/null +++ b/lib/pages/chat/typing_indicators.dart @@ -0,0 +1,164 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/pages/chat/chat.dart'; +import 'package:fluffychat/widgets/avatar.dart'; +import 'package:fluffychat/widgets/matrix.dart'; + +class TypingIndicators extends StatelessWidget { + final ChatController controller; + const TypingIndicators(this.controller, {super.key}); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + const avatarSize = Avatar.defaultSize / 2; + + return StreamBuilder( + stream: controller.room.client.onSync.stream.where( + (syncUpdate) => + syncUpdate.rooms?.join?[controller.room.id]?.ephemeral + ?.any((ephemeral) => ephemeral.type == 'm.typing') ?? + false, + ), + builder: (context, _) { + final typingUsers = controller.room.typingUsers + ..removeWhere((u) => u.stateKey == Matrix.of(context).client.userID); + + return Container( + width: double.infinity, + alignment: Alignment.center, + child: AnimatedContainer( + constraints: + const BoxConstraints(maxWidth: FluffyThemes.columnWidth * 2.5), + height: typingUsers.isEmpty ? 0 : avatarSize + 8, + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + alignment: controller.timeline!.events.isNotEmpty && + controller.timeline!.events.first.senderId == + Matrix.of(context).client.userID + ? Alignment.topRight + : Alignment.topLeft, + clipBehavior: Clip.hardEdge, + decoration: const BoxDecoration(), + padding: const EdgeInsets.symmetric( + horizontal: 8.0, + vertical: 4.0, + ), + child: Row( + children: [ + Container( + alignment: Alignment.center, + height: avatarSize, + width: Avatar.defaultSize, + child: Stack( + children: [ + if (typingUsers.isNotEmpty) + Avatar( + size: avatarSize, + mxContent: typingUsers.first.avatarUrl, + name: typingUsers.first.calcDisplayname(), + ), + if (typingUsers.length == 2) + Padding( + padding: const EdgeInsets.only(left: 16), + child: Avatar( + size: avatarSize, + mxContent: typingUsers.length == 2 + ? typingUsers.last.avatarUrl + : null, + name: typingUsers.length == 2 + ? typingUsers.last.calcDisplayname() + : '+${typingUsers.length - 1}', + ), + ), + ], + ), + ), + const SizedBox(width: 8), + Material( + color: theme.colorScheme.surfaceContainerHigh, + borderRadius: const BorderRadius.all( + Radius.circular(AppConfig.borderRadius), + ), + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 8), + child: typingUsers.isEmpty ? null : const _TypingDots(), + ), + ), + ], + ), + ), + ); + }, + ); + } +} + +class _TypingDots extends StatefulWidget { + const _TypingDots(); + + @override + State<_TypingDots> createState() => __TypingDotsState(); +} + +class __TypingDotsState extends State<_TypingDots> { + int _tick = 0; + + late final Timer _timer; + + static const Duration animationDuration = Duration(milliseconds: 300); + + @override + void initState() { + _timer = Timer.periodic( + animationDuration, + (_) { + if (!mounted) { + return; + } + setState(() { + _tick = (_tick + 1) % 4; + }); + }, + ); + super.initState(); + } + + @override + void dispose() { + _timer.cancel(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + const size = 8.0; + + return Row( + mainAxisSize: MainAxisSize.min, + children: [ + for (var i = 1; i <= 3; i++) + AnimatedContainer( + duration: animationDuration * 1.5, + curve: FluffyThemes.animationCurve, + width: size, + height: _tick == i ? size * 2 : size, + margin: EdgeInsets.symmetric( + horizontal: 2, + vertical: _tick == i ? 4 : 8, + ), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(size * 2), + color: theme.colorScheme.secondary, + ), + ), + ], + ); + } +} diff --git a/lib/pages/chat_access_settings/chat_access_settings_controller.dart b/lib/pages/chat_access_settings/chat_access_settings_controller.dart new file mode 100644 index 0000000..0b8a987 --- /dev/null +++ b/lib/pages/chat_access_settings/chat_access_settings_controller.dart @@ -0,0 +1,300 @@ +import 'package:flutter/material.dart' hide Visibility; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/pages/chat_access_settings/chat_access_settings_page.dart'; +import 'package:fluffychat/utils/localized_exception_extension.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_modal_action_popup.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_text_input_dialog.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import 'package:fluffychat/widgets/matrix.dart'; + +class ChatAccessSettings extends StatefulWidget { + final String roomId; + const ChatAccessSettings({required this.roomId, super.key}); + + @override + State createState() => ChatAccessSettingsController(); +} + +class ChatAccessSettingsController extends State { + bool joinRulesLoading = false; + bool visibilityLoading = false; + bool historyVisibilityLoading = false; + bool guestAccessLoading = false; + Room get room => Matrix.of(context).client.getRoomById(widget.roomId)!; + + String get roomVersion => + room + .getState(EventTypes.RoomCreate)! + .content + .tryGet('room_version') ?? + 'Unknown'; + + /// Calculates which join rules are available based on the information on + /// https://spec.matrix.org/v1.11/rooms/#feature-matrix + List get availableJoinRules { + final joinRules = Set.from(JoinRules.values); + + final roomVersionInt = int.tryParse(roomVersion); + + // Knock is only supported for rooms up from version 7: + if (roomVersionInt != null && roomVersionInt <= 6) { + joinRules.remove(JoinRules.knock); + } + + // Not yet supported in FluffyChat: + joinRules.remove(JoinRules.restricted); + joinRules.remove(JoinRules.knockRestricted); + + // If an unsupported join rule is the current join rule, display it: + final currentJoinRule = room.joinRules; + if (currentJoinRule != null) joinRules.add(currentJoinRule); + + return joinRules.toList(); + } + + void setJoinRule(JoinRules? newJoinRules) async { + if (newJoinRules == null) return; + setState(() { + joinRulesLoading = true; + }); + + try { + await room.setJoinRules(newJoinRules); + } catch (e, s) { + Logs().w('Unable to change join rules', e, s); + if (mounted) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text( + e.toLocalizedString(context), + ), + ), + ); + } + } finally { + if (mounted) { + setState(() { + joinRulesLoading = false; + }); + } + } + } + + void setHistoryVisibility(HistoryVisibility? historyVisibility) async { + if (historyVisibility == null) return; + setState(() { + historyVisibilityLoading = true; + }); + + try { + await room.setHistoryVisibility(historyVisibility); + } catch (e, s) { + Logs().w('Unable to change history visibility', e, s); + if (mounted) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text( + e.toLocalizedString(context), + ), + ), + ); + } + } finally { + if (mounted) { + setState(() { + historyVisibilityLoading = false; + }); + } + } + } + + void setGuestAccess(GuestAccess? guestAccess) async { + if (guestAccess == null) return; + setState(() { + guestAccessLoading = true; + }); + + try { + await room.setGuestAccess(guestAccess); + } catch (e, s) { + Logs().w('Unable to change guest access', e, s); + if (mounted) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text( + e.toLocalizedString(context), + ), + ), + ); + } + } finally { + if (mounted) { + setState(() { + guestAccessLoading = false; + }); + } + } + } + + void updateRoomAction() async { + final roomVersion = room + .getState(EventTypes.RoomCreate)! + .content + .tryGet('room_version'); + final capabilitiesResult = await showFutureLoadingDialog( + context: context, + future: () => room.client.getCapabilities(), + ); + final capabilities = capabilitiesResult.result; + if (capabilities == null) return; + final newVersion = await showModalActionPopup( + context: context, + title: L10n.of(context).replaceRoomWithNewerVersion, + cancelLabel: L10n.of(context).cancel, + actions: capabilities.mRoomVersions!.available.entries + .where((r) => r.key != roomVersion) + .map( + (version) => AdaptiveModalAction( + value: version.key, + label: + '${version.key} (${version.value.toString().split('.').last})', + ), + ) + .toList(), + ); + if (newVersion == null || + OkCancelResult.cancel == + await showOkCancelAlertDialog( + useRootNavigator: false, + context: context, + okLabel: L10n.of(context).yes, + cancelLabel: L10n.of(context).cancel, + title: L10n.of(context).areYouSure, + message: L10n.of(context).roomUpgradeDescription, + isDestructive: true, + )) { + return; + } + final result = await showFutureLoadingDialog( + context: context, + future: () => room.client.upgradeRoom(room.id, newVersion), + ); + if (result.error != null) return; + if (!mounted) return; + context.go('/rooms/${room.id}'); + } + + Future addAlias() async { + final domain = room.client.userID?.domain; + if (domain == null) { + throw Exception('userID or domain is null! This should never happen.'); + } + + final input = await showTextInputDialog( + context: context, + title: L10n.of(context).editRoomAliases, + prefixText: '#', + suffixText: domain, + hintText: L10n.of(context).alias, + ); + final aliasLocalpart = input?.trim(); + if (aliasLocalpart == null || aliasLocalpart.isEmpty) return; + final alias = '#$aliasLocalpart:$domain'; + + final result = await showFutureLoadingDialog( + context: context, + future: () => room.client.setRoomAlias(alias, room.id), + ); + if (result.error != null) return; + setState(() {}); + + if (!room.canChangeStateEvent(EventTypes.RoomCanonicalAlias)) return; + + final canonicalAliasConsent = await showOkCancelAlertDialog( + context: context, + title: L10n.of(context).setAsCanonicalAlias, + message: alias, + okLabel: L10n.of(context).yes, + cancelLabel: L10n.of(context).no, + ); + + final altAliases = room + .getState(EventTypes.RoomCanonicalAlias) + ?.content + .tryGetList('alt_aliases') + ?.toSet() ?? + {}; + if (room.canonicalAlias.isNotEmpty) altAliases.add(room.canonicalAlias); + altAliases.add(alias); + if (canonicalAliasConsent == OkCancelResult.ok) { + altAliases.remove(alias); + } else { + altAliases.remove(room.canonicalAlias); + } + + await showFutureLoadingDialog( + context: context, + future: () => room.client.setRoomStateWithKey( + room.id, + EventTypes.RoomCanonicalAlias, + '', + { + 'alias': canonicalAliasConsent == OkCancelResult.ok + ? alias + : room.canonicalAlias, + if (altAliases.isNotEmpty) 'alt_aliases': altAliases.toList(), + }, + ), + ); + } + + void deleteAlias(String alias) async { + await showFutureLoadingDialog( + context: context, + future: () => room.client.deleteRoomAlias(alias), + ); + setState(() {}); + } + + void setChatVisibilityOnDirectory(bool? visibility) async { + if (visibility == null) return; + setState(() { + visibilityLoading = true; + }); + + try { + await room.client.setRoomVisibilityOnDirectory( + room.id, + visibility: visibility == true ? Visibility.public : Visibility.private, + ); + setState(() {}); + } catch (e, s) { + Logs().w('Unable to change visibility', e, s); + if (mounted) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text( + e.toLocalizedString(context), + ), + ), + ); + } + } finally { + if (mounted) { + setState(() { + visibilityLoading = false; + }); + } + } + } + + @override + Widget build(BuildContext context) { + return ChatAccessSettingsPageView(this); + } +} diff --git a/lib/pages/chat_access_settings/chat_access_settings_page.dart b/lib/pages/chat_access_settings/chat_access_settings_page.dart new file mode 100644 index 0000000..8445494 --- /dev/null +++ b/lib/pages/chat_access_settings/chat_access_settings_page.dart @@ -0,0 +1,279 @@ +import 'package:flutter/material.dart' hide Visibility; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/pages/chat_access_settings/chat_access_settings_controller.dart'; +import 'package:fluffychat/utils/fluffy_share.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; +import 'package:fluffychat/widgets/layouts/max_width_body.dart'; + +class ChatAccessSettingsPageView extends StatelessWidget { + final ChatAccessSettingsController controller; + const ChatAccessSettingsPageView(this.controller, {super.key}); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + final room = controller.room; + return Scaffold( + appBar: AppBar( + leading: const Center(child: BackButton()), + title: Text(L10n.of(context).accessAndVisibility), + ), + body: MaxWidthBody( + child: StreamBuilder( + stream: room.client.onRoomState.stream + .where((update) => update.roomId == controller.room.id), + builder: (context, snapshot) { + final canonicalAlias = room.canonicalAlias; + final altAliases = room + .getState(EventTypes.RoomCanonicalAlias) + ?.content + .tryGetList('alt_aliases') ?? + []; + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + ListTile( + title: Text( + L10n.of(context).visibilityOfTheChatHistory, + style: TextStyle( + color: theme.colorScheme.secondary, + fontWeight: FontWeight.bold, + ), + ), + ), + for (final historyVisibility in HistoryVisibility.values) + RadioListTile.adaptive( + title: Text( + historyVisibility + .getLocalizedString(MatrixLocals(L10n.of(context))), + ), + value: historyVisibility, + groupValue: room.historyVisibility, + onChanged: controller.historyVisibilityLoading || + !room.canChangeHistoryVisibility + ? null + : controller.setHistoryVisibility, + ), + Divider(color: theme.dividerColor), + ListTile( + title: Text( + L10n.of(context).whoIsAllowedToJoinThisGroup, + style: TextStyle( + color: theme.colorScheme.secondary, + fontWeight: FontWeight.bold, + ), + ), + ), + for (final joinRule in controller.availableJoinRules) + if (joinRule != JoinRules.private) + RadioListTile.adaptive( + title: Text( + joinRule.localizedString(L10n.of(context)), + ), + value: joinRule, + groupValue: room.joinRules, + onChanged: controller.joinRulesLoading || + !room.canChangeJoinRules + ? null + : controller.setJoinRule, + ), + Divider(color: theme.dividerColor), + if ({JoinRules.public, JoinRules.knock} + .contains(room.joinRules)) ...[ + ListTile( + title: Text( + L10n.of(context).areGuestsAllowedToJoin, + style: TextStyle( + color: theme.colorScheme.secondary, + fontWeight: FontWeight.bold, + ), + ), + ), + for (final guestAccess in GuestAccess.values) + RadioListTile.adaptive( + title: Text( + guestAccess.getLocalizedString( + MatrixLocals(L10n.of(context)), + ), + ), + value: guestAccess, + groupValue: room.guestAccess, + onChanged: controller.guestAccessLoading || + !room.canChangeGuestAccess + ? null + : controller.setGuestAccess, + ), + Divider(color: theme.dividerColor), + ListTile( + title: Text( + L10n.of(context).publicChatAddresses, + style: TextStyle( + color: theme.colorScheme.secondary, + fontWeight: FontWeight.bold, + ), + ), + trailing: IconButton( + icon: const Icon(Icons.add_outlined), + tooltip: L10n.of(context).createNewAddress, + onPressed: controller.addAlias, + ), + ), + if (canonicalAlias.isNotEmpty) + _AliasListTile( + alias: canonicalAlias, + onDelete: room.canChangeStateEvent( + EventTypes.RoomCanonicalAlias, + ) + ? () => controller.deleteAlias(canonicalAlias) + : null, + isCanonicalAlias: true, + ), + for (final alias in altAliases) + _AliasListTile( + alias: alias, + onDelete: room.canChangeStateEvent( + EventTypes.RoomCanonicalAlias, + ) + ? () => controller.deleteAlias(alias) + : null, + ), + FutureBuilder( + future: room.client.getLocalAliases(room.id), + builder: (context, snapshot) { + final localAddresses = snapshot.data; + if (localAddresses == null) { + return const SizedBox.shrink(); + } + localAddresses.remove(room.canonicalAlias); + localAddresses + .removeWhere((alias) => altAliases.contains(alias)); + return Column( + mainAxisSize: MainAxisSize.min, + children: localAddresses + .map( + (alias) => _AliasListTile( + alias: alias, + published: false, + onDelete: () => controller.deleteAlias(alias), + ), + ) + .toList(), + ); + }, + ), + Divider(color: theme.dividerColor), + FutureBuilder( + future: room.client.getRoomVisibilityOnDirectory(room.id), + builder: (context, snapshot) => SwitchListTile.adaptive( + value: snapshot.data == Visibility.public, + title: Text( + L10n.of(context).chatCanBeDiscoveredViaSearchOnServer( + room.client.userID!.domain!, + ), + ), + onChanged: controller.setChatVisibilityOnDirectory, + ), + ), + ], + ListTile( + title: Text(L10n.of(context).globalChatId), + subtitle: SelectableText(room.id), + trailing: IconButton( + icon: const Icon(Icons.copy_outlined), + onPressed: () => FluffyShare.share(room.id, context), + ), + ), + ListTile( + title: Text(L10n.of(context).roomVersion), + subtitle: SelectableText( + room + .getState(EventTypes.RoomCreate)! + .content + .tryGet('room_version') ?? + 'Unknown', + ), + trailing: room.canSendEvent(EventTypes.RoomTombstone) + ? IconButton( + icon: const Icon(Icons.upgrade_outlined), + onPressed: controller.updateRoomAction, + ) + : null, + ), + ], + ); + }, + ), + ), + ); + } +} + +class _AliasListTile extends StatelessWidget { + const _AliasListTile({ + required this.alias, + required this.onDelete, + this.isCanonicalAlias = false, + this.published = true, + }); + + final String alias; + final void Function()? onDelete; + final bool isCanonicalAlias; + final bool published; + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + return ListTile( + leading: isCanonicalAlias + ? const Icon(Icons.star) + : const Icon(Icons.link_outlined), + title: InkWell( + onTap: () => FluffyShare.share( + 'https://matrix.to/#/$alias', + context, + ), + child: SelectableText( + alias, + style: TextStyle( + decoration: TextDecoration.underline, + decorationColor: theme.colorScheme.primary, + color: theme.colorScheme.primary, + fontSize: 14, + ), + ), + ), + trailing: onDelete != null + ? IconButton( + color: theme.colorScheme.error, + icon: const Icon(Icons.delete_outlined), + onPressed: onDelete, + ) + : null, + ); + } +} + +extension JoinRulesDisplayString on JoinRules { + String localizedString(L10n l10n) { + switch (this) { + case JoinRules.public: + return l10n.anyoneCanJoin; + case JoinRules.invite: + return l10n.invitedUsersOnly; + case JoinRules.knock: + return l10n.usersMustKnock; + case JoinRules.private: + return l10n.noOneCanJoin; + case JoinRules.restricted: + return l10n.restricted; + case JoinRules.knockRestricted: + return l10n.knockRestricted; + } + } +} diff --git a/lib/pages/chat_details/chat_details.dart b/lib/pages/chat_details/chat_details.dart new file mode 100644 index 0000000..9f95220 --- /dev/null +++ b/lib/pages/chat_details/chat_details.dart @@ -0,0 +1,183 @@ +import 'package:flutter/material.dart'; + +import 'package:collection/collection.dart'; +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:go_router/go_router.dart'; +import 'package:image_picker/image_picker.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/pages/chat_details/chat_details_view.dart'; +import 'package:fluffychat/pages/settings/settings.dart'; +import 'package:fluffychat/utils/file_selector.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_modal_action_popup.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_text_input_dialog.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import 'package:fluffychat/widgets/matrix.dart'; + +enum AliasActions { copy, delete, setCanonical } + +class ChatDetails extends StatefulWidget { + final String roomId; + final Widget? embeddedCloseButton; + + const ChatDetails({ + super.key, + required this.roomId, + this.embeddedCloseButton, + }); + + @override + ChatDetailsController createState() => ChatDetailsController(); +} + +class ChatDetailsController extends State { + bool displaySettings = false; + + void toggleDisplaySettings() => + setState(() => displaySettings = !displaySettings); + + String? get roomId => widget.roomId; + + void setDisplaynameAction() async { + final room = Matrix.of(context).client.getRoomById(roomId!)!; + final input = await showTextInputDialog( + context: context, + title: L10n.of(context).changeTheNameOfTheGroup, + okLabel: L10n.of(context).ok, + cancelLabel: L10n.of(context).cancel, + initialText: room.getLocalizedDisplayname( + MatrixLocals( + L10n.of(context), + ), + ), + ); + if (input == null) return; + final success = await showFutureLoadingDialog( + context: context, + future: () => room.setName(input), + ); + if (success.error == null) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text(L10n.of(context).displaynameHasBeenChanged)), + ); + } + } + + void setTopicAction() async { + final room = Matrix.of(context).client.getRoomById(roomId!)!; + final input = await showTextInputDialog( + context: context, + title: L10n.of(context).setChatDescription, + okLabel: L10n.of(context).ok, + cancelLabel: L10n.of(context).cancel, + hintText: L10n.of(context).noChatDescriptionYet, + initialText: room.topic, + minLines: 4, + maxLines: 8, + ); + if (input == null) return; + final success = await showFutureLoadingDialog( + context: context, + future: () => room.setDescription(input), + ); + if (success.error == null) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text(L10n.of(context).chatDescriptionHasBeenChanged), + ), + ); + } + } + + void goToEmoteSettings() async { + final room = Matrix.of(context).client.getRoomById(roomId!)!; + // okay, we need to test if there are any emote state events other than the default one + // if so, we need to be directed to a selection screen for which pack we want to look at + // otherwise, we just open the normal one. + if ((room.states['im.ponies.room_emotes'] ?? {}) + .keys + .any((String s) => s.isNotEmpty)) { + context.push('/rooms/${room.id}/details/multiple_emotes'); + } else { + context.push('/rooms/${room.id}/details/emotes'); + } + } + + void setAvatarAction() async { + final room = Matrix.of(context).client.getRoomById(roomId!); + final actions = [ + if (PlatformInfos.isMobile) + AdaptiveModalAction( + value: AvatarAction.camera, + label: L10n.of(context).openCamera, + isDefaultAction: true, + icon: const Icon(Icons.camera_alt_outlined), + ), + AdaptiveModalAction( + value: AvatarAction.file, + label: L10n.of(context).openGallery, + icon: const Icon(Icons.photo_outlined), + ), + if (room?.avatar != null) + AdaptiveModalAction( + value: AvatarAction.remove, + label: L10n.of(context).delete, + isDestructive: true, + icon: const Icon(Icons.delete_outlined), + ), + ]; + final action = actions.length == 1 + ? actions.single.value + : await showModalActionPopup( + context: context, + title: L10n.of(context).editRoomAvatar, + cancelLabel: L10n.of(context).cancel, + actions: actions, + ); + if (action == null) return; + if (action == AvatarAction.remove) { + await showFutureLoadingDialog( + context: context, + future: () => room!.setAvatar(null), + ); + return; + } + MatrixFile file; + if (PlatformInfos.isMobile) { + final result = await ImagePicker().pickImage( + source: action == AvatarAction.camera + ? ImageSource.camera + : ImageSource.gallery, + imageQuality: 50, + ); + if (result == null) return; + file = MatrixFile( + bytes: await result.readAsBytes(), + name: result.path, + ); + } else { + final picked = await selectFiles( + context, + allowMultiple: false, + type: FileSelectorType.images, + ); + final pickedFile = picked.firstOrNull; + if (pickedFile == null) return; + file = MatrixFile( + bytes: await pickedFile.readAsBytes(), + name: pickedFile.name, + ); + } + await showFutureLoadingDialog( + context: context, + future: () => room!.setAvatar(file), + ); + } + + static const fixedWidth = 360.0; + + @override + Widget build(BuildContext context) => ChatDetailsView(this); +} diff --git a/lib/pages/chat_details/chat_details_view.dart b/lib/pages/chat_details/chat_details_view.dart new file mode 100644 index 0000000..07527e3 --- /dev/null +++ b/lib/pages/chat_details/chat_details_view.dart @@ -0,0 +1,369 @@ +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:flutter_linkify/flutter_linkify.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/pages/chat_details/chat_details.dart'; +import 'package:fluffychat/pages/chat_details/participant_list_item.dart'; +import 'package:fluffychat/utils/fluffy_share.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; +import 'package:fluffychat/widgets/avatar.dart'; +import 'package:fluffychat/widgets/chat_settings_popup_menu.dart'; +import 'package:fluffychat/widgets/layouts/max_width_body.dart'; +import 'package:fluffychat/widgets/matrix.dart'; +import '../../utils/url_launcher.dart'; +import '../../widgets/mxc_image_viewer.dart'; +import '../../widgets/qr_code_viewer.dart'; + +class ChatDetailsView extends StatelessWidget { + final ChatDetailsController controller; + + const ChatDetailsView(this.controller, {super.key}); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + final room = Matrix.of(context).client.getRoomById(controller.roomId!); + if (room == null) { + return Scaffold( + appBar: AppBar( + title: Text(L10n.of(context).oopsSomethingWentWrong), + ), + body: Center( + child: Text(L10n.of(context).youAreNoLongerParticipatingInThisChat), + ), + ); + } + + final directChatMatrixID = room.directChatMatrixID; + final roomAvatar = room.avatar; + + return StreamBuilder( + stream: room.client.onRoomState.stream + .where((update) => update.roomId == room.id), + builder: (context, snapshot) { + var members = room.getParticipants().toList() + ..sort((b, a) => a.powerLevel.compareTo(b.powerLevel)); + members = members.take(10).toList(); + final actualMembersCount = (room.summary.mInvitedMemberCount ?? 0) + + (room.summary.mJoinedMemberCount ?? 0); + final canRequestMoreMembers = members.length < actualMembersCount; + final iconColor = theme.textTheme.bodyLarge!.color; + final displayname = room.getLocalizedDisplayname( + MatrixLocals(L10n.of(context)), + ); + return Scaffold( + appBar: AppBar( + leading: controller.widget.embeddedCloseButton ?? + const Center(child: BackButton()), + elevation: theme.appBarTheme.elevation, + actions: [ + if (room.canonicalAlias.isNotEmpty) + IconButton( + tooltip: L10n.of(context).share, + icon: const Icon(Icons.qr_code_rounded), + onPressed: () => showQrCodeViewer( + context, + room.canonicalAlias, + ), + ) + else if (directChatMatrixID != null) + IconButton( + tooltip: L10n.of(context).share, + icon: const Icon(Icons.qr_code_rounded), + onPressed: () => showQrCodeViewer( + context, + directChatMatrixID, + ), + ), + if (controller.widget.embeddedCloseButton == null) + ChatSettingsPopupMenu(room, false), + ], + title: Text(L10n.of(context).chatDetails), + backgroundColor: theme.appBarTheme.backgroundColor, + ), + body: MaxWidthBody( + child: ListView.builder( + physics: const NeverScrollableScrollPhysics(), + shrinkWrap: true, + itemCount: members.length + 1 + (canRequestMoreMembers ? 1 : 0), + itemBuilder: (BuildContext context, int i) => i == 0 + ? Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Row( + children: [ + Padding( + padding: const EdgeInsets.all(32.0), + child: Stack( + children: [ + Hero( + tag: + controller.widget.embeddedCloseButton != + null + ? 'embedded_content_banner' + : 'content_banner', + child: Avatar( + mxContent: room.avatar, + name: displayname, + size: Avatar.defaultSize * 2.5, + onTap: roomAvatar != null + ? () => showDialog( + context: context, + builder: (_) => + MxcImageViewer(roomAvatar), + ) + : null, + ), + ), + if (!room.isDirectChat && + room.canChangeStateEvent( + EventTypes.RoomAvatar, + )) + Positioned( + bottom: 0, + right: 0, + child: FloatingActionButton.small( + onPressed: controller.setAvatarAction, + heroTag: null, + child: const Icon( + Icons.camera_alt_outlined, + ), + ), + ), + ], + ), + ), + Expanded( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + TextButton.icon( + onPressed: () => room.isDirectChat + ? null + : room.canChangeStateEvent( + EventTypes.RoomName, + ) + ? controller.setDisplaynameAction() + : FluffyShare.share( + displayname, + context, + copyOnly: true, + ), + icon: Icon( + room.isDirectChat + ? Icons.chat_bubble_outline + : room.canChangeStateEvent( + EventTypes.RoomName, + ) + ? Icons.edit_outlined + : Icons.copy_outlined, + size: 16, + ), + style: TextButton.styleFrom( + foregroundColor: + theme.colorScheme.onSurface, + iconColor: theme.colorScheme.onSurface, + ), + label: Text( + room.isDirectChat + ? L10n.of(context).directChat + : displayname, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: const TextStyle(fontSize: 18), + ), + ), + TextButton.icon( + onPressed: () => room.isDirectChat + ? null + : context.push( + '/rooms/${controller.roomId}/details/members', + ), + icon: const Icon( + Icons.group_outlined, + size: 14, + ), + style: TextButton.styleFrom( + foregroundColor: + theme.colorScheme.secondary, + iconColor: theme.colorScheme.secondary, + ), + label: Text( + L10n.of(context).countParticipants( + actualMembersCount, + ), + maxLines: 1, + overflow: TextOverflow.ellipsis, + // style: const TextStyle(fontSize: 12), + ), + ), + ], + ), + ), + ], + ), + Divider(color: theme.dividerColor), + if (!room.canChangeStateEvent(EventTypes.RoomTopic)) + ListTile( + title: Text( + L10n.of(context).chatDescription, + style: TextStyle( + color: theme.colorScheme.secondary, + fontWeight: FontWeight.bold, + ), + ), + ) + else + Padding( + padding: const EdgeInsets.all(16.0), + child: TextButton.icon( + onPressed: controller.setTopicAction, + label: Text(L10n.of(context).setChatDescription), + icon: const Icon(Icons.edit_outlined), + style: TextButton.styleFrom( + iconColor: + theme.colorScheme.onSecondaryContainer, + backgroundColor: + theme.colorScheme.secondaryContainer, + foregroundColor: + theme.colorScheme.onSecondaryContainer, + ), + ), + ), + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 16.0, + ), + child: SelectableLinkify( + text: room.topic.isEmpty + ? L10n.of(context).noChatDescriptionYet + : room.topic, + textScaleFactor: + MediaQuery.textScalerOf(context).scale(1), + options: const LinkifyOptions(humanize: false), + linkStyle: const TextStyle( + color: Colors.blueAccent, + decorationColor: Colors.blueAccent, + ), + style: TextStyle( + fontSize: 14, + fontStyle: room.topic.isEmpty + ? FontStyle.italic + : FontStyle.normal, + color: theme.textTheme.bodyMedium!.color, + decorationColor: + theme.textTheme.bodyMedium!.color, + ), + onOpen: (url) => + UrlLauncher(context, url.url).launchUrl(), + ), + ), + const SizedBox(height: 16), + Divider(color: theme.dividerColor), + ListTile( + leading: CircleAvatar( + backgroundColor: theme.scaffoldBackgroundColor, + foregroundColor: iconColor, + child: const Icon( + Icons.insert_emoticon_outlined, + ), + ), + title: Text(L10n.of(context).customEmojisAndStickers), + subtitle: Text(L10n.of(context).setCustomEmotes), + onTap: controller.goToEmoteSettings, + trailing: const Icon(Icons.chevron_right_outlined), + ), + if (!room.isDirectChat) + ListTile( + leading: CircleAvatar( + backgroundColor: theme.scaffoldBackgroundColor, + foregroundColor: iconColor, + child: const Icon(Icons.shield_outlined), + ), + title: Text( + L10n.of(context).accessAndVisibility, + ), + subtitle: Text( + L10n.of(context).accessAndVisibilityDescription, + ), + onTap: () => context + .push('/rooms/${room.id}/details/access'), + trailing: const Icon(Icons.chevron_right_outlined), + ), + if (!room.isDirectChat) + ListTile( + title: Text(L10n.of(context).chatPermissions), + subtitle: Text( + L10n.of(context).whoCanPerformWhichAction, + ), + leading: CircleAvatar( + backgroundColor: theme.scaffoldBackgroundColor, + foregroundColor: iconColor, + child: const Icon( + Icons.edit_attributes_outlined, + ), + ), + trailing: const Icon(Icons.chevron_right_outlined), + onTap: () => context + .push('/rooms/${room.id}/details/permissions'), + ), + Divider(color: theme.dividerColor), + ListTile( + title: Text( + L10n.of(context).countParticipants( + actualMembersCount, + ), + style: TextStyle( + color: theme.colorScheme.secondary, + fontWeight: FontWeight.bold, + ), + ), + ), + if (!room.isDirectChat && room.canInvite) + ListTile( + title: Text(L10n.of(context).inviteContact), + leading: CircleAvatar( + backgroundColor: + theme.colorScheme.primaryContainer, + foregroundColor: + theme.colorScheme.onPrimaryContainer, + radius: Avatar.defaultSize / 2, + child: const Icon(Icons.add_outlined), + ), + trailing: const Icon(Icons.chevron_right_outlined), + onTap: () => context.go('/rooms/${room.id}/invite'), + ), + ], + ) + : i < members.length + 1 + ? ParticipantListItem(members[i - 1]) + : ListTile( + title: Text( + L10n.of(context).loadCountMoreParticipants( + (actualMembersCount - members.length), + ), + ), + leading: CircleAvatar( + backgroundColor: theme.scaffoldBackgroundColor, + child: const Icon( + Icons.group_outlined, + color: Colors.grey, + ), + ), + onTap: () => context.push( + '/rooms/${controller.roomId!}/details/members', + ), + trailing: const Icon(Icons.chevron_right_outlined), + ), + ), + ), + ); + }, + ); + } +} diff --git a/lib/pages/chat_details/participant_list_item.dart b/lib/pages/chat_details/participant_list_item.dart new file mode 100644 index 0000000..dc11a03 --- /dev/null +++ b/lib/pages/chat_details/participant_list_item.dart @@ -0,0 +1,102 @@ +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/widgets/member_actions_popup_menu_button.dart'; +import '../../widgets/avatar.dart'; + +class ParticipantListItem extends StatelessWidget { + final User user; + + const ParticipantListItem(this.user, {super.key}); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + final membershipBatch = switch (user.membership) { + Membership.ban => L10n.of(context).banned, + Membership.invite => L10n.of(context).invited, + Membership.join => null, + Membership.knock => L10n.of(context).knocking, + Membership.leave => L10n.of(context).leftTheChat, + }; + + final permissionBatch = user.powerLevel >= 100 + ? L10n.of(context).admin + : user.powerLevel >= 50 + ? L10n.of(context).moderator + : ''; + + return ListTile( + onTap: () => showMemberActionsPopupMenu(context: context, user: user), + title: Row( + children: [ + Expanded( + child: Text( + user.calcDisplayname(), + overflow: TextOverflow.ellipsis, + ), + ), + if (permissionBatch.isNotEmpty) + Container( + padding: const EdgeInsets.symmetric( + horizontal: 12, + vertical: 6, + ), + decoration: BoxDecoration( + color: user.powerLevel >= 100 + ? theme.colorScheme.tertiary + : theme.colorScheme.tertiaryContainer, + borderRadius: BorderRadius.circular( + AppConfig.borderRadius, + ), + ), + child: Text( + permissionBatch, + style: theme.textTheme.labelSmall?.copyWith( + color: user.powerLevel >= 100 + ? theme.colorScheme.onTertiary + : theme.colorScheme.onTertiaryContainer, + ), + ), + ), + membershipBatch == null + ? const SizedBox.shrink() + : Container( + padding: + const EdgeInsets.symmetric(vertical: 4, horizontal: 8), + margin: const EdgeInsets.symmetric(horizontal: 8), + decoration: BoxDecoration( + color: theme.colorScheme.secondaryContainer, + borderRadius: BorderRadius.circular(8), + ), + child: Center( + child: Text( + membershipBatch, + style: theme.textTheme.labelSmall?.copyWith( + color: theme.colorScheme.onSecondaryContainer, + ), + ), + ), + ), + ], + ), + subtitle: Text( + user.id, + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + leading: Opacity( + opacity: user.membership == Membership.join ? 1 : 0.5, + child: Avatar( + mxContent: user.avatarUrl, + name: user.calcDisplayname(), + presenceUserId: user.stateKey, + ), + ), + ); + } +} diff --git a/lib/pages/chat_encryption_settings/chat_encryption_settings.dart b/lib/pages/chat_encryption_settings/chat_encryption_settings.dart new file mode 100644 index 0000000..339172b --- /dev/null +++ b/lib/pages/chat_encryption_settings/chat_encryption_settings.dart @@ -0,0 +1,99 @@ +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/encryption.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/pages/chat_encryption_settings/chat_encryption_settings_view.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import 'package:fluffychat/widgets/matrix.dart'; +import '../key_verification/key_verification_dialog.dart'; + +class ChatEncryptionSettings extends StatefulWidget { + const ChatEncryptionSettings({super.key}); + + @override + ChatEncryptionSettingsController createState() => + ChatEncryptionSettingsController(); +} + +class ChatEncryptionSettingsController extends State { + String? get roomId => GoRouterState.of(context).pathParameters['roomid']; + + Room get room => Matrix.of(context).client.getRoomById(roomId!)!; + + Future unblock(DeviceKeys key) async { + if (key.blocked) { + await key.setBlocked(false); + } + } + + void enableEncryption(_) async { + if (room.encrypted) { + showOkAlertDialog( + context: context, + title: L10n.of(context).sorryThatsNotPossible, + message: L10n.of(context).disableEncryptionWarning, + ); + return; + } + if (room.joinRules == JoinRules.public) { + showOkAlertDialog( + context: context, + title: L10n.of(context).sorryThatsNotPossible, + message: L10n.of(context).noEncryptionForPublicRooms, + ); + return; + } + if (!room.canChangeStateEvent(EventTypes.Encryption)) { + showOkAlertDialog( + context: context, + title: L10n.of(context).sorryThatsNotPossible, + message: L10n.of(context).noPermission, + ); + return; + } + final consent = await showOkCancelAlertDialog( + context: context, + title: L10n.of(context).areYouSure, + message: L10n.of(context).enableEncryptionWarning, + okLabel: L10n.of(context).yes, + cancelLabel: L10n.of(context).cancel, + ); + if (consent != OkCancelResult.ok) return; + await showFutureLoadingDialog( + context: context, + future: () => room.enableEncryption(), + ); + } + + void startVerification() async { + final consent = await showOkCancelAlertDialog( + context: context, + title: L10n.of(context).verifyOtherUser, + message: L10n.of(context).verifyOtherUserDescription, + okLabel: L10n.of(context).ok, + cancelLabel: L10n.of(context).cancel, + ); + if (consent != OkCancelResult.ok) return; + final req = await room.client.userDeviceKeys[room.directChatMatrixID]! + .startVerification(); + req.onUpdate = () { + if (req.state == KeyVerificationState.done) { + setState(() {}); + } + }; + await KeyVerificationDialog(request: req).show(context); + } + + void toggleDeviceKey(DeviceKeys key) { + setState(() { + key.setBlocked(!key.blocked); + }); + } + + @override + Widget build(BuildContext context) => ChatEncryptionSettingsView(this); +} diff --git a/lib/pages/chat_encryption_settings/chat_encryption_settings_view.dart b/lib/pages/chat_encryption_settings/chat_encryption_settings_view.dart new file mode 100644 index 0000000..4c37f22 --- /dev/null +++ b/lib/pages/chat_encryption_settings/chat_encryption_settings_view.dart @@ -0,0 +1,199 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart'; +import 'package:url_launcher/url_launcher_string.dart'; + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/pages/chat_encryption_settings/chat_encryption_settings.dart'; +import 'package:fluffychat/utils/beautify_string_extension.dart'; +import 'package:fluffychat/widgets/layouts/max_width_body.dart'; + +class ChatEncryptionSettingsView extends StatelessWidget { + final ChatEncryptionSettingsController controller; + + const ChatEncryptionSettingsView(this.controller, {super.key}); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + final room = controller.room; + return StreamBuilder( + stream: room.client.onSync.stream.where( + (s) => s.rooms?.join?[room.id] != null || s.deviceLists != null, + ), + builder: (context, _) => Scaffold( + appBar: AppBar( + leading: IconButton( + icon: const Icon(Icons.close_outlined), + onPressed: () => context.go('/rooms/${controller.roomId!}'), + ), + title: Text(L10n.of(context).encryption), + actions: [ + TextButton( + onPressed: () => launchUrlString(AppConfig.encryptionTutorial), + child: Text(L10n.of(context).help), + ), + ], + ), + body: MaxWidthBody( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + SwitchListTile( + secondary: CircleAvatar( + foregroundColor: theme.colorScheme.onPrimaryContainer, + backgroundColor: theme.colorScheme.primaryContainer, + child: const Icon(Icons.lock_outlined), + ), + title: Text(L10n.of(context).encryptThisChat), + value: room.encrypted, + onChanged: controller.enableEncryption, + ), + Icon( + CupertinoIcons.lock_shield, + size: 128, + color: theme.colorScheme.onInverseSurface, + ), + const Divider(), + if (room.isDirectChat) + Padding( + padding: const EdgeInsets.all(16.0), + child: SizedBox( + width: double.infinity, + child: ElevatedButton.icon( + onPressed: controller.startVerification, + icon: const Icon(Icons.verified_outlined), + label: Text(L10n.of(context).verifyStart), + ), + ), + ), + if (room.encrypted) ...[ + const SizedBox(height: 16), + ListTile( + title: Text( + L10n.of(context).deviceKeys, + style: const TextStyle( + fontWeight: FontWeight.bold, + ), + ), + ), + StreamBuilder( + stream: room.client.onRoomState.stream + .where((update) => update.roomId == controller.room.id), + builder: (context, snapshot) => + FutureBuilder>( + future: room.getUserDeviceKeys(), + builder: (BuildContext context, snapshot) { + if (snapshot.hasError) { + return Center( + child: Text( + '${L10n.of(context).oopsSomethingWentWrong}: ${snapshot.error}', + ), + ); + } + if (!snapshot.hasData) { + return const Center( + child: CircularProgressIndicator.adaptive( + strokeWidth: 2, + ), + ); + } + final deviceKeys = snapshot.data!; + return ListView.builder( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemCount: deviceKeys.length, + itemBuilder: (BuildContext context, int i) => + SwitchListTile( + value: !deviceKeys[i].blocked, + activeColor: deviceKeys[i].verified + ? Colors.green + : Colors.orange, + onChanged: (_) => + controller.toggleDeviceKey(deviceKeys[i]), + title: Row( + children: [ + Icon( + deviceKeys[i].verified + ? Icons.verified_outlined + : deviceKeys[i].blocked + ? Icons.block_outlined + : Icons.info_outlined, + color: deviceKeys[i].verified + ? Colors.green + : deviceKeys[i].blocked + ? Colors.red + : Colors.orange, + size: 20, + ), + const SizedBox(width: 4), + Text( + deviceKeys[i].deviceId ?? + L10n.of(context).unknownDevice, + ), + const SizedBox(width: 4), + Flexible( + fit: FlexFit.loose, + child: Material( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular( + AppConfig.borderRadius, + ), + side: BorderSide( + color: theme.colorScheme.primary, + ), + ), + color: theme.colorScheme.primaryContainer, + child: Padding( + padding: const EdgeInsets.all(4.0), + child: Text( + deviceKeys[i].userId, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle( + color: theme.colorScheme.primary, + fontSize: 12, + fontStyle: FontStyle.italic, + ), + ), + ), + ), + ), + ], + ), + subtitle: Text( + deviceKeys[i].ed25519Key?.beautified ?? + L10n.of(context).unknownEncryptionAlgorithm, + style: TextStyle( + fontFamily: 'RobotoMono', + color: theme.colorScheme.secondary, + ), + ), + ), + ); + }, + ), + ), + ] else + Padding( + padding: const EdgeInsets.all(16.0), + child: Center( + child: Text( + L10n.of(context).encryptionNotEnabled, + style: const TextStyle( + fontStyle: FontStyle.italic, + ), + ), + ), + ), + ], + ), + ), + ), + ); + } +} diff --git a/lib/pages/chat_list/chat_list.dart b/lib/pages/chat_list/chat_list.dart new file mode 100644 index 0000000..58a0870 --- /dev/null +++ b/lib/pages/chat_list/chat_list.dart @@ -0,0 +1,947 @@ +import 'dart:async'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +import 'package:app_links/app_links.dart'; +import 'package:cross_file/cross_file.dart'; +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:flutter_shortcuts_new/flutter_shortcuts_new.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart' as sdk; +import 'package:matrix/matrix.dart'; +import 'package:receive_sharing_intent/receive_sharing_intent.dart'; + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/pages/chat_list/chat_list_view.dart'; +import 'package:fluffychat/utils/localized_exception_extension.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/utils/show_scaffold_dialog.dart'; +import 'package:fluffychat/utils/show_update_snackbar.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_modal_action_popup.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_text_input_dialog.dart'; +import 'package:fluffychat/widgets/avatar.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import 'package:fluffychat/widgets/share_scaffold_dialog.dart'; +import '../../../utils/account_bundles.dart'; +import '../../config/setting_keys.dart'; +import '../../utils/url_launcher.dart'; +import '../../widgets/matrix.dart'; +import '../bootstrap/bootstrap_dialog.dart'; + +import 'package:fluffychat/utils/tor_stub.dart' + if (dart.library.html) 'package:tor_detector_web/tor_detector_web.dart'; + +enum PopupMenuAction { + settings, + invite, + newGroup, + newSpace, + setStatus, + archive, +} + +enum ActiveFilter { + allChats, + messages, + groups, + unread, + spaces, +} + +extension LocalizedActiveFilter on ActiveFilter { + String toLocalizedString(BuildContext context) { + switch (this) { + case ActiveFilter.allChats: + return L10n.of(context).all; + case ActiveFilter.messages: + return L10n.of(context).messages; + case ActiveFilter.unread: + return L10n.of(context).unread; + case ActiveFilter.groups: + return L10n.of(context).groups; + case ActiveFilter.spaces: + return L10n.of(context).spaces; + } + } +} + +class ChatList extends StatefulWidget { + static BuildContext? contextForVoip; + final String? activeChat; + final bool displayNavigationRail; + + const ChatList({ + super.key, + required this.activeChat, + this.displayNavigationRail = false, + }); + + @override + ChatListController createState() => ChatListController(); +} + +class ChatListController extends State + with TickerProviderStateMixin, RouteAware { + StreamSubscription? _intentDataStreamSubscription; + + StreamSubscription? _intentFileStreamSubscription; + + StreamSubscription? _intentUriStreamSubscription; + + ActiveFilter activeFilter = AppConfig.separateChatTypes + ? ActiveFilter.messages + : ActiveFilter.allChats; + + String? _activeSpaceId; + String? get activeSpaceId => _activeSpaceId; + + void setActiveSpace(String spaceId) async { + await Matrix.of(context).client.getRoomById(spaceId)!.postLoad(); + + setState(() { + _activeSpaceId = spaceId; + }); + } + + void clearActiveSpace() => setState(() { + _activeSpaceId = null; + }); + + void onChatTap(Room room) async { + if (room.membership == Membership.invite) { + + return; + } + + if (room.membership == Membership.ban) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text(L10n.of(context).youHaveBeenBannedFromThisChat), + ), + ); + return; + } + + if (room.membership == Membership.leave) { + context.go('/rooms/archive/${room.id}'); + return; + } + + if (room.isSpace) { + setActiveSpace(room.id); + return; + } + + context.go('/rooms/${room.id}'); + } + + bool Function(Room) getRoomFilterByActiveFilter(ActiveFilter activeFilter) { + switch (activeFilter) { + case ActiveFilter.allChats: + return (room) => true; + case ActiveFilter.messages: + return (room) => !room.isSpace && room.isDirectChat; + case ActiveFilter.groups: + return (room) => !room.isSpace && !room.isDirectChat; + case ActiveFilter.unread: + return (room) => room.isUnreadOrInvited; + case ActiveFilter.spaces: + return (room) => room.isSpace; + } + } + + List get filteredRooms => Matrix.of(context) + .client + .rooms + .where(getRoomFilterByActiveFilter(activeFilter)) + .toList(); + + bool isSearchMode = false; + Future? publicRoomsResponse; + String? searchServer; + Timer? _coolDown; + SearchUserDirectoryResponse? userSearchResult; + QueryPublicRoomsResponse? roomSearchResult; + + bool isSearching = false; + static const String _serverStoreNamespace = 'im.fluffychat.search.server'; + + void setServer() async { + final newServer = await showTextInputDialog( + useRootNavigator: false, + title: L10n.of(context).changeTheHomeserver, + context: context, + okLabel: L10n.of(context).ok, + cancelLabel: L10n.of(context).cancel, + prefixText: 'https://', + hintText: Matrix.of(context).client.homeserver?.host, + initialText: searchServer, + keyboardType: TextInputType.url, + autocorrect: false, + validator: (server) => server.contains('.') == true + ? null + : L10n.of(context).invalidServerName, + ); + if (newServer == null) return; + Matrix.of(context).store.setString(_serverStoreNamespace, newServer); + setState(() { + searchServer = newServer; + }); + _coolDown?.cancel(); + _coolDown = Timer(const Duration(milliseconds: 500), _search); + } + + final TextEditingController searchController = TextEditingController(); + final FocusNode searchFocusNode = FocusNode(); + + void _search() async { + final client = Matrix.of(context).client; + if (!isSearching) { + setState(() { + isSearching = true; + }); + } + SearchUserDirectoryResponse? userSearchResult; + QueryPublicRoomsResponse? roomSearchResult; + final searchQuery = searchController.text.trim(); + try { + roomSearchResult = await client.queryPublicRooms( + server: searchServer, + filter: PublicRoomQueryFilter(genericSearchTerm: searchQuery), + limit: 20, + ); + + if (searchQuery.isValidMatrixId && + searchQuery.sigil == '#' && + roomSearchResult.chunk + .any((room) => room.canonicalAlias == searchQuery) == + false) { + final response = await client.getRoomIdByAlias(searchQuery); + final roomId = response.roomId; + if (roomId != null) { + roomSearchResult.chunk.add( + PublicRoomsChunk( + name: searchQuery, + guestCanJoin: false, + numJoinedMembers: 0, + roomId: roomId, + worldReadable: false, + canonicalAlias: searchQuery, + ), + ); + } + } + userSearchResult = await client.searchUserDirectory( + searchController.text, + limit: 20, + ); + } catch (e, s) { + Logs().w('Searching has crashed', e, s); + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text( + e.toLocalizedString(context), + ), + ), + ); + } + if (!isSearchMode) return; + setState(() { + isSearching = false; + this.roomSearchResult = roomSearchResult; + this.userSearchResult = userSearchResult; + }); + } + + void onSearchEnter(String text, {bool globalSearch = true}) { + if (text.isEmpty) { + cancelSearch(unfocus: false); + return; + } + + setState(() { + isSearchMode = true; + }); + _coolDown?.cancel(); + if (globalSearch) { + _coolDown = Timer(const Duration(milliseconds: 500), _search); + } + } + + void startSearch() { + setState(() { + isSearchMode = true; + }); + searchFocusNode.requestFocus(); + _coolDown?.cancel(); + _coolDown = Timer(const Duration(milliseconds: 500), _search); + } + + void cancelSearch({bool unfocus = true}) { + setState(() { + searchController.clear(); + isSearchMode = false; + roomSearchResult = userSearchResult = null; + isSearching = false; + }); + if (unfocus) searchFocusNode.unfocus(); + } + + bool isTorBrowser = false; + + BoxConstraints? snappingSheetContainerSize; + + final ScrollController scrollController = ScrollController(); + final ValueNotifier scrolledToTop = ValueNotifier(true); + + final StreamController _clientStream = StreamController.broadcast(); + + Stream get clientStream => _clientStream.stream; + + void addAccountAction() => context.go('/rooms/settings/account'); + + void _onScroll() { + final newScrolledToTop = scrollController.position.pixels <= 0; + if (newScrolledToTop != scrolledToTop.value) { + scrolledToTop.value = newScrolledToTop; + } + } + + void editSpace(BuildContext context, String spaceId) async { + await Matrix.of(context).client.getRoomById(spaceId)!.postLoad(); + if (mounted) { + context.push('/rooms/$spaceId/details'); + } + } + + // Needs to match GroupsSpacesEntry for 'separate group' checking. + List get spaces => + Matrix.of(context).client.rooms.where((r) => r.isSpace).toList(); + + String? get activeChat => widget.activeChat; + + void _processIncomingSharedMedia(List files) { + if (files.isEmpty) return; + + showScaffoldDialog( + context: context, + builder: (context) => ShareScaffoldDialog( + items: files.map( + (file) { + if ({ + SharedMediaType.text, + SharedMediaType.url, + }.contains(file.type)) { + return TextShareItem(file.path); + } + return FileShareItem( + XFile( + file.path.replaceFirst('file://', ''), + mimeType: file.mimeType, + ), + ); + }, + ).toList(), + ), + ); + } + + void _processIncomingUris(Uri? uri) async { + if (uri == null) return; + context.go('/rooms'); + WidgetsBinding.instance.addPostFrameCallback((_) { + UrlLauncher(context, uri.toString()).openMatrixToUrl(); + }); + } + + void _initReceiveSharingIntent() { + if (!PlatformInfos.isMobile) return; + + // For sharing images coming from outside the app while the app is in the memory + _intentFileStreamSubscription = ReceiveSharingIntent.instance + .getMediaStream() + .listen(_processIncomingSharedMedia, onError: print); + + // For sharing images coming from outside the app while the app is closed + ReceiveSharingIntent.instance + .getInitialMedia() + .then(_processIncomingSharedMedia); + + // For receiving shared Uris + _intentUriStreamSubscription = + AppLinks().uriLinkStream.listen(_processIncomingUris); + + if (PlatformInfos.isAndroid) { + final shortcuts = FlutterShortcuts(); + shortcuts.initialize().then( + (_) => shortcuts.listenAction((action) { + if (!mounted) return; + UrlLauncher(context, action).launchUrl(); + }), + ); + } + } + + @override + void initState() { + _initReceiveSharingIntent(); + + scrollController.addListener(_onScroll); + _waitForFirstSync(); + _hackyWebRTCFixForWeb(); + WidgetsBinding.instance.addPostFrameCallback((_) async { + if (mounted) { + searchServer = + Matrix.of(context).store.getString(_serverStoreNamespace); + Matrix.of(context).backgroundPush?.setupPush(); + UpdateNotifier.showUpdateSnackBar(context); + } + + // Workaround for system UI overlay style not applied on app start + SystemChrome.setSystemUIOverlayStyle( + Theme.of(context).appBarTheme.systemOverlayStyle!, + ); + }); + + _checkTorBrowser(); + + super.initState(); + } + + @override + void dispose() { + _intentDataStreamSubscription?.cancel(); + _intentFileStreamSubscription?.cancel(); + _intentUriStreamSubscription?.cancel(); + scrollController.removeListener(_onScroll); + super.dispose(); + } + + void chatContextAction( + Room room, + BuildContext posContext, [ + Room? space, + ]) async { + final overlay = + Overlay.of(posContext).context.findRenderObject() as RenderBox; + + final button = posContext.findRenderObject() as RenderBox; + + final position = RelativeRect.fromRect( + Rect.fromPoints( + button.localToGlobal(const Offset(0, -65), ancestor: overlay), + button.localToGlobal( + button.size.bottomRight(Offset.zero) + const Offset(-50, 0), + ancestor: overlay, + ), + ), + Offset.zero & overlay.size, + ); + + final displayname = + room.getLocalizedDisplayname(MatrixLocals(L10n.of(context))); + + final spacesWithPowerLevels = room.client.rooms + .where( + (space) => + space.isSpace && + space.canChangeStateEvent(EventTypes.SpaceChild) && + !space.spaceChildren.any((c) => c.roomId == room.id), + ) + .toList(); + + final action = await showMenu( + context: posContext, + position: position, + items: [ + PopupMenuItem( + value: ChatContextAction.open, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + if (!AppConfig.hideAvatarsInInvites || + room.membership != Membership.invite) + Avatar( + mxContent: room.avatar, + size: Avatar.defaultSize / 2, + name: displayname, + ), + const SizedBox(width: 12), + Text( + displayname, + style: + TextStyle(color: Theme.of(context).colorScheme.onSurface), + ), + ], + ), + ), + const PopupMenuDivider(), + if (space != null) + PopupMenuItem( + value: ChatContextAction.goToSpace, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + if (!AppConfig.hideAvatarsInInvites || + room.membership != Membership.invite) + Avatar( + mxContent: space.avatar, + size: Avatar.defaultSize / 2, + name: space.getLocalizedDisplayname(), + ), + const SizedBox(width: 12), + Expanded( + child: Text( + L10n.of(context).goToSpace(space.getLocalizedDisplayname()), + ), + ), + ], + ), + ), + if (room.membership == Membership.join) ...[ + PopupMenuItem( + value: ChatContextAction.mute, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon( + room.pushRuleState == PushRuleState.notify + ? Icons.notifications_off_outlined + : Icons.notifications_off, + ), + const SizedBox(width: 12), + Text( + room.pushRuleState == PushRuleState.notify + ? L10n.of(context).muteChat + : L10n.of(context).unmuteChat, + ), + ], + ), + ), + PopupMenuItem( + value: ChatContextAction.markUnread, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon( + room.markedUnread + ? Icons.mark_as_unread + : Icons.mark_as_unread_outlined, + ), + const SizedBox(width: 12), + Text( + room.markedUnread + ? L10n.of(context).markAsRead + : L10n.of(context).markAsUnread, + ), + ], + ), + ), + PopupMenuItem( + value: ChatContextAction.favorite, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon( + room.isFavourite ? Icons.push_pin : Icons.push_pin_outlined, + ), + const SizedBox(width: 12), + Text( + room.isFavourite + ? L10n.of(context).unpin + : L10n.of(context).pin, + ), + ], + ), + ), + if (spacesWithPowerLevels.isNotEmpty) + PopupMenuItem( + value: ChatContextAction.addToSpace, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + const Icon(Icons.group_work_outlined), + const SizedBox(width: 12), + Text(L10n.of(context).addToSpace), + ], + ), + ), + ], + if (room.membership == Membership.invite) + PopupMenuItem( + value: ChatContextAction.join, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon( + Icons.check_circle_outline, + color: Theme.of(context).colorScheme.primary, + ), + const SizedBox(width: 12), + Text( + L10n.of(context).accept, + style: + TextStyle(color: Theme.of(context).colorScheme.primary), + ), + ], + ), + ), + PopupMenuItem( + value: ChatContextAction.block, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon( + Icons.block_outlined, + color: Theme.of(context).colorScheme.error, + ), + const SizedBox(width: 12), + Text( + L10n.of(context).block, + style: TextStyle(color: Theme.of(context).colorScheme.error), + ), + ], + ), + ), + PopupMenuItem( + value: ChatContextAction.leave, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon( + Icons.delete_outlined, + color: Theme.of(context).colorScheme.onErrorContainer, + ), + const SizedBox(width: 12), + Text( + room.membership == Membership.invite + ? L10n.of(context).delete + : L10n.of(context).leave, + style: TextStyle( + color: Theme.of(context).colorScheme.onErrorContainer, + ), + ), + ], + ), + ), + ], + ); + + if (action == null) return; + if (!mounted) return; + + switch (action) { + case ChatContextAction.join: + final joinResult = await showFutureLoadingDialog( + context: context, + future: () async { + final waitForRoom = room.client.waitForRoomInSync( + room.id, + join: true, + ); + await room.join(); + await waitForRoom; + }, + exceptionContext: ExceptionContext.joinRoom, + ); + if (joinResult.error != null) return; + return; + case ChatContextAction.open: + onChatTap(room); + return; + case ChatContextAction.goToSpace: + setActiveSpace(space!.id); + return; + case ChatContextAction.favorite: + await showFutureLoadingDialog( + context: context, + future: () => room.setFavourite(!room.isFavourite), + ); + return; + case ChatContextAction.markUnread: + await showFutureLoadingDialog( + context: context, + future: () => room.markUnread(!room.markedUnread), + ); + return; + case ChatContextAction.mute: + await showFutureLoadingDialog( + context: context, + future: () => room.setPushRuleState( + room.pushRuleState == PushRuleState.notify + ? PushRuleState.mentionsOnly + : PushRuleState.notify, + ), + ); + return; + case ChatContextAction.leave: + final confirmed = await showOkCancelAlertDialog( + context: context, + title: L10n.of(context).areYouSure, + message: L10n.of(context).archiveRoomDescription, + okLabel: L10n.of(context).leave, + cancelLabel: L10n.of(context).cancel, + isDestructive: true, + ); + if (confirmed == OkCancelResult.cancel) return; + if (!mounted) return; + + await showFutureLoadingDialog(context: context, future: room.leave); + + return; + case ChatContextAction.addToSpace: + final space = await showModalActionPopup( + context: context, + title: L10n.of(context).space, + actions: spacesWithPowerLevels + .map( + (space) => AdaptiveModalAction( + value: space, + label: space + .getLocalizedDisplayname(MatrixLocals(L10n.of(context))), + ), + ) + .toList(), + ); + if (space == null) return; + await showFutureLoadingDialog( + context: context, + future: () => space.setSpaceChild(room.id), + ); + case ChatContextAction.block: + final userId = + room.getState(EventTypes.RoomMember, room.client.userID!)?.senderId; + context.go('/rooms/settings/security/ignorelist', extra: userId); + } + } + + void dismissStatusList() async { + final result = await showOkCancelAlertDialog( + title: L10n.of(context).hidePresences, + context: context, + ); + if (result == OkCancelResult.ok) { + await Matrix.of(context).store.setBool(SettingKeys.showPresences, false); + AppConfig.showPresences = false; + setState(() {}); + } + } + + void setStatus() async { + final client = Matrix.of(context).client; + final currentPresence = await client.fetchCurrentPresence(client.userID!); + final input = await showTextInputDialog( + useRootNavigator: false, + context: context, + title: L10n.of(context).setStatus, + message: L10n.of(context).leaveEmptyToClearStatus, + okLabel: L10n.of(context).ok, + cancelLabel: L10n.of(context).cancel, + hintText: L10n.of(context).statusExampleMessage, + maxLines: 6, + minLines: 1, + maxLength: 255, + initialText: currentPresence.statusMsg, + ); + if (input == null) return; + if (!mounted) return; + await showFutureLoadingDialog( + context: context, + future: () => client.setPresence( + client.userID!, + PresenceType.online, + statusMsg: input, + ), + ); + } + + bool waitForFirstSync = false; + + Future _waitForFirstSync() async { + final router = GoRouter.of(context); + final client = Matrix.of(context).client; + await client.roomsLoading; + await client.accountDataLoading; + await client.userDeviceKeysLoading; + if (client.prevBatch == null) { + await client.onSync.stream.first; + + // Display first login bootstrap if enabled + if (client.encryption?.keyManager.enabled == true) { + if (await client.encryption?.keyManager.isCached() == false || + await client.encryption?.crossSigning.isCached() == false || + client.isUnknownSession && !mounted) { + await BootstrapDialog(client: client).show(context); + } + } + } + if (!mounted) return; + setState(() { + waitForFirstSync = true; + }); + + if (client.userDeviceKeys[client.userID!]?.deviceKeys.values + .any((device) => !device.verified && !device.blocked) ?? + false) { + late final ScaffoldFeatureController controller; + final theme = Theme.of(context); + controller = ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + duration: const Duration(seconds: 15), + showCloseIcon: true, + backgroundColor: theme.colorScheme.errorContainer, + closeIconColor: theme.colorScheme.onErrorContainer, + content: Text( + L10n.of(context).oneOfYourDevicesIsNotVerified, + style: TextStyle( + color: theme.colorScheme.onErrorContainer, + ), + ), + action: SnackBarAction( + onPressed: () { + controller.close(); + router.go('/rooms/settings/devices'); + }, + textColor: theme.colorScheme.onErrorContainer, + label: L10n.of(context).settings, + ), + ), + ); + } + } + + void setActiveFilter(ActiveFilter filter) { + setState(() { + activeFilter = filter; + }); + } + + void setActiveClient(Client client) { + context.go('/rooms'); + setState(() { + activeFilter = ActiveFilter.allChats; + _activeSpaceId = null; + Matrix.of(context).setActiveClient(client); + }); + _clientStream.add(client); + } + + void setActiveBundle(String bundle) { + context.go('/rooms'); + setState(() { + _activeSpaceId = null; + Matrix.of(context).activeBundle = bundle; + if (!Matrix.of(context) + .currentBundle! + .any((client) => client == Matrix.of(context).client)) { + Matrix.of(context) + .setActiveClient(Matrix.of(context).currentBundle!.first); + } + }); + } + + void editBundlesForAccount(String? userId, String? activeBundle) async { + final l10n = L10n.of(context); + final client = Matrix.of(context) + .widget + .clients[Matrix.of(context).getClientIndexByMatrixId(userId!)]; + final action = await showModalActionPopup( + context: context, + title: L10n.of(context).editBundlesForAccount, + cancelLabel: L10n.of(context).cancel, + actions: [ + AdaptiveModalAction( + value: EditBundleAction.addToBundle, + label: L10n.of(context).addToBundle, + ), + if (activeBundle != client.userID) + AdaptiveModalAction( + value: EditBundleAction.removeFromBundle, + label: L10n.of(context).removeFromBundle, + ), + ], + ); + if (action == null) return; + switch (action) { + case EditBundleAction.addToBundle: + final bundle = await showTextInputDialog( + context: context, + title: l10n.bundleName, + hintText: l10n.bundleName, + ); + if (bundle == null || bundle.isEmpty || bundle.isEmpty) return; + await showFutureLoadingDialog( + context: context, + future: () => client.setAccountBundle(bundle), + ); + break; + case EditBundleAction.removeFromBundle: + await showFutureLoadingDialog( + context: context, + future: () => client.removeFromAccountBundle(activeBundle!), + ); + } + } + + bool get displayBundles => + Matrix.of(context).hasComplexBundles && + Matrix.of(context).accountBundles.keys.length > 1; + + String? get secureActiveBundle { + if (Matrix.of(context).activeBundle == null || + !Matrix.of(context) + .accountBundles + .keys + .contains(Matrix.of(context).activeBundle)) { + return Matrix.of(context).accountBundles.keys.first; + } + return Matrix.of(context).activeBundle; + } + + void resetActiveBundle() { + WidgetsBinding.instance.addPostFrameCallback((timeStamp) { + setState(() { + Matrix.of(context).activeBundle = null; + }); + }); + } + + @override + Widget build(BuildContext context) => ChatListView(this); + + void _hackyWebRTCFixForWeb() { + ChatList.contextForVoip = context; + } + + Future _checkTorBrowser() async { + if (!kIsWeb) return; + final isTor = await TorBrowserDetector.isTorBrowser; + isTorBrowser = isTor; + } + + Future dehydrate() => Matrix.of(context).dehydrateAction(context); +} + +enum EditBundleAction { addToBundle, removeFromBundle } + +enum InviteActions { + accept, + decline, + block, +} + +enum ChatContextAction { + join, + open, + goToSpace, + favorite, + markUnread, + mute, + leave, + addToSpace, + block +} diff --git a/lib/pages/chat_list/chat_list_body.dart b/lib/pages/chat_list/chat_list_body.dart new file mode 100644 index 0000000..cf4d8ed --- /dev/null +++ b/lib/pages/chat_list/chat_list_body.dart @@ -0,0 +1,358 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/pages/chat_list/chat_list.dart'; +import 'package:fluffychat/pages/chat_list/chat_list_item.dart'; +import 'package:fluffychat/pages/chat_list/dummy_chat_list_item.dart'; +import 'package:fluffychat/pages/chat_list/search_title.dart'; +import 'package:fluffychat/pages/chat_list/space_view.dart'; +import 'package:fluffychat/pages/chat_list/status_msg_list.dart'; +import 'package:fluffychat/utils/stream_extension.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/public_room_dialog.dart'; +import 'package:fluffychat/widgets/avatar.dart'; +import '../../config/themes.dart'; +import '../../widgets/adaptive_dialogs/user_dialog.dart'; +import '../../widgets/matrix.dart'; +import 'chat_list_header.dart'; + +class ChatListViewBody extends StatelessWidget { + final ChatListController controller; + + const ChatListViewBody(this.controller, {super.key}); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + final client = Matrix.of(context).client; + final activeSpace = controller.activeSpaceId; + if (activeSpace != null) { + return SpaceView( + key: ValueKey(activeSpace), + spaceId: activeSpace, + onBack: controller.clearActiveSpace, + onChatTab: (room) => controller.onChatTap(room), + onChatContext: (room, context) => + controller.chatContextAction(room, context), + activeChat: controller.activeChat, + toParentSpace: controller.setActiveSpace, + ); + } + final spaces = client.rooms.where((r) => r.isSpace); + final spaceDelegateCandidates = {}; + for (final space in spaces) { + for (final spaceChild in space.spaceChildren) { + final roomId = spaceChild.roomId; + if (roomId == null) continue; + spaceDelegateCandidates[roomId] = space; + } + } + + final publicRooms = controller.roomSearchResult?.chunk + .where((room) => room.roomType != 'm.space') + .toList(); + final publicSpaces = controller.roomSearchResult?.chunk + .where((room) => room.roomType == 'm.space') + .toList(); + final userSearchResult = controller.userSearchResult; + const dummyChatCount = 4; + final filter = controller.searchController.text.toLowerCase(); + return StreamBuilder( + key: ValueKey( + client.userID.toString(), + ), + stream: client.onSync.stream + .where((s) => s.hasRoomUpdate) + .rateLimit(const Duration(seconds: 1)), + builder: (context, _) { + final rooms = controller.filteredRooms; + + return SafeArea( + child: CustomScrollView( + controller: controller.scrollController, + slivers: [ + ChatListHeader(controller: controller), + SliverList( + delegate: SliverChildListDelegate( + [ + if (controller.isSearchMode) ...[ + SearchTitle( + title: L10n.of(context).publicRooms, + icon: const Icon(Icons.explore_outlined), + ), + PublicRoomsHorizontalList(publicRooms: publicRooms), + SearchTitle( + title: L10n.of(context).publicSpaces, + icon: const Icon(Icons.workspaces_outlined), + ), + PublicRoomsHorizontalList(publicRooms: publicSpaces), + SearchTitle( + title: L10n.of(context).users, + icon: const Icon(Icons.group_outlined), + ), + AnimatedContainer( + clipBehavior: Clip.hardEdge, + decoration: const BoxDecoration(), + height: userSearchResult == null || + userSearchResult.results.isEmpty + ? 0 + : 106, + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + child: userSearchResult == null + ? null + : ListView.builder( + scrollDirection: Axis.horizontal, + itemCount: userSearchResult.results.length, + itemBuilder: (context, i) => _SearchItem( + title: + userSearchResult.results[i].displayName ?? + userSearchResult + .results[i].userId.localpart ?? + L10n.of(context).unknownDevice, + avatar: userSearchResult.results[i].avatarUrl, + onPressed: () => UserDialog.show( + context: context, + profile: userSearchResult.results[i], + ), + ), + ), + ), + ], + if (!controller.isSearchMode && AppConfig.showPresences) + GestureDetector( + onLongPress: () => controller.dismissStatusList(), + child: StatusMessageList( + onStatusEdit: controller.setStatus, + ), + ), + AnimatedContainer( + height: controller.isTorBrowser ? 64 : 0, + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + clipBehavior: Clip.hardEdge, + decoration: const BoxDecoration(), + child: Material( + color: theme.colorScheme.surface, + child: ListTile( + leading: const Icon(Icons.vpn_key), + title: Text(L10n.of(context).dehydrateTor), + subtitle: Text(L10n.of(context).dehydrateTorLong), + trailing: const Icon(Icons.chevron_right_outlined), + onTap: controller.dehydrate, + ), + ), + ), + if (client.rooms.isNotEmpty && !controller.isSearchMode) + SizedBox( + height: 64, + child: ListView( + padding: const EdgeInsets.symmetric( + horizontal: 12.0, + vertical: 12.0, + ), + shrinkWrap: true, + scrollDirection: Axis.horizontal, + children: [ + if (AppConfig.separateChatTypes) + ActiveFilter.messages + else + ActiveFilter.allChats, + ActiveFilter.groups, + ActiveFilter.unread, + if (spaceDelegateCandidates.isNotEmpty && + !controller.widget.displayNavigationRail) + ActiveFilter.spaces, + ] + .map( + (filter) => Padding( + padding: const EdgeInsets.symmetric( + horizontal: 4.0, + ), + child: FilterChip( + selected: filter == controller.activeFilter, + onSelected: (_) => + controller.setActiveFilter(filter), + label: + Text(filter.toLocalizedString(context)), + ), + ), + ) + .toList(), + ), + ), + if (controller.isSearchMode) + SearchTitle( + title: L10n.of(context).chats, + icon: const Icon(Icons.forum_outlined), + ), + if (client.prevBatch != null && + rooms.isEmpty && + !controller.isSearchMode) ...[ + Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Stack( + alignment: Alignment.center, + children: [ + const Column( + mainAxisSize: MainAxisSize.min, + children: [ + DummyChatListItem( + opacity: 0.5, + animate: false, + ), + DummyChatListItem( + opacity: 0.3, + animate: false, + ), + ], + ), + Icon( + CupertinoIcons.chat_bubble_text_fill, + size: 128, + color: theme.colorScheme.secondary, + ), + ], + ), + Padding( + padding: const EdgeInsets.all(16.0), + child: Text( + client.rooms.isEmpty + ? L10n.of(context).noChatsFoundHere + : L10n.of(context).noMoreChatsFound, + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 18, + color: theme.colorScheme.secondary, + ), + ), + ), + ], + ), + ], + ], + ), + ), + if (client.prevBatch == null) + SliverList( + delegate: SliverChildBuilderDelegate( + (context, i) => DummyChatListItem( + opacity: (dummyChatCount - i) / dummyChatCount, + animate: true, + ), + childCount: dummyChatCount, + ), + ), + if (client.prevBatch != null) + SliverList.builder( + itemCount: rooms.length, + itemBuilder: (BuildContext context, int i) { + final room = rooms[i]; + final space = spaceDelegateCandidates[room.id]; + return ChatListItem( + room, + space: space, + key: Key('chat_list_item_${room.id}'), + filter: filter, + onTap: () => controller.onChatTap(room), + onLongPress: (context) => + controller.chatContextAction(room, context, space), + activeChat: controller.activeChat == room.id, + ); + }, + ), + ], + ), + ); + }, + ); + } +} + +class PublicRoomsHorizontalList extends StatelessWidget { + const PublicRoomsHorizontalList({ + super.key, + required this.publicRooms, + }); + + final List? publicRooms; + + @override + Widget build(BuildContext context) { + final publicRooms = this.publicRooms; + return AnimatedContainer( + clipBehavior: Clip.hardEdge, + decoration: const BoxDecoration(), + height: publicRooms == null || publicRooms.isEmpty ? 0 : 106, + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + child: publicRooms == null + ? null + : ListView.builder( + scrollDirection: Axis.horizontal, + itemCount: publicRooms.length, + itemBuilder: (context, i) => _SearchItem( + title: publicRooms[i].name ?? + publicRooms[i].canonicalAlias?.localpart ?? + L10n.of(context).group, + avatar: publicRooms[i].avatarUrl, + onPressed: () => showAdaptiveDialog( + context: context, + builder: (c) => PublicRoomDialog( + roomAlias: + publicRooms[i].canonicalAlias ?? publicRooms[i].roomId, + chunk: publicRooms[i], + ), + ), + ), + ), + ); + } +} + +class _SearchItem extends StatelessWidget { + final String title; + final Uri? avatar; + final void Function() onPressed; + + const _SearchItem({ + required this.title, + this.avatar, + required this.onPressed, + }); + + @override + Widget build(BuildContext context) => InkWell( + onTap: onPressed, + child: SizedBox( + width: 84, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + const SizedBox(height: 8), + Avatar( + mxContent: avatar, + name: title, + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: Text( + title, + maxLines: 2, + textAlign: TextAlign.center, + overflow: TextOverflow.ellipsis, + style: const TextStyle( + fontSize: 12, + ), + ), + ), + ], + ), + ), + ); +} diff --git a/lib/pages/chat_list/chat_list_header.dart b/lib/pages/chat_list/chat_list_header.dart new file mode 100644 index 0000000..77cd6b0 --- /dev/null +++ b/lib/pages/chat_list/chat_list_header.dart @@ -0,0 +1,140 @@ +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/pages/chat_list/chat_list.dart'; +import 'package:fluffychat/pages/chat_list/client_chooser_button.dart'; +import 'package:fluffychat/utils/sync_status_localization.dart'; +import '../../widgets/matrix.dart'; + +class ChatListHeader extends StatelessWidget implements PreferredSizeWidget { + final ChatListController controller; + final bool globalSearch; + + const ChatListHeader({ + super.key, + required this.controller, + this.globalSearch = true, + }); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + final client = Matrix.of(context).client; + + return SliverAppBar( + floating: true, + toolbarHeight: 72, + pinned: FluffyThemes.isColumnMode(context), + scrolledUnderElevation: 0, + backgroundColor: Colors.transparent, + automaticallyImplyLeading: false, + title: StreamBuilder( + stream: client.onSyncStatus.stream, + builder: (context, snapshot) { + final status = client.onSyncStatus.value ?? + const SyncStatusUpdate(SyncStatus.waitingForResponse); + final hide = client.onSync.value != null && + status.status != SyncStatus.error && + client.prevBatch != null; + return TextField( + controller: controller.searchController, + focusNode: controller.searchFocusNode, + textInputAction: TextInputAction.search, + onChanged: (text) => controller.onSearchEnter( + text, + globalSearch: globalSearch, + ), + decoration: InputDecoration( + filled: true, + fillColor: theme.colorScheme.secondaryContainer, + border: OutlineInputBorder( + borderSide: BorderSide.none, + borderRadius: BorderRadius.circular(99), + ), + contentPadding: EdgeInsets.zero, + hintText: hide + ? L10n.of(context).searchChatsRooms + : status.calcLocalizedString(context), + hintStyle: TextStyle( + color: status.error != null + ? theme.colorScheme.error + : theme.colorScheme.onPrimaryContainer, + fontWeight: FontWeight.normal, + ), + prefixIcon: hide + ? controller.isSearchMode + ? IconButton( + tooltip: L10n.of(context).cancel, + icon: const Icon(Icons.close_outlined), + onPressed: controller.cancelSearch, + color: theme.colorScheme.onPrimaryContainer, + ) + : IconButton( + onPressed: controller.startSearch, + icon: Icon( + Icons.search_outlined, + color: theme.colorScheme.onPrimaryContainer, + ), + ) + : Container( + margin: const EdgeInsets.all(12), + width: 8, + height: 8, + child: Center( + child: CircularProgressIndicator.adaptive( + strokeWidth: 2, + value: status.progress, + valueColor: status.error != null + ? AlwaysStoppedAnimation( + theme.colorScheme.error, + ) + : null, + ), + ), + ), + suffixIcon: controller.isSearchMode && globalSearch + ? controller.isSearching + ? const Padding( + padding: EdgeInsets.symmetric( + vertical: 10.0, + horizontal: 12, + ), + child: SizedBox.square( + dimension: 24, + child: CircularProgressIndicator.adaptive( + strokeWidth: 2, + ), + ), + ) + : TextButton.icon( + onPressed: controller.setServer, + style: TextButton.styleFrom( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(99), + ), + textStyle: const TextStyle(fontSize: 12), + ), + icon: const Icon(Icons.edit_outlined, size: 16), + label: Text( + controller.searchServer ?? + Matrix.of(context).client.homeserver!.host, + maxLines: 2, + ), + ) + : SizedBox( + width: 0, + child: ClientChooserButton(controller), + ), + ), + ); + }, + ), + ); + } + + @override + Size get preferredSize => const Size.fromHeight(56); +} diff --git a/lib/pages/chat_list/chat_list_item.dart b/lib/pages/chat_list/chat_list_item.dart new file mode 100644 index 0000000..0a86513 --- /dev/null +++ b/lib/pages/chat_list/chat_list_item.dart @@ -0,0 +1,404 @@ +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; +import 'package:fluffychat/utils/room_status_extension.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import 'package:fluffychat/widgets/hover_builder.dart'; +import '../../config/themes.dart'; +import '../../utils/date_time_extension.dart'; +import '../../widgets/avatar.dart'; + +enum ArchivedRoomAction { delete, rejoin } + +class ChatListItem extends StatelessWidget { + final Room room; + final Room? space; + final bool activeChat; + final void Function(BuildContext context)? onLongPress; + final void Function()? onForget; + final void Function() onTap; + final String? filter; + + const ChatListItem( + this.room, { + this.activeChat = false, + required this.onTap, + this.onLongPress, + this.onForget, + this.filter, + this.space, + super.key, + }); + + Future archiveAction(BuildContext context) async { + { + if ([Membership.leave, Membership.ban].contains(room.membership)) { + final forgetResult = await showFutureLoadingDialog( + context: context, + future: () => room.forget(), + ); + return forgetResult.isValue; + } + final confirmed = await showOkCancelAlertDialog( + context: context, + title: L10n.of(context).areYouSure, + okLabel: L10n.of(context).leave, + cancelLabel: L10n.of(context).cancel, + message: L10n.of(context).archiveRoomDescription, + isDestructive: true, + ); + if (confirmed != OkCancelResult.ok) return false; + final leaveResult = await showFutureLoadingDialog( + context: context, + future: () => room.leave(), + ); + return leaveResult.isValue; + } + } + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + final isMuted = room.pushRuleState != PushRuleState.notify; + final typingText = room.getLocalizedTypingText(context); + final lastEvent = room.lastEvent; + final ownMessage = lastEvent?.senderId == room.client.userID; + final unread = room.isUnread || room.membership == Membership.invite; + final directChatMatrixId = room.directChatMatrixID; + final isDirectChat = directChatMatrixId != null; + final unreadBubbleSize = unread || room.hasNewMessages + ? room.notificationCount > 0 + ? 20.0 + : 14.0 + : 0.0; + final hasNotifications = room.notificationCount > 0; + final backgroundColor = + activeChat ? theme.colorScheme.secondaryContainer : null; + final displayname = room.getLocalizedDisplayname( + MatrixLocals(L10n.of(context)), + ); + final filter = this.filter; + if (filter != null && !displayname.toLowerCase().contains(filter)) { + return const SizedBox.shrink(); + } + + final needLastEventSender = lastEvent == null + ? false + : room.getState(EventTypes.RoomMember, lastEvent.senderId) == null; + final space = this.space; + + final inviterMxId = room.getState(EventTypes.RoomMember, room.client.userID!)?.senderId; + + return Padding( + padding: const EdgeInsets.symmetric( + horizontal: 8, + vertical: 1, + ), + child: Material( + borderRadius: BorderRadius.circular(AppConfig.borderRadius), + clipBehavior: Clip.hardEdge, + color: backgroundColor, + child: FutureBuilder( + future: room.loadHeroUsers(), + builder: (context, snapshot) => HoverBuilder( + builder: (context, listTileHovered) => ListTile( + visualDensity: const VisualDensity(vertical: -0.5), + contentPadding: const EdgeInsets.symmetric(horizontal: 8), + onLongPress: () => onLongPress?.call(context), + leading: HoverBuilder( + builder: (context, hovered) => AnimatedScale( + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + scale: hovered ? 1.1 : 1.0, + child: + (!AppConfig.hideAvatarsInInvites || room.membership != Membership.invite) + ? SizedBox( + width: Avatar.defaultSize, + height: Avatar.defaultSize, + child: Stack( + children: [ + if (space != null) + Positioned( + top: 0, + left: 0, + child: Avatar( + border: BorderSide( + width: 2, + color: backgroundColor ?? + theme.colorScheme.surface, + ), + borderRadius: BorderRadius.circular( + AppConfig.borderRadius / 4, + ), + mxContent: space.avatar, + size: Avatar.defaultSize * 0.75, + name: space.getLocalizedDisplayname(), + onTap: () => onLongPress?.call(context), + ), + ), + Positioned( + bottom: 0, + right: 0, + child: Avatar( + border: space == null + ? room.isSpace + ? BorderSide( + width: 1, + color: theme.dividerColor, + ) + : null + : BorderSide( + width: 2, + color: backgroundColor ?? + theme.colorScheme.surface, + ), + borderRadius: room.isSpace + ? BorderRadius.circular( + AppConfig.borderRadius / 4, + ) + : null, + mxContent: room.avatar, + size: space != null + ? Avatar.defaultSize * 0.75 + : Avatar.defaultSize, + name: displayname, + presenceUserId: directChatMatrixId, + presenceBackgroundColor: backgroundColor, + onTap: () => onLongPress?.call(context), + ), + ), + Positioned( + top: 0, + right: 0, + child: GestureDetector( + onTap: () => onLongPress?.call(context), + child: AnimatedScale( + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + scale: listTileHovered ? 1.0 : 0.0, + child: Material( + color: backgroundColor, + borderRadius: BorderRadius.circular(16), + child: const Icon( + Icons.arrow_drop_down_circle_outlined, + size: 18, + ), + ), + ), + ), + ), + ], + ), + ) : null, + ), + ), + title: Row( + children: [ + Expanded( + child: Text( + displayname, + maxLines: 1, + overflow: TextOverflow.ellipsis, + softWrap: false, + style: TextStyle( + fontWeight: unread || room.hasNewMessages + ? FontWeight.w500 + : null, + ), + ), + ), + if (isMuted) + const Padding( + padding: EdgeInsets.only(left: 4.0), + child: Icon( + Icons.notifications_off_outlined, + size: 16, + ), + ), + if (room.isFavourite) + Padding( + padding: EdgeInsets.only( + right: hasNotifications ? 4.0 : 0.0, + ), + child: Icon( + Icons.push_pin, + size: 16, + color: theme.colorScheme.primary, + ), + ), + if (!room.isSpace && + lastEvent != null && + room.membership != Membership.invite) + Padding( + padding: const EdgeInsets.only(left: 4.0), + child: Text( + lastEvent.originServerTs.localizedTimeShort(context), + style: TextStyle( + fontSize: 12, + color: theme.colorScheme.outline, + ), + ), + ), + ], + ), + subtitle: Row( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + if (typingText.isEmpty && + ownMessage && + room.lastEvent!.status.isSending) ...[ + const SizedBox( + width: 16, + height: 16, + child: CircularProgressIndicator.adaptive(strokeWidth: 2), + ), + const SizedBox(width: 4), + ], + AnimatedContainer( + width: typingText.isEmpty ? 0 : 18, + clipBehavior: Clip.hardEdge, + decoration: const BoxDecoration(), + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + padding: const EdgeInsets.only(right: 4), + child: Icon( + Icons.edit_outlined, + color: theme.colorScheme.secondary, + size: 14, + ), + ), + Expanded( + child: room.isSpace && room.membership == Membership.join + ? Text( + L10n.of(context).countChatsAndCountParticipants( + room.spaceChildren.length, + (room.summary.mJoinedMemberCount ?? 1), + ), + style: TextStyle(color: theme.colorScheme.outline), + ) + : typingText.isNotEmpty + ? Text( + typingText, + style: TextStyle( + color: theme.colorScheme.primary, + ), + maxLines: 1, + softWrap: false, + ) + : FutureBuilder( + key: ValueKey( + '${lastEvent?.eventId}_${lastEvent?.type}_${lastEvent?.redacted}', + ), + future: needLastEventSender + ? lastEvent.calcLocalizedBody( + MatrixLocals(L10n.of(context)), + hideReply: true, + hideEdit: true, + plaintextBody: true, + removeMarkdown: true, + withSenderNamePrefix: (!isDirectChat || + directChatMatrixId != + room.lastEvent?.senderId), + ) + : null, + initialData: + lastEvent?.calcLocalizedBodyFallback( + MatrixLocals(L10n.of(context)), + hideReply: true, + hideEdit: true, + plaintextBody: true, + removeMarkdown: true, + withSenderNamePrefix: (!isDirectChat || + directChatMatrixId != + room.lastEvent?.senderId), + ), + builder: (context, snapshot) => Text( + room.membership == Membership.invite + ? "${room + .getState( + EventTypes.RoomMember, + room.client.userID!, + ) + ?.content + .tryGet('reason') ?? + (isDirectChat + ? L10n.of(context).newChatRequest + : L10n.of(context) + .inviteGroupChat)}${inviterMxId != null ? " ($inviterMxId)" : ""}" + : snapshot.data ?? + L10n.of(context).emptyChat, + softWrap: false, + maxLines: room.notificationCount >= 1 ? 2 : 1, + overflow: TextOverflow.ellipsis, + style: TextStyle( + color: unread || room.hasNewMessages + ? theme.colorScheme.onSurface + : theme.colorScheme.outline, + decoration: room.lastEvent?.redacted == true + ? TextDecoration.lineThrough + : null, + ), + ), + ), + ), + const SizedBox(width: 8), + AnimatedContainer( + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + alignment: Alignment.center, + padding: const EdgeInsets.symmetric(horizontal: 7), + height: unreadBubbleSize, + width: !hasNotifications && !unread && !room.hasNewMessages + ? 0 + : (unreadBubbleSize - 9) * + room.notificationCount.toString().length + + 9, + decoration: BoxDecoration( + color: room.highlightCount > 0 || + room.membership == Membership.invite + ? theme.colorScheme.error + : hasNotifications || room.markedUnread + ? theme.colorScheme.primary + : theme.colorScheme.primaryContainer, + borderRadius: BorderRadius.circular(7), + ), + child: hasNotifications + ? Text( + room.notificationCount.toString(), + style: TextStyle( + color: room.highlightCount > 0 || + room.membership == Membership.invite + ? theme.colorScheme.onError + : hasNotifications + ? theme.colorScheme.onPrimary + : theme.colorScheme.onPrimaryContainer, + fontSize: 13, + fontWeight: FontWeight.w500, + ), + textAlign: TextAlign.center, + ) + : const SizedBox.shrink(), + ), + ], + ), + onTap: onTap, + trailing: onForget == null + ? null + : IconButton( + icon: const Icon(Icons.delete_outlined), + onPressed: onForget, + ), + ), + ), + ), + ), + ); + } +} diff --git a/lib/pages/chat_list/chat_list_view.dart b/lib/pages/chat_list/chat_list_view.dart new file mode 100644 index 0000000..8f41281 --- /dev/null +++ b/lib/pages/chat_list/chat_list_view.dart @@ -0,0 +1,70 @@ +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:go_router/go_router.dart'; + +import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/pages/chat_list/chat_list.dart'; +import 'package:fluffychat/widgets/navigation_rail.dart'; +import 'chat_list_body.dart'; + +class ChatListView extends StatelessWidget { + final ChatListController controller; + + const ChatListView(this.controller, {super.key}); + + @override + Widget build(BuildContext context) { + return PopScope( + canPop: !controller.isSearchMode && controller.activeSpaceId == null, + onPopInvokedWithResult: (pop, _) { + if (pop) return; + if (controller.activeSpaceId != null) { + controller.clearActiveSpace(); + return; + } + if (controller.isSearchMode) { + controller.cancelSearch(); + return; + } + }, + child: Row( + children: [ + if (FluffyThemes.isColumnMode(context) && + controller.widget.displayNavigationRail) ...[ + SpacesNavigationRail( + activeSpaceId: controller.activeSpaceId, + onGoToChats: controller.clearActiveSpace, + onGoToSpaceId: controller.setActiveSpace, + ), + Container( + color: Theme.of(context).dividerColor, + width: 1, + ), + ], + Expanded( + child: GestureDetector( + onTap: FocusManager.instance.primaryFocus?.unfocus, + excludeFromSemantics: true, + behavior: HitTestBehavior.translucent, + child: Scaffold( + body: ChatListViewBody(controller), + floatingActionButton: !controller.isSearchMode && + controller.activeSpaceId == null + ? FloatingActionButton.extended( + onPressed: () => context.go('/rooms/newprivatechat'), + icon: const Icon(Icons.add_outlined), + label: Text( + L10n.of(context).chat, + overflow: TextOverflow.fade, + ), + ) + : const SizedBox.shrink(), + ), + ), + ), + ], + ), + ); + } +} diff --git a/lib/pages/chat_list/client_chooser_button.dart b/lib/pages/chat_list/client_chooser_button.dart new file mode 100644 index 0000000..dbf699b --- /dev/null +++ b/lib/pages/chat_list/client_chooser_button.dart @@ -0,0 +1,235 @@ +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; +import 'package:fluffychat/widgets/avatar.dart'; +import 'package:fluffychat/widgets/matrix.dart'; +import '../../utils/fluffy_share.dart'; +import 'chat_list.dart'; + +class ClientChooserButton extends StatelessWidget { + final ChatListController controller; + + const ClientChooserButton(this.controller, {super.key}); + + List> _bundleMenuItems(BuildContext context) { + final matrix = Matrix.of(context); + final bundles = matrix.accountBundles.keys.toList() + ..sort( + (a, b) => a!.isValidMatrixId == b!.isValidMatrixId + ? 0 + : a.isValidMatrixId && !b.isValidMatrixId + ? -1 + : 1, + ); + return >[ + PopupMenuItem( + value: SettingsAction.newGroup, + child: Row( + children: [ + const Icon(Icons.group_add_outlined), + const SizedBox(width: 18), + Text(L10n.of(context).createGroup), + ], + ), + ), + PopupMenuItem( + value: SettingsAction.setStatus, + child: Row( + children: [ + const Icon(Icons.edit_outlined), + const SizedBox(width: 18), + Text(L10n.of(context).setStatus), + ], + ), + ), + PopupMenuItem( + value: SettingsAction.invite, + child: Row( + children: [ + Icon(Icons.adaptive.share_outlined), + const SizedBox(width: 18), + Text(L10n.of(context).inviteContact), + ], + ), + ), + PopupMenuItem( + value: SettingsAction.archive, + child: Row( + children: [ + const Icon(Icons.archive_outlined), + const SizedBox(width: 18), + Text(L10n.of(context).archive), + ], + ), + ), + PopupMenuItem( + value: SettingsAction.settings, + child: Row( + children: [ + const Icon(Icons.settings_outlined), + const SizedBox(width: 18), + Text(L10n.of(context).settings), + ], + ), + ), + const PopupMenuDivider(), + for (final bundle in bundles) ...[ + if (matrix.accountBundles[bundle]!.length != 1 || + matrix.accountBundles[bundle]!.single!.userID != bundle) + PopupMenuItem( + value: null, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Text( + bundle!, + style: TextStyle( + color: Theme.of(context).textTheme.titleMedium!.color, + fontSize: 14, + ), + ), + const Divider(height: 1), + ], + ), + ), + ...matrix.accountBundles[bundle]! + .whereType() + .where((client) => client.isLogged()) + .map( + (client) => PopupMenuItem( + value: client, + child: FutureBuilder( + future: client.fetchOwnProfile(), + builder: (context, snapshot) => Row( + children: [ + Avatar( + mxContent: snapshot.data?.avatarUrl, + name: snapshot.data?.displayName ?? + client.userID!.localpart, + size: 32, + ), + const SizedBox(width: 12), + Expanded( + child: Text( + snapshot.data?.displayName ?? + client.userID!.localpart!, + overflow: TextOverflow.ellipsis, + ), + ), + const SizedBox(width: 12), + IconButton( + icon: const Icon(Icons.edit_outlined), + onPressed: () => controller.editBundlesForAccount( + client.userID, + bundle, + ), + ), + ], + ), + ), + ), + ), + ], + PopupMenuItem( + value: SettingsAction.addAccount, + child: Row( + children: [ + const Icon(Icons.person_add_outlined), + const SizedBox(width: 18), + Text(L10n.of(context).addAccount), + ], + ), + ), + ]; + } + + @override + Widget build(BuildContext context) { + final matrix = Matrix.of(context); + + var clientCount = 0; + matrix.accountBundles.forEach((key, value) => clientCount += value.length); + return FutureBuilder( + future: matrix.client.fetchOwnProfile(), + builder: (context, snapshot) => Stack( + alignment: Alignment.center, + children: [ + ...List.generate( + clientCount, + (index) => const SizedBox.shrink(), + ), + const SizedBox.shrink(), + const SizedBox.shrink(), + PopupMenuButton( + onSelected: (o) => _clientSelected(o, context), + itemBuilder: _bundleMenuItems, + child: Material( + color: Colors.transparent, + borderRadius: BorderRadius.circular(99), + child: Avatar( + mxContent: snapshot.data?.avatarUrl, + name: snapshot.data?.displayName ?? + matrix.client.userID!.localpart, + size: 32, + ), + ), + ), + ], + ), + ); + } + + void _clientSelected( + Object object, + BuildContext context, + ) async { + if (object is Client) { + controller.setActiveClient(object); + } else if (object is String) { + controller.setActiveBundle(object); + } else if (object is SettingsAction) { + switch (object) { + case SettingsAction.addAccount: + final consent = await showOkCancelAlertDialog( + context: context, + title: L10n.of(context).addAccount, + message: L10n.of(context).enableMultiAccounts, + okLabel: L10n.of(context).next, + cancelLabel: L10n.of(context).cancel, + ); + if (consent != OkCancelResult.ok) return; + context.go('/rooms/settings/addaccount'); + break; + case SettingsAction.newGroup: + context.go('/rooms/newgroup'); + break; + case SettingsAction.invite: + FluffyShare.shareInviteLink(context); + break; + case SettingsAction.settings: + context.go('/rooms/settings'); + break; + case SettingsAction.archive: + context.go('/rooms/archive'); + break; + case SettingsAction.setStatus: + controller.setStatus(); + break; + } + } + } +} + +enum SettingsAction { + addAccount, + newGroup, + setStatus, + invite, + settings, + archive, +} diff --git a/lib/pages/chat_list/dummy_chat_list_item.dart b/lib/pages/chat_list/dummy_chat_list_item.dart new file mode 100644 index 0000000..8652ccc --- /dev/null +++ b/lib/pages/chat_list/dummy_chat_list_item.dart @@ -0,0 +1,72 @@ +import 'package:flutter/material.dart'; + +class DummyChatListItem extends StatelessWidget { + final double opacity; + final bool animate; + + const DummyChatListItem({ + required this.opacity, + required this.animate, + super.key, + }); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + final titleColor = theme.textTheme.bodyLarge!.color!.withAlpha(100); + final subtitleColor = theme.textTheme.bodyLarge!.color!.withAlpha(50); + return Opacity( + opacity: opacity, + child: ListTile( + leading: CircleAvatar( + backgroundColor: titleColor, + child: animate + ? CircularProgressIndicator( + strokeWidth: 1, + color: theme.textTheme.bodyLarge!.color, + ) + : const SizedBox.shrink(), + ), + title: Row( + children: [ + Expanded( + child: Container( + height: 14, + decoration: BoxDecoration( + color: titleColor, + borderRadius: BorderRadius.circular(3), + ), + ), + ), + const SizedBox(width: 36), + Container( + height: 14, + width: 14, + decoration: BoxDecoration( + color: subtitleColor, + borderRadius: BorderRadius.circular(14), + ), + ), + const SizedBox(width: 12), + Container( + height: 14, + width: 14, + decoration: BoxDecoration( + color: subtitleColor, + borderRadius: BorderRadius.circular(14), + ), + ), + ], + ), + subtitle: Container( + decoration: BoxDecoration( + color: subtitleColor, + borderRadius: BorderRadius.circular(3), + ), + height: 12, + margin: const EdgeInsets.only(right: 22), + ), + ), + ); + } +} diff --git a/lib/pages/chat_list/navi_rail_item.dart b/lib/pages/chat_list/navi_rail_item.dart new file mode 100644 index 0000000..0e844e0 --- /dev/null +++ b/lib/pages/chat_list/navi_rail_item.dart @@ -0,0 +1,95 @@ +import 'package:flutter/material.dart'; + +import 'package:badges/badges.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/widgets/hover_builder.dart'; +import 'package:fluffychat/widgets/unread_rooms_badge.dart'; +import '../../config/themes.dart'; + +class NaviRailItem extends StatelessWidget { + final String toolTip; + final bool isSelected; + final void Function() onTap; + final Widget icon; + final Widget? selectedIcon; + final bool Function(Room)? unreadBadgeFilter; + + const NaviRailItem({ + required this.toolTip, + required this.isSelected, + required this.onTap, + required this.icon, + this.selectedIcon, + this.unreadBadgeFilter, + super.key, + }); + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + final borderRadius = BorderRadius.circular(AppConfig.borderRadius); + final icon = isSelected ? selectedIcon ?? this.icon : this.icon; + final unreadBadgeFilter = this.unreadBadgeFilter; + return HoverBuilder( + builder: (context, hovered) { + return SizedBox( + height: 72, + width: FluffyThemes.navRailWidth, + child: Stack( + children: [ + Positioned( + top: 8, + bottom: 8, + left: 0, + child: AnimatedContainer( + width: isSelected ? 8 : 0, + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + decoration: BoxDecoration( + color: theme.colorScheme.primary, + borderRadius: const BorderRadius.only( + topRight: Radius.circular(90), + bottomRight: Radius.circular(90), + ), + ), + ), + ), + Center( + child: AnimatedScale( + scale: hovered ? 1.1 : 1.0, + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + child: Material( + borderRadius: borderRadius, + color: isSelected + ? theme.colorScheme.primaryContainer + : theme.colorScheme.surfaceContainerHigh, + child: Tooltip( + message: toolTip, + child: InkWell( + borderRadius: borderRadius, + onTap: onTap, + child: unreadBadgeFilter == null + ? icon + : UnreadRoomsBadge( + filter: unreadBadgeFilter, + badgePosition: BadgePosition.topEnd( + top: -12, + end: -8, + ), + child: icon, + ), + ), + ), + ), + ), + ), + ], + ), + ); + }, + ); + } +} diff --git a/lib/pages/chat_list/search_title.dart b/lib/pages/chat_list/search_title.dart new file mode 100644 index 0000000..496a5fe --- /dev/null +++ b/lib/pages/chat_list/search_title.dart @@ -0,0 +1,75 @@ +import 'package:flutter/material.dart'; + +class SearchTitle extends StatelessWidget { + final String title; + final Widget icon; + final Widget? trailing; + final void Function()? onTap; + final Color? color; + + const SearchTitle({ + required this.title, + required this.icon, + this.trailing, + this.onTap, + this.color, + super.key, + }); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + return Material( + shape: Border( + top: BorderSide( + color: theme.dividerColor, + width: 1, + ), + bottom: BorderSide( + color: theme.dividerColor, + width: 1, + ), + ), + color: color ?? theme.colorScheme.surface, + child: InkWell( + onTap: onTap, + splashColor: theme.colorScheme.surface, + child: Align( + alignment: Alignment.centerLeft, + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 8, + ), + child: IconTheme( + data: theme.iconTheme.copyWith(size: 16), + child: Row( + children: [ + icon, + const SizedBox(width: 16), + Text( + title, + textAlign: TextAlign.left, + style: TextStyle( + color: theme.colorScheme.onSurface, + fontSize: 12, + fontWeight: FontWeight.bold, + ), + ), + if (trailing != null) + Expanded( + child: Align( + alignment: Alignment.centerRight, + child: trailing!, + ), + ), + ], + ), + ), + ), + ), + ), + ); + } +} diff --git a/lib/pages/chat_list/space_view.dart b/lib/pages/chat_list/space_view.dart new file mode 100644 index 0000000..cd6c48a --- /dev/null +++ b/lib/pages/chat_list/space_view.dart @@ -0,0 +1,559 @@ +import 'package:flutter/material.dart'; + +import 'package:collection/collection.dart'; +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart' as sdk; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/pages/chat_list/chat_list_item.dart'; +import 'package:fluffychat/pages/chat_list/search_title.dart'; +import 'package:fluffychat/utils/localized_exception_extension.dart'; +import 'package:fluffychat/utils/stream_extension.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/public_room_dialog.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_modal_action_popup.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_text_input_dialog.dart'; +import 'package:fluffychat/widgets/avatar.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import 'package:fluffychat/widgets/matrix.dart'; + +enum AddRoomType { chat, subspace } + +class SpaceView extends StatefulWidget { + final String spaceId; + final void Function() onBack; + final void Function(String spaceId) toParentSpace; + final void Function(Room room) onChatTab; + final void Function(Room room, BuildContext context) onChatContext; + final String? activeChat; + + const SpaceView({ + required this.spaceId, + required this.onBack, + required this.onChatTab, + required this.activeChat, + required this.toParentSpace, + required this.onChatContext, + super.key, + }); + + @override + State createState() => _SpaceViewState(); +} + +class _SpaceViewState extends State { + final List _discoveredChildren = []; + final TextEditingController _filterController = TextEditingController(); + String? _nextBatch; + bool _noMoreRooms = false; + bool _isLoading = false; + + @override + void initState() { + _loadHierarchy(); + super.initState(); + } + + void _loadHierarchy() async { + final room = Matrix.of(context).client.getRoomById(widget.spaceId); + if (room == null) return; + + setState(() { + _isLoading = true; + }); + + try { + final hierarchy = await room.client.getSpaceHierarchy( + widget.spaceId, + suggestedOnly: false, + maxDepth: 2, + from: _nextBatch, + ); + if (!mounted) return; + setState(() { + _nextBatch = hierarchy.nextBatch; + if (hierarchy.nextBatch == null) { + _noMoreRooms = true; + } + _discoveredChildren.addAll( + hierarchy.rooms + .where((c) => room.client.getRoomById(c.roomId) == null), + ); + _isLoading = false; + }); + } catch (e, s) { + Logs().w('Unable to load hierarchy', e, s); + if (!mounted) return; + ScaffoldMessenger.of(context) + .showSnackBar(SnackBar(content: Text(e.toLocalizedString(context)))); + setState(() { + _isLoading = false; + }); + } + } + + void _joinChildRoom(SpaceRoomsChunk item) async { + final client = Matrix.of(context).client; + final space = client.getRoomById(widget.spaceId); + + final joined = await showAdaptiveDialog( + context: context, + builder: (_) => PublicRoomDialog( + chunk: item, + via: space?.spaceChildren + .firstWhereOrNull( + (child) => child.roomId == item.roomId, + ) + ?.via, + ), + ); + if (mounted && joined == true) { + setState(() { + _discoveredChildren.remove(item); + }); + } + } + + void _onSpaceAction(SpaceActions action) async { + final space = Matrix.of(context).client.getRoomById(widget.spaceId); + + switch (action) { + case SpaceActions.settings: + await space?.postLoad(); + context.push('/rooms/${widget.spaceId}/details'); + break; + case SpaceActions.invite: + await space?.postLoad(); + context.push('/rooms/${widget.spaceId}/invite'); + break; + case SpaceActions.leave: + final confirmed = await showOkCancelAlertDialog( + context: context, + title: L10n.of(context).areYouSure, + message: L10n.of(context).archiveRoomDescription, + okLabel: L10n.of(context).leave, + cancelLabel: L10n.of(context).cancel, + isDestructive: true, + ); + if (!mounted) return; + if (confirmed != OkCancelResult.ok) return; + + final success = await showFutureLoadingDialog( + context: context, + future: () async => await space?.leave(), + ); + if (!mounted) return; + if (success.error != null) return; + widget.onBack(); + } + } + + void _addChatOrSubspace() async { + final roomType = await showModalActionPopup( + context: context, + title: L10n.of(context).addChatOrSubSpace, + actions: [ + AdaptiveModalAction( + value: AddRoomType.subspace, + label: L10n.of(context).createNewSpace, + ), + AdaptiveModalAction( + value: AddRoomType.chat, + label: L10n.of(context).createGroup, + ), + ], + ); + if (roomType == null) return; + + final names = await showTextInputDialog( + context: context, + title: roomType == AddRoomType.subspace + ? L10n.of(context).createNewSpace + : L10n.of(context).createGroup, + hintText: roomType == AddRoomType.subspace + ? L10n.of(context).spaceName + : L10n.of(context).groupName, + minLines: 1, + maxLines: 1, + maxLength: 64, + validator: (text) { + if (text.isEmpty) { + return L10n.of(context).pleaseChoose; + } + return null; + }, + okLabel: L10n.of(context).create, + cancelLabel: L10n.of(context).cancel, + ); + if (names == null) return; + final client = Matrix.of(context).client; + final result = await showFutureLoadingDialog( + context: context, + future: () async { + late final String roomId; + final activeSpace = client.getRoomById(widget.spaceId)!; + await activeSpace.postLoad(); + + if (roomType == AddRoomType.subspace) { + roomId = await client.createSpace( + name: names, + visibility: activeSpace.joinRules == JoinRules.public + ? sdk.Visibility.public + : sdk.Visibility.private, + ); + } else { + roomId = await client.createGroupChat( + groupName: names, + preset: activeSpace.joinRules == JoinRules.public + ? CreateRoomPreset.publicChat + : CreateRoomPreset.privateChat, + visibility: activeSpace.joinRules == JoinRules.public + ? sdk.Visibility.public + : sdk.Visibility.private, + ); + } + await activeSpace.setSpaceChild(roomId); + }, + ); + if (result.error != null) return; + } + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + final room = Matrix.of(context).client.getRoomById(widget.spaceId); + final displayname = + room?.getLocalizedDisplayname() ?? L10n.of(context).nothingFound; + return Scaffold( + appBar: AppBar( + leading: FluffyThemes.isColumnMode(context) + ? null + : Center( + child: CloseButton( + onPressed: widget.onBack, + ), + ), + automaticallyImplyLeading: false, + titleSpacing: FluffyThemes.isColumnMode(context) ? null : 0, + title: ListTile( + contentPadding: EdgeInsets.zero, + leading: Avatar( + mxContent: room?.avatar, + name: displayname, + border: BorderSide(width: 1, color: theme.dividerColor), + borderRadius: BorderRadius.circular(AppConfig.borderRadius / 2), + ), + title: Text( + displayname, + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + subtitle: room == null + ? null + : Text( + L10n.of(context).countChatsAndCountParticipants( + room.spaceChildren.length, + room.summary.mJoinedMemberCount ?? 1, + ), + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + ), + actions: [ + PopupMenuButton( + onSelected: _onSpaceAction, + itemBuilder: (context) => [ + PopupMenuItem( + value: SpaceActions.settings, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + const Icon(Icons.settings_outlined), + const SizedBox(width: 12), + Text(L10n.of(context).settings), + ], + ), + ), + PopupMenuItem( + value: SpaceActions.invite, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + const Icon(Icons.person_add_outlined), + const SizedBox(width: 12), + Text(L10n.of(context).invite), + ], + ), + ), + PopupMenuItem( + value: SpaceActions.leave, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + const Icon(Icons.delete_outlined), + const SizedBox(width: 12), + Text(L10n.of(context).leave), + ], + ), + ), + ], + ), + ], + ), + floatingActionButton: room?.canChangeStateEvent( + EventTypes.SpaceChild, + ) == + true + ? FloatingActionButton.extended( + onPressed: _addChatOrSubspace, + label: Text(L10n.of(context).group), + icon: const Icon(Icons.group_add_outlined), + ) + : null, + body: room == null + ? const Center( + child: Icon( + Icons.search_outlined, + size: 80, + ), + ) + : StreamBuilder( + stream: room.client.onSync.stream + .where((s) => s.hasRoomUpdate) + .rateLimit(const Duration(seconds: 1)), + builder: (context, snapshot) { + final childrenIds = room.spaceChildren + .map((c) => c.roomId) + .whereType() + .toSet(); + + final joinedRooms = room.client.rooms + .where((room) => childrenIds.remove(room.id)) + .toList(); + + final joinedParents = room.spaceParents + .map((parent) { + final roomId = parent.roomId; + if (roomId == null) return null; + return room.client.getRoomById(roomId); + }) + .whereType() + .toList(); + final filter = _filterController.text.trim().toLowerCase(); + return CustomScrollView( + slivers: [ + SliverAppBar( + floating: true, + toolbarHeight: 72, + scrolledUnderElevation: 0, + backgroundColor: Colors.transparent, + automaticallyImplyLeading: false, + title: TextField( + controller: _filterController, + onChanged: (_) => setState(() {}), + textInputAction: TextInputAction.search, + decoration: InputDecoration( + filled: true, + fillColor: theme.colorScheme.secondaryContainer, + border: OutlineInputBorder( + borderSide: BorderSide.none, + borderRadius: BorderRadius.circular(99), + ), + contentPadding: EdgeInsets.zero, + hintText: L10n.of(context).search, + hintStyle: TextStyle( + color: theme.colorScheme.onPrimaryContainer, + fontWeight: FontWeight.normal, + ), + floatingLabelBehavior: FloatingLabelBehavior.never, + prefixIcon: IconButton( + onPressed: () {}, + icon: Icon( + Icons.search_outlined, + color: theme.colorScheme.onPrimaryContainer, + ), + ), + ), + ), + ), + SliverList.builder( + itemCount: joinedParents.length, + itemBuilder: (context, i) { + final displayname = + joinedParents[i].getLocalizedDisplayname(); + return Padding( + padding: const EdgeInsets.symmetric( + horizontal: 8, + vertical: 1, + ), + child: Material( + borderRadius: + BorderRadius.circular(AppConfig.borderRadius), + clipBehavior: Clip.hardEdge, + child: ListTile( + minVerticalPadding: 0, + leading: Icon( + Icons.adaptive.arrow_back_outlined, + size: 16, + ), + title: Row( + children: [ + Avatar( + mxContent: joinedParents[i].avatar, + name: displayname, + size: Avatar.defaultSize / 2, + borderRadius: BorderRadius.circular( + AppConfig.borderRadius / 4, + ), + ), + const SizedBox(width: 8), + Expanded(child: Text(displayname)), + ], + ), + onTap: () => + widget.toParentSpace(joinedParents[i].id), + ), + ), + ); + }, + ), + SliverList.builder( + itemCount: joinedRooms.length, + itemBuilder: (context, i) { + final joinedRoom = joinedRooms[i]; + return ChatListItem( + joinedRoom, + filter: filter, + onTap: () => widget.onChatTab(joinedRoom), + onLongPress: (context) => widget.onChatContext( + joinedRoom, + context, + ), + activeChat: widget.activeChat == joinedRoom.id, + ); + }, + ), + SliverList.builder( + itemCount: _discoveredChildren.length + 2, + itemBuilder: (context, i) { + if (i == 0) { + return SearchTitle( + title: L10n.of(context).discover, + icon: const Icon(Icons.explore_outlined), + ); + } + i--; + if (i == _discoveredChildren.length) { + if (_noMoreRooms) { + return Padding( + padding: const EdgeInsets.all(12.0), + child: Center( + child: Text( + L10n.of(context).noMoreChatsFound, + style: const TextStyle(fontSize: 13), + ), + ), + ); + } + return Padding( + padding: const EdgeInsets.symmetric( + horizontal: 12.0, + vertical: 2.0, + ), + child: TextButton( + onPressed: _isLoading ? null : _loadHierarchy, + child: _isLoading + ? LinearProgressIndicator( + borderRadius: BorderRadius.circular( + AppConfig.borderRadius, + ), + ) + : Text(L10n.of(context).loadMore), + ), + ); + } + final item = _discoveredChildren[i]; + final displayname = item.name ?? + item.canonicalAlias ?? + L10n.of(context).emptyChat; + if (!displayname.toLowerCase().contains(filter)) { + return const SizedBox.shrink(); + } + return Padding( + padding: const EdgeInsets.symmetric( + horizontal: 8, + vertical: 1, + ), + child: Material( + borderRadius: + BorderRadius.circular(AppConfig.borderRadius), + clipBehavior: Clip.hardEdge, + child: ListTile( + visualDensity: + const VisualDensity(vertical: -0.5), + contentPadding: + const EdgeInsets.symmetric(horizontal: 8), + onTap: () => _joinChildRoom(item), + leading: Avatar( + mxContent: item.avatarUrl, + name: displayname, + borderRadius: item.roomType == 'm.space' + ? BorderRadius.circular( + AppConfig.borderRadius / 2, + ) + : null, + ), + title: Row( + children: [ + Expanded( + child: Text( + displayname, + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + ), + Text( + item.numJoinedMembers.toString(), + style: TextStyle( + fontSize: 13, + color: theme.textTheme.bodyMedium!.color, + ), + ), + const SizedBox(width: 4), + const Icon( + Icons.people_outlined, + size: 14, + ), + ], + ), + subtitle: Text( + item.topic ?? + L10n.of(context).countParticipants( + item.numJoinedMembers, + ), + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + ), + ), + ); + }, + ), + const SliverPadding(padding: EdgeInsets.only(top: 32)), + ], + ); + }, + ), + ); + } +} + +enum SpaceActions { + settings, + invite, + leave, +} diff --git a/lib/pages/chat_list/status_msg_list.dart b/lib/pages/chat_list/status_msg_list.dart new file mode 100644 index 0000000..f37732f --- /dev/null +++ b/lib/pages/chat_list/status_msg_list.dart @@ -0,0 +1,320 @@ +import 'package:flutter/material.dart'; + +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/utils/stream_extension.dart'; +import 'package:fluffychat/widgets/avatar.dart'; +import 'package:fluffychat/widgets/hover_builder.dart'; +import 'package:fluffychat/widgets/matrix.dart'; +import '../../widgets/adaptive_dialogs/user_dialog.dart'; + +class StatusMessageList extends StatelessWidget { + final void Function() onStatusEdit; + + const StatusMessageList({ + required this.onStatusEdit, + super.key, + }); + + static const double height = 116; + + void _onStatusTab(BuildContext context, Profile profile) { + final client = Matrix.of(context).client; + if (profile.userId == client.userID) return onStatusEdit(); + + UserDialog.show( + context: context, + profile: profile, + ); + return; + } + + @override + Widget build(BuildContext context) { + final client = Matrix.of(context).client; + final interestingPresences = client.interestingPresences; + + return StreamBuilder( + stream: client.onSync.stream.rateLimit(const Duration(seconds: 3)), + builder: (context, snapshot) { + return AnimatedSize( + duration: FluffyThemes.animationDuration, + curve: Curves.easeInOut, + child: FutureBuilder( + initialData: interestingPresences + // ignore: deprecated_member_use + .map((userId) => client.presences[userId]) + .whereType(), + future: Future.wait( + client.interestingPresences.map( + (userId) => client.fetchCurrentPresence( + userId, + fetchOnlyFromCached: true, + ), + ), + ), + builder: (context, snapshot) { + final presences = + snapshot.data?.where(isInterestingPresence).toList(); + + // If no other presences than the own entry is interesting, we + // hide the presence header. + if (presences == null || presences.length <= 1) { + return const SizedBox.shrink(); + } + + // Make sure own entry is at the first position. Sort by last + // active instead. + presences.sort((a, b) { + if (a.userid == client.userID) return -1; + if (b.userid == client.userID) return 1; + return b.sortOrderDateTime.compareTo(a.sortOrderDateTime); + }); + + return SizedBox( + height: StatusMessageList.height, + child: ListView.builder( + padding: const EdgeInsets.all(8), + scrollDirection: Axis.horizontal, + itemCount: presences.length, + itemBuilder: (context, i) => PresenceAvatar( + presence: presences[i], + height: StatusMessageList.height, + onTap: (profile) => _onStatusTab(context, profile), + ), + ), + ); + }, + ), + ); + }, + ); + } +} + +class PresenceAvatar extends StatelessWidget { + final CachedPresence presence; + final double height; + final void Function(Profile) onTap; + + const PresenceAvatar({ + required this.presence, + required this.height, + required this.onTap, + super.key, + }); + + @override + Widget build(BuildContext context) { + final avatarSize = height - 16 - 16 - 8; + final client = Matrix.of(context).client; + return FutureBuilder( + future: client.getProfileFromUserId(presence.userid), + builder: (context, snapshot) { + final theme = Theme.of(context); + + final profile = snapshot.data; + final displayName = profile?.displayName ?? + presence.userid.localpart ?? + presence.userid; + final statusMsg = presence.statusMsg; + + const statusMsgBubbleElevation = 6.0; + final statusMsgBubbleShadowColor = theme.colorScheme.surface; + final statusMsgBubbleColor = Colors.white.withAlpha(230); + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: SizedBox( + width: avatarSize, + child: Column( + children: [ + HoverBuilder( + builder: (context, hovered) { + return AnimatedScale( + scale: hovered ? 1.15 : 1.0, + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + child: InkWell( + borderRadius: BorderRadius.circular(avatarSize), + onTap: profile == null ? null : () => onTap(profile), + child: Material( + borderRadius: BorderRadius.circular(avatarSize), + child: Stack( + children: [ + Container( + padding: const EdgeInsets.all(3), + decoration: BoxDecoration( + gradient: presence.gradient, + borderRadius: + BorderRadius.circular(avatarSize), + ), + child: Avatar( + name: displayName, + mxContent: profile?.avatarUrl, + size: avatarSize - 6, + ), + ), + if (presence.userid == client.userID) + Positioned( + right: 0, + bottom: 0, + child: SizedBox( + width: 24, + height: 24, + child: FloatingActionButton.small( + heroTag: null, + onPressed: () => onTap( + profile ?? + Profile(userId: presence.userid), + ), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + child: const Icon( + Icons.add_outlined, + size: 16, + ), + ), + ), + ), + if (statusMsg != null) ...[ + Positioned( + left: 0, + top: 0, + right: 8, + child: Material( + elevation: statusMsgBubbleElevation, + shadowColor: statusMsgBubbleShadowColor, + borderRadius: BorderRadius.circular( + AppConfig.borderRadius / 2, + ), + color: statusMsgBubbleColor, + child: Padding( + padding: const EdgeInsets.all(2.0), + child: Text( + statusMsg, + maxLines: 2, + overflow: TextOverflow.ellipsis, + style: const TextStyle( + color: Colors.black, + fontSize: 10.5, + ), + ), + ), + ), + ), + Positioned( + left: 8, + top: 32, + child: Material( + color: statusMsgBubbleColor, + elevation: statusMsgBubbleElevation, + shadowColor: statusMsgBubbleShadowColor, + borderRadius: BorderRadius.circular( + AppConfig.borderRadius / 2, + ), + child: const SizedBox( + width: 8, + height: 8, + ), + ), + ), + Positioned( + left: 14, + top: 40, + child: Material( + color: statusMsgBubbleColor, + elevation: statusMsgBubbleElevation, + shadowColor: statusMsgBubbleShadowColor, + borderRadius: BorderRadius.circular( + AppConfig.borderRadius / 2, + ), + child: const SizedBox( + width: 4, + height: 4, + ), + ), + ), + ], + ], + ), + ), + ), + ); + }, + ), + const Spacer(), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 4.0), + child: Text( + displayName, + textAlign: TextAlign.center, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: const TextStyle( + fontSize: 13, + ), + ), + ), + ], + ), + ), + ); + }, + ); + } +} + +extension on Client { + Set get interestingPresences { + final allHeroes = rooms.map((room) => room.summary.mHeroes).fold( + {}, + (previousValue, element) => previousValue..addAll(element ?? {}), + ); + allHeroes.add(userID!); + return allHeroes; + } +} + +bool isInterestingPresence(CachedPresence presence) => + !presence.presence.isOffline || (presence.statusMsg?.isNotEmpty ?? false); + +extension on CachedPresence { + DateTime get sortOrderDateTime => + lastActiveTimestamp ?? + (currentlyActive == true + ? DateTime.now() + : DateTime.fromMillisecondsSinceEpoch(0)); + + LinearGradient get gradient => presence.isOnline == true + ? LinearGradient( + colors: [ + Colors.green, + Colors.green.shade200, + Colors.green.shade900, + ], + begin: Alignment.topLeft, + end: Alignment.bottomRight, + ) + : presence.isUnavailable + ? LinearGradient( + colors: [ + Colors.yellow, + Colors.yellow.shade200, + Colors.yellow.shade900, + ], + begin: Alignment.topLeft, + end: Alignment.bottomRight, + ) + : LinearGradient( + colors: [ + Colors.grey, + Colors.grey.shade200, + Colors.grey.shade900, + ], + begin: Alignment.topLeft, + end: Alignment.bottomRight, + ); +} diff --git a/lib/pages/chat_members/chat_members.dart b/lib/pages/chat_members/chat_members.dart new file mode 100644 index 0000000..028cbc1 --- /dev/null +++ b/lib/pages/chat_members/chat_members.dart @@ -0,0 +1,115 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; + +import 'package:matrix/matrix.dart'; + +import '../../widgets/matrix.dart'; +import 'chat_members_view.dart'; + +class ChatMembersPage extends StatefulWidget { + final String roomId; + + const ChatMembersPage({required this.roomId, super.key}); + + @override + State createState() => ChatMembersController(); +} + +class ChatMembersController extends State { + List? members; + List? filteredMembers; + Object? error; + Membership membershipFilter = Membership.join; + + final TextEditingController filterController = TextEditingController(); + + void setMembershipFilter(Membership membership) { + membershipFilter = membership; + setFilter(); + } + + void setFilter([_]) async { + final filter = filterController.text.toLowerCase().trim(); + + final members = this + .members + ?.where((member) => member.membership == membershipFilter) + .toList(); + + if (filter.isEmpty) { + setState(() { + filteredMembers = members + ?..sort((b, a) => a.powerLevel.compareTo(b.powerLevel)); + }); + return; + } + setState(() { + filteredMembers = members + ?.where( + (user) => + user.displayName?.toLowerCase().contains(filter) ?? + user.id.toLowerCase().contains(filter), + ) + .toList() + ?..sort((b, a) => a.powerLevel.compareTo(b.powerLevel)); + }); + } + + void refreshMembers([_]) async { + Logs().d('Load room members from', widget.roomId); + try { + setState(() { + error = null; + }); + final participants = await Matrix.of(context) + .client + .getRoomById(widget.roomId) + ?.requestParticipants( + [...Membership.values]..remove(Membership.leave), + ); + + if (!mounted) return; + + setState(() { + members = participants; + }); + setFilter(); + } catch (e, s) { + Logs() + .d('Unable to request participants. Try again in 3 seconds...', e, s); + setState(() { + error = e; + }); + } + } + + StreamSubscription? _updateSub; + + @override + void initState() { + super.initState(); + refreshMembers(); + + _updateSub = Matrix.of(context) + .client + .onSync + .stream + .where( + (syncUpdate) => + syncUpdate.rooms?.join?[widget.roomId]?.timeline?.events + ?.any((state) => state.type == EventTypes.RoomMember) ?? + false, + ) + .listen(refreshMembers); + } + + @override + void dispose() { + _updateSub?.cancel(); + super.dispose(); + } + + @override + Widget build(BuildContext context) => ChatMembersView(this); +} diff --git a/lib/pages/chat_members/chat_members_view.dart b/lib/pages/chat_members/chat_members_view.dart new file mode 100644 index 0000000..727a26f --- /dev/null +++ b/lib/pages/chat_members/chat_members_view.dart @@ -0,0 +1,182 @@ +import 'package:fluffychat/utils/localized_exception_extension.dart'; +import 'package:flutter/material.dart'; +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart'; + +import '../../widgets/layouts/max_width_body.dart'; +import '../../widgets/matrix.dart'; +import '../chat_details/participant_list_item.dart'; +import 'chat_members.dart'; + +class ChatMembersView extends StatelessWidget { + final ChatMembersController controller; + + const ChatMembersView(this.controller, {super.key}); + + @override + Widget build(BuildContext context) { + final room = + Matrix.of(context).client.getRoomById(controller.widget.roomId); + if (room == null) { + return Scaffold( + appBar: AppBar( + title: Text(L10n.of(context).oopsSomethingWentWrong), + ), + body: Center( + child: Text(L10n.of(context).youAreNoLongerParticipatingInThisChat), + ), + ); + } + + final members = controller.filteredMembers; + + final roomCount = (room.summary.mJoinedMemberCount ?? 0) + + (room.summary.mInvitedMemberCount ?? 0); + + final error = controller.error; + final theme = Theme.of(context); + + return Scaffold( + appBar: AppBar( + leading: const Center(child: BackButton()), + title: Text( + L10n.of(context).countParticipants(roomCount), + ), + actions: [ + if (room.canInvite) + IconButton( + onPressed: () => context.go('/rooms/${room.id}/invite'), + icon: const Icon( + Icons.person_add_outlined, + ), + ), + ], + ), + body: MaxWidthBody( + withScrolling: false, + innerPadding: const EdgeInsets.symmetric(vertical: 8), + child: error != null + ? Center( + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + const Icon(Icons.error_outline), + Text(error.toLocalizedString(context)), + const SizedBox(height: 8), + OutlinedButton.icon( + onPressed: controller.refreshMembers, + icon: const Icon(Icons.refresh_outlined), + label: Text(L10n.of(context).tryAgain), + ), + ], + ), + ), + ) + : members == null + ? const Center( + child: Padding( + padding: EdgeInsets.all(16.0), + child: CircularProgressIndicator.adaptive(), + ), + ) + : ListView.builder( + shrinkWrap: true, + itemCount: members.length + 1, + itemBuilder: (context, i) { + if (i == 0) { + final availableFilters = Membership.values + .where( + (membership) => + controller.members?.any( + (member) => member.membership == membership, + ) ?? + false, + ) + .toList(); + availableFilters + .sort((a, b) => a == Membership.join ? -1 : 1); + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + Padding( + padding: const EdgeInsets.all(16.0), + child: TextField( + controller: controller.filterController, + onChanged: controller.setFilter, + decoration: InputDecoration( + filled: true, + fillColor: + theme.colorScheme.secondaryContainer, + border: OutlineInputBorder( + borderSide: BorderSide.none, + borderRadius: BorderRadius.circular(99), + ), + hintStyle: TextStyle( + color: theme.colorScheme.onPrimaryContainer, + fontWeight: FontWeight.normal, + ), + prefixIcon: const Icon(Icons.search_outlined), + hintText: L10n.of(context).search, + ), + ), + ), + if (availableFilters.length > 1) + SizedBox( + height: 64, + child: ListView.builder( + padding: const EdgeInsets.symmetric( + horizontal: 12.0, + vertical: 12.0, + ), + scrollDirection: Axis.horizontal, + itemCount: availableFilters.length, + itemBuilder: (context, i) => Padding( + padding: const EdgeInsets.symmetric( + horizontal: 4.0, + ), + child: FilterChip( + label: Text( + switch (availableFilters[i]) { + Membership.ban => + L10n.of(context).banned, + Membership.invite => + L10n.of(context).invited, + Membership.join => L10n.of(context) + .countParticipants(room.summary + .mJoinedMemberCount ?? + controller.members + ?.where((member) => + member.membership == + Membership.join) + .length ?? + 0), + Membership.knock => + L10n.of(context).knocking, + Membership.leave => + L10n.of(context).leftTheChat, + }, + ), + selected: controller.membershipFilter == + availableFilters[i], + onSelected: (_) => + controller.setMembershipFilter( + availableFilters[i], + ), + ), + ), + ), + ), + ], + ); + } + i--; + return ParticipantListItem(members[i]); + }, + ), + ), + ); + } +} diff --git a/lib/pages/chat_permissions_settings/chat_permissions_settings.dart b/lib/pages/chat_permissions_settings/chat_permissions_settings.dart new file mode 100644 index 0000000..eada670 --- /dev/null +++ b/lib/pages/chat_permissions_settings/chat_permissions_settings.dart @@ -0,0 +1,76 @@ +import 'dart:developer'; + +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/pages/chat_permissions_settings/chat_permissions_settings_view.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import 'package:fluffychat/widgets/matrix.dart'; +import 'package:fluffychat/widgets/permission_slider_dialog.dart'; + +class ChatPermissionsSettings extends StatefulWidget { + const ChatPermissionsSettings({super.key}); + + @override + ChatPermissionsSettingsController createState() => + ChatPermissionsSettingsController(); +} + +class ChatPermissionsSettingsController extends State { + String? get roomId => GoRouterState.of(context).pathParameters['roomid']; + void editPowerLevel( + BuildContext context, + String key, + int currentLevel, { + int? newLevel, + String? category, + }) async { + final room = Matrix.of(context).client.getRoomById(roomId!)!; + if (!room.canSendEvent(EventTypes.RoomPowerLevels)) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text(L10n.of(context).noPermission)), + ); + return; + } + newLevel ??= await showPermissionChooser( + context, + currentLevel: currentLevel, + ); + if (newLevel == null) return; + final content = Map.from( + room.getState(EventTypes.RoomPowerLevels)!.content, + ); + if (category != null) { + if (!content.containsKey(category)) { + content[category] = {}; + } + content[category][key] = newLevel; + } else { + content[key] = newLevel; + } + inspect(content); + await showFutureLoadingDialog( + context: context, + future: () => room.client.setRoomStateWithKey( + room.id, + EventTypes.RoomPowerLevels, + '', + content, + ), + ); + } + + Stream get onChanged => Matrix.of(context).client.onSync.stream.where( + (e) => + (e.rooms?.join?.containsKey(roomId) ?? false) && + (e.rooms!.join![roomId!]?.timeline?.events + ?.any((s) => s.type == EventTypes.RoomPowerLevels) ?? + false), + ); + + @override + Widget build(BuildContext context) => ChatPermissionsSettingsView(this); +} diff --git a/lib/pages/chat_permissions_settings/chat_permissions_settings_view.dart b/lib/pages/chat_permissions_settings/chat_permissions_settings_view.dart new file mode 100644 index 0000000..8e4d038 --- /dev/null +++ b/lib/pages/chat_permissions_settings/chat_permissions_settings_view.dart @@ -0,0 +1,145 @@ +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/pages/chat_permissions_settings/chat_permissions_settings.dart'; +import 'package:fluffychat/pages/chat_permissions_settings/permission_list_tile.dart'; +import 'package:fluffychat/widgets/layouts/max_width_body.dart'; +import 'package:fluffychat/widgets/matrix.dart'; + +class ChatPermissionsSettingsView extends StatelessWidget { + final ChatPermissionsSettingsController controller; + + const ChatPermissionsSettingsView(this.controller, {super.key}); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + return Scaffold( + appBar: AppBar( + leading: const Center(child: BackButton()), + title: Text(L10n.of(context).chatPermissions), + ), + body: MaxWidthBody( + child: StreamBuilder( + stream: controller.onChanged, + builder: (context, _) { + final roomId = controller.roomId; + final room = roomId == null + ? null + : Matrix.of(context).client.getRoomById(roomId); + if (room == null) { + return Center(child: Text(L10n.of(context).noRoomsFound)); + } + final powerLevelsContent = Map.from( + room.getState(EventTypes.RoomPowerLevels)?.content ?? {}, + ); + final powerLevels = Map.from(powerLevelsContent) + ..removeWhere((k, v) => v is! int); + final eventsPowerLevels = Map.from( + powerLevelsContent.tryGetMap('events') ?? {}, + )..removeWhere((k, v) => v is! int); + return Column( + children: [ + ListTile( + leading: const Icon(Icons.info_outlined), + subtitle: Text( + L10n.of(context).chatPermissionsDescription, + ), + ), + Divider(color: theme.dividerColor), + ListTile( + title: Text( + L10n.of(context).chatPermissions, + style: TextStyle( + color: theme.colorScheme.primary, + fontWeight: FontWeight.bold, + ), + ), + ), + Column( + mainAxisSize: MainAxisSize.min, + children: [ + for (final entry in powerLevels.entries) + PermissionsListTile( + permissionKey: entry.key, + permission: entry.value, + onChanged: (level) => controller.editPowerLevel( + context, + entry.key, + entry.value, + newLevel: level, + ), + canEdit: room.canChangePowerLevel, + ), + Divider(color: theme.dividerColor), + ListTile( + title: Text( + L10n.of(context).notifications, + style: TextStyle( + color: theme.colorScheme.primary, + fontWeight: FontWeight.bold, + ), + ), + ), + Builder( + builder: (context) { + const key = 'rooms'; + final value = powerLevelsContent + .containsKey('notifications') + ? powerLevelsContent + .tryGetMap('notifications') + ?.tryGet('rooms') ?? + 0 + : 0; + return PermissionsListTile( + permissionKey: key, + permission: value, + category: 'notifications', + canEdit: room.canChangePowerLevel, + onChanged: (level) => controller.editPowerLevel( + context, + key, + value, + newLevel: level, + category: 'notifications', + ), + ); + }, + ), + Divider(color: theme.dividerColor), + ListTile( + title: Text( + L10n.of(context).configureChat, + style: TextStyle( + color: theme.colorScheme.primary, + fontWeight: FontWeight.bold, + ), + ), + ), + for (final entry in eventsPowerLevels.entries) + PermissionsListTile( + permissionKey: entry.key, + category: 'events', + permission: entry.value ?? 0, + canEdit: room.canChangePowerLevel, + onChanged: (level) => controller.editPowerLevel( + context, + entry.key, + entry.value ?? 0, + newLevel: level, + category: 'events', + ), + ), + ], + ), + ], + ); + }, + ), + ), + ); + } +} diff --git a/lib/pages/chat_permissions_settings/permission_list_tile.dart b/lib/pages/chat_permissions_settings/permission_list_tile.dart new file mode 100644 index 0000000..4ac603c --- /dev/null +++ b/lib/pages/chat_permissions_settings/permission_list_tile.dart @@ -0,0 +1,126 @@ +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/config/app_config.dart'; + +class PermissionsListTile extends StatelessWidget { + final String permissionKey; + final int permission; + final String? category; + final void Function(int? level)? onChanged; + final bool canEdit; + + const PermissionsListTile({ + super.key, + required this.permissionKey, + required this.permission, + this.category, + required this.onChanged, + required this.canEdit, + }); + + String getLocalizedPowerLevelString(BuildContext context) { + if (category == null) { + switch (permissionKey) { + case 'users_default': + return L10n.of(context).defaultPermissionLevel; + case 'events_default': + return L10n.of(context).sendMessages; + case 'state_default': + return L10n.of(context).changeGeneralChatSettings; + case 'ban': + return L10n.of(context).banFromChat; + case 'kick': + return L10n.of(context).kickFromChat; + case 'redact': + return L10n.of(context).deleteMessage; + case 'invite': + return L10n.of(context).inviteOtherUsers; + } + } else if (category == 'notifications') { + switch (permissionKey) { + case 'rooms': + return L10n.of(context).sendRoomNotifications; + } + } else if (category == 'events') { + switch (permissionKey) { + case EventTypes.RoomName: + return L10n.of(context).changeTheNameOfTheGroup; + case EventTypes.RoomTopic: + return L10n.of(context).changeTheDescriptionOfTheGroup; + case EventTypes.RoomPowerLevels: + return L10n.of(context).changeTheChatPermissions; + case EventTypes.HistoryVisibility: + return L10n.of(context).changeTheVisibilityOfChatHistory; + case EventTypes.RoomCanonicalAlias: + return L10n.of(context).changeTheCanonicalRoomAlias; + case EventTypes.RoomAvatar: + return L10n.of(context).editRoomAvatar; + case EventTypes.RoomTombstone: + return L10n.of(context).replaceRoomWithNewerVersion; + case EventTypes.Encryption: + return L10n.of(context).enableEncryption; + case 'm.room.server_acl': + return L10n.of(context).editBlockedServers; + } + } + return permissionKey; + } + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + final color = permission >= 100 + ? Colors.orangeAccent + : permission >= 50 + ? Colors.blueAccent + : Colors.greenAccent; + return ListTile( + title: Text( + getLocalizedPowerLevelString(context), + style: theme.textTheme.titleSmall, + ), + trailing: Material( + color: color.withAlpha(32), + borderRadius: BorderRadius.circular(AppConfig.borderRadius / 2), + child: DropdownButton( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + borderRadius: BorderRadius.circular(AppConfig.borderRadius / 2), + underline: const SizedBox.shrink(), + onChanged: canEdit ? onChanged : null, + value: permission, + items: [ + DropdownMenuItem( + value: permission < 50 ? permission : 0, + child: Text( + L10n.of(context).userLevel(permission < 50 ? permission : 0), + ), + ), + DropdownMenuItem( + value: permission < 100 && permission >= 50 ? permission : 50, + child: Text( + L10n.of(context).moderatorLevel( + permission < 100 && permission >= 50 ? permission : 50, + ), + ), + ), + DropdownMenuItem( + value: permission >= 100 ? permission : 100, + child: Text( + L10n.of(context) + .adminLevel(permission >= 100 ? permission : 100), + ), + ), + DropdownMenuItem( + value: null, + child: Text(L10n.of(context).custom), + ), + ], + ), + ), + ); + } +} diff --git a/lib/pages/chat_search/chat_search_files_tab.dart b/lib/pages/chat_search/chat_search_files_tab.dart new file mode 100644 index 0000000..836833b --- /dev/null +++ b/lib/pages/chat_search/chat_search_files_tab.dart @@ -0,0 +1,175 @@ +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/utils/date_time_extension.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/event_extension.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; + +class ChatSearchFilesTab extends StatelessWidget { + final Room room; + final Stream<(List, String?)>? searchStream; + final void Function({ + String? prevBatch, + List? previousSearchResult, + }) startSearch; + + const ChatSearchFilesTab({ + required this.room, + required this.startSearch, + required this.searchStream, + super.key, + }); + + @override + Widget build(BuildContext context) { + return StreamBuilder( + stream: searchStream, + builder: (context, snapshot) { + final theme = Theme.of(context); + final events = snapshot.data?.$1; + if (searchStream == null || events == null) { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const CircularProgressIndicator.adaptive(strokeWidth: 2), + const SizedBox(height: 8), + Text( + L10n.of(context).searchIn( + room.getLocalizedDisplayname( + MatrixLocals(L10n.of(context)), + ), + ), + ), + ], + ); + } + + if (events.isEmpty) { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Icon(Icons.file_present_outlined, size: 64), + const SizedBox(height: 8), + Text(L10n.of(context).nothingFound), + ], + ); + } + + return SelectionArea( + child: ListView.builder( + padding: const EdgeInsets.all(8.0), + itemCount: events.length + 1, + itemBuilder: (context, i) { + if (i == events.length) { + if (snapshot.connectionState != ConnectionState.done) { + return const Padding( + padding: EdgeInsets.all(16.0), + child: Center( + child: CircularProgressIndicator.adaptive( + strokeWidth: 2, + ), + ), + ); + } + final nextBatch = snapshot.data?.$2; + if (nextBatch == null) { + return const SizedBox.shrink(); + } + return Center( + child: Padding( + padding: const EdgeInsets.all(16.0), + child: TextButton.icon( + style: TextButton.styleFrom( + backgroundColor: theme.colorScheme.secondaryContainer, + foregroundColor: theme.colorScheme.onSecondaryContainer, + ), + onPressed: () => startSearch( + prevBatch: nextBatch, + previousSearchResult: events, + ), + icon: const Icon( + Icons.arrow_downward_outlined, + ), + label: Text(L10n.of(context).searchMore), + ), + ), + ); + } + final event = events[i]; + final filename = event.content.tryGet('filename') ?? + event.content.tryGet('body') ?? + L10n.of(context).unknownEvent('File'); + final filetype = (filename.contains('.') + ? filename.split('.').last.toUpperCase() + : event.content + .tryGetMap('info') + ?.tryGet('mimetype') + ?.toUpperCase() ?? + 'UNKNOWN'); + final sizeString = event.sizeString; + final prevEvent = i > 0 ? events[i - 1] : null; + final sameEnvironment = prevEvent == null + ? false + : prevEvent.originServerTs + .sameEnvironment(event.originServerTs); + return Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + if (!sameEnvironment) ...[ + Row( + children: [ + Expanded( + child: Container( + height: 1, + color: theme.dividerColor, + ), + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: Text( + event.originServerTs.localizedTime(context), + style: theme.textTheme.labelSmall, + textAlign: TextAlign.center, + ), + ), + Expanded( + child: Container( + height: 1, + color: theme.dividerColor, + ), + ), + ], + ), + const SizedBox(height: 4), + ], + Material( + borderRadius: + BorderRadius.circular(AppConfig.borderRadius), + color: theme.colorScheme.onInverseSurface, + clipBehavior: Clip.hardEdge, + child: ListTile( + leading: const Icon(Icons.file_present_outlined), + title: Text( + filename, + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + subtitle: Text('$sizeString | $filetype'), + onTap: () => event.saveFile(context), + ), + ), + ], + ), + ); + }, + ), + ); + }, + ); + } +} diff --git a/lib/pages/chat_search/chat_search_images_tab.dart b/lib/pages/chat_search/chat_search_images_tab.dart new file mode 100644 index 0000000..4a9b8f8 --- /dev/null +++ b/lib/pages/chat_search/chat_search_images_tab.dart @@ -0,0 +1,195 @@ +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:intl/intl.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/pages/chat/events/video_player.dart'; +import 'package:fluffychat/pages/image_viewer/image_viewer.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; +import 'package:fluffychat/widgets/mxc_image.dart'; + +class ChatSearchImagesTab extends StatelessWidget { + final Room room; + final Stream<(List, String?)>? searchStream; + final void Function({ + String? prevBatch, + List? previousSearchResult, + }) startSearch; + + const ChatSearchImagesTab({ + required this.room, + required this.startSearch, + required this.searchStream, + super.key, + }); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + final borderRadius = BorderRadius.circular(AppConfig.borderRadius / 2); + return StreamBuilder( + stream: searchStream, + builder: (context, snapshot) { + final theme = Theme.of(context); + final events = snapshot.data?.$1; + if (searchStream == null || events == null) { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const CircularProgressIndicator.adaptive(strokeWidth: 2), + const SizedBox(height: 8), + Text( + L10n.of(context).searchIn( + room.getLocalizedDisplayname( + MatrixLocals(L10n.of(context)), + ), + ), + ), + ], + ); + } + if (events.isEmpty) { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Icon(Icons.photo_outlined, size: 64), + const SizedBox(height: 8), + Text(L10n.of(context).nothingFound), + ], + ); + } + final eventsByMonth = >{}; + for (final event in events) { + final month = DateTime( + event.originServerTs.year, + event.originServerTs.month, + ); + eventsByMonth[month] ??= []; + eventsByMonth[month]!.add(event); + } + final eventsByMonthList = eventsByMonth.entries.toList(); + + const padding = 8.0; + + return ListView.builder( + itemCount: eventsByMonth.length + 1, + itemBuilder: (context, i) { + if (i == eventsByMonth.length) { + if (snapshot.connectionState != ConnectionState.done) { + return const Padding( + padding: EdgeInsets.all(16.0), + child: Center( + child: CircularProgressIndicator.adaptive( + strokeWidth: 2, + ), + ), + ); + } + final nextBatch = snapshot.data?.$2; + if (nextBatch == null) { + return const SizedBox.shrink(); + } + return Center( + child: Padding( + padding: const EdgeInsets.all(16.0), + child: TextButton.icon( + style: TextButton.styleFrom( + backgroundColor: theme.colorScheme.secondaryContainer, + foregroundColor: theme.colorScheme.onSecondaryContainer, + ), + onPressed: () => startSearch( + prevBatch: nextBatch, + previousSearchResult: events, + ), + icon: const Icon( + Icons.arrow_downward_outlined, + ), + label: Text(L10n.of(context).searchMore), + ), + ), + ); + } + + final monthEvents = eventsByMonthList[i].value; + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + const SizedBox(height: 4), + Row( + children: [ + Expanded( + child: Container( + height: 1, + color: theme.dividerColor, + ), + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: Text( + DateFormat.yMMMM( + Localizations.localeOf(context).languageCode, + ).format(eventsByMonthList[i].key), + style: theme.textTheme.labelSmall, + textAlign: TextAlign.center, + ), + ), + Expanded( + child: Container( + height: 1, + color: theme.dividerColor, + ), + ), + ], + ), + GridView.count( + physics: const NeverScrollableScrollPhysics(), + shrinkWrap: true, + mainAxisSpacing: padding, + crossAxisSpacing: padding, + clipBehavior: Clip.hardEdge, + padding: const EdgeInsets.all(padding), + crossAxisCount: 3, + children: monthEvents.map( + (event) { + if (event.messageType == MessageTypes.Video) { + return Material( + clipBehavior: Clip.hardEdge, + borderRadius: borderRadius, + child: EventVideoPlayer(event, theme.colorScheme.onSurface, theme.colorScheme.primary), + ); + } + return InkWell( + onTap: () => showDialog( + context: context, + builder: (_) => ImageViewer( + event, + outerContext: context, + ), + ), + borderRadius: borderRadius, + child: Material( + clipBehavior: Clip.hardEdge, + borderRadius: borderRadius, + child: MxcImage( + event: event, + width: 128, + height: 128, + fit: BoxFit.cover, + animated: true, + isThumbnail: true, + ), + ), + ); + }, + ).toList(), + ), + ], + ); + }, + ); + }, + ); + } +} diff --git a/lib/pages/chat_search/chat_search_message_tab.dart b/lib/pages/chat_search/chat_search_message_tab.dart new file mode 100644 index 0000000..bbf5459 --- /dev/null +++ b/lib/pages/chat_search/chat_search_message_tab.dart @@ -0,0 +1,188 @@ +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:flutter_linkify/flutter_linkify.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/utils/date_time_extension.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; +import 'package:fluffychat/utils/url_launcher.dart'; +import 'package:fluffychat/widgets/avatar.dart'; + +class ChatSearchMessageTab extends StatelessWidget { + final String searchQuery; + final Room room; + final Stream<(List, String?)>? searchStream; + final void Function({ + String? prevBatch, + List? previousSearchResult, + }) startSearch; + + const ChatSearchMessageTab({ + required this.searchQuery, + required this.room, + required this.searchStream, + required this.startSearch, + super.key, + }); + + @override + Widget build(BuildContext context) { + return StreamBuilder( + key: ValueKey(searchQuery), + stream: searchStream, + builder: (context, snapshot) { + final theme = Theme.of(context); + if (searchStream == null) { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Icon(Icons.search_outlined, size: 64), + const SizedBox(height: 8), + Text( + L10n.of(context).searchIn( + room.getLocalizedDisplayname( + MatrixLocals(L10n.of(context)), + ), + ), + ), + ], + ); + } + final events = snapshot.data?.$1 ?? []; + + return SelectionArea( + child: ListView.separated( + itemCount: events.length + 1, + separatorBuilder: (context, _) => Divider( + color: theme.dividerColor, + height: 1, + ), + itemBuilder: (context, i) { + if (i == events.length) { + if (snapshot.connectionState != ConnectionState.done) { + return const Padding( + padding: EdgeInsets.all(16.0), + child: Center( + child: CircularProgressIndicator.adaptive( + strokeWidth: 2, + ), + ), + ); + } + final nextBatch = snapshot.data?.$2; + if (nextBatch == null) { + return const SizedBox.shrink(); + } + return Center( + child: Padding( + padding: const EdgeInsets.all(16.0), + child: TextButton.icon( + style: TextButton.styleFrom( + backgroundColor: theme.colorScheme.secondaryContainer, + foregroundColor: theme.colorScheme.onSecondaryContainer, + ), + onPressed: () => startSearch( + prevBatch: nextBatch, + previousSearchResult: events, + ), + icon: const Icon( + Icons.arrow_downward_outlined, + ), + label: Text(L10n.of(context).searchMore), + ), + ), + ); + } + final event = events[i]; + final sender = event.senderFromMemoryOrFallback; + final displayname = sender.calcDisplayname( + i18n: MatrixLocals(L10n.of(context)), + ); + return _MessageSearchResultListTile( + sender: sender, + displayname: displayname, + event: event, + room: room, + ); + }, + ), + ); + }, + ); + } +} + +class _MessageSearchResultListTile extends StatelessWidget { + const _MessageSearchResultListTile({ + required this.sender, + required this.displayname, + required this.event, + required this.room, + }); + + final User sender; + final String displayname; + final Event event; + final Room room; + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + return ListTile( + title: Row( + children: [ + Avatar( + mxContent: sender.avatarUrl, + name: displayname, + size: 16, + ), + const SizedBox(width: 8), + Text( + displayname, + ), + Expanded( + child: Text( + ' | ${event.originServerTs.localizedTimeShort(context)}', + style: const TextStyle(fontSize: 12), + ), + ), + ], + ), + subtitle: Linkify( + textScaleFactor: MediaQuery.textScalerOf(context).scale(1), + options: const LinkifyOptions(humanize: false), + linkStyle: TextStyle( + color: theme.colorScheme.primary, + decoration: TextDecoration.underline, + decorationColor: theme.colorScheme.primary, + ), + onOpen: (url) => UrlLauncher(context, url.url).launchUrl(), + text: event + .calcLocalizedBodyFallback( + plaintextBody: true, + removeMarkdown: true, + MatrixLocals( + L10n.of(context), + ), + ) + .trim(), + maxLines: 7, + overflow: TextOverflow.ellipsis, + ), + trailing: IconButton( + icon: const Icon( + Icons.chevron_right_outlined, + ), + onPressed: () => context.go( + '/${Uri( + pathSegments: ['rooms', room.id], + queryParameters: {'event': event.eventId}, + )}', + ), + ), + ); + } +} diff --git a/lib/pages/chat_search/chat_search_page.dart b/lib/pages/chat_search/chat_search_page.dart new file mode 100644 index 0000000..40109d0 --- /dev/null +++ b/lib/pages/chat_search/chat_search_page.dart @@ -0,0 +1,196 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; + +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/pages/chat_search/chat_search_view.dart'; +import 'package:fluffychat/widgets/matrix.dart'; + +class ChatSearchPage extends StatefulWidget { + final String roomId; + const ChatSearchPage({required this.roomId, super.key}); + + @override + ChatSearchController createState() => ChatSearchController(); +} + +class ChatSearchController extends State + with SingleTickerProviderStateMixin { + Room? get room => Matrix.of(context).client.getRoomById(widget.roomId); + + final TextEditingController searchController = TextEditingController(); + late final TabController tabController; + + Timeline? timeline; + + Stream<(List, String?)>? searchStream; + Stream<(List, String?)>? galleryStream; + Stream<(List, String?)>? fileStream; + + void restartSearch() { + if (searchController.text.isEmpty) { + setState(() { + searchStream = null; + }); + return; + } + setState(() { + searchStream = const Stream.empty(); + }); + WidgetsBinding.instance.addPostFrameCallback((timeStamp) { + startMessageSearch(); + }); + } + + void startMessageSearch({ + String? prevBatch, + List? previousSearchResult, + }) async { + final timeline = this.timeline ??= await room!.getTimeline(); + + if (tabController.index == 0 && searchController.text.isEmpty) { + return; + } + + setState(() { + searchStream = timeline + .startSearch( + searchTerm: searchController.text, + prevBatch: prevBatch, + requestHistoryCount: 1000, + limit: 32, + ) + .map( + (result) => ( + [ + if (previousSearchResult != null) ...previousSearchResult, + ...result.$1, + ], + result.$2, + ), + ) + // Deduplication workaround for + // https://github.com/famedly/matrix-dart-sdk/issues/1831 + .map( + (result) => ( + { + for (final event in result.$1) event.eventId: event, + }.values.toList(), + result.$2, + ), + ) + .asBroadcastStream(); + }); + } + + void startGallerySearch({ + String? prevBatch, + List? previousSearchResult, + }) async { + final timeline = this.timeline ??= await room!.getTimeline(); + + setState(() { + galleryStream = timeline + .startSearch( + searchFunc: (event) => { + MessageTypes.Image, + MessageTypes.Video, + }.contains(event.messageType), + prevBatch: prevBatch, + requestHistoryCount: 1000, + limit: 32, + ) + .map( + (result) => ( + [ + if (previousSearchResult != null) ...previousSearchResult, + ...result.$1, + ], + result.$2, + ), + ) + // Deduplication workaround for + // https://github.com/famedly/matrix-dart-sdk/issues/1831 + .map( + (result) => ( + { + for (final event in result.$1) event.eventId: event, + }.values.toList(), + result.$2, + ), + ) + .asBroadcastStream(); + }); + } + + void startFileSearch({ + String? prevBatch, + List? previousSearchResult, + }) async { + final timeline = this.timeline ??= await room!.getTimeline(); + + setState(() { + fileStream = timeline + .startSearch( + searchFunc: (event) => + event.messageType == MessageTypes.File || + (event.messageType == MessageTypes.Audio && + !event.content.containsKey('org.matrix.msc3245.voice')), + prevBatch: prevBatch, + requestHistoryCount: 1000, + limit: 32, + ) + .map( + (result) => ( + [ + if (previousSearchResult != null) ...previousSearchResult, + ...result.$1, + ], + result.$2, + ), + ) + // Deduplication workaround for + // https://github.com/famedly/matrix-dart-sdk/issues/1831 + .map( + (result) => ( + { + for (final event in result.$1) event.eventId: event, + }.values.toList(), + result.$2, + ), + ) + .asBroadcastStream(); + }); + } + + void _onTabChanged() { + switch (tabController.index) { + case 1: + startGallerySearch(); + break; + case 2: + startFileSearch(); + break; + default: + restartSearch(); + break; + } + } + + @override + void initState() { + super.initState(); + tabController = TabController(initialIndex: 0, length: 3, vsync: this); + tabController.addListener(_onTabChanged); + } + + @override + void dispose() { + tabController.removeListener(_onTabChanged); + super.dispose(); + } + + @override + Widget build(BuildContext context) => ChatSearchView(this); +} diff --git a/lib/pages/chat_search/chat_search_view.dart b/lib/pages/chat_search/chat_search_view.dart new file mode 100644 index 0000000..9a1d9b0 --- /dev/null +++ b/lib/pages/chat_search/chat_search_view.dart @@ -0,0 +1,112 @@ +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; + +import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/pages/chat_search/chat_search_files_tab.dart'; +import 'package:fluffychat/pages/chat_search/chat_search_images_tab.dart'; +import 'package:fluffychat/pages/chat_search/chat_search_message_tab.dart'; +import 'package:fluffychat/pages/chat_search/chat_search_page.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; +import 'package:fluffychat/widgets/layouts/max_width_body.dart'; + +class ChatSearchView extends StatelessWidget { + final ChatSearchController controller; + + const ChatSearchView(this.controller, {super.key}); + + @override + Widget build(BuildContext context) { + final room = controller.room; + if (room == null) { + return Scaffold( + appBar: AppBar(title: Text(L10n.of(context).oopsSomethingWentWrong)), + body: Center( + child: Padding( + padding: const EdgeInsets.all(16), + child: Text(L10n.of(context).youAreNoLongerParticipatingInThisChat), + ), + ), + ); + } + + final theme = Theme.of(context); + + return Scaffold( + appBar: AppBar( + leading: const Center(child: BackButton()), + titleSpacing: 0, + title: Text( + L10n.of(context).searchIn( + room.getLocalizedDisplayname(MatrixLocals(L10n.of(context))), + ), + ), + ), + body: MaxWidthBody( + withScrolling: false, + child: Column( + children: [ + if (FluffyThemes.isThreeColumnMode(context)) + const SizedBox(height: 16), + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 16, + ), + child: TextField( + controller: controller.searchController, + onSubmitted: (_) => controller.restartSearch(), + autofocus: true, + enabled: controller.tabController.index == 0, + decoration: InputDecoration( + hintText: L10n.of(context).search, + prefixIcon: const Icon(Icons.search_outlined), + filled: true, + fillColor: theme.colorScheme.secondaryContainer, + border: OutlineInputBorder( + borderSide: BorderSide.none, + borderRadius: BorderRadius.circular(99), + ), + hintStyle: TextStyle( + color: theme.colorScheme.onPrimaryContainer, + fontWeight: FontWeight.normal, + ), + ), + ), + ), + TabBar( + controller: controller.tabController, + tabs: [ + Tab(child: Text(L10n.of(context).messages)), + Tab(child: Text(L10n.of(context).gallery)), + Tab(child: Text(L10n.of(context).files)), + ], + ), + Expanded( + child: TabBarView( + controller: controller.tabController, + children: [ + ChatSearchMessageTab( + searchQuery: controller.searchController.text, + room: room, + startSearch: controller.startMessageSearch, + searchStream: controller.searchStream, + ), + ChatSearchImagesTab( + room: room, + startSearch: controller.startGallerySearch, + searchStream: controller.galleryStream, + ), + ChatSearchFilesTab( + room: room, + startSearch: controller.startFileSearch, + searchStream: controller.fileStream, + ), + ], + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/pages/device_settings/device_settings.dart b/lib/pages/device_settings/device_settings.dart new file mode 100644 index 0000000..6f7a235 --- /dev/null +++ b/lib/pages/device_settings/device_settings.dart @@ -0,0 +1,162 @@ +import 'package:flutter/material.dart'; + +import 'package:collection/collection.dart' show IterableExtension; +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:matrix/encryption/utils/key_verification.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/pages/device_settings/device_settings_view.dart'; +import 'package:fluffychat/pages/key_verification/key_verification_dialog.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_text_input_dialog.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import '../../widgets/matrix.dart'; + +class DevicesSettings extends StatefulWidget { + const DevicesSettings({super.key}); + + @override + DevicesSettingsController createState() => DevicesSettingsController(); +} + +class DevicesSettingsController extends State { + List? devices; + Future loadUserDevices(BuildContext context) async { + if (devices != null) return true; + devices = await Matrix.of(context).client.getDevices(); + return true; + } + + void reload() => setState(() => devices = null); + + bool? chatBackupEnabled; + + @override + void initState() { + _checkChatBackup(); + super.initState(); + } + + void _checkChatBackup() async { + final client = Matrix.of(context).client; + if (client.encryption?.keyManager.enabled == true) { + if (await client.encryption?.keyManager.isCached() == false || + await client.encryption?.crossSigning.isCached() == false || + client.isUnknownSession && !mounted) { + setState(() { + chatBackupEnabled = false; + }); + return; + } + } + } + + void removeDevicesAction(List devices) async { + if (await showOkCancelAlertDialog( + context: context, + title: L10n.of(context).areYouSure, + okLabel: L10n.of(context).remove, + cancelLabel: L10n.of(context).cancel, + message: L10n.of(context).removeDevicesDescription, + isDestructive: true, + ) == + OkCancelResult.cancel) { + return; + } + final matrix = Matrix.of(context); + final deviceIds = []; + for (final userDevice in devices) { + deviceIds.add(userDevice.deviceId); + } + + await showFutureLoadingDialog( + context: context, + delay: false, + future: () => matrix.client.uiaRequestBackground( + (auth) => matrix.client.deleteDevices( + deviceIds, + auth: auth, + ), + ), + ); + reload(); + } + + void renameDeviceAction(Device device) async { + final displayName = await showTextInputDialog( + context: context, + title: L10n.of(context).changeDeviceName, + okLabel: L10n.of(context).ok, + cancelLabel: L10n.of(context).cancel, + hintText: device.displayName, + ); + if (displayName == null) return; + final success = await showFutureLoadingDialog( + context: context, + future: () => Matrix.of(context) + .client + .updateDevice(device.deviceId, displayName: displayName), + ); + if (success.error == null) { + reload(); + } + } + + void verifyDeviceAction(Device device) async { + final consent = await showOkCancelAlertDialog( + context: context, + title: L10n.of(context).verifyOtherDevice, + message: L10n.of(context).verifyOtherDeviceDescription, + okLabel: L10n.of(context).ok, + cancelLabel: L10n.of(context).cancel, + ); + if (consent != OkCancelResult.ok) return; + final req = await Matrix.of(context) + .client + .userDeviceKeys[Matrix.of(context).client.userID!]! + .deviceKeys[device.deviceId]! + .startVerification(); + req.onUpdate = () { + if ({KeyVerificationState.error, KeyVerificationState.done} + .contains(req.state)) { + setState(() {}); + } + }; + await KeyVerificationDialog(request: req).show(context); + } + + void blockDeviceAction(Device device) async { + final key = Matrix.of(context) + .client + .userDeviceKeys[Matrix.of(context).client.userID!]! + .deviceKeys[device.deviceId]!; + if (key.directVerified) { + await key.setVerified(false); + } + await key.setBlocked(true); + setState(() {}); + } + + void unblockDeviceAction(Device device) async { + final key = Matrix.of(context) + .client + .userDeviceKeys[Matrix.of(context).client.userID!]! + .deviceKeys[device.deviceId]!; + await key.setBlocked(false); + setState(() {}); + } + + bool _isOwnDevice(Device userDevice) => + userDevice.deviceId == Matrix.of(context).client.deviceID; + + Device? get thisDevice => devices!.firstWhereOrNull( + _isOwnDevice, + ); + + List get notThisDevice => List.from(devices!) + ..removeWhere(_isOwnDevice) + ..sort((a, b) => (b.lastSeenTs ?? 0).compareTo(a.lastSeenTs ?? 0)); + + @override + Widget build(BuildContext context) => DevicesSettingsView(this); +} diff --git a/lib/pages/device_settings/device_settings_view.dart b/lib/pages/device_settings/device_settings_view.dart new file mode 100644 index 0000000..02f10a4 --- /dev/null +++ b/lib/pages/device_settings/device_settings_view.dart @@ -0,0 +1,143 @@ +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; + +import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/pages/device_settings/device_settings.dart'; +import 'package:fluffychat/widgets/layouts/max_width_body.dart'; +import 'user_device_list_item.dart'; + +class DevicesSettingsView extends StatelessWidget { + final DevicesSettingsController controller; + + const DevicesSettingsView(this.controller, {super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + automaticallyImplyLeading: !FluffyThemes.isColumnMode(context), + centerTitle: FluffyThemes.isColumnMode(context), + title: Text(L10n.of(context).devices), + ), + body: MaxWidthBody( + child: FutureBuilder( + future: controller.loadUserDevices(context), + builder: (BuildContext context, snapshot) { + final theme = Theme.of(context); + if (snapshot.hasError) { + return Center( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + const Icon(Icons.error_outlined), + Text(snapshot.error.toString()), + ], + ), + ); + } + if (!snapshot.hasData || controller.devices == null) { + return const Center( + child: CircularProgressIndicator.adaptive(strokeWidth: 2), + ); + } + return ListView.builder( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemCount: controller.notThisDevice.length + 1, + itemBuilder: (BuildContext context, int i) { + if (i == 0) { + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + if (controller.chatBackupEnabled == false) + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: ListTile( + leading: const CircleAvatar( + child: Icon(Icons.info_outlined), + ), + subtitle: Text( + L10n.of(context) + .noticeChatBackupDeviceVerification, + ), + ), + ), + if (controller.thisDevice != null) ...[ + Container( + padding: const EdgeInsets.symmetric( + horizontal: 16.0, + vertical: 8.0, + ), + alignment: Alignment.centerLeft, + child: Text( + L10n.of(context).thisDevice, + style: TextStyle( + fontWeight: FontWeight.bold, + color: theme.colorScheme.primary, + ), + textAlign: TextAlign.left, + ), + ), + UserDeviceListItem( + controller.thisDevice!, + rename: controller.renameDeviceAction, + remove: (d) => controller.removeDevicesAction([d]), + verify: controller.verifyDeviceAction, + block: controller.blockDeviceAction, + unblock: controller.unblockDeviceAction, + ), + ], + if (controller.notThisDevice.isNotEmpty) + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 16.0, + vertical: 8.0, + ), + child: SizedBox( + width: double.infinity, + child: TextButton.icon( + label: Text( + L10n.of(context).removeAllOtherDevices, + ), + style: TextButton.styleFrom( + iconColor: theme.colorScheme.onErrorContainer, + foregroundColor: + theme.colorScheme.onErrorContainer, + backgroundColor: + theme.colorScheme.errorContainer, + ), + icon: const Icon(Icons.delete_outline), + onPressed: () => controller.removeDevicesAction( + controller.notThisDevice, + ), + ), + ), + ) + else + Center( + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Text(L10n.of(context).noOtherDevicesFound), + ), + ), + ], + ); + } + i--; + return UserDeviceListItem( + controller.notThisDevice[i], + rename: controller.renameDeviceAction, + remove: (d) => controller.removeDevicesAction([d]), + verify: controller.verifyDeviceAction, + block: controller.blockDeviceAction, + unblock: controller.unblockDeviceAction, + ); + }, + ); + }, + ), + ), + ); + } +} diff --git a/lib/pages/device_settings/user_device_list_item.dart b/lib/pages/device_settings/user_device_list_item.dart new file mode 100644 index 0000000..0586f21 --- /dev/null +++ b/lib/pages/device_settings/user_device_list_item.dart @@ -0,0 +1,154 @@ +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_modal_action_popup.dart'; +import '../../utils/date_time_extension.dart'; +import '../../utils/matrix_sdk_extensions/device_extension.dart'; +import '../../widgets/matrix.dart'; + +enum UserDeviceListItemAction { + rename, + remove, + verify, + block, + unblock, +} + +class UserDeviceListItem extends StatelessWidget { + final Device userDevice; + final void Function(Device) remove; + final void Function(Device) rename; + final void Function(Device) verify; + final void Function(Device) block; + final void Function(Device) unblock; + + const UserDeviceListItem( + this.userDevice, { + required this.remove, + required this.rename, + required this.verify, + required this.block, + required this.unblock, + super.key, + }); + + @override + Widget build(BuildContext context) { + final client = Matrix.of(context).client; + final keys = client.userDeviceKeys[Matrix.of(context).client.userID] + ?.deviceKeys[userDevice.deviceId]; + final isOwnDevice = userDevice.deviceId == client.deviceID; + + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: Material( + borderRadius: BorderRadius.circular(AppConfig.borderRadius), + clipBehavior: Clip.hardEdge, + child: ListTile( + onTap: () async { + final action = await showModalActionPopup( + context: context, + title: '${userDevice.displayName} (${userDevice.deviceId})', + cancelLabel: L10n.of(context).cancel, + actions: [ + AdaptiveModalAction( + value: UserDeviceListItemAction.rename, + icon: const Icon(Icons.edit_outlined), + label: L10n.of(context).changeDeviceName, + ), + if (!isOwnDevice && keys != null) ...{ + AdaptiveModalAction( + value: UserDeviceListItemAction.verify, + icon: const Icon(Icons.verified_outlined), + label: L10n.of(context).verifyStart, + ), + if (!keys.blocked) + AdaptiveModalAction( + value: UserDeviceListItemAction.block, + icon: const Icon(Icons.block_outlined), + label: L10n.of(context).blockDevice, + isDestructive: true, + ), + if (keys.blocked) + AdaptiveModalAction( + value: UserDeviceListItemAction.unblock, + icon: const Icon(Icons.block), + label: L10n.of(context).unblockDevice, + isDestructive: true, + ), + }, + if (!isOwnDevice) + AdaptiveModalAction( + value: UserDeviceListItemAction.remove, + icon: const Icon(Icons.delete_outlined), + label: L10n.of(context).delete, + isDestructive: true, + ), + ], + ); + if (action == null) return; + switch (action) { + case UserDeviceListItemAction.rename: + rename(userDevice); + break; + case UserDeviceListItemAction.remove: + remove(userDevice); + break; + case UserDeviceListItemAction.verify: + verify(userDevice); + break; + case UserDeviceListItemAction.block: + block(userDevice); + break; + case UserDeviceListItemAction.unblock: + unblock(userDevice); + break; + } + }, + leading: CircleAvatar( + foregroundColor: Colors.white, + backgroundColor: keys == null + ? Colors.grey[700] + : keys.blocked + ? Colors.red + : keys.verified + ? Colors.green + : Colors.orange, + child: Icon(userDevice.icon), + ), + title: Text( + userDevice.displayname, + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + subtitle: Text( + L10n.of(context).lastActiveAgo( + DateTime.fromMillisecondsSinceEpoch(userDevice.lastSeenTs ?? 0) + .localizedTimeShort(context), + ), + style: const TextStyle(fontWeight: FontWeight.w300), + ), + trailing: keys == null + ? null + : Text( + keys.blocked + ? L10n.of(context).blocked + : keys.verified + ? L10n.of(context).verified + : L10n.of(context).unverified, + style: TextStyle( + color: keys.blocked + ? Colors.red + : keys.verified + ? Colors.green + : Colors.orange, + ), + ), + ), + ), + ); + } +} diff --git a/lib/pages/dialer/dialer.dart b/lib/pages/dialer/dialer.dart new file mode 100644 index 0000000..6b9fe65 --- /dev/null +++ b/lib/pages/dialer/dialer.dart @@ -0,0 +1,627 @@ +/* + * Famedly + * Copyright (C) 2019, 2020, 2021 Famedly GmbH + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import 'dart:async'; +import 'dart:math'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +import 'package:flutter_foreground_task/flutter_foreground_task.dart'; +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:flutter_webrtc/flutter_webrtc.dart' hide VideoRenderer; +import 'package:just_audio/just_audio.dart'; +import 'package:matrix/matrix.dart'; +import 'package:wakelock_plus/wakelock_plus.dart'; + +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/utils/voip/video_renderer.dart'; +import 'package:fluffychat/widgets/avatar.dart'; +import 'pip/pip_view.dart'; + +class _StreamView extends StatelessWidget { + const _StreamView( + this.wrappedStream, { + this.mainView = false, + required this.matrixClient, + }); + + final WrappedMediaStream wrappedStream; + final Client matrixClient; + + final bool mainView; + + Uri? get avatarUrl => wrappedStream.getUser().avatarUrl; + + String? get displayName => wrappedStream.displayName; + + String get avatarName => wrappedStream.avatarName; + + bool get isLocal => wrappedStream.isLocal(); + + bool get mirrored => + wrappedStream.isLocal() && + wrappedStream.purpose == SDPStreamMetadataPurpose.Usermedia; + + bool get audioMuted => wrappedStream.audioMuted; + + bool get videoMuted => wrappedStream.videoMuted; + + bool get isScreenSharing => + wrappedStream.purpose == SDPStreamMetadataPurpose.Screenshare; + + @override + Widget build(BuildContext context) { + return Container( + decoration: const BoxDecoration( + color: Colors.black54, + ), + child: Stack( + alignment: Alignment.center, + children: [ + VideoRenderer( + wrappedStream, + mirror: mirrored, + fit: RTCVideoViewObjectFit.RTCVideoViewObjectFitContain, + ), + if (videoMuted) ...[ + Container(color: Colors.black54), + Positioned( + child: Avatar( + mxContent: avatarUrl, + name: displayName, + size: mainView ? 96 : 48, + client: matrixClient, + // textSize: mainView ? 36 : 24, + // matrixClient: matrixClient, + ), + ), + ], + if (!isScreenSharing) + Positioned( + left: 4.0, + bottom: 4.0, + child: Icon( + audioMuted ? Icons.mic_off : Icons.mic, + color: Colors.white, + size: 18.0, + ), + ), + ], + ), + ); + } +} + +class Calling extends StatefulWidget { + final VoidCallback? onClear; + final BuildContext context; + final String callId; + final CallSession call; + final Client client; + + const Calling({ + required this.context, + required this.call, + required this.client, + required this.callId, + this.onClear, + super.key, + }); + + @override + MyCallingPage createState() => MyCallingPage(); +} + +class MyCallingPage extends State { + Room? get room => call.room; + + String get displayName => call.room.getLocalizedDisplayname( + MatrixLocals(L10n.of(widget.context)), + ); + + String get callId => widget.callId; + + CallSession get call => widget.call; + + MediaStream? get localStream { + if (call.localUserMediaStream != null) { + return call.localUserMediaStream!.stream!; + } + return null; + } + + MediaStream? get remoteStream { + if (call.getRemoteStreams.isNotEmpty) { + return call.getRemoteStreams[0].stream!; + } + return null; + } + + bool get isMicrophoneMuted => call.isMicrophoneMuted; + + bool get isLocalVideoMuted => call.isLocalVideoMuted; + + bool get isScreensharingEnabled => call.screensharingEnabled; + + bool get isRemoteOnHold => call.remoteOnHold; + + bool get voiceonly => call.type == CallType.kVoice; + + bool get connecting => call.state == CallState.kConnecting; + + bool get connected => call.state == CallState.kConnected; + + double? _localVideoHeight; + double? _localVideoWidth; + EdgeInsetsGeometry? _localVideoMargin; + CallState? _state; + + void _playCallSound() async { + const path = 'assets/sounds/call.ogg'; + if (kIsWeb || PlatformInfos.isMobile || PlatformInfos.isMacOS) { + final player = AudioPlayer(); + await player.setAsset(path); + player.play(); + } else { + Logs().w('Playing sound not implemented for this platform!'); + } + } + + @override + void initState() { + super.initState(); + initialize(); + _playCallSound(); + } + + void initialize() async { + final call = this.call; + call.onCallStateChanged.stream.listen(_handleCallState); + call.onCallEventChanged.stream.listen((event) { + if (event == CallStateChange.kFeedsChanged) { + setState(() { + call.tryRemoveStopedStreams(); + }); + } else if (event == CallStateChange.kLocalHoldUnhold || + event == CallStateChange.kRemoteHoldUnhold) { + setState(() {}); + Logs().i( + 'Call hold event: local ${call.localHold}, remote ${call.remoteOnHold}', + ); + } + }); + _state = call.state; + + if (call.type == CallType.kVideo) { + try { + // Enable wakelock (keep screen on) + unawaited(WakelockPlus.enable()); + } catch (_) {} + } + } + + void cleanUp() { + Timer( + const Duration(seconds: 2), + () => widget.onClear?.call(), + ); + if (call.type == CallType.kVideo) { + try { + unawaited(WakelockPlus.disable()); + } catch (_) {} + } + } + + @override + void dispose() { + super.dispose(); + call.cleanUp.call(); + } + + void _resizeLocalVideo(Orientation orientation) { + final shortSide = min( + MediaQuery.of(widget.context).size.width, + MediaQuery.of(widget.context).size.height, + ); + _localVideoMargin = remoteStream != null + ? const EdgeInsets.only(top: 20.0, right: 20.0) + : EdgeInsets.zero; + _localVideoWidth = remoteStream != null + ? shortSide / 3 + : MediaQuery.of(widget.context).size.width; + _localVideoHeight = remoteStream != null + ? shortSide / 4 + : MediaQuery.of(widget.context).size.height; + } + + void _handleCallState(CallState state) { + Logs().v('CallingPage::handleCallState: ${state.toString()}'); + if ({CallState.kConnected, CallState.kEnded}.contains(state)) { + HapticFeedback.heavyImpact(); + } + + if (mounted) { + setState(() { + _state = state; + if (_state == CallState.kEnded) cleanUp(); + }); + } + } + + void _answerCall() { + setState(() { + call.answer(); + }); + } + + void _hangUp() { + setState(() { + if (call.isRinging) { + call.reject(); + } else { + call.hangup(reason: CallErrorCode.userHangup); + } + }); + } + + void _muteMic() { + setState(() { + call.setMicrophoneMuted(!call.isMicrophoneMuted); + }); + } + + void _screenSharing() async { + if (PlatformInfos.isAndroid) { + if (!call.screensharingEnabled) { + FlutterForegroundTask.init( + androidNotificationOptions: AndroidNotificationOptions( + channelId: 'notification_channel_id', + channelName: 'Foreground Notification', + channelDescription: + L10n.of(widget.context).foregroundServiceRunning, + ), + iosNotificationOptions: const IOSNotificationOptions(), + foregroundTaskOptions: const ForegroundTaskOptions(), + ); + FlutterForegroundTask.startService( + notificationTitle: L10n.of(widget.context).screenSharingTitle, + notificationText: L10n.of(widget.context).screenSharingDetail, + ); + } else { + FlutterForegroundTask.stopService(); + } + } + + setState(() { + call.setScreensharingEnabled(!call.screensharingEnabled); + }); + } + + void _remoteOnHold() { + setState(() { + call.setRemoteOnHold(!call.remoteOnHold); + }); + } + + void _muteCamera() { + setState(() { + call.setLocalVideoMuted(!call.isLocalVideoMuted); + }); + } + + void _switchCamera() async { + if (call.localUserMediaStream != null) { + await Helper.switchCamera( + call.localUserMediaStream!.stream!.getVideoTracks()[0], + ); + } + setState(() {}); + } + + /* + void _switchSpeaker() { + setState(() { + session.setSpeakerOn(); + }); + } + */ + + List _buildActionButtons(bool isFloating) { + if (isFloating) { + return []; + } + + final switchCameraButton = FloatingActionButton( + heroTag: 'switchCamera', + onPressed: _switchCamera, + backgroundColor: Colors.black45, + child: const Icon(Icons.switch_camera), + ); + /* + var switchSpeakerButton = FloatingActionButton( + heroTag: 'switchSpeaker', + child: Icon(_speakerOn ? Icons.volume_up : Icons.volume_off), + onPressed: _switchSpeaker, + foregroundColor: Colors.black54, + backgroundColor: Theme.of(widget.context).backgroundColor, + ); + */ + final hangupButton = FloatingActionButton( + heroTag: 'hangup', + onPressed: _hangUp, + tooltip: 'Hangup', + backgroundColor: _state == CallState.kEnded ? Colors.black45 : Colors.red, + child: const Icon(Icons.call_end), + ); + + final answerButton = FloatingActionButton( + heroTag: 'answer', + onPressed: _answerCall, + tooltip: 'Answer', + backgroundColor: Colors.green, + child: const Icon(Icons.phone), + ); + + final muteMicButton = FloatingActionButton( + heroTag: 'muteMic', + onPressed: _muteMic, + foregroundColor: isMicrophoneMuted ? Colors.black26 : Colors.white, + backgroundColor: isMicrophoneMuted ? Colors.white : Colors.black45, + child: Icon(isMicrophoneMuted ? Icons.mic_off : Icons.mic), + ); + + final screenSharingButton = FloatingActionButton( + heroTag: 'screenSharing', + onPressed: _screenSharing, + foregroundColor: isScreensharingEnabled ? Colors.black26 : Colors.white, + backgroundColor: isScreensharingEnabled ? Colors.white : Colors.black45, + child: const Icon(Icons.desktop_mac), + ); + + final holdButton = FloatingActionButton( + heroTag: 'hold', + onPressed: _remoteOnHold, + foregroundColor: isRemoteOnHold ? Colors.black26 : Colors.white, + backgroundColor: isRemoteOnHold ? Colors.white : Colors.black45, + child: const Icon(Icons.pause), + ); + + final muteCameraButton = FloatingActionButton( + heroTag: 'muteCam', + onPressed: _muteCamera, + foregroundColor: isLocalVideoMuted ? Colors.black26 : Colors.white, + backgroundColor: isLocalVideoMuted ? Colors.white : Colors.black45, + child: Icon(isLocalVideoMuted ? Icons.videocam_off : Icons.videocam), + ); + + switch (_state) { + case CallState.kRinging: + case CallState.kInviteSent: + case CallState.kCreateAnswer: + case CallState.kConnecting: + return call.isOutgoing + ? [hangupButton] + : [answerButton, hangupButton]; + case CallState.kConnected: + return [ + muteMicButton, + //switchSpeakerButton, + if (!voiceonly && !kIsWeb) switchCameraButton, + if (!voiceonly) muteCameraButton, + if (PlatformInfos.isMobile || PlatformInfos.isWeb) + screenSharingButton, + holdButton, + hangupButton, + ]; + case CallState.kEnded: + return [ + hangupButton, + ]; + case CallState.kFledgling: + case CallState.kWaitLocalMedia: + case CallState.kCreateOffer: + case CallState.kEnding: + case null: + break; + } + return []; + } + + List _buildContent(Orientation orientation, bool isFloating) { + final stackWidgets = []; + + final call = this.call; + if (call.callHasEnded) { + return stackWidgets; + } + + if (call.localHold || call.remoteOnHold) { + var title = ''; + if (call.localHold) { + title = '${call.room.getLocalizedDisplayname( + MatrixLocals(L10n.of(widget.context)), + )} held the call.'; + } else if (call.remoteOnHold) { + title = 'You held the call.'; + } + stackWidgets.add( + Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Icon( + Icons.pause, + size: 48.0, + color: Colors.white, + ), + Text( + title, + style: const TextStyle( + color: Colors.white, + fontSize: 24.0, + ), + ), + ], + ), + ), + ); + return stackWidgets; + } + + var primaryStream = call.remoteScreenSharingStream ?? + call.localScreenSharingStream ?? + call.remoteUserMediaStream ?? + call.localUserMediaStream; + + if (!connected) { + primaryStream = call.localUserMediaStream; + } + + if (primaryStream != null) { + stackWidgets.add( + Center( + child: _StreamView( + primaryStream, + mainView: true, + matrixClient: widget.client, + ), + ), + ); + } + + if (isFloating || !connected) { + return stackWidgets; + } + + _resizeLocalVideo(orientation); + + if (call.getRemoteStreams.isEmpty) { + return stackWidgets; + } + + final secondaryStreamViews = []; + + if (call.remoteScreenSharingStream != null) { + final remoteUserMediaStream = call.remoteUserMediaStream; + secondaryStreamViews.add( + SizedBox( + width: _localVideoWidth, + height: _localVideoHeight, + child: + _StreamView(remoteUserMediaStream!, matrixClient: widget.client), + ), + ); + secondaryStreamViews.add(const SizedBox(height: 10)); + } + + final localStream = + call.localUserMediaStream ?? call.localScreenSharingStream; + if (localStream != null && !isFloating) { + secondaryStreamViews.add( + SizedBox( + width: _localVideoWidth, + height: _localVideoHeight, + child: _StreamView(localStream, matrixClient: widget.client), + ), + ); + secondaryStreamViews.add(const SizedBox(height: 10)); + } + + if (call.localScreenSharingStream != null && !isFloating) { + secondaryStreamViews.add( + SizedBox( + width: _localVideoWidth, + height: _localVideoHeight, + child: _StreamView( + call.remoteUserMediaStream!, + matrixClient: widget.client, + ), + ), + ); + secondaryStreamViews.add(const SizedBox(height: 10)); + } + + if (secondaryStreamViews.isNotEmpty) { + stackWidgets.add( + Container( + padding: const EdgeInsets.fromLTRB(0, 20, 0, 120), + alignment: Alignment.bottomRight, + child: Container( + width: _localVideoWidth, + margin: _localVideoMargin, + child: Column( + children: secondaryStreamViews, + ), + ), + ), + ); + } + + return stackWidgets; + } + + @override + Widget build(BuildContext context) { + return PIPView( + builder: (context, isFloating) { + return Scaffold( + resizeToAvoidBottomInset: !isFloating, + floatingActionButtonLocation: + FloatingActionButtonLocation.centerFloat, + floatingActionButton: SizedBox( + width: 320.0, + height: 150.0, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: _buildActionButtons(isFloating), + ), + ), + body: OrientationBuilder( + builder: (BuildContext context, Orientation orientation) { + return Container( + decoration: const BoxDecoration( + color: Colors.black87, + ), + child: Stack( + children: [ + ..._buildContent(orientation, isFloating), + if (!isFloating) + Positioned( + top: 24.0, + left: 24.0, + child: IconButton( + color: Colors.black45, + icon: const Icon(Icons.arrow_back), + onPressed: () { + PIPView.of(context)?.setFloating(true); + }, + ), + ), + ], + ), + ); + }, + ), + ); + }, + ); + } +} diff --git a/lib/pages/dialer/pip/dismiss_keyboard.dart b/lib/pages/dialer/pip/dismiss_keyboard.dart new file mode 100644 index 0000000..c9ca318 --- /dev/null +++ b/lib/pages/dialer/pip/dismiss_keyboard.dart @@ -0,0 +1,5 @@ +import 'package:flutter/material.dart'; + +void dismissKeyboard(BuildContext context) { + FocusScope.of(context).requestFocus(FocusNode()); +} diff --git a/lib/pages/dialer/pip/pip_view.dart b/lib/pages/dialer/pip/pip_view.dart new file mode 100644 index 0000000..d9aa3d9 --- /dev/null +++ b/lib/pages/dialer/pip/pip_view.dart @@ -0,0 +1,343 @@ +import 'package:flutter/material.dart'; + +import 'package:fluffychat/config/themes.dart'; +import 'dismiss_keyboard.dart'; + +class PIPView extends StatefulWidget { + final PIPViewCorner initialCorner; + final double? floatingWidth; + final double? floatingHeight; + final bool avoidKeyboard; + + final Widget Function( + BuildContext context, + bool isFloating, + ) builder; + + const PIPView({ + super.key, + required this.builder, + this.initialCorner = PIPViewCorner.topRight, + this.floatingWidth, + this.floatingHeight, + this.avoidKeyboard = true, + }); + + @override + PIPViewState createState() => PIPViewState(); + + static PIPViewState? of(BuildContext context) { + return context.findAncestorStateOfType(); + } +} + +class PIPViewState extends State with TickerProviderStateMixin { + late AnimationController _toggleFloatingAnimationController; + late AnimationController _dragAnimationController; + late PIPViewCorner _corner; + Offset _dragOffset = Offset.zero; + bool _isDragging = false; + bool _floating = false; + Map _offsets = {}; + + @override + void initState() { + super.initState(); + _corner = widget.initialCorner; + _toggleFloatingAnimationController = AnimationController( + duration: FluffyThemes.animationDuration, + vsync: this, + ); + _dragAnimationController = AnimationController( + duration: FluffyThemes.animationDuration, + vsync: this, + ); + } + + void _updateCornersOffsets({ + required Size spaceSize, + required Size widgetSize, + required EdgeInsets windowPadding, + }) { + _offsets = _calculateOffsets( + spaceSize: spaceSize, + widgetSize: widgetSize, + windowPadding: windowPadding, + ); + } + + bool _isAnimating() { + return _toggleFloatingAnimationController.isAnimating || + _dragAnimationController.isAnimating; + } + + void setFloating(bool floating) { + if (_isAnimating()) return; + dismissKeyboard(context); + setState(() { + _floating = floating; + }); + _toggleFloatingAnimationController.forward(); + } + + void stopFloating() { + if (_isAnimating()) return; + dismissKeyboard(context); + _toggleFloatingAnimationController.reverse().whenCompleteOrCancel(() { + if (mounted) { + setState(() { + _floating = false; + }); + } + }); + } + + void _onPanUpdate(DragUpdateDetails details) { + if (!_isDragging) return; + setState(() { + _dragOffset = _dragOffset.translate( + details.delta.dx, + details.delta.dy, + ); + }); + } + + void _onPanCancel() { + if (!_isDragging) return; + setState(() { + _dragAnimationController.value = 0; + _dragOffset = Offset.zero; + _isDragging = false; + }); + } + + void _onPanEnd(_) { + if (!_isDragging) return; + + final nearestCorner = _calculateNearestCorner( + offset: _dragOffset, + offsets: _offsets, + ); + setState(() { + _corner = nearestCorner; + _isDragging = false; + }); + _dragAnimationController.forward().whenCompleteOrCancel(() { + _dragAnimationController.value = 0; + _dragOffset = Offset.zero; + }); + } + + void _onPanStart(_) { + if (_isAnimating()) return; + setState(() { + _dragOffset = _offsets[_corner]!; + _isDragging = true; + }); + } + + @override + Widget build(BuildContext context) { + final mediaQuery = MediaQuery.of(context); + var windowPadding = mediaQuery.padding; + if (widget.avoidKeyboard) { + windowPadding += mediaQuery.viewInsets; + } + final isFloating = _floating; + + return LayoutBuilder( + builder: (context, constraints) { + final width = constraints.maxWidth; + final height = constraints.maxHeight; + var floatingWidth = widget.floatingWidth; + var floatingHeight = widget.floatingHeight; + if (floatingWidth == null && floatingHeight != null) { + floatingWidth = width / height * floatingHeight; + } + floatingWidth ??= 100.0; + floatingHeight ??= height / width * floatingWidth; + + final floatingWidgetSize = Size(floatingWidth, floatingHeight); + final fullWidgetSize = Size(width, height); + + _updateCornersOffsets( + spaceSize: fullWidgetSize, + widgetSize: floatingWidgetSize, + windowPadding: windowPadding, + ); + + final calculatedOffset = _offsets[_corner]; + + // BoxFit.cover + final widthRatio = floatingWidth / width; + final heightRatio = floatingHeight / height; + final scaledDownScale = widthRatio > heightRatio + ? floatingWidgetSize.width / fullWidgetSize.width + : floatingWidgetSize.height / fullWidgetSize.height; + + return Stack( + children: [ + AnimatedBuilder( + animation: Listenable.merge([ + _toggleFloatingAnimationController, + _dragAnimationController, + ]), + builder: (context, child) { + final animationCurve = CurveTween( + curve: Curves.easeInOutQuad, + ); + final dragAnimationValue = animationCurve.transform( + _dragAnimationController.value, + ); + final toggleFloatingAnimationValue = animationCurve.transform( + _toggleFloatingAnimationController.value, + ); + + final floatingOffset = _isDragging + ? _dragOffset + : Tween( + begin: _dragOffset, + end: calculatedOffset, + ).transform( + _dragAnimationController.isAnimating + ? dragAnimationValue + : toggleFloatingAnimationValue, + ); + final borderRadius = Tween( + begin: 0, + end: 10, + ).transform(toggleFloatingAnimationValue); + final width = Tween( + begin: fullWidgetSize.width, + end: floatingWidgetSize.width, + ).transform(toggleFloatingAnimationValue); + final height = Tween( + begin: fullWidgetSize.height, + end: floatingWidgetSize.height, + ).transform(toggleFloatingAnimationValue); + final scale = Tween( + begin: 1, + end: scaledDownScale, + ).transform(toggleFloatingAnimationValue); + return Positioned( + left: floatingOffset.dx, + top: floatingOffset.dy, + child: GestureDetector( + onPanStart: isFloating ? _onPanStart : null, + onPanUpdate: isFloating ? _onPanUpdate : null, + onPanCancel: isFloating ? _onPanCancel : null, + onPanEnd: isFloating ? _onPanEnd : null, + onTap: isFloating ? stopFloating : null, + child: Material( + elevation: 10, + borderRadius: BorderRadius.circular(borderRadius), + child: Container( + clipBehavior: Clip.antiAlias, + decoration: BoxDecoration( + color: Colors.transparent, + borderRadius: BorderRadius.circular(borderRadius), + ), + width: width, + height: height, + child: Transform.scale( + scale: scale, + child: OverflowBox( + maxHeight: fullWidgetSize.height, + maxWidth: fullWidgetSize.width, + child: IgnorePointer( + ignoring: isFloating, + child: child, + ), + ), + ), + ), + ), + ), + ); + }, + child: Builder( + builder: (context) => widget.builder(context, isFloating), + ), + ), + ], + ); + }, + ); + } +} + +enum PIPViewCorner { + topLeft, + topRight, + bottomLeft, + bottomRight, +} + +class _CornerDistance { + final PIPViewCorner corner; + final double distance; + + _CornerDistance({ + required this.corner, + required this.distance, + }); +} + +PIPViewCorner _calculateNearestCorner({ + required Offset offset, + required Map offsets, +}) { + _CornerDistance calculateDistance(PIPViewCorner corner) { + final distance = offsets[corner]! + .translate( + -offset.dx, + -offset.dy, + ) + .distanceSquared; + return _CornerDistance( + corner: corner, + distance: distance, + ); + } + + final distances = PIPViewCorner.values.map(calculateDistance).toList(); + + distances.sort((cd0, cd1) => cd0.distance.compareTo(cd1.distance)); + + return distances.first.corner; +} + +Map _calculateOffsets({ + required Size spaceSize, + required Size widgetSize, + required EdgeInsets windowPadding, +}) { + Offset getOffsetForCorner(PIPViewCorner corner) { + const spacing = 16; + final left = spacing + windowPadding.left; + final top = spacing + windowPadding.top; + final right = + spaceSize.width - widgetSize.width - windowPadding.right - spacing; + final bottom = + spaceSize.height - widgetSize.height - windowPadding.bottom - spacing; + + switch (corner) { + case PIPViewCorner.topLeft: + return Offset(left, top); + case PIPViewCorner.topRight: + return Offset(right, top); + case PIPViewCorner.bottomLeft: + return Offset(left, bottom); + case PIPViewCorner.bottomRight: + return Offset(right, bottom); + } + } + + const corners = PIPViewCorner.values; + final offsets = {}; + for (final corner in corners) { + offsets[corner] = getOffsetForCorner(corner); + } + + return offsets; +} diff --git a/lib/pages/homeserver_picker/homeserver_picker.dart b/lib/pages/homeserver_picker/homeserver_picker.dart new file mode 100644 index 0000000..40dc6d8 --- /dev/null +++ b/lib/pages/homeserver_picker/homeserver_picker.dart @@ -0,0 +1,248 @@ +import 'dart:async'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; + +import 'package:collection/collection.dart'; +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:flutter_web_auth_2/flutter_web_auth_2.dart'; +import 'package:go_router/go_router.dart'; +import 'package:hive_flutter/hive_flutter.dart'; +import 'package:matrix/matrix.dart'; +import 'package:universal_html/html.dart' as html; +import 'package:url_launcher/url_launcher_string.dart'; + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/pages/homeserver_picker/homeserver_picker_view.dart'; +import 'package:fluffychat/utils/file_selector.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; +import 'package:fluffychat/widgets/matrix.dart'; +import '../../utils/localized_exception_extension.dart'; + +import 'package:fluffychat/utils/tor_stub.dart' + if (dart.library.html) 'package:tor_detector_web/tor_detector_web.dart'; + +class HomeserverPicker extends StatefulWidget { + final bool addMultiAccount; + const HomeserverPicker({required this.addMultiAccount, super.key}); + + @override + HomeserverPickerController createState() => HomeserverPickerController(); +} + +class HomeserverPickerController extends State { + bool isLoading = false; + + final TextEditingController homeserverController = TextEditingController( + text: AppConfig.defaultHomeserver, + ); + + String? error; + + bool isTorBrowser = false; + + Future _checkTorBrowser() async { + if (!kIsWeb) return; + + Hive.openBox('test').then((value) => null).catchError( + (e, s) async { + await showOkAlertDialog( + context: context, + title: L10n.of(context).indexedDbErrorTitle, + message: L10n.of(context).indexedDbErrorLong, + ); + _checkTorBrowser(); + }, + ); + + final isTor = await TorBrowserDetector.isTorBrowser; + isTorBrowser = isTor; + } + + /// Starts an analysis of the given homeserver. It uses the current domain and + /// makes sure that it is prefixed with https. Then it searches for the + /// well-known information and forwards to the login page depending on the + /// login type. + Future checkHomeserverAction({bool legacyPasswordLogin = false}) async { + final homeserverInput = + homeserverController.text.trim().toLowerCase().replaceAll(' ', '-'); + + if (homeserverInput.isEmpty) { + setState(() { + error = loginFlows = null; + isLoading = false; + Matrix.of(context).getLoginClient().homeserver = null; + }); + return; + } + setState(() { + error = loginFlows = null; + isLoading = true; + }); + + final l10n = L10n.of(context); + + try { + var homeserver = Uri.parse(homeserverInput); + if (homeserver.scheme.isEmpty) { + homeserver = Uri.https(homeserverInput, ''); + } + final client = Matrix.of(context).getLoginClient(); + final (_, _, loginFlows) = await client.checkHomeserver(homeserver); + this.loginFlows = loginFlows; + if (supportsSso && !legacyPasswordLogin) { + if (!PlatformInfos.isMobile) { + final consent = await showOkCancelAlertDialog( + context: context, + title: l10n.appWantsToUseForLogin(homeserverInput), + message: l10n.appWantsToUseForLoginDescription, + okLabel: l10n.continueText, + ); + if (consent != OkCancelResult.ok) return; + } + return ssoLoginAction(); + } + context.push( + '${GoRouter.of(context).routeInformationProvider.value.uri.path}/login', + ); + } catch (e) { + setState( + () => error = (e).toLocalizedString( + context, + ExceptionContext.checkHomeserver, + ), + ); + } finally { + if (mounted) { + setState(() => isLoading = false); + } + } + } + + List? loginFlows; + + bool _supportsFlow(String flowType) => + loginFlows?.any((flow) => flow.type == flowType) ?? false; + + bool get supportsSso => _supportsFlow('m.login.sso'); + + bool isDefaultPlatform = + (PlatformInfos.isMobile || PlatformInfos.isWeb || PlatformInfos.isMacOS); + + bool get supportsPasswordLogin => _supportsFlow('m.login.password'); + + void ssoLoginAction() async { + final redirectUrl = kIsWeb + ? Uri.parse(html.window.location.href) + .resolveUri( + Uri(pathSegments: ['auth.html']), + ) + .toString() + : isDefaultPlatform + ? '${AppConfig.appOpenUrlScheme.toLowerCase()}://login' + : 'http://localhost:3001//login'; + + final url = Matrix.of(context).getLoginClient().homeserver!.replace( + path: '/_matrix/client/v3/login/sso/redirect', + queryParameters: {'redirectUrl': redirectUrl}, + ); + + final urlScheme = isDefaultPlatform + ? Uri.parse(redirectUrl).scheme + : "http://localhost:3001"; + final result = await FlutterWebAuth2.authenticate( + url: url.toString(), + callbackUrlScheme: urlScheme, + options: const FlutterWebAuth2Options(), + ); + final token = Uri.parse(result).queryParameters['loginToken']; + if (token?.isEmpty ?? false) return; + + setState(() { + error = null; + isLoading = true; + }); + try { + await Matrix.of(context).getLoginClient().login( + LoginType.mLoginToken, + token: token, + initialDeviceDisplayName: PlatformInfos.clientName, + ); + } catch (e) { + setState(() { + error = e.toLocalizedString(context); + }); + } finally { + if (mounted) { + setState(() { + isLoading = false; + }); + } + } + } + + @override + void initState() { + _checkTorBrowser(); + super.initState(); + } + + @override + Widget build(BuildContext context) => HomeserverPickerView(this); + + Future restoreBackup() async { + final picked = await selectFiles(context); + final file = picked.firstOrNull; + if (file == null) return; + setState(() { + error = null; + isLoading = true; + }); + try { + final client = Matrix.of(context).getLoginClient(); + await client.importDump(String.fromCharCodes(await file.readAsBytes())); + Matrix.of(context).initMatrix(); + } catch (e) { + setState(() { + error = e.toLocalizedString(context); + }); + } finally { + if (mounted) { + setState(() { + isLoading = false; + }); + } + } + } + + void onMoreAction(MoreLoginActions action) { + switch (action) { + case MoreLoginActions.importBackup: + restoreBackup(); + case MoreLoginActions.privacy: + launchUrlString(AppConfig.privacyUrl); + case MoreLoginActions.about: + PlatformInfos.showDialog(context); + } + } +} + +enum MoreLoginActions { importBackup, privacy, about } + +class IdentityProvider { + final String? id; + final String? name; + final String? icon; + final String? brand; + + IdentityProvider({this.id, this.name, this.icon, this.brand}); + + factory IdentityProvider.fromJson(Map json) => + IdentityProvider( + id: json['id'], + name: json['name'], + icon: json['icon'], + brand: json['brand'], + ); +} diff --git a/lib/pages/homeserver_picker/homeserver_picker_view.dart b/lib/pages/homeserver_picker/homeserver_picker_view.dart new file mode 100644 index 0000000..abe5e73 --- /dev/null +++ b/lib/pages/homeserver_picker/homeserver_picker_view.dart @@ -0,0 +1,247 @@ +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:flutter_linkify/flutter_linkify.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/widgets/adaptive_dialogs/adaptive_dialog_action.dart'; +import 'package:fluffychat/widgets/layouts/login_scaffold.dart'; +import 'package:fluffychat/widgets/matrix.dart'; +import '../../config/themes.dart'; +import 'homeserver_picker.dart'; + +class HomeserverPickerView extends StatelessWidget { + final HomeserverPickerController controller; + + const HomeserverPickerView( + this.controller, { + super.key, + }); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + return LoginScaffold( + enforceMobileMode: Matrix.of(context).client.isLogged(), + appBar: AppBar( + centerTitle: true, + title: Text( + controller.widget.addMultiAccount + ? L10n.of(context).addAccount + : L10n.of(context).login, + ), + actions: [ + PopupMenuButton( + onSelected: controller.onMoreAction, + itemBuilder: (_) => [ + PopupMenuItem( + value: MoreLoginActions.importBackup, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + const Icon(Icons.import_export_outlined), + const SizedBox(width: 12), + Text(L10n.of(context).hydrate), + ], + ), + ), + PopupMenuItem( + value: MoreLoginActions.privacy, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + const Icon(Icons.privacy_tip_outlined), + const SizedBox(width: 12), + Text(L10n.of(context).privacy), + ], + ), + ), + PopupMenuItem( + value: MoreLoginActions.about, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + const Icon(Icons.info_outlined), + const SizedBox(width: 12), + Text(L10n.of(context).about), + ], + ), + ), + ], + ), + ], + ), + body: LayoutBuilder( + builder: (context, constraints) { + return SingleChildScrollView( + child: ConstrainedBox( + constraints: BoxConstraints(minHeight: constraints.maxHeight), + child: IntrinsicHeight( + child: Column( + children: [ + // display a prominent banner to import session for TOR browser + // users. This feature is just some UX sugar as TOR users are + // usually forced to logout as TOR browser is non-persistent + AnimatedContainer( + height: controller.isTorBrowser ? 64 : 0, + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + clipBehavior: Clip.hardEdge, + decoration: const BoxDecoration(), + child: Material( + clipBehavior: Clip.hardEdge, + borderRadius: const BorderRadius.vertical( + bottom: Radius.circular(8), + ), + color: theme.colorScheme.surface, + child: ListTile( + leading: const Icon(Icons.vpn_key), + title: Text(L10n.of(context).hydrateTor), + subtitle: Text(L10n.of(context).hydrateTorLong), + trailing: const Icon(Icons.chevron_right_outlined), + onTap: controller.restoreBackup, + ), + ), + ), + Container( + alignment: Alignment.center, + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: Hero( + tag: 'info-logo', + child: Image.asset( + './assets/banner_transparent.png', + fit: BoxFit.fitWidth, + ), + ), + ), + const SizedBox(height: 32), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 32.0), + child: SelectableLinkify( + text: L10n.of(context).appIntroduction, + textScaleFactor: + MediaQuery.textScalerOf(context).scale(1), + textAlign: TextAlign.center, + linkStyle: TextStyle( + color: theme.colorScheme.secondary, + decorationColor: theme.colorScheme.secondary, + ), + onOpen: (link) => launchUrlString(link.url), + ), + ), + const Spacer(), + Padding( + padding: const EdgeInsets.all(32.0), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + TextField( + onSubmitted: (_) => + controller.checkHomeserverAction(), + controller: controller.homeserverController, + autocorrect: false, + keyboardType: TextInputType.url, + decoration: InputDecoration( + prefixIcon: const Icon(Icons.search_outlined), + filled: false, + border: OutlineInputBorder( + borderRadius: BorderRadius.circular( + AppConfig.borderRadius, + ), + ), + hintText: AppConfig.defaultHomeserver, + hintStyle: TextStyle( + color: theme.colorScheme.surfaceTint, + ), + labelText: 'Sign in with:', + errorText: controller.error, + errorMaxLines: 4, + suffixIcon: IconButton( + onPressed: () { + showDialog( + context: context, + builder: (context) => AlertDialog.adaptive( + title: Text( + L10n.of(context).whatIsAHomeserver, + ), + content: Linkify( + text: L10n.of(context) + .homeserverDescription, + textScaleFactor: + MediaQuery.textScalerOf(context) + .scale(1), + options: const LinkifyOptions( + humanize: false, + ), + linkStyle: TextStyle( + color: theme.colorScheme.primary, + decorationColor: + theme.colorScheme.primary, + ), + onOpen: (link) => + launchUrlString(link.url), + ), + actions: [ + AdaptiveDialogAction( + onPressed: () => launchUrl( + Uri.https('servers.joinmatrix.org'), + ), + child: Text( + L10n.of(context) + .discoverHomeservers, + ), + ), + AdaptiveDialogAction( + onPressed: Navigator.of(context).pop, + child: Text(L10n.of(context).close), + ), + ], + ), + ); + }, + icon: const Icon(Icons.info_outlined), + ), + ), + ), + const SizedBox(height: 32), + ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: theme.colorScheme.primary, + foregroundColor: theme.colorScheme.onPrimary, + ), + onPressed: controller.isLoading + ? null + : controller.checkHomeserverAction, + child: controller.isLoading + ? const LinearProgressIndicator() + : Text(L10n.of(context).continueText), + ), + TextButton( + style: TextButton.styleFrom( + foregroundColor: theme.colorScheme.secondary, + textStyle: theme.textTheme.labelMedium, + ), + onPressed: controller.isLoading + ? null + : () => controller.checkHomeserverAction( + legacyPasswordLogin: true, + ), + child: Text(L10n.of(context).loginWithMatrixId), + ), + ], + ), + ), + ], + ), + ), + ), + ); + }, + ), + ); + } +} diff --git a/lib/pages/image_viewer/image_viewer.dart b/lib/pages/image_viewer/image_viewer.dart new file mode 100644 index 0000000..d42a845 --- /dev/null +++ b/lib/pages/image_viewer/image_viewer.dart @@ -0,0 +1,122 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/pages/image_viewer/image_viewer_view.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/utils/show_scaffold_dialog.dart'; +import 'package:fluffychat/widgets/share_scaffold_dialog.dart'; +import '../../utils/matrix_sdk_extensions/event_extension.dart'; + +class ImageViewer extends StatefulWidget { + final Event event; + final Timeline? timeline; + final BuildContext outerContext; + + const ImageViewer( + this.event, { + required this.outerContext, + this.timeline, + super.key, + }); + + @override + ImageViewerController createState() => ImageViewerController(); +} + +class ImageViewerController extends State { + final FocusNode focusNode = FocusNode(); + + @override + void initState() { + super.initState(); + allEvents = widget.timeline?.events + .where( + (event) => { + MessageTypes.Image, + MessageTypes.Sticker, + if (PlatformInfos.supportsVideoPlayer) MessageTypes.Video, + }.contains(event.messageType), + ) + .toList() + .reversed + .toList() ?? + [widget.event]; + var index = + allEvents.indexWhere((event) => event.eventId == widget.event.eventId); + if (index < 0) index = 0; + pageController = PageController(initialPage: index); + } + + late final PageController pageController; + + late final List allEvents; + + void onKeyEvent(KeyEvent event) { + switch (event.logicalKey) { + case LogicalKeyboardKey.arrowLeft: + if (canGoBack) prevImage(); + break; + case LogicalKeyboardKey.arrowRight: + if (canGoNext) nextImage(); + break; + } + } + + void prevImage() async { + await pageController.previousPage( + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + ); + if (!mounted) return; + setState(() {}); + } + + void nextImage() async { + await pageController.nextPage( + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + ); + if (!mounted) return; + setState(() {}); + } + + int get _index => pageController.page?.toInt() ?? 0; + + Event get currentEvent => allEvents[_index]; + + bool get canGoNext => _index < allEvents.length - 1; + + bool get canGoBack => _index > 0; + + /// Forward this image to another room. + void forwardAction() => showScaffoldDialog( + context: context, + builder: (context) => ShareScaffoldDialog( + items: [ContentShareItem(currentEvent.content)], + ), + ); + + /// Save this file with a system call. + void saveFileAction(BuildContext context) => currentEvent.saveFile(context); + + /// Save this file with a system call. + void shareFileAction(BuildContext context) => currentEvent.shareFile(context); + + static const maxScaleFactor = 1.5; + + /// Go back if user swiped it away + void onInteractionEnds(ScaleEndDetails endDetails) { + if (PlatformInfos.usesTouchscreen == false) { + if (endDetails.velocity.pixelsPerSecond.dy > + MediaQuery.of(context).size.height * maxScaleFactor) { + Navigator.of(context, rootNavigator: false).pop(); + } + } + } + + @override + Widget build(BuildContext context) => ImageViewerView(this); +} diff --git a/lib/pages/image_viewer/image_viewer_view.dart b/lib/pages/image_viewer/image_viewer_view.dart new file mode 100644 index 0000000..df4486e --- /dev/null +++ b/lib/pages/image_viewer/image_viewer_view.dart @@ -0,0 +1,154 @@ +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/pages/image_viewer/video_player.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/widgets/hover_builder.dart'; +import 'package:fluffychat/widgets/mxc_image.dart'; +import 'image_viewer.dart'; + +class ImageViewerView extends StatelessWidget { + final ImageViewerController controller; + + const ImageViewerView(this.controller, {super.key}); + + @override + Widget build(BuildContext context) { + final iconButtonStyle = IconButton.styleFrom( + backgroundColor: Colors.black.withAlpha(200), + foregroundColor: Colors.white, + ); + return GestureDetector( + onTap: () => Navigator.of(context).pop(), + child: Scaffold( + backgroundColor: Colors.black.withAlpha(128), + extendBodyBehindAppBar: true, + appBar: AppBar( + elevation: 0, + leading: IconButton( + style: iconButtonStyle, + icon: const Icon(Icons.close), + onPressed: Navigator.of(context).pop, + color: Colors.white, + tooltip: L10n.of(context).close, + ), + backgroundColor: Colors.transparent, + actions: [ + IconButton( + style: iconButtonStyle, + icon: const Icon(Icons.reply_outlined), + onPressed: controller.forwardAction, + color: Colors.white, + tooltip: L10n.of(context).share, + ), + const SizedBox(width: 8), + IconButton( + style: iconButtonStyle, + icon: const Icon(Icons.download_outlined), + onPressed: () => controller.saveFileAction(context), + color: Colors.white, + tooltip: L10n.of(context).downloadFile, + ), + const SizedBox(width: 8), + if (PlatformInfos.isMobile) + // Use builder context to correctly position the share dialog on iPad + Padding( + padding: const EdgeInsets.only(right: 8.0), + child: Builder( + builder: (context) => IconButton( + style: iconButtonStyle, + onPressed: () => controller.shareFileAction(context), + tooltip: L10n.of(context).share, + color: Colors.white, + icon: Icon(Icons.adaptive.share_outlined), + ), + ), + ), + ], + ), + body: HoverBuilder( + builder: (context, hovered) => Stack( + children: [ + KeyboardListener( + focusNode: controller.focusNode, + onKeyEvent: controller.onKeyEvent, + child: PageView.builder( + controller: controller.pageController, + itemCount: controller.allEvents.length, + itemBuilder: (context, i) { + final event = controller.allEvents[i]; + switch (event.messageType) { + case MessageTypes.Video: + return Padding( + padding: const EdgeInsets.only(top: 52.0), + child: Center( + child: GestureDetector( + // Ignore taps to not go back here: + onTap: () {}, + child: EventVideoPlayer(event), + ), + ), + ); + case MessageTypes.Image: + case MessageTypes.Sticker: + default: + return InteractiveViewer( + minScale: 1.0, + maxScale: 10.0, + onInteractionEnd: controller.onInteractionEnds, + child: Center( + child: Hero( + tag: event.eventId, + child: GestureDetector( + // Ignore taps to not go back here: + onTap: () {}, + child: MxcImage( + key: ValueKey(event.eventId), + event: event, + fit: BoxFit.contain, + isThumbnail: false, + animated: true, + ), + ), + ), + ), + ); + } + }, + ), + ), + if (hovered && controller.canGoBack) + Align( + alignment: Alignment.centerLeft, + child: Padding( + padding: const EdgeInsets.all(12.0), + child: IconButton( + style: iconButtonStyle, + tooltip: L10n.of(context).previous, + icon: const Icon(Icons.chevron_left_outlined), + onPressed: controller.prevImage, + ), + ), + ), + if (hovered && controller.canGoNext) + Align( + alignment: Alignment.centerRight, + child: Padding( + padding: const EdgeInsets.all(12.0), + child: IconButton( + style: iconButtonStyle, + tooltip: L10n.of(context).next, + icon: const Icon(Icons.chevron_right_outlined), + onPressed: controller.nextImage, + ), + ), + ), + ], + ), + ), + ), + ); + } +} \ No newline at end of file diff --git a/lib/pages/image_viewer/video_player.dart b/lib/pages/image_viewer/video_player.dart new file mode 100644 index 0000000..1d755c4 --- /dev/null +++ b/lib/pages/image_viewer/video_player.dart @@ -0,0 +1,167 @@ +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; + +import 'package:chewie/chewie.dart'; +import 'package:matrix/matrix.dart'; +import 'package:path_provider/path_provider.dart'; +import 'package:universal_html/html.dart' as html; +import 'package:video_player/video_player.dart'; + +import 'package:fluffychat/utils/localized_exception_extension.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/event_extension.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/widgets/blur_hash.dart'; +import '../../../utils/error_reporter.dart'; +import '../../widgets/mxc_image.dart'; + +class EventVideoPlayer extends StatefulWidget { + final Event event; + + const EventVideoPlayer( + this.event, { + super.key, + }); + + @override + EventVideoPlayerState createState() => EventVideoPlayerState(); +} + +class EventVideoPlayerState extends State { + ChewieController? _chewieController; + VideoPlayerController? _videoPlayerController; + + // The video_player package only doesn't support Windows and Linux. + final _supportsVideoPlayer = + !PlatformInfos.isWindows && !PlatformInfos.isLinux; + + void _downloadAction() async { + if (!_supportsVideoPlayer) { + widget.event.saveFile(context); + return; + } + + try { + final videoFile = await widget.event.downloadAndDecryptAttachment(); + + // Dispose the controllers if we already have them. + _disposeControllers(); + late VideoPlayerController videoPlayerController; + + // Create the VideoPlayerController from the contents of videoFile. + if (kIsWeb) { + final blob = html.Blob([videoFile.bytes]); + final networkUri = Uri.parse(html.Url.createObjectUrlFromBlob(blob)); + videoPlayerController = VideoPlayerController.networkUrl(networkUri); + } else { + final tempDir = await getTemporaryDirectory(); + final fileName = Uri.encodeComponent( + widget.event.attachmentOrThumbnailMxcUrl()!.pathSegments.last, + ); + final file = File('${tempDir.path}/${fileName}_${videoFile.name}'); + if (await file.exists() == false) { + await file.writeAsBytes(videoFile.bytes); + } + videoPlayerController = VideoPlayerController.file(file); + } + _videoPlayerController = videoPlayerController; + + await videoPlayerController.initialize(); + + // Create a ChewieController on top. + setState(() { + _chewieController = ChewieController( + videoPlayerController: videoPlayerController, + useRootNavigator: !kIsWeb, + autoPlay: true, + autoInitialize: true, + looping: true, + ); + }); + } on IOException catch (e) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text(e.toLocalizedString(context)), + ), + ); + } catch (e, s) { + ErrorReporter(context, 'Unable to play video').onErrorCallback(e, s); + } + } + + void _disposeControllers() { + _chewieController?.dispose(); + _videoPlayerController?.dispose(); + _chewieController = null; + _videoPlayerController = null; + } + + @override + void dispose() { + _disposeControllers(); + super.dispose(); + } + + @override + void initState() { + super.initState(); + WidgetsBinding.instance.addPostFrameCallback((_) { + _downloadAction(); + }); + } + + static const String fallbackBlurHash = 'L5H2EC=PM+yV0g-mq.wG9c010J}I'; + + @override + Widget build(BuildContext context) { + final hasThumbnail = widget.event.hasThumbnail; + final blurHash = (widget.event.infoMap as Map) + .tryGet('xyz.amorgan.blurhash') ?? + fallbackBlurHash; + final infoMap = widget.event.content.tryGetMap('info'); + final videoWidth = infoMap?.tryGet('w') ?? 400; + final videoHeight = infoMap?.tryGet('h') ?? 300; + final height = MediaQuery.of(context).size.height - 52; + final width = videoWidth * (height / videoHeight); + + final chewieController = _chewieController; + return chewieController != null + ? Center( + child: SizedBox( + width: width, + height: height, + child: Chewie(controller: chewieController), + ), + ) + : Stack( + children: [ + Center( + child: Hero( + tag: widget.event.eventId, + child: hasThumbnail + ? MxcImage( + event: widget.event, + isThumbnail: true, + width: width, + height: height, + fit: BoxFit.cover, + placeholder: (context) => BlurHash( + blurhash: blurHash, + width: width, + height: height, + fit: BoxFit.cover, + ), + ) + : BlurHash( + blurhash: blurHash, + width: width, + height: height, + ), + ), + ), + const Center(child: CircularProgressIndicator.adaptive()), + ], + ); + } +} \ No newline at end of file diff --git a/lib/pages/invitation_selection/invitation_selection.dart b/lib/pages/invitation_selection/invitation_selection.dart new file mode 100644 index 0000000..0d661b5 --- /dev/null +++ b/lib/pages/invitation_selection/invitation_selection.dart @@ -0,0 +1,116 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/pages/invitation_selection/invitation_selection_view.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import 'package:fluffychat/widgets/matrix.dart'; +import '../../utils/localized_exception_extension.dart'; + +class InvitationSelection extends StatefulWidget { + final String roomId; + const InvitationSelection({ + super.key, + required this.roomId, + }); + + @override + InvitationSelectionController createState() => + InvitationSelectionController(); +} + +class InvitationSelectionController extends State { + TextEditingController controller = TextEditingController(); + late String currentSearchTerm; + bool loading = false; + List foundProfiles = []; + Timer? coolDown; + + String? get roomId => widget.roomId; + + Future> getContacts(BuildContext context) async { + final client = Matrix.of(context).client; + final room = client.getRoomById(roomId!)!; + + final participants = (room.summary.mJoinedMemberCount ?? 0) > 100 + ? room.getParticipants() + : await room.requestParticipants(); + participants.removeWhere( + (u) => ![Membership.join, Membership.invite].contains(u.membership), + ); + final contacts = client.rooms + .where((r) => r.isDirectChat) + .map((r) => r.unsafeGetUserFromMemoryOrFallback(r.directChatMatrixID!)) + .toList(); + contacts.sort( + (a, b) => a.calcDisplayname().toLowerCase().compareTo( + b.calcDisplayname().toLowerCase(), + ), + ); + return contacts; + } + + void inviteAction(BuildContext context, String id, String displayname) async { + final room = Matrix.of(context).client.getRoomById(roomId!)!; + + final success = await showFutureLoadingDialog( + context: context, + future: () => room.invite(id), + ); + if (success.error == null) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text(L10n.of(context).contactHasBeenInvitedToTheGroup), + ), + ); + } + } + + void searchUserWithCoolDown(String text) async { + coolDown?.cancel(); + coolDown = Timer( + const Duration(milliseconds: 500), + () => searchUser(context, text), + ); + } + + void searchUser(BuildContext context, String text) async { + coolDown?.cancel(); + if (text.isEmpty) { + setState(() => foundProfiles = []); + } + currentSearchTerm = text; + if (currentSearchTerm.isEmpty) return; + if (loading) return; + setState(() => loading = true); + final matrix = Matrix.of(context); + SearchUserDirectoryResponse response; + try { + response = await matrix.client.searchUserDirectory(text, limit: 10); + } catch (e) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text((e).toLocalizedString(context))), + ); + return; + } finally { + setState(() => loading = false); + } + setState(() { + foundProfiles = List.from(response.results); + if (text.isValidMatrixId && + foundProfiles.indexWhere((profile) => text == profile.userId) == -1) { + setState( + () => foundProfiles = [ + Profile.fromJson({'user_id': text}), + ], + ); + } + }); + } + + @override + Widget build(BuildContext context) => InvitationSelectionView(this); +} diff --git a/lib/pages/invitation_selection/invitation_selection_view.dart b/lib/pages/invitation_selection/invitation_selection_view.dart new file mode 100644 index 0000000..2fd25e0 --- /dev/null +++ b/lib/pages/invitation_selection/invitation_selection_view.dart @@ -0,0 +1,197 @@ +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/pages/invitation_selection/invitation_selection.dart'; +import 'package:fluffychat/widgets/avatar.dart'; +import 'package:fluffychat/widgets/layouts/max_width_body.dart'; +import 'package:fluffychat/widgets/matrix.dart'; +import '../../widgets/adaptive_dialogs/user_dialog.dart'; + +class InvitationSelectionView extends StatelessWidget { + final InvitationSelectionController controller; + + const InvitationSelectionView(this.controller, {super.key}); + + @override + Widget build(BuildContext context) { + final room = + Matrix.of(context).client.getRoomById(controller.widget.roomId); + if (room == null) { + return Scaffold( + appBar: AppBar( + title: Text(L10n.of(context).oopsSomethingWentWrong), + ), + body: Center( + child: Text(L10n.of(context).youAreNoLongerParticipatingInThisChat), + ), + ); + } + + final groupName = room.name.isEmpty ? L10n.of(context).group : room.name; + final theme = Theme.of(context); + return Scaffold( + appBar: AppBar( + leading: const Center(child: BackButton()), + titleSpacing: 0, + title: Text(L10n.of(context).inviteContact), + ), + body: MaxWidthBody( + innerPadding: const EdgeInsets.symmetric(vertical: 8), + child: Column( + children: [ + Padding( + padding: const EdgeInsets.all(16.0), + child: TextField( + textInputAction: TextInputAction.search, + decoration: InputDecoration( + filled: true, + fillColor: theme.colorScheme.secondaryContainer, + border: OutlineInputBorder( + borderSide: BorderSide.none, + borderRadius: BorderRadius.circular(99), + ), + hintStyle: TextStyle( + color: theme.colorScheme.onPrimaryContainer, + fontWeight: FontWeight.normal, + ), + hintText: L10n.of(context).inviteContactToGroup(groupName), + prefixIcon: controller.loading + ? const Padding( + padding: EdgeInsets.symmetric( + vertical: 10.0, + horizontal: 12, + ), + child: SizedBox.square( + dimension: 24, + child: CircularProgressIndicator.adaptive( + strokeWidth: 2, + ), + ), + ) + : const Icon(Icons.search_outlined), + ), + onChanged: controller.searchUserWithCoolDown, + ), + ), + StreamBuilder( + stream: room.client.onRoomState.stream + .where((update) => update.roomId == room.id), + builder: (context, snapshot) { + final participants = + room.getParticipants().map((user) => user.id).toSet(); + return controller.foundProfiles.isNotEmpty + ? ListView.builder( + physics: const NeverScrollableScrollPhysics(), + shrinkWrap: true, + itemCount: controller.foundProfiles.length, + itemBuilder: (BuildContext context, int i) => + _InviteContactListTile( + profile: controller.foundProfiles[i], + isMember: participants + .contains(controller.foundProfiles[i].userId), + onTap: () => controller.inviteAction( + context, + controller.foundProfiles[i].userId, + controller.foundProfiles[i].displayName ?? + controller.foundProfiles[i].userId.localpart ?? + L10n.of(context).user, + ), + ), + ) + : FutureBuilder>( + future: controller.getContacts(context), + builder: (BuildContext context, snapshot) { + if (!snapshot.hasData) { + return const Center( + child: CircularProgressIndicator.adaptive( + strokeWidth: 2, + ), + ); + } + final contacts = snapshot.data!; + return ListView.builder( + physics: const NeverScrollableScrollPhysics(), + shrinkWrap: true, + itemCount: contacts.length, + itemBuilder: (BuildContext context, int i) => + _InviteContactListTile( + user: contacts[i], + profile: Profile( + avatarUrl: contacts[i].avatarUrl, + displayName: contacts[i].displayName ?? + contacts[i].id.localpart ?? + L10n.of(context).user, + userId: contacts[i].id, + ), + isMember: participants.contains(contacts[i].id), + onTap: () => controller.inviteAction( + context, + contacts[i].id, + contacts[i].displayName ?? + contacts[i].id.localpart ?? + L10n.of(context).user, + ), + ), + ); + }, + ); + }, + ), + ], + ), + ), + ); + } +} + +class _InviteContactListTile extends StatelessWidget { + final Profile profile; + final User? user; + final bool isMember; + final void Function() onTap; + + const _InviteContactListTile({ + required this.profile, + this.user, + required this.isMember, + required this.onTap, + }); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + final l10n = L10n.of(context); + + return ListTile( + leading: Avatar( + mxContent: profile.avatarUrl, + name: profile.displayName, + presenceUserId: profile.userId, + onTap: () => UserDialog.show( + context: context, + profile: profile, + ), + ), + title: Text( + profile.displayName ?? profile.userId.localpart ?? l10n.user, + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + subtitle: Text( + profile.userId, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle( + color: theme.colorScheme.secondary, + ), + ), + trailing: TextButton.icon( + onPressed: isMember ? null : onTap, + label: Text(isMember ? l10n.participant : l10n.invite), + icon: Icon(isMember ? Icons.check : Icons.add), + ), + ); + } +} diff --git a/lib/pages/key_verification/key_verification_dialog.dart b/lib/pages/key_verification/key_verification_dialog.dart new file mode 100644 index 0000000..ef7beae --- /dev/null +++ b/lib/pages/key_verification/key_verification_dialog.dart @@ -0,0 +1,411 @@ +import 'dart:convert'; +import 'dart:ui'; + +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:matrix/encryption.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/widgets/adaptive_dialogs/adaptive_dialog_action.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; +import 'package:fluffychat/widgets/avatar.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; + +class KeyVerificationDialog extends StatefulWidget { + Future show(BuildContext context) => showAdaptiveDialog( + context: context, + builder: (context) => this, + barrierDismissible: false, + ); + + final KeyVerification request; + + const KeyVerificationDialog({ + super.key, + required this.request, + }); + + @override + KeyVerificationPageState createState() => KeyVerificationPageState(); +} + +class KeyVerificationPageState extends State { + void Function()? originalOnUpdate; + late final List sasEmoji; + + @override + void initState() { + originalOnUpdate = widget.request.onUpdate; + widget.request.onUpdate = () { + originalOnUpdate?.call(); + setState(() {}); + }; + widget.request.client.getProfileFromUserId(widget.request.userId).then((p) { + profile = p; + setState(() {}); + }); + rootBundle.loadString('assets/sas-emoji.json').then((e) { + sasEmoji = json.decode(e); + setState(() {}); + }); + super.initState(); + } + + @override + void dispose() { + widget.request.onUpdate = + originalOnUpdate; // don't want to get updates anymore + if (![KeyVerificationState.error, KeyVerificationState.done] + .contains(widget.request.state)) { + widget.request.cancel('m.user'); + } + super.dispose(); + } + + Profile? profile; + + Future checkInput(String input) async { + if (input.isEmpty) return; + + final valid = await showFutureLoadingDialog( + context: context, + future: () async { + // make sure the loading spinner shows before we test the keys + await Future.delayed(const Duration(milliseconds: 100)); + var valid = false; + try { + await widget.request.openSSSS(keyOrPassphrase: input); + valid = true; + } catch (_) { + valid = false; + } + return valid; + }, + ); + if (valid.error != null) { + await showOkAlertDialog( + useRootNavigator: false, + context: context, + title: L10n.of(context).incorrectPassphraseOrKey, + ); + } + } + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + User? user; + final directChatId = + widget.request.client.getDirectChatFromUserId(widget.request.userId); + if (directChatId != null) { + user = widget.request.client + .getRoomById(directChatId)! + .unsafeGetUserFromMemoryOrFallback(widget.request.userId); + } + final displayName = + user?.calcDisplayname() ?? widget.request.userId.localpart!; + var title = Text(L10n.of(context).verifyTitle); + Widget body; + final buttons = []; + + switch (widget.request.state) { + case KeyVerificationState.showQRSuccess: + case KeyVerificationState.confirmQRScan: + throw 'Not implemented'; + case KeyVerificationState.askSSSS: + // prompt the user for their ssss passphrase / key + final textEditingController = TextEditingController(); + String input; + body = Container( + margin: const EdgeInsets.only(left: 8.0, right: 8.0), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + L10n.of(context).askSSSSSign, + style: const TextStyle(fontSize: 20), + ), + Container(height: 10), + TextField( + controller: textEditingController, + autofocus: false, + autocorrect: false, + onSubmitted: (s) { + input = s; + checkInput(input); + }, + minLines: 1, + maxLines: 1, + obscureText: true, + decoration: InputDecoration( + hintText: L10n.of(context).passphraseOrKey, + prefixStyle: TextStyle(color: theme.colorScheme.primary), + suffixStyle: TextStyle(color: theme.colorScheme.primary), + border: const OutlineInputBorder(), + ), + ), + ], + ), + ); + buttons.add( + AdaptiveDialogAction( + child: Text( + L10n.of(context).submit, + ), + onPressed: () => checkInput(textEditingController.text), + ), + ); + buttons.add( + AdaptiveDialogAction( + child: Text( + L10n.of(context).skip, + ), + onPressed: () => widget.request.openSSSS(skip: true), + ), + ); + break; + case KeyVerificationState.askAccept: + title = Text(L10n.of(context).newVerificationRequest); + body = Column( + mainAxisSize: MainAxisSize.min, + children: [ + const SizedBox(height: 16), + Avatar( + mxContent: user?.avatarUrl, + name: displayName, + size: Avatar.defaultSize * 2, + ), + const SizedBox(height: 16), + Text( + L10n.of(context).askVerificationRequest(displayName), + ), + ], + ); + buttons.add( + AdaptiveDialogAction( + onPressed: () => widget.request + .rejectVerification() + .then((_) => Navigator.of(context, rootNavigator: false).pop()), + child: Text( + L10n.of(context).reject, + style: TextStyle(color: theme.colorScheme.error), + ), + ), + ); + buttons.add( + AdaptiveDialogAction( + onPressed: () => widget.request.acceptVerification(), + child: Text(L10n.of(context).accept), + ), + ); + break; + case KeyVerificationState.askChoice: + case KeyVerificationState.waitingAccept: + body = Center( + child: Column( + children: [ + const SizedBox(height: 16), + Stack( + alignment: Alignment.center, + children: [ + Avatar( + mxContent: user?.avatarUrl, + name: displayName, + ), + const SizedBox( + width: Avatar.defaultSize + 2, + height: Avatar.defaultSize + 2, + child: CircularProgressIndicator(strokeWidth: 2), + ), + ], + ), + const SizedBox(height: 16), + Text( + L10n.of(context).waitingPartnerAcceptRequest, + textAlign: TextAlign.center, + ), + ], + ), + ); + buttons.add( + AdaptiveDialogAction( + onPressed: () => widget.request.cancel(), + child: Text(L10n.of(context).cancel), + ), + ); + + break; + case KeyVerificationState.askSas: + TextSpan compareWidget; + // maybe add a button to switch between the two and only determine default + // view for if "emoji" is a present sasType or not? + + if (widget.request.sasTypes.contains('emoji')) { + title = Text( + L10n.of(context).compareEmojiMatch, + maxLines: 1, + style: const TextStyle(fontSize: 16), + ); + compareWidget = TextSpan( + children: widget.request.sasEmojis + .map((e) => WidgetSpan(child: _Emoji(e, sasEmoji))) + .toList(), + ); + } else { + title = Text(L10n.of(context).compareNumbersMatch); + final numbers = widget.request.sasNumbers; + final numbstr = '${numbers[0]}-${numbers[1]}-${numbers[2]}'; + compareWidget = + TextSpan(text: numbstr, style: const TextStyle(fontSize: 40)); + } + body = Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text.rich( + compareWidget, + textAlign: TextAlign.center, + ), + ], + ); + buttons.add( + AdaptiveDialogAction( + onPressed: () => widget.request.rejectSas(), + child: Text( + L10n.of(context).theyDontMatch, + style: TextStyle(color: theme.colorScheme.error), + ), + ), + ); + buttons.add( + AdaptiveDialogAction( + onPressed: () => widget.request.acceptSas(), + child: Text(L10n.of(context).theyMatch), + ), + ); + break; + case KeyVerificationState.waitingSas: + final acceptText = widget.request.sasTypes.contains('emoji') + ? L10n.of(context).waitingPartnerEmoji + : L10n.of(context).waitingPartnerNumbers; + body = Column( + mainAxisSize: MainAxisSize.min, + children: [ + const SizedBox(height: 16), + const CircularProgressIndicator.adaptive(strokeWidth: 2), + const SizedBox(height: 16), + Text( + acceptText, + textAlign: TextAlign.center, + ), + ], + ); + break; + case KeyVerificationState.done: + title = Text(L10n.of(context).verifySuccess); + body = const Padding( + padding: EdgeInsets.all(16.0), + child: Icon( + Icons.verified_outlined, + color: Colors.green, + size: 128.0, + ), + ); + buttons.add( + AdaptiveDialogAction( + child: Text( + L10n.of(context).close, + ), + onPressed: () => Navigator.of(context, rootNavigator: false).pop(), + ), + ); + break; + case KeyVerificationState.error: + title = const Text(''); + body = Column( + mainAxisSize: MainAxisSize.min, + children: [ + const SizedBox(height: 16), + Icon(Icons.cancel, color: theme.colorScheme.error, size: 64.0), + const SizedBox(height: 16), + // TODO: Add better error UI to user + Text( + 'Error ${widget.request.canceledCode}: ${widget.request.canceledReason}', + textAlign: TextAlign.center, + ), + ], + ); + buttons.add( + AdaptiveDialogAction( + child: Text( + L10n.of(context).close, + ), + onPressed: () => Navigator.of(context, rootNavigator: false).pop(), + ), + ); + break; + } + + return AlertDialog.adaptive( + title: title, + content: SizedBox( + height: 256, + width: 256, + child: ListView( + children: [body], + ), + ), + actions: buttons, + ); + } +} + +class _Emoji extends StatelessWidget { + final KeyVerificationEmoji emoji; + final List? sasEmoji; + + const _Emoji(this.emoji, this.sasEmoji); + + String getLocalizedName() { + final sasEmoji = this.sasEmoji; + if (sasEmoji == null) { + // asset is still being loaded + return emoji.name; + } + final translations = Map.from( + sasEmoji[emoji.number]['translated_descriptions'], + ); + translations['en'] = emoji.name; + for (final locale in PlatformDispatcher.instance.locales) { + final wantLocaleParts = locale.toString().split('_'); + final wantLanguage = wantLocaleParts.removeAt(0); + for (final haveLocale in translations.keys) { + final haveLocaleParts = haveLocale.split('_'); + final haveLanguage = haveLocaleParts.removeAt(0); + if (haveLanguage == wantLanguage && + (Set.from(haveLocaleParts)..removeAll(wantLocaleParts)).isEmpty && + (translations[haveLocale]?.isNotEmpty ?? false)) { + return translations[haveLocale]!; + } + } + } + return emoji.name; + } + + @override + Widget build(BuildContext context) { + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text(emoji.emoji, style: const TextStyle(fontSize: 50)), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 4.0), + child: Text(getLocalizedName()), + ), + const SizedBox(height: 10, width: 5), + ], + ); + } +} diff --git a/lib/pages/login/login.dart b/lib/pages/login/login.dart new file mode 100644 index 0000000..e50f99e --- /dev/null +++ b/lib/pages/login/login.dart @@ -0,0 +1,248 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/utils/localized_exception_extension.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_text_input_dialog.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import 'package:fluffychat/widgets/matrix.dart'; +import '../../utils/platform_infos.dart'; +import 'login_view.dart'; + +class Login extends StatefulWidget { + const Login({super.key}); + + @override + LoginController createState() => LoginController(); +} + +class LoginController extends State { + final TextEditingController usernameController = TextEditingController(); + final TextEditingController passwordController = TextEditingController(); + String? usernameError; + String? passwordError; + bool loading = false; + bool showPassword = false; + + void toggleShowPassword() => + setState(() => showPassword = !loading && !showPassword); + + void login() async { + final matrix = Matrix.of(context); + if (usernameController.text.isEmpty) { + setState(() => usernameError = L10n.of(context).pleaseEnterYourUsername); + } else { + setState(() => usernameError = null); + } + if (passwordController.text.isEmpty) { + setState(() => passwordError = L10n.of(context).pleaseEnterYourPassword); + } else { + setState(() => passwordError = null); + } + + if (usernameController.text.isEmpty || passwordController.text.isEmpty) { + return; + } + + setState(() => loading = true); + + _coolDown?.cancel(); + + try { + final username = usernameController.text; + AuthenticationIdentifier identifier; + if (username.isEmail) { + identifier = AuthenticationThirdPartyIdentifier( + medium: 'email', + address: username, + ); + } else if (username.isPhoneNumber) { + identifier = AuthenticationThirdPartyIdentifier( + medium: 'msisdn', + address: username, + ); + } else { + identifier = AuthenticationUserIdentifier(user: username); + } + await matrix.getLoginClient().login( + LoginType.mLoginPassword, + identifier: identifier, + // To stay compatible with older server versions + // ignore: deprecated_member_use + user: identifier.type == AuthenticationIdentifierTypes.userId + ? username + : null, + password: passwordController.text, + initialDeviceDisplayName: PlatformInfos.clientName, + ); + } on MatrixException catch (exception) { + setState(() => passwordError = exception.errorMessage); + return setState(() => loading = false); + } catch (exception) { + setState(() => passwordError = exception.toString()); + return setState(() => loading = false); + } + + if (mounted) setState(() => loading = false); + } + + Timer? _coolDown; + + void checkWellKnownWithCoolDown(String userId) async { + _coolDown?.cancel(); + _coolDown = Timer( + const Duration(seconds: 1), + () => _checkWellKnown(userId), + ); + } + + void _checkWellKnown(String userId) async { + if (mounted) setState(() => usernameError = null); + if (!userId.isValidMatrixId) return; + final oldHomeserver = Matrix.of(context).getLoginClient().homeserver; + try { + var newDomain = Uri.https(userId.domain!, ''); + Matrix.of(context).getLoginClient().homeserver = newDomain; + DiscoveryInformation? wellKnownInformation; + try { + wellKnownInformation = + await Matrix.of(context).getLoginClient().getWellknown(); + if (wellKnownInformation.mHomeserver.baseUrl.toString().isNotEmpty) { + newDomain = wellKnownInformation.mHomeserver.baseUrl; + } + } catch (_) { + // do nothing, newDomain is already set to a reasonable fallback + } + if (newDomain != oldHomeserver) { + await Matrix.of(context).getLoginClient().checkHomeserver(newDomain); + + if (Matrix.of(context).getLoginClient().homeserver == null) { + Matrix.of(context).getLoginClient().homeserver = oldHomeserver; + // okay, the server we checked does not appear to be a matrix server + Logs().v( + '$newDomain is not running a homeserver, asking to use $oldHomeserver', + ); + final dialogResult = await showOkCancelAlertDialog( + context: context, + useRootNavigator: false, + title: L10n.of(context) + .noMatrixServer(newDomain.toString(), oldHomeserver.toString()), + okLabel: L10n.of(context).ok, + cancelLabel: L10n.of(context).cancel, + ); + if (dialogResult == OkCancelResult.ok) { + if (mounted) setState(() => usernameError = null); + } else { + Navigator.of(context, rootNavigator: false).pop(); + return; + } + } + usernameError = null; + if (mounted) setState(() {}); + } else { + Matrix.of(context).getLoginClient().homeserver = oldHomeserver; + if (mounted) { + setState(() {}); + } + } + } catch (e) { + Matrix.of(context).getLoginClient().homeserver = oldHomeserver; + usernameError = e.toLocalizedString(context); + if (mounted) setState(() {}); + } + } + + void passwordForgotten() async { + final input = await showTextInputDialog( + useRootNavigator: false, + context: context, + title: L10n.of(context).passwordForgotten, + message: L10n.of(context).enterAnEmailAddress, + okLabel: L10n.of(context).ok, + cancelLabel: L10n.of(context).cancel, + initialText: + usernameController.text.isEmail ? usernameController.text : '', + hintText: L10n.of(context).enterAnEmailAddress, + keyboardType: TextInputType.emailAddress, + ); + if (input == null) return; + final clientSecret = DateTime.now().millisecondsSinceEpoch.toString(); + final response = await showFutureLoadingDialog( + context: context, + future: () => + Matrix.of(context).getLoginClient().requestTokenToResetPasswordEmail( + clientSecret, + input, + sendAttempt++, + ), + ); + if (response.error != null) return; + final password = await showTextInputDialog( + useRootNavigator: false, + context: context, + title: L10n.of(context).passwordForgotten, + message: L10n.of(context).chooseAStrongPassword, + okLabel: L10n.of(context).ok, + cancelLabel: L10n.of(context).cancel, + hintText: '******', + obscureText: true, + minLines: 1, + maxLines: 1, + ); + if (password == null) return; + final ok = await showOkAlertDialog( + useRootNavigator: false, + context: context, + title: L10n.of(context).weSentYouAnEmail, + message: L10n.of(context).pleaseClickOnLink, + okLabel: L10n.of(context).iHaveClickedOnLink, + ); + if (ok != OkCancelResult.ok) return; + final data = { + 'new_password': password, + 'logout_devices': false, + "auth": AuthenticationThreePidCreds( + type: AuthenticationTypes.emailIdentity, + threepidCreds: ThreepidCreds( + sid: response.result!.sid, + clientSecret: clientSecret, + ), + ).toJson(), + }; + final success = await showFutureLoadingDialog( + context: context, + future: () => Matrix.of(context).getLoginClient().request( + RequestType.POST, + '/client/v3/account/password', + data: data, + ), + ); + if (success.error == null) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text(L10n.of(context).passwordHasBeenChanged)), + ); + usernameController.text = input; + passwordController.text = password; + login(); + } + } + + static int sendAttempt = 0; + + @override + Widget build(BuildContext context) => LoginView(this); +} + +extension on String { + static final RegExp _phoneRegex = + RegExp(r'^[+]*[(]{0,1}[0-9]{1,4}[)]{0,1}[-\s\./0-9]*$'); + static final RegExp _emailRegex = RegExp(r'(.+)@(.+)\.(.+)'); + + bool get isEmail => _emailRegex.hasMatch(this); + + bool get isPhoneNumber => _phoneRegex.hasMatch(this); +} diff --git a/lib/pages/login/login_view.dart b/lib/pages/login/login_view.dart new file mode 100644 index 0000000..124b168 --- /dev/null +++ b/lib/pages/login/login_view.dart @@ -0,0 +1,143 @@ +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; + +import 'package:fluffychat/widgets/layouts/login_scaffold.dart'; +import 'package:fluffychat/widgets/matrix.dart'; +import 'login.dart'; + +class LoginView extends StatelessWidget { + final LoginController controller; + + const LoginView(this.controller, {super.key}); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + final homeserver = Matrix.of(context) + .getLoginClient() + .homeserver + .toString() + .replaceFirst('https://', ''); + final title = L10n.of(context).logInTo(homeserver); + final titleParts = title.split(homeserver); + + return LoginScaffold( + enforceMobileMode: Matrix.of(context).client.isLogged(), + appBar: AppBar( + leading: controller.loading ? null : const Center(child: BackButton()), + automaticallyImplyLeading: !controller.loading, + titleSpacing: !controller.loading ? 0 : null, + title: Text.rich( + TextSpan( + children: [ + TextSpan(text: titleParts.first), + TextSpan( + text: homeserver, + style: const TextStyle(fontWeight: FontWeight.bold), + ), + TextSpan(text: titleParts.last), + ], + ), + style: const TextStyle(fontSize: 18), + ), + ), + body: Builder( + builder: (context) { + return AutofillGroup( + child: ListView( + padding: const EdgeInsets.symmetric(horizontal: 8), + children: [ + Hero( + tag: 'info-logo', + child: Image.asset('assets/banner_transparent.png'), + ), + const SizedBox(height: 16), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 24.0), + child: TextField( + readOnly: controller.loading, + autocorrect: false, + autofocus: true, + onChanged: controller.checkWellKnownWithCoolDown, + controller: controller.usernameController, + textInputAction: TextInputAction.next, + keyboardType: TextInputType.emailAddress, + autofillHints: + controller.loading ? null : [AutofillHints.username], + decoration: InputDecoration( + prefixIcon: const Icon(Icons.account_box_outlined), + errorText: controller.usernameError, + errorStyle: const TextStyle(color: Colors.orange), + hintText: '@username:domain', + labelText: L10n.of(context).emailOrUsername, + ), + ), + ), + const SizedBox(height: 16), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 24.0), + child: TextField( + readOnly: controller.loading, + autocorrect: false, + autofillHints: + controller.loading ? null : [AutofillHints.password], + controller: controller.passwordController, + textInputAction: TextInputAction.go, + obscureText: !controller.showPassword, + onSubmitted: (_) => controller.login(), + decoration: InputDecoration( + prefixIcon: const Icon(Icons.lock_outlined), + errorText: controller.passwordError, + errorStyle: const TextStyle(color: Colors.orange), + suffixIcon: IconButton( + onPressed: controller.toggleShowPassword, + icon: Icon( + controller.showPassword + ? Icons.visibility_off_outlined + : Icons.visibility_outlined, + color: Colors.black, + ), + ), + hintText: '******', + labelText: L10n.of(context).password, + ), + ), + ), + const SizedBox(height: 16), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 24.0), + child: ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: theme.colorScheme.primary, + foregroundColor: theme.colorScheme.onPrimary, + ), + onPressed: controller.loading ? null : controller.login, + child: controller.loading + ? const LinearProgressIndicator() + : Text(L10n.of(context).login), + ), + ), + const SizedBox(height: 16), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 24.0), + child: TextButton( + onPressed: controller.loading + ? () {} + : controller.passwordForgotten, + style: TextButton.styleFrom( + foregroundColor: theme.colorScheme.error, + ), + child: Text(L10n.of(context).passwordForgotten), + ), + ), + const SizedBox(height: 16), + ], + ), + ); + }, + ), + ); + } +} diff --git a/lib/pages/new_group/new_group.dart b/lib/pages/new_group/new_group.dart new file mode 100644 index 0000000..7058ac7 --- /dev/null +++ b/lib/pages/new_group/new_group.dart @@ -0,0 +1,160 @@ +import 'dart:typed_data'; + +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart' as sdk; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/pages/new_group/new_group_view.dart'; +import 'package:fluffychat/utils/file_selector.dart'; +import 'package:fluffychat/widgets/matrix.dart'; + +class NewGroup extends StatefulWidget { + final CreateGroupType createGroupType; + const NewGroup({ + this.createGroupType = CreateGroupType.group, + super.key, + }); + + @override + NewGroupController createState() => NewGroupController(); +} + +class NewGroupController extends State { + TextEditingController nameController = TextEditingController(); + + bool publicGroup = false; + bool groupCanBeFound = false; + bool enableEncryption = false; + + Uint8List? avatar; + + Uri? avatarUrl; + + Object? error; + + bool loading = false; + + CreateGroupType get createGroupType => + _createGroupType ?? widget.createGroupType; + + CreateGroupType? _createGroupType; + + void setCreateGroupType(Set b) => + setState(() => _createGroupType = b.single); + + void setPublicGroup(bool b) => + setState(() => publicGroup = groupCanBeFound = b); + + void setGroupCanBeFound(bool b) => setState(() => groupCanBeFound = b); + + void setEnableEncryption(bool b) => setState(() => enableEncryption = b); + + void selectPhoto() async { + final photo = await selectFiles( + context, + type: FileSelectorType.images, + allowMultiple: false, + ); + final bytes = await photo.singleOrNull?.readAsBytes(); + + setState(() { + avatarUrl = null; + avatar = bytes; + }); + } + + Future _createGroup() async { + if (!mounted) return; + final roomId = await Matrix.of(context).client.createGroupChat( + visibility: + groupCanBeFound ? sdk.Visibility.public : sdk.Visibility.private, + enableEncryption: enableEncryption, + groupName: nameController.text.isNotEmpty ? nameController.text : null, + initialState: [ + if (avatar != null) + sdk.StateEvent( + type: sdk.EventTypes.RoomAvatar, + content: {'url': avatarUrl.toString()}, + ), + sdk.StateEvent( + type: sdk.EventTypes.RoomJoinRules, + content: {'join_rule': publicGroup ? 'public' : 'invite'} + ) + ], + ); + final room = Matrix.of(context).client.getRoomById(roomId); + // if (room != null) { + // room.setJoinRules(publicGroup ? JoinRules.public : JoinRules.invite); + // } + if (!mounted) return; + context.go('/rooms/$roomId/invite'); + } + + Future _createSpace() async { + if (!mounted) return; + final spaceId = await Matrix.of(context).client.createRoom( + preset: publicGroup + ? sdk.CreateRoomPreset.publicChat + : sdk.CreateRoomPreset.privateChat, + creationContent: {'type': RoomCreationTypes.mSpace}, + visibility: publicGroup ? sdk.Visibility.public : null, + roomAliasName: publicGroup + ? nameController.text.trim().toLowerCase().replaceAll(' ', '_') + : null, + name: nameController.text.trim(), + powerLevelContentOverride: {'events_default': 100}, + initialState: [ + if (avatar != null) + sdk.StateEvent( + type: sdk.EventTypes.RoomAvatar, + content: {'url': avatarUrl.toString()}, + ), + ], + ); + if (!mounted) return; + context.pop(spaceId); + } + + void submitAction([_]) async { + final client = Matrix.of(context).client; + + try { + if (nameController.text.trim().isEmpty && + createGroupType == CreateGroupType.space) { + setState(() => error = L10n.of(context).pleaseFillOut); + return; + } + + setState(() { + loading = true; + error = null; + }); + + final avatar = this.avatar; + avatarUrl ??= avatar == null ? null : await client.uploadContent(avatar); + + if (!mounted) return; + + switch (createGroupType) { + case CreateGroupType.group: + await _createGroup(); + case CreateGroupType.space: + await _createSpace(); + } + } catch (e, s) { + sdk.Logs().d('Unable to create group', e, s); + setState(() { + error = e; + loading = false; + }); + } + } + + @override + Widget build(BuildContext context) => NewGroupView(this); +} + +enum CreateGroupType { group, space } diff --git a/lib/pages/new_group/new_group_view.dart b/lib/pages/new_group/new_group_view.dart new file mode 100644 index 0000000..fc2c10e --- /dev/null +++ b/lib/pages/new_group/new_group_view.dart @@ -0,0 +1,198 @@ +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; + +import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/pages/new_group/new_group.dart'; +import 'package:fluffychat/utils/localized_exception_extension.dart'; +import 'package:fluffychat/widgets/avatar.dart'; +import 'package:fluffychat/widgets/layouts/max_width_body.dart'; + +class NewGroupView extends StatelessWidget { + final NewGroupController controller; + + const NewGroupView(this.controller, {super.key}); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + final avatar = controller.avatar; + final error = controller.error; + return Scaffold( + appBar: AppBar( + leading: Center( + child: BackButton( + onPressed: controller.loading ? null : Navigator.of(context).pop, + ), + ), + title: Text( + controller.createGroupType == CreateGroupType.space + ? L10n.of(context).newSpace + : L10n.of(context).createGroup, + ), + ), + body: MaxWidthBody( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Padding( + padding: const EdgeInsets.all(16.0), + child: SegmentedButton( + selected: {controller.createGroupType}, + onSelectionChanged: controller.setCreateGroupType, + segments: [ + ButtonSegment( + value: CreateGroupType.group, + label: Text(L10n.of(context).group), + ), + ButtonSegment( + value: CreateGroupType.space, + label: Text(L10n.of(context).space), + ), + ], + ), + ), + const SizedBox(height: 16), + InkWell( + borderRadius: BorderRadius.circular(90), + onTap: controller.loading ? null : controller.selectPhoto, + child: CircleAvatar( + radius: Avatar.defaultSize, + child: avatar == null + ? const Icon(Icons.add_a_photo_outlined) + : ClipRRect( + borderRadius: BorderRadius.circular(90), + child: Image.memory( + avatar, + width: Avatar.defaultSize * 2, + height: Avatar.defaultSize * 2, + fit: BoxFit.cover, + ), + ), + ), + ), + const SizedBox(height: 32), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 24.0), + child: TextField( + autofocus: true, + controller: controller.nameController, + autocorrect: false, + readOnly: controller.loading, + decoration: InputDecoration( + prefixIcon: const Icon(Icons.people_outlined), + labelText: controller.createGroupType == CreateGroupType.space + ? L10n.of(context).spaceName + : L10n.of(context).groupName, + ), + ), + ), + const SizedBox(height: 16), + SwitchListTile.adaptive( + contentPadding: const EdgeInsets.symmetric(horizontal: 32), + secondary: const Icon(Icons.public_outlined), + title: Text( + controller.createGroupType == CreateGroupType.space + ? L10n.of(context).spaceIsPublic + : L10n.of(context).groupIsPublic, + ), + value: controller.publicGroup, + onChanged: controller.loading ? null : controller.setPublicGroup, + ), + AnimatedSize( + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + child: controller.publicGroup + ? SwitchListTile.adaptive( + contentPadding: + const EdgeInsets.symmetric(horizontal: 32), + secondary: const Icon(Icons.search_outlined), + title: Text(L10n.of(context).groupCanBeFoundViaSearch), + value: controller.groupCanBeFound, + onChanged: controller.loading + ? null + : controller.setGroupCanBeFound, + ) + : const SizedBox.shrink(), + ), + AnimatedSize( + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + child: controller.createGroupType == CreateGroupType.space + ? const SizedBox.shrink() + : SwitchListTile.adaptive( + contentPadding: + const EdgeInsets.symmetric(horizontal: 32), + secondary: Icon( + Icons.lock_outlined, + color: theme.colorScheme.onSurface, + ), + title: Text( + L10n.of(context).enableEncryption, + style: TextStyle( + color: theme.colorScheme.onSurface, + ), + ), + value: controller.enableEncryption, + onChanged: controller.loading + ? null + : controller.setEnableEncryption, + ), + ), + AnimatedSize( + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + child: controller.createGroupType == CreateGroupType.space + ? ListTile( + contentPadding: + const EdgeInsets.symmetric(horizontal: 32), + trailing: const Padding( + padding: EdgeInsets.symmetric(horizontal: 16.0), + child: Icon(Icons.info_outlined), + ), + subtitle: Text(L10n.of(context).newSpaceDescription), + ) + : const SizedBox.shrink(), + ), + Padding( + padding: const EdgeInsets.all(16.0), + child: SizedBox( + width: double.infinity, + child: ElevatedButton( + onPressed: + controller.loading ? null : controller.submitAction, + child: controller.loading + ? const LinearProgressIndicator() + : Text( + controller.createGroupType == CreateGroupType.space + ? L10n.of(context).createNewSpace + : L10n.of(context).createGroupAndInviteUsers, + ), + ), + ), + ), + AnimatedSize( + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + child: error == null + ? const SizedBox.shrink() + : ListTile( + leading: Icon( + Icons.warning_outlined, + color: theme.colorScheme.error, + ), + title: Text( + error.toLocalizedString(context), + style: TextStyle( + color: theme.colorScheme.error, + ), + ), + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/pages/new_private_chat/new_private_chat.dart b/lib/pages/new_private_chat/new_private_chat.dart new file mode 100644 index 0000000..02dfef0 --- /dev/null +++ b/lib/pages/new_private_chat/new_private_chat.dart @@ -0,0 +1,108 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +import 'package:device_info_plus/device_info_plus.dart'; +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/pages/new_private_chat/new_private_chat_view.dart'; +import 'package:fluffychat/pages/new_private_chat/qr_scanner_modal.dart'; +import 'package:fluffychat/utils/adaptive_bottom_sheet.dart'; +import 'package:fluffychat/utils/fluffy_share.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/utils/url_launcher.dart'; +import 'package:fluffychat/widgets/matrix.dart'; +import '../../widgets/adaptive_dialogs/user_dialog.dart'; + +class NewPrivateChat extends StatefulWidget { + const NewPrivateChat({super.key}); + + @override + NewPrivateChatController createState() => NewPrivateChatController(); +} + +class NewPrivateChatController extends State { + final TextEditingController controller = TextEditingController(); + final FocusNode textFieldFocus = FocusNode(); + + Future>? searchResponse; + + Timer? _searchCoolDown; + + static const Duration _coolDown = Duration(milliseconds: 500); + + void searchUsers([String? input]) async { + final searchTerm = input ?? controller.text; + if (searchTerm.isEmpty) { + _searchCoolDown?.cancel(); + setState(() { + searchResponse = _searchCoolDown = null; + }); + return; + } + + _searchCoolDown?.cancel(); + _searchCoolDown = Timer(_coolDown, () { + setState(() { + searchResponse = _searchUser(searchTerm); + }); + }); + } + + Future> _searchUser(String searchTerm) async { + final result = + await Matrix.of(context).client.searchUserDirectory(searchTerm); + final profiles = result.results; + + if (searchTerm.isValidMatrixId && + searchTerm.sigil == '@' && + !profiles.any((profile) => profile.userId == searchTerm)) { + profiles.add(Profile(userId: searchTerm)); + } + + return profiles; + } + + void inviteAction() => FluffyShare.shareInviteLink(context); + + void openScannerAction() async { + if (PlatformInfos.isAndroid) { + final info = await DeviceInfoPlugin().androidInfo; + if (info.version.sdkInt < 21) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text( + L10n.of(context).unsupportedAndroidVersionLong, + ), + ), + ); + return; + } + } + await showAdaptiveBottomSheet( + context: context, + builder: (_) => QrScannerModal( + onScan: (link) => UrlLauncher(context, link).openMatrixToUrl(), + ), + ); + } + + void copyUserId() async { + await Clipboard.setData( + ClipboardData(text: Matrix.of(context).client.userID!), + ); + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text(L10n.of(context).copiedToClipboard)), + ); + } + + void openUserModal(Profile profile) => UserDialog.show( + context: context, + profile: profile, + ); + + @override + Widget build(BuildContext context) => NewPrivateChatView(this); +} diff --git a/lib/pages/new_private_chat/new_private_chat_view.dart b/lib/pages/new_private_chat/new_private_chat_view.dart new file mode 100644 index 0000000..5b7161b --- /dev/null +++ b/lib/pages/new_private_chat/new_private_chat_view.dart @@ -0,0 +1,279 @@ +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart'; +import 'package:pretty_qr_code/pretty_qr_code.dart'; + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/pages/new_private_chat/new_private_chat.dart'; +import 'package:fluffychat/utils/localized_exception_extension.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/utils/url_launcher.dart'; +import 'package:fluffychat/widgets/avatar.dart'; +import 'package:fluffychat/widgets/layouts/max_width_body.dart'; +import 'package:fluffychat/widgets/matrix.dart'; +import '../../widgets/qr_code_viewer.dart'; + +class NewPrivateChatView extends StatelessWidget { + final NewPrivateChatController controller; + + const NewPrivateChatView(this.controller, {super.key}); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + final searchResponse = controller.searchResponse; + final userId = Matrix.of(context).client.userID!; + return Scaffold( + appBar: AppBar( + scrolledUnderElevation: 0, + leading: const Center(child: BackButton()), + title: Text(L10n.of(context).newChat), + backgroundColor: theme.scaffoldBackgroundColor, + actions: [ + TextButton( + onPressed: + UrlLauncher(context, AppConfig.startChatTutorial).launchUrl, + child: Text(L10n.of(context).help), + ), + ], + ), + body: MaxWidthBody( + withScrolling: false, + innerPadding: const EdgeInsets.symmetric(vertical: 8), + child: Column( + children: [ + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 16.0, + vertical: 8.0, + ), + child: TextField( + controller: controller.controller, + onChanged: controller.searchUsers, + decoration: InputDecoration( + hintText: L10n.of(context).searchForUsers, + filled: true, + fillColor: theme.colorScheme.secondaryContainer, + border: OutlineInputBorder( + borderSide: BorderSide.none, + borderRadius: BorderRadius.circular(99), + ), + hintStyle: TextStyle( + color: theme.colorScheme.onPrimaryContainer, + fontWeight: FontWeight.normal, + ), + prefixIcon: searchResponse == null + ? const Icon(Icons.search_outlined) + : FutureBuilder( + future: searchResponse, + builder: (context, snapshot) { + if (snapshot.connectionState != + ConnectionState.done) { + return const Padding( + padding: EdgeInsets.all(10.0), + child: SizedBox.square( + dimension: 24, + child: CircularProgressIndicator.adaptive( + strokeWidth: 1, + ), + ), + ); + } + return const Icon(Icons.search_outlined); + }, + ), + suffixIcon: controller.controller.text.isEmpty + ? null + : IconButton( + icon: const Icon(Icons.clear_outlined), + onPressed: () { + controller.controller.clear(); + controller.searchUsers(); + }, + ), + ), + ), + ), + Expanded( + child: AnimatedCrossFade( + duration: FluffyThemes.animationDuration, + crossFadeState: searchResponse == null + ? CrossFadeState.showFirst + : CrossFadeState.showSecond, + firstChild: ListView( + children: [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: 18.0), + child: SelectableText.rich( + TextSpan( + children: [ + TextSpan( + text: L10n.of(context).yourGlobalUserIdIs, + ), + TextSpan( + text: Matrix.of(context).client.userID, + style: const TextStyle( + fontWeight: FontWeight.w600, + ), + ), + ], + ), + style: TextStyle( + color: theme.colorScheme.onSurface, + fontSize: 13, + ), + ), + ), + const SizedBox(height: 8), + ListTile( + leading: CircleAvatar( + backgroundColor: theme.colorScheme.secondaryContainer, + foregroundColor: theme.colorScheme.onSecondaryContainer, + child: Icon(Icons.adaptive.share_outlined), + ), + title: Text(L10n.of(context).shareInviteLink), + onTap: controller.inviteAction, + ), + ListTile( + leading: CircleAvatar( + backgroundColor: theme.colorScheme.tertiaryContainer, + foregroundColor: theme.colorScheme.onTertiaryContainer, + child: const Icon(Icons.group_add_outlined), + ), + title: Text(L10n.of(context).createGroup), + onTap: () => context.go('/rooms/newgroup'), + ), + if (PlatformInfos.isMobile) + ListTile( + leading: CircleAvatar( + backgroundColor: theme.colorScheme.primaryContainer, + foregroundColor: theme.colorScheme.onPrimaryContainer, + child: const Icon(Icons.qr_code_scanner_outlined), + ), + title: Text(L10n.of(context).scanQrCode), + onTap: controller.openScannerAction, + ), + Center( + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 64.0, + vertical: 24.0, + ), + child: Material( + borderRadius: + BorderRadius.circular(AppConfig.borderRadius), + color: theme.colorScheme.primaryContainer, + clipBehavior: Clip.hardEdge, + child: InkWell( + borderRadius: + BorderRadius.circular(AppConfig.borderRadius), + onTap: () => showQrCodeViewer( + context, + userId, + ), + child: Padding( + padding: const EdgeInsets.all(32.0), + child: ConstrainedBox( + constraints: + const BoxConstraints(maxWidth: 256), + child: PrettyQrView.data( + data: 'https://matrix.to/#/$userId', + decoration: PrettyQrDecoration( + shape: PrettyQrSmoothSymbol( + roundFactor: 1, + color: + theme.colorScheme.onPrimaryContainer, + ), + ), + ), + ), + ), + ), + ), + ), + ), + ], + ), + secondChild: FutureBuilder( + future: searchResponse, + builder: (context, snapshot) { + final result = snapshot.data; + final error = snapshot.error; + if (error != null) { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + error.toLocalizedString(context), + textAlign: TextAlign.center, + style: TextStyle( + color: theme.colorScheme.error, + ), + ), + const SizedBox(height: 12), + OutlinedButton.icon( + onPressed: controller.searchUsers, + icon: const Icon(Icons.refresh_outlined), + label: Text(L10n.of(context).tryAgain), + ), + ], + ); + } + if (result == null) { + return const Center( + child: CircularProgressIndicator.adaptive(), + ); + } + if (result.isEmpty) { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Icon(Icons.search_outlined, size: 86), + Padding( + padding: const EdgeInsets.all(16.0), + child: Text( + L10n.of(context).noUsersFoundWithQuery( + controller.controller.text, + ), + style: TextStyle( + color: theme.colorScheme.primary, + ), + textAlign: TextAlign.center, + ), + ), + ], + ); + } + return ListView.builder( + itemCount: result.length, + itemBuilder: (context, i) { + final contact = result[i]; + final displayname = contact.displayName ?? + contact.userId.localpart ?? + contact.userId; + return ListTile( + leading: Avatar( + name: displayname, + mxContent: contact.avatarUrl, + presenceUserId: contact.userId, + ), + title: Text(displayname), + subtitle: Text(contact.userId), + onTap: () => controller.openUserModal(contact), + ); + }, + ); + }, + ), + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/pages/new_private_chat/qr_scanner_modal.dart b/lib/pages/new_private_chat/qr_scanner_modal.dart new file mode 100644 index 0000000..440b7bd --- /dev/null +++ b/lib/pages/new_private_chat/qr_scanner_modal.dart @@ -0,0 +1,75 @@ +import 'dart:async'; +import 'dart:io'; + +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:qr_code_scanner_plus/qr_code_scanner_plus.dart'; + +class QrScannerModal extends StatefulWidget { + final void Function(String) onScan; + const QrScannerModal({required this.onScan, super.key}); + + @override + QrScannerModalState createState() => QrScannerModalState(); +} + +class QrScannerModalState extends State { + final GlobalKey qrKey = GlobalKey(debugLabel: 'QR'); + QRViewController? controller; + + @override + void reassemble() { + super.reassemble(); + if (Platform.isAndroid) { + controller!.pauseCamera(); + } else if (Platform.isIOS) { + controller!.resumeCamera(); + } + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + leading: IconButton( + icon: const Icon(Icons.close_outlined), + onPressed: Navigator.of(context).pop, + tooltip: L10n.of(context).close, + ), + title: Text(L10n.of(context).scanQrCode), + ), + body: Stack( + children: [ + QRView( + key: qrKey, + onQRViewCreated: _onQRViewCreated, + overlay: QrScannerOverlayShape( + borderColor: Theme.of(context).colorScheme.primary, + borderRadius: 10, + borderLength: 30, + borderWidth: 8, + ), + ), + ], + ), + ); + } + + void _onQRViewCreated(QRViewController controller) { + this.controller = controller; + // Workaround for QR Scanner is started in Pause mode + // https://github.com/juliuscanute/qr_code_scanner/issues/538#issuecomment-1133883828 + if (Platform.isAndroid) { + controller.pauseCamera(); + } + controller.resumeCamera(); + late StreamSubscription sub; + sub = controller.scannedDataStream.listen((scanData) { + sub.cancel(); + Navigator.of(context).pop(); + final data = scanData.code; + if (data != null) widget.onScan(data); + }); + } +} diff --git a/lib/pages/settings/settings.dart b/lib/pages/settings/settings.dart new file mode 100644 index 0000000..8e1cf14 --- /dev/null +++ b/lib/pages/settings/settings.dart @@ -0,0 +1,212 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; + +import 'package:collection/collection.dart'; +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:image_picker/image_picker.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/utils/file_selector.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_modal_action_popup.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_text_input_dialog.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import '../../widgets/matrix.dart'; +import '../bootstrap/bootstrap_dialog.dart'; +import 'settings_view.dart'; + +class Settings extends StatefulWidget { + const Settings({super.key}); + + @override + SettingsController createState() => SettingsController(); +} + +class SettingsController extends State { + Future? profileFuture; + bool profileUpdated = false; + + void updateProfile() => setState(() { + profileUpdated = true; + profileFuture = null; + }); + + void setDisplaynameAction() async { + final profile = await profileFuture; + final input = await showTextInputDialog( + useRootNavigator: false, + context: context, + title: L10n.of(context).editDisplayname, + okLabel: L10n.of(context).ok, + cancelLabel: L10n.of(context).cancel, + initialText: + profile?.displayName ?? Matrix.of(context).client.userID!.localpart, + ); + if (input == null) return; + final matrix = Matrix.of(context); + final success = await showFutureLoadingDialog( + context: context, + future: () => matrix.client.setDisplayName(matrix.client.userID!, input), + ); + if (success.error == null) { + updateProfile(); + } + } + + void logoutAction() async { + final noBackup = showChatBackupBanner == true; + if (await showOkCancelAlertDialog( + useRootNavigator: false, + context: context, + title: L10n.of(context).areYouSureYouWantToLogout, + message: L10n.of(context).noBackupWarning, + isDestructive: noBackup, + okLabel: L10n.of(context).logout, + cancelLabel: L10n.of(context).cancel, + ) == + OkCancelResult.cancel) { + return; + } + final matrix = Matrix.of(context); + await showFutureLoadingDialog( + context: context, + future: () => matrix.client.logout(), + ); + } + + void setAvatarAction() async { + final profile = await profileFuture; + final actions = [ + if (PlatformInfos.isMobile) + AdaptiveModalAction( + value: AvatarAction.camera, + label: L10n.of(context).openCamera, + isDefaultAction: true, + icon: const Icon(Icons.camera_alt_outlined), + ), + AdaptiveModalAction( + value: AvatarAction.file, + label: L10n.of(context).openGallery, + icon: const Icon(Icons.photo_outlined), + ), + if (profile?.avatarUrl != null) + AdaptiveModalAction( + value: AvatarAction.remove, + label: L10n.of(context).removeYourAvatar, + isDestructive: true, + icon: const Icon(Icons.delete_outlined), + ), + ]; + final action = actions.length == 1 + ? actions.single.value + : await showModalActionPopup( + context: context, + title: L10n.of(context).changeYourAvatar, + cancelLabel: L10n.of(context).cancel, + actions: actions, + ); + if (action == null) return; + final matrix = Matrix.of(context); + if (action == AvatarAction.remove) { + final success = await showFutureLoadingDialog( + context: context, + future: () => matrix.client.setAvatar(null), + ); + if (success.error == null) { + updateProfile(); + } + return; + } + MatrixFile file; + if (PlatformInfos.isMobile) { + final result = await ImagePicker().pickImage( + source: action == AvatarAction.camera + ? ImageSource.camera + : ImageSource.gallery, + imageQuality: 50, + ); + if (result == null) return; + file = MatrixFile( + bytes: await result.readAsBytes(), + name: result.path, + ); + } else { + final result = await selectFiles( + context, + type: FileSelectorType.images, + ); + final pickedFile = result.firstOrNull; + if (pickedFile == null) return; + file = MatrixFile( + bytes: await pickedFile.readAsBytes(), + name: pickedFile.name, + ); + } + final success = await showFutureLoadingDialog( + context: context, + future: () => matrix.client.setAvatar(file), + ); + if (success.error == null) { + updateProfile(); + } + } + + @override + void initState() { + WidgetsBinding.instance.addPostFrameCallback((_) => checkBootstrap()); + + super.initState(); + } + + void checkBootstrap() async { + final client = Matrix.of(context).client; + if (!client.encryptionEnabled) return; + await client.accountDataLoading; + await client.userDeviceKeysLoading; + if (client.prevBatch == null) { + await client.onSync.stream.first; + } + final crossSigning = + await client.encryption?.crossSigning.isCached() ?? false; + final needsBootstrap = + await client.encryption?.keyManager.isCached() == false || + client.encryption?.crossSigning.enabled == false || + crossSigning == false; + final isUnknownSession = client.isUnknownSession; + setState(() { + showChatBackupBanner = needsBootstrap || isUnknownSession; + }); + } + + bool? crossSigningCached; + bool? showChatBackupBanner; + + void firstRunBootstrapAction([_]) async { + if (showChatBackupBanner != true) { + showOkAlertDialog( + context: context, + title: L10n.of(context).chatBackup, + message: L10n.of(context).onlineKeyBackupEnabled, + okLabel: L10n.of(context).close, + ); + return; + } + await BootstrapDialog( + client: Matrix.of(context).client, + ).show(context); + checkBootstrap(); + } + + @override + Widget build(BuildContext context) { + final client = Matrix.of(context).client; + profileFuture ??= client.getProfileFromUserId( + client.userID!, + ); + return SettingsView(this); + } +} + +enum AvatarAction { camera, file, remove } diff --git a/lib/pages/settings/settings_view.dart b/lib/pages/settings/settings_view.dart new file mode 100644 index 0000000..1cfe37a --- /dev/null +++ b/lib/pages/settings/settings_view.dart @@ -0,0 +1,268 @@ +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart'; +import 'package:url_launcher/url_launcher_string.dart'; + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/utils/fluffy_share.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/widgets/avatar.dart'; +import 'package:fluffychat/widgets/matrix.dart'; +import 'package:fluffychat/widgets/navigation_rail.dart'; +import '../../widgets/mxc_image_viewer.dart'; +import 'settings.dart'; + +class SettingsView extends StatelessWidget { + final SettingsController controller; + + const SettingsView(this.controller, {super.key}); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + final showChatBackupBanner = controller.showChatBackupBanner; + final activeRoute = + GoRouter.of(context).routeInformationProvider.value.uri.path; + final accountManageUrl = Matrix.of(context) + .client + .wellKnown + ?.additionalProperties + .tryGetMap('org.matrix.msc2965.authentication') + ?.tryGet('account'); + return Row( + children: [ + if (FluffyThemes.isColumnMode(context)) ...[ + SpacesNavigationRail( + activeSpaceId: null, + onGoToChats: () => context.go('/rooms'), + onGoToSpaceId: (spaceId) => context.go('/rooms?spaceId=$spaceId'), + ), + Container( + color: Theme.of(context).dividerColor, + width: 1, + ), + ], + Expanded( + child: Scaffold( + appBar: FluffyThemes.isColumnMode(context) + ? null + : AppBar( + title: Text(L10n.of(context).settings), + leading: Center( + child: BackButton( + onPressed: () => context.go('/rooms'), + ), + ), + ), + body: ListTileTheme( + iconColor: theme.colorScheme.onSurface, + child: ListView( + key: const Key('SettingsListViewContent'), + children: [ + FutureBuilder( + future: controller.profileFuture, + builder: (context, snapshot) { + final profile = snapshot.data; + final avatar = profile?.avatarUrl; + final mxid = Matrix.of(context).client.userID ?? + L10n.of(context).user; + final displayname = + profile?.displayName ?? mxid.localpart ?? mxid; + return Row( + children: [ + Padding( + padding: const EdgeInsets.all(32.0), + child: Stack( + children: [ + Avatar( + mxContent: avatar, + name: displayname, + size: Avatar.defaultSize * 2.5, + onTap: avatar != null + ? () => showDialog( + context: context, + builder: (_) => + MxcImageViewer(avatar), + ) + : null, + ), + if (profile != null) + Positioned( + bottom: 0, + right: 0, + child: FloatingActionButton.small( + elevation: 2, + onPressed: controller.setAvatarAction, + heroTag: null, + child: const Icon( + Icons.camera_alt_outlined, + ), + ), + ), + ], + ), + ), + Expanded( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + TextButton.icon( + onPressed: controller.setDisplaynameAction, + icon: const Icon( + Icons.edit_outlined, + size: 16, + ), + style: TextButton.styleFrom( + foregroundColor: + theme.colorScheme.onSurface, + iconColor: theme.colorScheme.onSurface, + ), + label: Text( + displayname, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: const TextStyle( + fontSize: 18, + ), + ), + ), + TextButton.icon( + onPressed: () => + FluffyShare.share(mxid, context), + icon: const Icon( + Icons.copy_outlined, + size: 14, + ), + style: TextButton.styleFrom( + foregroundColor: + theme.colorScheme.secondary, + iconColor: theme.colorScheme.secondary, + ), + label: Text( + mxid, + maxLines: 1, + overflow: TextOverflow.ellipsis, + // style: const TextStyle(fontSize: 12), + ), + ), + ], + ), + ), + ], + ); + }, + ), + if (accountManageUrl != null) + ListTile( + leading: const Icon(Icons.account_circle_outlined), + title: Text(L10n.of(context).manageAccount), + trailing: const Icon(Icons.open_in_new_outlined), + onTap: () => launchUrlString( + accountManageUrl, + mode: LaunchMode.inAppBrowserView, + ), + ), + Divider(color: theme.dividerColor), + if (showChatBackupBanner == null) + ListTile( + leading: const Icon(Icons.backup_outlined), + title: Text(L10n.of(context).chatBackup), + trailing: const CircularProgressIndicator.adaptive(), + ) + else + SwitchListTile.adaptive( + controlAffinity: ListTileControlAffinity.trailing, + value: controller.showChatBackupBanner == false, + secondary: const Icon(Icons.backup_outlined), + title: Text(L10n.of(context).chatBackup), + onChanged: controller.firstRunBootstrapAction, + ), + Divider( + color: theme.dividerColor, + ), + ListTile( + leading: const Icon(Icons.format_paint_outlined), + title: Text(L10n.of(context).changeTheme), + tileColor: activeRoute.startsWith('/rooms/settings/style') + ? theme.colorScheme.surfaceContainerHigh + : null, + onTap: () => context.go('/rooms/settings/style'), + ), + ListTile( + leading: const Icon(Icons.notifications_outlined), + title: Text(L10n.of(context).notifications), + tileColor: + activeRoute.startsWith('/rooms/settings/notifications') + ? theme.colorScheme.surfaceContainerHigh + : null, + onTap: () => context.go('/rooms/settings/notifications'), + ), + ListTile( + leading: const Icon(Icons.devices_outlined), + title: Text(L10n.of(context).devices), + onTap: () => context.go('/rooms/settings/devices'), + tileColor: activeRoute.startsWith('/rooms/settings/devices') + ? theme.colorScheme.surfaceContainerHigh + : null, + ), + ListTile( + leading: const Icon(Icons.forum_outlined), + title: Text(L10n.of(context).chat), + onTap: () => context.go('/rooms/settings/chat'), + tileColor: activeRoute.startsWith('/rooms/settings/chat') + ? theme.colorScheme.surfaceContainerHigh + : null, + ), + ListTile( + leading: const Icon(Icons.shield_outlined), + title: Text(L10n.of(context).security), + onTap: () => context.go('/rooms/settings/security'), + tileColor: + activeRoute.startsWith('/rooms/settings/security') + ? theme.colorScheme.surfaceContainerHigh + : null, + ), + Divider(color: theme.dividerColor), + ListTile( + leading: const Icon(Icons.dns_outlined), + title: Text( + L10n.of(context).aboutHomeserver( + Matrix.of(context).client.userID?.domain ?? + 'homeserver', + ), + ), + onTap: () => context.go('/rooms/settings/homeserver'), + tileColor: + activeRoute.startsWith('/rooms/settings/homeserver') + ? theme.colorScheme.surfaceContainerHigh + : null, + ), + ListTile( + leading: const Icon(Icons.privacy_tip_outlined), + title: Text(L10n.of(context).privacy), + onTap: () => launchUrlString(AppConfig.privacyUrl), + ), + ListTile( + leading: const Icon(Icons.info_outline_rounded), + title: Text(L10n.of(context).about), + onTap: () => PlatformInfos.showDialog(context), + ), + Divider(color: theme.dividerColor), + ListTile( + leading: const Icon(Icons.logout_outlined), + title: Text(L10n.of(context).logout), + onTap: controller.logoutAction, + ), + ], + ), + ), + ), + ), + ], + ); + } +} diff --git a/lib/pages/settings_3pid/settings_3pid.dart b/lib/pages/settings_3pid/settings_3pid.dart new file mode 100644 index 0000000..a7297b1 --- /dev/null +++ b/lib/pages/settings_3pid/settings_3pid.dart @@ -0,0 +1,92 @@ +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_text_input_dialog.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import 'package:fluffychat/widgets/matrix.dart'; +import 'settings_3pid_view.dart'; + +class Settings3Pid extends StatefulWidget { + static int sendAttempt = 0; + + const Settings3Pid({super.key}); + + @override + Settings3PidController createState() => Settings3PidController(); +} + +class Settings3PidController extends State { + void add3PidAction() async { + final input = await showTextInputDialog( + useRootNavigator: false, + context: context, + title: L10n.of(context).enterAnEmailAddress, + okLabel: L10n.of(context).ok, + cancelLabel: L10n.of(context).cancel, + hintText: L10n.of(context).enterAnEmailAddress, + keyboardType: TextInputType.emailAddress, + ); + if (input == null) return; + final clientSecret = DateTime.now().millisecondsSinceEpoch.toString(); + final response = await showFutureLoadingDialog( + context: context, + future: () => Matrix.of(context).client.requestTokenToRegisterEmail( + clientSecret, + input, + Settings3Pid.sendAttempt++, + ), + ); + if (response.error != null) return; + final ok = await showOkAlertDialog( + useRootNavigator: false, + context: context, + title: L10n.of(context).weSentYouAnEmail, + message: L10n.of(context).pleaseClickOnLink, + okLabel: L10n.of(context).iHaveClickedOnLink, + ); + if (ok != OkCancelResult.ok) return; + final success = await showFutureLoadingDialog( + context: context, + delay: false, + future: () => Matrix.of(context).client.uiaRequestBackground( + (auth) => Matrix.of(context).client.add3PID( + clientSecret, + response.result!.sid, + auth: auth, + ), + ), + ); + if (success.error != null) return; + setState(() => request = null); + } + + Future?>? request; + + void delete3Pid(ThirdPartyIdentifier identifier) async { + if (await showOkCancelAlertDialog( + useRootNavigator: false, + context: context, + title: L10n.of(context).areYouSure, + okLabel: L10n.of(context).yes, + cancelLabel: L10n.of(context).cancel, + ) != + OkCancelResult.ok) { + return; + } + final success = await showFutureLoadingDialog( + context: context, + future: () => Matrix.of(context).client.delete3pidFromAccount( + identifier.address, + identifier.medium, + ), + ); + if (success.error != null) return; + setState(() => request = null); + } + + @override + Widget build(BuildContext context) => Settings3PidView(this); +} diff --git a/lib/pages/settings_3pid/settings_3pid_view.dart b/lib/pages/settings_3pid/settings_3pid_view.dart new file mode 100644 index 0000000..344420e --- /dev/null +++ b/lib/pages/settings_3pid/settings_3pid_view.dart @@ -0,0 +1,112 @@ +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/pages/settings_3pid/settings_3pid.dart'; +import 'package:fluffychat/widgets/layouts/max_width_body.dart'; +import 'package:fluffychat/widgets/matrix.dart'; + +class Settings3PidView extends StatelessWidget { + final Settings3PidController controller; + + const Settings3PidView(this.controller, {super.key}); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + controller.request ??= Matrix.of(context).client.getAccount3PIDs(); + return Scaffold( + appBar: AppBar( + leading: const Center(child: BackButton()), + title: Text(L10n.of(context).passwordRecovery), + actions: [ + IconButton( + icon: const Icon(Icons.add_outlined), + onPressed: controller.add3PidAction, + tooltip: L10n.of(context).addEmail, + ), + ], + ), + body: MaxWidthBody( + withScrolling: false, + child: FutureBuilder?>( + future: controller.request, + builder: ( + BuildContext context, + AsyncSnapshot?> snapshot, + ) { + if (snapshot.hasError) { + return Center( + child: Text( + snapshot.error.toString(), + textAlign: TextAlign.center, + ), + ); + } + if (!snapshot.hasData) { + return const Center( + child: CircularProgressIndicator.adaptive(strokeWidth: 2), + ); + } + final identifier = snapshot.data!; + return Column( + children: [ + ListTile( + leading: CircleAvatar( + backgroundColor: theme.scaffoldBackgroundColor, + foregroundColor: + identifier.isEmpty ? Colors.orange : Colors.grey, + child: Icon( + identifier.isEmpty + ? Icons.warning_outlined + : Icons.info_outlined, + ), + ), + title: Text( + identifier.isEmpty + ? L10n.of(context).noPasswordRecoveryDescription + : L10n.of(context) + .withTheseAddressesRecoveryDescription, + ), + ), + const Divider(), + Expanded( + child: ListView.builder( + itemCount: identifier.length, + itemBuilder: (BuildContext context, int i) => ListTile( + leading: CircleAvatar( + backgroundColor: theme.scaffoldBackgroundColor, + foregroundColor: Colors.grey, + child: Icon(identifier[i].iconData), + ), + title: Text(identifier[i].address), + trailing: IconButton( + tooltip: L10n.of(context).delete, + icon: const Icon(Icons.delete_forever_outlined), + color: Colors.red, + onPressed: () => controller.delete3Pid(identifier[i]), + ), + ), + ), + ), + ], + ); + }, + ), + ), + ); + } +} + +extension on ThirdPartyIdentifier { + IconData get iconData { + switch (medium) { + case ThirdPartyIdentifierMedium.email: + return Icons.mail_outline_rounded; + case ThirdPartyIdentifierMedium.msisdn: + return Icons.phone_android_outlined; + } + } +} diff --git a/lib/pages/settings_chat/settings_chat.dart b/lib/pages/settings_chat/settings_chat.dart new file mode 100644 index 0000000..1c10355 --- /dev/null +++ b/lib/pages/settings_chat/settings_chat.dart @@ -0,0 +1,15 @@ +import 'package:flutter/material.dart'; + +import 'settings_chat_view.dart'; + +class SettingsChat extends StatefulWidget { + const SettingsChat({super.key}); + + @override + SettingsChatController createState() => SettingsChatController(); +} + +class SettingsChatController extends State { + @override + Widget build(BuildContext context) => SettingsChatView(this); +} diff --git a/lib/pages/settings_chat/settings_chat_view.dart b/lib/pages/settings_chat/settings_chat_view.dart new file mode 100644 index 0000000..b402a4e --- /dev/null +++ b/lib/pages/settings_chat/settings_chat_view.dart @@ -0,0 +1,125 @@ +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:go_router/go_router.dart'; + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/config/setting_keys.dart'; +import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/widgets/layouts/max_width_body.dart'; +import 'package:fluffychat/widgets/matrix.dart'; +import 'package:fluffychat/widgets/settings_switch_list_tile.dart'; +import 'settings_chat.dart'; + +class SettingsChatView extends StatelessWidget { + final SettingsChatController controller; + const SettingsChatView(this.controller, {super.key}); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + return Scaffold( + appBar: AppBar( + title: Text(L10n.of(context).chat), + automaticallyImplyLeading: !FluffyThemes.isColumnMode(context), + centerTitle: FluffyThemes.isColumnMode(context), + ), + body: ListTileTheme( + iconColor: theme.textTheme.bodyLarge!.color, + child: MaxWidthBody( + child: Column( + children: [ + SettingsSwitchListTile.adaptive( + title: L10n.of(context).formattedMessages, + subtitle: L10n.of(context).formattedMessagesDescription, + onChanged: (b) => AppConfig.renderHtml = b, + storeKey: SettingKeys.renderHtml, + defaultValue: AppConfig.renderHtml, + ), + SettingsSwitchListTile.adaptive( + title: L10n.of(context).hideMemberChangesInPublicChats, + subtitle: L10n.of(context).hideMemberChangesInPublicChatsBody, + onChanged: (b) => AppConfig.hideUnimportantStateEvents = b, + storeKey: SettingKeys.hideUnimportantStateEvents, + defaultValue: AppConfig.hideUnimportantStateEvents, + ), + SettingsSwitchListTile.adaptive( + title: L10n.of(context).hideRedactedMessages, + subtitle: L10n.of(context).hideRedactedMessagesBody, + onChanged: (b) => AppConfig.hideRedactedEvents = b, + storeKey: SettingKeys.hideRedactedEvents, + defaultValue: AppConfig.hideRedactedEvents, + ), + SettingsSwitchListTile.adaptive( + title: L10n.of(context).hideInvalidOrUnknownMessageFormats, + onChanged: (b) => AppConfig.hideUnknownEvents = b, + storeKey: SettingKeys.hideUnknownEvents, + defaultValue: AppConfig.hideUnknownEvents, + ), + if (PlatformInfos.isMobile) + SettingsSwitchListTile.adaptive( + title: L10n.of(context).autoplayImages, + onChanged: (b) => AppConfig.autoplayImages = b, + storeKey: SettingKeys.autoplayImages, + defaultValue: AppConfig.autoplayImages, + ), + SettingsSwitchListTile.adaptive( + title: L10n.of(context).sendOnEnter, + onChanged: (b) => AppConfig.sendOnEnter = b, + storeKey: SettingKeys.sendOnEnter, + defaultValue: AppConfig.sendOnEnter ?? !PlatformInfos.isMobile, + ), + SettingsSwitchListTile.adaptive( + title: L10n.of(context).swipeRightToLeftToReply, + onChanged: (b) => AppConfig.swipeRightToLeftToReply = b, + storeKey: SettingKeys.swipeRightToLeftToReply, + defaultValue: AppConfig.swipeRightToLeftToReply, + ), + Divider(color: theme.dividerColor), + ListTile( + title: Text( + L10n.of(context).customEmojisAndStickers, + style: TextStyle( + color: theme.colorScheme.secondary, + fontWeight: FontWeight.bold, + ), + ), + ), + ListTile( + title: Text(L10n.of(context).customEmojisAndStickers), + subtitle: Text(L10n.of(context).customEmojisAndStickersBody), + onTap: () => context.go('/rooms/settings/chat/emotes'), + trailing: const Padding( + padding: EdgeInsets.all(16.0), + child: Icon(Icons.chevron_right_outlined), + ), + ), + Divider(color: theme.dividerColor), + ListTile( + title: Text( + L10n.of(context).calls, + style: TextStyle( + color: theme.colorScheme.secondary, + fontWeight: FontWeight.bold, + ), + ), + ), + SettingsSwitchListTile.adaptive( + title: L10n.of(context).experimentalVideoCalls, + onChanged: (b) { + AppConfig.experimentalVoip = b; + Matrix.of(context).createVoipPlugin(); + return; + }, + storeKey: SettingKeys.experimentalVoip, + defaultValue: AppConfig.experimentalVoip, + ), + ], + ), + ), + ), + ); + } +} diff --git a/lib/pages/settings_emotes/import_archive_dialog.dart b/lib/pages/settings_emotes/import_archive_dialog.dart new file mode 100644 index 0000000..0ac1b94 --- /dev/null +++ b/lib/pages/settings_emotes/import_archive_dialog.dart @@ -0,0 +1,360 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +import 'package:archive/archive.dart'; +import 'package:collection/collection.dart'; +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/pages/settings_emotes/settings_emotes.dart'; +import 'package:fluffychat/utils/client_manager.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; +import 'package:fluffychat/widgets/matrix.dart'; + +class ImportEmoteArchiveDialog extends StatefulWidget { + final EmotesSettingsController controller; + final Archive archive; + + const ImportEmoteArchiveDialog({ + super.key, + required this.controller, + required this.archive, + }); + + @override + State createState() => + _ImportEmoteArchiveDialogState(); +} + +class _ImportEmoteArchiveDialogState extends State { + Map _importMap = {}; + + bool _loading = false; + + double _progress = 0; + + @override + void initState() { + _importFileMap(); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return AlertDialog( + title: Text(L10n.of(context).importEmojis), + content: _loading + ? Center( + child: CircularProgressIndicator( + value: _progress, + ), + ) + : SingleChildScrollView( + child: Wrap( + alignment: WrapAlignment.spaceEvenly, + crossAxisAlignment: WrapCrossAlignment.center, + runSpacing: 8, + spacing: 8, + children: _importMap.entries + .map( + (e) => _EmojiImportPreview( + key: ValueKey(e.key.name), + entry: e, + onNameChanged: (name) => _importMap[e.key] = name, + onRemove: () => + setState(() => _importMap.remove(e.key)), + ), + ) + .toList(), + ), + ), + actions: [ + TextButton( + onPressed: _loading ? null : Navigator.of(context).pop, + child: Text(L10n.of(context).cancel), + ), + TextButton( + onPressed: _loading + ? null + : _importMap.isNotEmpty + ? _addEmotePack + : null, + child: Text(L10n.of(context).importNow), + ), + ], + ); + } + + void _importFileMap() { + _importMap = Map.fromEntries( + widget.archive.files + .where((e) => e.isFile) + .map( + (e) => MapEntry(e, e.name.emoteNameFromPath), + ) + .sorted( + (a, b) => a.value.compareTo(b.value), + ), + ); + } + + Future _addEmotePack() async { + setState(() { + _loading = true; + _progress = 0; + }); + final imports = _importMap; + final successfulUploads = {}; + + // check for duplicates first + + final skipKeys = []; + + for (final entry in imports.entries) { + final imageCode = entry.value; + + if (widget.controller.pack!.images.containsKey(imageCode)) { + final completer = Completer(); + WidgetsBinding.instance.addPostFrameCallback((timeStamp) async { + final result = await showOkCancelAlertDialog( + useRootNavigator: false, + context: context, + title: L10n.of(context).emoteExists, + message: imageCode, + cancelLabel: L10n.of(context).replace, + okLabel: L10n.of(context).skip, + ); + completer.complete(result); + }); + + final result = await completer.future; + if (result == OkCancelResult.ok) { + skipKeys.add(entry.key); + } + } + } + + for (final key in skipKeys) { + imports.remove(key); + } + + for (final entry in imports.entries) { + setState(() { + _progress += 1 / imports.length; + }); + final file = entry.key; + final imageCode = entry.value; + + try { + var mxcFile = MatrixImageFile( + bytes: file.content, + name: file.name, + ); + + final thumbnail = (await mxcFile.generateThumbnail( + nativeImplementations: ClientManager.nativeImplementations, + )); + if (thumbnail == null) { + Logs().w('Unable to create thumbnail'); + } else { + mxcFile = thumbnail; + } + final uri = await Matrix.of(context).client.uploadContent( + mxcFile.bytes, + filename: mxcFile.name, + contentType: mxcFile.mimeType, + ); + + final info = { + ...mxcFile.info, + }; + + // normalize width / height to 256, required for stickers + if (info['w'] is int && info['h'] is int) { + final ratio = info['w'] / info['h']; + if (info['w'] > info['h']) { + info['w'] = 256; + info['h'] = (256.0 / ratio).round(); + } else { + info['h'] = 256; + info['w'] = (ratio * 256.0).round(); + } + } + widget.controller.pack!.images[imageCode] = + ImagePackImageContent.fromJson({ + 'url': uri.toString(), + 'info': info, + }); + successfulUploads.add(file.name); + } catch (e) { + Logs().d('Could not upload emote $imageCode'); + } + } + + await widget.controller.save(context); + _importMap.removeWhere( + (key, value) => successfulUploads.contains(key.name), + ); + + _loading = false; + _progress = 0; + + // in case we have unhandled / duplicated emotes left, don't pop + if (mounted) setState(() {}); + if (_importMap.isEmpty) { + WidgetsBinding.instance + .addPostFrameCallback((_) => Navigator.of(context).pop()); + } + } +} + +class _EmojiImportPreview extends StatefulWidget { + final MapEntry entry; + final ValueChanged onNameChanged; + final VoidCallback onRemove; + + const _EmojiImportPreview({ + super.key, + required this.entry, + required this.onNameChanged, + required this.onRemove, + }); + + @override + State<_EmojiImportPreview> createState() => _EmojiImportPreviewState(); +} + +class _EmojiImportPreviewState extends State<_EmojiImportPreview> { + final hasErrorNotifier = ValueNotifier(false); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + // TODO: support Lottie here as well ... + final controller = TextEditingController(text: widget.entry.value); + + return Stack( + alignment: Alignment.topRight, + children: [ + IconButton( + onPressed: widget.onRemove, + icon: const Icon(Icons.remove_circle), + tooltip: L10n.of(context).remove, + ), + ValueListenableBuilder( + valueListenable: hasErrorNotifier, + builder: (context, hasError, child) { + if (hasError) return _ImageFileError(name: widget.entry.key.name); + + return Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Image.memory( + widget.entry.key.content, + height: 64, + width: 64, + errorBuilder: (context, e, s) { + WidgetsBinding.instance + .addPostFrameCallback((_) => _setRenderError()); + + return _ImageFileError( + name: widget.entry.key.name, + ); + }, + ), + SizedBox( + width: 128, + child: TextField( + controller: controller, + inputFormatters: [ + FilteringTextInputFormatter.allow(RegExp(r'^[-\w]+$')), + ], + autocorrect: false, + minLines: 1, + maxLines: 1, + decoration: InputDecoration( + hintText: L10n.of(context).emoteShortcode, + prefixText: ': ', + suffixText: ':', + border: const OutlineInputBorder(), + prefixStyle: TextStyle( + color: theme.colorScheme.secondary, + fontWeight: FontWeight.bold, + ), + suffixStyle: TextStyle( + color: theme.colorScheme.secondary, + fontWeight: FontWeight.bold, + ), + ), + onChanged: widget.onNameChanged, + onSubmitted: widget.onNameChanged, + ), + ), + ], + ); + }, + ), + ], + ); + } + + _setRenderError() { + hasErrorNotifier.value = true; + widget.onRemove.call(); + } +} + +class _ImageFileError extends StatelessWidget { + final String name; + + const _ImageFileError({required this.name}); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + return SizedBox.square( + dimension: 64, + child: Tooltip( + message: name, + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + const Icon(Icons.error), + Text( + L10n.of(context).notAnImage, + textAlign: TextAlign.center, + style: theme.textTheme.labelSmall, + ), + ], + ), + ), + ); + } +} + +extension on String { + /// normalizes a file path into its name only replacing any special character + /// [^-\w] with an underscore and removing the extension + /// + /// Used to compute emote name proposal based on file name + String get emoteNameFromPath { + // ... removing leading path + return split(RegExp(r'[/\\]')) + .last + // ... removing file extension + .split('.') + .first + // ... lowering + .toLowerCase() + // ... replacing unexpected characters + .replaceAll(RegExp(r'[^-\w]'), '_'); + } +} diff --git a/lib/pages/settings_emotes/settings_emotes.dart b/lib/pages/settings_emotes/settings_emotes.dart new file mode 100644 index 0000000..62a5d3b --- /dev/null +++ b/lib/pages/settings_emotes/settings_emotes.dart @@ -0,0 +1,350 @@ +import 'dart:async'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; + +import 'package:collection/collection.dart'; +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:go_router/go_router.dart'; +import 'package:http/http.dart' hide Client; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/utils/client_manager.dart'; +import 'package:fluffychat/utils/file_selector.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_file_extension.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import '../../widgets/matrix.dart'; +import 'import_archive_dialog.dart'; +import 'settings_emotes_view.dart'; + +import 'package:archive/archive.dart' + if (dart.library.io) 'package:archive/archive_io.dart'; + +class EmotesSettings extends StatefulWidget { + const EmotesSettings({super.key}); + + @override + EmotesSettingsController createState() => EmotesSettingsController(); +} + +class EmotesSettingsController extends State { + String? get roomId => GoRouterState.of(context).pathParameters['roomid']; + + Room? get room => + roomId != null ? Matrix.of(context).client.getRoomById(roomId!) : null; + + String? get stateKey => GoRouterState.of(context).pathParameters['state_key']; + + bool showSave = false; + TextEditingController newImageCodeController = TextEditingController(); + ValueNotifier newImageController = + ValueNotifier(null); + + ImagePackContent _getPack() { + final client = Matrix.of(context).client; + final event = (room != null + ? room!.getState('im.ponies.room_emotes', stateKey ?? '') + : client.accountData['im.ponies.user_emotes']) ?? + BasicEvent( + type: 'm.dummy', + content: {}, + ); + // make sure we work on a *copy* of the event + return BasicEvent.fromJson(event.toJson()).parsedImagePackContent; + } + + ImagePackContent? _pack; + + ImagePackContent? get pack { + if (_pack != null) { + return _pack; + } + _pack = _getPack(); + return _pack; + } + + Future save(BuildContext context) async { + if (readonly) { + return; + } + final client = Matrix.of(context).client; + if (room != null) { + await showFutureLoadingDialog( + context: context, + future: () => client.setRoomStateWithKey( + room!.id, + 'im.ponies.room_emotes', + stateKey ?? '', + pack!.toJson(), + ), + ); + } else { + await showFutureLoadingDialog( + context: context, + future: () => client.setAccountData( + client.userID!, + 'im.ponies.user_emotes', + pack!.toJson(), + ), + ); + } + } + + Future setIsGloballyActive(bool active) async { + if (room == null) { + return; + } + final client = Matrix.of(context).client; + final content = client.accountData['im.ponies.emote_rooms']?.content ?? + {}; + if (active) { + if (content['rooms'] is! Map) { + content['rooms'] = {}; + } + if (content['rooms'][room!.id] is! Map) { + content['rooms'][room!.id] = {}; + } + if (content['rooms'][room!.id][stateKey ?? ''] is! Map) { + content['rooms'][room!.id][stateKey ?? ''] = {}; + } + } else if (content['rooms'] is Map && content['rooms'][room!.id] is Map) { + content['rooms'][room!.id].remove(stateKey ?? ''); + } + // and save + await showFutureLoadingDialog( + context: context, + future: () => client.setAccountData( + client.userID!, + 'im.ponies.emote_rooms', + content, + ), + ); + setState(() {}); + } + + void removeImageAction(String oldImageCode) => setState(() { + pack!.images.remove(oldImageCode); + showSave = true; + }); + + void submitImageAction( + String oldImageCode, + String imageCode, + ImagePackImageContent image, + TextEditingController controller, + ) { + if (pack!.images.keys.any((k) => k == imageCode && k != oldImageCode)) { + controller.text = oldImageCode; + showOkAlertDialog( + useRootNavigator: false, + context: context, + title: L10n.of(context).emoteExists, + okLabel: L10n.of(context).ok, + ); + return; + } + if (!RegExp(r'^[-\w]+$').hasMatch(imageCode)) { + controller.text = oldImageCode; + showOkAlertDialog( + useRootNavigator: false, + context: context, + title: L10n.of(context).emoteInvalid, + okLabel: L10n.of(context).ok, + ); + return; + } + setState(() { + pack!.images[imageCode] = image; + pack!.images.remove(oldImageCode); + showSave = true; + }); + } + + bool isGloballyActive(Client? client) => + room != null && + client!.accountData['im.ponies.emote_rooms']?.content + .tryGetMap('rooms') + ?.tryGetMap(room!.id) + ?.tryGetMap(stateKey ?? '') != + null; + + bool get readonly => + room == null ? false : !(room!.canSendEvent('im.ponies.room_emotes')); + + void saveAction() async { + await save(context); + setState(() { + showSave = false; + }); + } + + void addImageAction() async { + if (newImageCodeController.text.isEmpty || + newImageController.value == null) { + await showOkAlertDialog( + useRootNavigator: false, + context: context, + title: L10n.of(context).emoteWarnNeedToPick, + okLabel: L10n.of(context).ok, + ); + return; + } + final imageCode = newImageCodeController.text; + if (pack!.images.containsKey(imageCode)) { + await showOkAlertDialog( + useRootNavigator: false, + context: context, + title: L10n.of(context).emoteExists, + okLabel: L10n.of(context).ok, + ); + return; + } + if (!RegExp(r'^[-\w]+$').hasMatch(imageCode)) { + await showOkAlertDialog( + useRootNavigator: false, + context: context, + title: L10n.of(context).emoteInvalid, + okLabel: L10n.of(context).ok, + ); + return; + } + pack!.images[imageCode] = newImageController.value!; + await save(context); + setState(() { + newImageCodeController.text = ''; + newImageController.value = null; + showSave = false; + }); + } + + void imagePickerAction( + ValueNotifier controller, + ) async { + final result = await selectFiles( + context, + type: FileSelectorType.images, + ); + final pickedFile = result.firstOrNull; + if (pickedFile == null) return; + var file = MatrixImageFile( + bytes: await pickedFile.readAsBytes(), + name: pickedFile.name, + ); + try { + file = (await file.generateThumbnail( + nativeImplementations: ClientManager.nativeImplementations, + ))!; + } catch (e, s) { + Logs().w('Unable to create thumbnail', e, s); + } + final uploadResp = await showFutureLoadingDialog( + context: context, + future: () => Matrix.of(context).client.uploadContent( + file.bytes, + filename: file.name, + contentType: file.mimeType, + ), + ); + if (uploadResp.error == null) { + setState(() { + final info = { + ...file.info, + }; + // normalize width / height to 256, required for stickers + if (info['w'] is int && info['h'] is int) { + final ratio = info['w'] / info['h']; + if (info['w'] > info['h']) { + info['w'] = 256; + info['h'] = (256.0 / ratio).round(); + } else { + info['h'] = 256; + info['w'] = (ratio * 256.0).round(); + } + } + controller.value = ImagePackImageContent.fromJson({ + 'url': uploadResp.result.toString(), + 'info': info, + }); + }); + } + } + + @override + Widget build(BuildContext context) { + return EmotesSettingsView(this); + } + + Future importEmojiZip() async { + final result = await showFutureLoadingDialog( + context: context, + future: () async { + final result = await selectFiles( + context, + type: FileSelectorType.zip, + ); + + if (result.isEmpty) return null; + + final buffer = InputStream(await result.first.readAsBytes()); + + final archive = ZipDecoder().decodeBuffer(buffer); + + return archive; + }, + ); + + final archive = result.result; + if (archive == null) return; + + await showDialog( + context: context, + // breaks [Matrix.of] calls otherwise + useRootNavigator: false, + builder: (context) => ImportEmoteArchiveDialog( + controller: this, + archive: archive, + ), + ); + setState(() {}); + } + + Future exportAsZip() async { + final client = Matrix.of(context).client; + + await showFutureLoadingDialog( + context: context, + future: () async { + final pack = _getPack(); + final archive = Archive(); + for (final entry in pack.images.entries) { + final emote = entry.value; + final name = entry.key; + final url = await emote.url.getDownloadUri(client); + final response = await get( + url, + headers: {'authorization': 'Bearer ${client.accessToken}'}, + ); + + archive.addFile( + ArchiveFile( + name, + response.bodyBytes.length, + response.bodyBytes, + ), + ); + } + final fileName = + '${pack.pack.displayName ?? client.userID?.localpart ?? 'emotes'}.zip'; + final output = ZipEncoder().encode(archive); + + if (output == null) return; + + MatrixFile( + name: fileName, + bytes: Uint8List.fromList(output), + ).save(context); + }, + ); + } +} diff --git a/lib/pages/settings_emotes/settings_emotes_view.dart b/lib/pages/settings_emotes/settings_emotes_view.dart new file mode 100644 index 0000000..d4b4c4c --- /dev/null +++ b/lib/pages/settings_emotes/settings_emotes_view.dart @@ -0,0 +1,281 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/widgets/layouts/max_width_body.dart'; +import 'package:fluffychat/widgets/mxc_image.dart'; +import '../../widgets/matrix.dart'; +import 'settings_emotes.dart'; + +enum PopupMenuEmojiActions { import, export } + +class EmotesSettingsView extends StatelessWidget { + final EmotesSettingsController controller; + + const EmotesSettingsView(this.controller, {super.key}); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + final client = Matrix.of(context).client; + final imageKeys = controller.pack!.images.keys.toList(); + return Scaffold( + appBar: AppBar( + leading: const Center(child: BackButton()), + title: Text(L10n.of(context).customEmojisAndStickers), + actions: [ + PopupMenuButton( + onSelected: (value) { + switch (value) { + case PopupMenuEmojiActions.export: + controller.exportAsZip(); + break; + case PopupMenuEmojiActions.import: + controller.importEmojiZip(); + break; + } + }, + enabled: !controller.readonly, + itemBuilder: (context) => [ + PopupMenuItem( + value: PopupMenuEmojiActions.import, + child: Text(L10n.of(context).importFromZipFile), + ), + PopupMenuItem( + value: PopupMenuEmojiActions.export, + child: Text(L10n.of(context).exportEmotePack), + ), + ], + ), + ], + ), + floatingActionButton: controller.showSave + ? FloatingActionButton( + onPressed: controller.saveAction, + child: const Icon(Icons.save_outlined, color: Colors.white), + ) + : null, + body: MaxWidthBody( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + if (!controller.readonly) + Container( + padding: const EdgeInsets.symmetric( + vertical: 8.0, + ), + child: ListTile( + leading: Container( + width: 180.0, + height: 38, + padding: const EdgeInsets.symmetric(horizontal: 8), + decoration: BoxDecoration( + borderRadius: const BorderRadius.all(Radius.circular(10)), + color: theme.secondaryHeaderColor, + ), + child: TextField( + controller: controller.newImageCodeController, + autocorrect: false, + minLines: 1, + maxLines: 1, + decoration: InputDecoration( + hintText: L10n.of(context).emoteShortcode, + prefixText: ': ', + suffixText: ':', + prefixStyle: TextStyle( + color: theme.colorScheme.secondary, + fontWeight: FontWeight.bold, + ), + suffixStyle: TextStyle( + color: theme.colorScheme.secondary, + fontWeight: FontWeight.bold, + ), + border: InputBorder.none, + ), + ), + ), + title: _ImagePicker( + controller: controller.newImageController, + onPressed: controller.imagePickerAction, + ), + trailing: InkWell( + onTap: controller.addImageAction, + child: const Icon( + Icons.add_outlined, + color: Colors.green, + size: 32.0, + ), + ), + ), + ), + if (controller.room != null) + SwitchListTile.adaptive( + title: Text(L10n.of(context).enableEmotesGlobally), + value: controller.isGloballyActive(client), + onChanged: controller.setIsGloballyActive, + ), + if (!controller.readonly || controller.room != null) + const Divider(), + imageKeys.isEmpty + ? Center( + child: Padding( + padding: const EdgeInsets.all(16), + child: Text( + L10n.of(context).noEmotesFound, + style: const TextStyle(fontSize: 20), + ), + ), + ) + : ListView.separated( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + separatorBuilder: (BuildContext context, int i) => + const SizedBox.shrink(), + itemCount: imageKeys.length + 1, + itemBuilder: (BuildContext context, int i) { + if (i >= imageKeys.length) { + return Container(height: 70); + } + final imageCode = imageKeys[i]; + final image = controller.pack!.images[imageCode]!; + final textEditingController = TextEditingController(); + textEditingController.text = imageCode; + final useShortCuts = + (PlatformInfos.isWeb || PlatformInfos.isDesktop); + return ListTile( + leading: Container( + width: 180.0, + height: 38, + padding: const EdgeInsets.symmetric(horizontal: 8), + decoration: BoxDecoration( + borderRadius: + const BorderRadius.all(Radius.circular(10)), + color: theme.secondaryHeaderColor, + ), + child: Shortcuts( + shortcuts: !useShortCuts + ? {} + : { + LogicalKeySet(LogicalKeyboardKey.enter): + SubmitLineIntent(), + }, + child: Actions( + actions: !useShortCuts + ? {} + : { + SubmitLineIntent: CallbackAction( + onInvoke: (i) { + controller.submitImageAction( + imageCode, + textEditingController.text, + image, + textEditingController, + ); + return null; + }, + ), + }, + child: TextField( + readOnly: controller.readonly, + controller: textEditingController, + autocorrect: false, + minLines: 1, + maxLines: 1, + decoration: InputDecoration( + hintText: L10n.of(context).emoteShortcode, + prefixText: ': ', + suffixText: ':', + prefixStyle: TextStyle( + color: theme.colorScheme.secondary, + fontWeight: FontWeight.bold, + ), + suffixStyle: TextStyle( + color: theme.colorScheme.secondary, + fontWeight: FontWeight.bold, + ), + border: InputBorder.none, + ), + onSubmitted: (s) => + controller.submitImageAction( + imageCode, + s, + image, + textEditingController, + ), + ), + ), + ), + ), + title: _EmoteImage(image.url), + trailing: controller.readonly + ? null + : InkWell( + onTap: () => + controller.removeImageAction(imageCode), + child: const Icon( + Icons.delete_outlined, + color: Colors.red, + size: 32.0, + ), + ), + ); + }, + ), + ], + ), + ), + ); + } +} + +class _EmoteImage extends StatelessWidget { + final Uri mxc; + + const _EmoteImage(this.mxc); + + @override + Widget build(BuildContext context) { + const size = 38.0; + return SizedBox.square( + dimension: size, + child: MxcImage( + uri: mxc, + fit: BoxFit.contain, + width: size, + height: size, + isThumbnail: false, + ), + ); + } +} + +class _ImagePicker extends StatefulWidget { + final ValueNotifier controller; + + final void Function(ValueNotifier) onPressed; + + const _ImagePicker({required this.controller, required this.onPressed}); + + @override + _ImagePickerState createState() => _ImagePickerState(); +} + +class _ImagePickerState extends State<_ImagePicker> { + @override + Widget build(BuildContext context) { + if (widget.controller.value == null) { + return ElevatedButton( + onPressed: () => widget.onPressed(widget.controller), + child: Text(L10n.of(context).pickImage), + ); + } else { + return _EmoteImage(widget.controller.value!.url); + } + } +} + +class SubmitLineIntent extends Intent {} diff --git a/lib/pages/settings_homeserver/settings_homeserver.dart b/lib/pages/settings_homeserver/settings_homeserver.dart new file mode 100644 index 0000000..76ca082 --- /dev/null +++ b/lib/pages/settings_homeserver/settings_homeserver.dart @@ -0,0 +1,58 @@ +import 'dart:convert'; + +import 'package:flutter/material.dart'; + +import 'package:http/http.dart' as http; +import 'package:matrix/matrix.dart'; + +import '../../widgets/matrix.dart'; +import 'settings_homeserver_view.dart'; + +class SettingsHomeserver extends StatefulWidget { + const SettingsHomeserver({super.key}); + + @override + SettingsHomeserverController createState() => SettingsHomeserverController(); +} + +class SettingsHomeserverController extends State { + Future<({String name, String version, Uri federationBaseUrl})> + fetchServerInfo() async { + final client = Matrix.of(context).client; + final domain = client.userID!.domain!; + final httpClient = client.httpClient; + var federationBaseUrl = Uri(host: domain, port: 8448, scheme: 'https'); + try { + final serverWellKnownResult = await httpClient.get( + Uri.https(domain, '/.well-known/matrix/server'), + ); + final serverWellKnown = jsonDecode(serverWellKnownResult.body); + federationBaseUrl = Uri.https(serverWellKnown['m.server']); + } catch (e, s) { + Logs().w( + 'Unable to fetch federation base uri. Use $federationBaseUrl', + e, + s, + ); + } + + final serverVersionResult = await http.get( + federationBaseUrl.resolveUri( + Uri(path: '/_matrix/federation/v1/version'), + ), + ); + final { + 'server': { + 'name': String name, + 'version': String version, + }, + } = Map>.from( + jsonDecode(serverVersionResult.body), + ); + + return (name: name, version: version, federationBaseUrl: federationBaseUrl); + } + + @override + Widget build(BuildContext context) => SettingsHomeserverView(this); +} diff --git a/lib/pages/settings_homeserver/settings_homeserver_view.dart b/lib/pages/settings_homeserver/settings_homeserver_view.dart new file mode 100644 index 0000000..ad13f79 --- /dev/null +++ b/lib/pages/settings_homeserver/settings_homeserver_view.dart @@ -0,0 +1,303 @@ +import 'dart:convert'; + +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:flutter_linkify/flutter_linkify.dart'; +import 'package:matrix/matrix.dart'; +import 'package:url_launcher/url_launcher_string.dart'; + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/utils/localized_exception_extension.dart'; +import 'package:fluffychat/widgets/layouts/max_width_body.dart'; +import '../../widgets/matrix.dart'; +import 'settings_homeserver.dart'; + +class SettingsHomeserverView extends StatelessWidget { + final SettingsHomeserverController controller; + + const SettingsHomeserverView(this.controller, {super.key}); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + final client = Matrix.of(context).client; + + return Scaffold( + appBar: AppBar( + automaticallyImplyLeading: !FluffyThemes.isColumnMode(context), + centerTitle: FluffyThemes.isColumnMode(context), + title: Text( + L10n.of(context) + .aboutHomeserver(client.userID?.domain ?? 'Homeserver'), + ), + ), + body: MaxWidthBody( + withScrolling: true, + child: SelectionArea( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + ListTile( + title: Text( + L10n.of(context).serverInformation, + style: TextStyle( + color: theme.colorScheme.secondary, + fontWeight: FontWeight.bold, + ), + ), + ), + FutureBuilder( + future: client.getWellknownSupport(), + builder: (context, snapshot) { + final error = snapshot.error; + final data = snapshot.data; + if (error != null) { + return ListTile( + leading: const Icon(Icons.error_outlined), + title: Text( + error.toLocalizedString( + context, + ExceptionContext.checkServerSupportInfo, + ), + style: const TextStyle(fontSize: 14), + ), + ); + } + if (data == null) { + return const Center( + child: CircularProgressIndicator.adaptive( + strokeWidth: 2, + ), + ); + } + final supportPage = data.supportPage; + final contacts = data.contacts; + if (supportPage == null && contacts == null) { + return ListTile( + leading: const Icon(Icons.error_outlined), + title: Text( + L10n.of(context).noContactInformationProvided, + style: const TextStyle(fontSize: 14), + ), + ); + } + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + if (supportPage != null) + ListTile( + title: Text(L10n.of(context).supportPage), + subtitle: Text(supportPage.toString()), + ), + if (contacts != null) + ...contacts.map( + (contact) { + return ListTile( + title: Text( + contact.role.localizedString( + L10n.of(context), + ), + ), + subtitle: Column( + mainAxisSize: MainAxisSize.min, + children: [ + if (contact.emailAddress != null) + TextButton( + onPressed: () {}, + child: Text(contact.emailAddress!), + ), + if (contact.matrixId != null) + TextButton( + onPressed: () {}, + child: Text(contact.matrixId!), + ), + ], + ), + ); + }, + ), + ], + ); + }, + ), + FutureBuilder( + future: controller.fetchServerInfo(), + builder: (context, snapshot) { + final error = snapshot.error; + if (error != null) { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon( + Icons.error_outlined, + color: theme.colorScheme.error, + ), + const SizedBox(height: 12), + Text( + error.toLocalizedString(context), + textAlign: TextAlign.center, + style: TextStyle( + color: theme.colorScheme.error, + ), + ), + ], + ); + } + final data = snapshot.data; + if (data == null) { + return const Center( + child: CircularProgressIndicator.adaptive( + strokeWidth: 2, + ), + ); + } + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + ListTile( + title: Text(L10n.of(context).name), + subtitle: Text(data.name), + ), + ListTile( + title: Text(L10n.of(context).version), + subtitle: Text(data.version), + ), + ListTile( + title: const Text('Federation Base URL'), + subtitle: Linkify( + text: data.federationBaseUrl.toString(), + textScaleFactor: + MediaQuery.textScalerOf(context).scale(1), + options: const LinkifyOptions(humanize: false), + linkStyle: TextStyle( + color: theme.colorScheme.primary, + decorationColor: theme.colorScheme.primary, + ), + onOpen: (link) => launchUrlString(link.url), + ), + ), + ], + ); + }, + ), + Divider(color: theme.dividerColor), + FutureBuilder( + future: client.getWellknown(), + initialData: client.wellKnown, + builder: (context, snapshot) { + final error = snapshot.error; + if (error != null) { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon( + Icons.error_outlined, + color: theme.colorScheme.error, + ), + const SizedBox(height: 12), + Text( + error.toLocalizedString(context), + textAlign: TextAlign.center, + style: TextStyle( + color: theme.colorScheme.error, + ), + ), + ], + ); + } + final wellKnown = snapshot.data; + if (wellKnown == null) { + return const Center( + child: CircularProgressIndicator.adaptive( + strokeWidth: 2, + ), + ); + } + final identityServer = wellKnown.mIdentityServer; + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + ListTile( + title: Text( + 'Client-Well-Known Information:', + style: TextStyle( + color: theme.colorScheme.secondary, + fontWeight: FontWeight.bold, + ), + ), + ), + ListTile( + title: const Text('Base URL'), + subtitle: Linkify( + text: wellKnown.mHomeserver.baseUrl.toString(), + textScaleFactor: + MediaQuery.textScalerOf(context).scale(1), + options: const LinkifyOptions(humanize: false), + linkStyle: TextStyle( + color: theme.colorScheme.primary, + decorationColor: theme.colorScheme.primary, + ), + onOpen: (link) => launchUrlString(link.url), + ), + ), + if (identityServer != null) + ListTile( + title: const Text('Identity Server:'), + subtitle: Linkify( + text: identityServer.baseUrl.toString(), + textScaleFactor: + MediaQuery.textScalerOf(context).scale(1), + options: const LinkifyOptions(humanize: false), + linkStyle: TextStyle( + color: theme.colorScheme.primary, + decorationColor: theme.colorScheme.primary, + ), + onOpen: (link) => launchUrlString(link.url), + ), + ), + ...wellKnown.additionalProperties.entries.map( + (entry) => ListTile( + title: Text(entry.key), + subtitle: Material( + borderRadius: + BorderRadius.circular(AppConfig.borderRadius), + color: theme.colorScheme.surfaceContainer, + child: SingleChildScrollView( + padding: const EdgeInsets.all(16), + scrollDirection: Axis.horizontal, + child: Text( + const JsonEncoder.withIndent(' ') + .convert(entry.value), + style: TextStyle( + color: theme.colorScheme.onSurface, + ), + ), + ), + ), + ), + ), + ], + ); + }, + ), + ], + ), + ), + ), + ); + } +} + +extension on Role { + String localizedString(L10n l10n) { + switch (this) { + case Role.mRoleAdmin: + return l10n.contactServerAdmin; + case Role.mRoleSecurity: + return l10n.contactServerSecurity; + } + } +} diff --git a/lib/pages/settings_ignore_list/settings_ignore_list.dart b/lib/pages/settings_ignore_list/settings_ignore_list.dart new file mode 100644 index 0000000..980731e --- /dev/null +++ b/lib/pages/settings_ignore_list/settings_ignore_list.dart @@ -0,0 +1,55 @@ +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import '../../widgets/matrix.dart'; +import 'settings_ignore_list_view.dart'; + +class SettingsIgnoreList extends StatefulWidget { + final String? initialUserId; + + const SettingsIgnoreList({super.key, this.initialUserId}); + + @override + SettingsIgnoreListController createState() => SettingsIgnoreListController(); +} + +class SettingsIgnoreListController extends State { + final TextEditingController controller = TextEditingController(); + + @override + void initState() { + super.initState(); + final initialUserId = widget.initialUserId; + if (initialUserId != null) { + controller.text = initialUserId; + } + } + + String? errorText; + + void ignoreUser(BuildContext context) { + final userId = controller.text.trim(); + if (userId.isEmpty) return; + if (!userId.isValidMatrixId || userId.sigil != '@') { + setState(() { + errorText = L10n.of(context).invalidInput; + }); + return; + } + setState(() { + errorText = null; + }); + + showFutureLoadingDialog( + context: context, + future: () => Matrix.of(context).client.ignoreUser(userId), + ); + controller.clear(); + } + + @override + Widget build(BuildContext context) => SettingsIgnoreListView(this); +} diff --git a/lib/pages/settings_ignore_list/settings_ignore_list_view.dart b/lib/pages/settings_ignore_list/settings_ignore_list_view.dart new file mode 100644 index 0000000..4ae677d --- /dev/null +++ b/lib/pages/settings_ignore_list/settings_ignore_list_view.dart @@ -0,0 +1,111 @@ +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/widgets/avatar.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import 'package:fluffychat/widgets/layouts/max_width_body.dart'; +import '../../widgets/matrix.dart'; +import 'settings_ignore_list.dart'; + +class SettingsIgnoreListView extends StatelessWidget { + final SettingsIgnoreListController controller; + + const SettingsIgnoreListView(this.controller, {super.key}); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + final client = Matrix.of(context).client; + return Scaffold( + appBar: AppBar( + leading: const Center(child: BackButton()), + title: Text(L10n.of(context).blockedUsers), + ), + body: MaxWidthBody( + withScrolling: false, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + TextField( + controller: controller.controller, + autocorrect: false, + textInputAction: TextInputAction.done, + onSubmitted: (_) => controller.ignoreUser(context), + decoration: InputDecoration( + errorText: controller.errorText, + hintText: '@bad_guy:domain.abc', + floatingLabelBehavior: FloatingLabelBehavior.always, + labelText: L10n.of(context).blockUsername, + suffixIcon: IconButton( + tooltip: L10n.of(context).block, + icon: const Icon(Icons.add), + onPressed: () => controller.ignoreUser(context), + ), + ), + ), + const SizedBox(height: 16), + Text( + L10n.of(context).blockListDescription, + style: const TextStyle(color: Colors.orange), + ), + ], + ), + ), + Divider( + color: theme.dividerColor, + ), + Expanded( + child: StreamBuilder( + stream: client.onSync.stream.where( + (syncUpdate) => + syncUpdate.accountData?.any( + (accountData) => + accountData.type == 'm.ignored_user_list', + ) ?? + false, + ), + builder: (context, snapshot) { + return ListView.builder( + itemCount: client.ignoredUsers.length, + itemBuilder: (c, i) => FutureBuilder( + future: + client.getProfileFromUserId(client.ignoredUsers[i]), + builder: (c, s) => ListTile( + leading: Avatar( + mxContent: s.data?.avatarUrl ?? Uri.parse(''), + name: s.data?.displayName ?? client.ignoredUsers[i], + ), + title: Text( + s.data?.displayName ?? client.ignoredUsers[i], + ), + subtitle: + Text(s.data?.userId ?? client.ignoredUsers[i]), + trailing: IconButton( + tooltip: L10n.of(context).delete, + icon: const Icon(Icons.delete_outlined), + onPressed: () => showFutureLoadingDialog( + context: context, + future: () => + client.unignoreUser(client.ignoredUsers[i]), + ), + ), + ), + ), + ); + }, + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/pages/settings_multiple_emotes/settings_multiple_emotes.dart b/lib/pages/settings_multiple_emotes/settings_multiple_emotes.dart new file mode 100644 index 0000000..276bc08 --- /dev/null +++ b/lib/pages/settings_multiple_emotes/settings_multiple_emotes.dart @@ -0,0 +1,19 @@ +import 'package:flutter/material.dart'; + +import 'package:go_router/go_router.dart'; + +import 'settings_multiple_emotes_view.dart'; + +class MultipleEmotesSettings extends StatefulWidget { + const MultipleEmotesSettings({super.key}); + + @override + MultipleEmotesSettingsController createState() => + MultipleEmotesSettingsController(); +} + +class MultipleEmotesSettingsController extends State { + String? get roomId => GoRouterState.of(context).pathParameters['roomid']; + @override + Widget build(BuildContext context) => MultipleEmotesSettingsView(this); +} diff --git a/lib/pages/settings_multiple_emotes/settings_multiple_emotes_view.dart b/lib/pages/settings_multiple_emotes/settings_multiple_emotes_view.dart new file mode 100644 index 0000000..93fed0a --- /dev/null +++ b/lib/pages/settings_multiple_emotes/settings_multiple_emotes_view.dart @@ -0,0 +1,64 @@ +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/pages/settings_multiple_emotes/settings_multiple_emotes.dart'; +import 'package:fluffychat/widgets/matrix.dart'; + +class MultipleEmotesSettingsView extends StatelessWidget { + final MultipleEmotesSettingsController controller; + + const MultipleEmotesSettingsView(this.controller, {super.key}); + + @override + Widget build(BuildContext context) { + final room = Matrix.of(context).client.getRoomById(controller.roomId!)!; + return Scaffold( + appBar: AppBar( + leading: const Center(child: BackButton()), + title: Text(L10n.of(context).emotePacks), + ), + body: StreamBuilder( + stream: room.client.onRoomState.stream + .where((update) => update.roomId == room.id), + builder: (context, snapshot) { + final packStateEvents = room.states['im.ponies.room_emotes']; + // we need to manually convert the map using Map.of, otherwise assigning null will throw a type error. + final packs = packStateEvents != null + ? Map.of(packStateEvents) + : {}; + if (!packs.containsKey('')) { + packs[''] = null; + } + final keys = packs.keys.toList(); + keys.sort(); + return ListView.separated( + separatorBuilder: (BuildContext context, int i) => + const SizedBox.shrink(), + itemCount: keys.length, + itemBuilder: (BuildContext context, int i) { + final event = packs[keys[i]]; + final eventPack = + event?.content.tryGetMap('pack'); + final packName = eventPack?.tryGet('displayname') ?? + eventPack?.tryGet('name') ?? + (keys[i].isNotEmpty ? keys[i] : 'Default Pack'); + + return ListTile( + title: Text(packName), + onTap: () async { + context.go( + ['', 'rooms', room.id, 'details', 'emotes', keys[i]] + .join('/'), + ); + }, + ); + }, + ); + }, + ), + ); + } +} diff --git a/lib/pages/settings_notifications/push_rule_extensions.dart b/lib/pages/settings_notifications/push_rule_extensions.dart new file mode 100644 index 0000000..9ea6ac3 --- /dev/null +++ b/lib/pages/settings_notifications/push_rule_extensions.dart @@ -0,0 +1,121 @@ +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:matrix/matrix.dart'; + +extension PushRuleExtension on PushRule { + String getPushRuleName(L10n l10n) { + switch (ruleId) { + case '.m.rule.contains_user_name': + return l10n.notificationRuleContainsUserName; + case '.m.rule.master': + return l10n.notificationRuleMaster; + case '.m.rule.suppress_notices': + return l10n.notificationRuleSuppressNotices; + case '.m.rule.invite_for_me': + return l10n.notificationRuleInviteForMe; + case '.m.rule.member_event': + return l10n.notificationRuleMemberEvent; + case '.m.rule.is_user_mention': + return l10n.notificationRuleIsUserMention; + case '.m.rule.contains_display_name': + return l10n.notificationRuleContainsDisplayName; + case '.m.rule.is_room_mention': + return l10n.notificationRuleIsRoomMention; + case '.m.rule.roomnotif': + return l10n.notificationRuleRoomnotif; + case '.m.rule.tombstone': + return l10n.notificationRuleTombstone; + case '.m.rule.reaction': + return l10n.notificationRuleReaction; + case '.m.rule.room_server_acl': + return l10n.notificationRuleRoomServerAcl; + case '.m.rule.suppress_edits': + return l10n.notificationRuleSuppressEdits; + case '.m.rule.call': + return l10n.notificationRuleCall; + case '.m.rule.encrypted_room_one_to_one': + return l10n.notificationRuleEncryptedRoomOneToOne; + case '.m.rule.room_one_to_one': + return l10n.notificationRuleRoomOneToOne; + case '.m.rule.message': + return l10n.notificationRuleMessage; + case '.m.rule.encrypted': + return l10n.notificationRuleEncrypted; + case '.m.rule.room.server_acl': + return l10n.notificationRuleServerAcl; + case '.im.vector.jitsi': + return l10n.notificationRuleJitsi; + default: + return ruleId.split('.').last.replaceAll('_', ' ').capitalize(); + } + } + + String getPushRuleDescription(L10n l10n) { + switch (ruleId) { + case '.m.rule.contains_user_name': + return l10n.notificationRuleContainsUserNameDescription; + case '.m.rule.master': + return l10n.notificationRuleMasterDescription; + case '.m.rule.suppress_notices': + return l10n.notificationRuleSuppressNoticesDescription; + case '.m.rule.invite_for_me': + return l10n.notificationRuleInviteForMeDescription; + case '.m.rule.member_event': + return l10n.notificationRuleMemberEventDescription; + case '.m.rule.is_user_mention': + return l10n.notificationRuleIsUserMentionDescription; + case '.m.rule.contains_display_name': + return l10n.notificationRuleContainsDisplayNameDescription; + case '.m.rule.is_room_mention': + return l10n.notificationRuleIsRoomMentionDescription; + case '.m.rule.roomnotif': + return l10n.notificationRuleRoomnotifDescription; + case '.m.rule.tombstone': + return l10n.notificationRuleTombstoneDescription; + case '.m.rule.reaction': + return l10n.notificationRuleReactionDescription; + case '.m.rule.room_server_acl': + return l10n.notificationRuleRoomServerAclDescription; + case '.m.rule.suppress_edits': + return l10n.notificationRuleSuppressEditsDescription; + case '.m.rule.call': + return l10n.notificationRuleCallDescription; + case '.m.rule.encrypted_room_one_to_one': + return l10n.notificationRuleEncryptedRoomOneToOneDescription; + case '.m.rule.room_one_to_one': + return l10n.notificationRuleRoomOneToOneDescription; + case '.m.rule.message': + return l10n.notificationRuleMessageDescription; + case '.m.rule.encrypted': + return l10n.notificationRuleEncryptedDescription; + case '.m.rule.room.server_acl': + return l10n.notificationRuleServerAclDescription; + case '.im.vector.jitsi': + return l10n.notificationRuleJitsiDescription; + default: + return l10n.unknownPushRule(ruleId); + } + } +} + +extension PushRuleKindLocal on PushRuleKind { + String localized(L10n l10n) { + switch (this) { + case PushRuleKind.content: + return l10n.contentNotificationSettings; + case PushRuleKind.override: + return l10n.generalNotificationSettings; + case PushRuleKind.room: + return l10n.roomNotificationSettings; + case PushRuleKind.sender: + return l10n.userSpecificNotificationSettings; + case PushRuleKind.underride: + return l10n.otherNotificationSettings; + } + } +} + +extension on String { + String capitalize() { + return "${this[0].toUpperCase()}${substring(1).toLowerCase()}"; + } +} diff --git a/lib/pages/settings_notifications/settings_notifications.dart b/lib/pages/settings_notifications/settings_notifications.dart new file mode 100644 index 0000000..4d1f149 --- /dev/null +++ b/lib/pages/settings_notifications/settings_notifications.dart @@ -0,0 +1,206 @@ +import 'dart:convert'; + +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/pages/settings_notifications/push_rule_extensions.dart'; +import 'package:fluffychat/utils/localized_exception_extension.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/adaptive_dialog_action.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_modal_action_popup.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import '../../widgets/matrix.dart'; +import 'settings_notifications_view.dart'; + +class SettingsNotifications extends StatefulWidget { + const SettingsNotifications({super.key}); + + @override + SettingsNotificationsController createState() => + SettingsNotificationsController(); +} + +class SettingsNotificationsController extends State { + bool isLoading = false; + + void onPusherTap(Pusher pusher) async { + final delete = await showModalActionPopup( + context: context, + title: pusher.deviceDisplayName, + message: '${pusher.appDisplayName} (${pusher.appId})', + cancelLabel: L10n.of(context).cancel, + actions: [ + AdaptiveModalAction( + label: L10n.of(context).delete, + isDestructive: true, + value: true, + ), + ], + ); + if (delete != true) return; + + final success = await showFutureLoadingDialog( + context: context, + future: () => Matrix.of(context).client.deletePusher( + PusherId( + appId: pusher.appId, + pushkey: pusher.pushkey, + ), + ), + ); + + if (success.error != null) return; + + setState(() { + pusherFuture = null; + }); + } + + Future?>? pusherFuture; + + void togglePushRule(PushRuleKind kind, PushRule pushRule) async { + setState(() { + isLoading = true; + }); + try { + final updateFromSync = Matrix.of(context) + .client + .onSync + .stream + .where( + (syncUpdate) => + syncUpdate.accountData?.any( + (accountData) => accountData.type == 'm.push_rules', + ) ?? + false, + ) + .first; + await Matrix.of(context).client.setPushRuleEnabled( + kind, + pushRule.ruleId, + !pushRule.enabled, + ); + await updateFromSync; + } catch (e, s) { + Logs().w('Unable to toggle push rule', e, s); + if (!mounted) return; + ScaffoldMessenger.of(context) + .showSnackBar(SnackBar(content: Text(e.toLocalizedString(context)))); + } finally { + if (mounted) { + setState(() { + isLoading = false; + }); + } + } + } + + void editPushRule(PushRule rule, PushRuleKind kind) async { + final theme = Theme.of(context); + final action = await showAdaptiveDialog( + context: context, + builder: (context) => ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 256), + child: AlertDialog.adaptive( + title: Text(rule.getPushRuleName(L10n.of(context))), + content: Padding( + padding: const EdgeInsets.only(top: 16.0), + child: Material( + borderRadius: BorderRadius.circular(AppConfig.borderRadius), + color: theme.colorScheme.surfaceContainer, + child: SingleChildScrollView( + padding: const EdgeInsets.all(16), + scrollDirection: Axis.horizontal, + child: SelectableText( + prettyJson(rule.toJson()), + style: TextStyle( + color: theme.colorScheme.onSurface, + ), + ), + ), + ), + ), + actions: [ + AdaptiveDialogAction( + onPressed: Navigator.of(context).pop, + child: Text(L10n.of(context).close), + ), + if (!rule.ruleId.startsWith('.m.')) + AdaptiveDialogAction( + onPressed: () => + Navigator.of(context).pop(PushRuleDialogAction.delete), + child: Text( + L10n.of(context).delete, + style: TextStyle(color: theme.colorScheme.error), + ), + ), + ], + ), + ), + ); + if (action == null) return; + if (!mounted) return; + switch (action) { + case PushRuleDialogAction.delete: + final consent = await showOkCancelAlertDialog( + context: context, + title: L10n.of(context).areYouSure, + message: L10n.of(context).deletePushRuleCanNotBeUndone, + okLabel: L10n.of(context).delete, + isDestructive: true, + ); + if (consent != OkCancelResult.ok) return; + if (!mounted) return; + setState(() { + isLoading = true; + }); + try { + final updateFromSync = Matrix.of(context) + .client + .onSync + .stream + .where( + (syncUpdate) => + syncUpdate.accountData?.any( + (accountData) => accountData.type == 'm.push_rules', + ) ?? + false, + ) + .first; + await Matrix.of(context).client.deletePushRule( + kind, + rule.ruleId, + ); + await updateFromSync; + } catch (e, s) { + Logs().w('Unable to delete push rule', e, s); + if (!mounted) return; + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text(e.toLocalizedString(context))), + ); + } finally { + if (mounted) { + setState(() { + isLoading = false; + }); + } + } + return; + } + } + + @override + Widget build(BuildContext context) => SettingsNotificationsView(this); +} + +enum PushRuleDialogAction { delete } + +String prettyJson(Map json) { + const decoder = JsonDecoder(); + const encoder = JsonEncoder.withIndent(' '); + final object = decoder.convert(jsonEncode(json)); + return encoder.convert(object); +} diff --git a/lib/pages/settings_notifications/settings_notifications_view.dart b/lib/pages/settings_notifications/settings_notifications_view.dart new file mode 100644 index 0000000..d73746b --- /dev/null +++ b/lib/pages/settings_notifications/settings_notifications_view.dart @@ -0,0 +1,169 @@ +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/pages/settings_notifications/push_rule_extensions.dart'; +import 'package:fluffychat/widgets/layouts/max_width_body.dart'; +import '../../utils/localized_exception_extension.dart'; +import '../../widgets/matrix.dart'; +import 'settings_notifications.dart'; + +class SettingsNotificationsView extends StatelessWidget { + final SettingsNotificationsController controller; + + const SettingsNotificationsView(this.controller, {super.key}); + + @override + Widget build(BuildContext context) { + final pushRules = Matrix.of(context).client.globalPushRules; + final pushCategories = [ + if (pushRules?.override?.isNotEmpty ?? false) + (rules: pushRules?.override ?? [], kind: PushRuleKind.override), + if (pushRules?.content?.isNotEmpty ?? false) + (rules: pushRules?.content ?? [], kind: PushRuleKind.content), + if (pushRules?.sender?.isNotEmpty ?? false) + (rules: pushRules?.sender ?? [], kind: PushRuleKind.sender), + if (pushRules?.underride?.isNotEmpty ?? false) + (rules: pushRules?.underride ?? [], kind: PushRuleKind.underride), + ]; + return Scaffold( + appBar: AppBar( + automaticallyImplyLeading: !FluffyThemes.isColumnMode(context), + centerTitle: FluffyThemes.isColumnMode(context), + title: Text(L10n.of(context).notifications), + ), + body: MaxWidthBody( + child: StreamBuilder( + stream: Matrix.of(context).client.onSync.stream.where( + (syncUpdate) => + syncUpdate.accountData?.any( + (accountData) => accountData.type == 'm.push_rules', + ) ?? + false, + ), + builder: (BuildContext context, _) { + final theme = Theme.of(context); + return SelectionArea( + child: Column( + children: [ + if (pushRules != null) + for (final category in pushCategories) ...[ + ListTile( + title: Text( + category.kind.localized(L10n.of(context)), + style: TextStyle( + color: theme.colorScheme.secondary, + fontWeight: FontWeight.bold, + ), + ), + ), + for (final rule in category.rules) + ListTile( + title: Text(rule.getPushRuleName(L10n.of(context))), + subtitle: Text.rich( + TextSpan( + children: [ + TextSpan( + text: rule.getPushRuleDescription( + L10n.of(context), + ), + ), + const TextSpan(text: ' '), + WidgetSpan( + child: InkWell( + onTap: () => controller.editPushRule( + rule, + category.kind, + ), + child: Text( + L10n.of(context).more, + style: TextStyle( + color: theme.colorScheme.primary, + decoration: TextDecoration.underline, + decorationColor: + theme.colorScheme.primary, + ), + ), + ), + ), + ], + ), + ), + trailing: Switch.adaptive( + value: rule.enabled, + onChanged: controller.isLoading + ? null + : rule.ruleId != '.m.rule.master' && + Matrix.of(context) + .client + .allPushNotificationsMuted + ? null + : (_) => controller.togglePushRule( + category.kind, + rule, + ), + ), + ), + Divider(color: theme.dividerColor), + ], + ListTile( + title: Text( + L10n.of(context).devices, + style: TextStyle( + color: theme.colorScheme.secondary, + fontWeight: FontWeight.bold, + ), + ), + ), + FutureBuilder?>( + future: controller.pusherFuture ??= + Matrix.of(context).client.getPushers(), + builder: (context, snapshot) { + if (snapshot.hasError) { + Center( + child: Text( + snapshot.error!.toLocalizedString(context), + ), + ); + } + if (snapshot.connectionState != ConnectionState.done) { + const Center( + child: CircularProgressIndicator.adaptive( + strokeWidth: 2, + ), + ); + } + final pushers = snapshot.data ?? []; + if (pushers.isEmpty) { + return Center( + child: Padding( + padding: const EdgeInsets.only(bottom: 16.0), + child: Text(L10n.of(context).noOtherDevicesFound), + ), + ); + } + return ListView.builder( + physics: const NeverScrollableScrollPhysics(), + shrinkWrap: true, + itemCount: pushers.length, + itemBuilder: (_, i) => ListTile( + title: Text( + '${pushers[i].appDisplayName} - ${pushers[i].appId}', + ), + subtitle: Text(pushers[i].data.url.toString()), + onTap: () => controller.onPusherTap(pushers[i]), + ), + ); + }, + ), + ], + ), + ); + }, + ), + ), + ); + } +} diff --git a/lib/pages/settings_password/settings_password.dart b/lib/pages/settings_password/settings_password.dart new file mode 100644 index 0000000..07b5cca --- /dev/null +++ b/lib/pages/settings_password/settings_password.dart @@ -0,0 +1,83 @@ +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:go_router/go_router.dart'; + +import 'package:fluffychat/pages/settings_password/settings_password_view.dart'; +import 'package:fluffychat/utils/localized_exception_extension.dart'; +import 'package:fluffychat/widgets/matrix.dart'; + +class SettingsPassword extends StatefulWidget { + const SettingsPassword({super.key}); + + @override + SettingsPasswordController createState() => SettingsPasswordController(); +} + +class SettingsPasswordController extends State { + final TextEditingController oldPasswordController = TextEditingController(); + final TextEditingController newPassword1Controller = TextEditingController(); + final TextEditingController newPassword2Controller = TextEditingController(); + + String? oldPasswordError; + String? newPassword1Error; + String? newPassword2Error; + + bool loading = false; + + void changePassword() async { + setState(() { + oldPasswordError = newPassword1Error = newPassword2Error = null; + }); + if (oldPasswordController.text.isEmpty) { + setState(() { + oldPasswordError = L10n.of(context).pleaseEnterYourPassword; + }); + return; + } + if (newPassword1Controller.text.isEmpty || + newPassword1Controller.text.length < 6) { + setState(() { + newPassword1Error = L10n.of(context).pleaseChooseAStrongPassword; + }); + return; + } + if (newPassword1Controller.text != newPassword2Controller.text) { + setState(() { + newPassword2Error = L10n.of(context).passwordsDoNotMatch; + }); + return; + } + + setState(() { + loading = true; + }); + try { + final scaffoldMessenger = ScaffoldMessenger.of(context); + await Matrix.of(context).client.changePassword( + newPassword1Controller.text, + oldPassword: oldPasswordController.text, + ); + scaffoldMessenger.showSnackBar( + SnackBar( + content: Text(L10n.of(context).passwordHasBeenChanged), + ), + ); + if (mounted) context.pop(); + } catch (e) { + setState(() { + newPassword2Error = e.toLocalizedString( + context, + ExceptionContext.changePassword, + ); + }); + } finally { + setState(() { + loading = false; + }); + } + } + + @override + Widget build(BuildContext context) => SettingsPasswordView(this); +} diff --git a/lib/pages/settings_password/settings_password_view.dart b/lib/pages/settings_password/settings_password_view.dart new file mode 100644 index 0000000..2b7a006 --- /dev/null +++ b/lib/pages/settings_password/settings_password_view.dart @@ -0,0 +1,91 @@ +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:go_router/go_router.dart'; + +import 'package:fluffychat/pages/settings_password/settings_password.dart'; +import 'package:fluffychat/widgets/layouts/max_width_body.dart'; + +class SettingsPasswordView extends StatelessWidget { + final SettingsPasswordController controller; + const SettingsPasswordView(this.controller, {super.key}); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + return Scaffold( + appBar: AppBar( + title: Text(L10n.of(context).changePassword), + ), + body: ListTileTheme( + iconColor: theme.colorScheme.onSurface, + child: MaxWidthBody( + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + children: [ + const SizedBox(height: 16), + TextField( + controller: controller.oldPasswordController, + obscureText: true, + autocorrect: false, + autofocus: true, + readOnly: controller.loading, + decoration: InputDecoration( + prefixIcon: const Icon(Icons.lock_outlined), + hintText: '********', + labelText: L10n.of(context).pleaseEnterYourCurrentPassword, + errorText: controller.oldPasswordError, + ), + ), + const Divider(height: 64), + TextField( + controller: controller.newPassword1Controller, + obscureText: true, + autocorrect: false, + readOnly: controller.loading, + decoration: InputDecoration( + prefixIcon: const Icon(Icons.lock_reset_outlined), + hintText: '********', + labelText: L10n.of(context).newPassword, + errorText: controller.newPassword1Error, + ), + ), + const SizedBox(height: 16), + TextField( + controller: controller.newPassword2Controller, + obscureText: true, + autocorrect: false, + readOnly: controller.loading, + decoration: InputDecoration( + prefixIcon: const Icon(Icons.repeat_outlined), + hintText: '********', + labelText: L10n.of(context).repeatPassword, + errorText: controller.newPassword2Error, + ), + ), + const SizedBox(height: 32), + SizedBox( + width: double.infinity, + child: ElevatedButton( + onPressed: + controller.loading ? null : controller.changePassword, + child: controller.loading + ? const LinearProgressIndicator() + : Text(L10n.of(context).changePassword), + ), + ), + const SizedBox(height: 16), + TextButton( + child: Text(L10n.of(context).passwordRecoverySettings), + onPressed: () => context.go('/rooms/settings/security/3pid'), + ), + ], + ), + ), + ), + ), + ); + } +} diff --git a/lib/pages/settings_security/settings_security.dart b/lib/pages/settings_security/settings_security.dart new file mode 100644 index 0000000..bc115e6 --- /dev/null +++ b/lib/pages/settings_security/settings_security.dart @@ -0,0 +1,124 @@ +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/config/setting_keys.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_text_input_dialog.dart'; +import 'package:fluffychat/widgets/app_lock.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import 'package:fluffychat/widgets/matrix.dart'; +import '../bootstrap/bootstrap_dialog.dart'; +import 'settings_security_view.dart'; + +class SettingsSecurity extends StatefulWidget { + const SettingsSecurity({super.key}); + + @override + SettingsSecurityController createState() => SettingsSecurityController(); +} + +class SettingsSecurityController extends State { + void setAppLockAction() async { + if (AppLock.of(context).isActive) { + AppLock.of(context).showLockScreen(); + } + final newLock = await showTextInputDialog( + useRootNavigator: false, + context: context, + title: L10n.of(context).pleaseChooseAPasscode, + message: L10n.of(context).pleaseEnter4Digits, + cancelLabel: L10n.of(context).cancel, + validator: (text) { + if (text.isEmpty || (text.length == 4 && int.tryParse(text)! >= 0)) { + return null; + } + return L10n.of(context).pleaseEnter4Digits; + }, + keyboardType: TextInputType.number, + obscureText: true, + maxLines: 1, + minLines: 1, + maxLength: 4, + ); + if (newLock != null) { + await AppLock.of(context).changePincode(newLock); + } + } + + void deleteAccountAction() async { + if (await showOkCancelAlertDialog( + useRootNavigator: false, + context: context, + title: L10n.of(context).warning, + message: L10n.of(context).deactivateAccountWarning, + okLabel: L10n.of(context).ok, + cancelLabel: L10n.of(context).cancel, + isDestructive: true, + ) == + OkCancelResult.cancel) { + return; + } + final supposedMxid = Matrix.of(context).client.userID!; + final mxid = await showTextInputDialog( + useRootNavigator: false, + context: context, + title: L10n.of(context).confirmMatrixId, + validator: (text) => text == supposedMxid + ? null + : L10n.of(context).supposedMxid(supposedMxid), + isDestructive: true, + okLabel: L10n.of(context).delete, + cancelLabel: L10n.of(context).cancel, + ); + if (mxid == null || mxid.isEmpty || mxid != supposedMxid) { + return; + } + final input = await showTextInputDialog( + useRootNavigator: false, + context: context, + title: L10n.of(context).pleaseEnterYourPassword, + okLabel: L10n.of(context).ok, + cancelLabel: L10n.of(context).cancel, + isDestructive: true, + obscureText: true, + hintText: '******', + minLines: 1, + maxLines: 1, + ); + if (input == null) return; + await showFutureLoadingDialog( + context: context, + future: () => Matrix.of(context).client.deactivateAccount( + auth: AuthenticationPassword( + password: input, + identifier: AuthenticationUserIdentifier( + user: Matrix.of(context).client.userID!, + ), + ), + ), + ); + } + + void showBootstrapDialog(BuildContext context) async { + await BootstrapDialog( + client: Matrix.of(context).client, + ).show(context); + } + + Future dehydrateAction() => Matrix.of(context).dehydrateAction(context); + + void changeShareKeysWith(ShareKeysWith? shareKeysWith) async { + if (shareKeysWith == null) return; + AppSettings.shareKeysWith.setItem( + Matrix.of(context).store, + shareKeysWith.name, + ); + Matrix.of(context).client.shareKeysWith = shareKeysWith; + setState(() {}); + } + + @override + Widget build(BuildContext context) => SettingsSecurityView(this); +} diff --git a/lib/pages/settings_security/settings_security_view.dart b/lib/pages/settings_security/settings_security_view.dart new file mode 100644 index 0000000..5ea476e --- /dev/null +++ b/lib/pages/settings_security/settings_security_view.dart @@ -0,0 +1,218 @@ +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/config/setting_keys.dart'; +import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/utils/beautify_string_extension.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/widgets/layouts/max_width_body.dart'; +import 'package:fluffychat/widgets/matrix.dart'; +import 'package:fluffychat/widgets/settings_switch_list_tile.dart'; +import 'settings_security.dart'; + +class SettingsSecurityView extends StatelessWidget { + final SettingsSecurityController controller; + + const SettingsSecurityView(this.controller, {super.key}); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + return Scaffold( + appBar: AppBar( + title: Text(L10n.of(context).security), + automaticallyImplyLeading: !FluffyThemes.isColumnMode(context), + centerTitle: FluffyThemes.isColumnMode(context), + ), + body: ListTileTheme( + iconColor: theme.colorScheme.onSurface, + child: MaxWidthBody( + child: FutureBuilder( + future: Matrix.of(context) + .client + .getCapabilities() + .timeout(const Duration(seconds: 10)), + builder: (context, snapshot) { + final capabilities = snapshot.data; + final error = snapshot.error; + if (error == null && capabilities == null) { + return const Center( + child: Padding( + padding: EdgeInsets.all(16.0), + child: CircularProgressIndicator.adaptive(strokeWidth: 2), + ), + ); + } + return Column( + children: [ + ListTile( + title: Text( + L10n.of(context).security, + style: TextStyle( + color: theme.colorScheme.secondary, + fontWeight: FontWeight.bold, + ), + ), + ), + SettingsSwitchListTile.adaptive( + title: L10n.of(context).hideAvatarsInInvites, + subtitle: + L10n.of(context).hideAvatarsInInvitesDescription, + onChanged: (b) => AppConfig.hideAvatarsInInvites = b, + storeKey: SettingKeys.hideAvatarsInInvites, + defaultValue: AppConfig.hideAvatarsInInvites, + ), + ListTile( + title: Text( + L10n.of(context).privacy, + style: TextStyle( + color: theme.colorScheme.secondary, + fontWeight: FontWeight.bold, + ), + ), + ), + SettingsSwitchListTile.adaptive( + title: L10n.of(context).sendTypingNotifications, + subtitle: + L10n.of(context).sendTypingNotificationsDescription, + onChanged: (b) => AppConfig.sendTypingNotifications = b, + storeKey: SettingKeys.sendTypingNotifications, + defaultValue: AppConfig.sendTypingNotifications, + ), + SettingsSwitchListTile.adaptive( + title: L10n.of(context).sendReadReceipts, + subtitle: L10n.of(context).sendReadReceiptsDescription, + onChanged: (b) => AppConfig.sendPublicReadReceipts = b, + storeKey: SettingKeys.sendPublicReadReceipts, + defaultValue: AppConfig.sendPublicReadReceipts, + ), + ListTile( + trailing: const Icon(Icons.chevron_right_outlined), + title: Text(L10n.of(context).blockedUsers), + subtitle: Text( + L10n.of(context).thereAreCountUsersBlocked( + Matrix.of(context).client.ignoredUsers.length, + ), + ), + onTap: () => + context.go('/rooms/settings/security/ignorelist'), + ), + if (Matrix.of(context).client.encryption != null) ...{ + if (PlatformInfos.isMobile) + ListTile( + trailing: const Icon(Icons.chevron_right_outlined), + title: Text(L10n.of(context).appLock), + subtitle: Text(L10n.of(context).appLockDescription), + onTap: controller.setAppLockAction, + ), + }, + Divider(color: theme.dividerColor), + ListTile( + title: Text( + L10n.of(context).shareKeysWith, + style: TextStyle( + color: theme.colorScheme.secondary, + fontWeight: FontWeight.bold, + ), + ), + subtitle: Text(L10n.of(context).shareKeysWithDescription), + ), + ListTile( + title: Material( + borderRadius: + BorderRadius.circular(AppConfig.borderRadius / 2), + color: theme.colorScheme.onInverseSurface, + child: DropdownButton( + isExpanded: true, + padding: const EdgeInsets.symmetric(horizontal: 8.0), + borderRadius: + BorderRadius.circular(AppConfig.borderRadius / 2), + underline: const SizedBox.shrink(), + value: Matrix.of(context).client.shareKeysWith, + items: ShareKeysWith.values + .map( + (share) => DropdownMenuItem( + value: share, + child: Text(share.localized(L10n.of(context))), + ), + ) + .toList(), + onChanged: controller.changeShareKeysWith, + ), + ), + ), + Divider(color: theme.dividerColor), + ListTile( + title: Text( + L10n.of(context).account, + style: TextStyle( + color: theme.colorScheme.secondary, + fontWeight: FontWeight.bold, + ), + ), + ), + ListTile( + title: Text(L10n.of(context).yourPublicKey), + leading: const Icon(Icons.vpn_key_outlined), + subtitle: SelectableText( + Matrix.of(context).client.fingerprintKey.beautified, + style: const TextStyle(fontFamily: 'RobotoMono'), + ), + ), + if (capabilities?.mChangePassword?.enabled != false || + error != null) + ListTile( + leading: const Icon(Icons.password_outlined), + trailing: const Icon(Icons.chevron_right_outlined), + title: Text(L10n.of(context).changePassword), + onTap: () => + context.go('/rooms/settings/security/password'), + ), + ListTile( + iconColor: Colors.orange, + leading: const Icon(Icons.delete_sweep_outlined), + title: Text( + L10n.of(context).dehydrate, + style: const TextStyle(color: Colors.orange), + ), + onTap: controller.dehydrateAction, + ), + Divider(color: theme.dividerColor), + ListTile( + iconColor: Colors.red, + leading: const Icon(Icons.delete_outlined), + title: Text( + L10n.of(context).deleteAccount, + style: const TextStyle(color: Colors.red), + ), + onTap: controller.deleteAccountAction, + ), + ], + ); + }, + ), + ), + ), + ); + } +} + +extension on ShareKeysWith { + String localized(L10n l10n) { + switch (this) { + case ShareKeysWith.all: + return l10n.allDevices; + case ShareKeysWith.crossVerifiedIfEnabled: + return l10n.crossVerifiedDevicesIfEnabled; + case ShareKeysWith.crossVerified: + return l10n.crossVerifiedDevices; + case ShareKeysWith.directlyVerifiedOnly: + return l10n.verifiedDevicesOnly; + } + } +} diff --git a/lib/pages/settings_style/settings_style.dart b/lib/pages/settings_style/settings_style.dart new file mode 100644 index 0000000..49b0b00 --- /dev/null +++ b/lib/pages/settings_style/settings_style.dart @@ -0,0 +1,168 @@ +import 'package:flutter/material.dart'; + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/config/setting_keys.dart'; +import 'package:fluffychat/utils/account_config.dart'; +import 'package:fluffychat/utils/file_selector.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import 'package:fluffychat/widgets/theme_builder.dart'; +import '../../widgets/matrix.dart'; +import 'settings_style_view.dart'; + +class SettingsStyle extends StatefulWidget { + const SettingsStyle({super.key}); + + @override + SettingsStyleController createState() => SettingsStyleController(); +} + +class SettingsStyleController extends State { + void setChatColor(Color? color) async { + AppConfig.colorSchemeSeed = color; + ThemeController.of(context).setPrimaryColor(color); + } + + void setWallpaper() async { + final client = Matrix.of(context).client; + final picked = await selectFiles( + context, + type: FileSelectorType.images, + ); + final pickedFile = picked.firstOrNull; + if (pickedFile == null) return; + + await showFutureLoadingDialog( + context: context, + future: () async { + final url = await client.uploadContent( + await pickedFile.readAsBytes(), + filename: pickedFile.name, + ); + await client.updateApplicationAccountConfig( + ApplicationAccountConfig(wallpaperUrl: url), + ); + }, + ); + } + + double get wallpaperOpacity => + _wallpaperOpacity ?? + Matrix.of(context).client.applicationAccountConfig.wallpaperOpacity ?? + 0.5; + + double? _wallpaperOpacity; + + void saveWallpaperOpacity(double opacity) async { + final client = Matrix.of(context).client; + final result = await showFutureLoadingDialog( + context: context, + future: () => client.updateApplicationAccountConfig( + ApplicationAccountConfig(wallpaperOpacity: opacity), + ), + ); + if (result.isValue) return; + + setState(() { + _wallpaperOpacity = client.applicationAccountConfig.wallpaperOpacity; + }); + } + + void updateWallpaperOpacity(double opacity) { + setState(() { + _wallpaperOpacity = opacity; + }); + } + + double get wallpaperBlur => + _wallpaperBlur ?? + Matrix.of(context).client.applicationAccountConfig.wallpaperBlur ?? + 0.5; + double? _wallpaperBlur; + + void saveWallpaperBlur(double blur) async { + final client = Matrix.of(context).client; + final result = await showFutureLoadingDialog( + context: context, + future: () => client.updateApplicationAccountConfig( + ApplicationAccountConfig(wallpaperBlur: blur), + ), + ); + if (result.isValue) return; + + setState(() { + _wallpaperBlur = client.applicationAccountConfig.wallpaperBlur; + }); + } + + void updateWallpaperBlur(double blur) { + setState(() { + _wallpaperBlur = blur; + }); + } + + void deleteChatWallpaper() => showFutureLoadingDialog( + context: context, + future: () => Matrix.of(context).client.setApplicationAccountConfig( + const ApplicationAccountConfig( + wallpaperUrl: null, + wallpaperBlur: null, + ), + ), + ); + + ThemeMode get currentTheme => ThemeController.of(context).themeMode; + Color? get currentColor => ThemeController.of(context).primaryColor; + + static final List customColors = [ + null, + AppConfig.chatColor, + Colors.indigo, + Colors.blue, + Colors.blueAccent, + Colors.teal, + Colors.tealAccent, + Colors.green, + Colors.greenAccent, + Colors.yellow, + Colors.yellowAccent, + Colors.orange, + Colors.orangeAccent, + Colors.red, + Colors.redAccent, + Colors.pink, + Colors.pinkAccent, + Colors.purple, + Colors.purpleAccent, + Colors.blueGrey, + Colors.grey, + Colors.white, + Colors.black, + ]; + + void switchTheme(ThemeMode? newTheme) { + if (newTheme == null) return; + switch (newTheme) { + case ThemeMode.light: + ThemeController.of(context).setThemeMode(ThemeMode.light); + break; + case ThemeMode.dark: + ThemeController.of(context).setThemeMode(ThemeMode.dark); + break; + case ThemeMode.system: + ThemeController.of(context).setThemeMode(ThemeMode.system); + break; + } + setState(() {}); + } + + void changeFontSizeFactor(double d) { + setState(() => AppConfig.fontSizeFactor = d); + Matrix.of(context).store.setString( + SettingKeys.fontSizeFactor, + AppConfig.fontSizeFactor.toString(), + ); + } + + @override + Widget build(BuildContext context) => SettingsStyleView(this); +} diff --git a/lib/pages/settings_style/settings_style_view.dart b/lib/pages/settings_style/settings_style_view.dart new file mode 100644 index 0000000..27663dd --- /dev/null +++ b/lib/pages/settings_style/settings_style_view.dart @@ -0,0 +1,406 @@ +import 'dart:ui'; + +import 'package:fluffychat/widgets/theme_builder.dart'; +import 'package:flutter/material.dart'; + +import 'package:dynamic_color/dynamic_color.dart'; +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/config/setting_keys.dart'; +import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/pages/chat/events/state_message.dart'; +import 'package:fluffychat/utils/account_config.dart'; +import 'package:fluffychat/utils/color_value.dart'; +import 'package:fluffychat/widgets/avatar.dart'; +import 'package:fluffychat/widgets/layouts/max_width_body.dart'; +import 'package:fluffychat/widgets/matrix.dart'; +import 'package:fluffychat/widgets/mxc_image.dart'; +import '../../config/app_config.dart'; +import '../../widgets/settings_switch_list_tile.dart'; +import 'settings_style.dart'; + +class SettingsStyleView extends StatelessWidget { + final SettingsStyleController controller; + + const SettingsStyleView(this.controller, {super.key}); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + const colorPickerSize = 32.0; + final client = Matrix.of(context).client; + return Scaffold( + appBar: AppBar( + automaticallyImplyLeading: !FluffyThemes.isColumnMode(context), + centerTitle: FluffyThemes.isColumnMode(context), + title: Text(L10n.of(context).changeTheme), + ), + backgroundColor: theme.colorScheme.surface, + body: MaxWidthBody( + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Padding( + padding: const EdgeInsets.all(12.0), + child: SegmentedButton( + selected: {controller.currentTheme}, + onSelectionChanged: (selected) => + controller.switchTheme(selected.single), + segments: [ + ButtonSegment( + value: ThemeMode.light, + label: Text(L10n.of(context).lightTheme), + icon: const Icon(Icons.light_mode_outlined), + ), + ButtonSegment( + value: ThemeMode.dark, + label: Text(L10n.of(context).darkTheme), + icon: const Icon(Icons.dark_mode_outlined), + ), + ButtonSegment( + value: ThemeMode.system, + label: Text(L10n.of(context).systemTheme), + icon: const Icon(Icons.auto_mode_outlined), + ), + ], + ), + ), + SettingsSwitchListTile.adaptive( + title: L10n.of(context).pureBlackToggle, + onChanged: (b) => ThemeController.of(context).setPureBlack(b), + storeKey: SettingKeys.pureBlack, + defaultValue: ThemeController.of(context).pureBlack, + ), + Divider( + color: theme.dividerColor, + ), + ListTile( + title: Text( + L10n.of(context).setColorTheme, + style: TextStyle( + color: theme.colorScheme.secondary, + fontWeight: FontWeight.bold, + ), + ), + ), + DynamicColorBuilder( + builder: (light, dark) { + final systemColor = + Theme.of(context).brightness == Brightness.light + ? light?.primary + : dark?.primary; + final colors = + List.from(SettingsStyleController.customColors); + if (systemColor == null) { + colors.remove(null); + } + return GridView.builder( + shrinkWrap: true, + gridDelegate: const SliverGridDelegateWithMaxCrossAxisExtent( + maxCrossAxisExtent: 64, + ), + itemCount: colors.length, + itemBuilder: (context, i) { + final color = colors[i]; + return Padding( + padding: const EdgeInsets.all(12.0), + child: Tooltip( + message: color == null + ? L10n.of(context).systemTheme + : '#${color.hexValue.toRadixString(16).toUpperCase()}', + child: InkWell( + borderRadius: BorderRadius.circular(colorPickerSize), + onTap: () => controller.setChatColor(color), + child: Material( + color: color ?? systemColor, + elevation: 6, + borderRadius: + BorderRadius.circular(colorPickerSize), + child: SizedBox( + width: colorPickerSize, + height: colorPickerSize, + child: controller.currentColor == color + ? Center( + child: Icon( + Icons.check, + size: 16, + color: Theme.of(context) + .colorScheme + .onPrimary, + ), + ) + : null, + ), + ), + ), + ), + ); + }, + ); + }, + ), + Divider( + color: theme.dividerColor, + ), + ListTile( + title: Text( + L10n.of(context).messagesStyle, + style: TextStyle( + color: theme.colorScheme.secondary, + fontWeight: FontWeight.bold, + ), + ), + ), + StreamBuilder( + stream: client.onSync.stream.where( + (syncUpdate) => + syncUpdate.accountData?.any( + (accountData) => + accountData.type == + ApplicationAccountConfigExtension.accountDataKey, + ) ?? + false, + ), + builder: (context, snapshot) { + final accountConfig = client.applicationAccountConfig; + + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + AnimatedContainer( + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + decoration: const BoxDecoration(), + clipBehavior: Clip.hardEdge, + child: Stack( + alignment: Alignment.center, + children: [ + if (accountConfig.wallpaperUrl != null) + Opacity( + opacity: controller.wallpaperOpacity, + child: ImageFiltered( + imageFilter: ImageFilter.blur( + sigmaX: controller.wallpaperBlur, + sigmaY: controller.wallpaperBlur, + ), + child: MxcImage( + key: ValueKey(accountConfig.wallpaperUrl), + uri: accountConfig.wallpaperUrl, + fit: BoxFit.cover, + isThumbnail: true, + width: FluffyThemes.columnWidth * 2, + height: 212, + ), + ), + ), + Column( + mainAxisSize: MainAxisSize.min, + children: [ + const SizedBox(height: 16), + StateMessage( + Event( + eventId: 'style_dummy', + room: + Room(id: '!style_dummy', client: client), + content: {'membership': 'join'}, + type: EventTypes.RoomMember, + senderId: client.userID!, + originServerTs: DateTime.now(), + stateKey: client.userID!, + ), + ), + Padding( + padding: EdgeInsets.only( + left: 12 + 12 + Avatar.defaultSize, + right: 12, + top: accountConfig.wallpaperUrl == null + ? 0 + : 12, + bottom: 12, + ), + child: DecoratedBox( + decoration: BoxDecoration( + color: theme.bubbleColor, + borderRadius: BorderRadius.circular( + AppConfig.borderRadius, + ), + ), + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 8, + ), + child: Text( + 'Рассказать шутку?', + style: TextStyle( + color: theme.onBubbleColor, + fontSize: AppConfig.messageFontSize * + AppConfig.fontSizeFactor, + ), + ), + ), + ), + ), + Align( + alignment: Alignment.centerLeft, + child: Padding( + padding: EdgeInsets.only( + right: 12, + left: 12, + top: accountConfig.wallpaperUrl == null + ? 0 + : 12, + bottom: 12, + ), + child: Material( + color: + theme.colorScheme.surfaceContainerHigh, + borderRadius: BorderRadius.circular( + AppConfig.borderRadius, + ), + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 8, + ), + child: Text( + 'Давай', + style: TextStyle( + color: theme.colorScheme.onSurface, + fontSize: AppConfig.messageFontSize * + AppConfig.fontSizeFactor, + ), + ), + ), + ), + ), + ), + Padding( + padding: EdgeInsets.only( + left: 12 + 12 + Avatar.defaultSize, + right: 12, + top: accountConfig.wallpaperUrl == null + ? 0 + : 12, + bottom: 12, + ), + child: DecoratedBox( + decoration: BoxDecoration( + color: theme.bubbleColor, + borderRadius: BorderRadius.circular( + AppConfig.borderRadius, + ), + ), + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 8, + ), + child: Text( + 'Видит заяц как лиса кушает помидор. Он спрашивает: "лиса, а что это ты кушаешь?", она отвечает - помидор.\nЗаяц просит: "А можно мне тоже?", на что лиса отвечает "Нет, но в той стороне медведь раздаёт помидоры.".\nЗаяц поскакал куда лиса указала, а чтобы не забыть, всю дорогу говорил "помидор". Вдруг, он упал и забыл это слово.\n"Как там было..." - подумал заяц, и вспомнил: "А, точно, поморда!"\nЗаяц допрыгивает до того места, и спрашивает медведя: "Медведь, а можно мне поморда?".\nНу и медведь шарахнул битой ему по физиономии.', + style: TextStyle( + color: theme.onBubbleColor, + fontSize: AppConfig.messageFontSize * + AppConfig.fontSizeFactor, + ), + ), + ), + ), + ), + ], + ), + ], + ), + ), + Divider( + color: theme.dividerColor, + ), + ListTile( + title: TextButton.icon( + style: TextButton.styleFrom( + backgroundColor: theme.colorScheme.secondaryContainer, + foregroundColor: + theme.colorScheme.onSecondaryContainer, + ), + onPressed: controller.setWallpaper, + icon: const Icon(Icons.edit_outlined), + label: Text(L10n.of(context).setWallpaper), + ), + trailing: accountConfig.wallpaperUrl == null + ? null + : IconButton( + icon: const Icon(Icons.delete_outlined), + color: theme.colorScheme.error, + onPressed: controller.deleteChatWallpaper, + ), + ), + if (accountConfig.wallpaperUrl != null) ...[ + ListTile(title: Text(L10n.of(context).opacity)), + Slider.adaptive( + min: 0.1, + max: 1.0, + divisions: 9, + semanticFormatterCallback: (d) => d.toString(), + value: controller.wallpaperOpacity, + onChanged: controller.updateWallpaperOpacity, + onChangeEnd: controller.saveWallpaperOpacity, + ), + ListTile(title: Text(L10n.of(context).blur)), + Slider.adaptive( + min: 0.0, + max: 10.0, + divisions: 10, + semanticFormatterCallback: (d) => d.toString(), + value: controller.wallpaperBlur, + onChanged: controller.updateWallpaperBlur, + onChangeEnd: controller.saveWallpaperBlur, + ), + ], + ], + ); + }, + ), + ListTile( + title: Text(L10n.of(context).fontSize), + trailing: Text('× ${AppConfig.fontSizeFactor}'), + ), + Slider.adaptive( + min: 0.5, + max: 2.5, + divisions: 20, + value: AppConfig.fontSizeFactor, + semanticFormatterCallback: (d) => d.toString(), + onChanged: controller.changeFontSizeFactor, + ), + Divider( + color: theme.dividerColor, + ), + ListTile( + title: Text( + L10n.of(context).overview, + style: TextStyle( + color: theme.colorScheme.secondary, + fontWeight: FontWeight.bold, + ), + ), + ), + SettingsSwitchListTile.adaptive( + title: L10n.of(context).presencesToggle, + onChanged: (b) => AppConfig.showPresences = b, + storeKey: SettingKeys.showPresences, + defaultValue: AppConfig.showPresences, + ), + SettingsSwitchListTile.adaptive( + title: L10n.of(context).separateChatTypes, + onChanged: (b) => AppConfig.separateChatTypes = b, + storeKey: SettingKeys.separateChatTypes, + defaultValue: AppConfig.separateChatTypes, + ), + ], + ), + ), + ); + } +} diff --git a/lib/utils/account_bundles.dart b/lib/utils/account_bundles.dart new file mode 100644 index 0000000..8bd296e --- /dev/null +++ b/lib/utils/account_bundles.dart @@ -0,0 +1,102 @@ +import 'package:matrix/matrix.dart'; + +class AccountBundles { + String? prefix; + List? bundles; + + AccountBundles({this.prefix, this.bundles}); + + AccountBundles.fromJson(Map json) + : prefix = json.tryGet('prefix'), + bundles = json['bundles'] is List + ? json['bundles'] + .map((b) { + try { + return AccountBundle.fromJson(b); + } catch (_) { + return null; + } + }) + .whereType() + .toList() + : null; + + Map toJson() => { + if (prefix != null) 'prefix': prefix, + if (bundles != null) + 'bundles': bundles!.map((v) => v.toJson()).toList(), + }; +} + +class AccountBundle { + String? name; + int? priority; + + AccountBundle({this.name, this.priority}); + + AccountBundle.fromJson(Map json) + : name = json.tryGet('name'), + priority = json.tryGet('priority'); + + Map toJson() => { + if (name != null) 'name': name, + if (priority != null) 'priority': priority, + }; +} + +const accountBundlesType = 'im.fluffychat.account_bundles'; + +extension AccountBundlesExtension on Client { + List get accountBundles { + List? ret; + if (accountData.containsKey(accountBundlesType)) { + ret = AccountBundles.fromJson(accountData[accountBundlesType]!.content) + .bundles; + } + ret ??= []; + if (ret.isEmpty) { + ret.add( + AccountBundle( + name: userID, + priority: 0, + ), + ); + } + return ret; + } + + Future setAccountBundle(String name, [int? priority]) async { + final data = + AccountBundles.fromJson(accountData[accountBundlesType]?.content ?? {}); + var foundBundle = false; + final bundles = data.bundles ??= []; + for (final bundle in bundles) { + if (bundle.name == name) { + bundle.priority = priority; + foundBundle = true; + break; + } + } + if (!foundBundle) { + bundles.add(AccountBundle(name: name, priority: priority)); + } + await setAccountData(userID!, accountBundlesType, data.toJson()); + } + + Future removeFromAccountBundle(String name) async { + if (!accountData.containsKey(accountBundlesType)) { + return; // nothing to do + } + final data = + AccountBundles.fromJson(accountData[accountBundlesType]!.content); + if (data.bundles == null) return; + data.bundles!.removeWhere((b) => b.name == name); + await setAccountData(userID!, accountBundlesType, data.toJson()); + } + + String get sendPrefix { + final data = + AccountBundles.fromJson(accountData[accountBundlesType]?.content ?? {}); + return data.prefix!; + } +} diff --git a/lib/utils/account_config.dart b/lib/utils/account_config.dart new file mode 100644 index 0000000..a5e2dfd --- /dev/null +++ b/lib/utils/account_config.dart @@ -0,0 +1,70 @@ +import 'package:matrix/matrix.dart'; + +extension ApplicationAccountConfigExtension on Client { + static const String accountDataKey = 'im.fluffychat.account_config'; + + ApplicationAccountConfig get applicationAccountConfig => + ApplicationAccountConfig.fromJson( + accountData[accountDataKey]?.content ?? {}, + ); + + Future setApplicationAccountConfig( + ApplicationAccountConfig config, + ) => + setAccountData( + userID!, + accountDataKey, + config.toJson(), + ); + + /// Only updates the specified values in ApplicationAccountConfig + Future updateApplicationAccountConfig( + ApplicationAccountConfig config, + ) { + final currentConfig = applicationAccountConfig; + return setAccountData( + userID!, + accountDataKey, + ApplicationAccountConfig( + wallpaperUrl: config.wallpaperUrl ?? currentConfig.wallpaperUrl, + wallpaperOpacity: + config.wallpaperOpacity ?? currentConfig.wallpaperOpacity, + wallpaperBlur: config.wallpaperBlur ?? currentConfig.wallpaperBlur, + ).toJson(), + ); + } +} + +class ApplicationAccountConfig { + final Uri? wallpaperUrl; + final double? wallpaperOpacity; + final double? wallpaperBlur; + + const ApplicationAccountConfig({ + this.wallpaperUrl, + this.wallpaperOpacity, + this.wallpaperBlur, + }); + + static double _sanitizedOpacity(double? opacity) { + if (opacity == null) return 1; + if (opacity > 1 || opacity < 0) return 1; + return opacity; + } + + factory ApplicationAccountConfig.fromJson(Map json) => + ApplicationAccountConfig( + wallpaperUrl: json['wallpaper_url'] is String + ? Uri.tryParse(json['wallpaper_url']) + : null, + wallpaperOpacity: + _sanitizedOpacity(json.tryGet('wallpaper_opacity')), + wallpaperBlur: json.tryGet('wallpaper_blur'), + ); + + Map toJson() => { + 'wallpaper_url': wallpaperUrl?.toString(), + 'wallpaper_opacity': wallpaperOpacity, + 'wallpaper_blur': wallpaperBlur, + }; +} diff --git a/lib/utils/adaptive_bottom_sheet.dart b/lib/utils/adaptive_bottom_sheet.dart new file mode 100644 index 0000000..faa7f5c --- /dev/null +++ b/lib/utils/adaptive_bottom_sheet.dart @@ -0,0 +1,63 @@ +import 'dart:math'; + +import 'package:flutter/material.dart'; + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/config/themes.dart'; + +Future showAdaptiveBottomSheet({ + required BuildContext context, + required Widget Function(BuildContext) builder, + bool isDismissible = true, + bool isScrollControlled = true, + bool useRootNavigator = true, +}) { + if (FluffyThemes.isColumnMode(context)) { + return showDialog( + context: context, + useRootNavigator: useRootNavigator, + barrierDismissible: isDismissible, + useSafeArea: true, + builder: (context) => Center( + child: Container( + margin: const EdgeInsets.all(16), + constraints: const BoxConstraints( + maxWidth: 480, + maxHeight: 720, + ), + child: Material( + elevation: Theme.of(context).dialogTheme.elevation ?? 4, + shadowColor: Theme.of(context).dialogTheme.shadowColor, + borderRadius: BorderRadius.circular(AppConfig.borderRadius), + color: Theme.of(context).scaffoldBackgroundColor, + clipBehavior: Clip.hardEdge, + child: builder(context), + ), + ), + ), + ); + } + + return showModalBottomSheet( + context: context, + builder: (context) => Padding( + padding: EdgeInsets.zero, + child: ClipRRect( + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(AppConfig.borderRadius / 2), + topRight: Radius.circular(AppConfig.borderRadius / 2), + ), + child: builder(context), + ), + ), + useRootNavigator: useRootNavigator, + isDismissible: isDismissible, + isScrollControlled: isScrollControlled, + constraints: BoxConstraints( + maxHeight: min(MediaQuery.of(context).size.height - 32, 600), + maxWidth: FluffyThemes.columnWidth * 1.25, + ), + backgroundColor: Colors.transparent, + clipBehavior: Clip.hardEdge, + ); +} diff --git a/lib/utils/background_push.dart b/lib/utils/background_push.dart new file mode 100644 index 0000000..3a47eae --- /dev/null +++ b/lib/utils/background_push.dart @@ -0,0 +1,474 @@ +/* + * Famedly + * Copyright (C) 2020, 2021 Famedly GmbH + * Copyright (C) 2021 Fluffychat + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import 'dart:async'; +import 'dart:convert'; +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:flutter_local_notifications/flutter_local_notifications.dart'; +import 'package:flutter_new_badger/flutter_new_badger.dart'; +import 'package:http/http.dart' as http; +import 'package:matrix/matrix.dart'; +import 'package:unifiedpush/unifiedpush.dart'; +import 'package:unifiedpush_ui/unifiedpush_ui.dart'; + +import 'package:fluffychat/utils/push_helper.dart'; +import 'package:fluffychat/widgets/fluffy_chat_app.dart'; +import '../config/app_config.dart'; +import '../config/setting_keys.dart'; +import '../widgets/matrix.dart'; +import 'platform_infos.dart'; + +//import 'package:fcm_shared_isolate/fcm_shared_isolate.dart'; + +class NoTokenException implements Exception { + String get cause => 'Cannot get firebase token'; +} + +class BackgroundPush { + static BackgroundPush? _instance; + final FlutterLocalNotificationsPlugin _flutterLocalNotificationsPlugin = + FlutterLocalNotificationsPlugin(); + Client client; + MatrixState? matrix; + String? _fcmToken; + void Function(String errorMsg, {Uri? link})? onFcmError; + L10n? l10n; + + Future loadLocale() async { + final context = matrix?.context; + // inspired by _lookupL10n in .dart_tool/flutter_gen/gen_l10n/l10n.dart + l10n ??= (context != null ? L10n.of(context) : null) ?? + (await L10n.delegate.load(PlatformDispatcher.instance.locale)); + } + + final pendingTests = >{}; + + final dynamic firebase = null; //FcmSharedIsolate(); + + DateTime? lastReceivedPush; + + bool upAction = false; + + void _init() async { + try { + await _flutterLocalNotificationsPlugin.initialize( + const InitializationSettings( + android: AndroidInitializationSettings('notifications_icon'), + iOS: DarwinInitializationSettings(), + ), + onDidReceiveNotificationResponse: goToRoom, + ); + Logs().v('Flutter Local Notifications initialized'); + firebase?.setListeners( + onMessage: (message) => pushHelper( + PushNotification.fromJson( + Map.from(message['data'] ?? message), + ), + client: client, + l10n: l10n, + activeRoomId: matrix?.activeRoomId, + flutterLocalNotificationsPlugin: _flutterLocalNotificationsPlugin, + ), + ); + if (Platform.isAndroid) { + await UnifiedPush.initialize( + onNewEndpoint: _newUpEndpoint, + onRegistrationFailed: _upUnregistered, + onUnregistered: _upUnregistered, + onMessage: _onUpMessage, + ); + } + } catch (e, s) { + Logs().e('Unable to initialize Flutter local notifications', e, s); + } + } + + BackgroundPush._(this.client) { + _init(); + } + + factory BackgroundPush.clientOnly(Client client) { + return _instance ??= BackgroundPush._(client); + } + + factory BackgroundPush( + MatrixState matrix, { + final void Function(String errorMsg, {Uri? link})? onFcmError, + }) { + final instance = BackgroundPush.clientOnly(matrix.client); + instance.matrix = matrix; + // ignore: prefer_initializing_formals + instance.onFcmError = onFcmError; + return instance; + } + + Future cancelNotification(String roomId) async { + Logs().v('Cancel notification for room', roomId); + await _flutterLocalNotificationsPlugin.cancel(roomId.hashCode); + + // Workaround for app icon badge not updating + if (Platform.isIOS) { + final unreadCount = client.rooms + .where((room) => room.isUnreadOrInvited && room.id != roomId) + .length; + if (unreadCount == 0) { + FlutterNewBadger.removeBadge(); + } else { + FlutterNewBadger.setBadge(unreadCount); + } + return; + } + } + + Future setupPusher({ + String? gatewayUrl, + String? token, + Set? oldTokens, + bool useDeviceSpecificAppId = false, + }) async { + if (PlatformInfos.isIOS) { + await firebase?.requestPermission(); + } + if (PlatformInfos.isAndroid) { + _flutterLocalNotificationsPlugin + .resolvePlatformSpecificImplementation< + AndroidFlutterLocalNotificationsPlugin>() + ?.requestNotificationsPermission(); + } + final clientName = PlatformInfos.clientName; + oldTokens ??= {}; + final pushers = await (client.getPushers().catchError((e) { + Logs().w('[Push] Unable to request pushers', e); + return []; + })) ?? + []; + var setNewPusher = false; + // Just the plain app id, we add the .data_message suffix later + var appId = AppConfig.pushNotificationsAppId; + // we need the deviceAppId to remove potential legacy UP pusher + var deviceAppId = '$appId.${client.deviceID}'; + // appId may only be up to 64 chars as per spec + if (deviceAppId.length > 64) { + deviceAppId = deviceAppId.substring(0, 64); + } + if (!useDeviceSpecificAppId && PlatformInfos.isAndroid) { + appId += '.data_message'; + } + final thisAppId = useDeviceSpecificAppId ? deviceAppId : appId; + if (gatewayUrl != null && token != null) { + final currentPushers = pushers.where((pusher) => pusher.pushkey == token); + if (currentPushers.length == 1 && + currentPushers.first.kind == 'http' && + currentPushers.first.appId == thisAppId && + currentPushers.first.appDisplayName == clientName && + currentPushers.first.deviceDisplayName == client.deviceName && + currentPushers.first.lang == 'en' && + currentPushers.first.data.url.toString() == gatewayUrl && + currentPushers.first.data.format == + AppSettings.pushNotificationsPusherFormat + .getItem(matrix!.store) && + mapEquals( + currentPushers.single.data.additionalProperties, + {"data_message": pusherDataMessageFormat}, + )) { + Logs().i('[Push] Pusher already set'); + } else { + Logs().i('Need to set new pusher'); + oldTokens.add(token); + if (client.isLogged()) { + setNewPusher = true; + } + } + } else { + Logs().w('[Push] Missing required push credentials'); + } + for (final pusher in pushers) { + if ((token != null && + pusher.pushkey != token && + deviceAppId == pusher.appId) || + oldTokens.contains(pusher.pushkey)) { + try { + await client.deletePusher(pusher); + Logs().i('[Push] Removed legacy pusher for this device'); + } catch (err) { + Logs().w('[Push] Failed to remove old pusher', err); + } + } + } + if (setNewPusher) { + try { + await client.postPusher( + Pusher( + pushkey: token!, + appId: thisAppId, + appDisplayName: clientName, + deviceDisplayName: client.deviceName!, + lang: 'en', + data: PusherData( + url: Uri.parse(gatewayUrl!), + format: AppSettings.pushNotificationsPusherFormat + .getItem(matrix!.store), + additionalProperties: {"data_message": pusherDataMessageFormat}, + ), + kind: 'http', + ), + append: false, + ); + } catch (e, s) { + Logs().e('[Push] Unable to set pushers', e, s); + } + } + } + + final pusherDataMessageFormat = Platform.isAndroid + ? 'android' + : Platform.isIOS + ? 'ios' + : null; + + static bool _wentToRoomOnStartup = false; + + Future setupPush() async { + Logs().d("SetupPush"); + if (client.onLoginStateChanged.value != LoginState.loggedIn || + !PlatformInfos.isMobile || + matrix == null) { + return; + } + // Do not setup unifiedpush if this has been initialized by + // an unifiedpush action + if (upAction) { + return; + } + if (!PlatformInfos.isIOS && + (await UnifiedPush.getDistributors()).isNotEmpty) { + await setupUp(); + } else { + await setupFirebase(); + } + + // ignore: unawaited_futures + _flutterLocalNotificationsPlugin + .getNotificationAppLaunchDetails() + .then((details) { + if (details == null || + !details.didNotificationLaunchApp || + _wentToRoomOnStartup) { + return; + } + _wentToRoomOnStartup = true; + goToRoom(details.notificationResponse); + }); + } + + Future _noFcmWarning() async { + if (matrix == null) { + return; + } + if ((matrix?.store.getBool(SettingKeys.showNoGoogle) ?? false) == true) { + return; + } + await loadLocale(); + WidgetsBinding.instance.addPostFrameCallback((_) { + if (PlatformInfos.isAndroid) { + onFcmError?.call( + l10n!.noGoogleServicesWarning, + link: Uri.parse( + AppConfig.enablePushTutorial, + ), + ); + return; + } + onFcmError?.call(l10n!.oopsPushError); + }); + } + + Future setupFirebase() async { + Logs().v('Setup firebase'); + if (_fcmToken?.isEmpty ?? true) { + try { + _fcmToken = await firebase?.getToken(); + if (_fcmToken == null) throw ('PushToken is null'); + } catch (e, s) { + Logs().w('[Push] cannot get token', e, e is String ? null : s); + await _noFcmWarning(); + return; + } + } + await setupPusher( + gatewayUrl: + AppSettings.pushNotificationsGatewayUrl.getItem(matrix!.store), + token: _fcmToken, + ); + } + + Future goToRoom(NotificationResponse? response) async { + try { + if (response?.payload == null) return; + final arr = response?.payload?.split(' '); + final roomId = arr?[0]; + final eventId = arr?[1]; + Logs().v('[Push] Attempting to go to room $roomId...'); + if (roomId == null || eventId == null) { + return; + } + await client.roomsLoading; + await client.accountDataLoading; + if (client.getRoomById(roomId) == null) { + await client + .waitForRoomInSync(roomId) + .timeout(const Duration(seconds: 30)); + } + if (response?.actionId == "read") { + if (AppConfig.sendPublicReadReceipts) { + await client.setReadMarker(roomId, mRead: eventId); + } else { + await client.setReadMarker(roomId, mReadPrivate: eventId); + } + return; + } else if (response?.actionId == "reply") { + final replyText = response?.input; + final room = client.getRoomById(roomId); + if (replyText != null && room != null) { + await room.sendTextEvent(replyText, inReplyTo: await room.getEventById(eventId)); + } + return; + } + FluffyChatApp.router.go( + client.getRoomById(roomId)?.membership == Membership.invite + ? '/rooms' + : '/rooms/$roomId', + ); + } catch (e, s) { + Logs().e('[Push] Failed to open room', e, s); + } + } + + Future setupUp() async { + await UnifiedPushUi(matrix!.context, ["default"], UPFunctions()) + .registerAppWithDialog(); + } + + Future _newUpEndpoint(String newEndpoint, String i) async { + upAction = true; + if (newEndpoint.isEmpty) { + await _upUnregistered(i); + return; + } + var endpoint = + 'https://matrix.gateway.unifiedpush.org/_matrix/push/v1/notify'; + try { + final url = Uri.parse(newEndpoint) + .replace( + path: '/_matrix/push/v1/notify', + query: '', + ) + .toString() + .split('?') + .first; + final res = + json.decode(utf8.decode((await http.get(Uri.parse(url))).bodyBytes)); + if (res['gateway'] == 'matrix' || + (res['unifiedpush'] is Map && + res['unifiedpush']['gateway'] == 'matrix')) { + endpoint = url; + } + } catch (e) { + Logs().i( + '[Push] No self-hosted unified push gateway present: $newEndpoint', + ); + } + Logs().i('[Push] UnifiedPush using endpoint $endpoint'); + final oldTokens = {}; + try { + final fcmToken = await firebase?.getToken(); + oldTokens.add(fcmToken); + } catch (_) {} + await setupPusher( + gatewayUrl: endpoint, + token: newEndpoint, + oldTokens: oldTokens, + useDeviceSpecificAppId: true, + ); + await matrix?.store.setString(SettingKeys.unifiedPushEndpoint, newEndpoint); + await matrix?.store.setBool(SettingKeys.unifiedPushRegistered, true); + } + + Future _upUnregistered(String i) async { + upAction = true; + Logs().i('[Push] Removing UnifiedPush endpoint...'); + final oldEndpoint = + matrix?.store.getString(SettingKeys.unifiedPushEndpoint); + await matrix?.store.setBool(SettingKeys.unifiedPushRegistered, false); + await matrix?.store.remove(SettingKeys.unifiedPushEndpoint); + if (oldEndpoint?.isNotEmpty ?? false) { + // remove the old pusher + await setupPusher( + oldTokens: {oldEndpoint}, + ); + } + } + + Future _onUpMessage(Uint8List message, String i) async { + upAction = true; + final data = Map.from( + json.decode(utf8.decode(message))['notification'], + ); + // UP may strip the devices list + data['devices'] ??= []; + await pushHelper( + PushNotification.fromJson(data), + client: client, + l10n: l10n, + activeRoomId: matrix?.activeRoomId, + flutterLocalNotificationsPlugin: _flutterLocalNotificationsPlugin, + ); + } +} + +class UPFunctions extends UnifiedPushFunctions { + final List features = [ + /*list of features*/ + ]; + + @override + Future getDistributor() async { + return await UnifiedPush.getDistributor(); + } + + @override + Future> getDistributors() async { + return await UnifiedPush.getDistributors(features); + } + + @override + Future registerApp(String instance) async { + await UnifiedPush.registerApp(instance, features); + } + + @override + Future saveDistributor(String distributor) async { + await UnifiedPush.saveDistributor(distributor); + } +} diff --git a/lib/utils/beautify_string_extension.dart b/lib/utils/beautify_string_extension.dart new file mode 100644 index 0000000..3e01fb7 --- /dev/null +++ b/lib/utils/beautify_string_extension.dart @@ -0,0 +1,15 @@ +extension BeautifyStringExtension on String { + String get beautified { + var beautifiedStr = ''; + for (var i = 0; i < length; i++) { + beautifiedStr += substring(i, i + 1); + if (i % 4 == 3) { + beautifiedStr += ' '; + } + if (i % 16 == 15) { + beautifiedStr += '\n'; + } + } + return beautifiedStr; + } +} diff --git a/lib/utils/client_download_content_extension.dart b/lib/utils/client_download_content_extension.dart new file mode 100644 index 0000000..6738398 --- /dev/null +++ b/lib/utils/client_download_content_extension.dart @@ -0,0 +1,62 @@ +import 'dart:typed_data'; + +import 'package:image/image.dart'; +import 'package:matrix/matrix.dart'; + +extension ClientDownloadContentExtension on Client { + Future downloadMxcCached( + Uri mxc, { + num? width, + num? height, + bool isThumbnail = false, + bool? animated, + ThumbnailMethod? thumbnailMethod, + bool rounded = false, + }) async { + // To stay compatible with previous storeKeys: + final cacheKey = isThumbnail + // ignore: deprecated_member_use + ? mxc.getThumbnail( + this, + width: width, + height: height, + animated: animated, + method: thumbnailMethod!, + ) + : mxc; + + final cachedData = await database?.getFile(cacheKey); + if (cachedData != null) return cachedData; + + final httpUri = isThumbnail + ? await mxc.getThumbnailUri( + this, + width: width, + height: height, + animated: animated, + method: thumbnailMethod, + ) + : await mxc.getDownloadUri(this); + + final response = await httpClient.get( + httpUri, + headers: + accessToken == null ? null : {'authorization': 'Bearer $accessToken'}, + ); + if (response.statusCode != 200) { + throw Exception(); + } + var imageData = response.bodyBytes; + + if (rounded) { + final image = decodeImage(imageData); + if (image != null) { + imageData = encodePng(copyCropCircle(image)); + } + } + + await database?.storeFile(cacheKey, imageData, 0); + + return imageData; + } +} \ No newline at end of file diff --git a/lib/utils/client_manager.dart b/lib/utils/client_manager.dart new file mode 100644 index 0000000..524542d --- /dev/null +++ b/lib/utils/client_manager.dart @@ -0,0 +1,181 @@ +import 'dart:io'; + +import 'package:flutter/foundation.dart'; + +import 'package:collection/collection.dart'; +import 'package:desktop_notifications/desktop_notifications.dart'; +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:flutter_local_notifications/flutter_local_notifications.dart'; +import 'package:hive_flutter/hive_flutter.dart'; +import 'package:matrix/encryption/utils/key_verification.dart'; +import 'package:matrix/matrix.dart'; +import 'package:path_provider/path_provider.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:universal_html/html.dart' as html; + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/config/setting_keys.dart'; +import 'package:fluffychat/utils/custom_http_client.dart'; +import 'package:fluffychat/utils/custom_image_resizer.dart'; +import 'package:fluffychat/utils/init_with_restore.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; +import 'matrix_sdk_extensions/flutter_matrix_dart_sdk_database/builder.dart'; + +abstract class ClientManager { + static const String clientNamespace = 'im.fluffychat.store.clients'; + + static Future> getClients({ + bool initialize = true, + required SharedPreferences store, + }) async { + if (PlatformInfos.isLinux) { + Hive.init((await getApplicationSupportDirectory()).path); + } else { + await Hive.initFlutter(); + } + final clientNames = {}; + try { + final clientNamesList = store.getStringList(clientNamespace) ?? []; + clientNames.addAll(clientNamesList); + } catch (e, s) { + Logs().w('Client names in store are corrupted', e, s); + await store.remove(clientNamespace); + } + if (clientNames.isEmpty) { + clientNames.add(PlatformInfos.clientName); + await store.setStringList(clientNamespace, clientNames.toList()); + } + final clients = + clientNames.map((name) => createClient(name, store)).toList(); + if (initialize) { + await Future.wait( + clients.map( + (client) => client.initWithRestore( + onMigration: () async { + final l10n = await lookupL10n(PlatformDispatcher.instance.locale); + sendInitNotification( + l10n.databaseMigrationTitle, + l10n.databaseMigrationBody, + ); + }, + ).catchError( + (e, s) => Logs().e('Unable to initialize client', e, s), + ), + ), + ); + } + if (clients.length > 1 && clients.any((c) => !c.isLogged())) { + final loggedOutClients = clients.where((c) => !c.isLogged()).toList(); + for (final client in loggedOutClients) { + Logs().w( + 'Multi account is enabled but client ${client.userID} is not logged in. Removing...', + ); + clientNames.remove(client.clientName); + clients.remove(client); + } + await store.setStringList(clientNamespace, clientNames.toList()); + } + return clients; + } + + static Future addClientNameToStore( + String clientName, + SharedPreferences store, + ) async { + final clientNamesList = store.getStringList(clientNamespace) ?? []; + clientNamesList.add(clientName); + await store.setStringList(clientNamespace, clientNamesList); + } + + static Future removeClientNameFromStore( + String clientName, + SharedPreferences store, + ) async { + final clientNamesList = store.getStringList(clientNamespace) ?? []; + clientNamesList.remove(clientName); + await store.setStringList(clientNamespace, clientNamesList); + } + + static NativeImplementations get nativeImplementations => kIsWeb + ? const NativeImplementationsDummy() + : NativeImplementationsIsolate(compute); + + static Client createClient(String clientName, SharedPreferences store) { + final shareKeysWith = AppSettings.shareKeysWith.getItem(store); + + return Client( + clientName, + httpClient: + PlatformInfos.isAndroid ? CustomHttpClient.createHTTPClient() : null, + verificationMethods: { + KeyVerificationMethod.numbers, + if (kIsWeb || PlatformInfos.isMobile || PlatformInfos.isLinux) + KeyVerificationMethod.emoji, + }, + importantStateEvents: { + // To make room emotes work + 'im.ponies.room_emotes', + }, + logLevel: kReleaseMode ? Level.warning : Level.verbose, + databaseBuilder: flutterMatrixSdkDatabaseBuilder, + //legacyDatabaseBuilder: FlutterHiveCollectionsDatabase.databaseBuilder, + supportedLoginTypes: { + AuthenticationTypes.password, + AuthenticationTypes.sso, + }, + nativeImplementations: nativeImplementations, + customImageResizer: PlatformInfos.isMobile ? customImageResizer : null, + defaultNetworkRequestTimeout: const Duration(minutes: 30), + enableDehydratedDevices: true, + shareKeysWith: ShareKeysWith.values + .singleWhereOrNull((share) => share.name == shareKeysWith) ?? + ShareKeysWith.all, + convertLinebreaksInFormatting: false, + ); + } + + static void sendInitNotification(String title, String body) async { + if (kIsWeb) { + html.Notification( + title, + body: body, + ); + return; + } + if (Platform.isLinux) { + await NotificationsClient().notify( + title, + body: body, + appName: AppConfig.applicationName, + hints: [ + NotificationHint.soundName('message-new-instant'), + ], + ); + return; + } + + final flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin(); + + await flutterLocalNotificationsPlugin.initialize( + const InitializationSettings( + android: AndroidInitializationSettings('notifications_icon'), + iOS: DarwinInitializationSettings(), + ), + ); + + flutterLocalNotificationsPlugin.show( + 0, + title, + body, + const NotificationDetails( + android: AndroidNotificationDetails( + 'error_message', + 'Error Messages', + importance: Importance.high, + priority: Priority.max, + ), + iOS: DarwinNotificationDetails(sound: 'notification.caf'), + ), + ); + } +} diff --git a/lib/utils/color_value.dart b/lib/utils/color_value.dart new file mode 100644 index 0000000..4919577 --- /dev/null +++ b/lib/utils/color_value.dart @@ -0,0 +1,14 @@ +import 'package:flutter/widgets.dart'; + +extension ColorValue on Color { + int get hexValue { + return _floatToInt8(a) << 24 | + _floatToInt8(r) << 16 | + _floatToInt8(g) << 8 | + _floatToInt8(b) << 0; + } + + static int _floatToInt8(double x) { + return (x * 255.0).round() & 0xff; + } +} diff --git a/lib/utils/custom_http_client.dart b/lib/utils/custom_http_client.dart new file mode 100644 index 0000000..479e5ed --- /dev/null +++ b/lib/utils/custom_http_client.dart @@ -0,0 +1,30 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:http/http.dart' as http; +import 'package:http/io_client.dart'; + +import 'package:fluffychat/config/isrg_x1.dart'; + +class CustomHttpClient { + static HttpClient customHttpClient(String? cert) { + final context = SecurityContext.defaultContext; + + try { + if (cert != null) { + final bytes = utf8.encode(cert); + context.setTrustedCertificatesBytes(bytes); + } + } on TlsException catch (e) { + if (e.osError != null && + e.osError!.message.contains('CERT_ALREADY_IN_HASH_TABLE')) { + } else { + rethrow; + } + } + + return HttpClient(context: context); + } + + static http.Client createHTTPClient() => IOClient(customHttpClient(ISRG_X1)); +} diff --git a/lib/utils/custom_image_resizer.dart b/lib/utils/custom_image_resizer.dart new file mode 100644 index 0000000..f783d5c --- /dev/null +++ b/lib/utils/custom_image_resizer.dart @@ -0,0 +1,103 @@ +import 'dart:ui'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/painting.dart'; + +import 'package:matrix/matrix.dart'; +import 'package:native_imaging/native_imaging.dart' as native; + +(int, int) _scaleToBox(int width, int height, {required int boxSize}) { + final fit = applyBoxFit( + BoxFit.scaleDown, + Size(width.toDouble(), height.toDouble()), + Size(boxSize.toDouble(), boxSize.toDouble()), + ).destination; + return (fit.width.round(), fit.height.round()); +} + +Future customImageResizer( + MatrixImageFileResizeArguments arguments, +) async { + if (kIsWeb) { + throw UnsupportedError( + 'customImageResizer only supports non-web platforms.', + ); + } + + await native.init(); + + var imageBytes = arguments.bytes; + String? blurhash; + + var originalWidth = 0; + var originalHeight = 0; + var width = 0; + var height = 0; + + try { + // for the other platforms + final dartCodec = await instantiateImageCodec(arguments.bytes); + final frameCount = dartCodec.frameCount; + final dartFrame = await dartCodec.getNextFrame(); + final rgbaData = await dartFrame.image.toByteData(); + if (rgbaData == null) { + return null; + } + final rgba = Uint8List.view( + rgbaData.buffer, + rgbaData.offsetInBytes, + rgbaData.lengthInBytes, + ); + + width = originalWidth = dartFrame.image.width; + height = originalHeight = dartFrame.image.height; + + var nativeImg = native.Image.fromRGBA(width, height, rgba); + + dartFrame.image.dispose(); + dartCodec.dispose(); + + if (arguments.calcBlurhash) { + // scale down image for blurhashing to speed it up + final (blurW, blurH) = _scaleToBox(width, height, boxSize: 100); + final blurhashImg = nativeImg.resample( + blurW, blurH, + // nearest is unsupported... + native.Transform.bilinear, + ); + + blurhash = blurhashImg.toBlurhash(3, 3); + + blurhashImg.free(); + } + + if (frameCount > 1) { + // Don't scale down animated images, since those would lose frames. + nativeImg.free(); + } else { + final max = arguments.maxDimension; + if (width > max || height > max) { + (width, height) = _scaleToBox(width, height, boxSize: max); + + final scaledImg = + nativeImg.resample(width, height, native.Transform.lanczos); + nativeImg.free(); + nativeImg = scaledImg; + } + + imageBytes = await nativeImg.toJpeg(75); + nativeImg.free(); + } + } catch (e, s) { + Logs().e("Could not generate preview", e, s); + } + + return MatrixImageFileResizedResponse( + bytes: imageBytes, + width: width, + height: height, + originalWidth: originalWidth, + originalHeight: originalHeight, + blurhash: blurhash, + ); +} diff --git a/lib/utils/custom_scroll_behaviour.dart b/lib/utils/custom_scroll_behaviour.dart new file mode 100644 index 0000000..ba25e95 --- /dev/null +++ b/lib/utils/custom_scroll_behaviour.dart @@ -0,0 +1,10 @@ +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; + +class CustomScrollBehavior extends MaterialScrollBehavior { + @override + Set get dragDevices => { + PointerDeviceKind.touch, + PointerDeviceKind.trackpad, + }; +} diff --git a/lib/utils/date_time_extension.dart b/lib/utils/date_time_extension.dart new file mode 100644 index 0000000..3bf363c --- /dev/null +++ b/lib/utils/date_time_extension.dart @@ -0,0 +1,79 @@ +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:intl/intl.dart'; + +/// Provides extra functionality for formatting the time. +extension DateTimeExtension on DateTime { + bool operator <(DateTime other) { + return millisecondsSinceEpoch < other.millisecondsSinceEpoch; + } + + bool operator >(DateTime other) { + return millisecondsSinceEpoch > other.millisecondsSinceEpoch; + } + + bool operator >=(DateTime other) { + return millisecondsSinceEpoch >= other.millisecondsSinceEpoch; + } + + bool operator <=(DateTime other) { + return millisecondsSinceEpoch <= other.millisecondsSinceEpoch; + } + + /// Checks if two DateTimes are close enough to belong to the same + /// environment. + bool sameEnvironment(DateTime prevTime) => + difference(prevTime) < const Duration(hours: 1); + + /// Returns a simple time String. + String localizedTimeOfDay(BuildContext context) => + (MediaQuery.alwaysUse24HourFormatOf(context) || + L10n.of(context).alwaysUse24HourFormat == 'true') + ? DateFormat('HH:mm', L10n.of(context).localeName).format(this) + : DateFormat('h:mm a', L10n.of(context).localeName).format(this); + + /// Returns [localizedTimeOfDay()] if the ChatTime is today, the name of the week + /// day if the ChatTime is this week and a date string else. + String localizedTimeShort(BuildContext context) { + final now = DateTime.now(); + + final sameYear = now.year == year; + + final sameDay = sameYear && now.month == month && now.day == day; + + final sameWeek = sameYear && + !sameDay && + now.millisecondsSinceEpoch - millisecondsSinceEpoch < + 1000 * 60 * 60 * 24 * 7; + + if (sameDay) { + return localizedTimeOfDay(context); + } else if (sameWeek) { + return DateFormat.E(Localizations.localeOf(context).languageCode) + .format(this); + } else if (sameYear) { + return DateFormat.MMMd(Localizations.localeOf(context).languageCode) + .format(this); + } + return DateFormat.yMMMd(Localizations.localeOf(context).languageCode) + .format(this); + } + + /// If the DateTime is today, this returns [localizedTimeOfDay()], if not it also + /// shows the date. + /// TODO: Add localization + String localizedTime(BuildContext context) { + final now = DateTime.now(); + + final sameYear = now.year == year; + + final sameDay = sameYear && now.month == month && now.day == day; + + if (sameDay) return localizedTimeOfDay(context); + return L10n.of(context).dateAndTimeOfDay( + localizedTimeShort(context), + localizedTimeOfDay(context), + ); + } +} diff --git a/lib/utils/error_reporter.dart b/lib/utils/error_reporter.dart new file mode 100644 index 0000000..e17b943 --- /dev/null +++ b/lib/utils/error_reporter.dart @@ -0,0 +1,66 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:flutter_highlighter/flutter_highlighter.dart'; +import 'package:flutter_highlighter/themes/shades-of-purple.dart'; +import 'package:matrix/matrix.dart'; +import 'package:url_launcher/url_launcher.dart'; + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/adaptive_dialog_action.dart'; + +class ErrorReporter { + final BuildContext context; + final String? message; + + const ErrorReporter(this.context, [this.message]); + + void onErrorCallback(Object error, [StackTrace? stackTrace]) async { + Logs().e(message ?? 'Error caught', error, stackTrace); + final text = '$error\n${stackTrace ?? ''}'; + await showAdaptiveDialog( + context: context, + builder: (context) => AlertDialog.adaptive( + title: Text(L10n.of(context).reportErrorDescription), + content: SizedBox( + height: 256, + width: 256, + child: SingleChildScrollView( + child: HighlightView( + text, + language: 'sh', + theme: shadesOfPurpleTheme, + ), + ), + ), + actions: [ + AdaptiveDialogAction( + onPressed: () => Navigator.of(context).pop(), + child: Text(L10n.of(context).close), + ), + AdaptiveDialogAction( + onPressed: () => Clipboard.setData( + ClipboardData(text: text), + ), + child: Text(L10n.of(context).copy), + ), + AdaptiveDialogAction( + onPressed: () => launchUrl( + AppConfig.newIssueUrl.resolveUri( + Uri( + queryParameters: { + 'template': 'bug_report.yaml', + 'title': '[BUG]: ${message ?? error.toString()}', + }, + ), + ), + mode: LaunchMode.externalApplication, + ), + child: Text(L10n.of(context).report), + ), + ], + ), + ); + } +} diff --git a/lib/utils/file_description.dart b/lib/utils/file_description.dart new file mode 100644 index 0000000..a616bd3 --- /dev/null +++ b/lib/utils/file_description.dart @@ -0,0 +1,34 @@ +import 'package:matrix/matrix.dart'; + +extension FileDescriptionExtension on Event { + String? get fileDescription { + if (!{ + MessageTypes.File, + MessageTypes.Image, + MessageTypes.Audio, + MessageTypes.Video, + }.contains(messageType)) { + return null; + } + final formattedBody = content.tryGet('formatted_body'); + if (formattedBody != null) return formattedBody; + + final filename = content.tryGet('filename'); + final body = content.tryGet('body'); + if (filename != body && body != null && filename != null) return body; + return null; + } + bool get isRichFileDescription { + if (!{ + MessageTypes.File, + MessageTypes.Image, + MessageTypes.Audio, + MessageTypes.Video, + }.contains(messageType)) { + return false; + } + final formattedBody = content.tryGet('formatted_body'); + if (formattedBody != null) return true; + return false; + } +} diff --git a/lib/utils/file_selector.dart b/lib/utils/file_selector.dart new file mode 100644 index 0000000..8cc5e75 --- /dev/null +++ b/lib/utils/file_selector.dart @@ -0,0 +1,146 @@ +import 'package:flutter/widgets.dart'; + +import 'package:file_picker/file_picker.dart'; +import 'package:file_selector/file_selector.dart'; + +import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/widgets/app_lock.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; + +Future> selectFiles( + BuildContext context, { + String? title, + FileSelectorType type = FileSelectorType.any, + bool allowMultiple = false, +}) async { + if (!PlatformInfos.isLinux) { + final result = await AppLock.of(context).pauseWhile( + showFutureLoadingDialog( + context: context, + future: () => FilePicker.platform.pickFiles( + compressionQuality: 0, + allowMultiple: allowMultiple, + type: type.filePickerType, + allowedExtensions: type.extensions, + ), + ), + ); + return result.result?.xFiles ?? []; + } + + if (allowMultiple) { + return await AppLock.of(context).pauseWhile( + openFiles( + confirmButtonText: title, + acceptedTypeGroups: type.groups, + ), + ); + } + final file = await AppLock.of(context).pauseWhile( + openFile( + confirmButtonText: title, + acceptedTypeGroups: type.groups, + ), + ); + if (file == null) return []; + return [file]; +} + +enum FileSelectorType { + any([], FileType.any, null), + images( + [ + XTypeGroup( + label: 'JPG', + extensions: ['jpg', 'JPG', 'jpeg', 'JPEG'], + ), + XTypeGroup( + label: 'PNGs', + extensions: ['png', 'PNG'], + ), + XTypeGroup( + label: 'WEBP', + extensions: ['WebP', 'WEBP'], + ), + XTypeGroup( + label: 'GIF', + extensions: ['gif', 'GIF'], + ), + XTypeGroup( + label: 'BMP', + extensions: ['bmp', 'BMP'], + ), + XTypeGroup( + label: 'TIFF', + extensions: ['tiff', 'TIFF', 'tif', 'TIF'], + ), + XTypeGroup( + label: 'HEIC', + extensions: ['heic', 'HEIC'], + ), + XTypeGroup( + label: 'SVG', + extensions: ['svg', 'SVG'], + ), + ], + FileType.image, + null, + ), + videos( + [ + XTypeGroup( + label: 'MP4', + extensions: ['mp4', 'MP4'], + ), + XTypeGroup( + label: 'AVI', + extensions: ['avi', 'AVI'], + ), + XTypeGroup( + label: 'MOV', + extensions: ['mov', 'MOV'], + ), + XTypeGroup( + label: 'MKV', + extensions: ['mkv', 'MKV'], + ), + XTypeGroup( + label: 'WMV', + extensions: ['wmv', 'WMV'], + ), + XTypeGroup( + label: 'FLV', + extensions: ['flv', 'FLV'], + ), + XTypeGroup( + label: 'MPEG', + extensions: ['mpeg', 'MPEG'], + ), + XTypeGroup( + label: '3GP', + extensions: ['3gp', '3GP'], + ), + XTypeGroup( + label: 'OGG', + extensions: ['ogg', 'OGG'], + ), + ], + FileType.video, + null, + ), + zip( + [ + XTypeGroup( + label: 'ZIP', + extensions: ['zip', 'ZIP'], + ), + ], + FileType.custom, + ['zip', 'ZIP'], + ); + + const FileSelectorType(this.groups, this.filePickerType, this.extensions); + final List groups; + final FileType filePickerType; + final List? extensions; +} diff --git a/lib/utils/fluffy_share.dart b/lib/utils/fluffy_share.dart new file mode 100644 index 0000000..b31f288 --- /dev/null +++ b/lib/utils/fluffy_share.dart @@ -0,0 +1,44 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:share_plus/share_plus.dart'; + +import 'package:fluffychat/utils/platform_infos.dart'; +import '../widgets/matrix.dart'; + +abstract class FluffyShare { + static Future share( + String text, + BuildContext context, { + bool copyOnly = false, + }) async { + if (PlatformInfos.isMobile && !copyOnly) { + final box = context.findRenderObject() as RenderBox; + await Share.share( + text, + sharePositionOrigin: box.localToGlobal(Offset.zero) & box.size, + ); + return; + } + await Clipboard.setData( + ClipboardData(text: text), + ); + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text(L10n.of(context).copiedToClipboard)), + ); + return; + } + + static Future shareInviteLink(BuildContext context) async { + final client = Matrix.of(context).client; + final ownProfile = await client.fetchOwnProfile(); + await FluffyShare.share( + L10n.of(context).inviteText( + ownProfile.displayName ?? client.userID!, + 'https://matrix.to/#/${client.userID}?client=im.fluffychat', + ), + context, + ); + } +} diff --git a/lib/utils/init_with_restore.dart b/lib/utils/init_with_restore.dart new file mode 100644 index 0000000..c3a6a0d --- /dev/null +++ b/lib/utils/init_with_restore.dart @@ -0,0 +1,148 @@ +import 'dart:convert'; +import 'dart:ui'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:flutter_secure_storage/flutter_secure_storage.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/utils/client_manager.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; + +class SessionBackup { + final String? olmAccount; + final String accessToken; + final String userId; + final String homeserver; + final String? deviceId; + final String? deviceName; + + const SessionBackup({ + required this.olmAccount, + required this.accessToken, + required this.userId, + required this.homeserver, + required this.deviceId, + this.deviceName, + }); + + factory SessionBackup.fromJsonString(String json) => + SessionBackup.fromJson(jsonDecode(json)); + + factory SessionBackup.fromJson(Map json) => SessionBackup( + olmAccount: json['olm_account'], + accessToken: json['access_token'], + userId: json['user_id'], + homeserver: json['homeserver'], + deviceId: json['device_id'], + deviceName: json['device_name'], + ); + + Map toJson() => { + 'olm_account': olmAccount, + 'access_token': accessToken, + 'user_id': userId, + 'homeserver': homeserver, + 'device_id': deviceId, + if (deviceName != null) 'device_name': deviceName, + }; + + @override + String toString() => jsonEncode(toJson()); +} + +extension InitWithRestoreExtension on Client { + static Future deleteSessionBackup(String clientName) async { + final storage = PlatformInfos.isMobile || PlatformInfos.isLinux + ? const FlutterSecureStorage() + : null; + await storage?.delete( + key: '${AppConfig.applicationName}_session_backup_$clientName', + ); + } + + Future initWithRestore({void Function()? onMigration}) async { + final storageKey = + '${AppConfig.applicationName}_session_backup_$clientName'; + final storage = PlatformInfos.isMobile || PlatformInfos.isLinux + ? const FlutterSecureStorage() + : null; + + try { + await init( + onInitStateChanged: (state) { + if (state == InitState.migratingDatabase) onMigration?.call(); + }, + waitForFirstSync: false, + waitUntilLoadCompletedLoaded: false, + ); + if (isLogged()) { + final accessToken = this.accessToken; + final homeserver = this.homeserver?.toString(); + final deviceId = deviceID; + final userId = userID; + final hasBackup = accessToken != null && + homeserver != null && + deviceId != null && + userId != null; + assert(hasBackup); + if (hasBackup) { + Logs().v('Store session in backup'); + storage?.write( + key: storageKey, + value: SessionBackup( + olmAccount: encryption?.pickledOlmAccount, + accessToken: accessToken, + deviceId: deviceId, + homeserver: homeserver, + deviceName: deviceName, + userId: userId, + ).toString(), + ); + } + } + } catch (e, s) { + Logs().wtf('Client init failed!', e, s); + final l10n = await lookupL10n(PlatformDispatcher.instance.locale); + final sessionBackupString = await storage?.read(key: storageKey); + if (sessionBackupString == null) { + ClientManager.sendInitNotification( + l10n.initAppError, + l10n.sessionLostBody(AppConfig.newIssueUrl.toString(), e.toString()), + ); + rethrow; + } + + try { + final sessionBackup = SessionBackup.fromJsonString(sessionBackupString); + await init( + newToken: sessionBackup.accessToken, + newOlmAccount: sessionBackup.olmAccount, + newDeviceID: sessionBackup.deviceId, + newDeviceName: sessionBackup.deviceName, + newHomeserver: Uri.tryParse(sessionBackup.homeserver), + newUserID: sessionBackup.userId, + waitForFirstSync: false, + waitUntilLoadCompletedLoaded: false, + onInitStateChanged: (state) { + if (state == InitState.migratingDatabase) onMigration?.call(); + }, + ); + ClientManager.sendInitNotification( + l10n.initAppError, + l10n.restoreSessionBody( + AppConfig.newIssueUrl.toString(), + e.toString(), + ), + ); + } catch (e, s) { + Logs().wtf('Restore client failed!', e, s); + ClientManager.sendInitNotification( + l10n.initAppError, + l10n.sessionLostBody(AppConfig.newIssueUrl.toString(), e.toString()), + ); + rethrow; + } + } + } +} diff --git a/lib/utils/localized_exception_extension.dart b/lib/utils/localized_exception_extension.dart new file mode 100644 index 0000000..7c4779e --- /dev/null +++ b/lib/utils/localized_exception_extension.dart @@ -0,0 +1,108 @@ +import 'dart:io'; +import 'dart:math'; + +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:http/http.dart'; +import 'package:matrix/encryption.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/utils/other_party_can_receive.dart'; +import 'uia_request_manager.dart'; + +extension LocalizedExceptionExtension on Object { + static String _formatFileSize(int size) { + if (size < 1000) return '$size B'; + final i = (log(size) / log(1000)).floor(); + final num = (size / pow(1000, i)); + final round = num.round(); + final numString = round < 10 + ? num.toStringAsFixed(2) + : round < 100 + ? num.toStringAsFixed(1) + : round.toString(); + return '$numString ${'kMGTPEZY'[i - 1]}B'; + } + + String toLocalizedString( + BuildContext context, [ + ExceptionContext? exceptionContext, + ]) { + if (this is FileTooBigMatrixException) { + final exception = this as FileTooBigMatrixException; + return L10n.of(context).fileIsTooBigForServer( + _formatFileSize(exception.maxFileSize), + ); + } + if (this is OtherPartyCanNotReceiveMessages) { + return L10n.of(context).otherPartyNotLoggedIn; + } + if (this is MatrixException) { + switch ((this as MatrixException).error) { + case MatrixError.M_FORBIDDEN: + if (exceptionContext == ExceptionContext.changePassword) { + return L10n.of(context).passwordIsWrong; + } + return L10n.of(context).noPermission; + case MatrixError.M_LIMIT_EXCEEDED: + return L10n.of(context).tooManyRequestsWarning; + default: + if (exceptionContext == ExceptionContext.joinRoom) { + return L10n.of(context).unableToJoinChat; + } + return (this as MatrixException).errorMessage; + } + } + if (this is InvalidPassphraseException) { + return L10n.of(context).wrongRecoveryKey; + } + if (this is BadServerLoginTypesException) { + final serverVersions = (this as BadServerLoginTypesException) + .serverLoginTypes + .toString() + .replaceAll('{', '"') + .replaceAll('}', '"'); + final supportedVersions = (this as BadServerLoginTypesException) + .supportedLoginTypes + .toString() + .replaceAll('{', '"') + .replaceAll('}', '"'); + return L10n.of(context).badServerLoginTypesException( + serverVersions, + supportedVersions, + supportedVersions, + ); + } + if (this is IOException || + this is SocketException || + this is SyncConnectionException || + this is ClientException) { + return L10n.of(context).noConnectionToTheServer; + } + if (this is FormatException && + exceptionContext == ExceptionContext.checkHomeserver) { + return L10n.of(context).doesNotSeemToBeAValidHomeserver; + } + if (this is FormatException && + exceptionContext == ExceptionContext.checkServerSupportInfo) { + return L10n.of(context).noContactInformationProvided; + } + if (this is String) return toString(); + if (this is UiaException) return toString(); + + if (exceptionContext == ExceptionContext.joinRoom) { + return L10n.of(context).unableToJoinChat; + } + + Logs().w('Something went wrong: ', this); + return L10n.of(context).oopsSomethingWentWrong; + } +} + +enum ExceptionContext { + changePassword, + checkHomeserver, + checkServerSupportInfo, + joinRoom, +} diff --git a/lib/utils/markdown_context_builder.dart b/lib/utils/markdown_context_builder.dart new file mode 100644 index 0000000..e721b34 --- /dev/null +++ b/lib/utils/markdown_context_builder.dart @@ -0,0 +1,97 @@ +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; + +import 'package:fluffychat/widgets/adaptive_dialogs/show_text_input_dialog.dart'; + +Widget markdownContextBuilder( + BuildContext context, + EditableTextState editableTextState, + TextEditingController controller, +) { + final value = editableTextState.textEditingValue; + final selectedText = value.selection.textInside(value.text); + final buttonItems = editableTextState.contextMenuButtonItems; + final l10n = L10n.of(context); + + return AdaptiveTextSelectionToolbar.buttonItems( + anchors: editableTextState.contextMenuAnchors, + buttonItems: [ + ...buttonItems, + if (selectedText.isNotEmpty) ...[ + ContextMenuButtonItem( + label: l10n.link, + onPressed: () async { + final input = await showTextInputDialog( + context: context, + title: l10n.addLink, + okLabel: l10n.ok, + cancelLabel: l10n.cancel, + validator: (text) { + if (text.isEmpty) { + return l10n.pleaseFillOut; + } + try { + text.startsWith('http') ? Uri.parse(text) : Uri.https(text); + } catch (_) { + return l10n.invalidUrl; + } + return null; + }, + hintText: 'www...', + keyboardType: TextInputType.url, + ); + final urlString = input; + if (urlString == null) return; + final url = urlString.startsWith('http') + ? Uri.parse(urlString) + : Uri.https(urlString); + final selection = controller.selection; + controller.text = controller.text.replaceRange( + selection.start, + selection.end, + '[$selectedText](${url.toString()})', + ); + ContextMenuController.removeAny(); + }, + ), + ContextMenuButtonItem( + label: l10n.boldText, + onPressed: () { + final selection = controller.selection; + controller.text = controller.text.replaceRange( + selection.start, + selection.end, + '**$selectedText**', + ); + ContextMenuController.removeAny(); + }, + ), + ContextMenuButtonItem( + label: l10n.italicText, + onPressed: () { + final selection = controller.selection; + controller.text = controller.text.replaceRange( + selection.start, + selection.end, + '*$selectedText*', + ); + ContextMenuController.removeAny(); + }, + ), + ContextMenuButtonItem( + label: l10n.strikeThrough, + onPressed: () { + final selection = controller.selection; + controller.text = controller.text.replaceRange( + selection.start, + selection.end, + '~~$selectedText~~', + ); + ContextMenuController.removeAny(); + }, + ), + ], + ], + ); +} diff --git a/lib/utils/matrix_sdk_extensions/device_extension.dart b/lib/utils/matrix_sdk_extensions/device_extension.dart new file mode 100644 index 0000000..55f3ebf --- /dev/null +++ b/lib/utils/matrix_sdk_extensions/device_extension.dart @@ -0,0 +1,45 @@ +import 'package:flutter/material.dart'; + +import 'package:matrix/matrix.dart'; + +IconData _getIconFromName(String displayname) { + final name = displayname.toLowerCase(); + if ({'android'}.any((s) => name.contains(s))) { + return Icons.phone_android_outlined; + } + if ({'ios', 'ipad', 'iphone', 'ipod'}.any((s) => name.contains(s))) { + return Icons.phone_iphone_outlined; + } + if ({ + 'web', + 'http://', + 'https://', + 'firefox', + 'chrome', + '/_matrix', + 'safari', + 'opera', + }.any((s) => name.contains(s))) { + return Icons.web_outlined; + } + if ({'desktop', 'windows', 'macos', 'linux', 'ubuntu'} + .any((s) => name.contains(s))) { + return Icons.desktop_mac_outlined; + } + return Icons.device_unknown_outlined; +} + +extension DeviceExtension on Device { + String get displayname => + (displayName?.isNotEmpty ?? false) ? displayName! : 'Unknown device'; + + IconData get icon => _getIconFromName(displayname); +} + +extension DeviceKeysExtension on DeviceKeys { + String get displayname => (deviceDisplayName?.isNotEmpty ?? false) + ? deviceDisplayName! + : 'Unknown device'; + + IconData get icon => _getIconFromName(displayname); +} diff --git a/lib/utils/matrix_sdk_extensions/event_extension.dart b/lib/utils/matrix_sdk_extensions/event_extension.dart new file mode 100644 index 0000000..2eb5473 --- /dev/null +++ b/lib/utils/matrix_sdk_extensions/event_extension.dart @@ -0,0 +1,53 @@ +import 'dart:developer'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; + +import 'package:async/async.dart' as async; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/utils/size_string.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import 'matrix_file_extension.dart'; + +extension LocalizedBody on Event { + Future> _getFile(BuildContext context) => + showFutureLoadingDialog( + context: context, + future: downloadAndDecryptAttachment, + ); + + void saveFile(BuildContext context) async { + final matrixFile = await _getFile(context); + + matrixFile.result?.save(context); + } + + void shareFile(BuildContext context) async { + final matrixFile = await _getFile(context); + inspect(matrixFile); + + matrixFile.result?.share(context); + } + + bool get isAttachmentSmallEnough => + infoMap['size'] is int && + infoMap['size'] < room.client.database!.maxFileSize; + + bool get isThumbnailSmallEnough => + thumbnailInfoMap['size'] is int && + thumbnailInfoMap['size'] < room.client.database!.maxFileSize; + + bool get showThumbnail => + [MessageTypes.Image, MessageTypes.Sticker, MessageTypes.Video] + .contains(messageType) && + (kIsWeb || + isAttachmentSmallEnough || + isThumbnailSmallEnough || + (content['url'] is String)); + + String? get sizeString => content + .tryGetMap('info') + ?.tryGet('size') + ?.sizeString; +} diff --git a/lib/utils/matrix_sdk_extensions/filtered_timeline_extension.dart b/lib/utils/matrix_sdk_extensions/filtered_timeline_extension.dart new file mode 100644 index 0000000..76655a6 --- /dev/null +++ b/lib/utils/matrix_sdk_extensions/filtered_timeline_extension.dart @@ -0,0 +1,59 @@ +import 'package:matrix/matrix.dart'; + +import '../../config/app_config.dart'; + +extension VisibleInGuiExtension on List { + List filterByVisibleInGui({String? exceptionEventId}) { + final visibleEvents = + where((e) => e.isVisibleInGui || e.eventId == exceptionEventId) + .toList(); + + // Hide creation state events: + if (visibleEvents.isNotEmpty && + visibleEvents.last.type == EventTypes.RoomCreate) { + var i = visibleEvents.length - 2; + while (i > 0) { + final event = visibleEvents[i]; + if (!event.isState) break; + if (event.type == EventTypes.Encryption) { + i--; + continue; + } + if (event.type == EventTypes.RoomMember && + event.roomMemberChangeType == RoomMemberChangeType.acceptInvite) { + i--; + continue; + } + visibleEvents.removeAt(i); + i--; + } + } + return visibleEvents; + } +} + +extension IsStateExtension on Event { + bool get isVisibleInGui => + // always filter out edit and reaction relationships + !{RelationshipTypes.edit, RelationshipTypes.reaction} + .contains(relationshipType) && + // always filter out m.key.* events + !type.startsWith('m.key.verification.') && + // event types to hide: redaction and reaction events + // if a reaction has been redacted we also want it to be hidden in the timeline + !{EventTypes.Reaction, EventTypes.Redaction}.contains(type) && + // if we enabled to hide all redacted events, don't show those + (!AppConfig.hideRedactedEvents || !redacted) && + // if we enabled to hide all unknown events, don't show those + (!AppConfig.hideUnknownEvents || isEventTypeKnown) && + // remove state events that we don't want to render + (isState || !AppConfig.hideAllStateEvents) && + // hide simple join/leave member events in public rooms + (!AppConfig.hideUnimportantStateEvents || + type != EventTypes.RoomMember || + room.joinRules != JoinRules.public || + content.tryGet('membership') == 'ban' || + stateKey != senderId); + + bool get isState => this.stateKey != null; +} diff --git a/lib/utils/matrix_sdk_extensions/flutter_hive_collections_database.txt b/lib/utils/matrix_sdk_extensions/flutter_hive_collections_database.txt new file mode 100644 index 0000000..9ad5ce5 --- /dev/null +++ b/lib/utils/matrix_sdk_extensions/flutter_hive_collections_database.txt @@ -0,0 +1,149 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:flutter/foundation.dart' hide Key; +import 'package:flutter/services.dart'; + +import 'package:flutter_secure_storage/flutter_secure_storage.dart'; +import 'package:hive/hive.dart'; +import 'package:matrix/matrix.dart'; +import 'package:path_provider/path_provider.dart'; +import 'package:universal_html/html.dart' as html; + +// ignore: deprecated_member_use +class FlutterHiveCollectionsDatabase extends HiveCollectionsDatabase { + FlutterHiveCollectionsDatabase( + super.name, + String super.path, { + super.key, + }); + + static const String _cipherStorageKey = 'hive_encryption_key'; + + static Future databaseBuilder( + Client client, + ) async { + Logs().d('Open Hive...'); + HiveAesCipher? hiverCipher; + try { + // Workaround for secure storage is calling Platform.operatingSystem on web + if (kIsWeb) { + // ignore: unawaited_futures + html.window.navigator.storage?.persist(); + throw MissingPluginException(); + } + + const secureStorage = FlutterSecureStorage(); + final containsEncryptionKey = + await secureStorage.read(key: _cipherStorageKey) != null; + if (!containsEncryptionKey) { + // do not try to create a buggy secure storage for new Linux users + if (Platform.isLinux) throw MissingPluginException(); + final key = Hive.generateSecureKey(); + await secureStorage.write( + key: _cipherStorageKey, + value: base64UrlEncode(key), + ); + } + + // workaround for if we just wrote to the key and it still doesn't exist + final rawEncryptionKey = await secureStorage.read(key: _cipherStorageKey); + if (rawEncryptionKey == null) throw MissingPluginException(); + + hiverCipher = HiveAesCipher(base64Url.decode(rawEncryptionKey)); + } on MissingPluginException catch (_) { + const FlutterSecureStorage() + .delete(key: _cipherStorageKey) + .catchError((_) {}); + Logs().i('Hive encryption is not supported on this platform'); + } catch (e, s) { + const FlutterSecureStorage() + .delete(key: _cipherStorageKey) + .catchError((_) {}); + Logs().w('Unable to init Hive encryption', e, s); + } + + final db = FlutterHiveCollectionsDatabase( + 'hive_collections_${client.clientName.replaceAll(' ', '_').toLowerCase()}', + await findDatabasePath(client), + key: hiverCipher, + ); + try { + await db.open(); + } catch (e, s) { + Logs().w('Unable to open Hive. Delete database and storage key...', e, s); + const FlutterSecureStorage().delete(key: _cipherStorageKey); + await db.clear().catchError((_) {}); + await Hive.deleteFromDisk(); + rethrow; + } + Logs().d('Hive is ready'); + return db; + } + + static Future findDatabasePath(Client client) async { + var path = client.clientName; + if (!kIsWeb) { + Directory directory; + try { + if (Platform.isLinux) { + directory = await getApplicationSupportDirectory(); + } else { + directory = await getApplicationDocumentsDirectory(); + } + } catch (_) { + try { + directory = await getLibraryDirectory(); + } catch (_) { + directory = Directory.current; + } + } + // do not destroy your stable FluffyChat in debug mode + directory = Directory( + directory.uri.resolve(kDebugMode ? 'hive_debug' : 'hive').toFilePath(), + ); + directory.create(recursive: true); + path = directory.path; + } + return path; + } + + @override + int get maxFileSize => supportsFileStoring ? 100 * 1000 * 1000 : 0; + @override + bool get supportsFileStoring => !kIsWeb; + + Future _getFileStoreDirectory() async { + try { + try { + return (await getTemporaryDirectory()).path; + } catch (_) { + return (await getApplicationDocumentsDirectory()).path; + } + } catch (_) { + return (await getDownloadsDirectory())!.path; + } + } + + @override + Future getFile(Uri mxcUri) async { + if (!supportsFileStoring) return null; + final tempDirectory = await _getFileStoreDirectory(); + final file = + File('$tempDirectory/${Uri.encodeComponent(mxcUri.toString())}'); + if (await file.exists() == false) return null; + final bytes = await file.readAsBytes(); + return bytes; + } + + @override + Future storeFile(Uri mxcUri, Uint8List bytes, int time) async { + if (!supportsFileStoring) return null; + final tempDirectory = await _getFileStoreDirectory(); + final file = + File('$tempDirectory/${Uri.encodeComponent(mxcUri.toString())}'); + if (await file.exists()) return; + await file.writeAsBytes(bytes); + return; + } +} diff --git a/lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/builder.dart b/lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/builder.dart new file mode 100644 index 0000000..138d8db --- /dev/null +++ b/lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/builder.dart @@ -0,0 +1,152 @@ +import 'dart:io'; + +import 'package:flutter/foundation.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:matrix/matrix.dart'; +import 'package:path/path.dart'; +import 'package:path_provider/path_provider.dart'; +import 'package:sqflite_common_ffi/sqflite_ffi.dart'; +import 'package:universal_html/html.dart' as html; + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/utils/client_manager.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; +import 'cipher.dart'; + +import 'sqlcipher_stub.dart' + if (dart.library.io) 'package:sqlcipher_flutter_libs/sqlcipher_flutter_libs.dart'; + +Future flutterMatrixSdkDatabaseBuilder(Client client) async { + MatrixSdkDatabase? database; + try { + database = await _constructDatabase(client); + await database.open(); + return database; + } catch (e, s) { + Logs().wtf('Unable to construct database!', e, s); + // Try to delete database so that it can created again on next init: + database?.delete().catchError( + (e, s) => Logs().wtf( + 'Unable to delete database, after failed construction', + e, + s, + ), + ); + + // Delete database file: + if (database == null && !kIsWeb) { + final dbFile = File(await _getDatabasePath(client.clientName)); + if (await dbFile.exists()) await dbFile.delete(); + } + + try { + // Send error notification: + final l10n = await lookupL10n(PlatformDispatcher.instance.locale); + ClientManager.sendInitNotification( + l10n.initAppError, + l10n.databaseBuildErrorBody( + AppConfig.newIssueUrl.toString(), + e.toString(), + ), + ); + } catch (e, s) { + Logs().e('Unable to send error notification', e, s); + } + + database = await _constructDatabase(client); + await database.open(); + return database; + } +} + +Future _constructDatabase(Client client) async { + if (kIsWeb) { + html.window.navigator.storage?.persist(); + return MatrixSdkDatabase(client.clientName); + } + + final cipher = await getDatabaseCipher(); + + Directory? fileStorageLocation; + try { + fileStorageLocation = await getTemporaryDirectory(); + } on MissingPlatformDirectoryException catch (_) { + Logs().w( + 'No temporary directory for file cache available on this platform.', + ); + } + + final path = await _getDatabasePath(client.clientName); + + // fix dlopen for old Android + await applyWorkaroundToOpenSqlCipherOnOldAndroidVersions(); + // import the SQLite / SQLCipher shared objects / dynamic libraries + final factory = + createDatabaseFactoryFfi(ffiInit: SQfLiteEncryptionHelper.ffiInit); + + // migrate from potential previous SQLite database path to current one + await _migrateLegacyLocation(path, client.clientName); + + // required for [getDatabasesPath] + databaseFactory = factory; + + // in case we got a cipher, we use the encryption helper + // to manage SQLite encryption + final helper = cipher == null + ? null + : SQfLiteEncryptionHelper( + factory: factory, + path: path, + cipher: cipher, + ); + + // check whether the DB is already encrypted and otherwise do so + await helper?.ensureDatabaseFileEncrypted(); + + final database = await factory.openDatabase( + path, + options: OpenDatabaseOptions( + version: 1, + // most important : apply encryption when opening the DB + onConfigure: helper?.applyPragmaKey, + ), + ); + + return MatrixSdkDatabase( + client.clientName, + database: database, + maxFileSize: 1000 * 1000 * 10, + fileStorageLocation: fileStorageLocation?.uri, + deleteFilesAfterDuration: const Duration(days: 30), + ); +} + +Future _getDatabasePath(String clientName) async { + final databaseDirectory = PlatformInfos.isIOS || PlatformInfos.isMacOS + ? await getLibraryDirectory() + : await getApplicationSupportDirectory(); + + return join(databaseDirectory.path, '$clientName.sqlite'); +} + +Future _migrateLegacyLocation( + String sqlFilePath, + String clientName, +) async { + final oldPath = PlatformInfos.isDesktop + ? (await getApplicationSupportDirectory()).path + : await getDatabasesPath(); + + final oldFilePath = join(oldPath, clientName); + if (oldFilePath == sqlFilePath) return; + + final maybeOldFile = File(oldFilePath); + if (await maybeOldFile.exists()) { + Logs().i( + 'Migrate legacy location for database from "$oldFilePath" to "$sqlFilePath"', + ); + await maybeOldFile.copy(sqlFilePath); + await maybeOldFile.delete(); + } +} diff --git a/lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/cipher.dart b/lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/cipher.dart new file mode 100644 index 0000000..0dc931f --- /dev/null +++ b/lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/cipher.dart @@ -0,0 +1,67 @@ +import 'dart:convert'; +import 'dart:math'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/services.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:flutter_secure_storage/flutter_secure_storage.dart'; +import 'package:matrix/matrix.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +import 'package:fluffychat/config/setting_keys.dart'; +import 'package:fluffychat/utils/client_manager.dart'; + +const _passwordStorageKey = 'database_password'; + +Future getDatabaseCipher() async { + String? password; + + try { + const secureStorage = FlutterSecureStorage(); + final containsEncryptionKey = + await secureStorage.read(key: _passwordStorageKey) != null; + if (!containsEncryptionKey) { + final rng = Random.secure(); + final list = Uint8List(32); + list.setAll(0, Iterable.generate(list.length, (i) => rng.nextInt(256))); + final newPassword = base64UrlEncode(list); + await secureStorage.write( + key: _passwordStorageKey, + value: newPassword, + ); + } + // workaround for if we just wrote to the key and it still doesn't exist + password = await secureStorage.read(key: _passwordStorageKey); + if (password == null) throw MissingPluginException(); + } on MissingPluginException catch (e) { + const FlutterSecureStorage() + .delete(key: _passwordStorageKey) + .catchError((_) {}); + Logs().w('Database encryption is not supported on this platform', e); + _sendNoEncryptionWarning(e); + } catch (e, s) { + const FlutterSecureStorage() + .delete(key: _passwordStorageKey) + .catchError((_) {}); + Logs().w('Unable to init database encryption', e, s); + _sendNoEncryptionWarning(e); + } + + return password; +} + +void _sendNoEncryptionWarning(Object exception) async { + final store = await SharedPreferences.getInstance(); + final isStored = AppSettings.noEncryptionWarningShown.getItem(store); + + if (isStored == true) return; + + final l10n = await lookupL10n(PlatformDispatcher.instance.locale); + ClientManager.sendInitNotification( + l10n.noDatabaseEncryption, + exception.toString(), + ); + + await AppSettings.noEncryptionWarningShown.setItem(store, true); +} diff --git a/lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/sqlcipher_stub.dart b/lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/sqlcipher_stub.dart new file mode 100644 index 0000000..b0f8b43 --- /dev/null +++ b/lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/sqlcipher_stub.dart @@ -0,0 +1 @@ +Future applyWorkaroundToOpenSqlCipherOnOldAndroidVersions() async {} diff --git a/lib/utils/matrix_sdk_extensions/matrix_file_extension.dart b/lib/utils/matrix_sdk_extensions/matrix_file_extension.dart new file mode 100644 index 0000000..62ee625 --- /dev/null +++ b/lib/utils/matrix_sdk_extensions/matrix_file_extension.dart @@ -0,0 +1,101 @@ +import 'dart:io'; + +import 'package:flutter/material.dart'; + +import 'package:file_picker/file_picker.dart'; +import 'package:file_selector/file_selector.dart'; +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:matrix/matrix.dart'; +import 'package:share_plus/share_plus.dart'; +import 'package:universal_html/html.dart' as html; + +import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/utils/size_string.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; + +extension MatrixFileExtension on MatrixFile { + void save(BuildContext context) async { + if (PlatformInfos.isWeb) { + _webDownload(); + return; + } + + final downloadPath = !PlatformInfos.isMobile + ? (await getSaveLocation( + suggestedName: name, + confirmButtonText: L10n.of(context).saveFile, + )) + ?.path + : await FilePicker.platform.saveFile( + dialogTitle: L10n.of(context).saveFile, + fileName: name, + type: filePickerFileType, + bytes: bytes, + ); + if (downloadPath == null) return; + + if (PlatformInfos.isDesktop) { + final result = await showFutureLoadingDialog( + context: context, + future: () => File(downloadPath).writeAsBytes(bytes), + ); + if (result.error != null) return; + } + + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text( + L10n.of(context).fileHasBeenSavedAt(downloadPath), + ), + ), + ); + } + + FileType get filePickerFileType { + if (this is MatrixImageFile) return FileType.image; + if (this is MatrixAudioFile) return FileType.audio; + if (this is MatrixVideoFile) return FileType.video; + return FileType.any; + } + + void _webDownload() { + html.AnchorElement( + href: html.Url.createObjectUrlFromBlob( + html.Blob( + [bytes], + mimeType, + ), + ), + ) + ..download = name + ..click(); + } + + void share(BuildContext context) async { + // Workaround for iPad from + // https://github.com/fluttercommunity/plus_plugins/tree/main/packages/share_plus/share_plus#ipad + final box = context.findRenderObject() as RenderBox?; + + await Share.shareXFiles( + [XFile.fromData(bytes, name: name, mimeType: mimeType)], + sharePositionOrigin: + box == null ? null : box.localToGlobal(Offset.zero) & box.size, + ); + return; + } + + MatrixFile get detectFileType { + if (msgType == MessageTypes.Image) { + return MatrixImageFile(bytes: bytes, name: name); + } + if (msgType == MessageTypes.Video) { + return MatrixVideoFile(bytes: bytes, name: name); + } + if (msgType == MessageTypes.Audio) { + return MatrixAudioFile(bytes: bytes, name: name); + } + return this; + } + + String get sizeString => size.sizeString; +} diff --git a/lib/utils/matrix_sdk_extensions/matrix_locals.dart b/lib/utils/matrix_sdk_extensions/matrix_locals.dart new file mode 100644 index 0000000..9aa9bdb --- /dev/null +++ b/lib/utils/matrix_sdk_extensions/matrix_locals.dart @@ -0,0 +1,358 @@ +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:matrix/matrix.dart'; + +/// This is a temporary helper class until there is a proper solution to this with the new system +class MatrixLocals extends MatrixLocalizations { + final L10n l10n; + + MatrixLocals(this.l10n); + + @override + String voiceMessage(String senderName, Duration? duration) { + return l10n.voiceMessage; + } + + @override + String acceptedTheInvitation(String targetName) { + return l10n.acceptedTheInvitation(targetName); + } + + @override + String activatedEndToEndEncryption(String senderName) { + return l10n.activatedEndToEndEncryption(senderName); + } + + @override + String answeredTheCall(String senderName) { + return l10n.answeredTheCall(senderName); + } + + @override + String get anyoneCanJoin => l10n.anyoneCanJoin; + + @override + String bannedUser(String senderName, String targetName) { + return l10n.bannedUser(senderName, targetName); + } + + @override + String changedTheChatAvatar(String senderName) { + return l10n.changedTheChatAvatar(senderName); + } + + @override + String changedTheChatDescriptionTo(String senderName, String content) { + return l10n.changedTheChatDescriptionTo(senderName, content); + } + + @override + String changedTheChatNameTo(String senderName, String content) { + return l10n.changedTheChatNameTo(senderName, content); + } + + @override + String changedTheChatPermissions(String senderName) { + return l10n.changedTheChatPermissions(senderName); + } + + @override + String changedTheDisplaynameTo(String targetName, String newDisplayname) { + return l10n.changedTheDisplaynameTo(targetName, newDisplayname); + } + + @override + String changedTheGuestAccessRules(String senderName) { + return l10n.changedTheGuestAccessRules(senderName); + } + + @override + String changedTheGuestAccessRulesTo( + String senderName, + String localizedString, + ) { + return l10n.changedTheGuestAccessRulesTo(senderName, localizedString); + } + + @override + String changedTheHistoryVisibility(String senderName) { + return l10n.changedTheHistoryVisibility(senderName); + } + + @override + String changedTheHistoryVisibilityTo( + String senderName, + String localizedString, + ) { + return l10n.changedTheHistoryVisibilityTo(senderName, localizedString); + } + + @override + String changedTheJoinRules(String senderName) { + return l10n.changedTheJoinRules(senderName); + } + + @override + String changedTheJoinRulesTo(String senderName, String localizedString) { + return l10n.changedTheJoinRulesTo(senderName, localizedString); + } + + @override + String changedTheProfileAvatar(String targetName) { + return l10n.changedTheProfileAvatar(targetName); + } + + @override + String changedTheRoomAliases(String senderName) { + return l10n.changedTheRoomAliases(senderName); + } + + @override + String changedTheRoomInvitationLink(String senderName) { + return l10n.changedTheRoomInvitationLink(senderName); + } + + @override + String get channelCorruptedDecryptError => l10n.channelCorruptedDecryptError; + + @override + String couldNotDecryptMessage(String errorText) { + return l10n.couldNotDecryptMessage(errorText); + } + + @override + String createdTheChat(String senderName) { + return l10n.createdTheChat(senderName); + } + + @override + String get emptyChat => l10n.emptyChat; + + @override + String get encryptionNotEnabled => l10n.encryptionNotEnabled; + + @override + String endedTheCall(String senderName) { + return l10n.endedTheCall(senderName); + } + + @override + String get fromJoining => l10n.fromJoining; + + @override + String get fromTheInvitation => l10n.fromTheInvitation; + + @override + String groupWith(String displayname) { + return l10n.groupWith(displayname); + } + + @override + String get guestsAreForbidden => l10n.guestsAreForbidden; + + @override + String get guestsCanJoin => l10n.guestsCanJoin; + + @override + String hasWithdrawnTheInvitationFor(String senderName, String targetName) { + return l10n.hasWithdrawnTheInvitationFor(senderName, targetName); + } + + @override + String invitedUser(String senderName, String targetName) { + return l10n.invitedUser(senderName, targetName); + } + + @override + String get invitedUsersOnly => l10n.invitedUsersOnly; + + @override + String joinedTheChat(String targetName) { + return l10n.joinedTheChat(targetName); + } + + @override + String kicked(String senderName, String targetName) { + return l10n.kicked(senderName, targetName); + } + + @override + String kickedAndBanned(String senderName, String targetName) { + return l10n.kickedAndBanned(senderName, targetName); + } + + @override + String get needPantalaimonWarning => l10n.oopsSomethingWentWrong; + + @override + String get noPermission => l10n.noKeyForThisMessage; + + @override + String redactedAnEvent(Event redactedEvent) { + return l10n.redactedAnEvent( + redactedEvent.redactedBecause?.senderFromMemoryOrFallback + .calcDisplayname() ?? + l10n.user, + ); + } + + @override + String rejectedTheInvitation(String targetName) { + return l10n.rejectedTheInvitation(targetName); + } + + @override + String removedBy(Event redactedEvent) { + return l10n.redactedBy( + redactedEvent.senderFromMemoryOrFallback.calcDisplayname(), + ); + } + + @override + String get roomHasBeenUpgraded => l10n.roomHasBeenUpgraded; + + @override + String sentAFile(String senderName) { + return l10n.sentAFile(senderName); + } + + @override + String sentAPicture(String senderName) { + return l10n.sentAPicture(senderName); + } + + @override + String sentASticker(String senderName) { + return l10n.sentASticker(senderName); + } + + @override + String sentAVideo(String senderName) { + return l10n.sentAVideo(senderName); + } + + @override + String sentAnAudio(String senderName) { + return l10n.sentAnAudio(senderName); + } + + @override + String sentCallInformations(String senderName) { + return l10n.sentCallInformations(senderName); + } + + @override + String sharedTheLocation(String senderName) { + return l10n.sharedTheLocation(senderName); + } + + @override + String startedACall(String senderName) { + return l10n.startedACall(senderName); + } + + @override + String unbannedUser(String senderName, String targetName) { + return l10n.unbannedUser(senderName, targetName); + } + + @override + String get unknownEncryptionAlgorithm => l10n.unknownEncryptionAlgorithm; + + @override + String unknownEvent(String typeKey) { + return l10n.userSentUnknownEvent('User', typeKey); + } + + @override + String userLeftTheChat(String targetName) { + return l10n.userLeftTheChat(targetName); + } + + @override + String get visibleForAllParticipants => l10n.visibleForAllParticipants; + + @override + String get visibleForEveryone => l10n.visibleForEveryone; + + @override + String get you => l10n.you; + + @override + String sentReaction(String senderName, String reactionKey) => + l10n.reactedWith(senderName, reactionKey); + + @override + // TODO: implement youAcceptedTheInvitation + String get youAcceptedTheInvitation => l10n.youAcceptedTheInvitation; + + @override + String youBannedUser(String targetName) => l10n.youBannedUser(targetName); + + @override + String youHaveWithdrawnTheInvitationFor(String targetName) => + l10n.youHaveWithdrawnTheInvitationFor(targetName); + + @override + String youInvitedBy(String senderName) => l10n.youInvitedBy(senderName); + + @override + String youInvitedUser(String targetName) => l10n.youInvitedUser(targetName); + + @override + // TODO: implement youJoinedTheChat + String get youJoinedTheChat => l10n.youJoinedTheChat; + + @override + String youKicked(String targetName) => l10n.youKicked(targetName); + + @override + String youKickedAndBanned(String targetName) => + l10n.youKickedAndBanned(targetName); + + @override + // TODO: implement youRejectedTheInvitation + String get youRejectedTheInvitation => l10n.youRejectedTheInvitation; + + @override + String youUnbannedUser(String targetName) => l10n.youUnbannedUser(targetName); + + @override + String wasDirectChatDisplayName(String oldDisplayName) => + l10n.wasDirectChatDisplayName(oldDisplayName); + + @override + String get unknownUser => l10n.user; + + @override + String hasKnocked(String targetName) => l10n.hasKnocked(targetName); + + @override + String acceptedKeyVerification(String senderName) => + l10n.acceptedKeyVerification(senderName); + + @override + String canceledKeyVerification(String senderName) => + l10n.canceledKeyVerification(senderName); + + @override + String completedKeyVerification(String senderName) => + l10n.completedKeyVerification(senderName); + + @override + String isReadyForKeyVerification(String senderName) => + l10n.isReadyForKeyVerification(senderName); + + @override + String requestedKeyVerification(String senderName) => + l10n.requestedKeyVerification(senderName); + + @override + String startedKeyVerification(String senderName) => + l10n.startedKeyVerification(senderName); + + @override + String invitedBy(String senderName) => senderName; + + @override + String get cancelledSend => l10n.sendCanceled; +} diff --git a/lib/utils/matrix_sdk_extensions/synapse_admin_extension.dart b/lib/utils/matrix_sdk_extensions/synapse_admin_extension.dart new file mode 100644 index 0000000..65c5c19 --- /dev/null +++ b/lib/utils/matrix_sdk_extensions/synapse_admin_extension.dart @@ -0,0 +1,75 @@ +import 'dart:convert'; + +import 'package:http/http.dart'; +import 'package:matrix/matrix.dart' as matrix; + +extension SynapseAdmin on matrix.Client { + Future> getEventReports({int from = 0, int limit = 10}) async { + final requestUri = Uri( + path: '/_synapse/admin/v1/event_reports', + query: 'from=$from&limit=$limit&order_by=received_ts&dir=b' + ); + + if (baseUri == null) return []; + print(baseUri!.resolveUri(requestUri).toString()); + final request = Request('GET', baseUri!.resolveUri(requestUri)); + request.headers['authorization'] = 'Bearer $accessToken'; + final response = await httpClient.send(request); + final responseBody = await response.stream.toBytes(); + if (response.statusCode != 200) unexpectedResponse(response, responseBody); + final responseString = utf8.decode(responseBody); + final json = jsonDecode(responseString); + return json['event_reports']; + } + + Future getReportedEvent(int id) async { + final requestUri = Uri( + path: '/_synapse/admin/v1/event_reports/$id', + ); + + if (baseUri == null) return null; + final request = Request('GET', baseUri!.resolveUri(requestUri)); + request.headers['authorization'] = 'Bearer $accessToken'; + final response = await httpClient.send(request); + final responseBody = await response.stream.toBytes(); + if (response.statusCode != 200) unexpectedResponse(response, responseBody); + final responseString = utf8.decode(responseBody); + final json = jsonDecode(responseString); + + final room = getRoomById(json['room_id']); + + if (room == null) return null; + + print('Event content: ${jsonEncode(json['event_json'])}'); + + return new matrix.Event( + content: json['event_json']['content'], + type: json['event_json']['type'], + eventId: json['event_id'], + senderId: json['sender'], + originServerTs: DateTime.fromMillisecondsSinceEpoch(json['event_json']['origin_server_ts']), + room: room, + ); + } + + Future isSynapseAdministrator() async { + print('Checking if I am admin...'); + print('User ID: $userID'); + if (userID == null) return false; + final requestUri = Uri( + path: '/_synapse/admin/v1/users/$userID/admin', + ); + + print('Base URL: ${baseUri.toString()}'); + if (baseUri == null) return false; + final request = Request('GET', baseUri!.resolveUri(requestUri)); + request.headers['authorization'] = 'Bearer $accessToken'; + final response = await httpClient.send(request); + final responseBody = await response.stream.toBytes(); + if (response.statusCode != 200) unexpectedResponse(response, responseBody); + final responseString = utf8.decode(responseBody); + final json = jsonDecode(responseString); + print('Response from endpoint: $responseString'); + return json['admin']; + } +} diff --git a/lib/utils/other_party_can_receive.dart b/lib/utils/other_party_can_receive.dart new file mode 100644 index 0000000..1738785 --- /dev/null +++ b/lib/utils/other_party_can_receive.dart @@ -0,0 +1,21 @@ +import 'package:matrix/matrix.dart'; + +extension OtherPartyCanReceiveExtension on Room { + bool get otherPartyCanReceiveMessages { + if (!encrypted) return true; + final users = getParticipants() + .map((u) => u.id) + .where((userId) => userId != client.userID) + .toSet(); + if (users.isEmpty) return true; + + for (final userId in users) { + if (client.userDeviceKeys[userId]?.deviceKeys.values.isNotEmpty == true) { + return true; + } + } + return false; + } +} + +class OtherPartyCanNotReceiveMessages implements Exception {} diff --git a/lib/utils/platform_infos.dart b/lib/utils/platform_infos.dart new file mode 100644 index 0000000..e047c1c --- /dev/null +++ b/lib/utils/platform_infos.dart @@ -0,0 +1,93 @@ +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:go_router/go_router.dart'; +import 'package:package_info_plus/package_info_plus.dart'; +import 'package:url_launcher/url_launcher_string.dart'; + +import '../config/app_config.dart'; + +abstract class PlatformInfos { + static bool get isWeb => kIsWeb; + static bool get isLinux => !kIsWeb && Platform.isLinux; + static bool get isWindows => !kIsWeb && Platform.isWindows; + static bool get isMacOS => !kIsWeb && Platform.isMacOS; + static bool get isIOS => !kIsWeb && Platform.isIOS; + static bool get isAndroid => !kIsWeb && Platform.isAndroid; + + static bool get isCupertinoStyle => isIOS || isMacOS; + + static bool get isMobile => isAndroid || isIOS; + + /// For desktops which don't support ChachedNetworkImage yet + static bool get isBetaDesktop => isWindows || isLinux; + + static bool get isDesktop => isLinux || isWindows || isMacOS; + + static bool get usesTouchscreen => !isMobile; + + static bool get supportsVideoPlayer => !isWindows && !isLinux; + + /// Web could also record in theory but currently only wav which is too large + static bool get platformCanRecord => (isMobile || isMacOS); + + static String get clientName => + '${AppConfig.applicationName} ${isWeb ? 'web' : Platform.operatingSystem}${kReleaseMode ? '' : 'Debug'}'; + + static Future getVersion() async { + var version = kIsWeb ? 'Web' : 'Unknown'; + try { + version = (await PackageInfo.fromPlatform()).version; + } catch (_) {} + return version; + } + + static void showDialog(BuildContext context) async { + final version = await PlatformInfos.getVersion(); + showAboutDialog( + context: context, + children: [ + Text('Version: $version'), + TextButton.icon( + onPressed: () => launchUrlString(AppConfig.sourceCodeUrl), + icon: const Icon(Icons.source_outlined), + label: Text(L10n.of(context).sourceCode), + ), + Builder( + builder: (innerContext) { + return TextButton.icon( + onPressed: () { + context.go('/logs'); + Navigator.of(innerContext).pop(); + }, + icon: const Icon(Icons.list_outlined), + label: const Text('Logs'), + ); + }, + ), + Builder( + builder: (innerContext) { + return TextButton.icon( + onPressed: () { + context.go('/configs'); + Navigator.of(innerContext).pop(); + }, + icon: const Icon(Icons.settings_applications_outlined), + label: const Text('Advanced Configs'), + ); + }, + ), + ], + applicationIcon: Image.asset( + 'assets/logo.png', + width: 64, + height: 64, + filterQuality: FilterQuality.medium, + ), + applicationName: AppConfig.applicationName, + ); + } +} diff --git a/lib/utils/push_helper.dart b/lib/utils/push_helper.dart new file mode 100644 index 0000000..e46b940 --- /dev/null +++ b/lib/utils/push_helper.dart @@ -0,0 +1,331 @@ +import 'dart:ui'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; + +import 'package:collection/collection.dart'; +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:flutter_local_notifications/flutter_local_notifications.dart'; +import 'package:flutter_shortcuts_new/flutter_shortcuts_new.dart'; +import 'package:matrix/matrix.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/utils/client_download_content_extension.dart'; +import 'package:fluffychat/utils/client_manager.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; + +Future pushHelper( + PushNotification notification, { + Client? client, + L10n? l10n, + String? activeRoomId, + required FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin, +}) async { + try { + await _tryPushHelper( + notification, + client: client, + l10n: l10n, + activeRoomId: activeRoomId, + flutterLocalNotificationsPlugin: flutterLocalNotificationsPlugin, + ); + } catch (e, s) { + Logs().v('Push Helper has crashed!', e, s); + + l10n ??= await lookupL10n(const Locale('en')); + flutterLocalNotificationsPlugin.show( + notification.roomId?.hashCode ?? 0, + l10n.newMessageInFluffyChat, + l10n.openAppToReadMessages, + NotificationDetails( + iOS: const DarwinNotificationDetails(), + android: AndroidNotificationDetails( + AppConfig.pushNotificationsChannelId, + l10n.incomingMessages, + number: notification.counts?.unread, + ticker: l10n.unreadChatsInApp( + AppConfig.applicationName, + (notification.counts?.unread ?? 0).toString(), + ), + importance: Importance.high, + priority: Priority.max, + shortcutId: notification.roomId, + ), + ), + ); + rethrow; + } +} + +Future _tryPushHelper( + PushNotification notification, { + Client? client, + L10n? l10n, + String? activeRoomId, + required FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin, +}) async { + final isBackgroundMessage = client == null; + Logs().v( + 'Push helper has been started (background=$isBackgroundMessage).', + notification.toJson(), + ); + + if (notification.roomId != null && + activeRoomId == notification.roomId && + WidgetsBinding.instance.lifecycleState == AppLifecycleState.resumed) { + Logs().v('Room is in foreground. Stop push helper here.'); + return; + } + + client ??= (await ClientManager.getClients( + initialize: false, + store: await SharedPreferences.getInstance(), + )) + .first; + final event = await client.getEventByPushNotification( + notification, + storeInDatabase: isBackgroundMessage, + ); + + if (event == null) { + Logs().v('Notification is a clearing indicator.'); + if (notification.counts?.unread == null || + notification.counts?.unread == 0) { + await flutterLocalNotificationsPlugin.cancelAll(); + } else { + // Make sure client is fully loaded and synced before dismiss notifications: + await client.roomsLoading; + await client.oneShotSync(); + final activeNotifications = + await flutterLocalNotificationsPlugin.getActiveNotifications(); + for (final activeNotification in activeNotifications) { + final room = client.rooms.singleWhereOrNull( + (room) => room.id.hashCode == activeNotification.id, + ); + if (room == null || !room.isUnreadOrInvited) { + flutterLocalNotificationsPlugin.cancel(activeNotification.id!); + } + } + } + return; + } + Logs().v('Push helper got notification event of type ${event.type}.'); + + if (event.type.startsWith('m.call')) { + // make sure bg sync is on (needed to update hold, unhold events) + // prevent over write from app life cycle change + client.backgroundSync = true; + } + + if (event.type == EventTypes.CallHangup) { + client.backgroundSync = false; + } + + if (event.type.startsWith('m.call') && event.type != EventTypes.CallInvite) { + Logs().v('Push message is a m.call but not invite. Do not display.'); + return; + } + + if ((event.type.startsWith('m.call') && + event.type != EventTypes.CallInvite) || + event.type == 'org.matrix.call.sdp_stream_metadata_changed') { + Logs().v('Push message was for a call, but not call invite.'); + return; + } + + l10n ??= await L10n.delegate.load(PlatformDispatcher.instance.locale); + final matrixLocals = MatrixLocals(l10n); + + // Calculate the body + final body = event.type == EventTypes.Encrypted + ? l10n.newMessageInFluffyChat + : await event.calcLocalizedBody( + matrixLocals, + plaintextBody: true, + withSenderNamePrefix: false, + hideReply: true, + hideEdit: true, + removeMarkdown: true, + ); + + // The person object for the android message style notification + final avatar = event.room.avatar; + final senderAvatar = event.room.isDirectChat + ? avatar + : event.senderFromMemoryOrFallback.avatarUrl; + + Uint8List? roomAvatarFile, senderAvatarFile; + try { + roomAvatarFile = avatar == null + ? null + : await client + .downloadMxcCached( + avatar, + thumbnailMethod: ThumbnailMethod.scale, + width: 256, + height: 256, + animated: false, + isThumbnail: 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.scale, + width: 256, + height: 256, + animated: false, + isThumbnail: true, + ) + .timeout(const Duration(seconds: 3)); + } catch (e, s) { + Logs().e('Unable to get avatar picture', e, s); + } + + final id = notification.roomId.hashCode; + + final senderName = event.senderFromMemoryOrFallback.calcDisplayname(); + // Show notification + + final newMessage = Message( + body, + event.originServerTs, + Person( + bot: event.messageType == MessageTypes.Notice, + key: event.senderId, + name: senderName, + icon: senderAvatarFile == null + ? null + : ByteArrayAndroidIcon(senderAvatarFile), + ), + ); + + final messagingStyleInformation = PlatformInfos.isAndroid + ? await AndroidFlutterLocalNotificationsPlugin() + .getActiveNotificationMessagingStyle(id) + : null; + messagingStyleInformation?.messages?.add(newMessage); + + final roomName = event.room.getLocalizedDisplayname(MatrixLocals(l10n)); + + final notificationGroupId = + event.room.isDirectChat ? 'directChats' : 'groupChats'; + final groupName = event.room.isDirectChat ? l10n.directChats : l10n.groups; + + final messageRooms = AndroidNotificationChannelGroup( + notificationGroupId, + groupName, + ); + final roomsChannel = AndroidNotificationChannel( + event.room.id, + roomName, + groupId: notificationGroupId, + ); + + await flutterLocalNotificationsPlugin + .resolvePlatformSpecificImplementation< + AndroidFlutterLocalNotificationsPlugin>() + ?.createNotificationChannelGroup(messageRooms); + await flutterLocalNotificationsPlugin + .resolvePlatformSpecificImplementation< + AndroidFlutterLocalNotificationsPlugin>() + ?.createNotificationChannel(roomsChannel); + + final androidPlatformChannelSpecifics = AndroidNotificationDetails( + AppConfig.pushNotificationsChannelId, + l10n.incomingMessages, + number: notification.counts?.unread, + category: AndroidNotificationCategory.message, + shortcutId: event.room.id, + actions: [ + AndroidNotificationAction("read", l10n.markAsRead), + AndroidNotificationAction("reply", + l10n.reply, inputs: [ + AndroidNotificationActionInput(label: l10n.writeAMessage) + ]) + ], + styleInformation: messagingStyleInformation ?? + MessagingStyleInformation( + Person( + name: senderName, + icon: roomAvatarFile == null + ? null + : ByteArrayAndroidIcon(roomAvatarFile), + key: event.roomId, + important: event.room.isFavourite, + ), + conversationTitle: event.room.isDirectChat ? null : roomName, + groupConversation: !event.room.isDirectChat, + messages: [newMessage], + ), + ticker: event.calcLocalizedBodyFallback( + matrixLocals, + plaintextBody: true, + withSenderNamePrefix: !event.room.isDirectChat, + hideReply: true, + hideEdit: true, + removeMarkdown: true, + ), + importance: Importance.high, + priority: Priority.max, + groupKey: event.room.spaceParents.firstOrNull?.roomId ?? 'rooms', + ); + const iOSPlatformChannelSpecifics = DarwinNotificationDetails(); + final platformChannelSpecifics = NotificationDetails( + android: androidPlatformChannelSpecifics, + iOS: iOSPlatformChannelSpecifics, + ); + + final title = event.room.getLocalizedDisplayname(MatrixLocals(l10n)); + + if (PlatformInfos.isAndroid && messagingStyleInformation == null) { + await _setShortcut(event, l10n, title, roomAvatarFile); + } + + await flutterLocalNotificationsPlugin.show( + id, + title, + body, + platformChannelSpecifics, + payload: '${event.roomId} ${event.eventId}', + ); + Logs().v('Push helper has been completed!'); +} + +/// Creates a shortcut for Android platform but does not block displaying the +/// notification. This is optional but provides a nicer view of the +/// notification popup. +Future _setShortcut( + Event event, + L10n l10n, + String title, + Uint8List? avatarFile, +) async { + final flutterShortcuts = FlutterShortcuts(); + await flutterShortcuts.initialize(debug: !kReleaseMode); + await flutterShortcuts.pushShortcutItem( + shortcut: ShortcutItem( + id: event.room.id, + action: AppConfig.inviteLinkPrefix + event.room.id, + shortLabel: title, + conversationShortcut: true, + icon: avatarFile == null + ? null + : ShortcutMemoryIcon(jpegImage: avatarFile).toString(), + shortcutIconAsset: avatarFile == null + ? ShortcutIconAsset.androidAsset + : ShortcutIconAsset.memoryAsset, + isImportant: event.room.isFavourite, + ), + ); +} diff --git a/lib/utils/resize_video.dart b/lib/utils/resize_video.dart new file mode 100644 index 0000000..7686771 --- /dev/null +++ b/lib/utils/resize_video.dart @@ -0,0 +1,46 @@ +import 'package:cross_file/cross_file.dart'; +import 'package:matrix/matrix.dart'; +import 'package:video_compress/video_compress.dart'; + +import 'package:fluffychat/utils/platform_infos.dart'; + +extension ResizeImage on XFile { + static const int max = 1200; + static const int quality = 40; + + Future resizeVideo() async { + MediaInfo? mediaInfo; + try { + if (PlatformInfos.isMobile) { + // will throw an error e.g. on Android SDK < 18 + mediaInfo = await VideoCompress.compressVideo(path); + } + } catch (e, s) { + Logs().w('Error while compressing video', e, s); + } + return MatrixVideoFile( + bytes: (await mediaInfo?.file?.readAsBytes()) ?? await readAsBytes(), + name: name, + mimeType: mimeType, + width: mediaInfo?.width, + height: mediaInfo?.height, + duration: mediaInfo?.duration?.round(), + ); + } + + Future getVideoThumbnail() async { + if (!PlatformInfos.isMobile) return null; + + try { + final bytes = await VideoCompress.getByteThumbnail(path); + if (bytes == null) return null; + return MatrixImageFile( + bytes: bytes, + name: name, + ); + } catch (e, s) { + Logs().w('Error while compressing video', e, s); + } + return null; + } +} diff --git a/lib/utils/room_status_extension.dart b/lib/utils/room_status_extension.dart new file mode 100644 index 0000000..c250e40 --- /dev/null +++ b/lib/utils/room_status_extension.dart @@ -0,0 +1,57 @@ +import 'package:flutter/widgets.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:matrix/matrix.dart'; + +import '../config/app_config.dart'; + +extension RoomStatusExtension on Room { + String getLocalizedTypingText(BuildContext context) { + var typingText = ''; + final typingUsers = this.typingUsers; + typingUsers.removeWhere((User u) => u.id == client.userID); + + if (AppConfig.hideTypingUsernames) { + typingText = L10n.of(context).isTyping; + if (typingUsers.first.id != directChatMatrixID) { + typingText = L10n.of(context).numUsersTyping(typingUsers.length); + } + } else if (typingUsers.length == 1) { + typingText = L10n.of(context).isTyping; + if (typingUsers.first.id != directChatMatrixID) { + typingText = + L10n.of(context).userIsTyping(typingUsers.first.calcDisplayname()); + } + } else if (typingUsers.length == 2) { + typingText = L10n.of(context).userAndUserAreTyping( + typingUsers.first.calcDisplayname(), + typingUsers[1].calcDisplayname(), + ); + } else if (typingUsers.length > 2) { + typingText = L10n.of(context).userAndOthersAreTyping( + typingUsers.first.calcDisplayname(), + (typingUsers.length - 1), + ); + } + return typingText; + } + + List getSeenByUsers(Timeline timeline, {String? eventId}) { + if (timeline.events.isEmpty) return []; + eventId ??= timeline.events.first.eventId; + + final lastReceipts = {}; + // now we iterate the timeline events until we hit the first rendered event + for (final event in timeline.events) { + lastReceipts.addAll(event.receipts.map((r) => r.user)); + if (event.eventId == eventId) { + break; + } + } + lastReceipts.removeWhere( + (user) => + user.id == client.userID || user.id == timeline.events.first.senderId, + ); + return lastReceipts.toList(); + } +} diff --git a/lib/utils/show_scaffold_dialog.dart b/lib/utils/show_scaffold_dialog.dart new file mode 100644 index 0000000..0c09a70 --- /dev/null +++ b/lib/utils/show_scaffold_dialog.dart @@ -0,0 +1,37 @@ +import 'package:flutter/material.dart'; + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/config/themes.dart'; + +Future showScaffoldDialog({ + required BuildContext context, + Color? barrierColor, + Color? containerColor, + double maxWidth = 480, + double maxHeight = 720, + required Widget Function(BuildContext context) builder, +}) => + showDialog( + context: context, + useSafeArea: false, + builder: FluffyThemes.isColumnMode(context) + ? (context) => Center( + child: Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular( + AppConfig.borderRadius, + ), + color: containerColor ?? + Theme.of(context).scaffoldBackgroundColor, + ), + clipBehavior: Clip.hardEdge, + margin: const EdgeInsets.all(16), + constraints: BoxConstraints( + maxWidth: maxWidth, + maxHeight: maxHeight, + ), + child: builder(context), + ), + ) + : builder, + ); diff --git a/lib/utils/show_update_snackbar.dart b/lib/utils/show_update_snackbar.dart new file mode 100644 index 0000000..0c3f735 --- /dev/null +++ b/lib/utils/show_update_snackbar.dart @@ -0,0 +1,36 @@ +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:url_launcher/url_launcher_string.dart'; + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; + +abstract class UpdateNotifier { + static const String versionStoreKey = 'last_known_version'; + + static void showUpdateSnackBar(BuildContext context) async { + final scaffoldMessenger = ScaffoldMessenger.of(context); + final currentVersion = await PlatformInfos.getVersion(); + final store = await SharedPreferences.getInstance(); + final storedVersion = store.getString(versionStoreKey); + + if (currentVersion != storedVersion) { + if (storedVersion != null) { + scaffoldMessenger.showSnackBar( + SnackBar( + duration: const Duration(seconds: 30), + showCloseIcon: true, + content: Text(L10n.of(context).updateInstalled(currentVersion)), + action: SnackBarAction( + label: L10n.of(context).changelog, + onPressed: () => launchUrlString(AppConfig.changelogUrl), + ), + ), + ); + } + await store.setString(versionStoreKey, currentVersion); + } + } +} diff --git a/lib/utils/size_string.dart b/lib/utils/size_string.dart new file mode 100644 index 0000000..3150330 --- /dev/null +++ b/lib/utils/size_string.dart @@ -0,0 +1,21 @@ +extension SizeString on num { + String get sizeString { + var size = toDouble(); + if (size < 1000) { + return '${size.round()} Bytes'; + } + if (size < 1000 * 1000) { + size = size / 1000; + size = (size * 10).round() / 10; + return '${size.toString()} KB'; + } + if (size < 1000 * 1000 * 1000) { + size = size / 1000000; + size = (size * 10).round() / 10; + return '${size.toString()} MB'; + } + size = size / 1000 * 1000 * 1000 * 1000; + size = (size * 10).round() / 10; + return '${size.toString()} GB'; + } +} diff --git a/lib/utils/stream_extension.dart b/lib/utils/stream_extension.dart new file mode 100644 index 0000000..66e840f --- /dev/null +++ b/lib/utils/stream_extension.dart @@ -0,0 +1,48 @@ +import 'dart:async'; + +extension StreamExtension on Stream { + /// Returns a new Stream which outputs only `true` for every update of the original + /// stream, ratelimited by the Duration t + Stream rateLimit(Duration t) { + final controller = StreamController(); + Timer? timer; + var gotMessage = false; + // as we call our inline-defined function recursively we need to make sure that the + // variable exists prior of creating the function. Silly dart. + Function? onMessage; + // callback to determine if we should send out an update + onMessage = () { + // do nothing if it is already closed + if (controller.isClosed) { + return; + } + if (timer == null) { + // if we don't have a timer yet, send out the update and start a timer + gotMessage = false; + controller.add(true); + timer = Timer(t, () { + // the timer has ended...delete it and, if we got a message, re-run the + // method to send out an update! + timer = null; + if (gotMessage) { + onMessage?.call(); + } + }); + } else { + // set that we got a message + gotMessage = true; + } + }; + final subscription = listen( + (_) => onMessage?.call(), + onDone: () => controller.close(), + onError: (e, s) => controller.addError(e, s), + ); + // add proper cleanup to the subscription and the controller, to not memory leak + controller.onCancel = () { + subscription.cancel(); + controller.close(); + }; + return controller.stream; + } +} diff --git a/lib/utils/string_color.dart b/lib/utils/string_color.dart new file mode 100644 index 0000000..a0dfbf5 --- /dev/null +++ b/lib/utils/string_color.dart @@ -0,0 +1,34 @@ +import 'package:flutter/material.dart'; + +extension StringColor on String { + static final _colorCache = >{}; + + Color _getColorLight(double light) { + var number = 0.0; + for (var i = 0; i < length; i++) { + number += codeUnitAt(i); + } + number = (number % 12) * 25.5; + return HSLColor.fromAHSL(0.75, number, 1, light).toColor(); + } + + Color get color { + _colorCache[this] ??= {}; + return _colorCache[this]![0.3] ??= _getColorLight(0.3); + } + + Color get darkColor { + _colorCache[this] ??= {}; + return _colorCache[this]![0.2] ??= _getColorLight(0.2); + } + + Color get lightColorText { + _colorCache[this] ??= {}; + return _colorCache[this]![0.7] ??= _getColorLight(0.7); + } + + Color get lightColorAvatar { + _colorCache[this] ??= {}; + return _colorCache[this]![0.45] ??= _getColorLight(0.45); + } +} diff --git a/lib/utils/sync_status_localization.dart b/lib/utils/sync_status_localization.dart new file mode 100644 index 0000000..ffb372e --- /dev/null +++ b/lib/utils/sync_status_localization.dart @@ -0,0 +1,27 @@ +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/utils/localized_exception_extension.dart'; + +extension SyncStatusLocalization on SyncStatusUpdate { + String calcLocalizedString(BuildContext context) { + final progress = this.progress; + switch (status) { + case SyncStatus.waitingForResponse: + return L10n.of(context).waitingForServer; + case SyncStatus.error: + return ((error?.exception ?? Object()) as Object) + .toLocalizedString(context); + case SyncStatus.processing: + case SyncStatus.cleaningUp: + case SyncStatus.finished: + return progress == null + ? L10n.of(context).synchronizingPleaseWait + : L10n.of(context).synchronizingPleaseWaitCounter( + (progress * 100).round().toString(), + ); + } + } +} diff --git a/lib/utils/tor_stub.dart b/lib/utils/tor_stub.dart new file mode 100644 index 0000000..3223d08 --- /dev/null +++ b/lib/utils/tor_stub.dart @@ -0,0 +1,7 @@ +/// Stub class for [TorBrowserDetector] +/// +/// statically returns false as Tor **browser** can only be detected in a +/// **browser**. +abstract class TorBrowserDetector { + static Future get isTorBrowser => Future.value(false); +} diff --git a/lib/utils/translator.dart b/lib/utils/translator.dart new file mode 100644 index 0000000..84a5987 --- /dev/null +++ b/lib/utils/translator.dart @@ -0,0 +1,19 @@ +import 'dart:convert'; +import 'package:http/http.dart' as http; + +class Translator { + static Future translate(String str, String targetLanguage) async { + final url = Uri.parse('https://ecs.extera.xyz/translate/anything/auto/$targetLanguage'); + final response = await http.post( + url, + headers: {'Content-Type': 'application/json'}, + body: jsonEncode({'text': str}), + ); + if (response.statusCode == 200) { + final responseData = jsonDecode(response.body); + return responseData['text'] ?? ''; + } else { + throw Exception('Failed to translate text: ${response.statusCode}'); + } + } +} diff --git a/lib/utils/uia_request_manager.dart b/lib/utils/uia_request_manager.dart new file mode 100644 index 0000000..73bae0d --- /dev/null +++ b/lib/utils/uia_request_manager.dart @@ -0,0 +1,116 @@ +import 'dart:async'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:matrix/matrix.dart'; +import 'package:url_launcher/url_launcher_string.dart'; + +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_text_input_dialog.dart'; +import 'package:fluffychat/widgets/fluffy_chat_app.dart'; +import 'package:fluffychat/widgets/matrix.dart'; + +extension UiaRequestManager on MatrixState { + Future uiaRequestHandler(UiaRequest uiaRequest) async { + final l10n = L10n.of(context); + final navigatorContext = + FluffyChatApp.router.routerDelegate.navigatorKey.currentContext ?? + context; + try { + if (uiaRequest.state != UiaRequestState.waitForUser || + uiaRequest.nextStages.isEmpty) { + Logs().d('Uia Request Stage: ${uiaRequest.state}'); + return; + } + final stage = uiaRequest.nextStages.first; + Logs().d('Uia Request Stage: $stage'); + switch (stage) { + case AuthenticationTypes.password: + final input = cachedPassword ?? + (await showTextInputDialog( + context: navigatorContext, + title: l10n.pleaseEnterYourPassword, + okLabel: l10n.ok, + cancelLabel: l10n.cancel, + minLines: 1, + maxLines: 1, + obscureText: true, + hintText: '******', + )); + if (input == null || input.isEmpty) { + return uiaRequest.cancel(); + } + return uiaRequest.completeStage( + AuthenticationPassword( + session: uiaRequest.session, + password: input, + identifier: AuthenticationUserIdentifier(user: client.userID!), + ), + ); + case AuthenticationTypes.emailIdentity: + if (currentThreepidCreds == null) { + return uiaRequest.cancel( + UiaException(L10n.of(context).serverRequiresEmail), + ); + } + final auth = AuthenticationThreePidCreds( + session: uiaRequest.session, + type: AuthenticationTypes.emailIdentity, + threepidCreds: ThreepidCreds( + sid: currentThreepidCreds!.sid, + clientSecret: currentClientSecret, + ), + ); + if (OkCancelResult.ok == + await showOkCancelAlertDialog( + useRootNavigator: false, + context: navigatorContext, + title: l10n.weSentYouAnEmail, + message: l10n.pleaseClickOnLink, + okLabel: l10n.iHaveClickedOnLink, + cancelLabel: l10n.cancel, + )) { + return uiaRequest.completeStage(auth); + } + return uiaRequest.cancel(); + case AuthenticationTypes.dummy: + return uiaRequest.completeStage( + AuthenticationData( + type: AuthenticationTypes.dummy, + session: uiaRequest.session, + ), + ); + default: + final url = Uri.parse( + '${client.homeserver}/_matrix/client/r0/auth/$stage/fallback/web?session=${uiaRequest.session}', + ); + launchUrlString(url.toString()); + if (OkCancelResult.ok == + await showOkCancelAlertDialog( + useRootNavigator: false, + title: l10n.pleaseFollowInstructionsOnWeb, + context: navigatorContext, + okLabel: l10n.next, + cancelLabel: l10n.cancel, + )) { + return uiaRequest.completeStage( + AuthenticationData(session: uiaRequest.session), + ); + } else { + return uiaRequest.cancel(); + } + } + } catch (e, s) { + Logs().e('Error while background UIA', e, s); + return uiaRequest.cancel(e is Exception ? e : Exception(e)); + } + } +} + +class UiaException implements Exception { + final String reason; + + UiaException(this.reason); + + @override + String toString() => reason; +} diff --git a/lib/utils/url_launcher.dart b/lib/utils/url_launcher.dart new file mode 100644 index 0000000..da5914b --- /dev/null +++ b/lib/utils/url_launcher.dart @@ -0,0 +1,240 @@ +import 'package:flutter/material.dart'; + +import 'package:collection/collection.dart' show IterableExtension; +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart'; +import 'package:punycode/punycode.dart'; +import 'package:url_launcher/url_launcher_string.dart'; + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/user_dialog.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import 'package:fluffychat/widgets/matrix.dart'; +import '../widgets/adaptive_dialogs/public_room_dialog.dart'; +import 'platform_infos.dart'; + +class UrlLauncher { + /// The url to open. + final String? url; + + /// The visible name in the GUI. For example the name of a markdown link + /// which may differ from the actual url to open. + final String? name; + + final BuildContext context; + + const UrlLauncher(this.context, this.url, [this.name]); + + void launchUrl() async { + if (url!.toLowerCase().startsWith(AppConfig.deepLinkPrefix) || + url!.toLowerCase().startsWith(AppConfig.inviteLinkPrefix) || + {'#', '@', '!', '+', '\$'}.contains(url![0]) || + url!.toLowerCase().startsWith(AppConfig.schemePrefix)) { + return openMatrixToUrl(); + } + final uri = Uri.tryParse(url!); + if (uri == null) { + // we can't open this thing + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text(L10n.of(context).cantOpenUri(url!))), + ); + return; + } + + if (name != null && url != name) { + // If there is a name which differs from the url, we need to make sure + // that the user can see the actual url before opening the browser. + final consent = await showOkCancelAlertDialog( + context: context, + title: L10n.of(context).openLinkInBrowser, + message: url, + okLabel: L10n.of(context).open, + cancelLabel: L10n.of(context).cancel, + ); + if (consent != OkCancelResult.ok) return; + } + + if (!{'https', 'http'}.contains(uri.scheme)) { + // just launch non-https / non-http uris directly + + // we need to transmute geo URIs on desktop and on iOS + if ((!PlatformInfos.isMobile || PlatformInfos.isIOS) && + uri.scheme == 'geo') { + final latlong = uri.path + .split(';') + .first + .split(',') + .map((s) => double.tryParse(s)) + .toList(); + if (latlong.length == 2 && + latlong.first != null && + latlong.last != null) { + if (PlatformInfos.isIOS) { + // iOS is great at not following standards, so we need to transmute the geo URI + // to an apple maps thingy + // https://developer.apple.com/library/archive/featuredarticles/iPhoneURLScheme_Reference/MapLinks/MapLinks.html + final ll = '${latlong.first},${latlong.last}'; + launchUrlString('https://maps.apple.com/?q=$ll&sll=$ll'); + } else { + // transmute geo URIs on desktop to openstreetmap links, as those usually can't handle + // geo URIs + launchUrlString( + 'https://www.openstreetmap.org/?mlat=${latlong.first}&mlon=${latlong.last}#map=16/${latlong.first}/${latlong.last}', + ); + } + return; + } + } + launchUrlString(url!); + return; + } + if (uri.host.isEmpty) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text(L10n.of(context).cantOpenUri(url!))), + ); + return; + } + // okay, we have either an http or an https URI. + // As some platforms have issues with opening unicode URLs, we are going to help + // them out by punycode-encoding them for them ourself. + final newHost = uri.host.split('.').map((hostPartEncoded) { + final hostPart = Uri.decodeComponent(hostPartEncoded); + final hostPartPunycode = punycodeEncode(hostPart); + return hostPartPunycode != '$hostPart-' + ? 'xn--$hostPartPunycode' + : hostPart; + }).join('.'); + // Force LaunchMode.externalApplication, otherwise url_launcher will default + // to opening links in a webview on mobile platforms. + launchUrlString( + uri.replace(host: newHost).toString(), + mode: LaunchMode.externalApplication, + ); + } + + void openMatrixToUrl() async { + final matrix = Matrix.of(context); + final url = this.url!.replaceFirst( + AppConfig.deepLinkPrefix, + AppConfig.inviteLinkPrefix, + ); + + // The identifier might be a matrix.to url and needs escaping. Or, it might have multiple + // identifiers (room id & event id), or it might also have a query part. + // All this needs parsing. + final identityParts = url.parseIdentifierIntoParts() ?? + Uri.tryParse(url)?.host.parseIdentifierIntoParts() ?? + Uri.tryParse(url) + ?.pathSegments + .lastWhereOrNull((_) => true) + ?.parseIdentifierIntoParts(); + if (identityParts == null) { + return; // no match, nothing to do + } + if (identityParts.primaryIdentifier.sigil == '#' || + identityParts.primaryIdentifier.sigil == '!') { + // we got a room! Let's open that one + final roomIdOrAlias = identityParts.primaryIdentifier; + final event = identityParts.secondaryIdentifier; + var room = matrix.client.getRoomByAlias(roomIdOrAlias) ?? + matrix.client.getRoomById(roomIdOrAlias); + var roomId = room?.id; + // we make the servers a set and later on convert to a list, so that we can easily + // deduplicate servers added via alias lookup and query parameter + final servers = {}; + if (room == null && roomIdOrAlias.sigil == '#') { + // we were unable to find the room locally...so resolve it + final response = await showFutureLoadingDialog( + context: context, + future: () => matrix.client.getRoomIdByAlias(roomIdOrAlias), + ); + if (response.error != null) { + return; // nothing to do, the alias doesn't exist + } + roomId = response.result!.roomId; + servers.addAll(response.result!.servers!); + room = matrix.client.getRoomById(roomId!); + } + servers.addAll(identityParts.via); + if (room != null) { + if (room.isSpace) { + // TODO: Implement navigate to space + context.go('/rooms/${room.id}'); + + return; + } + // we have the room, so....just open it + if (event != null) { + context.go( + '/${Uri( + pathSegments: ['rooms', room.id], + queryParameters: {'event': event}, + )}', + ); + } else { + context.go('/rooms/${room.id}'); + } + return; + } else { + await showAdaptiveDialog( + context: context, + builder: (c) => PublicRoomDialog( + roomAlias: identityParts.primaryIdentifier, + ), + ); + } + if (roomIdOrAlias.sigil == '!') { + if (await showOkCancelAlertDialog( + useRootNavigator: false, + context: context, + title: 'Join room $roomIdOrAlias', + ) == + OkCancelResult.ok) { + roomId = roomIdOrAlias; + final response = await showFutureLoadingDialog( + context: context, + future: () => matrix.client.joinRoom( + roomIdOrAlias, + serverName: servers.isNotEmpty ? servers.toList() : null, + ), + ); + if (response.error != null) return; + // wait for two seconds so that it probably came down /sync + await showFutureLoadingDialog( + context: context, + future: () => Future.delayed(const Duration(seconds: 2)), + ); + if (event != null) { + context.go( + Uri( + pathSegments: ['rooms', response.result!], + queryParameters: {'event': event}, + ).toString(), + ); + } else { + context.go('/rooms/${response.result!}'); + } + } + } + } else if (identityParts.primaryIdentifier.sigil == '@') { + final userId = identityParts.primaryIdentifier; + var noProfileWarning = false; + final profileResult = await showFutureLoadingDialog( + context: context, + future: () => matrix.client.getProfileFromUserId(userId).catchError( + (_) { + noProfileWarning = true; + return Profile(userId: userId); + }, + ), + ); + await UserDialog.show( + context: context, + profile: profileResult.result!, + noProfileWarning: noProfileWarning, + ); + } + } +} diff --git a/lib/utils/voip/user_media_manager.dart b/lib/utils/voip/user_media_manager.dart new file mode 100644 index 0000000..e1677f8 --- /dev/null +++ b/lib/utils/voip/user_media_manager.dart @@ -0,0 +1,28 @@ +import 'package:just_audio/just_audio.dart'; + +class UserMediaManager { + factory UserMediaManager() { + return _instance; + } + + UserMediaManager._internal(); + + static final UserMediaManager _instance = UserMediaManager._internal(); + + AudioPlayer? _assetsAudioPlayer; + + Future startRingingTone() async { + const path = 'assets/sounds/phone.ogg'; + final player = _assetsAudioPlayer = AudioPlayer(); + player.setAsset(path); + player.play(); + + return; + } + + Future stopRingingTone() async { + await _assetsAudioPlayer?.stop(); + _assetsAudioPlayer = null; + return; + } +} diff --git a/lib/utils/voip/video_renderer.dart b/lib/utils/voip/video_renderer.dart new file mode 100644 index 0000000..afdd9be --- /dev/null +++ b/lib/utils/voip/video_renderer.dart @@ -0,0 +1,86 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; + +import 'package:flutter_webrtc/flutter_webrtc.dart'; +import 'package:matrix/matrix.dart'; + +class VideoRenderer extends StatefulWidget { + final WrappedMediaStream? stream; + final bool mirror; + final RTCVideoViewObjectFit fit; + + const VideoRenderer( + this.stream, { + this.mirror = false, + this.fit = RTCVideoViewObjectFit.RTCVideoViewObjectFitContain, + super.key, + }); + + @override + State createState() => _VideoRendererState(); +} + +class _VideoRendererState extends State { + RTCVideoRenderer? _renderer; + bool _rendererReady = false; + MediaStream? get mediaStream => widget.stream?.stream; + StreamSubscription? _streamChangeSubscription; + + Future _initializeRenderer() async { + _renderer ??= RTCVideoRenderer(); + await _renderer!.initialize(); + _renderer!.srcObject = mediaStream; + return _renderer!; + } + + void disposeRenderer() { + try { + _renderer?.srcObject = null; + _renderer?.dispose(); + _renderer = null; + // ignore: empty_catches + } catch (e) {} + } + + @override + void initState() { + _streamChangeSubscription = + widget.stream?.onStreamChanged.stream.listen((stream) { + setState(() { + _renderer?.srcObject = stream; + }); + }); + setupRenderer(); + super.initState(); + } + + Future setupRenderer() async { + await _initializeRenderer(); + setState(() => _rendererReady = true); + } + + @override + void dispose() { + _streamChangeSubscription?.cancel(); + disposeRenderer(); + super.dispose(); + } + + @override + Widget build(BuildContext context) => !_rendererReady + ? Container() + : Builder( + key: widget.key, + builder: (ctx) { + return RTCVideoView( + _renderer!, + mirror: widget.mirror, + filterQuality: FilterQuality.medium, + objectFit: widget.fit, + placeholderBuilder: (_) => + Container(color: Colors.white.withAlpha(45)), + ); + }, + ); +} diff --git a/lib/utils/voip_plugin.dart b/lib/utils/voip_plugin.dart new file mode 100644 index 0000000..c5120d6 --- /dev/null +++ b/lib/utils/voip_plugin.dart @@ -0,0 +1,177 @@ +import 'dart:core'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; + +import 'package:flutter_foreground_task/flutter_foreground_task.dart'; +import 'package:flutter_webrtc/flutter_webrtc.dart' as webrtc_impl; +import 'package:matrix/matrix.dart'; +import 'package:webrtc_interface/webrtc_interface.dart' hide Navigator; + +import 'package:fluffychat/pages/chat_list/chat_list.dart'; +import 'package:fluffychat/pages/dialer/dialer.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; +import '../../utils/voip/user_media_manager.dart'; +import '../widgets/matrix.dart'; + +class VoipPlugin with WidgetsBindingObserver implements WebRTCDelegate { + final MatrixState matrix; + Client get client => matrix.client; + VoipPlugin(this.matrix) { + voip = VoIP(client, this); + if (!kIsWeb) { + final wb = WidgetsBinding.instance; + wb.addObserver(this); + didChangeAppLifecycleState(wb.lifecycleState); + } + } + bool background = false; + bool speakerOn = false; + late VoIP voip; + OverlayEntry? overlayEntry; + BuildContext get context => matrix.context; + + @override + void didChangeAppLifecycleState(AppLifecycleState? state) { + background = (state == AppLifecycleState.detached || + state == AppLifecycleState.paused); + } + + void addCallingOverlay(String callId, CallSession call) { + final context = + kIsWeb ? ChatList.contextForVoip! : this.context; // web is weird + + if (overlayEntry != null) { + Logs().e('[VOIP] addCallingOverlay: The call session already exists?'); + overlayEntry!.remove(); + } + // Overlay.of(context) is broken on web + // falling back on a dialog + if (kIsWeb) { + showDialog( + context: context, + builder: (context) => Calling( + context: context, + client: client, + callId: callId, + call: call, + onClear: () => Navigator.of(context).pop(), + ), + ); + } else { + overlayEntry = OverlayEntry( + builder: (_) => Calling( + context: context, + client: client, + callId: callId, + call: call, + onClear: () { + overlayEntry?.remove(); + overlayEntry = null; + }, + ), + ); + Overlay.of(context).insert(overlayEntry!); + } + } + + @override + MediaDevices get mediaDevices => webrtc_impl.navigator.mediaDevices; + + @override + bool get isWeb => kIsWeb; + + @override + Future createPeerConnection( + Map configuration, [ + Map constraints = const {}, + ]) => + webrtc_impl.createPeerConnection(configuration, constraints); + + Future get hasCallingAccount async => false; + + @override + Future playRingtone() async { + if (!background && !await hasCallingAccount) { + try { + await UserMediaManager().startRingingTone(); + } catch (_) {} + } + } + + @override + Future stopRingtone() async { + if (!background && !await hasCallingAccount) { + try { + await UserMediaManager().stopRingingTone(); + } catch (_) {} + } + } + + @override + Future handleNewCall(CallSession call) async { + if (PlatformInfos.isAndroid) { + try { + final wasForeground = await FlutterForegroundTask.isAppOnForeground; + + await matrix.store.setString( + 'wasForeground', + wasForeground == true ? 'true' : 'false', + ); + FlutterForegroundTask.setOnLockScreenVisibility(true); + FlutterForegroundTask.wakeUpScreen(); + FlutterForegroundTask.launchApp(); + } catch (e) { + Logs().e('VOIP foreground failed $e'); + } + // use fallback flutter call pages for outgoing and video calls. + addCallingOverlay(call.callId, call); + } else { + addCallingOverlay(call.callId, call); + } + } + + @override + Future handleCallEnded(CallSession session) async { + if (overlayEntry != null) { + overlayEntry!.remove(); + overlayEntry = null; + if (PlatformInfos.isAndroid) { + FlutterForegroundTask.setOnLockScreenVisibility(false); + FlutterForegroundTask.stopService(); + final wasForeground = matrix.store.getString('wasForeground'); + wasForeground == 'false' ? FlutterForegroundTask.minimizeApp() : null; + } + } + } + + @override + Future handleGroupCallEnded(GroupCallSession groupCall) async { + // TODO: implement handleGroupCallEnded + } + + @override + Future handleNewGroupCall(GroupCallSession groupCall) async { + // TODO: implement handleNewGroupCall + } + + @override + // TODO: implement canHandleNewCall + bool get canHandleNewCall => + voip.currentCID == null && voip.currentGroupCID == null; + + @override + Future handleMissedCall(CallSession session) async { + // TODO: implement handleMissedCall + } + + @override + // TODO: implement keyProvider + EncryptionKeyProvider? get keyProvider => throw UnimplementedError(); + + @override + Future registerListeners(CallSession session) { + // TODO: implement registerListeners + throw UnimplementedError(); + } +} diff --git a/lib/widgets/adaptive_dialogs/adaptive_dialog_action.dart b/lib/widgets/adaptive_dialogs/adaptive_dialog_action.dart new file mode 100644 index 0000000..a802890 --- /dev/null +++ b/lib/widgets/adaptive_dialogs/adaptive_dialog_action.dart @@ -0,0 +1,61 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +class AdaptiveDialogAction extends StatelessWidget { + final VoidCallback? onPressed; + final bool autofocus; + final Widget child; + final bool bigButtons; + + const AdaptiveDialogAction({ + super.key, + required this.onPressed, + required this.child, + this.autofocus = false, + this.bigButtons = false, + }); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + switch (theme.platform) { + case TargetPlatform.android: + case TargetPlatform.fuchsia: + case TargetPlatform.linux: + case TargetPlatform.windows: + if (bigButtons) { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 8.0), + child: SizedBox( + width: double.infinity, + child: ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: autofocus + ? theme.colorScheme.primary + : theme.colorScheme.surfaceBright, + foregroundColor: autofocus + ? theme.colorScheme.onPrimary + : theme.colorScheme.primary, + ), + onPressed: onPressed, + autofocus: autofocus, + child: child, + ), + ), + ); + } + return TextButton( + onPressed: onPressed, + autofocus: autofocus, + child: child, + ); + case TargetPlatform.iOS: + case TargetPlatform.macOS: + return CupertinoDialogAction( + onPressed: onPressed, + isDefaultAction: autofocus, + child: child, + ); + } + } +} diff --git a/lib/widgets/adaptive_dialogs/dialog_text_field.dart b/lib/widgets/adaptive_dialogs/dialog_text_field.dart new file mode 100644 index 0000000..c801478 --- /dev/null +++ b/lib/widgets/adaptive_dialogs/dialog_text_field.dart @@ -0,0 +1,95 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +class DialogTextField extends StatelessWidget { + final TextEditingController? controller; + final String? hintText; + final String? labelText; + final String? initialText; + final String? counterText; + final String? prefixText; + final String? suffixText; + final String? errorText; + final bool obscureText = false; + final bool isDestructive = false; + final int? minLines; + final int? maxLines; + final TextInputType? keyboardType; + final int? maxLength; + final bool autocorrect = true; + + const DialogTextField({ + super.key, + this.hintText, + this.labelText, + this.initialText, + this.prefixText, + this.suffixText, + this.minLines, + this.maxLines, + this.keyboardType, + this.maxLength, + this.controller, + this.counterText, + this.errorText, + }); + + @override + Widget build(BuildContext context) { + final prefixText = this.prefixText; + final suffixText = this.suffixText; + final errorText = this.errorText; + final theme = Theme.of(context); + switch (theme.platform) { + case TargetPlatform.android: + case TargetPlatform.fuchsia: + case TargetPlatform.linux: + case TargetPlatform.windows: + return TextField( + controller: controller, + obscureText: obscureText, + minLines: minLines, + maxLines: maxLines, + maxLength: maxLength, + keyboardType: keyboardType, + autocorrect: autocorrect, + decoration: InputDecoration( + errorText: errorText, + hintText: hintText, + labelText: labelText, + prefixText: prefixText, + suffixText: suffixText, + counterText: counterText, + ), + ); + case TargetPlatform.iOS: + case TargetPlatform.macOS: + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + CupertinoTextField( + controller: controller, + obscureText: obscureText, + minLines: minLines, + maxLines: maxLines, + maxLength: maxLength, + keyboardType: keyboardType, + autocorrect: autocorrect, + prefix: prefixText != null ? Text(prefixText) : null, + suffix: suffixText != null ? Text(suffixText) : null, + placeholder: labelText ?? hintText, + ), + if (errorText != null) + Text( + errorText, + style: TextStyle( + fontSize: 11, + color: theme.colorScheme.error, + ), + textAlign: TextAlign.left, + ), + ], + ); + } + } +} diff --git a/lib/widgets/adaptive_dialogs/public_room_dialog.dart b/lib/widgets/adaptive_dialogs/public_room_dialog.dart new file mode 100644 index 0000000..3cbabb3 --- /dev/null +++ b/lib/widgets/adaptive_dialogs/public_room_dialog.dart @@ -0,0 +1,231 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:flutter_linkify/flutter_linkify.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; +import '../../config/themes.dart'; +import '../../utils/url_launcher.dart'; +import '../avatar.dart'; +import '../future_loading_dialog.dart'; +import '../hover_builder.dart'; +import '../matrix.dart'; +import '../mxc_image_viewer.dart'; +import 'adaptive_dialog_action.dart'; + +class PublicRoomDialog extends StatelessWidget { + final String? roomAlias; + final PublicRoomsChunk? chunk; + final List? via; + + const PublicRoomDialog({super.key, this.roomAlias, this.chunk, this.via}); + + void _joinRoom(BuildContext context) async { + final client = Matrix.of(context).client; + final chunk = this.chunk; + final knock = chunk?.joinRule == 'knock'; + final result = await showFutureLoadingDialog( + context: context, + future: () async { + if (chunk != null && client.getRoomById(chunk.roomId) != null) { + return chunk.roomId; + } + final roomId = chunk != null && knock + ? await client.knockRoom(chunk.roomId, via: via) + : await client.joinRoom( + roomAlias ?? chunk!.roomId, + via: via, + ); + + if (!knock && client.getRoomById(roomId) == null) { + await client.waitForRoomInSync(roomId); + } + return roomId; + }, + ); + final roomId = result.result; + if (roomId == null) return; + if (knock && client.getRoomById(roomId) == null) { + Navigator.of(context).pop(true); + await showOkAlertDialog( + context: context, + title: L10n.of(context).youHaveKnocked, + message: L10n.of(context).pleaseWaitUntilInvited, + ); + return; + } + if (result.error != null) return; + if (!context.mounted) return; + Navigator.of(context).pop(true); + // don't open the room if the joined room is a space + if (chunk?.roomType != 'm.space' && + !client.getRoomById(result.result!)!.isSpace) { + context.go('/rooms/$roomId'); + } + return; + } + + bool _testRoom(PublicRoomsChunk r) => r.canonicalAlias == roomAlias; + + Future _search(BuildContext context) async { + final chunk = this.chunk; + if (chunk != null) return chunk; + final query = await Matrix.of(context).client.queryPublicRooms( + server: roomAlias!.domain, + filter: PublicRoomQueryFilter( + genericSearchTerm: roomAlias, + ), + ); + if (!query.chunk.any(_testRoom)) { + throw (L10n.of(context).noRoomsFound); + } + return query.chunk.firstWhere(_testRoom); + } + + @override + Widget build(BuildContext context) { + final roomAlias = this.roomAlias ?? chunk?.canonicalAlias; + final roomLink = roomAlias ?? chunk?.roomId; + var copied = false; + return AlertDialog.adaptive( + title: ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 256), + child: Text( + chunk?.name ?? roomAlias?.localpart ?? chunk?.roomId ?? 'Unknown', + textAlign: TextAlign.center, + ), + ), + content: ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 256, maxHeight: 256), + child: FutureBuilder( + future: _search(context), + builder: (context, snapshot) { + final theme = Theme.of(context); + + final profile = snapshot.data; + final avatar = profile?.avatarUrl; + final topic = profile?.topic; + return SingleChildScrollView( + child: Column( + spacing: 8, + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + if (roomLink != null) + HoverBuilder( + builder: (context, hovered) => StatefulBuilder( + builder: (context, setState) => MouseRegion( + cursor: SystemMouseCursors.click, + child: GestureDetector( + onTap: () { + Clipboard.setData( + ClipboardData(text: roomLink), + ); + setState(() { + copied = true; + }); + }, + child: RichText( + text: TextSpan( + children: [ + WidgetSpan( + child: Padding( + padding: + const EdgeInsets.only(right: 4.0), + child: AnimatedScale( + duration: + FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + scale: hovered + ? 1.33 + : copied + ? 1.25 + : 1.0, + child: Icon( + copied + ? Icons.check_circle + : Icons.copy, + size: 12, + color: copied ? Colors.green : null, + ), + ), + ), + ), + TextSpan(text: roomLink), + ], + style: theme.textTheme.bodyMedium + ?.copyWith(fontSize: 10), + ), + textAlign: TextAlign.center, + ), + ), + ), + ), + ), + Center( + child: Avatar( + mxContent: avatar, + name: profile?.name ?? roomLink, + size: Avatar.defaultSize * 2, + onTap: avatar != null + ? () => showDialog( + context: context, + builder: (_) => MxcImageViewer(avatar), + ) + : null, + ), + ), + if (profile?.numJoinedMembers != null) + Text( + L10n.of(context).countParticipants( + profile?.numJoinedMembers ?? 0, + ), + style: const TextStyle(fontSize: 10), + textAlign: TextAlign.center, + ), + if (topic != null && topic.isNotEmpty) + SelectableLinkify( + text: topic, + textScaleFactor: + MediaQuery.textScalerOf(context).scale(1), + textAlign: TextAlign.center, + options: const LinkifyOptions(humanize: false), + linkStyle: TextStyle( + color: theme.colorScheme.primary, + decoration: TextDecoration.underline, + decorationColor: theme.colorScheme.primary, + ), + onOpen: (url) => + UrlLauncher(context, url.url).launchUrl(), + ), + ], + ), + ); + }, + ), + ), + actions: [ + AdaptiveDialogAction( + bigButtons: true, + onPressed: () => _joinRoom(context), + child: Text( + chunk?.joinRule == 'knock' && + Matrix.of(context).client.getRoomById(chunk!.roomId) == null + ? L10n.of(context).knock + : chunk?.roomType == 'm.space' + ? L10n.of(context).joinSpace + : L10n.of(context).joinRoom, + ), + ), + AdaptiveDialogAction( + bigButtons: true, + onPressed: Navigator.of(context).pop, + child: Text(L10n.of(context).close), + ), + ], + ); + } +} diff --git a/lib/widgets/adaptive_dialogs/show_modal_action_popup.dart b/lib/widgets/adaptive_dialogs/show_modal_action_popup.dart new file mode 100644 index 0000000..7e67098 --- /dev/null +++ b/lib/widgets/adaptive_dialogs/show_modal_action_popup.dart @@ -0,0 +1,116 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +Future showModalActionPopup({ + required BuildContext context, + required List> actions, + String? title, + String? message, + String? cancelLabel, + bool useRootNavigator = true, +}) { + final theme = Theme.of(context); + + switch (theme.platform) { + case TargetPlatform.android: + case TargetPlatform.fuchsia: + case TargetPlatform.windows: + case TargetPlatform.linux: + return showModalBottomSheet( + isScrollControlled: true, + useRootNavigator: useRootNavigator, + context: context, + clipBehavior: Clip.hardEdge, + constraints: BoxConstraints( + maxWidth: 512, + maxHeight: MediaQuery.of(context).size.height - 32, + ), + builder: (context) => ListView( + shrinkWrap: true, + children: [ + if (title != null || message != null) ...[ + ListTile( + title: title == null + ? null + : Text( + title, + style: theme.textTheme.labelSmall, + ), + subtitle: message == null ? null : Text(message), + ), + const Divider(height: 1), + ], + ...actions.map( + (action) => ListTile( + leading: action.icon, + title: Text( + action.label, + maxLines: 1, + style: action.isDestructive + ? TextStyle( + color: theme.colorScheme.error, + fontWeight: + action.isDefaultAction ? FontWeight.bold : null, + ) + : null, + ), + onTap: () => Navigator.of(context).pop(action.value), + ), + ), + if (cancelLabel != null) ...[ + const Divider(height: 1), + ListTile( + title: Text(cancelLabel), + onTap: () => Navigator.of(context).pop(null), + ), + ], + ], + ), + ); + case TargetPlatform.iOS: + case TargetPlatform.macOS: + return showCupertinoModalPopup( + context: context, + useRootNavigator: useRootNavigator, + builder: (context) => ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 512), + child: CupertinoActionSheet( + title: title == null ? null : Text(title), + message: message == null ? null : Text(message), + cancelButton: cancelLabel == null + ? null + : CupertinoActionSheetAction( + onPressed: () => Navigator.of(context).pop(null), + child: Text(cancelLabel), + ), + actions: actions + .map( + (action) => CupertinoActionSheetAction( + isDestructiveAction: action.isDestructive, + isDefaultAction: action.isDefaultAction, + onPressed: () => Navigator.of(context).pop(action.value), + child: Text(action.label, maxLines: 1), + ), + ) + .toList(), + ), + ), + ); + } +} + +class AdaptiveModalAction { + final String label; + final T value; + Icon? icon; + final bool isDefaultAction; + final bool isDestructive; + + AdaptiveModalAction({ + required this.label, + required this.value, + this.icon, + this.isDefaultAction = false, + this.isDestructive = false, + }); +} diff --git a/lib/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart b/lib/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart new file mode 100644 index 0000000..15f60a2 --- /dev/null +++ b/lib/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart @@ -0,0 +1,103 @@ +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:flutter_linkify/flutter_linkify.dart'; + +import 'package:fluffychat/utils/url_launcher.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/adaptive_dialog_action.dart'; + +enum OkCancelResult { ok, cancel } + +Future showOkCancelAlertDialog({ + required BuildContext context, + required String title, + String? message, + String? okLabel, + String? cancelLabel, + bool isDestructive = false, + bool useRootNavigator = true, +}) => + showAdaptiveDialog( + context: context, + useRootNavigator: useRootNavigator, + builder: (context) => AlertDialog.adaptive( + title: ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 256), + child: Text(title), + ), + content: ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 256), + child: message == null + ? null + : SelectableLinkify( + text: message, + textScaleFactor: MediaQuery.textScalerOf(context).scale(1), + linkStyle: TextStyle( + color: Theme.of(context).colorScheme.primary, + decorationColor: Theme.of(context).colorScheme.primary, + ), + options: const LinkifyOptions(humanize: false), + onOpen: (url) => UrlLauncher(context, url.url).launchUrl(), + ), + ), + actions: [ + AdaptiveDialogAction( + onPressed: () => Navigator.of(context) + .pop(OkCancelResult.cancel), + child: Text(cancelLabel ?? L10n.of(context).cancel), + ), + AdaptiveDialogAction( + onPressed: () => + Navigator.of(context).pop(OkCancelResult.ok), + autofocus: true, + child: Text( + okLabel ?? L10n.of(context).ok, + style: isDestructive + ? TextStyle(color: Theme.of(context).colorScheme.error) + : null, + ), + ), + ], + ), + ); + +Future showOkAlertDialog({ + required BuildContext context, + required String title, + String? message, + String? okLabel, + bool useRootNavigator = true, +}) => + showAdaptiveDialog( + context: context, + useRootNavigator: useRootNavigator, + builder: (context) => AlertDialog.adaptive( + title: ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 256), + child: Text(title), + ), + content: ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 256), + child: message == null + ? null + : SelectableLinkify( + text: message, + textScaleFactor: MediaQuery.textScalerOf(context).scale(1), + linkStyle: TextStyle( + color: Theme.of(context).colorScheme.primary, + decorationColor: Theme.of(context).colorScheme.primary, + ), + options: const LinkifyOptions(humanize: false), + onOpen: (url) => UrlLauncher(context, url.url).launchUrl(), + ), + ), + actions: [ + AdaptiveDialogAction( + onPressed: () => + Navigator.of(context).pop(OkCancelResult.ok), + autofocus: true, + child: Text(okLabel ?? L10n.of(context).close), + ), + ], + ), + ); diff --git a/lib/widgets/adaptive_dialogs/show_text_input_dialog.dart b/lib/widgets/adaptive_dialogs/show_text_input_dialog.dart new file mode 100644 index 0000000..cc58da5 --- /dev/null +++ b/lib/widgets/adaptive_dialogs/show_text_input_dialog.dart @@ -0,0 +1,110 @@ +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:flutter_linkify/flutter_linkify.dart'; + +import 'package:fluffychat/utils/url_launcher.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/adaptive_dialog_action.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/dialog_text_field.dart'; + +Future showTextInputDialog({ + required BuildContext context, + required String title, + String? message, + String? okLabel, + String? cancelLabel, + bool useRootNavigator = true, + String? hintText, + String? labelText, + String? initialText, + String? prefixText, + String? suffixText, + bool obscureText = false, + bool isDestructive = false, + int? minLines, + int? maxLines, + String? Function(String input)? validator, + TextInputType? keyboardType, + int? maxLength, + bool autocorrect = true, +}) { + return showAdaptiveDialog( + context: context, + useRootNavigator: useRootNavigator, + builder: (context) { + final controller = TextEditingController(text: initialText); + final error = ValueNotifier(null); + return ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 512), + child: AlertDialog.adaptive( + title: ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 256), + child: Text(title), + ), + content: ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 256), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + if (message != null) + SelectableLinkify( + text: message, + textScaleFactor: MediaQuery.textScalerOf(context).scale(1), + linkStyle: TextStyle( + color: Theme.of(context).colorScheme.primary, + decorationColor: Theme.of(context).colorScheme.primary, + ), + options: const LinkifyOptions(humanize: false), + onOpen: (url) => UrlLauncher(context, url.url).launchUrl(), + ), + const SizedBox(height: 16), + ValueListenableBuilder( + valueListenable: error, + builder: (context, error, _) { + return DialogTextField( + hintText: hintText, + errorText: error, + labelText: labelText, + controller: controller, + initialText: initialText, + prefixText: prefixText, + suffixText: suffixText, + minLines: minLines, + maxLines: maxLines, + maxLength: maxLength, + keyboardType: keyboardType, + ); + }, + ), + ], + ), + ), + actions: [ + AdaptiveDialogAction( + onPressed: () => Navigator.of(context).pop(null), + child: Text(cancelLabel ?? L10n.of(context).cancel), + ), + AdaptiveDialogAction( + onPressed: () { + final input = controller.text; + final errorText = validator?.call(input); + if (errorText != null) { + error.value = errorText; + return; + } + Navigator.of(context).pop(input); + }, + autofocus: true, + child: Text( + okLabel ?? L10n.of(context).ok, + style: isDestructive + ? TextStyle(color: Theme.of(context).colorScheme.error) + : null, + ), + ), + ], + ), + ); + }, + ); +} diff --git a/lib/widgets/adaptive_dialogs/user_dialog.dart b/lib/widgets/adaptive_dialogs/user_dialog.dart new file mode 100644 index 0000000..3c68677 --- /dev/null +++ b/lib/widgets/adaptive_dialogs/user_dialog.dart @@ -0,0 +1,210 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:flutter_linkify/flutter_linkify.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/utils/date_time_extension.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/adaptive_dialog_action.dart'; +import 'package:fluffychat/widgets/avatar.dart'; +import 'package:fluffychat/widgets/presence_builder.dart'; +import '../../utils/url_launcher.dart'; +import '../future_loading_dialog.dart'; +import '../hover_builder.dart'; +import '../matrix.dart'; +import '../mxc_image_viewer.dart'; + +class UserDialog extends StatelessWidget { + static Future show({ + required BuildContext context, + required Profile profile, + bool noProfileWarning = false, + }) => + showAdaptiveDialog( + context: context, + barrierDismissible: true, + builder: (context) => UserDialog( + profile, + noProfileWarning: noProfileWarning, + ), + ); + + final Profile profile; + final bool noProfileWarning; + + const UserDialog(this.profile, {this.noProfileWarning = false, super.key}); + + @override + Widget build(BuildContext context) { + final client = Matrix.of(context).client; + final dmRoomId = client.getDirectChatFromUserId(profile.userId); + final displayname = profile.displayName ?? + profile.userId.localpart ?? + L10n.of(context).user; + var copied = false; + final theme = Theme.of(context); + final avatar = profile.avatarUrl; + return AlertDialog.adaptive( + title: ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 256), + child: Center(child: Text(displayname, textAlign: TextAlign.center)), + ), + content: ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 256, maxHeight: 256), + child: PresenceBuilder( + userId: profile.userId, + client: Matrix.of(context).client, + builder: (context, presence) { + if (presence == null) return const SizedBox.shrink(); + final statusMsg = presence.statusMsg; + final lastActiveTimestamp = presence.lastActiveTimestamp; + final presenceText = presence.currentlyActive == true + ? L10n.of(context).currentlyActive + : lastActiveTimestamp != null + ? L10n.of(context).lastActiveAgo( + lastActiveTimestamp.localizedTimeShort(context), + ) + : null; + return SingleChildScrollView( + child: Column( + spacing: 8, + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + HoverBuilder( + builder: (context, hovered) => StatefulBuilder( + builder: (context, setState) => MouseRegion( + cursor: SystemMouseCursors.click, + child: GestureDetector( + onTap: () { + Clipboard.setData( + ClipboardData(text: profile.userId), + ); + setState(() { + copied = true; + }); + }, + child: RichText( + text: TextSpan( + children: [ + WidgetSpan( + child: Padding( + padding: const EdgeInsets.only(right: 4.0), + child: AnimatedScale( + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + scale: hovered + ? 1.33 + : copied + ? 1.25 + : 1.0, + child: Icon( + copied + ? Icons.check_circle + : Icons.copy, + size: 12, + color: copied ? Colors.green : null, + ), + ), + ), + ), + TextSpan(text: profile.userId), + ], + style: theme.textTheme.bodyMedium + ?.copyWith(fontSize: 10), + ), + textAlign: TextAlign.center, + ), + ), + ), + ), + ), + Center( + child: Avatar( + mxContent: avatar, + name: displayname, + size: Avatar.defaultSize * 2, + onTap: avatar != null + ? () => showDialog( + context: context, + builder: (_) => MxcImageViewer(avatar), + ) + : null, + ), + ), + if (presenceText != null) + Text( + presenceText, + style: const TextStyle(fontSize: 10), + textAlign: TextAlign.center, + ), + if (statusMsg != null) + SelectableLinkify( + text: statusMsg, + textScaleFactor: + MediaQuery.textScalerOf(context).scale(1), + textAlign: TextAlign.center, + options: const LinkifyOptions(humanize: false), + linkStyle: TextStyle( + color: theme.colorScheme.primary, + decoration: TextDecoration.underline, + decorationColor: theme.colorScheme.primary, + ), + onOpen: (url) => + UrlLauncher(context, url.url).launchUrl(), + ), + ], + ), + ); + }, + ), + ), + actions: [ + if (client.userID != profile.userId) ...[ + AdaptiveDialogAction( + bigButtons: true, + onPressed: () async { + final router = GoRouter.of(context); + Navigator.of(context).pop(); + final roomIdResult = await showFutureLoadingDialog( + context: context, + future: () => client.startDirectChat(profile.userId), + ); + final roomId = roomIdResult.result; + if (roomId == null) return; + router.go('/rooms/$roomId'); + }, + child: Text( + dmRoomId == null + ? L10n.of(context).startConversation + : L10n.of(context).sendAMessage, + ), + ), + AdaptiveDialogAction( + bigButtons: true, + onPressed: () { + final router = GoRouter.of(context); + Navigator.of(context).pop(); + router.go( + '/rooms/settings/security/ignorelist', + extra: profile.userId, + ); + }, + child: Text( + L10n.of(context).ignoreUser, + style: TextStyle(color: theme.colorScheme.error), + ), + ), + ], + AdaptiveDialogAction( + bigButtons: true, + onPressed: Navigator.of(context).pop, + child: Text(L10n.of(context).close), + ), + ], + ); + } +} diff --git a/lib/widgets/app_lock.dart b/lib/widgets/app_lock.dart new file mode 100644 index 0000000..d337358 --- /dev/null +++ b/lib/widgets/app_lock.dart @@ -0,0 +1,114 @@ +import 'package:flutter/material.dart'; + +import 'package:flutter_secure_storage/flutter_secure_storage.dart'; +import 'package:matrix/matrix.dart'; +import 'package:provider/provider.dart'; + +import 'package:fluffychat/config/setting_keys.dart'; +import 'package:fluffychat/widgets/lock_screen.dart'; + +class AppLockWidget extends StatefulWidget { + const AppLockWidget({ + required this.child, + required this.pincode, + required this.clients, + super.key, + }); + + final List clients; + final String? pincode; + final Widget child; + + @override + State createState() => AppLock(); +} + +class AppLock extends State with WidgetsBindingObserver { + String? _pincode; + bool _isLocked = false; + bool _paused = false; + bool get isActive => + _pincode != null && + int.tryParse(_pincode!) != null && + _pincode!.length == 4 && + !_paused; + + @override + void initState() { + _pincode = widget.pincode; + _isLocked = isActive; + super.initState(); + WidgetsBinding.instance.addObserver(this); + WidgetsBinding.instance.addPostFrameCallback(_checkLoggedIn); + } + + void _checkLoggedIn(_) async { + if (widget.clients.any((client) => client.isLogged())) return; + + await changePincode(null); + setState(() { + _isLocked = false; + }); + } + + @override + void didChangeAppLifecycleState(AppLifecycleState state) { + if (isActive && + state == AppLifecycleState.hidden && + !_isLocked && + isActive) { + showLockScreen(); + } + } + + bool get isLocked => _isLocked; + + Future changePincode(String? pincode) async { + await const FlutterSecureStorage().write( + key: SettingKeys.appLockKey, + value: pincode, + ); + _pincode = pincode; + return; + } + + bool unlock(String pincode) { + final isCorrect = pincode == _pincode; + if (isCorrect) { + setState(() { + _isLocked = false; + }); + } + return isCorrect; + } + + void showLockScreen() => setState(() { + _isLocked = true; + }); + + Future pauseWhile(Future future) async { + _paused = true; + try { + return await future; + } finally { + _paused = false; + } + } + + static AppLock of(BuildContext context) => Provider.of( + context, + listen: false, + ); + + @override + Widget build(BuildContext context) => Provider( + create: (_) => this, + child: Stack( + fit: StackFit.expand, + children: [ + widget.child, + if (isLocked) const LockScreen(), + ], + ), + ); +} diff --git a/lib/widgets/avatar.dart b/lib/widgets/avatar.dart new file mode 100644 index 0000000..25952bd --- /dev/null +++ b/lib/widgets/avatar.dart @@ -0,0 +1,149 @@ +import 'package:flutter/material.dart'; + +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/utils/string_color.dart'; +import 'package:fluffychat/widgets/mxc_image.dart'; +import 'package:fluffychat/widgets/presence_builder.dart'; + +class Avatar extends StatelessWidget { + final Uri? mxContent; + final String? name; + final double size; + final void Function()? onTap; + static const double defaultSize = 44; + final Client? client; + final String? presenceUserId; + final Color? presenceBackgroundColor; + final BorderRadius? borderRadius; + final IconData? icon; + final BorderSide? border; + + const Avatar({ + this.mxContent, + this.name, + this.size = defaultSize, + this.onTap, + this.client, + this.presenceUserId, + this.presenceBackgroundColor, + this.borderRadius, + this.border, + this.icon, + super.key, + }); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + final name = this.name; + final fallbackLetters = + name == null || name.isEmpty ? '@' : name.substring(0, 1); + + final noPic = mxContent == null || + mxContent.toString().isEmpty || + mxContent.toString() == 'null'; + final borderRadius = this.borderRadius ?? BorderRadius.circular(size / 2); + final presenceUserId = this.presenceUserId; + final container = Stack( + children: [ + SizedBox( + width: size, + height: size, + child: Material( + color: theme.brightness == Brightness.light + ? Colors.white + : Colors.black, + shape: RoundedRectangleBorder( + borderRadius: borderRadius, + side: border ?? BorderSide.none, + ), + clipBehavior: Clip.hardEdge, + child: noPic + ? Container( + decoration: BoxDecoration(color: name?.lightColorAvatar), + alignment: Alignment.center, + child: Text( + fallbackLetters, + textAlign: TextAlign.center, + style: TextStyle( + fontFamily: 'RobotoMono', + color: Colors.white, + fontWeight: FontWeight.bold, + fontSize: (size / 2.5).roundToDouble(), + ), + ), + ) + : MxcImage( + client: client, + key: ValueKey(mxContent.toString()), + cacheKey: '${mxContent}_$size', + uri: mxContent, + fit: BoxFit.cover, + width: size, + height: size, + placeholder: (_) => Center( + child: Icon( + Icons.person_2, + color: theme.colorScheme.tertiary, + size: size / 1.5, + ), + ), + ), + ), + ), + if (presenceUserId != null) + PresenceBuilder( + client: client, + userId: presenceUserId, + builder: (context, presence) { + if (presence == null || + (presence.presence == PresenceType.offline && + presence.lastActiveTimestamp == null)) { + return const SizedBox.shrink(); + } + final dotColor = presence.presence.isOnline + ? Colors.green + : presence.presence.isUnavailable + ? Colors.orange + : Colors.grey; + return Positioned( + bottom: -3, + right: -3, + child: Container( + width: 16, + height: 16, + decoration: BoxDecoration( + color: presenceBackgroundColor ?? theme.colorScheme.surface, + borderRadius: BorderRadius.circular(32), + ), + alignment: Alignment.center, + child: Container( + width: 10, + height: 10, + decoration: BoxDecoration( + color: dotColor, + borderRadius: BorderRadius.circular(16), + border: Border.all( + width: 1, + color: theme.colorScheme.surface, + ), + ), + ), + ), + ); + }, + ), + ], + ); + if (onTap == null) return container; + return MouseRegion( + cursor: SystemMouseCursors.click, + child: GestureDetector( + onTap: onTap, + child: container, + ), + ); + } +} diff --git a/lib/widgets/blur_hash.dart b/lib/widgets/blur_hash.dart new file mode 100644 index 0000000..d4ad1dd --- /dev/null +++ b/lib/widgets/blur_hash.dart @@ -0,0 +1,104 @@ +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; + +import 'package:blurhash_dart/blurhash_dart.dart' as b; +import 'package:image/image.dart' as image; + +class BlurHash extends StatefulWidget { + final double width; + final double height; + final String blurhash; + final BoxFit fit; + + const BlurHash({ + super.key, + String? blurhash, + required this.width, + required this.height, + this.fit = BoxFit.cover, + }) : blurhash = blurhash ?? 'LEHV6nWB2yk8pyo0adR*.7kCMdnj'; + + @override + State createState() => _BlurHashState(); +} + +class _BlurHashState extends State { + Uint8List? _data; + + static Future getBlurhashData( + BlurhashData blurhashData, + ) async { + final blurhash = b.BlurHash.decode(blurhashData.hsh); + final img = blurhash.toImage(blurhashData.w, blurhashData.h); + return Uint8List.fromList(image.encodePng(img)); + } + + Future _computeBlurhashData() async { + if (_data != null) return _data!; + final ratio = widget.width / widget.height; + var width = 32; + var height = 32; + if (ratio > 1.0) { + height = (width / ratio).round(); + } else { + width = (height * ratio).round(); + } + + return _data ??= await compute( + getBlurhashData, + BlurhashData( + hsh: widget.blurhash, + w: width, + h: height, + ), + ); + } + + @override + Widget build(BuildContext context) { + return FutureBuilder( + future: _computeBlurhashData(), + initialData: _data, + builder: (context, snapshot) { + final data = snapshot.data; + if (data == null) { + return Container( + width: widget.width, + height: widget.height, + color: Theme.of(context).colorScheme.onInverseSurface, + ); + } + return Image.memory( + data, + fit: widget.fit, + width: widget.width, + height: widget.height, + ); + }, + ); + } +} + +class BlurhashData { + final String hsh; + final int w; + final int h; + + const BlurhashData({ + required this.hsh, + required this.w, + required this.h, + }); + + factory BlurhashData.fromJson(Map json) => BlurhashData( + hsh: json['hsh'], + w: json['w'], + h: json['h'], + ); + + Map toJson() => { + 'hsh': hsh, + 'w': w, + 'h': h, + }; +} diff --git a/lib/widgets/chat_settings_popup_menu.dart b/lib/widgets/chat_settings_popup_menu.dart new file mode 100644 index 0000000..76d2607 --- /dev/null +++ b/lib/widgets/chat_settings_popup_menu.dart @@ -0,0 +1,165 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import 'matrix.dart'; + +enum ChatPopupMenuActions { details, mute, unmute, leave, search } + +class ChatSettingsPopupMenu extends StatefulWidget { + final Room room; + final bool displayChatDetails; + + const ChatSettingsPopupMenu(this.room, this.displayChatDetails, {super.key}); + + @override + ChatSettingsPopupMenuState createState() => ChatSettingsPopupMenuState(); +} + +class ChatSettingsPopupMenuState extends State { + StreamSubscription? notificationChangeSub; + + @override + void dispose() { + notificationChangeSub?.cancel(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + notificationChangeSub ??= Matrix.of(context) + .client + .onSync + .stream + .where( + (syncUpdate) => + syncUpdate.accountData?.any( + (accountData) => accountData.type == 'm.push_rules', + ) ?? + false, + ) + .listen( + (u) => setState(() {}), + ); + return Stack( + alignment: Alignment.center, + children: [ + const SizedBox.shrink(), + PopupMenuButton( + onSelected: (choice) async { + switch (choice) { + case ChatPopupMenuActions.leave: + final confirmed = await showOkCancelAlertDialog( + context: context, + title: L10n.of(context).areYouSure, + message: L10n.of(context).archiveRoomDescription, + okLabel: L10n.of(context).leave, + cancelLabel: L10n.of(context).cancel, + isDestructive: true, + ); + if (confirmed == OkCancelResult.ok) { + final success = await showFutureLoadingDialog( + context: context, + future: () => widget.room.leave(), + ); + if (success.error == null) { + context.go('/rooms'); + } + } + break; + case ChatPopupMenuActions.mute: + await showFutureLoadingDialog( + context: context, + future: () => + widget.room.setPushRuleState(PushRuleState.mentionsOnly), + ); + break; + case ChatPopupMenuActions.unmute: + await showFutureLoadingDialog( + context: context, + future: () => + widget.room.setPushRuleState(PushRuleState.notify), + ); + break; + case ChatPopupMenuActions.details: + _showChatDetails(); + break; + case ChatPopupMenuActions.search: + context.go('/rooms/${widget.room.id}/search'); + break; + } + }, + itemBuilder: (BuildContext context) => [ + if (widget.displayChatDetails) + PopupMenuItem( + value: ChatPopupMenuActions.details, + child: Row( + children: [ + const Icon(Icons.info_outline_rounded), + const SizedBox(width: 12), + Text(L10n.of(context).chatDetails), + ], + ), + ), + if (widget.room.pushRuleState == PushRuleState.notify) + PopupMenuItem( + value: ChatPopupMenuActions.mute, + child: Row( + children: [ + const Icon(Icons.notifications_off_outlined), + const SizedBox(width: 12), + Text(L10n.of(context).muteChat), + ], + ), + ) + else + PopupMenuItem( + value: ChatPopupMenuActions.unmute, + child: Row( + children: [ + const Icon(Icons.notifications_on_outlined), + const SizedBox(width: 12), + Text(L10n.of(context).unmuteChat), + ], + ), + ), + PopupMenuItem( + value: ChatPopupMenuActions.search, + child: Row( + children: [ + const Icon(Icons.search_outlined), + const SizedBox(width: 12), + Text(L10n.of(context).search), + ], + ), + ), + PopupMenuItem( + value: ChatPopupMenuActions.leave, + child: Row( + children: [ + const Icon(Icons.delete_outlined), + const SizedBox(width: 12), + Text(L10n.of(context).leave), + ], + ), + ), + ], + ), + ], + ); + } + + void _showChatDetails() { + if (GoRouterState.of(context).uri.path.endsWith('/details')) { + context.go('/rooms/${widget.room.id}'); + } else { + context.go('/rooms/${widget.room.id}/details'); + } + } +} diff --git a/lib/widgets/config_viewer.dart b/lib/widgets/config_viewer.dart new file mode 100644 index 0000000..5026ec4 --- /dev/null +++ b/lib/widgets/config_viewer.dart @@ -0,0 +1,110 @@ +import 'package:flutter/material.dart'; + +import 'package:go_router/go_router.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +import 'package:fluffychat/config/setting_keys.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_text_input_dialog.dart'; +import 'package:fluffychat/widgets/matrix.dart'; + +class ConfigViewer extends StatelessWidget { + const ConfigViewer({super.key}); + + void _changeSetting( + BuildContext context, + AppSettings appSetting, + SharedPreferences store, + Function setState, + String initialValue, + ) async { + if (appSetting is AppSettings) { + appSetting.setItem(store, !(initialValue == 'true')); + return; + } + + final value = await showTextInputDialog( + context: context, + title: appSetting.name, + hintText: appSetting.defaultValue.toString(), + initialText: initialValue, + ); + if (value == null) return; + + if (appSetting is AppSettings) { + appSetting.setItem(store, value); + } + if (appSetting is AppSettings) { + appSetting.setItem(store, int.parse(value)); + } + if (appSetting is AppSettings) { + appSetting.setItem(store, double.parse(value)); + } + + setState(() {}); + } + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + return Scaffold( + appBar: AppBar( + title: const Text('Advanced configurations'), + leading: BackButton( + onPressed: () => context.go('/'), + ), + ), + body: Column( + children: [ + Container( + margin: const EdgeInsets.all(16), + padding: const EdgeInsets.all(16), + color: theme.colorScheme.errorContainer, + child: Text( + 'Changing configs by hand is untested! Use without any warranty!', + style: TextStyle( + color: theme.colorScheme.onErrorContainer, + ), + ), + ), + Expanded( + child: StatefulBuilder( + builder: (context, setState) { + return ListView.builder( + itemCount: AppSettings.values.length, + itemBuilder: (context, i) { + final store = Matrix.of(context).store; + final appSetting = AppSettings.values[i]; + var value = ''; + if (appSetting is AppSettings) { + value = appSetting.getItem(store); + } + if (appSetting is AppSettings) { + value = appSetting.getItem(store).toString(); + } + if (appSetting is AppSettings) { + value = appSetting.getItem(store).toString(); + } + if (appSetting is AppSettings) { + value = appSetting.getItem(store).toString(); + } + return ListTile( + title: Text(appSetting.name), + subtitle: Text(value), + onTap: () => _changeSetting( + context, + appSetting, + store, + setState, + value, + ), + ); + }, + ); + }, + ), + ), + ], + ), + ); + } +} diff --git a/lib/widgets/error_widget.dart b/lib/widgets/error_widget.dart new file mode 100644 index 0000000..b14a18b --- /dev/null +++ b/lib/widgets/error_widget.dart @@ -0,0 +1,45 @@ +import 'package:flutter/material.dart'; + +import 'package:fluffychat/utils/error_reporter.dart'; + +class FluffyChatErrorWidget extends StatefulWidget { + final FlutterErrorDetails details; + const FluffyChatErrorWidget(this.details, {super.key}); + + @override + State createState() => _FluffyChatErrorWidgetState(); +} + +class _FluffyChatErrorWidgetState extends State { + static final Set knownExceptions = {}; + @override + void initState() { + super.initState(); + + if (knownExceptions.contains(widget.details.exception.toString())) { + return; + } + knownExceptions.add(widget.details.exception.toString()); + WidgetsBinding.instance.addPostFrameCallback((_) { + ErrorReporter(context, 'Error Widget').onErrorCallback( + widget.details.exception, + widget.details.stack, + ); + }); + } + + @override + Widget build(BuildContext context) { + return Material( + color: Colors.orange, + child: Placeholder( + child: Center( + child: Material( + color: Colors.white.withAlpha(230), + borderRadius: BorderRadius.circular(8), + ), + ), + ), + ); + } +} diff --git a/lib/widgets/fluffy_chat_app.dart b/lib/widgets/fluffy_chat_app.dart new file mode 100644 index 0000000..f8c62b9 --- /dev/null +++ b/lib/widgets/fluffy_chat_app.dart @@ -0,0 +1,69 @@ +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +import 'package:fluffychat/config/routes.dart'; +import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/widgets/app_lock.dart'; +import 'package:fluffychat/widgets/theme_builder.dart'; +import '../config/app_config.dart'; +import '../utils/custom_scroll_behaviour.dart'; +import 'matrix.dart'; + +class FluffyChatApp extends StatelessWidget { + final Widget? testWidget; + final List clients; + final String? pincode; + final SharedPreferences store; + + const FluffyChatApp({ + super.key, + this.testWidget, + required this.clients, + required this.store, + this.pincode, + }); + + /// getInitialLink may rereturn the value multiple times if this view is + /// opened multiple times for example if the user logs out after they logged + /// in with qr code or magic link. + static bool gotInitialLink = false; + + // Router must be outside of build method so that hot reload does not reset + // the current path. + static final GoRouter router = GoRouter( + routes: AppRoutes.routes, + debugLogDiagnostics: true, + ); + + @override + Widget build(BuildContext context) { + return ThemeBuilder( + builder: (context, themeMode, primaryColor, pureBlack) => MaterialApp.router( + title: AppConfig.applicationName, + themeMode: themeMode, + theme: FluffyThemes.buildTheme(context, Brightness.light, primaryColor, pureBlack), + darkTheme: + FluffyThemes.buildTheme(context, Brightness.dark, primaryColor, pureBlack), + scrollBehavior: CustomScrollBehavior(), + localizationsDelegates: L10n.localizationsDelegates, + supportedLocales: L10n.supportedLocales, + routerConfig: router, + builder: (context, child) => AppLockWidget( + pincode: pincode, + clients: clients, + // Need a navigator above the Matrix widget for + // displaying dialogs + child: Matrix( + clients: clients, + store: store, + child: testWidget ?? child, + ), + ), + ), + ); + } +} diff --git a/lib/widgets/future_loading_dialog.dart b/lib/widgets/future_loading_dialog.dart new file mode 100644 index 0000000..8bcd951 --- /dev/null +++ b/lib/widgets/future_loading_dialog.dart @@ -0,0 +1,148 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; + +import 'package:async/async.dart'; +import 'package:fluffychat/generated/l10n/l10n.dart'; + +import 'package:fluffychat/utils/localized_exception_extension.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/adaptive_dialog_action.dart'; + +/// Displays a loading dialog which reacts to the given [future]. The dialog +/// will be dismissed and the value will be returned when the future completes. +/// If an error occured, then [onError] will be called and this method returns +/// null. +Future> showFutureLoadingDialog({ + required BuildContext context, + required Future Function() future, + String? title, + String? backLabel, + bool barrierDismissible = false, + bool delay = true, + ExceptionContext? exceptionContext, + bool ignoreError = false, +}) async { + final futureExec = future(); + final resultFuture = ResultFuture(futureExec); + + if (delay) { + var i = 3; + while (i > 0) { + final result = resultFuture.result; + if (result != null) { + if (result.isError) break; + return result; + } + await Future.delayed(const Duration(milliseconds: 100)); + i--; + } + } + + final result = await showAdaptiveDialog>( + context: context, + barrierDismissible: barrierDismissible, + builder: (BuildContext context) => LoadingDialog( + future: futureExec, + title: title, + backLabel: backLabel, + exceptionContext: exceptionContext, + ), + ); + return result ?? + Result.error( + Exception('FutureDialog canceled'), + StackTrace.current, + ); +} + +class LoadingDialog extends StatefulWidget { + final String? title; + final String? backLabel; + final Future future; + final ExceptionContext? exceptionContext; + + const LoadingDialog({ + super.key, + required this.future, + this.title, + this.backLabel, + this.exceptionContext, + }); + + @override + LoadingDialogState createState() => LoadingDialogState(); +} + +class LoadingDialogState extends State { + Object? exception; + StackTrace? stackTrace; + + @override + void initState() { + super.initState(); + widget.future.then( + (result) => Navigator.of(context).pop>(Result.value(result)), + onError: (e, s) => setState(() { + exception = e; + stackTrace = s; + }), + ); + } + + @override + Widget build(BuildContext context) { + final exception = this.exception; + final titleLabel = exception != null + ? exception.toLocalizedString(context, widget.exceptionContext) + : widget.title ?? L10n.of(context).loadingPleaseWait; + + return AlertDialog.adaptive( + title: exception == null + ? null + : Icon( + Icons.error_outline_outlined, + color: Theme.of(context).colorScheme.error, + size: 48, + ), + content: ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 256), + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + if (exception == null) ...[ + const CircularProgressIndicator.adaptive(), + const SizedBox(width: 20), + ], + Expanded( + child: Text( + titleLabel, + maxLines: 4, + textAlign: exception == null ? TextAlign.left : null, + overflow: TextOverflow.ellipsis, + ), + ), + ], + ), + ), + actions: exception == null + ? null + : [ + AdaptiveDialogAction( + onPressed: () => Navigator.of(context).pop>( + Result.error( + exception, + stackTrace, + ), + ), + child: Text(widget.backLabel ?? L10n.of(context).close), + ), + ], + ); + } +} + +extension DeprecatedApiAccessExtension on Result { + T? get result => asValue?.value; + + Object? get error => asError?.error; +} diff --git a/lib/widgets/hover_builder.dart b/lib/widgets/hover_builder.dart new file mode 100644 index 0000000..f895d85 --- /dev/null +++ b/lib/widgets/hover_builder.dart @@ -0,0 +1,29 @@ +import 'package:flutter/material.dart'; + +class HoverBuilder extends StatefulWidget { + final Widget Function(BuildContext context, bool hovered) builder; + const HoverBuilder({required this.builder, super.key}); + + @override + State createState() => _HoverBuilderState(); +} + +class _HoverBuilderState extends State { + bool hovered = false; + @override + Widget build(BuildContext context) { + return MouseRegion( + onEnter: (_) => hovered + ? null + : setState(() { + hovered = true; + }), + onExit: (_) => !hovered + ? null + : setState(() { + hovered = false; + }), + child: widget.builder(context, hovered), + ); + } +} diff --git a/lib/widgets/layouts/empty_page.dart b/lib/widgets/layouts/empty_page.dart new file mode 100644 index 0000000..4a30abe --- /dev/null +++ b/lib/widgets/layouts/empty_page.dart @@ -0,0 +1,32 @@ +import 'dart:math'; + +import 'package:flutter/material.dart'; + +class EmptyPage extends StatelessWidget { + static const double _width = 400; + const EmptyPage({super.key}); + @override + Widget build(BuildContext context) { + final width = min(MediaQuery.of(context).size.width, EmptyPage._width) / 2; + final theme = Theme.of(context); + return Scaffold( + // Add invisible appbar to make status bar on Android tablets bright. + appBar: AppBar( + automaticallyImplyLeading: false, + elevation: 0, + backgroundColor: Colors.transparent, + ), + extendBodyBehindAppBar: true, + body: Container( + alignment: Alignment.center, + child: Image.asset( + 'assets/logo_transparent.png', + color: theme.colorScheme.surfaceContainerHigh, + width: width, + height: width, + filterQuality: FilterQuality.medium, + ), + ), + ); + } +} diff --git a/lib/widgets/layouts/login_scaffold.dart b/lib/widgets/layouts/login_scaffold.dart new file mode 100644 index 0000000..016f353 --- /dev/null +++ b/lib/widgets/layouts/login_scaffold.dart @@ -0,0 +1,128 @@ +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.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/utils/platform_infos.dart'; + +class LoginScaffold extends StatelessWidget { + final Widget body; + final AppBar? appBar; + final bool enforceMobileMode; + + const LoginScaffold({ + super.key, + required this.body, + this.appBar, + this.enforceMobileMode = false, + }); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + final isMobileMode = + enforceMobileMode || !FluffyThemes.isColumnMode(context); + if (isMobileMode) { + return Scaffold( + key: const Key('LoginScaffold'), + appBar: appBar, + body: SafeArea(child: body), + ); + } + return Container( + decoration: BoxDecoration( + gradient: LinearGradient( + colors: [ + theme.colorScheme.surfaceContainerLow, + theme.colorScheme.surfaceContainer, + theme.colorScheme.surfaceContainerHighest, + ], + begin: Alignment.topLeft, + end: Alignment.bottomRight, + ), + ), + child: Column( + children: [ + const SizedBox(height: 16), + Expanded( + child: Center( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 16.0), + child: Material( + borderRadius: BorderRadius.circular(AppConfig.borderRadius), + clipBehavior: Clip.hardEdge, + elevation: theme.appBarTheme.scrolledUnderElevation ?? 4, + shadowColor: theme.appBarTheme.shadowColor, + child: ConstrainedBox( + constraints: isMobileMode + ? const BoxConstraints() + : const BoxConstraints(maxWidth: 480, maxHeight: 640), + child: Scaffold( + key: const Key('LoginScaffold'), + appBar: appBar, + body: SafeArea(child: body), + ), + ), + ), + ), + ), + ), + const _PrivacyButtons(mainAxisAlignment: MainAxisAlignment.center), + ], + ), + ); + } +} + +class _PrivacyButtons extends StatelessWidget { + final MainAxisAlignment mainAxisAlignment; + const _PrivacyButtons({required this.mainAxisAlignment}); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + final shadowTextStyle = TextStyle(color: theme.colorScheme.secondary); + return SizedBox( + height: 64, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Row( + mainAxisAlignment: mainAxisAlignment, + children: [ + TextButton( + onPressed: () => launchUrlString(AppConfig.website), + child: Text( + L10n.of(context).website, + style: shadowTextStyle, + ), + ), + TextButton( + onPressed: () => launchUrlString(AppConfig.supportUrl), + child: Text( + L10n.of(context).help, + style: shadowTextStyle, + ), + ), + TextButton( + onPressed: () => launchUrlString(AppConfig.privacyUrl), + child: Text( + L10n.of(context).privacy, + style: shadowTextStyle, + ), + ), + TextButton( + onPressed: () => PlatformInfos.showDialog(context), + child: Text( + L10n.of(context).about, + style: shadowTextStyle, + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/widgets/layouts/max_width_body.dart b/lib/widgets/layouts/max_width_body.dart new file mode 100644 index 0000000..5720d94 --- /dev/null +++ b/lib/widgets/layouts/max_width_body.dart @@ -0,0 +1,63 @@ +import 'package:flutter/material.dart'; + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/config/themes.dart'; + +class MaxWidthBody extends StatelessWidget { + final Widget child; + final double maxWidth; + final bool withScrolling; + final EdgeInsets? innerPadding; + + const MaxWidthBody({ + required this.child, + this.maxWidth = 600, + this.withScrolling = true, + this.innerPadding, + super.key, + }); + @override + Widget build(BuildContext context) { + return SafeArea( + child: LayoutBuilder( + builder: (context, constraints) { + final theme = Theme.of(context); + + const desiredWidth = FluffyThemes.columnWidth * 1.5; + final body = constraints.maxWidth <= desiredWidth + ? child + : Container( + alignment: Alignment.topCenter, + padding: const EdgeInsets.all(32), + child: ConstrainedBox( + constraints: const BoxConstraints( + maxWidth: FluffyThemes.columnWidth * 1.5, + ), + child: Material( + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular(AppConfig.borderRadius), + side: BorderSide( + color: theme.dividerColor, + ), + ), + clipBehavior: Clip.hardEdge, + child: Padding( + padding: const EdgeInsets.symmetric(vertical: 16.0), + child: child, + ), + ), + ), + ); + if (!withScrolling) return body; + + return SingleChildScrollView( + padding: innerPadding, + physics: const ScrollPhysics(), + child: body, + ); + }, + ), + ); + } +} diff --git a/lib/widgets/layouts/two_column_layout.dart b/lib/widgets/layouts/two_column_layout.dart new file mode 100644 index 0000000..86a6f56 --- /dev/null +++ b/lib/widgets/layouts/two_column_layout.dart @@ -0,0 +1,42 @@ +import 'package:flutter/material.dart'; + +import 'package:fluffychat/config/themes.dart'; + +class TwoColumnLayout extends StatelessWidget { + final Widget mainView; + final Widget sideView; + + const TwoColumnLayout({ + super.key, + required this.mainView, + required this.sideView, + }); + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + return ScaffoldMessenger( + child: Scaffold( + body: Row( + children: [ + Container( + clipBehavior: Clip.antiAlias, + decoration: const BoxDecoration(), + width: FluffyThemes.columnWidth + FluffyThemes.navRailWidth, + child: mainView, + ), + Container( + width: 1.0, + color: theme.dividerColor, + ), + Expanded( + child: ClipRRect( + child: sideView, + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/widgets/local_notifications_extension.dart b/lib/widgets/local_notifications_extension.dart new file mode 100644 index 0000000..b7fbc30 --- /dev/null +++ b/lib/widgets/local_notifications_extension.dart @@ -0,0 +1,120 @@ +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; + +import 'package:desktop_notifications/desktop_notifications.dart'; +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart'; +import 'package:universal_html/html.dart' as html; + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/utils/client_download_content_extension.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/widgets/matrix.dart'; + +extension LocalNotificationsExtension on MatrixState { + static final html.AudioElement _audioPlayer = html.AudioElement() + ..src = 'assets/assets/sounds/notification.ogg' + ..load(); + + void showLocalNotification(Event event) async { + final roomId = event.room.id; + if (activeRoomId == roomId) { + if (kIsWeb && webHasFocus) return; + if (PlatformInfos.isDesktop && + WidgetsBinding.instance.lifecycleState == AppLifecycleState.resumed) { + return; + } + } + + final title = + event.room.getLocalizedDisplayname(MatrixLocals(L10n.of(context))); + final body = await event.calcLocalizedBody( + MatrixLocals(L10n.of(context)), + withSenderNamePrefix: !event.room.isDirectChat || + event.room.lastEvent?.senderId == client.userID, + plaintextBody: true, + hideReply: true, + hideEdit: true, + removeMarkdown: true, + ); + + if (kIsWeb) { + final avatarUrl = event.senderFromMemoryOrFallback.avatarUrl; + Uri? thumbnailUri; + + if (avatarUrl != null) { + const size = 64; + const thumbnailMethod = ThumbnailMethod.crop; + // Pre-cache so that we can later just set the thumbnail uri as icon: + await client.downloadMxcCached( + avatarUrl, + width: size, + height: size, + thumbnailMethod: thumbnailMethod, + isThumbnail: true, + ); + + thumbnailUri = + await event.senderFromMemoryOrFallback.avatarUrl?.getThumbnailUri( + client, + width: size, + height: size, + method: thumbnailMethod, + ); + } + + _audioPlayer.play(); + + html.Notification( + title, + body: body, + icon: thumbnailUri?.toString(), + tag: event.room.id, + ); + } else if (Platform.isLinux) { + final notification = await linuxNotifications!.notify( + title, + body: body, + replacesId: linuxNotificationIds[roomId] ?? 0, + appName: AppConfig.applicationName, + appIcon: 'fluffychat', + actions: [ + NotificationAction( + DesktopNotificationActions.openChat.name, + L10n.of(context).openChat, + ), + NotificationAction( + DesktopNotificationActions.seen.name, + L10n.of(context).markAsRead, + ), + ], + hints: [ + NotificationHint.soundName('message-new-instant'), + ], + ); + notification.action.then((actionStr) { + final action = DesktopNotificationActions.values + .singleWhere((a) => a.name == actionStr); + switch (action) { + case DesktopNotificationActions.seen: + event.room.setReadMarker( + event.eventId, + mRead: event.eventId, + public: AppConfig.sendPublicReadReceipts, + ); + break; + case DesktopNotificationActions.openChat: + context.go('/rooms/${event.room.id}'); + break; + } + }); + linuxNotificationIds[roomId] = notification.id; + } + } +} + +enum DesktopNotificationActions { seen, openChat } diff --git a/lib/widgets/lock_screen.dart b/lib/widgets/lock_screen.dart new file mode 100644 index 0000000..8a3b86d --- /dev/null +++ b/lib/widgets/lock_screen.dart @@ -0,0 +1,121 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; + +import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/widgets/app_lock.dart'; + +class LockScreen extends StatefulWidget { + const LockScreen({super.key}); + + @override + State createState() => _LockScreenState(); +} + +class _LockScreenState extends State { + String? _errorText; + int _coolDownSeconds = 5; + bool _inputBlocked = false; + final TextEditingController _textEditingController = TextEditingController(); + + void tryUnlock(String text) async { + setState(() { + _errorText = null; + }); + if (text.length < 4) return; + + final enteredPin = int.tryParse(text); + if (enteredPin == null || text.length != 4) { + setState(() { + _errorText = L10n.of(context).invalidInput; + }); + _textEditingController.clear(); + return; + } + + if (AppLock.of(context).unlock(enteredPin.toString())) { + setState(() { + _inputBlocked = false; + _errorText = null; + }); + _textEditingController.clear(); + return; + } + + setState(() { + _errorText = L10n.of(context).wrongPinEntered(_coolDownSeconds); + _inputBlocked = true; + }); + Future.delayed(Duration(seconds: _coolDownSeconds)).then((_) { + setState(() { + _inputBlocked = false; + _coolDownSeconds *= 2; + _errorText = null; + }); + }); + _textEditingController.clear(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text(L10n.of(context).pleaseEnterYourPin), + centerTitle: true, + ), + extendBodyBehindAppBar: true, + body: Center( + child: Padding( + padding: const EdgeInsets.all(16.0), + child: ConstrainedBox( + constraints: const BoxConstraints( + maxWidth: FluffyThemes.columnWidth, + ), + child: ListView( + shrinkWrap: true, + children: [ + Center( + child: Image.asset( + 'assets/info-logo.png', + width: 256, + ), + ), + TextField( + controller: _textEditingController, + textInputAction: TextInputAction.done, + keyboardType: TextInputType.number, + obscureText: true, + autofocus: true, + textAlign: TextAlign.center, + readOnly: _inputBlocked, + onChanged: tryUnlock, + onSubmitted: tryUnlock, + style: const TextStyle(fontSize: 40), + inputFormatters: [ + LengthLimitingTextInputFormatter(4), + ], + decoration: InputDecoration( + errorText: _errorText, + hintText: '****', + suffix: IconButton( + icon: const Icon(Icons.lock_open_outlined), + onPressed: () => tryUnlock(_textEditingController.text), + ), + ), + ), + if (_inputBlocked) + const Padding( + padding: EdgeInsets.all(8.0), + child: LinearProgressIndicator(), + ), + ], + ), + ), + ), + ), + ); + } +} diff --git a/lib/widgets/log_view.dart b/lib/widgets/log_view.dart new file mode 100644 index 0000000..caeaeee --- /dev/null +++ b/lib/widgets/log_view.dart @@ -0,0 +1,95 @@ +import 'package:flutter/material.dart'; + +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart'; + +class LogViewer extends StatefulWidget { + const LogViewer({super.key}); + + @override + LogViewerState createState() => LogViewerState(); +} + +class LogViewerState extends State { + Level logLevel = Level.debug; + double fontSize = 14; + @override + Widget build(BuildContext context) { + final outputEvents = Logs() + .outputEvents + .where((e) => e.level.index <= logLevel.index) + .toList(); + return Scaffold( + backgroundColor: Colors.black, + appBar: AppBar( + title: Text(logLevel.toString()), + leading: BackButton( + onPressed: () => context.go('/'), + ), + actions: [ + IconButton( + icon: const Icon(Icons.zoom_in_outlined), + onPressed: () => setState(() => fontSize++), + ), + IconButton( + icon: const Icon(Icons.zoom_out_outlined), + onPressed: () => setState(() => fontSize--), + ), + PopupMenuButton( + itemBuilder: (context) => Level.values + .map( + (level) => PopupMenuItem( + value: level, + child: Text(level.toString()), + ), + ) + .toList(), + onSelected: (Level level) => setState(() => logLevel = level), + ), + ], + ), + body: ListView.builder( + itemCount: outputEvents.length, + itemBuilder: (context, i) => SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: SelectableText( + outputEvents[i].toDisplayString(), + style: TextStyle( + color: outputEvents[i].color, + ), + ), + ), + ), + ); + } +} + +extension on LogEvent { + Color get color { + switch (level) { + case Level.wtf: + return Colors.purple; + case Level.error: + return Colors.red; + case Level.warning: + return Colors.orange; + case Level.info: + return Colors.green; + case Level.debug: + return Colors.white; + case Level.verbose: + return Colors.grey; + } + } + + String toDisplayString() { + var str = '# [${level.toString().split('.').last.toUpperCase()}] $title'; + if (exception != null) { + str += ' - ${exception.toString()}'; + } + if (stackTrace != null) { + str += '\n${stackTrace.toString()}'; + } + return str; + } +} diff --git a/lib/widgets/matrix.dart b/lib/widgets/matrix.dart new file mode 100644 index 0000000..d629091 --- /dev/null +++ b/lib/widgets/matrix.dart @@ -0,0 +1,496 @@ +import 'dart:async'; +import 'dart:convert'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; + +import 'package:collection/collection.dart'; +import 'package:desktop_notifications/desktop_notifications.dart'; +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:http/http.dart' as http; +import 'package:image_picker/image_picker.dart'; +import 'package:intl/intl.dart'; +import 'package:matrix/encryption.dart'; +import 'package:matrix/matrix.dart'; +import 'package:provider/provider.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:universal_html/html.dart' as html; +import 'package:url_launcher/url_launcher_string.dart'; + +import 'package:fluffychat/utils/client_manager.dart'; +import 'package:fluffychat/utils/init_with_restore.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_file_extension.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/utils/uia_request_manager.dart'; +import 'package:fluffychat/utils/voip_plugin.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; +import 'package:fluffychat/widgets/fluffy_chat_app.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import '../config/app_config.dart'; +import '../config/setting_keys.dart'; +import '../pages/key_verification/key_verification_dialog.dart'; +import '../utils/account_bundles.dart'; +import '../utils/background_push.dart'; +import 'local_notifications_extension.dart'; + +// import 'package:flutter_secure_storage/flutter_secure_storage.dart'; + +class Matrix extends StatefulWidget { + final Widget? child; + + final List clients; + + final Map? queryParameters; + + final SharedPreferences store; + + const Matrix({ + this.child, + required this.clients, + required this.store, + this.queryParameters, + super.key, + }); + + @override + MatrixState createState() => MatrixState(); + + /// Returns the (nearest) Client instance of your application. + static MatrixState of(BuildContext context) => + Provider.of(context, listen: false); +} + +class MatrixState extends State with WidgetsBindingObserver { + int _activeClient = -1; + String? activeBundle; + + SharedPreferences get store => widget.store; + + XFile? loginAvatar; + String? loginUsername; + bool? loginRegistrationSupported; + + BackgroundPush? backgroundPush; + + Client get client { + if (widget.clients.isEmpty) { + widget.clients.add(getLoginClient()); + } + if (_activeClient < 0 || _activeClient >= widget.clients.length) { + return currentBundle!.first!; + } + return widget.clients[_activeClient]; + } + + VoipPlugin? voipPlugin; + + bool get isMultiAccount => widget.clients.length > 1; + + int getClientIndexByMatrixId(String matrixId) => + widget.clients.indexWhere((client) => client.userID == matrixId); + + late String currentClientSecret; + RequestTokenResponse? currentThreepidCreds; + + void setActiveClient(Client? cl) { + final i = widget.clients.indexWhere((c) => c == cl); + if (i != -1) { + _activeClient = i; + // TODO: Multi-client VoiP support + createVoipPlugin(); + } else { + Logs().w('Tried to set an unknown client ${cl!.userID} as active'); + } + } + + List? get currentBundle { + if (!hasComplexBundles) { + return List.from(widget.clients); + } + final bundles = accountBundles; + if (bundles.containsKey(activeBundle)) { + return bundles[activeBundle]; + } + return bundles.values.first; + } + + Map> get accountBundles { + final resBundles = >{}; + for (var i = 0; i < widget.clients.length; i++) { + final bundles = widget.clients[i].accountBundles; + for (final bundle in bundles) { + if (bundle.name == null) { + continue; + } + resBundles[bundle.name] ??= []; + resBundles[bundle.name]!.add( + _AccountBundleWithClient( + client: widget.clients[i], + bundle: bundle, + ), + ); + } + } + for (final b in resBundles.values) { + b.sort( + (a, b) => a.bundle!.priority == null + ? 1 + : b.bundle!.priority == null + ? -1 + : a.bundle!.priority!.compareTo(b.bundle!.priority!), + ); + } + return resBundles + .map((k, v) => MapEntry(k, v.map((vv) => vv.client).toList())); + } + + bool get hasComplexBundles => accountBundles.values.any((v) => v.length > 1); + + Client? _loginClientCandidate; + + Client getLoginClient() { + if (widget.clients.isNotEmpty && !client.isLogged()) { + return client; + } + final candidate = _loginClientCandidate ??= ClientManager.createClient( + '${AppConfig.applicationName}-${DateTime.now().millisecondsSinceEpoch}', + store, + )..onLoginStateChanged + .stream + .where((l) => l == LoginState.loggedIn) + .first + .then((_) { + if (!widget.clients.contains(_loginClientCandidate)) { + widget.clients.add(_loginClientCandidate!); + } + ClientManager.addClientNameToStore( + _loginClientCandidate!.clientName, + store, + ); + _registerSubs(_loginClientCandidate!.clientName); + _loginClientCandidate = null; + FluffyChatApp.router.go('/rooms'); + }); + return candidate; + } + + Client? getClientByName(String name) => + widget.clients.firstWhereOrNull((c) => c.clientName == name); + + final onRoomKeyRequestSub = {}; + final onKeyVerificationRequestSub = {}; + final onNotification = {}; + final onLoginStateChanged = >{}; + final onUiaRequest = >{}; + StreamSubscription? onFocusSub; + StreamSubscription? onBlurSub; + + String? _cachedPassword; + Timer? _cachedPasswordClearTimer; + + String? get cachedPassword => _cachedPassword; + + set cachedPassword(String? p) { + Logs().d('Password cached'); + _cachedPasswordClearTimer?.cancel(); + _cachedPassword = p; + _cachedPasswordClearTimer = Timer(const Duration(minutes: 10), () { + _cachedPassword = null; + Logs().d('Cached Password cleared'); + }); + } + + bool webHasFocus = true; + + String? get activeRoomId { + final route = FluffyChatApp.router.routeInformationProvider.value.uri.path; + if (!route.startsWith('/rooms/')) return null; + return route.split('/')[2]; + } + + final linuxNotifications = + PlatformInfos.isLinux ? NotificationsClient() : null; + final Map linuxNotificationIds = {}; + + @override + void initState() { + super.initState(); + WidgetsBinding.instance.addObserver(this); + initMatrix(); + if (PlatformInfos.isWeb) { + initConfig().then((_) => initSettings()); + } else { + initSettings(); + } + } + + Future initConfig() async { + try { + final configJsonString = + utf8.decode((await http.get(Uri.parse('config.json'))).bodyBytes); + final configJson = json.decode(configJsonString); + AppConfig.loadFromJson(configJson); + } on FormatException catch (_) { + Logs().v('[ConfigLoader] config.json not found'); + } catch (e) { + Logs().v('[ConfigLoader] config.json not found', e); + } + } + + void _registerSubs(String name) { + final c = getClientByName(name); + if (c == null) { + Logs().w( + 'Attempted to register subscriptions for non-existing client $name', + ); + return; + } + onRoomKeyRequestSub[name] ??= + c.onRoomKeyRequest.stream.listen((RoomKeyRequest request) async { + if (widget.clients.any( + ((cl) => + cl.userID == request.requestingDevice.userId && + cl.identityKey == request.requestingDevice.curve25519Key), + )) { + Logs().i( + '[Key Request] Request is from one of our own clients, forwarding the key...', + ); + await request.forwardKey(); + } + }); + onKeyVerificationRequestSub[name] ??= c.onKeyVerificationRequest.stream + .listen((KeyVerification request) async { + var hidPopup = false; + request.onUpdate = () { + if (!hidPopup && + {KeyVerificationState.done, KeyVerificationState.error} + .contains(request.state)) { + FluffyChatApp.router.pop('dialog'); + } + hidPopup = true; + }; + request.onUpdate = null; + hidPopup = true; + await KeyVerificationDialog(request: request).show( + FluffyChatApp.router.routerDelegate.navigatorKey.currentContext ?? + context, + ); + }); + onLoginStateChanged[name] ??= c.onLoginStateChanged.stream.listen((state) { + final loggedInWithMultipleClients = widget.clients.length > 1; + if (state == LoginState.loggedOut) { + InitWithRestoreExtension.deleteSessionBackup(name); + } + if (loggedInWithMultipleClients && state != LoginState.loggedIn) { + _cancelSubs(c.clientName); + widget.clients.remove(c); + ClientManager.removeClientNameFromStore(c.clientName, store); + ScaffoldMessenger.of( + FluffyChatApp.router.routerDelegate.navigatorKey.currentContext ?? + context, + ).showSnackBar( + SnackBar( + content: Text(L10n.of(context).oneClientLoggedOut), + ), + ); + + if (state != LoginState.loggedIn) { + FluffyChatApp.router.go('/rooms'); + } + } else { + FluffyChatApp.router + .go(state == LoginState.loggedIn ? '/rooms' : '/home'); + } + }); + onUiaRequest[name] ??= c.onUiaRequest.stream.listen(uiaRequestHandler); + if (PlatformInfos.isWeb || PlatformInfos.isLinux) { + c.onSync.stream.first.then((s) { + html.Notification.requestPermission(); + onNotification[name] ??= + c.onNotification.stream.listen(showLocalNotification); + }); + } + } + + void _cancelSubs(String name) { + onRoomKeyRequestSub[name]?.cancel(); + onRoomKeyRequestSub.remove(name); + onKeyVerificationRequestSub[name]?.cancel(); + onKeyVerificationRequestSub.remove(name); + onLoginStateChanged[name]?.cancel(); + onLoginStateChanged.remove(name); + onNotification[name]?.cancel(); + onNotification.remove(name); + } + + void initMatrix() { + for (final c in widget.clients) { + _registerSubs(c.clientName); + } + + if (kIsWeb) { + onFocusSub = html.window.onFocus.listen((_) => webHasFocus = true); + onBlurSub = html.window.onBlur.listen((_) => webHasFocus = false); + } + + if (PlatformInfos.isMobile) { + backgroundPush = BackgroundPush( + this, + onFcmError: (errorMsg, {Uri? link}) async { + final result = await showOkCancelAlertDialog( + context: FluffyChatApp + .router.routerDelegate.navigatorKey.currentContext ?? + context, + title: L10n.of(context).pushNotificationsNotAvailable, + message: errorMsg, + okLabel: + link == null ? L10n.of(context).ok : L10n.of(context).learnMore, + cancelLabel: L10n.of(context).doNotShowAgain, + ); + if (result == OkCancelResult.ok && link != null) { + launchUrlString( + link.toString(), + mode: LaunchMode.externalApplication, + ); + } + if (result == OkCancelResult.cancel) { + await store.setBool(SettingKeys.showNoGoogle, true); + } + }, + ); + } + + createVoipPlugin(); + } + + void createVoipPlugin() async { + if (store.getBool(SettingKeys.experimentalVoip) == false) { + voipPlugin = null; + return; + } + voipPlugin = VoipPlugin(this); + } + + @override + void didChangeAppLifecycleState(AppLifecycleState state) { + Logs().v('AppLifecycleState = $state'); + final foreground = state != AppLifecycleState.inactive && + state != AppLifecycleState.paused; + client.syncPresence = + state == AppLifecycleState.resumed ? null : PresenceType.unavailable; + if (PlatformInfos.isMobile) { + client.backgroundSync = foreground; + client.requestHistoryOnLimitedTimeline = !foreground; + Logs().v('Set background sync to', foreground); + } + } + + void initSettings() { + AppConfig.fontSizeFactor = + double.tryParse(store.getString(SettingKeys.fontSizeFactor) ?? '') ?? + AppConfig.fontSizeFactor; + + AppConfig.renderHtml = + store.getBool(SettingKeys.renderHtml) ?? AppConfig.renderHtml; + + AppConfig.swipeRightToLeftToReply = + store.getBool(SettingKeys.swipeRightToLeftToReply) ?? + AppConfig.swipeRightToLeftToReply; + + AppConfig.hideRedactedEvents = + store.getBool(SettingKeys.hideRedactedEvents) ?? + AppConfig.hideRedactedEvents; + + AppConfig.hideUnknownEvents = + store.getBool(SettingKeys.hideUnknownEvents) ?? + AppConfig.hideUnknownEvents; + + AppConfig.hideUnimportantStateEvents = + store.getBool(SettingKeys.hideUnimportantStateEvents) ?? + AppConfig.hideUnimportantStateEvents; + + AppConfig.separateChatTypes = + store.getBool(SettingKeys.separateChatTypes) ?? + AppConfig.separateChatTypes; + + AppConfig.autoplayImages = + store.getBool(SettingKeys.autoplayImages) ?? AppConfig.autoplayImages; + + AppConfig.sendTypingNotifications = + store.getBool(SettingKeys.sendTypingNotifications) ?? + AppConfig.sendTypingNotifications; + + AppConfig.sendPublicReadReceipts = + store.getBool(SettingKeys.sendPublicReadReceipts) ?? + AppConfig.sendPublicReadReceipts; + + AppConfig.sendOnEnter = + store.getBool(SettingKeys.sendOnEnter) ?? AppConfig.sendOnEnter; + + AppConfig.experimentalVoip = store.getBool(SettingKeys.experimentalVoip) ?? + AppConfig.experimentalVoip; + + AppConfig.showPresences = + store.getBool(SettingKeys.showPresences) ?? AppConfig.showPresences; + } + + @override + void dispose() { + WidgetsBinding.instance.removeObserver(this); + + onRoomKeyRequestSub.values.map((s) => s.cancel()); + onKeyVerificationRequestSub.values.map((s) => s.cancel()); + onLoginStateChanged.values.map((s) => s.cancel()); + onNotification.values.map((s) => s.cancel()); + client.httpClient.close(); + onFocusSub?.cancel(); + onBlurSub?.cancel(); + + linuxNotifications?.close(); + + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Provider( + create: (_) => this, + child: widget.child, + ); + } + + Future dehydrateAction(BuildContext context) async { + final response = await showOkCancelAlertDialog( + context: context, + isDestructive: true, + title: L10n.of(context).dehydrate, + message: L10n.of(context).dehydrateWarning, + ); + if (response != OkCancelResult.ok) { + return; + } + final result = await showFutureLoadingDialog( + context: context, + future: client.exportDump, + ); + final export = result.result; + if (export == null) return; + + final exportBytes = Uint8List.fromList( + const Utf8Codec().encode(export), + ); + + final exportFileName = + 'fluffychat-export-${DateFormat(DateFormat.YEAR_MONTH_DAY).format(DateTime.now())}.fluffybackup'; + + final file = MatrixFile(bytes: exportBytes, name: exportFileName); + file.save(context); + } +} + +class _AccountBundleWithClient { + final Client? client; + final AccountBundle? bundle; + + _AccountBundleWithClient({this.client, this.bundle}); +} diff --git a/lib/widgets/member_actions_popup_menu_button.dart b/lib/widgets/member_actions_popup_menu_button.dart new file mode 100644 index 0000000..6ad6879 --- /dev/null +++ b/lib/widgets/member_actions_popup_menu_button.dart @@ -0,0 +1,310 @@ +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/widgets/permission_slider_dialog.dart'; +import 'adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; +import 'adaptive_dialogs/show_text_input_dialog.dart'; +import 'adaptive_dialogs/user_dialog.dart'; +import 'avatar.dart'; +import 'future_loading_dialog.dart'; + +void showMemberActionsPopupMenu({ + required BuildContext context, + required User user, + void Function()? onMention, +}) async { + final theme = Theme.of(context); + final displayname = user.calcDisplayname(); + final isMe = user.room.client.userID == user.id; + + final overlay = Overlay.of(context).context.findRenderObject() as RenderBox; + + final button = context.findRenderObject() as RenderBox; + + final position = RelativeRect.fromRect( + Rect.fromPoints( + button.localToGlobal(const Offset(0, -65), ancestor: overlay), + button.localToGlobal( + button.size.bottomRight(Offset.zero) + const Offset(-50, 0), + ancestor: overlay, + ), + ), + Offset.zero & overlay.size, + ); + + final action = await showMenu<_MemberActions>( + context: context, + position: position, + items: >[ + PopupMenuItem( + value: _MemberActions.info, + child: Padding( + padding: const EdgeInsets.symmetric(vertical: 8.0), + child: Center( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Avatar( + name: displayname, + mxContent: user.avatarUrl, + presenceUserId: user.id, + presenceBackgroundColor: theme.colorScheme.surfaceContainer, + ), + const SizedBox(height: 8), + Text( + displayname, + textAlign: TextAlign.center, + style: theme.textTheme.labelLarge, + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + Text( + user.id, + textAlign: TextAlign.center, + style: const TextStyle(fontSize: 10), + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + ], + ), + ), + ), + ), + const PopupMenuDivider(), + if (onMention != null) + PopupMenuItem( + value: _MemberActions.mention, + child: Row( + children: [ + const Icon(Icons.alternate_email_outlined), + const SizedBox(width: 18), + Text(L10n.of(context).mention), + ], + ), + ), + if (user.membership == Membership.knock) + PopupMenuItem( + value: _MemberActions.approve, + child: Row( + children: [ + const Icon(Icons.how_to_reg_outlined), + const SizedBox(width: 18), + Text(L10n.of(context).approve), + ], + ), + ), + PopupMenuItem( + enabled: user.room.canChangePowerLevel && user.canChangeUserPowerLevel, + value: _MemberActions.setRole, + child: Row( + children: [ + const Icon(Icons.admin_panel_settings_outlined), + const SizedBox(width: 18), + Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(L10n.of(context).chatPermissions), + Text( + user.powerLevel < 50 + ? L10n.of(context).userLevel(user.powerLevel) + : user.powerLevel < 100 + ? L10n.of(context).moderatorLevel(user.powerLevel) + : L10n.of(context).adminLevel(user.powerLevel), + style: const TextStyle(fontSize: 10), + ), + ], + ), + ], + ), + ), + if (user.canKick) + PopupMenuItem( + value: _MemberActions.kick, + child: Row( + children: [ + Icon( + Icons.person_remove_outlined, + color: theme.colorScheme.onErrorContainer, + ), + const SizedBox(width: 18), + Text( + L10n.of(context).kickFromChat, + style: TextStyle(color: theme.colorScheme.onErrorContainer), + ), + ], + ), + ), + if (user.canBan) + PopupMenuItem( + value: _MemberActions.ban, + child: Row( + children: [ + Icon( + Icons.block_outlined, + color: theme.colorScheme.onErrorContainer, + ), + const SizedBox(width: 18), + Text( + L10n.of(context).banFromChat, + style: TextStyle(color: theme.colorScheme.onErrorContainer), + ), + ], + ), + ), + if (user.canBan && user.membership == Membership.ban) + PopupMenuItem( + value: _MemberActions.unban, + child: Row( + children: [ + const Icon(Icons.warning), + const SizedBox(width: 18), + Text(L10n.of(context).unbanFromChat), + ], + ), + ), + if (!isMe) + PopupMenuItem( + value: _MemberActions.report, + child: Row( + children: [ + Icon( + Icons.gavel_outlined, + color: theme.colorScheme.onErrorContainer, + ), + const SizedBox(width: 18), + Text( + L10n.of(context).reportUser, + style: TextStyle(color: theme.colorScheme.onErrorContainer), + ), + ], + ), + ), + ], + ); + if (action == null) return; + if (!context.mounted) return; + + switch (action) { + case _MemberActions.mention: + onMention?.call(); + return; + case _MemberActions.setRole: + final power = await showPermissionChooser( + context, + currentLevel: user.powerLevel, + maxLevel: user.room.ownPowerLevel, + ); + if (power == null) return; + if (!context.mounted) return; + if (power >= 100) { + final consent = await showOkCancelAlertDialog( + context: context, + title: L10n.of(context).areYouSure, + message: L10n.of(context).makeAdminDescription, + ); + if (consent != OkCancelResult.ok) return; + if (!context.mounted) return; + } + await showFutureLoadingDialog( + context: context, + future: () => user.setPower(power), + ); + return; + case _MemberActions.approve: + await showFutureLoadingDialog( + context: context, + future: () => user.room.invite(user.id), + ); + return; + case _MemberActions.kick: + if (await showOkCancelAlertDialog( + context: context, + title: L10n.of(context).areYouSure, + okLabel: L10n.of(context).yes, + cancelLabel: L10n.of(context).no, + message: L10n.of(context).kickUserDescription, + ) == + OkCancelResult.ok) { + await showFutureLoadingDialog( + context: context, + future: () => user.kick(), + ); + } + return; + case _MemberActions.ban: + if (await showOkCancelAlertDialog( + context: context, + title: L10n.of(context).areYouSure, + okLabel: L10n.of(context).yes, + cancelLabel: L10n.of(context).no, + message: L10n.of(context).banUserDescription, + ) == + OkCancelResult.ok) { + await showFutureLoadingDialog( + context: context, + future: () => user.ban(), + ); + } + return; + case _MemberActions.report: + final reason = await showTextInputDialog( + context: context, + title: L10n.of(context).whyDoYouWantToReportThis, + okLabel: L10n.of(context).report, + cancelLabel: L10n.of(context).cancel, + hintText: L10n.of(context).reason, + ); + if (reason == null || reason.isEmpty) return; + + final result = await showFutureLoadingDialog( + context: context, + future: () => user.room.client.reportUser( + user.id, + reason, + ), + ); + if (result.error != null) return; + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text(L10n.of(context).contentHasBeenReported)), + ); + return; + case _MemberActions.info: + await UserDialog.show( + context: context, + profile: Profile( + userId: user.id, + displayName: user.displayName, + avatarUrl: user.avatarUrl, + ), + ); + return; + case _MemberActions.unban: + if (await showOkCancelAlertDialog( + context: context, + title: L10n.of(context).areYouSure, + okLabel: L10n.of(context).yes, + cancelLabel: L10n.of(context).no, + message: L10n.of(context).unbanUserDescription, + ) == + OkCancelResult.ok) { + await showFutureLoadingDialog( + context: context, + future: () => user.unban(), + ); + } + } +} + +enum _MemberActions { + info, + mention, + setRole, + kick, + ban, + approve, + unban, + report, +} diff --git a/lib/widgets/mxc_image.dart b/lib/widgets/mxc_image.dart new file mode 100644 index 0000000..bdc938e --- /dev/null +++ b/lib/widgets/mxc_image.dart @@ -0,0 +1,177 @@ +import 'dart:io'; +import 'dart:math'; +import 'dart:typed_data'; + +import 'package:flutter/material.dart'; + +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/utils/client_download_content_extension.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_file_extension.dart'; +import 'package:fluffychat/widgets/matrix.dart'; + +class MxcImage extends StatefulWidget { + final Uri? uri; + final Event? event; + final double? width; + final double? height; + final BoxFit? fit; + final bool isThumbnail; + final bool animated; + final Duration retryDuration; + final Duration animationDuration; + final Curve animationCurve; + final ThumbnailMethod thumbnailMethod; + final Widget Function(BuildContext context)? placeholder; + final String? cacheKey; + final Client? client; + + const MxcImage({ + this.uri, + this.event, + this.width, + this.height, + this.fit, + this.placeholder, + this.isThumbnail = true, + this.animated = false, + this.animationDuration = FluffyThemes.animationDuration, + this.retryDuration = const Duration(seconds: 2), + this.animationCurve = FluffyThemes.animationCurve, + this.thumbnailMethod = ThumbnailMethod.scale, + this.cacheKey, + this.client, + super.key, + }); + + @override + State createState() => _MxcImageState(); +} + +class _MxcImageState extends State { + static final Map _imageDataCache = {}; + Uint8List? _imageDataNoCache; + + Uint8List? get _imageData => widget.cacheKey == null + ? _imageDataNoCache + : _imageDataCache[widget.cacheKey]; + + set _imageData(Uint8List? data) { + if (data == null) return; + final cacheKey = widget.cacheKey; + cacheKey == null + ? _imageDataNoCache = data + : _imageDataCache[cacheKey] = data; + } + + Future _load() async { + final client = + widget.client ?? widget.event?.room.client ?? Matrix.of(context).client; + final uri = widget.uri; + final event = widget.event; + + if (uri != null) { + final devicePixelRatio = MediaQuery.of(context).devicePixelRatio; + final width = widget.width; + final realWidth = width == null ? null : width * devicePixelRatio; + final height = widget.height; + final realHeight = height == null ? null : height * devicePixelRatio; + + final remoteData = await client.downloadMxcCached( + uri, + width: realWidth, + height: realHeight, + thumbnailMethod: widget.thumbnailMethod, + isThumbnail: widget.isThumbnail, + animated: widget.animated, + ); + if (!mounted) return; + setState(() { + _imageData = remoteData; + }); + } + + if (event != null) { + final data = await event.downloadAndDecryptAttachment( + getThumbnail: widget.isThumbnail, + ); + if (data.detectFileType is MatrixImageFile) { + if (!mounted) return; + setState(() { + _imageData = data.bytes; + }); + return; + } + } + } + + void _tryLoad(_) async { + if (_imageData != null) { + return; + } + try { + await _load(); + } on IOException catch (_) { + if (!mounted) return; + await Future.delayed(widget.retryDuration); + _tryLoad(_); + } + } + + @override + void initState() { + super.initState(); + WidgetsBinding.instance.addPostFrameCallback(_tryLoad); + } + + Widget placeholder(BuildContext context) => + widget.placeholder?.call(context) ?? + Container( + width: widget.width, + height: widget.height, + alignment: Alignment.center, + child: const CircularProgressIndicator.adaptive(strokeWidth: 2), + ); + + @override + Widget build(BuildContext context) { + final data = _imageData; + final hasData = data != null && data.isNotEmpty; + + return AnimatedCrossFade( + crossFadeState: + hasData ? CrossFadeState.showSecond : CrossFadeState.showFirst, + duration: const Duration(milliseconds: 128), + firstChild: placeholder(context), + secondChild: hasData + ? Image.memory( + data, + width: widget.width, + height: widget.height, + fit: widget.fit, + filterQuality: + widget.isThumbnail ? FilterQuality.low : FilterQuality.medium, + errorBuilder: (context, e, s) { + Logs().d('Unable to render mxc image', e, s); + return SizedBox( + width: widget.width, + height: widget.height, + child: Material( + color: Theme.of(context).colorScheme.surfaceContainer, + child: Icon( + Icons.broken_image_outlined, + size: min(widget.height ?? 64, 64), + color: Theme.of(context).colorScheme.onSurface, + ), + ), + ); + }, + ) + : SizedBox( + width: widget.width, + height: widget.height, + ), + ); + } +} diff --git a/lib/widgets/mxc_image_viewer.dart b/lib/widgets/mxc_image_viewer.dart new file mode 100644 index 0000000..ffc578f --- /dev/null +++ b/lib/widgets/mxc_image_viewer.dart @@ -0,0 +1,60 @@ +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; + +import 'mxc_image.dart'; + +class MxcImageViewer extends StatelessWidget { + final Uri mxContent; + + const MxcImageViewer(this.mxContent, {super.key}); + + @override + Widget build(BuildContext context) { + final iconButtonStyle = IconButton.styleFrom( + backgroundColor: Colors.black.withAlpha(200), + foregroundColor: Colors.white, + ); + return GestureDetector( + onTap: () => Navigator.of(context).pop(), + child: Scaffold( + backgroundColor: Colors.black.withAlpha(128), + extendBodyBehindAppBar: true, + appBar: AppBar( + elevation: 0, + leading: IconButton( + style: iconButtonStyle, + icon: const Icon(Icons.close), + onPressed: Navigator.of(context).pop, + color: Colors.white, + tooltip: L10n.of(context).close, + ), + backgroundColor: Colors.transparent, + ), + body: InteractiveViewer( + minScale: 1.0, + maxScale: 10.0, + onInteractionEnd: (endDetails) { + if (endDetails.velocity.pixelsPerSecond.dy > + MediaQuery.of(context).size.height * 1.5) { + Navigator.of(context, rootNavigator: false).pop(); + } + }, + child: Center( + child: GestureDetector( + // Ignore taps to not go back here: + onTap: () {}, + child: MxcImage( + key: ValueKey(mxContent.toString()), + uri: mxContent, + fit: BoxFit.contain, + isThumbnail: false, + animated: true, + ), + ), + ), + ), + ), + ); + } +} diff --git a/lib/widgets/navigation_rail.dart b/lib/widgets/navigation_rail.dart new file mode 100644 index 0000000..00b0672 --- /dev/null +++ b/lib/widgets/navigation_rail.dart @@ -0,0 +1,137 @@ +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/pages/chat_list/navi_rail_item.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; +import 'package:fluffychat/utils/stream_extension.dart'; +import 'package:fluffychat/widgets/avatar.dart'; +import 'package:fluffychat/widgets/matrix.dart'; + +class SpacesNavigationRail extends StatelessWidget { + final String? activeSpaceId; + final void Function() onGoToChats; + final void Function(String) onGoToSpaceId; + + const SpacesNavigationRail({ + required this.activeSpaceId, + required this.onGoToChats, + required this.onGoToSpaceId, + super.key, + }); + + @override + Widget build(BuildContext context) { + final client = Matrix.of(context).client; + final isSettings = GoRouter.of(context) + .routeInformationProvider + .value + .uri + .path + .startsWith('/rooms/settings'); + return StreamBuilder( + key: ValueKey( + client.userID.toString(), + ), + stream: client.onSync.stream + .where((s) => s.hasRoomUpdate) + .rateLimit(const Duration(seconds: 1)), + builder: (context, _) { + final allSpaces = client.rooms.where((room) => room.isSpace); + final rootSpaces = allSpaces + .where( + (space) => !allSpaces.any( + (parentSpace) => parentSpace.spaceChildren + .any((child) => child.roomId == space.id), + ), + ) + .toList(); + + return SizedBox( + width: FluffyThemes.navRailWidth, + child: Column( + children: [ + Expanded( + child: ListView.builder( + scrollDirection: Axis.vertical, + itemCount: rootSpaces.length + 2, + itemBuilder: (context, i) { + if (i == 0) { + return NaviRailItem( + isSelected: activeSpaceId == null && !isSettings, + onTap: onGoToChats, + icon: const Padding( + padding: EdgeInsets.all(10.0), + child: Icon(Icons.forum_outlined), + ), + selectedIcon: const Padding( + padding: EdgeInsets.all(10.0), + child: Icon(Icons.forum), + ), + toolTip: L10n.of(context).chats, + unreadBadgeFilter: (room) => true, + ); + } + i--; + if (i == rootSpaces.length) { + return NaviRailItem( + isSelected: false, + onTap: () => context.go('/rooms/newspace'), + icon: const Padding( + padding: EdgeInsets.all(8.0), + child: Icon(Icons.add), + ), + toolTip: L10n.of(context).createNewSpace, + ); + } + final space = rootSpaces[i]; + final displayname = rootSpaces[i].getLocalizedDisplayname( + MatrixLocals(L10n.of(context)), + ); + final spaceChildrenIds = + space.spaceChildren.map((c) => c.roomId).toSet(); + return NaviRailItem( + toolTip: displayname, + isSelected: activeSpaceId == space.id, + onTap: () => onGoToSpaceId(rootSpaces[i].id), + unreadBadgeFilter: (room) => + spaceChildrenIds.contains(room.id), + icon: Avatar( + mxContent: rootSpaces[i].avatar, + name: displayname, + border: BorderSide( + width: 1, + color: Theme.of(context).dividerColor, + ), + borderRadius: BorderRadius.circular( + AppConfig.borderRadius / 2, + ), + ), + ); + }, + ), + ), + NaviRailItem( + isSelected: isSettings, + onTap: () => context.go('/rooms/settings'), + icon: const Padding( + padding: EdgeInsets.all(10.0), + child: Icon(Icons.settings_outlined), + ), + selectedIcon: const Padding( + padding: EdgeInsets.all(10.0), + child: Icon(Icons.settings), + ), + toolTip: L10n.of(context).settings, + ), + ], + ), + ); + }, + ); + } +} diff --git a/lib/widgets/permission_slider_dialog.dart b/lib/widgets/permission_slider_dialog.dart new file mode 100644 index 0000000..37b9b23 --- /dev/null +++ b/lib/widgets/permission_slider_dialog.dart @@ -0,0 +1,78 @@ +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; + +import 'package:fluffychat/widgets/adaptive_dialogs/adaptive_dialog_action.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/dialog_text_field.dart'; + +Future showPermissionChooser( + BuildContext context, { + int currentLevel = 0, + int maxLevel = 100, +}) async { + final controller = TextEditingController(); + final error = ValueNotifier(null); + return await showAdaptiveDialog( + context: context, + builder: (context) => AlertDialog.adaptive( + title: Text(L10n.of(context).chatPermissions), + content: ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 256, maxHeight: 256), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.stretch, + spacing: 12.0, + children: [ + Text(L10n.of(context).setPermissionsLevelDescription), + ValueListenableBuilder( + valueListenable: error, + builder: (context, errorText, _) => DialogTextField( + controller: controller, + hintText: currentLevel.toString(), + keyboardType: TextInputType.number, + labelText: L10n.of(context).custom, + errorText: errorText, + ), + ), + ], + ), + ), + actions: [ + AdaptiveDialogAction( + bigButtons: true, + onPressed: () { + final level = int.tryParse(controller.text.trim()); + if (level == null) { + error.value = L10n.of(context).pleaseEnterANumber; + return; + } + if (level > maxLevel) { + error.value = L10n.of(context).noPermission; + return; + } + Navigator.of(context).pop(level); + }, + child: Text(L10n.of(context).setCustomPermissionLevel), + ), + if (maxLevel >= 100 && currentLevel != 100) + AdaptiveDialogAction( + bigButtons: true, + onPressed: () => Navigator.of(context).pop(100), + child: Text(L10n.of(context).admin), + ), + if (maxLevel >= 50 && currentLevel != 50) + AdaptiveDialogAction( + bigButtons: true, + onPressed: () => Navigator.of(context).pop(50), + child: Text(L10n.of(context).moderator), + ), + if (currentLevel != 0) + AdaptiveDialogAction( + bigButtons: true, + onPressed: () => Navigator.of(context).pop(0), + child: Text(L10n.of(context).normalUser), + ), + ], + ), + ); +} diff --git a/lib/widgets/presence_builder.dart b/lib/widgets/presence_builder.dart new file mode 100644 index 0000000..7aacc6f --- /dev/null +++ b/lib/widgets/presence_builder.dart @@ -0,0 +1,56 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; + +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/widgets/matrix.dart'; + +class PresenceBuilder extends StatefulWidget { + final Widget Function(BuildContext context, CachedPresence? presence) builder; + final String? userId; + final Client? client; + + const PresenceBuilder({ + required this.builder, + this.userId, + this.client, + super.key, + }); + + @override + State createState() => _PresenceBuilderState(); +} + +class _PresenceBuilderState extends State { + CachedPresence? _presence; + StreamSubscription? _sub; + + void _updatePresence(CachedPresence? presence) { + setState(() { + _presence = presence; + }); + } + + @override + void initState() { + super.initState(); + final client = widget.client ?? Matrix.of(context).client; + final userId = widget.userId; + if (userId != null) { + client.fetchCurrentPresence(userId).then(_updatePresence); + _sub = client.onPresenceChanged.stream + .where((presence) => presence.userid == userId) + .listen(_updatePresence); + } + } + + @override + void dispose() { + _sub?.cancel(); + super.dispose(); + } + + @override + Widget build(BuildContext context) => widget.builder(context, _presence); +} diff --git a/lib/widgets/qr_code_viewer.dart b/lib/widgets/qr_code_viewer.dart new file mode 100644 index 0000000..66593de --- /dev/null +++ b/lib/widgets/qr_code_viewer.dart @@ -0,0 +1,138 @@ +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; + +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:image/image.dart'; +import 'package:matrix/matrix.dart'; +import 'package:pretty_qr_code/pretty_qr_code.dart'; +import 'package:qr_image/qr_image.dart'; + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/utils/fluffy_share.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_file_extension.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import '../config/themes.dart'; + +Future showQrCodeViewer( + BuildContext context, + String content, +) => + showDialog( + context: context, + builder: (context) => QrCodeViewer(content: content), + ); + +class QrCodeViewer extends StatelessWidget { + final String content; + + const QrCodeViewer({required this.content, super.key}); + + void _save(BuildContext context) async { + final imageResult = await showFutureLoadingDialog( + context: context, + future: () async { + final inviteLink = 'https://matrix.to/#/$content'; + final image = QRImage( + inviteLink, + size: 256, + radius: 1, + ).generate(); + return compute(encodePng, image); + }, + ); + final bytes = imageResult.result; + if (bytes == null) return; + if (!context.mounted) return; + + MatrixImageFile( + bytes: bytes, + name: 'QR_Code_$content.png', + mimeType: 'image/png', + ).save(context); + } + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + final inviteLink = 'https://matrix.to/#/$content'; + return Scaffold( + backgroundColor: Colors.black.withAlpha(128), + extendBodyBehindAppBar: true, + appBar: AppBar( + elevation: 0, + leading: IconButton( + style: IconButton.styleFrom( + backgroundColor: Colors.black.withAlpha(128), + ), + icon: const Icon(Icons.close), + onPressed: Navigator.of(context).pop, + color: Colors.white, + tooltip: L10n.of(context).close, + ), + backgroundColor: Colors.transparent, + actions: [ + IconButton( + style: IconButton.styleFrom( + backgroundColor: Colors.black.withAlpha(128), + ), + icon: Icon(Icons.adaptive.share_outlined), + onPressed: () => FluffyShare.share( + inviteLink, + context, + ), + color: Colors.white, + tooltip: L10n.of(context).share, + ), + const SizedBox(width: 8), + IconButton( + style: IconButton.styleFrom( + backgroundColor: Colors.black.withAlpha(128), + ), + icon: const Icon(Icons.download_outlined), + onPressed: () => _save(context), + color: Colors.white, + tooltip: L10n.of(context).downloadFile, + ), + const SizedBox(width: 8), + ], + ), + body: Center( + child: Container( + margin: const EdgeInsets.all(32.0), + padding: const EdgeInsets.all(32.0), + decoration: BoxDecoration( + color: theme.colorScheme.primaryContainer, + borderRadius: BorderRadius.circular(AppConfig.borderRadius), + ), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + ConstrainedBox( + constraints: + const BoxConstraints(maxWidth: FluffyThemes.columnWidth), + child: PrettyQrView.data( + data: inviteLink, + decoration: PrettyQrDecoration( + shape: PrettyQrSmoothSymbol( + roundFactor: 1, + color: theme.colorScheme.onPrimaryContainer, + ), + ), + ), + ), + const SizedBox(height: 8.0), + SelectableText( + content, + textAlign: TextAlign.center, + style: TextStyle( + color: theme.colorScheme.onPrimaryContainer, + fontSize: 12, + ), + ), + ], + ), + ), + ), + ); + } +} diff --git a/lib/widgets/settings_switch_list_tile.dart b/lib/widgets/settings_switch_list_tile.dart new file mode 100644 index 0000000..f49b975 --- /dev/null +++ b/lib/widgets/settings_switch_list_tile.dart @@ -0,0 +1,41 @@ +import 'package:flutter/material.dart'; + +import 'matrix.dart'; + +class SettingsSwitchListTile extends StatefulWidget { + final bool defaultValue; + final String storeKey; + final String title; + final String? subtitle; + final Function(bool)? onChanged; + + const SettingsSwitchListTile.adaptive({ + super.key, + this.defaultValue = false, + required this.storeKey, + required this.title, + this.subtitle, + this.onChanged, + }); + + @override + SettingsSwitchListTileState createState() => SettingsSwitchListTileState(); +} + +class SettingsSwitchListTileState extends State { + @override + Widget build(BuildContext context) { + final subtitle = widget.subtitle; + return SwitchListTile.adaptive( + value: Matrix.of(context).store.getBool(widget.storeKey) ?? + widget.defaultValue, + title: Text(widget.title), + subtitle: subtitle == null ? null : Text(subtitle), + onChanged: (bool newValue) async { + widget.onChanged?.call(newValue); + await Matrix.of(context).store.setBool(widget.storeKey, newValue); + setState(() {}); + }, + ); + } +} diff --git a/lib/widgets/share_scaffold_dialog.dart b/lib/widgets/share_scaffold_dialog.dart new file mode 100644 index 0000000..a9f7404 --- /dev/null +++ b/lib/widgets/share_scaffold_dialog.dart @@ -0,0 +1,178 @@ +import 'package:flutter/material.dart'; + +import 'package:cross_file/cross_file.dart'; +import 'package:fluffychat/generated/l10n/l10n.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart'; + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; +import 'package:fluffychat/widgets/avatar.dart'; +import 'package:fluffychat/widgets/matrix.dart'; + +abstract class ShareItem {} + +class TextShareItem extends ShareItem { + final String value; + TextShareItem(this.value); +} + +class ContentShareItem extends ShareItem { + final Map value; + ContentShareItem(this.value); +} + +class FileShareItem extends ShareItem { + final XFile value; + FileShareItem(this.value); +} + +class ShareScaffoldDialog extends StatefulWidget { + final List items; + + const ShareScaffoldDialog({required this.items, super.key}); + + @override + State createState() => _ShareScaffoldDialogState(); +} + +class _ShareScaffoldDialogState extends State { + final TextEditingController _filterController = TextEditingController(); + + String? selectedRoomId; + + void _toggleRoom(String roomId) { + setState(() { + selectedRoomId = roomId; + }); + } + + void _forwardAction() async { + final roomId = selectedRoomId; + if (roomId == null) { + throw Exception( + 'Started forward action before room was selected. This should never happen.', + ); + } + while (context.canPop()) { + context.pop(); + } + context.go('/rooms/$roomId', extra: widget.items); + } + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + final rooms = Matrix.of(context) + .client + .rooms + .where( + (room) => + room.canSendDefaultMessages && + !room.isSpace && + room.membership == Membership.join, + ) + .toList(); + final filter = _filterController.text.trim().toLowerCase(); + return Scaffold( + appBar: AppBar( + leading: Center(child: CloseButton(onPressed: context.pop)), + title: Text(L10n.of(context).share), + ), + body: CustomScrollView( + slivers: [ + SliverAppBar( + floating: true, + toolbarHeight: 72, + scrolledUnderElevation: 0, + backgroundColor: Colors.transparent, + automaticallyImplyLeading: false, + title: TextField( + controller: _filterController, + onChanged: (_) => setState(() {}), + textInputAction: TextInputAction.search, + decoration: InputDecoration( + filled: true, + fillColor: theme.colorScheme.secondaryContainer, + border: OutlineInputBorder( + borderSide: BorderSide.none, + borderRadius: BorderRadius.circular(99), + ), + contentPadding: EdgeInsets.zero, + hintText: L10n.of(context).search, + hintStyle: TextStyle( + color: theme.colorScheme.onPrimaryContainer, + fontWeight: FontWeight.normal, + ), + floatingLabelBehavior: FloatingLabelBehavior.never, + prefixIcon: IconButton( + onPressed: () {}, + icon: Icon( + Icons.search_outlined, + color: theme.colorScheme.onPrimaryContainer, + ), + ), + ), + ), + ), + SliverList.builder( + itemCount: rooms.length, + itemBuilder: (context, i) { + final room = rooms[i]; + final displayname = room.getLocalizedDisplayname( + MatrixLocals(L10n.of(context)), + ); + final value = selectedRoomId == room.id; + final filterOut = !displayname.toLowerCase().contains(filter); + if (!value && filterOut) { + return const SizedBox.shrink(); + } + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 16.0), + child: Opacity( + opacity: filterOut ? 0.5 : 1, + child: CheckboxListTile.adaptive( + checkboxShape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(90), + ), + controlAffinity: ListTileControlAffinity.trailing, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular(AppConfig.borderRadius), + ), + secondary: Avatar( + mxContent: room.avatar, + name: displayname, + size: Avatar.defaultSize * 0.75, + ), + title: Text(displayname), + value: selectedRoomId == room.id, + onChanged: (_) => _toggleRoom(room.id), + ), + ), + ); + }, + ), + ], + ), + bottomNavigationBar: AnimatedSize( + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + child: selectedRoomId == null + ? const SizedBox.shrink() + : Material( + elevation: 8, + shadowColor: theme.appBarTheme.shadowColor, + child: Padding( + padding: const EdgeInsets.all(16.0), + child: ElevatedButton( + onPressed: _forwardAction, + child: Text(L10n.of(context).forward), + ), + ), + ), + ), + ); + } +} diff --git a/lib/widgets/theme_builder.dart b/lib/widgets/theme_builder.dart new file mode 100644 index 0000000..c329cdc --- /dev/null +++ b/lib/widgets/theme_builder.dart @@ -0,0 +1,122 @@ +import 'package:flutter/material.dart'; + +import 'package:collection/collection.dart'; +import 'package:dynamic_color/dynamic_color.dart'; +import 'package:provider/provider.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +import 'package:fluffychat/utils/color_value.dart'; + +class ThemeBuilder extends StatefulWidget { + final Widget Function( + BuildContext context, + ThemeMode themeMode, + Color? primaryColor, + bool pureBlack, + ) builder; + + final String themeModeSettingsKey; + final String primaryColorSettingsKey; + final String pureBlackSettingsKey; + + const ThemeBuilder({ + required this.builder, + this.themeModeSettingsKey = 'theme_mode', + this.primaryColorSettingsKey = 'primary_color', + this.pureBlackSettingsKey = 'pure_black', + super.key, + }); + + @override + State createState() => ThemeController(); +} + +class ThemeController extends State { + SharedPreferences? _sharedPreferences; + ThemeMode? _themeMode; + Color? _primaryColor; + bool? _pureBlack; + + ThemeMode get themeMode => _themeMode ?? ThemeMode.system; + + Color? get primaryColor => _primaryColor; + + bool get pureBlack => _pureBlack ?? false; + + static ThemeController of(BuildContext context) => + Provider.of( + context, + listen: false, + ); + + void _loadData(_) async { + final preferences = + _sharedPreferences ??= await SharedPreferences.getInstance(); + + final rawThemeMode = preferences.getString(widget.themeModeSettingsKey); + final rawColor = preferences.getInt(widget.primaryColorSettingsKey); + final rawPureBlack = preferences.getBool(widget.pureBlackSettingsKey); + + setState(() { + _themeMode = ThemeMode.values + .singleWhereOrNull((value) => value.name == rawThemeMode); + _primaryColor = rawColor == null ? null : Color(rawColor); + _pureBlack = rawPureBlack; + }); + } + + Future setThemeMode(ThemeMode newThemeMode) async { + final preferences = + _sharedPreferences ??= await SharedPreferences.getInstance(); + await preferences.setString(widget.themeModeSettingsKey, newThemeMode.name); + setState(() { + _themeMode = newThemeMode; + }); + } + + Future setPrimaryColor(Color? newPrimaryColor) async { + final preferences = + _sharedPreferences ??= await SharedPreferences.getInstance(); + if (newPrimaryColor == null) { + await preferences.remove(widget.primaryColorSettingsKey); + } else { + await preferences.setInt( + widget.primaryColorSettingsKey, + newPrimaryColor.hexValue, + ); + } + setState(() { + _primaryColor = newPrimaryColor; + }); + } + + Future setPureBlack(bool newPureBlack) async { + final preferences = + _sharedPreferences ??= await SharedPreferences.getInstance(); + await preferences.setBool(widget.pureBlackSettingsKey, newPureBlack); + setState(() { + _pureBlack = newPureBlack; + }); + } + + @override + void initState() { + WidgetsBinding.instance.addPostFrameCallback(_loadData); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Provider( + create: (_) => this, + child: DynamicColorBuilder( + builder: (light, _) => widget.builder( + context, + themeMode, + primaryColor ?? light?.primary, + pureBlack, + ), + ), + ); + } +} diff --git a/lib/widgets/unread_rooms_badge.dart b/lib/widgets/unread_rooms_badge.dart new file mode 100644 index 0000000..4951734 --- /dev/null +++ b/lib/widgets/unread_rooms_badge.dart @@ -0,0 +1,52 @@ +import 'package:flutter/material.dart'; + +import 'package:badges/badges.dart' as b; +import 'package:matrix/matrix.dart'; + +import 'matrix.dart'; + +class UnreadRoomsBadge extends StatelessWidget { + final bool Function(Room) filter; + final b.BadgePosition? badgePosition; + final Widget? child; + + const UnreadRoomsBadge({ + super.key, + required this.filter, + this.badgePosition, + this.child, + }); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + final unreadCount = Matrix.of(context) + .client + .rooms + .where(filter) + .where((r) => (r.isUnread || r.membership == Membership.invite)) + .length; + return b.Badge( + badgeStyle: b.BadgeStyle( + badgeColor: theme.colorScheme.primary, + elevation: 4, + borderSide: BorderSide( + color: theme.colorScheme.surface, + width: 2, + ), + ), + badgeContent: Text( + unreadCount.toString(), + style: TextStyle( + color: theme.colorScheme.onPrimary, + fontSize: 12, + ), + ), + showBadge: unreadCount != 0, + badgeAnimation: const b.BadgeAnimation.scale(), + position: badgePosition ?? b.BadgePosition.bottomEnd(), + child: child, + ); + } +} diff --git a/licenses.yaml b/licenses.yaml new file mode 100644 index 0000000..02b7ad9 --- /dev/null +++ b/licenses.yaml @@ -0,0 +1,40 @@ +# This is a config for a license compliance checker script. It runs in CI. +# +# To run locally: +# dart run license_checker check-licenses -c licenses.yaml --problematic +# +# SPDX license list: https://spdx.org/licenses/ + +# Before you add a license here: Is it free software? Is it compatible with AGPL-3.0? +permittedLicenses: + - AGPL-3.0 + - Apache-2.0 + - BSD-2-Clause + - BSD-3-Clause + - EUPL-1.2 + - LGPL-3.0 + - MIT + - MPL-2.0 + - Zlib + +packageLicenseOverride: + dependency_validator: Apache-2.0 + flutter_gen: MIT + hive: Apache-2.0 + hive_flutter: Apache-2.0 + latlong2: Apache-2.0 + platform_detect: Apache-2.0 + rxdart: Apache-2.0 + flutter_new_badger: MIT + + # flutter's internal packages + flutter_driver: BSD-3-Clause + flutter_localizations: BSD-3-Clause + flutter_test: BSD-3-Clause + flutter_web_plugins: BSD-3-Clause + fuchsia_remote_debug_protocol: BSD-3-Clause + integration_test: BSD-3-Clause + sky_engine: BSD-3-Clause + +rejectedLicenses: + - BUSL-1.1 diff --git a/linux/.gitignore b/linux/.gitignore new file mode 100644 index 0000000..d3896c9 --- /dev/null +++ b/linux/.gitignore @@ -0,0 +1 @@ +flutter/ephemeral diff --git a/linux/CMakeLists.txt b/linux/CMakeLists.txt new file mode 100644 index 0000000..ecb5b87 --- /dev/null +++ b/linux/CMakeLists.txt @@ -0,0 +1,147 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.10) +project(runner LANGUAGES CXX) + +# smth sqlcipher_flutter_libs static linking Hundreds +set(OPENSSL_USE_STATIC_LIBS OFF) +# The name of the executable created for the application. Change this to change +# the on-disk name of your application. +set(BINARY_NAME "fluffychat") +# The unique GTK application identifier for this application. See: +# https://wiki.gnome.org/HowDoI/ChooseApplicationID +set(APPLICATION_ID "chat.fluffy.fluffychat") + +# Explicitly opt in to modern CMake behaviors to avoid warnings with recent +# versions of CMake. +cmake_policy(SET CMP0063 NEW) + +# Load bundled libraries from the lib/ directory relative to the binary. +set(CMAKE_INSTALL_RPATH "$ORIGIN/lib") + +# Root filesystem for cross-building. +if(FLUTTER_TARGET_PLATFORM_SYSROOT) + set(CMAKE_SYSROOT ${FLUTTER_TARGET_PLATFORM_SYSROOT}) + set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT}) + set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) + set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +endif() + +# Define build configuration options. +if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE "Debug" CACHE + STRING "Flutter build mode" FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS + "Debug" "Profile" "Release") +endif() + +# Compilation settings that should be applied to most targets. +# +# Be cautious about adding new options here, as plugins use this function by +# default. In most cases, you should add new options to specific targets instead +# of modifying this function. +function(APPLY_STANDARD_SETTINGS TARGET) + target_compile_features(${TARGET} PUBLIC cxx_std_14) + target_compile_options(${TARGET} PRIVATE -Wall -Werror) + target_compile_options(${TARGET} PRIVATE "$<$>:-O3>") + target_compile_definitions(${TARGET} PRIVATE "$<$>:NDEBUG>") +endfunction() + +# Flutter library and tool build rules. +set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") +add_subdirectory(${FLUTTER_MANAGED_DIR}) + +# System-level dependencies. +find_package(PkgConfig REQUIRED) +pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) + +add_definitions(-DAPPLICATION_ID="${APPLICATION_ID}") + +# Define the application target. To change its name, change BINARY_NAME above, +# not the value here, or `flutter run` will no longer work. +# +# Any new source files that you add to the application should be added here. +add_executable(${BINARY_NAME} + "main.cc" + "my_application.cc" + "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" +) + +# Apply the standard set of build settings. This can be removed for applications +# that need different build settings. +apply_standard_settings(${BINARY_NAME}) + +# Add dependency libraries. Add any application-specific dependencies here. +target_link_libraries(${BINARY_NAME} PRIVATE flutter) +target_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::GTK) + +# Run the Flutter tool portions of the build. This must not be removed. +add_dependencies(${BINARY_NAME} flutter_assemble) + +# Only the install-generated bundle's copy of the executable will launch +# correctly, since the resources must in the right relative locations. To avoid +# people trying to run the unbundled copy, put it in a subdirectory instead of +# the default top-level location. +set_target_properties(${BINARY_NAME} + PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/intermediates_do_not_run" +) + + +# Generated plugin build rules, which manage building the plugins and adding +# them to the application. +include(flutter/generated_plugins.cmake) + + +# === Installation === +# By default, "installing" just makes a relocatable bundle in the build +# directory. +set(BUILD_BUNDLE_DIR "${PROJECT_BINARY_DIR}/bundle") +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) +endif() + +# Start with a clean build bundle directory every time. +install(CODE " + file(REMOVE_RECURSE \"${BUILD_BUNDLE_DIR}/\") + " COMPONENT Runtime) + +set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") +set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib") + +install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +foreach(bundled_library ${PLUGIN_BUNDLED_LIBRARIES}) + install(FILES "${bundled_library}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endforeach(bundled_library) + +# Copy the native assets provided by the build.dart from all packages. +set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/linux/") +install(DIRECTORY "${NATIVE_ASSETS_DIR}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +# Fully re-copy the assets directory on each build to avoid having stale files +# from a previous install. +set(FLUTTER_ASSET_DIR_NAME "flutter_assets") +install(CODE " + file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") + " COMPONENT Runtime) +install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" + DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) + +# Install the AOT library on non-Debug builds only. +if(NOT CMAKE_BUILD_TYPE MATCHES "Debug") + install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endif() diff --git a/linux/flutter/CMakeLists.txt b/linux/flutter/CMakeLists.txt new file mode 100644 index 0000000..d5bd016 --- /dev/null +++ b/linux/flutter/CMakeLists.txt @@ -0,0 +1,88 @@ +# This file controls Flutter-level build steps. It should not be edited. +cmake_minimum_required(VERSION 3.10) + +set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") + +# Configuration provided via flutter tool. +include(${EPHEMERAL_DIR}/generated_config.cmake) + +# TODO: Move the rest of this into files in ephemeral. See +# https://github.com/flutter/flutter/issues/57146. + +# Serves the same purpose as list(TRANSFORM ... PREPEND ...), +# which isn't available in 3.10. +function(list_prepend LIST_NAME PREFIX) + set(NEW_LIST "") + foreach(element ${${LIST_NAME}}) + list(APPEND NEW_LIST "${PREFIX}${element}") + endforeach(element) + set(${LIST_NAME} "${NEW_LIST}" PARENT_SCOPE) +endfunction() + +# === Flutter Library === +# System-level dependencies. +find_package(PkgConfig REQUIRED) +pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) +pkg_check_modules(GLIB REQUIRED IMPORTED_TARGET glib-2.0) +pkg_check_modules(GIO REQUIRED IMPORTED_TARGET gio-2.0) + +set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/libflutter_linux_gtk.so") + +# Published to parent scope for install step. +set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) +set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) +set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) +set(AOT_LIBRARY "${PROJECT_DIR}/build/lib/libapp.so" PARENT_SCOPE) + +list(APPEND FLUTTER_LIBRARY_HEADERS + "fl_basic_message_channel.h" + "fl_binary_codec.h" + "fl_binary_messenger.h" + "fl_dart_project.h" + "fl_engine.h" + "fl_json_message_codec.h" + "fl_json_method_codec.h" + "fl_message_codec.h" + "fl_method_call.h" + "fl_method_channel.h" + "fl_method_codec.h" + "fl_method_response.h" + "fl_plugin_registrar.h" + "fl_plugin_registry.h" + "fl_standard_message_codec.h" + "fl_standard_method_codec.h" + "fl_string_codec.h" + "fl_value.h" + "fl_view.h" + "flutter_linux.h" +) +list_prepend(FLUTTER_LIBRARY_HEADERS "${EPHEMERAL_DIR}/flutter_linux/") +add_library(flutter INTERFACE) +target_include_directories(flutter INTERFACE + "${EPHEMERAL_DIR}" +) +target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}") +target_link_libraries(flutter INTERFACE + PkgConfig::GTK + PkgConfig::GLIB + PkgConfig::GIO +) +add_dependencies(flutter flutter_assemble) + +# === Flutter tool backend === +# _phony_ is a non-existent file to force this command to run every time, +# since currently there's no way to get a full input/output list from the +# flutter tool. +add_custom_command( + OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} + ${CMAKE_CURRENT_BINARY_DIR}/_phony_ + COMMAND ${CMAKE_COMMAND} -E env + ${FLUTTER_TOOL_ENVIRONMENT} + "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.sh" + ${FLUTTER_TARGET_PLATFORM} ${CMAKE_BUILD_TYPE} + VERBATIM +) +add_custom_target(flutter_assemble DEPENDS + "${FLUTTER_LIBRARY}" + ${FLUTTER_LIBRARY_HEADERS} +) diff --git a/linux/flutter/generated_plugin_registrant.cc b/linux/flutter/generated_plugin_registrant.cc new file mode 100644 index 0000000..016e81f --- /dev/null +++ b/linux/flutter/generated_plugin_registrant.cc @@ -0,0 +1,63 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +void fl_register_plugins(FlPluginRegistry* registry) { + g_autoptr(FlPluginRegistrar) desktop_drop_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "DesktopDropPlugin"); + desktop_drop_plugin_register_with_registrar(desktop_drop_registrar); + g_autoptr(FlPluginRegistrar) dynamic_color_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "DynamicColorPlugin"); + dynamic_color_plugin_register_with_registrar(dynamic_color_registrar); + g_autoptr(FlPluginRegistrar) emoji_picker_flutter_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "EmojiPickerFlutterPlugin"); + emoji_picker_flutter_plugin_register_with_registrar(emoji_picker_flutter_registrar); + g_autoptr(FlPluginRegistrar) file_selector_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "FileSelectorPlugin"); + file_selector_plugin_register_with_registrar(file_selector_linux_registrar); + g_autoptr(FlPluginRegistrar) flutter_secure_storage_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "FlutterSecureStorageLinuxPlugin"); + flutter_secure_storage_linux_plugin_register_with_registrar(flutter_secure_storage_linux_registrar); + g_autoptr(FlPluginRegistrar) flutter_webrtc_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "FlutterWebRTCPlugin"); + flutter_web_r_t_c_plugin_register_with_registrar(flutter_webrtc_registrar); + g_autoptr(FlPluginRegistrar) gtk_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "GtkPlugin"); + gtk_plugin_register_with_registrar(gtk_registrar); + g_autoptr(FlPluginRegistrar) handy_window_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "HandyWindowPlugin"); + handy_window_plugin_register_with_registrar(handy_window_registrar); + g_autoptr(FlPluginRegistrar) pasteboard_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "PasteboardPlugin"); + pasteboard_plugin_register_with_registrar(pasteboard_registrar); + g_autoptr(FlPluginRegistrar) record_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "RecordLinuxPlugin"); + record_linux_plugin_register_with_registrar(record_linux_registrar); + g_autoptr(FlPluginRegistrar) sqlcipher_flutter_libs_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "Sqlite3FlutterLibsPlugin"); + sqlite3_flutter_libs_plugin_register_with_registrar(sqlcipher_flutter_libs_registrar); + g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin"); + url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar); + g_autoptr(FlPluginRegistrar) window_to_front_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "WindowToFrontPlugin"); + window_to_front_plugin_register_with_registrar(window_to_front_registrar); +} diff --git a/linux/flutter/generated_plugin_registrant.h b/linux/flutter/generated_plugin_registrant.h new file mode 100644 index 0000000..e0f0a47 --- /dev/null +++ b/linux/flutter/generated_plugin_registrant.h @@ -0,0 +1,15 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#ifndef GENERATED_PLUGIN_REGISTRANT_ +#define GENERATED_PLUGIN_REGISTRANT_ + +#include + +// Registers Flutter plugins. +void fl_register_plugins(FlPluginRegistry* registry); + +#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/linux/flutter/generated_plugins.cmake b/linux/flutter/generated_plugins.cmake new file mode 100644 index 0000000..b48cf5c --- /dev/null +++ b/linux/flutter/generated_plugins.cmake @@ -0,0 +1,36 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST + desktop_drop + dynamic_color + emoji_picker_flutter + file_selector_linux + flutter_secure_storage_linux + flutter_webrtc + gtk + handy_window + pasteboard + record_linux + sqlcipher_flutter_libs + url_launcher_linux + window_to_front +) + +list(APPEND FLUTTER_FFI_PLUGIN_LIST +) + +set(PLUGIN_BUNDLED_LIBRARIES) + +foreach(plugin ${FLUTTER_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/linux plugins/${plugin}) + target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) + list(APPEND PLUGIN_BUNDLED_LIBRARIES $) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) +endforeach(plugin) + +foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/linux plugins/${ffi_plugin}) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) +endforeach(ffi_plugin) diff --git a/linux/main.cc b/linux/main.cc new file mode 100644 index 0000000..e7c5c54 --- /dev/null +++ b/linux/main.cc @@ -0,0 +1,6 @@ +#include "my_application.h" + +int main(int argc, char** argv) { + g_autoptr(MyApplication) app = my_application_new(); + return g_application_run(G_APPLICATION(app), argc, argv); +} diff --git a/linux/my_application.cc b/linux/my_application.cc new file mode 100644 index 0000000..446ceea --- /dev/null +++ b/linux/my_application.cc @@ -0,0 +1,137 @@ +#include "my_application.h" + +#include +#ifdef GDK_WINDOWING_X11 +#include +#endif + +#include "flutter/generated_plugin_registrant.h" + +struct _MyApplication { + GtkApplication parent_instance; + char** dart_entrypoint_arguments; +}; + +G_DEFINE_TYPE(MyApplication, my_application, GTK_TYPE_APPLICATION) + +// Implements GApplication::activate. +static void my_application_activate(GApplication* application) { + MyApplication* self = MY_APPLICATION(application); + GtkWindow* window = + GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application))); + + // Use a header bar when running in GNOME as this is the common style used + // by applications and is the setup most users will be using (e.g. Ubuntu + // desktop). + // If running on X and not using GNOME then just use a traditional title bar + // in case the window manager does more exotic layout, e.g. tiling. + // If running on Wayland assume the header bar will work (may need changing + // if future cases occur). + gboolean use_header_bar = TRUE; + // Lines added to the template start + // Please re-add these lines after updating the linux build files + // If the user explicitly requests to disable the header bar, switch back to + // using a traditional title bar + const gchar* gtk_csd_env = g_getenv("GTK_CSD"); + if (gtk_csd_env != nullptr && g_strcmp0(gtk_csd_env, "1") != 0) + use_header_bar = FALSE; + // Lines added to the template end +#ifdef GDK_WINDOWING_X11 + GdkScreen* screen = gtk_window_get_screen(window); + if (GDK_IS_X11_SCREEN(screen)) { + const gchar* wm_name = gdk_x11_screen_get_window_manager_name(screen); + if (g_strcmp0(wm_name, "GNOME Shell") != 0) { + use_header_bar = FALSE; + // Lines added to the template start + // Please re-add these lines after updating the linux build files + // Disable libhandy here, otherwise the close button disappears on KDE X11 + g_setenv("GTK_CSD", "0", TRUE); + // Lines added to the template end + } + } +#endif + if (use_header_bar) { + GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new()); + gtk_widget_show(GTK_WIDGET(header_bar)); + gtk_header_bar_set_title(header_bar, "Extera Next"); + gtk_header_bar_set_show_close_button(header_bar, TRUE); + gtk_window_set_titlebar(window, GTK_WIDGET(header_bar)); + } else { + gtk_window_set_title(window, "Extera Next"); + } + + gtk_window_set_default_size(window, 864, 720); + + g_autoptr(FlDartProject) project = fl_dart_project_new(); + fl_dart_project_set_dart_entrypoint_arguments(project, self->dart_entrypoint_arguments); + + FlView* view = fl_view_new(project); + gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view)); + + fl_register_plugins(FL_PLUGIN_REGISTRY(view)); + + gtk_widget_show(GTK_WIDGET(window)); + gtk_widget_show(GTK_WIDGET(view)); + gtk_widget_grab_focus(GTK_WIDGET(view)); +} + +// Implements GApplication::local_command_line. +static gboolean my_application_local_command_line(GApplication* application, gchar*** arguments, int* exit_status) { + MyApplication* self = MY_APPLICATION(application); + // Strip out the first argument as it is the binary name. + self->dart_entrypoint_arguments = g_strdupv(*arguments + 1); + + g_autoptr(GError) error = nullptr; + if (!g_application_register(application, nullptr, &error)) { + g_warning("Failed to register: %s", error->message); + *exit_status = 1; + return TRUE; + } + + g_application_activate(application); + *exit_status = 0; + + return TRUE; +} + +// Implements GApplication::startup. +static void my_application_startup(GApplication* application) { + //MyApplication* self = MY_APPLICATION(object); + + // Perform any actions required at application startup. + + G_APPLICATION_CLASS(my_application_parent_class)->startup(application); +} + +// Implements GApplication::shutdown. +static void my_application_shutdown(GApplication* application) { + //MyApplication* self = MY_APPLICATION(object); + + // Perform any actions required at application shutdown. + + G_APPLICATION_CLASS(my_application_parent_class)->shutdown(application); +} + +// Implements GObject::dispose. +static void my_application_dispose(GObject* object) { + MyApplication* self = MY_APPLICATION(object); + g_clear_pointer(&self->dart_entrypoint_arguments, g_strfreev); + G_OBJECT_CLASS(my_application_parent_class)->dispose(object); +} + +static void my_application_class_init(MyApplicationClass* klass) { + G_APPLICATION_CLASS(klass)->activate = my_application_activate; + G_APPLICATION_CLASS(klass)->local_command_line = my_application_local_command_line; + G_APPLICATION_CLASS(klass)->startup = my_application_startup; + G_APPLICATION_CLASS(klass)->shutdown = my_application_shutdown; + G_OBJECT_CLASS(klass)->dispose = my_application_dispose; +} + +static void my_application_init(MyApplication* self) {} + +MyApplication* my_application_new() { + return MY_APPLICATION(g_object_new(my_application_get_type(), + "application-id", APPLICATION_ID, + "flags", G_APPLICATION_NON_UNIQUE, + nullptr)); +} diff --git a/linux/my_application.h b/linux/my_application.h new file mode 100644 index 0000000..72271d5 --- /dev/null +++ b/linux/my_application.h @@ -0,0 +1,18 @@ +#ifndef FLUTTER_MY_APPLICATION_H_ +#define FLUTTER_MY_APPLICATION_H_ + +#include + +G_DECLARE_FINAL_TYPE(MyApplication, my_application, MY, APPLICATION, + GtkApplication) + +/** + * my_application_new: + * + * Creates a new Flutter-based application. + * + * Returns: a new #MyApplication. + */ +MyApplication* my_application_new(); + +#endif // FLUTTER_MY_APPLICATION_H_ diff --git a/macos/.gitignore b/macos/.gitignore new file mode 100644 index 0000000..746adbb --- /dev/null +++ b/macos/.gitignore @@ -0,0 +1,7 @@ +# Flutter-related +**/Flutter/ephemeral/ +**/Pods/ + +# Xcode-related +**/dgph +**/xcuserdata/ diff --git a/macos/Flutter/Flutter-Debug.xcconfig b/macos/Flutter/Flutter-Debug.xcconfig new file mode 100644 index 0000000..4b81f9b --- /dev/null +++ b/macos/Flutter/Flutter-Debug.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/macos/Flutter/Flutter-Release.xcconfig b/macos/Flutter/Flutter-Release.xcconfig new file mode 100644 index 0000000..5caa9d1 --- /dev/null +++ b/macos/Flutter/Flutter-Release.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift new file mode 100644 index 0000000..8b16878 --- /dev/null +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -0,0 +1,66 @@ +// +// Generated file. Do not edit. +// + +import FlutterMacOS +import Foundation + +import app_links +import audio_session +import desktop_drop +import device_info_plus +import dynamic_color +import emoji_picker_flutter +import file_picker +import file_selector_macos +import flutter_local_notifications +import flutter_new_badger +import flutter_secure_storage_macos +import flutter_web_auth_2 +import flutter_webrtc +import geolocator_apple +import just_audio +import package_info_plus +import pasteboard +import path_provider_foundation +import record_darwin +import share_plus +import shared_preferences_foundation +import sqflite_darwin +import sqlcipher_flutter_libs +import url_launcher_macos +import video_compress +import video_player_avfoundation +import wakelock_plus +import window_to_front + +func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { + AppLinksMacosPlugin.register(with: registry.registrar(forPlugin: "AppLinksMacosPlugin")) + AudioSessionPlugin.register(with: registry.registrar(forPlugin: "AudioSessionPlugin")) + DesktopDropPlugin.register(with: registry.registrar(forPlugin: "DesktopDropPlugin")) + DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin")) + DynamicColorPlugin.register(with: registry.registrar(forPlugin: "DynamicColorPlugin")) + EmojiPickerFlutterPlugin.register(with: registry.registrar(forPlugin: "EmojiPickerFlutterPlugin")) + FilePickerPlugin.register(with: registry.registrar(forPlugin: "FilePickerPlugin")) + FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin")) + FlutterLocalNotificationsPlugin.register(with: registry.registrar(forPlugin: "FlutterLocalNotificationsPlugin")) + FlutterNewBadgerPlugin.register(with: registry.registrar(forPlugin: "FlutterNewBadgerPlugin")) + FlutterSecureStoragePlugin.register(with: registry.registrar(forPlugin: "FlutterSecureStoragePlugin")) + FlutterWebAuth2Plugin.register(with: registry.registrar(forPlugin: "FlutterWebAuth2Plugin")) + FlutterWebRTCPlugin.register(with: registry.registrar(forPlugin: "FlutterWebRTCPlugin")) + GeolocatorPlugin.register(with: registry.registrar(forPlugin: "GeolocatorPlugin")) + JustAudioPlugin.register(with: registry.registrar(forPlugin: "JustAudioPlugin")) + FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin")) + PasteboardPlugin.register(with: registry.registrar(forPlugin: "PasteboardPlugin")) + PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) + RecordPlugin.register(with: registry.registrar(forPlugin: "RecordPlugin")) + SharePlusMacosPlugin.register(with: registry.registrar(forPlugin: "SharePlusMacosPlugin")) + SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) + SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin")) + Sqlite3FlutterLibsPlugin.register(with: registry.registrar(forPlugin: "Sqlite3FlutterLibsPlugin")) + UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin")) + VideoCompressPlugin.register(with: registry.registrar(forPlugin: "VideoCompressPlugin")) + FVPVideoPlayerPlugin.register(with: registry.registrar(forPlugin: "FVPVideoPlayerPlugin")) + WakelockPlusMacosPlugin.register(with: registry.registrar(forPlugin: "WakelockPlusMacosPlugin")) + WindowToFrontPlugin.register(with: registry.registrar(forPlugin: "WindowToFrontPlugin")) +} diff --git a/macos/Podfile b/macos/Podfile new file mode 100644 index 0000000..b9bae3a --- /dev/null +++ b/macos/Podfile @@ -0,0 +1,43 @@ +platform :osx, '12.2' + +# CocoaPods analytics sends network stats synchronously affecting flutter build latency. +ENV['COCOAPODS_DISABLE_STATS'] = 'true' + +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'ephemeral', 'Flutter-Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure \"flutter pub get\" is executed first" + end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches + end + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Flutter-Generated.xcconfig, then run \"flutter pub get\"" +end + +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_macos_podfile_setup + +target 'Runner' do + use_frameworks! + use_modular_headers! + + flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + flutter_additional_macos_build_settings(target) + target.build_configurations.each do |config| + config.build_settings.delete 'MACOSX_DEPLOYMENT_TARGET' + end + end +end diff --git a/macos/Podfile.lock b/macos/Podfile.lock new file mode 100644 index 0000000..57f0518 --- /dev/null +++ b/macos/Podfile.lock @@ -0,0 +1,198 @@ +PODS: + - app_links (1.0.0): + - FlutterMacOS + - audio_session (0.0.1): + - FlutterMacOS + - desktop_drop (0.0.1): + - FlutterMacOS + - device_info_plus (0.0.1): + - FlutterMacOS + - dynamic_color (0.0.2): + - FlutterMacOS + - emoji_picker_flutter (0.0.1): + - FlutterMacOS + - file_selector_macos (0.0.1): + - FlutterMacOS + - flutter_local_notifications (0.0.1): + - FlutterMacOS + - flutter_new_badger (0.0.1): + - FlutterMacOS + - flutter_secure_storage_macos (6.1.1): + - FlutterMacOS + - flutter_web_auth_2 (3.0.0): + - FlutterMacOS + - flutter_webrtc (0.12.6): + - FlutterMacOS + - WebRTC-SDK (= 125.6422.06) + - FlutterMacOS (1.0.0) + - geolocator_apple (1.2.0): + - FlutterMacOS + - just_audio (0.0.1): + - FlutterMacOS + - package_info_plus (0.0.1): + - FlutterMacOS + - pasteboard (0.0.1): + - FlutterMacOS + - path_provider_foundation (0.0.1): + - Flutter + - FlutterMacOS + - record_darwin (1.0.0): + - Flutter + - FlutterMacOS + - share_plus (0.0.1): + - FlutterMacOS + - shared_preferences_foundation (0.0.1): + - Flutter + - FlutterMacOS + - sqflite (0.0.3): + - Flutter + - FlutterMacOS + - SQLCipher (4.5.7): + - SQLCipher/standard (= 4.5.7) + - SQLCipher/common (4.5.7) + - SQLCipher/standard (4.5.7): + - SQLCipher/common + - sqlcipher_flutter_libs (0.0.1): + - FlutterMacOS + - SQLCipher (~> 4.5.7) + - url_launcher_macos (0.0.1): + - FlutterMacOS + - video_compress (0.3.0): + - FlutterMacOS + - video_player_avfoundation (0.0.1): + - Flutter + - FlutterMacOS + - wakelock_plus (0.0.1): + - FlutterMacOS + - WebRTC-SDK (125.6422.06) + - window_to_front (0.0.1): + - FlutterMacOS + +DEPENDENCIES: + - app_links (from `Flutter/ephemeral/.symlinks/plugins/app_links/macos`) + - audio_session (from `Flutter/ephemeral/.symlinks/plugins/audio_session/macos`) + - desktop_drop (from `Flutter/ephemeral/.symlinks/plugins/desktop_drop/macos`) + - device_info_plus (from `Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos`) + - dynamic_color (from `Flutter/ephemeral/.symlinks/plugins/dynamic_color/macos`) + - emoji_picker_flutter (from `Flutter/ephemeral/.symlinks/plugins/emoji_picker_flutter/macos`) + - file_selector_macos (from `Flutter/ephemeral/.symlinks/plugins/file_selector_macos/macos`) + - flutter_local_notifications (from `Flutter/ephemeral/.symlinks/plugins/flutter_local_notifications/macos`) + - flutter_new_badger (from `Flutter/ephemeral/.symlinks/plugins/flutter_new_badger/macos`) + - flutter_secure_storage_macos (from `Flutter/ephemeral/.symlinks/plugins/flutter_secure_storage_macos/macos`) + - flutter_web_auth_2 (from `Flutter/ephemeral/.symlinks/plugins/flutter_web_auth_2/macos`) + - flutter_webrtc (from `Flutter/ephemeral/.symlinks/plugins/flutter_webrtc/macos`) + - FlutterMacOS (from `Flutter/ephemeral`) + - geolocator_apple (from `Flutter/ephemeral/.symlinks/plugins/geolocator_apple/macos`) + - just_audio (from `Flutter/ephemeral/.symlinks/plugins/just_audio/macos`) + - package_info_plus (from `Flutter/ephemeral/.symlinks/plugins/package_info_plus/macos`) + - pasteboard (from `Flutter/ephemeral/.symlinks/plugins/pasteboard/macos`) + - path_provider_foundation (from `Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin`) + - record_darwin (from `Flutter/ephemeral/.symlinks/plugins/record_darwin/macos`) + - share_plus (from `Flutter/ephemeral/.symlinks/plugins/share_plus/macos`) + - shared_preferences_foundation (from `Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/darwin`) + - sqflite (from `Flutter/ephemeral/.symlinks/plugins/sqflite/darwin`) + - sqlcipher_flutter_libs (from `Flutter/ephemeral/.symlinks/plugins/sqlcipher_flutter_libs/macos`) + - url_launcher_macos (from `Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos`) + - video_compress (from `Flutter/ephemeral/.symlinks/plugins/video_compress/macos`) + - video_player_avfoundation (from `Flutter/ephemeral/.symlinks/plugins/video_player_avfoundation/darwin`) + - wakelock_plus (from `Flutter/ephemeral/.symlinks/plugins/wakelock_plus/macos`) + - window_to_front (from `Flutter/ephemeral/.symlinks/plugins/window_to_front/macos`) + +SPEC REPOS: + trunk: + - SQLCipher + - WebRTC-SDK + +EXTERNAL SOURCES: + app_links: + :path: Flutter/ephemeral/.symlinks/plugins/app_links/macos + audio_session: + :path: Flutter/ephemeral/.symlinks/plugins/audio_session/macos + desktop_drop: + :path: Flutter/ephemeral/.symlinks/plugins/desktop_drop/macos + device_info_plus: + :path: Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos + dynamic_color: + :path: Flutter/ephemeral/.symlinks/plugins/dynamic_color/macos + emoji_picker_flutter: + :path: Flutter/ephemeral/.symlinks/plugins/emoji_picker_flutter/macos + file_selector_macos: + :path: Flutter/ephemeral/.symlinks/plugins/file_selector_macos/macos + flutter_local_notifications: + :path: Flutter/ephemeral/.symlinks/plugins/flutter_local_notifications/macos + flutter_new_badger: + :path: Flutter/ephemeral/.symlinks/plugins/flutter_new_badger/macos + flutter_secure_storage_macos: + :path: Flutter/ephemeral/.symlinks/plugins/flutter_secure_storage_macos/macos + flutter_web_auth_2: + :path: Flutter/ephemeral/.symlinks/plugins/flutter_web_auth_2/macos + flutter_webrtc: + :path: Flutter/ephemeral/.symlinks/plugins/flutter_webrtc/macos + FlutterMacOS: + :path: Flutter/ephemeral + geolocator_apple: + :path: Flutter/ephemeral/.symlinks/plugins/geolocator_apple/macos + just_audio: + :path: Flutter/ephemeral/.symlinks/plugins/just_audio/macos + package_info_plus: + :path: Flutter/ephemeral/.symlinks/plugins/package_info_plus/macos + pasteboard: + :path: Flutter/ephemeral/.symlinks/plugins/pasteboard/macos + path_provider_foundation: + :path: Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin + record_darwin: + :path: Flutter/ephemeral/.symlinks/plugins/record_darwin/macos + share_plus: + :path: Flutter/ephemeral/.symlinks/plugins/share_plus/macos + shared_preferences_foundation: + :path: Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/darwin + sqflite: + :path: Flutter/ephemeral/.symlinks/plugins/sqflite/darwin + sqlcipher_flutter_libs: + :path: Flutter/ephemeral/.symlinks/plugins/sqlcipher_flutter_libs/macos + url_launcher_macos: + :path: Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos + video_compress: + :path: Flutter/ephemeral/.symlinks/plugins/video_compress/macos + video_player_avfoundation: + :path: Flutter/ephemeral/.symlinks/plugins/video_player_avfoundation/darwin + wakelock_plus: + :path: Flutter/ephemeral/.symlinks/plugins/wakelock_plus/macos + window_to_front: + :path: Flutter/ephemeral/.symlinks/plugins/window_to_front/macos + +SPEC CHECKSUMS: + app_links: 10e0a0ab602ffaf34d142cd4862f29d34b303b2a + audio_session: dea1f41890dbf1718f04a56f1d6150fd50039b72 + desktop_drop: 69eeff437544aa619c8db7f4481b3a65f7696898 + device_info_plus: ce1b7762849d3ec103d0e0517299f2db7ad60720 + dynamic_color: 2eaa27267de1ca20d879fbd6e01259773fb1670f + emoji_picker_flutter: 533634326b1c5de9a181ba14b9758e6dfe967a20 + file_selector_macos: cc3858c981fe6889f364731200d6232dac1d812d + flutter_local_notifications: 3805ca215b2fb7f397d78b66db91f6a747af52e4 + flutter_new_badger: 5e34f40142e994b2aaff32e94062189695ee025d + flutter_secure_storage_macos: 59459653abe1adb92abbc8ea747d79f8d19866c9 + flutter_web_auth_2: 2e1dc2d2139973e4723c5286ce247dd590390d70 + flutter_webrtc: d55fd3f5c75b42940b6b4b2cf376a5797398d1f8 + FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24 + geolocator_apple: 72a78ae3f3e4ec0db62117bd93e34523f5011d58 + just_audio: 9b67ca7b97c61cfc9784ea23cd8cc55eb226d489 + package_info_plus: fa739dd842b393193c5ca93c26798dff6e3d0e0c + pasteboard: 9b69dba6fedbb04866be632205d532fe2f6b1d99 + path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46 + record_darwin: df0a677188e5fed18472550298e675f19ddaffbe + share_plus: 36537c04ce0c3e3f5bd297ce4318b6d5ee5fd6cf + shared_preferences_foundation: fcdcbc04712aee1108ac7fda236f363274528f78 + sqflite: 673a0e54cc04b7d6dba8d24fb8095b31c3a99eec + SQLCipher: 5e6bfb47323635c8b657b1b27d25c5f1baf63bf5 + sqlcipher_flutter_libs: db7047866b877c027b050bb808b5480c68955c5e + url_launcher_macos: c82c93949963e55b228a30115bd219499a6fe404 + video_compress: c896234f100791b5fef7f049afa38f6d2ef7b42f + video_player_avfoundation: 7c6c11d8470e1675df7397027218274b6d2360b3 + wakelock_plus: 4783562c9a43d209c458cb9b30692134af456269 + WebRTC-SDK: 79942c006ea64f6fb48d7da8a4786dfc820bc1db + window_to_front: 4cdc24ddd8461ad1a55fa06286d6a79d8b29e8d8 + +PODFILE CHECKSUM: d0975b16fbdecb73b109d8fbc88aa77ffe4c7a8d + +COCOAPODS: 1.16.2 diff --git a/macos/Runner.xcodeproj/project.pbxproj b/macos/Runner.xcodeproj/project.pbxproj new file mode 100644 index 0000000..41d360c --- /dev/null +++ b/macos/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,658 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXAggregateTarget section */ + 33CC111A2044C6BA0003C045 /* Flutter Assemble */ = { + isa = PBXAggregateTarget; + buildConfigurationList = 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */; + buildPhases = ( + 33CC111E2044C6BF0003C045 /* ShellScript */, + ); + dependencies = ( + ); + name = "Flutter Assemble"; + productName = FLX; + }; +/* End PBXAggregateTarget section */ + +/* Begin PBXBuildFile section */ + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; + 9CAF203E1D098383F2EDFFCB /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B3C62FEBAA272B5A33AFFC95 /* Pods_Runner.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 33CC10E52044A3C60003C045 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 33CC111A2044C6BA0003C045; + remoteInfo = FLX; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 33CC110E2044A8840003C045 /* Bundle Framework */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Bundle Framework"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 2D119A6B273B2CE4A6AE3322 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; + 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = ""; }; + 33CC10ED2044A3C60003C045 /* FluffyChat.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = FluffyChat.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = ""; }; + 33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; + 33CC10F72044A3C60003C045 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Runner/Info.plist; sourceTree = ""; }; + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainFlutterWindow.swift; sourceTree = ""; }; + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Debug.xcconfig"; sourceTree = ""; }; + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Release.xcconfig"; sourceTree = ""; }; + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "Flutter-Generated.xcconfig"; path = "ephemeral/Flutter-Generated.xcconfig"; sourceTree = ""; }; + 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; + 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; + 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; + 35E6B919318905352ECC7D69 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 5CDC3DD55F4AC23D2067B292 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; + A1CEA3AEDDC9976F00DB3AFE /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + AF767714B5564068E3D500A8 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + B3C62FEBAA272B5A33AFFC95 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + B5C1522B2F3865267414BD3C /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + CC70F3DF47EEC43FC2D35C75 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 33CC10EA2044A3C60003C045 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 9CAF203E1D098383F2EDFFCB /* Pods_Runner.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 33BA886A226E78AF003329D5 /* Configs */ = { + isa = PBXGroup; + children = ( + 33E5194F232828860026EE4D /* AppInfo.xcconfig */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 333000ED22D3DE5D00554162 /* Warnings.xcconfig */, + ); + path = Configs; + sourceTree = ""; + }; + 33CC10E42044A3C60003C045 = { + isa = PBXGroup; + children = ( + 33FAB671232836740065AC1E /* Runner */, + 33CEB47122A05771004F2AC0 /* Flutter */, + 33CC10EE2044A3C60003C045 /* Products */, + D73912EC22F37F3D000D13A0 /* Frameworks */, + F9F203356080D460FB6D4567 /* Pods */, + ); + sourceTree = ""; + }; + 33CC10EE2044A3C60003C045 /* Products */ = { + isa = PBXGroup; + children = ( + 33CC10ED2044A3C60003C045 /* FluffyChat.app */, + ); + name = Products; + sourceTree = ""; + }; + 33CC11242044D66E0003C045 /* Resources */ = { + isa = PBXGroup; + children = ( + 33CC10F22044A3C60003C045 /* Assets.xcassets */, + 33CC10F42044A3C60003C045 /* MainMenu.xib */, + 33CC10F72044A3C60003C045 /* Info.plist */, + ); + name = Resources; + path = ..; + sourceTree = ""; + }; + 33CEB47122A05771004F2AC0 /* Flutter */ = { + isa = PBXGroup; + children = ( + 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */, + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */, + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */, + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */, + ); + path = Flutter; + sourceTree = ""; + }; + 33FAB671232836740065AC1E /* Runner */ = { + isa = PBXGroup; + children = ( + 33CC10F02044A3C60003C045 /* AppDelegate.swift */, + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */, + 33E51913231747F40026EE4D /* DebugProfile.entitlements */, + 33E51914231749380026EE4D /* Release.entitlements */, + 33CC11242044D66E0003C045 /* Resources */, + 33BA886A226E78AF003329D5 /* Configs */, + ); + path = Runner; + sourceTree = ""; + }; + D73912EC22F37F3D000D13A0 /* Frameworks */ = { + isa = PBXGroup; + children = ( + B3C62FEBAA272B5A33AFFC95 /* Pods_Runner.framework */, + A1CEA3AEDDC9976F00DB3AFE /* Pods_RunnerTests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + F9F203356080D460FB6D4567 /* Pods */ = { + isa = PBXGroup; + children = ( + CC70F3DF47EEC43FC2D35C75 /* Pods-Runner.debug.xcconfig */, + B5C1522B2F3865267414BD3C /* Pods-Runner.release.xcconfig */, + AF767714B5564068E3D500A8 /* Pods-Runner.profile.xcconfig */, + 5CDC3DD55F4AC23D2067B292 /* Pods-RunnerTests.debug.xcconfig */, + 2D119A6B273B2CE4A6AE3322 /* Pods-RunnerTests.release.xcconfig */, + 35E6B919318905352ECC7D69 /* Pods-RunnerTests.profile.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 33CC10EC2044A3C60003C045 /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 213E973AEF6461D8FA01037B /* [CP] Check Pods Manifest.lock */, + 33CC10E92044A3C60003C045 /* Sources */, + 33CC10EA2044A3C60003C045 /* Frameworks */, + 33CC10EB2044A3C60003C045 /* Resources */, + 33CC110E2044A8840003C045 /* Bundle Framework */, + 3399D490228B24CF009A79C7 /* ShellScript */, + 889FA79FC2223BE511C611AF /* [CP] Embed Pods Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 33CC11202044C79F0003C045 /* PBXTargetDependency */, + ); + name = Runner; + productName = Runner; + productReference = 33CC10ED2044A3C60003C045 /* FluffyChat.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 33CC10E52044A3C60003C045 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0920; + LastUpgradeCheck = 1510; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 33CC10EC2044A3C60003C045 = { + CreatedOnToolsVersion = 9.2; + LastSwiftMigration = 1100; + ProvisioningStyle = Automatic; + SystemCapabilities = { + com.apple.Sandbox = { + enabled = 1; + }; + }; + }; + 33CC111A2044C6BA0003C045 = { + CreatedOnToolsVersion = 9.2; + ProvisioningStyle = Manual; + }; + }; + }; + buildConfigurationList = 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 33CC10E42044A3C60003C045; + productRefGroup = 33CC10EE2044A3C60003C045 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 33CC10EC2044A3C60003C045 /* Runner */, + 33CC111A2044C6BA0003C045 /* Flutter Assemble */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 33CC10EB2044A3C60003C045 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */, + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 213E973AEF6461D8FA01037B /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + 3399D490228B24CF009A79C7 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; + }; + 33CC111E2044C6BF0003C045 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + Flutter/ephemeral/FlutterInputs.xcfilelist, + ); + inputPaths = ( + Flutter/ephemeral/tripwire, + ); + outputFileListPaths = ( + Flutter/ephemeral/FlutterOutputs.xcfilelist, + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; + }; + 889FA79FC2223BE511C611AF /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 33CC10E92044A3C60003C045 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */, + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */, + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 33CC11202044C79F0003C045 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 33CC111A2044C6BA0003C045 /* Flutter Assemble */; + targetProxy = 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 33CC10F42044A3C60003C045 /* MainMenu.xib */ = { + isa = PBXVariantGroup; + children = ( + 33CC10F52044A3C60003C045 /* Base */, + ); + name = MainMenu.xib; + path = Runner; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 338D0CE9231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 12.2; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Profile; + }; + 338D0CEA231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + DEVELOPMENT_TEAM = 4NXF6Z997G; + INFOPLIST_FILE = Runner/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = FluffyChat; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.productivity"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = 12.2; + PRODUCT_COPYRIGHT = "Copyright © 2023 FluffyChat authors. All rights reserved."; + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + }; + name = Profile; + }; + 338D0CEB231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Manual; + PRODUCT_NAME = FluffyChat; + }; + name = Profile; + }; + 33CC10F92044A3C60003C045 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 12.2; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 33CC10FA2044A3C60003C045 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 12.2; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Release; + }; + 33CC10FC2044A3C60003C045 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + DEVELOPMENT_TEAM = 4NXF6Z997G; + INFOPLIST_FILE = Runner/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = FluffyChat; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.productivity"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = 12.2; + PRODUCT_COPYRIGHT = "Copyright © 2023 FluffyChat authors. All rights reserved."; + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + }; + name = Debug; + }; + 33CC10FD2044A3C60003C045 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements; + "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + DEVELOPMENT_TEAM = 4NXF6Z997G; + INFOPLIST_FILE = Runner/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = FluffyChat; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.productivity"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = 12.2; + PRODUCT_COPYRIGHT = "Copyright © 2023 FluffyChat authors. All rights reserved."; + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + }; + name = Release; + }; + 33CC111C2044C6BA0003C045 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Manual; + PRODUCT_NAME = FluffyChat; + }; + name = Debug; + }; + 33CC111D2044C6BA0003C045 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + PRODUCT_NAME = FluffyChat; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC10F92044A3C60003C045 /* Debug */, + 33CC10FA2044A3C60003C045 /* Release */, + 338D0CE9231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC10FC2044A3C60003C045 /* Debug */, + 33CC10FD2044A3C60003C045 /* Release */, + 338D0CEA231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC111C2044C6BA0003C045 /* Debug */, + 33CC111D2044C6BA0003C045 /* Release */, + 338D0CEB231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 33CC10E52044A3C60003C045 /* Project object */; +} diff --git a/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 0000000..1a20155 --- /dev/null +++ b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/macos/Runner.xcworkspace/contents.xcworkspacedata b/macos/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..21a3cc1 --- /dev/null +++ b/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/macos/Runner/AppDelegate.swift b/macos/Runner/AppDelegate.swift new file mode 100644 index 0000000..b3c1761 --- /dev/null +++ b/macos/Runner/AppDelegate.swift @@ -0,0 +1,13 @@ +import Cocoa +import FlutterMacOS + +@main +class AppDelegate: FlutterAppDelegate { + override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { + return true + } + + override func applicationSupportsSecureRestorableState(_ app: NSApplication) -> Bool { + return true + } +} diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/1024-mac.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/1024-mac.png new file mode 100644 index 0000000..7d0807b Binary files /dev/null and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/1024-mac.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/128-mac.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/128-mac.png new file mode 100644 index 0000000..86e89d9 Binary files /dev/null and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/128-mac.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/16-mac.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/16-mac.png new file mode 100644 index 0000000..77ef66d Binary files /dev/null and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/16-mac.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/256-mac.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/256-mac.png new file mode 100644 index 0000000..b1634c7 Binary files /dev/null and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/256-mac.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/32-mac.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/32-mac.png new file mode 100644 index 0000000..7b22bd4 Binary files /dev/null and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/32-mac.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/512-mac.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/512-mac.png new file mode 100644 index 0000000..c0a9729 Binary files /dev/null and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/512-mac.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/64-mac.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/64-mac.png new file mode 100644 index 0000000..ef2962a Binary files /dev/null and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/64-mac.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..eba1335 --- /dev/null +++ b/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1 @@ +{"images":[{"size":"1024x1024","filename":"1024-mac.png","expected-size":"1024","idiom":"ios-marketing","folder":"Assets.xcassets/AppIcon.appiconset/","scale":"1x"},{"size":"128x128","expected-size":"128","filename":"128-mac.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"256x256","expected-size":"256","filename":"256-mac.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"128x128","expected-size":"256","filename":"256-mac.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"},{"size":"256x256","expected-size":"512","filename":"512-mac.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"},{"size":"32x32","expected-size":"32","filename":"32-mac.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"512x512","expected-size":"512","filename":"512-mac.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"16x16","expected-size":"16","filename":"16-mac.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"16x16","expected-size":"32","filename":"32-mac.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"},{"size":"32x32","expected-size":"64","filename":"64-mac.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"},{"size":"512x512","expected-size":"1024","filename":"1024-mac.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"}]} \ No newline at end of file diff --git a/macos/Runner/Base.lproj/MainMenu.xib b/macos/Runner/Base.lproj/MainMenu.xib new file mode 100644 index 0000000..80e867a --- /dev/null +++ b/macos/Runner/Base.lproj/MainMenu.xib @@ -0,0 +1,343 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/macos/Runner/Configs/AppInfo.xcconfig b/macos/Runner/Configs/AppInfo.xcconfig new file mode 100644 index 0000000..11b3701 --- /dev/null +++ b/macos/Runner/Configs/AppInfo.xcconfig @@ -0,0 +1,14 @@ +// Application-level settings for the Runner target. +// +// This may be replaced with something auto-generated from metadata (e.g., pubspec.yaml) in the +// future. If not, the values below would default to using the project name when this becomes a +// 'flutter create' template. + +// The application's name. By default this is also the title of the Flutter window. +PRODUCT_NAME = FluffyChat + +// The application's bundle identifier +PRODUCT_BUNDLE_IDENTIFIER = im.fluffychat.fluffychat + +// The copyright displayed in application information +PRODUCT_COPYRIGHT = Copyright © 2023 FluffyChat authors. All rights reserved. diff --git a/macos/Runner/Configs/Debug.xcconfig b/macos/Runner/Configs/Debug.xcconfig new file mode 100644 index 0000000..36b0fd9 --- /dev/null +++ b/macos/Runner/Configs/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Debug.xcconfig" +#include "Warnings.xcconfig" diff --git a/macos/Runner/Configs/Release.xcconfig b/macos/Runner/Configs/Release.xcconfig new file mode 100644 index 0000000..dff4f49 --- /dev/null +++ b/macos/Runner/Configs/Release.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Release.xcconfig" +#include "Warnings.xcconfig" diff --git a/macos/Runner/Configs/Warnings.xcconfig b/macos/Runner/Configs/Warnings.xcconfig new file mode 100644 index 0000000..42bcbf4 --- /dev/null +++ b/macos/Runner/Configs/Warnings.xcconfig @@ -0,0 +1,13 @@ +WARNING_CFLAGS = -Wall -Wconditional-uninitialized -Wnullable-to-nonnull-conversion -Wmissing-method-return-type -Woverlength-strings +GCC_WARN_UNDECLARED_SELECTOR = YES +CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES +CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE +CLANG_WARN__DUPLICATE_METHOD_MATCH = YES +CLANG_WARN_PRAGMA_PACK = YES +CLANG_WARN_STRICT_PROTOTYPES = YES +CLANG_WARN_COMMA = YES +GCC_WARN_STRICT_SELECTOR_MATCH = YES +CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES +CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES +GCC_WARN_SHADOW = YES +CLANG_WARN_UNREACHABLE_CODE = YES diff --git a/macos/Runner/DebugProfile.entitlements b/macos/Runner/DebugProfile.entitlements new file mode 100644 index 0000000..a964b6b --- /dev/null +++ b/macos/Runner/DebugProfile.entitlements @@ -0,0 +1,26 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.assets.pictures.read-only + + com.apple.security.cs.allow-jit + + com.apple.security.device.audio-input + + com.apple.security.device.camera + + com.apple.security.files.user-selected.read-write + + com.apple.security.network.client + + com.apple.security.network.server + + com.apple.security.personal-information.location + + keychain-access-groups + + + diff --git a/macos/Runner/Info.plist b/macos/Runner/Info.plist new file mode 100644 index 0000000..4789daa --- /dev/null +++ b/macos/Runner/Info.plist @@ -0,0 +1,32 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIconFile + + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSMinimumSystemVersion + $(MACOSX_DEPLOYMENT_TARGET) + NSHumanReadableCopyright + $(PRODUCT_COPYRIGHT) + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + + diff --git a/macos/Runner/MainFlutterWindow.swift b/macos/Runner/MainFlutterWindow.swift new file mode 100644 index 0000000..3cc05eb --- /dev/null +++ b/macos/Runner/MainFlutterWindow.swift @@ -0,0 +1,15 @@ +import Cocoa +import FlutterMacOS + +class MainFlutterWindow: NSWindow { + override func awakeFromNib() { + let flutterViewController = FlutterViewController() + let windowFrame = self.frame + self.contentViewController = flutterViewController + self.setFrame(windowFrame, display: true) + + RegisterGeneratedPlugins(registry: flutterViewController) + + super.awakeFromNib() + } +} diff --git a/macos/Runner/Release.entitlements b/macos/Runner/Release.entitlements new file mode 100644 index 0000000..cfeb4e7 --- /dev/null +++ b/macos/Runner/Release.entitlements @@ -0,0 +1,22 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.assets.pictures.read-only + + com.apple.security.device.audio-input + + com.apple.security.device.camera + + com.apple.security.files.user-selected.read-write + + com.apple.security.network.client + + com.apple.security.personal-information.location + + keychain-access-groups + + + diff --git a/pubspec.lock b/pubspec.lock new file mode 100644 index 0000000..dae4dce --- /dev/null +++ b/pubspec.lock @@ -0,0 +1,2320 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + _fe_analyzer_shared: + dependency: transitive + description: + name: _fe_analyzer_shared + sha256: "0b2f2bd91ba804e53a61d757b986f89f1f9eaed5b11e4b2f5a2468d86d6c9fc7" + url: "https://pub.dev" + source: hosted + version: "67.0.0" + analyzer: + dependency: transitive + description: + name: analyzer + sha256: "37577842a27e4338429a1cbc32679d508836510b056f1eedf0c8d20e39c1383d" + url: "https://pub.dev" + source: hosted + version: "6.4.1" + animations: + dependency: "direct main" + description: + name: animations + sha256: d3d6dcfb218225bbe68e87ccf6378bbb2e32a94900722c5f81611dad089911cb + url: "https://pub.dev" + source: hosted + version: "2.0.11" + ansicolor: + dependency: transitive + description: + name: ansicolor + sha256: "50e982d500bc863e1d703448afdbf9e5a72eb48840a4f766fa361ffd6877055f" + url: "https://pub.dev" + source: hosted + version: "2.0.3" + app_links: + dependency: "direct main" + description: + name: app_links + sha256: "85ed8fc1d25a76475914fff28cc994653bd900bc2c26e4b57a49e097febb54ba" + url: "https://pub.dev" + source: hosted + version: "6.4.0" + app_links_linux: + dependency: transitive + description: + name: app_links_linux + sha256: f5f7173a78609f3dfd4c2ff2c95bd559ab43c80a87dc6a095921d96c05688c81 + url: "https://pub.dev" + source: hosted + version: "1.0.3" + app_links_platform_interface: + dependency: transitive + description: + name: app_links_platform_interface + sha256: "05f5379577c513b534a29ddea68176a4d4802c46180ee8e2e966257158772a3f" + url: "https://pub.dev" + source: hosted + version: "2.0.2" + app_links_web: + dependency: transitive + description: + name: app_links_web + sha256: af060ed76183f9e2b87510a9480e56a5352b6c249778d07bd2c95fc35632a555 + url: "https://pub.dev" + source: hosted + version: "1.0.4" + archive: + dependency: "direct main" + description: + name: archive + sha256: cb6a278ef2dbb298455e1a713bda08524a175630ec643a242c399c932a0a1f7d + url: "https://pub.dev" + source: hosted + version: "3.6.1" + args: + dependency: transitive + description: + name: args + sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 + url: "https://pub.dev" + source: hosted + version: "2.7.0" + async: + dependency: "direct main" + description: + name: async + sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb" + url: "https://pub.dev" + source: hosted + version: "2.13.0" + audio_session: + dependency: transitive + description: + name: audio_session + sha256: "2b7fff16a552486d078bfc09a8cde19f426dc6d6329262b684182597bec5b1ac" + url: "https://pub.dev" + source: hosted + version: "0.1.25" + badges: + dependency: "direct main" + description: + name: badges + sha256: a7b6bbd60dce418df0db3058b53f9d083c22cdb5132a052145dc267494df0b84 + url: "https://pub.dev" + source: hosted + version: "3.1.2" + barbecue: + dependency: transitive + description: + name: barbecue + sha256: e3a0afaf9005e466887d6c87411a2ddd8d72fc46db3caabf278ee600f1e2f92c + url: "https://pub.dev" + source: hosted + version: "0.4.0" + base58check: + dependency: transitive + description: + name: base58check + sha256: "6c300dfc33e598d2fe26319e13f6243fea81eaf8204cb4c6b69ef20a625319a5" + url: "https://pub.dev" + source: hosted + version: "2.0.0" + blurhash_dart: + dependency: "direct main" + description: + name: blurhash_dart + sha256: "43955b6c2e30a7d440028d1af0fa185852f3534b795cc6eb81fbf397b464409f" + url: "https://pub.dev" + source: hosted + version: "1.2.1" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + canonical_json: + dependency: transitive + description: + name: canonical_json + sha256: d6be1dd66b420c6ac9f42e3693e09edf4ff6edfee26cb4c28c1c019fdb8c0c15 + url: "https://pub.dev" + source: hosted + version: "1.1.2" + characters: + dependency: transitive + description: + name: characters + sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 + url: "https://pub.dev" + source: hosted + version: "1.4.0" + charcode: + dependency: transitive + description: + name: charcode + sha256: fb0f1107cac15a5ea6ef0a6ef71a807b9e4267c713bb93e00e92d737cc8dbd8a + url: "https://pub.dev" + source: hosted + version: "1.4.0" + checked_yaml: + dependency: transitive + description: + name: checked_yaml + sha256: "959525d3162f249993882720d52b7e0c833978df229be20702b33d48d91de70f" + url: "https://pub.dev" + source: hosted + version: "2.0.4" + chewie: + dependency: "direct main" + description: + name: chewie + sha256: "4d9554a8f87cc2dc6575dfd5ad20a4375015a29edd567fd6733febe6365e2566" + url: "https://pub.dev" + source: hosted + version: "1.11.3" + cli_config: + dependency: transitive + description: + name: cli_config + sha256: ac20a183a07002b700f0c25e61b7ee46b23c309d76ab7b7640a028f18e4d99ec + url: "https://pub.dev" + source: hosted + version: "0.2.0" + cli_util: + dependency: transitive + description: + name: cli_util + sha256: ff6785f7e9e3c38ac98b2fb035701789de90154024a75b6cb926445e83197d1c + url: "https://pub.dev" + source: hosted + version: "0.4.2" + clock: + dependency: transitive + description: + name: clock + sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b + url: "https://pub.dev" + source: hosted + version: "1.1.2" + collection: + dependency: "direct main" + description: + name: collection + sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" + url: "https://pub.dev" + source: hosted + version: "1.19.1" + colorize: + dependency: transitive + description: + name: colorize + sha256: "584746cd6ba1cba0633b6720f494fe6f9601c4170f0666c1579d2aa2a61071ba" + url: "https://pub.dev" + source: hosted + version: "3.0.0" + console: + dependency: transitive + description: + name: console + sha256: e04e7824384c5b39389acdd6dc7d33f3efe6b232f6f16d7626f194f6a01ad69a + url: "https://pub.dev" + source: hosted + version: "4.1.0" + convert: + dependency: transitive + description: + name: convert + sha256: b30acd5944035672bc15c6b7a8b47d773e41e2f17de064350988c5d02adb1c68 + url: "https://pub.dev" + source: hosted + version: "3.1.2" + coverage: + dependency: transitive + description: + name: coverage + sha256: aa07dbe5f2294c827b7edb9a87bba44a9c15a3cc81bc8da2ca19b37322d30080 + url: "https://pub.dev" + source: hosted + version: "1.14.1" + cross_file: + dependency: "direct main" + description: + name: cross_file + sha256: "7caf6a750a0c04effbb52a676dce9a4a592e10ad35c34d6d2d0e4811160d5670" + url: "https://pub.dev" + source: hosted + version: "0.3.4+2" + crypto: + dependency: transitive + description: + name: crypto + sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855" + url: "https://pub.dev" + source: hosted + version: "3.0.6" + csslib: + dependency: transitive + description: + name: csslib + sha256: "09bad715f418841f976c77db72d5398dc1253c21fb9c0c7f0b0b985860b2d58e" + url: "https://pub.dev" + source: hosted + version: "1.0.2" + cupertino_icons: + dependency: "direct main" + description: + name: cupertino_icons + sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6 + url: "https://pub.dev" + source: hosted + version: "1.0.8" + dart_webrtc: + dependency: transitive + description: + name: dart_webrtc + sha256: "5b76fd85ac95d6f5dee3e7d7de8d4b51bfbec1dc73804647c6aebb52d6297116" + url: "https://pub.dev" + source: hosted + version: "1.5.3+hotfix.2" + dbus: + dependency: transitive + description: + name: dbus + sha256: "79e0c23480ff85dc68de79e2cd6334add97e48f7f4865d17686dd6ea81a47e8c" + url: "https://pub.dev" + source: hosted + version: "0.7.11" + desktop_drop: + dependency: "direct main" + description: + name: desktop_drop + sha256: d55a010fe46c8e8fcff4ea4b451a9ff84a162217bdb3b2a0aa1479776205e15d + url: "https://pub.dev" + source: hosted + version: "0.4.4" + desktop_notifications: + dependency: "direct main" + description: + name: desktop_notifications + sha256: "6d92694ad6e9297a862c5ff7dd6b8ff64c819972557754769f819d2209612927" + url: "https://pub.dev" + source: hosted + version: "0.6.3" + device_info_plus: + dependency: "direct main" + description: + name: device_info_plus + sha256: a7fd703482b391a87d60b6061d04dfdeab07826b96f9abd8f5ed98068acc0074 + url: "https://pub.dev" + source: hosted + version: "10.1.2" + device_info_plus_platform_interface: + dependency: transitive + description: + name: device_info_plus_platform_interface + sha256: "0b04e02b30791224b31969eb1b50d723498f402971bff3630bca2ba839bd1ed2" + url: "https://pub.dev" + source: hosted + version: "7.0.2" + dynamic_color: + dependency: "direct main" + description: + name: dynamic_color + sha256: eae98052fa6e2826bdac3dd2e921c6ce2903be15c6b7f8b6d8a5d49b5086298d + url: "https://pub.dev" + source: hosted + version: "1.7.0" + emoji_picker_flutter: + dependency: "direct main" + description: + name: emoji_picker_flutter + sha256: "08567e6f914d36c32091a96cf2f51d2558c47aa2bd47a590dc4f50e42e0965f6" + url: "https://pub.dev" + source: hosted + version: "3.1.0" + emojis: + dependency: "direct main" + description: + name: emojis + sha256: "2e4d847c3f1e2670f30dc355909ce6fa7808b4e626c34a4dd503a360995a38bf" + url: "https://pub.dev" + source: hosted + version: "0.9.9" + enhanced_enum: + dependency: transitive + description: + name: enhanced_enum + sha256: "074c5a8b9664799ca91e1e8b68003b8694cb19998671cbafd9c7779c13fcdecf" + url: "https://pub.dev" + source: hosted + version: "0.2.4" + fake_async: + dependency: transitive + description: + name: fake_async + sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" + url: "https://pub.dev" + source: hosted + version: "1.3.3" + ffi: + dependency: transitive + description: + name: ffi + sha256: "289279317b4b16eb2bb7e271abccd4bf84ec9bdcbe999e278a94b804f5630418" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + file: + dependency: transitive + description: + name: file + sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 + url: "https://pub.dev" + source: hosted + version: "7.0.1" + file_picker: + dependency: "direct main" + description: + name: file_picker + sha256: ab13ae8ef5580a411c458d6207b6774a6c237d77ac37011b13994879f68a8810 + url: "https://pub.dev" + source: hosted + version: "8.3.7" + file_selector: + dependency: "direct main" + description: + name: file_selector + sha256: "5019692b593455127794d5718304ff1ae15447dea286cdda9f0db2a796a1b828" + url: "https://pub.dev" + source: hosted + version: "1.0.3" + file_selector_android: + dependency: transitive + description: + name: file_selector_android + sha256: "6bba3d590ee9462758879741abc132a19133600dd31832f55627442f1ebd7b54" + url: "https://pub.dev" + source: hosted + version: "0.5.1+14" + file_selector_ios: + dependency: transitive + description: + name: file_selector_ios + sha256: "94b98ad950b8d40d96fee8fa88640c2e4bd8afcdd4817993bd04e20310f45420" + url: "https://pub.dev" + source: hosted + version: "0.5.3+1" + file_selector_linux: + dependency: transitive + description: + name: file_selector_linux + sha256: "54cbbd957e1156d29548c7d9b9ec0c0ebb6de0a90452198683a7d23aed617a33" + url: "https://pub.dev" + source: hosted + version: "0.9.3+2" + file_selector_macos: + dependency: transitive + description: + name: file_selector_macos + sha256: "8c9250b2bd2d8d4268e39c82543bacbaca0fda7d29e0728c3c4bbb7c820fd711" + url: "https://pub.dev" + source: hosted + version: "0.9.4+3" + file_selector_platform_interface: + dependency: transitive + description: + name: file_selector_platform_interface + sha256: a3994c26f10378a039faa11de174d7b78eb8f79e4dd0af2a451410c1a5c3f66b + url: "https://pub.dev" + source: hosted + version: "2.6.2" + file_selector_web: + dependency: transitive + description: + name: file_selector_web + sha256: c4c0ea4224d97a60a7067eca0c8fd419e708ff830e0c83b11a48faf566cec3e7 + url: "https://pub.dev" + source: hosted + version: "0.9.4+2" + file_selector_windows: + dependency: transitive + description: + name: file_selector_windows + sha256: "320fcfb6f33caa90f0b58380489fc5ac05d99ee94b61aa96ec2bff0ba81d3c2b" + url: "https://pub.dev" + source: hosted + version: "0.9.3+4" + fixnum: + dependency: transitive + description: + name: fixnum + sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be + url: "https://pub.dev" + source: hosted + version: "1.1.1" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_cache_manager: + dependency: "direct main" + description: + name: flutter_cache_manager + sha256: "400b6592f16a4409a7f2bb929a9a7e38c72cceb8ffb99ee57bbf2cb2cecf8386" + url: "https://pub.dev" + source: hosted + version: "3.4.1" + flutter_driver: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + flutter_foreground_task: + dependency: "direct main" + description: + name: flutter_foreground_task + sha256: "6cf10a27f5e344cd2ecad0752d3a5f4ec32846d82fda8753b3fe2480ebb832a3" + url: "https://pub.dev" + source: hosted + version: "6.5.0" + flutter_highlighter: + dependency: "direct main" + description: + name: flutter_highlighter + sha256: "93173afd47a9ada53f3176371755e7ea4a1065362763976d06d6adfb4d946e10" + url: "https://pub.dev" + source: hosted + version: "0.1.1" + flutter_keyboard_visibility: + dependency: transitive + description: + name: flutter_keyboard_visibility + sha256: "98664be7be0e3ffca00de50f7f6a287ab62c763fc8c762e0a21584584a3ff4f8" + url: "https://pub.dev" + source: hosted + version: "6.0.0" + flutter_keyboard_visibility_linux: + dependency: transitive + description: + name: flutter_keyboard_visibility_linux + sha256: "6fba7cd9bb033b6ddd8c2beb4c99ad02d728f1e6e6d9b9446667398b2ac39f08" + url: "https://pub.dev" + source: hosted + version: "1.0.0" + flutter_keyboard_visibility_macos: + dependency: transitive + description: + name: flutter_keyboard_visibility_macos + sha256: c5c49b16fff453dfdafdc16f26bdd8fb8d55812a1d50b0ce25fc8d9f2e53d086 + url: "https://pub.dev" + source: hosted + version: "1.0.0" + flutter_keyboard_visibility_platform_interface: + dependency: transitive + description: + name: flutter_keyboard_visibility_platform_interface + sha256: e43a89845873f7be10cb3884345ceb9aebf00a659f479d1c8f4293fcb37022a4 + url: "https://pub.dev" + source: hosted + version: "2.0.0" + flutter_keyboard_visibility_web: + dependency: transitive + description: + name: flutter_keyboard_visibility_web + sha256: d3771a2e752880c79203f8d80658401d0c998e4183edca05a149f5098ce6e3d1 + url: "https://pub.dev" + source: hosted + version: "2.0.0" + flutter_keyboard_visibility_windows: + dependency: transitive + description: + name: flutter_keyboard_visibility_windows + sha256: fc4b0f0b6be9b93ae527f3d527fb56ee2d918cd88bbca438c478af7bcfd0ef73 + url: "https://pub.dev" + source: hosted + version: "1.0.0" + flutter_linkify: + dependency: "direct main" + description: + name: flutter_linkify + sha256: "74669e06a8f358fee4512b4320c0b80e51cffc496607931de68d28f099254073" + url: "https://pub.dev" + source: hosted + version: "6.0.0" + flutter_lints: + dependency: "direct dev" + description: + name: flutter_lints + sha256: "9e8c3858111da373efc5aa341de011d9bd23e2c5c5e0c62bccf32438e192d7b1" + url: "https://pub.dev" + source: hosted + version: "3.0.2" + flutter_local_notifications: + dependency: "direct main" + description: + name: flutter_local_notifications + sha256: "674173fd3c9eda9d4c8528da2ce0ea69f161577495a9cc835a2a4ecd7eadeb35" + url: "https://pub.dev" + source: hosted + version: "17.2.4" + flutter_local_notifications_linux: + dependency: transitive + description: + name: flutter_local_notifications_linux + sha256: c49bd06165cad9beeb79090b18cd1eb0296f4bf4b23b84426e37dd7c027fc3af + url: "https://pub.dev" + source: hosted + version: "4.0.1" + flutter_local_notifications_platform_interface: + dependency: transitive + description: + name: flutter_local_notifications_platform_interface + sha256: "85f8d07fe708c1bdcf45037f2c0109753b26ae077e9d9e899d55971711a4ea66" + url: "https://pub.dev" + source: hosted + version: "7.2.0" + flutter_localizations: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_map: + dependency: "direct main" + description: + name: flutter_map + sha256: "87cc8349b8fa5dccda5af50018c7374b6645334a0d680931c1fe11bce88fa5bb" + url: "https://pub.dev" + source: hosted + version: "6.2.1" + flutter_native_splash: + dependency: "direct dev" + description: + name: flutter_native_splash + sha256: "7062602e0dbd29141fb8eb19220b5871ca650be5197ab9c1f193a28b17537bc7" + url: "https://pub.dev" + source: hosted + version: "2.4.4" + flutter_new_badger: + dependency: "direct main" + description: + name: flutter_new_badger + sha256: d3742ace8009663db1ac6ba0377b092f479c35deb33e05514ba05cc0b0a5aaaa + url: "https://pub.dev" + source: hosted + version: "1.1.1" + flutter_olm: + dependency: "direct main" + description: + name: flutter_olm + sha256: "5e6211af8cba1abf7d1f92e543f6d573dfe6017fe4742e0d04ba84beab47f940" + url: "https://pub.dev" + source: hosted + version: "2.0.0" + flutter_openssl_crypto: + dependency: "direct main" + description: + name: flutter_openssl_crypto + sha256: "293b4fcda13ab0710645a16e82f3d5b7de19bfc0ab2d06bcdb87637222eda5e1" + url: "https://pub.dev" + source: hosted + version: "0.5.0" + flutter_plugin_android_lifecycle: + dependency: transitive + description: + name: flutter_plugin_android_lifecycle + sha256: f948e346c12f8d5480d2825e03de228d0eb8c3a737e4cdaa122267b89c022b5e + url: "https://pub.dev" + source: hosted + version: "2.0.28" + flutter_secure_storage: + dependency: "direct main" + description: + name: flutter_secure_storage + sha256: "9cad52d75ebc511adfae3d447d5d13da15a55a92c9410e50f67335b6d21d16ea" + url: "https://pub.dev" + source: hosted + version: "9.2.4" + flutter_secure_storage_linux: + dependency: transitive + description: + name: flutter_secure_storage_linux + sha256: be76c1d24a97d0b98f8b54bce6b481a380a6590df992d0098f868ad54dc8f688 + url: "https://pub.dev" + source: hosted + version: "1.2.3" + flutter_secure_storage_macos: + dependency: transitive + description: + name: flutter_secure_storage_macos + sha256: "6c0a2795a2d1de26ae202a0d78527d163f4acbb11cde4c75c670f3a0fc064247" + url: "https://pub.dev" + source: hosted + version: "3.1.3" + flutter_secure_storage_platform_interface: + dependency: transitive + description: + name: flutter_secure_storage_platform_interface + sha256: cf91ad32ce5adef6fba4d736a542baca9daf3beac4db2d04be350b87f69ac4a8 + url: "https://pub.dev" + source: hosted + version: "1.1.2" + flutter_secure_storage_web: + dependency: transitive + description: + name: flutter_secure_storage_web + sha256: f4ebff989b4f07b2656fb16b47852c0aab9fed9b4ec1c70103368337bc1886a9 + url: "https://pub.dev" + source: hosted + version: "1.2.1" + flutter_secure_storage_windows: + dependency: transitive + description: + name: flutter_secure_storage_windows + sha256: b20b07cb5ed4ed74fc567b78a72936203f587eba460af1df11281c9326cd3709 + url: "https://pub.dev" + source: hosted + version: "3.1.2" + flutter_shortcuts_new: + dependency: "direct main" + description: + name: flutter_shortcuts_new + sha256: "16ee1c8a9bc9586b5117ebb774a8ff6b396f856743e97251eb483c4dc5769d7f" + url: "https://pub.dev" + source: hosted + version: "2.0.0" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + flutter_typeahead: + dependency: "direct main" + description: + path: "." + ref: main + resolved-ref: "3e209e67aa6e780cba61ced06cf49d2babbbcaa4" + url: "https://github.com/famedly/flutter_typeahead.git" + source: git + version: "5.2.0" + flutter_web_auth_2: + dependency: "direct main" + description: + path: flutter_web_auth_2 + ref: "3.x-without-v1" + resolved-ref: "48682f19576001e50104a602d891343850adb67f" + url: "https://github.com/ThexXTURBOXx/flutter_web_auth_2.git" + source: git + version: "3.1.2-without-v1" + flutter_web_auth_2_platform_interface: + dependency: transitive + description: + name: flutter_web_auth_2_platform_interface + sha256: e8669e262005a8354389ba2971f0fc1c36188481234ff50d013aaf993f30f739 + url: "https://pub.dev" + source: hosted + version: "3.1.0" + flutter_web_plugins: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + flutter_webrtc: + dependency: "direct main" + description: + name: flutter_webrtc + sha256: b832dc76c0d1577f14aaf35e9c38d4ed7667cbc89c492b7bf4505d8d5f62e08b + url: "https://pub.dev" + source: hosted + version: "0.12.12+hotfix.1" + frontend_server_client: + dependency: transitive + description: + name: frontend_server_client + sha256: f64a0333a82f30b0cca061bc3d143813a486dc086b574bfb233b7c1372427694 + url: "https://pub.dev" + source: hosted + version: "4.0.0" + fuchsia_remote_debug_protocol: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + geolocator: + dependency: "direct main" + description: + name: geolocator + sha256: f62bcd90459e63210bbf9c35deb6a51c521f992a78de19a1fe5c11704f9530e2 + url: "https://pub.dev" + source: hosted + version: "13.0.4" + geolocator_android: + dependency: transitive + description: + name: geolocator_android + sha256: fcb1760a50d7500deca37c9a666785c047139b5f9ee15aa5469fae7dbbe3170d + url: "https://pub.dev" + source: hosted + version: "4.6.2" + geolocator_apple: + dependency: transitive + description: + name: geolocator_apple + sha256: dbdd8789d5aaf14cf69f74d4925ad1336b4433a6efdf2fce91e8955dc921bf22 + url: "https://pub.dev" + source: hosted + version: "2.3.13" + geolocator_platform_interface: + dependency: transitive + description: + name: geolocator_platform_interface + sha256: "30cb64f0b9adcc0fb36f628b4ebf4f731a2961a0ebd849f4b56200205056fe67" + url: "https://pub.dev" + source: hosted + version: "4.2.6" + geolocator_web: + dependency: transitive + description: + name: geolocator_web + sha256: b1ae9bdfd90f861fde8fd4f209c37b953d65e92823cb73c7dee1fa021b06f172 + url: "https://pub.dev" + source: hosted + version: "4.1.3" + geolocator_windows: + dependency: transitive + description: + name: geolocator_windows + sha256: "175435404d20278ffd220de83c2ca293b73db95eafbdc8131fe8609be1421eb6" + url: "https://pub.dev" + source: hosted + version: "0.2.5" + get_it: + dependency: transitive + description: + name: get_it + sha256: d85128a5dae4ea777324730dc65edd9c9f43155c109d5cc0a69cab74139fbac1 + url: "https://pub.dev" + source: hosted + version: "7.7.0" + glob: + dependency: transitive + description: + name: glob + sha256: c3f1ee72c96f8f78935e18aa8cecced9ab132419e8625dc187e1c2408efc20de + url: "https://pub.dev" + source: hosted + version: "2.1.3" + go_router: + dependency: "direct main" + description: + name: go_router + sha256: f02fd7d2a4dc512fec615529824fdd217fecb3a3d3de68360293a551f21634b3 + url: "https://pub.dev" + source: hosted + version: "14.8.1" + gtk: + dependency: transitive + description: + name: gtk + sha256: e8ce9ca4b1df106e4d72dad201d345ea1a036cc12c360f1a7d5a758f78ffa42c + url: "https://pub.dev" + source: hosted + version: "2.1.0" + handy_window: + dependency: "direct main" + description: + name: handy_window + sha256: "56b813e58a68b0ee2ab22051400b8b1f1b5cfe88b8cd32288623defb3926245a" + url: "https://pub.dev" + source: hosted + version: "0.4.0" + highlighter: + dependency: transitive + description: + name: highlighter + sha256: "92180c72b9da8758e1acf39a45aa305a97dcfe2fdc8f3d1d2947c23f2772bfbc" + url: "https://pub.dev" + source: hosted + version: "0.1.1" + hive: + dependency: "direct main" + description: + name: hive + sha256: "8dcf6db979d7933da8217edcec84e9df1bdb4e4edc7fc77dbd5aa74356d6d941" + url: "https://pub.dev" + source: hosted + version: "2.2.3" + hive_flutter: + dependency: "direct main" + description: + name: hive_flutter + sha256: dca1da446b1d808a51689fb5d0c6c9510c0a2ba01e22805d492c73b68e33eecc + url: "https://pub.dev" + source: hosted + version: "1.1.0" + html: + dependency: "direct main" + description: + name: html + sha256: "6d1264f2dffa1b1101c25a91dff0dc2daee4c18e87cd8538729773c073dbf602" + url: "https://pub.dev" + source: hosted + version: "0.15.6" + html_unescape: + dependency: transitive + description: + name: html_unescape + sha256: "15362d7a18f19d7b742ef8dcb811f5fd2a2df98db9f80ea393c075189e0b61e3" + url: "https://pub.dev" + source: hosted + version: "2.0.0" + http: + dependency: "direct main" + description: + name: http + sha256: "2c11f3f94c687ee9bad77c171151672986360b2b001d109814ee7140b2cf261b" + url: "https://pub.dev" + source: hosted + version: "1.4.0" + http_multi_server: + dependency: transitive + description: + name: http_multi_server + sha256: aa6199f908078bb1c5efb8d8638d4ae191aac11b311132c3ef48ce352fb52ef8 + url: "https://pub.dev" + source: hosted + version: "3.2.2" + http_parser: + dependency: transitive + description: + name: http_parser + sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" + url: "https://pub.dev" + source: hosted + version: "4.1.2" + image: + dependency: "direct main" + description: + name: image + sha256: f31d52537dc417fdcde36088fdf11d191026fd5e4fae742491ebd40e5a8bea7d + url: "https://pub.dev" + source: hosted + version: "4.3.0" + image_picker: + dependency: "direct main" + description: + name: image_picker + sha256: "021834d9c0c3de46bf0fe40341fa07168407f694d9b2bb18d532dc1261867f7a" + url: "https://pub.dev" + source: hosted + version: "1.1.2" + image_picker_android: + dependency: transitive + description: + name: image_picker_android + sha256: "317a5d961cec5b34e777b9252393f2afbd23084aa6e60fcf601dcf6341b9ebeb" + url: "https://pub.dev" + source: hosted + version: "0.8.12+23" + image_picker_for_web: + dependency: transitive + description: + name: image_picker_for_web + sha256: "717eb042ab08c40767684327be06a5d8dbb341fe791d514e4b92c7bbe1b7bb83" + url: "https://pub.dev" + source: hosted + version: "3.0.6" + image_picker_ios: + dependency: transitive + description: + name: image_picker_ios + sha256: "05da758e67bc7839e886b3959848aa6b44ff123ab4b28f67891008afe8ef9100" + url: "https://pub.dev" + source: hosted + version: "0.8.12+2" + image_picker_linux: + dependency: transitive + description: + name: image_picker_linux + sha256: "34a65f6740df08bbbeb0a1abd8e6d32107941fd4868f67a507b25601651022c9" + url: "https://pub.dev" + source: hosted + version: "0.2.1+2" + image_picker_macos: + dependency: transitive + description: + name: image_picker_macos + sha256: "1b90ebbd9dcf98fb6c1d01427e49a55bd96b5d67b8c67cf955d60a5de74207c1" + url: "https://pub.dev" + source: hosted + version: "0.2.1+2" + image_picker_platform_interface: + dependency: transitive + description: + name: image_picker_platform_interface + sha256: "886d57f0be73c4b140004e78b9f28a8914a09e50c2d816bdd0520051a71236a0" + url: "https://pub.dev" + source: hosted + version: "2.10.1" + image_picker_windows: + dependency: transitive + description: + name: image_picker_windows + sha256: "6ad07afc4eb1bc25f3a01084d28520496c4a3bb0cb13685435838167c9dcedeb" + url: "https://pub.dev" + source: hosted + version: "0.2.1+1" + import_sorter: + dependency: "direct dev" + description: + name: import_sorter + sha256: eb15738ccead84e62c31e0208ea4e3104415efcd4972b86906ca64a1187d0836 + url: "https://pub.dev" + source: hosted + version: "4.6.0" + integration_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + intl: + dependency: "direct main" + description: + name: intl + sha256: "3df61194eb431efc39c4ceba583b95633a403f46c9fd341e550ce0bfa50e9aa5" + url: "https://pub.dev" + source: hosted + version: "0.20.2" + io: + dependency: transitive + description: + name: io + sha256: dfd5a80599cf0165756e3181807ed3e77daf6dd4137caaad72d0b7931597650b + url: "https://pub.dev" + source: hosted + version: "1.0.5" + js: + dependency: transitive + description: + name: js + sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 + url: "https://pub.dev" + source: hosted + version: "0.6.7" + json_annotation: + dependency: transitive + description: + name: json_annotation + sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" + url: "https://pub.dev" + source: hosted + version: "4.9.0" + just_audio: + dependency: "direct main" + description: + name: just_audio + sha256: f978d5b4ccea08f267dae0232ec5405c1b05d3f3cd63f82097ea46c015d5c09e + url: "https://pub.dev" + source: hosted + version: "0.9.46" + just_audio_platform_interface: + dependency: transitive + description: + name: just_audio_platform_interface + sha256: "4cd94536af0219fa306205a58e78d67e02b0555283c1c094ee41e402a14a5c4a" + url: "https://pub.dev" + source: hosted + version: "4.5.0" + just_audio_web: + dependency: transitive + description: + name: just_audio_web + sha256: "6ba8a2a7e87d57d32f0f7b42856ade3d6a9fbe0f1a11fabae0a4f00bb73f0663" + url: "https://pub.dev" + source: hosted + version: "0.4.16" + latlong2: + dependency: "direct main" + description: + name: latlong2 + sha256: "98227922caf49e6056f91b6c56945ea1c7b166f28ffcd5fb8e72fc0b453cc8fe" + url: "https://pub.dev" + source: hosted + version: "0.9.1" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "6bb818ecbdffe216e81182c2f0714a2e62b593f4a4f13098713ff1685dfb6ab0" + url: "https://pub.dev" + source: hosted + version: "10.0.9" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573 + url: "https://pub.dev" + source: hosted + version: "3.0.9" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" + url: "https://pub.dev" + source: hosted + version: "3.0.1" + license_checker: + dependency: "direct dev" + description: + name: license_checker + sha256: eea27638e42bc98fd91a6a8187eb57e5617e2c3c8b313a5d51b14bec7a8685e1 + url: "https://pub.dev" + source: hosted + version: "1.6.0" + linkify: + dependency: "direct main" + description: + name: linkify + sha256: "4139ea77f4651ab9c315b577da2dd108d9aa0bd84b5d03d33323f1970c645832" + url: "https://pub.dev" + source: hosted + version: "5.0.0" + lints: + dependency: transitive + description: + name: lints + sha256: cbf8d4b858bb0134ef3ef87841abdf8d63bfc255c266b7bf6b39daa1085c4290 + url: "https://pub.dev" + source: hosted + version: "3.0.0" + lists: + dependency: transitive + description: + name: lists + sha256: "4ca5c19ae4350de036a7e996cdd1ee39c93ac0a2b840f4915459b7d0a7d4ab27" + url: "https://pub.dev" + source: hosted + version: "1.0.1" + logger: + dependency: transitive + description: + name: logger + sha256: be4b23575aac7ebf01f225a241eb7f6b5641eeaf43c6a8613510fc2f8cf187d1 + url: "https://pub.dev" + source: hosted + version: "2.5.0" + logging: + dependency: transitive + description: + name: logging + sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61 + url: "https://pub.dev" + source: hosted + version: "1.3.0" + markdown: + dependency: transitive + description: + name: markdown + sha256: "935e23e1ff3bc02d390bad4d4be001208ee92cc217cb5b5a6c19bc14aaa318c1" + url: "https://pub.dev" + source: hosted + version: "7.3.0" + matcher: + dependency: transitive + description: + name: matcher + sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 + url: "https://pub.dev" + source: hosted + version: "0.12.17" + material: + dependency: "direct main" + description: + name: material + sha256: "7f3a2edadf60e3a8771b843baff931d4b2e7205d015059c3abe315344f23dfa4" + url: "https://pub.dev" + source: hosted + version: "1.0.0+2" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec + url: "https://pub.dev" + source: hosted + version: "0.11.1" + matrix: + dependency: "direct main" + description: + name: matrix + sha256: "7d15fdbc760be7e40c58bb65e03baa8241b1e31db2bc67dab61883aabc083a85" + url: "https://pub.dev" + source: hosted + version: "0.40.0" + meta: + dependency: transitive + description: + name: meta + sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c + url: "https://pub.dev" + source: hosted + version: "1.16.0" + mgrs_dart: + dependency: transitive + description: + name: mgrs_dart + sha256: fb89ae62f05fa0bb90f70c31fc870bcbcfd516c843fb554452ab3396f78586f7 + url: "https://pub.dev" + source: hosted + version: "2.0.0" + mime: + dependency: "direct main" + description: + name: mime + sha256: "801fd0b26f14a4a58ccb09d5892c3fbdeff209594300a542492cf13fba9d247a" + url: "https://pub.dev" + source: hosted + version: "1.0.6" + msix: + dependency: "direct dev" + description: + name: msix + sha256: edde648a8133bf301883c869d19d127049683037c65ff64173ba526ac7a8af2f + url: "https://pub.dev" + source: hosted + version: "3.16.9" + native_imaging: + dependency: "direct main" + description: + name: native_imaging + sha256: "93573afdcab070011d78a40fc1f69b61967f1f8485d2b81a7a2ee585a85f4c04" + url: "https://pub.dev" + source: hosted + version: "0.2.0" + nested: + dependency: transitive + description: + name: nested + sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" + url: "https://pub.dev" + source: hosted + version: "1.0.0" + node_preamble: + dependency: transitive + description: + name: node_preamble + sha256: "6e7eac89047ab8a8d26cf16127b5ed26de65209847630400f9aefd7cd5c730db" + url: "https://pub.dev" + source: hosted + version: "2.0.2" + olm: + dependency: transitive + description: + name: olm + sha256: "6a3fe1e5170b954dd9e4ba3b27513e6aa9b7591eb7bb0d7f6f32140b7f140c6f" + url: "https://pub.dev" + source: hosted + version: "3.1.0" + opus_caf_converter_dart: + dependency: "direct main" + description: + name: opus_caf_converter_dart + sha256: e08156066916f790a54df305e103d6dec4d853ec23147e6a02eda3c06f67ba1a + url: "https://pub.dev" + source: hosted + version: "1.0.1" + package_config: + dependency: transitive + description: + name: package_config + sha256: f096c55ebb7deb7e384101542bfba8c52696c1b56fca2eb62827989ef2353bbc + url: "https://pub.dev" + source: hosted + version: "2.2.0" + package_info_plus: + dependency: "direct main" + description: + name: package_info_plus + sha256: "7976bfe4c583170d6cdc7077e3237560b364149fcd268b5f53d95a991963b191" + url: "https://pub.dev" + source: hosted + version: "8.3.0" + package_info_plus_platform_interface: + dependency: transitive + description: + name: package_info_plus_platform_interface + sha256: "6c935fb612dff8e3cc9632c2b301720c77450a126114126ffaafe28d2e87956c" + url: "https://pub.dev" + source: hosted + version: "3.2.0" + pana: + dependency: transitive + description: + name: pana + sha256: "3fc3fe8e7a9fd4827fa4d625a423eec95d305b2bc3538a3adf7fd6c49217af97" + url: "https://pub.dev" + source: hosted + version: "0.21.45" + pasteboard: + dependency: "direct main" + description: + name: pasteboard + sha256: "1c8b6a8b3f1d12e55d4e9404433cda1b4abe66db6b17bc2d2fb5965772c04674" + url: "https://pub.dev" + source: hosted + version: "0.2.0" + path: + dependency: "direct main" + description: + name: path + sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" + url: "https://pub.dev" + source: hosted + version: "1.9.1" + path_provider: + dependency: "direct main" + description: + name: path_provider + sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd" + url: "https://pub.dev" + source: hosted + version: "2.1.5" + path_provider_android: + dependency: transitive + description: + name: path_provider_android + sha256: d0d310befe2c8ab9e7f393288ccbb11b60c019c6b5afc21973eeee4dda2b35e9 + url: "https://pub.dev" + source: hosted + version: "2.2.17" + path_provider_foundation: + dependency: transitive + description: + name: path_provider_foundation + sha256: "4843174df4d288f5e29185bd6e72a6fbdf5a4a4602717eed565497429f179942" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + path_provider_linux: + dependency: transitive + description: + name: path_provider_linux + sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 + url: "https://pub.dev" + source: hosted + version: "2.2.1" + path_provider_platform_interface: + dependency: transitive + description: + name: path_provider_platform_interface + sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + path_provider_windows: + dependency: transitive + description: + name: path_provider_windows + sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 + url: "https://pub.dev" + source: hosted + version: "2.3.0" + permission_handler: + dependency: "direct main" + description: + name: permission_handler + sha256: "59adad729136f01ea9e35a48f5d1395e25cba6cea552249ddbe9cf950f5d7849" + url: "https://pub.dev" + source: hosted + version: "11.4.0" + permission_handler_android: + dependency: transitive + description: + name: permission_handler_android + sha256: d3971dcdd76182a0c198c096b5db2f0884b0d4196723d21a866fc4cdea057ebc + url: "https://pub.dev" + source: hosted + version: "12.1.0" + permission_handler_apple: + dependency: transitive + description: + name: permission_handler_apple + sha256: f000131e755c54cf4d84a5d8bd6e4149e262cc31c5a8b1d698de1ac85fa41023 + url: "https://pub.dev" + source: hosted + version: "9.4.7" + permission_handler_html: + dependency: transitive + description: + name: permission_handler_html + sha256: "38f000e83355abb3392140f6bc3030660cfaef189e1f87824facb76300b4ff24" + url: "https://pub.dev" + source: hosted + version: "0.1.3+5" + permission_handler_platform_interface: + dependency: transitive + description: + name: permission_handler_platform_interface + sha256: eb99b295153abce5d683cac8c02e22faab63e50679b937fa1bf67d58bb282878 + url: "https://pub.dev" + source: hosted + version: "4.3.0" + permission_handler_windows: + dependency: transitive + description: + name: permission_handler_windows + sha256: "1a790728016f79a41216d88672dbc5df30e686e811ad4e698bfc51f76ad91f1e" + url: "https://pub.dev" + source: hosted + version: "0.2.1" + petitparser: + dependency: transitive + description: + name: petitparser + sha256: "07c8f0b1913bcde1ff0d26e57ace2f3012ccbf2b204e070290dad3bb22797646" + url: "https://pub.dev" + source: hosted + version: "6.1.0" + platform: + dependency: transitive + description: + name: platform + sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" + url: "https://pub.dev" + source: hosted + version: "3.1.6" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" + url: "https://pub.dev" + source: hosted + version: "2.1.8" + pointer_interceptor: + dependency: transitive + description: + name: pointer_interceptor + sha256: "57210410680379aea8b1b7ed6ae0c3ad349bfd56fe845b8ea934a53344b9d523" + url: "https://pub.dev" + source: hosted + version: "0.10.1+2" + pointer_interceptor_ios: + dependency: transitive + description: + name: pointer_interceptor_ios + sha256: a6906772b3205b42c44614fcea28f818b1e5fdad73a4ca742a7bd49818d9c917 + url: "https://pub.dev" + source: hosted + version: "0.10.1" + pointer_interceptor_platform_interface: + dependency: transitive + description: + name: pointer_interceptor_platform_interface + sha256: "0597b0560e14354baeb23f8375cd612e8bd4841bf8306ecb71fcd0bb78552506" + url: "https://pub.dev" + source: hosted + version: "0.10.0+1" + pointer_interceptor_web: + dependency: transitive + description: + name: pointer_interceptor_web + sha256: "460b600e71de6fcea2b3d5f662c92293c049c4319e27f0829310e5a953b3ee2a" + url: "https://pub.dev" + source: hosted + version: "0.10.3" + polylabel: + dependency: transitive + description: + name: polylabel + sha256: "41b9099afb2aa6c1730bdd8a0fab1400d287694ec7615dd8516935fa3144214b" + url: "https://pub.dev" + source: hosted + version: "1.0.1" + pool: + dependency: transitive + description: + name: pool + sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" + url: "https://pub.dev" + source: hosted + version: "1.5.1" + pretty_qr_code: + dependency: "direct main" + description: + name: pretty_qr_code + sha256: b078bd5d51956dea4342378af1b092ad962b81bdbb55b10fffce03461da8db74 + url: "https://pub.dev" + source: hosted + version: "3.4.0" + process: + dependency: transitive + description: + name: process + sha256: "107d8be718f120bbba9dcd1e95e3bd325b1b4a4f07db64154635ba03f2567a0d" + url: "https://pub.dev" + source: hosted + version: "5.0.3" + proj4dart: + dependency: transitive + description: + name: proj4dart + sha256: c8a659ac9b6864aa47c171e78d41bbe6f5e1d7bd790a5814249e6b68bc44324e + url: "https://pub.dev" + source: hosted + version: "2.1.0" + provider: + dependency: "direct main" + description: + name: provider + sha256: "4abbd070a04e9ddc287673bf5a030c7ca8b685ff70218720abab8b092f53dd84" + url: "https://pub.dev" + source: hosted + version: "6.1.5" + pub_semver: + dependency: transitive + description: + name: pub_semver + sha256: "5bfcf68ca79ef689f8990d1160781b4bad40a3bd5e5218ad4076ddb7f4081585" + url: "https://pub.dev" + source: hosted + version: "2.2.0" + pubspec_parse: + dependency: transitive + description: + name: pubspec_parse + sha256: "0560ba233314abbed0a48a2956f7f022cce7c3e1e73df540277da7544cad4082" + url: "https://pub.dev" + source: hosted + version: "1.5.0" + punycode: + dependency: "direct main" + description: + name: punycode + sha256: "39b874cc1f78b94e57db17e74b3f2ba2a96e25c0bebdcc8a571614dccda0ff0c" + url: "https://pub.dev" + source: hosted + version: "1.0.0" + qr: + dependency: transitive + description: + name: qr + sha256: "5a1d2586170e172b8a8c8470bbbffd5eb0cd38a66c0d77155ea138d3af3a4445" + url: "https://pub.dev" + source: hosted + version: "3.0.2" + qr_code_scanner_plus: + dependency: "direct main" + description: + name: qr_code_scanner_plus + sha256: "39696b50d277097ee4d90d4292de36f38c66213a4f5216a06b2bdd2b63117859" + url: "https://pub.dev" + source: hosted + version: "2.0.10+1" + qr_image: + dependency: "direct main" + description: + name: qr_image + sha256: c3cd2ac2c6cd6b14604c97b45c477b18988b6518f72120fa04418fc54e3b0d76 + url: "https://pub.dev" + source: hosted + version: "1.0.0" + random_string: + dependency: transitive + description: + name: random_string + sha256: "03b52435aae8cbdd1056cf91bfc5bf845e9706724dd35ae2e99fa14a1ef79d02" + url: "https://pub.dev" + source: hosted + version: "2.3.1" + receive_sharing_intent: + dependency: "direct main" + description: + name: receive_sharing_intent + sha256: ec76056e4d258ad708e76d85591d933678625318e411564dcb9059048ca3a593 + url: "https://pub.dev" + source: hosted + version: "1.8.1" + record: + dependency: "direct main" + description: + name: record + sha256: "2e3d56d196abcd69f1046339b75e5f3855b2406fc087e5991f6703f188aa03a6" + url: "https://pub.dev" + source: hosted + version: "5.2.1" + record_android: + dependency: transitive + description: + name: record_android + sha256: "97d7122455f30de89a01c6c244c839085be6b12abca251fc0e78f67fed73628b" + url: "https://pub.dev" + source: hosted + version: "1.3.3" + record_darwin: + dependency: transitive + description: + name: record_darwin + sha256: e487eccb19d82a9a39cd0126945cfc47b9986e0df211734e2788c95e3f63c82c + url: "https://pub.dev" + source: hosted + version: "1.2.2" + record_linux: + dependency: transitive + description: + name: record_linux + sha256: "74d41a9ebb1eb498a38e9a813dd524e8f0b4fdd627270bda9756f437b110a3e3" + url: "https://pub.dev" + source: hosted + version: "0.7.2" + record_platform_interface: + dependency: transitive + description: + name: record_platform_interface + sha256: "8a575828733d4c3cb5983c914696f40db8667eab3538d4c41c50cbb79e722ef4" + url: "https://pub.dev" + source: hosted + version: "1.2.0" + record_web: + dependency: transitive + description: + name: record_web + sha256: "024c81eb7f51468b1833a3eca8b461c7ca25c04899dba37abe580bb57afd32e4" + url: "https://pub.dev" + source: hosted + version: "1.1.8" + record_windows: + dependency: transitive + description: + name: record_windows + sha256: "85a22fc97f6d73ecd67c8ba5f2f472b74ef1d906f795b7970f771a0914167e99" + url: "https://pub.dev" + source: hosted + version: "1.0.6" + retry: + dependency: transitive + description: + name: retry + sha256: "822e118d5b3aafed083109c72d5f484c6dc66707885e07c0fbcb8b986bba7efc" + url: "https://pub.dev" + source: hosted + version: "3.1.2" + rxdart: + dependency: transitive + description: + name: rxdart + sha256: "5c3004a4a8dbb94bd4bf5412a4def4acdaa12e12f269737a5751369e12d1a962" + url: "https://pub.dev" + source: hosted + version: "0.28.0" + safe_url_check: + dependency: transitive + description: + name: safe_url_check + sha256: "49a3e060a7869cbafc8f4845ca1ecbbaaa53179980a32f4fdfeab1607e90f41d" + url: "https://pub.dev" + source: hosted + version: "1.1.2" + scroll_to_index: + dependency: "direct main" + description: + name: scroll_to_index + sha256: b707546e7500d9f070d63e5acf74fd437ec7eeeb68d3412ef7b0afada0b4f176 + url: "https://pub.dev" + source: hosted + version: "3.0.1" + sdp_transform: + dependency: transitive + description: + name: sdp_transform + sha256: "73e412a5279a5c2de74001535208e20fff88f225c9a4571af0f7146202755e45" + url: "https://pub.dev" + source: hosted + version: "0.3.2" + share_plus: + dependency: "direct main" + description: + name: share_plus + sha256: fce43200aa03ea87b91ce4c3ac79f0cecd52e2a7a56c7a4185023c271fbfa6da + url: "https://pub.dev" + source: hosted + version: "10.1.4" + share_plus_platform_interface: + dependency: transitive + description: + name: share_plus_platform_interface + sha256: cc012a23fc2d479854e6c80150696c4a5f5bb62cb89af4de1c505cf78d0a5d0b + url: "https://pub.dev" + source: hosted + version: "5.0.2" + shared_preferences: + dependency: "direct main" + description: + name: shared_preferences + sha256: "6e8bf70b7fef813df4e9a36f658ac46d107db4b4cfe1048b477d4e453a8159f5" + url: "https://pub.dev" + source: hosted + version: "2.5.3" + shared_preferences_android: + dependency: transitive + description: + name: shared_preferences_android + sha256: "20cbd561f743a342c76c151d6ddb93a9ce6005751e7aa458baad3858bfbfb6ac" + url: "https://pub.dev" + source: hosted + version: "2.4.10" + shared_preferences_foundation: + dependency: transitive + description: + name: shared_preferences_foundation + sha256: "6a52cfcdaeac77cad8c97b539ff688ccfc458c007b4db12be584fbe5c0e49e03" + url: "https://pub.dev" + source: hosted + version: "2.5.4" + shared_preferences_linux: + dependency: transitive + description: + name: shared_preferences_linux + sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + shared_preferences_platform_interface: + dependency: transitive + description: + name: shared_preferences_platform_interface + sha256: "57cbf196c486bc2cf1f02b85784932c6094376284b3ad5779d1b1c6c6a816b80" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + shared_preferences_web: + dependency: transitive + description: + name: shared_preferences_web + sha256: c49bd060261c9a3f0ff445892695d6212ff603ef3115edbb448509d407600019 + url: "https://pub.dev" + source: hosted + version: "2.4.3" + shared_preferences_windows: + dependency: transitive + description: + name: shared_preferences_windows + sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + shelf: + dependency: transitive + description: + name: shelf + sha256: e7dd780a7ffb623c57850b33f43309312fc863fb6aa3d276a754bb299839ef12 + url: "https://pub.dev" + source: hosted + version: "1.4.2" + shelf_packages_handler: + dependency: transitive + description: + name: shelf_packages_handler + sha256: "89f967eca29607c933ba9571d838be31d67f53f6e4ee15147d5dc2934fee1b1e" + url: "https://pub.dev" + source: hosted + version: "3.0.2" + shelf_static: + dependency: transitive + description: + name: shelf_static + sha256: c87c3875f91262785dade62d135760c2c69cb217ac759485334c5857ad89f6e3 + url: "https://pub.dev" + source: hosted + version: "1.1.3" + shelf_web_socket: + dependency: transitive + description: + name: shelf_web_socket + sha256: "3632775c8e90d6c9712f883e633716432a27758216dfb61bd86a8321c0580925" + url: "https://pub.dev" + source: hosted + version: "3.0.0" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + slugify: + dependency: "direct main" + description: + name: slugify + sha256: b272501565cb28050cac2d96b7bf28a2d24c8dae359280361d124f3093d337c3 + url: "https://pub.dev" + source: hosted + version: "2.0.0" + source_map_stack_trace: + dependency: transitive + description: + name: source_map_stack_trace + sha256: c0713a43e323c3302c2abe2a1cc89aa057a387101ebd280371d6a6c9fa68516b + url: "https://pub.dev" + source: hosted + version: "2.1.2" + source_maps: + dependency: transitive + description: + name: source_maps + sha256: "190222579a448b03896e0ca6eca5998fa810fda630c1d65e2f78b3f638f54812" + url: "https://pub.dev" + source: hosted + version: "0.10.13" + source_span: + dependency: transitive + description: + name: source_span + sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" + url: "https://pub.dev" + source: hosted + version: "1.10.1" + sprintf: + dependency: transitive + description: + name: sprintf + sha256: "1fc9ffe69d4df602376b52949af107d8f5703b77cda567c4d7d86a0693120f23" + url: "https://pub.dev" + source: hosted + version: "7.0.0" + sqflite: + dependency: transitive + description: + name: sqflite + sha256: e2297b1da52f127bc7a3da11439985d9b536f75070f3325e62ada69a5c585d03 + url: "https://pub.dev" + source: hosted + version: "2.4.2" + sqflite_android: + dependency: transitive + description: + name: sqflite_android + sha256: "2b3070c5fa881839f8b402ee4a39c1b4d561704d4ebbbcfb808a119bc2a1701b" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + sqflite_common: + dependency: transitive + description: + name: sqflite_common + sha256: "84731e8bfd8303a3389903e01fb2141b6e59b5973cacbb0929021df08dddbe8b" + url: "https://pub.dev" + source: hosted + version: "2.5.5" + sqflite_common_ffi: + dependency: "direct main" + description: + name: sqflite_common_ffi + sha256: "1f3ef3888d3bfbb47785cc1dda0dc7dd7ebd8c1955d32a9e8e9dae1e38d1c4c1" + url: "https://pub.dev" + source: hosted + version: "2.3.5" + sqflite_darwin: + dependency: transitive + description: + name: sqflite_darwin + sha256: "279832e5cde3fe99e8571879498c9211f3ca6391b0d818df4e17d9fff5c6ccb3" + url: "https://pub.dev" + source: hosted + version: "2.4.2" + sqflite_platform_interface: + dependency: transitive + description: + name: sqflite_platform_interface + sha256: "8dd4515c7bdcae0a785b0062859336de775e8c65db81ae33dd5445f35be61920" + url: "https://pub.dev" + source: hosted + version: "2.4.0" + sqlcipher_flutter_libs: + dependency: "direct main" + description: + name: sqlcipher_flutter_libs + sha256: "777c3469ada8fe6b808bd50f1c752cdd2ca1b1f3cf751d434502ead15334f3a5" + url: "https://pub.dev" + source: hosted + version: "0.6.6" + sqlite3: + dependency: transitive + description: + name: sqlite3 + sha256: c0503c69b44d5714e6abbf4c1f51a3c3cc42b75ce785f44404765e4635481d38 + url: "https://pub.dev" + source: hosted + version: "2.7.6" + stack_trace: + dependency: transitive + description: + name: stack_trace + sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" + url: "https://pub.dev" + source: hosted + version: "1.12.1" + stream_channel: + dependency: transitive + description: + name: stream_channel + sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + string_scanner: + dependency: transitive + description: + name: string_scanner + sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" + url: "https://pub.dev" + source: hosted + version: "1.4.1" + string_validator: + dependency: transitive + description: + name: string_validator + sha256: "50dd8ecf91db6a732f4a851eeae81ee12406eedc62d0da72f2d91a04a2d10dd8" + url: "https://pub.dev" + source: hosted + version: "0.3.0" + swipe_to_action: + dependency: "direct main" + description: + name: swipe_to_action + sha256: "05289a2bff6a0227deeff382afa1c46643d1f077e678d78f76440e153ea1ef7d" + url: "https://pub.dev" + source: hosted + version: "0.3.0" + sync_http: + dependency: transitive + description: + name: sync_http + sha256: "7f0cd72eca000d2e026bcd6f990b81d0ca06022ef4e32fb257b30d3d1014a961" + url: "https://pub.dev" + source: hosted + version: "0.3.1" + synchronized: + dependency: transitive + description: + name: synchronized + sha256: "0669c70faae6270521ee4f05bffd2919892d42d1276e6c495be80174b6bc0ef6" + url: "https://pub.dev" + source: hosted + version: "3.3.1" + tar: + dependency: transitive + description: + name: tar + sha256: "22f67e2d77b51050436620b2a5de521c58ca6f0b75af1d9ab3c8cae2eae58fcd" + url: "https://pub.dev" + source: hosted + version: "1.0.5" + term_glyph: + dependency: transitive + description: + name: term_glyph + sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" + url: "https://pub.dev" + source: hosted + version: "1.2.2" + test: + dependency: transitive + description: + name: test + sha256: "301b213cd241ca982e9ba50266bd3f5bd1ea33f1455554c5abb85d1be0e2d87e" + url: "https://pub.dev" + source: hosted + version: "1.25.15" + test_api: + dependency: transitive + description: + name: test_api + sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd + url: "https://pub.dev" + source: hosted + version: "0.7.4" + test_core: + dependency: transitive + description: + name: test_core + sha256: "84d17c3486c8dfdbe5e12a50c8ae176d15e2a771b96909a9442b40173649ccaa" + url: "https://pub.dev" + source: hosted + version: "0.6.8" + timezone: + dependency: transitive + description: + name: timezone + sha256: "2236ec079a174ce07434e89fcd3fcda430025eb7692244139a9cf54fdcf1fc7d" + url: "https://pub.dev" + source: hosted + version: "0.9.4" + tint: + dependency: transitive + description: + name: tint + sha256: "9652d9a589f4536d5e392cf790263d120474f15da3cf1bee7f1fdb31b4de5f46" + url: "https://pub.dev" + source: hosted + version: "2.0.1" + tor_detector_web: + dependency: "direct main" + description: + name: tor_detector_web + sha256: c4acbd6c0fecd2cd0e8fe00b1a37332422e041021a42488dfddcb3e7ec809b3f + url: "https://pub.dev" + source: hosted + version: "1.1.0" + translations_cleaner: + dependency: "direct dev" + description: + name: translations_cleaner + sha256: "060f4a8cd782e271509719741dd3540fe81ddaad49bd79e1d8fc4598299a6b84" + url: "https://pub.dev" + source: hosted + version: "0.0.5" + typed_data: + dependency: transitive + description: + name: typed_data + sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 + url: "https://pub.dev" + source: hosted + version: "1.4.0" + unicode: + dependency: transitive + description: + name: unicode + sha256: "0f69e46593d65245774d4f17125c6084d2c20b4e473a983f6e21b7d7762218f1" + url: "https://pub.dev" + source: hosted + version: "0.3.1" + unifiedpush: + dependency: "direct main" + description: + name: unifiedpush + sha256: "6dbed5a6305ca33f1865c7a3d814ae39476b79a2d23ca76a5708f023f405730f" + url: "https://pub.dev" + source: hosted + version: "5.0.2" + unifiedpush_android: + dependency: transitive + description: + name: unifiedpush_android + sha256: "7443dece0a850ae956514f809983eb2b39fc518c2c7d24dbfe817198bec89134" + url: "https://pub.dev" + source: hosted + version: "2.3.0" + unifiedpush_platform_interface: + dependency: transitive + description: + name: unifiedpush_platform_interface + sha256: dd588d78a8b2bfc10430e30035526e98caa543d0b7364a6344b5eb4815721c6d + url: "https://pub.dev" + source: hosted + version: "2.0.2" + unifiedpush_ui: + dependency: "direct main" + description: + name: unifiedpush_ui + sha256: cf86f0214f37debd41f25c0425c8489df85e27f9f8784fed571eb7a86d39ba11 + url: "https://pub.dev" + source: hosted + version: "0.1.0" + universal_html: + dependency: "direct main" + description: + name: universal_html + sha256: "56536254004e24d9d8cfdb7dbbf09b74cf8df96729f38a2f5c238163e3d58971" + url: "https://pub.dev" + source: hosted + version: "2.2.4" + universal_io: + dependency: transitive + description: + name: universal_io + sha256: "1722b2dcc462b4b2f3ee7d188dad008b6eb4c40bbd03a3de451d82c78bba9aad" + url: "https://pub.dev" + source: hosted + version: "2.2.2" + unorm_dart: + dependency: transitive + description: + name: unorm_dart + sha256: "5b35bff83fce4d76467641438f9e867dc9bcfdb8c1694854f230579d68cd8f4b" + url: "https://pub.dev" + source: hosted + version: "0.2.0" + url_launcher: + dependency: "direct main" + description: + name: url_launcher + sha256: "9d06212b1362abc2f0f0d78e6f09f726608c74e3b9462e8368bb03314aa8d603" + url: "https://pub.dev" + source: hosted + version: "6.3.1" + url_launcher_android: + dependency: transitive + description: + name: url_launcher_android + sha256: "8582d7f6fe14d2652b4c45c9b6c14c0b678c2af2d083a11b604caeba51930d79" + url: "https://pub.dev" + source: hosted + version: "6.3.16" + url_launcher_ios: + dependency: transitive + description: + name: url_launcher_ios + sha256: "7f2022359d4c099eea7df3fdf739f7d3d3b9faf3166fb1dd390775176e0b76cb" + url: "https://pub.dev" + source: hosted + version: "6.3.3" + url_launcher_linux: + dependency: transitive + description: + name: url_launcher_linux + sha256: "4e9ba368772369e3e08f231d2301b4ef72b9ff87c31192ef471b380ef29a4935" + url: "https://pub.dev" + source: hosted + version: "3.2.1" + url_launcher_macos: + dependency: transitive + description: + name: url_launcher_macos + sha256: "17ba2000b847f334f16626a574c702b196723af2a289e7a93ffcb79acff855c2" + url: "https://pub.dev" + source: hosted + version: "3.2.2" + url_launcher_platform_interface: + dependency: transitive + description: + name: url_launcher_platform_interface + sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + url_launcher_web: + dependency: transitive + description: + name: url_launcher_web + sha256: "4bd2b7b4dc4d4d0b94e5babfffbca8eac1a126c7f3d6ecbc1a11013faa3abba2" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + url_launcher_windows: + dependency: transitive + description: + name: url_launcher_windows + sha256: "3284b6d2ac454cf34f114e1d3319866fdd1e19cdc329999057e44ffe936cfa77" + url: "https://pub.dev" + source: hosted + version: "3.1.4" + uuid: + dependency: transitive + description: + name: uuid + sha256: a5be9ef6618a7ac1e964353ef476418026db906c4facdedaa299b7a2e71690ff + url: "https://pub.dev" + source: hosted + version: "4.5.1" + vector_math: + dependency: transitive + description: + name: vector_math + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + video_compress: + dependency: "direct main" + description: + name: video_compress + sha256: "31bc5cdb9a02ba666456e5e1907393c28e6e0e972980d7d8d619a7beda0d4f20" + url: "https://pub.dev" + source: hosted + version: "3.1.4" + video_player: + dependency: "direct main" + description: + name: video_player + sha256: "0d55b1f1a31e5ad4c4967bfaa8ade0240b07d20ee4af1dfef5f531056512961a" + url: "https://pub.dev" + source: hosted + version: "2.10.0" + video_player_android: + dependency: transitive + description: + name: video_player_android + sha256: "4a5135754a62dbc827a64a42ef1f8ed72c962e191c97e2d48744225c2b9ebb73" + url: "https://pub.dev" + source: hosted + version: "2.8.7" + video_player_avfoundation: + dependency: transitive + description: + name: video_player_avfoundation + sha256: "9ee764e5cd2fc1e10911ae8ad588e1a19db3b6aa9a6eb53c127c42d3a3c3f22f" + url: "https://pub.dev" + source: hosted + version: "2.7.1" + video_player_platform_interface: + dependency: transitive + description: + name: video_player_platform_interface + sha256: df534476c341ab2c6a835078066fc681b8265048addd853a1e3c78740316a844 + url: "https://pub.dev" + source: hosted + version: "6.3.0" + video_player_web: + dependency: transitive + description: + name: video_player_web + sha256: e8bba2e5d1e159d5048c9a491bb2a7b29c535c612bb7d10c1e21107f5bd365ba + url: "https://pub.dev" + source: hosted + version: "2.3.5" + vm_service: + dependency: transitive + description: + name: vm_service + sha256: ddfa8d30d89985b96407efce8acbdd124701f96741f2d981ca860662f1c0dc02 + url: "https://pub.dev" + source: hosted + version: "15.0.0" + wakelock_plus: + dependency: "direct main" + description: + name: wakelock_plus + sha256: a474e314c3e8fb5adef1f9ae2d247e57467ad557fa7483a2b895bc1b421c5678 + url: "https://pub.dev" + source: hosted + version: "1.3.2" + wakelock_plus_platform_interface: + dependency: transitive + description: + name: wakelock_plus_platform_interface + sha256: e10444072e50dbc4999d7316fd303f7ea53d31c824aa5eb05d7ccbdd98985207 + url: "https://pub.dev" + source: hosted + version: "1.2.3" + watcher: + dependency: transitive + description: + name: watcher + sha256: "69da27e49efa56a15f8afe8f4438c4ec02eff0a117df1b22ea4aad194fe1c104" + url: "https://pub.dev" + source: hosted + version: "1.1.1" + web: + dependency: transitive + description: + name: web + sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" + url: "https://pub.dev" + source: hosted + version: "1.1.1" + web_socket: + dependency: transitive + description: + name: web_socket + sha256: "34d64019aa8e36bf9842ac014bb5d2f5586ca73df5e4d9bf5c936975cae6982c" + url: "https://pub.dev" + source: hosted + version: "1.0.1" + web_socket_channel: + dependency: transitive + description: + name: web_socket_channel + sha256: d645757fb0f4773d602444000a8131ff5d48c9e47adfe9772652dd1a4f2d45c8 + url: "https://pub.dev" + source: hosted + version: "3.0.3" + webdriver: + dependency: transitive + description: + name: webdriver + sha256: "2f3a14ca026957870cfd9c635b83507e0e51d8091568e90129fbf805aba7cade" + url: "https://pub.dev" + source: hosted + version: "3.1.0" + webkit_inspection_protocol: + dependency: transitive + description: + name: webkit_inspection_protocol + sha256: "87d3f2333bb240704cd3f1c6b5b7acd8a10e7f0bc28c28dcf14e782014f4a572" + url: "https://pub.dev" + source: hosted + version: "1.2.1" + webrtc_interface: + dependency: "direct main" + description: + name: webrtc_interface + sha256: "86fe3afc81a08481dfb25cf14a5a94e27062ecef25544783f352c914e0bbc1ca" + url: "https://pub.dev" + source: hosted + version: "1.2.2+hotfix.2" + win32: + dependency: "direct overridden" + description: + name: win32 + sha256: "015002c060f1ae9f41a818f2d5640389cc05283e368be19dc8d77cecb43c40c9" + url: "https://pub.dev" + source: hosted + version: "5.5.3" + win32_registry: + dependency: transitive + description: + name: win32_registry + sha256: "21ec76dfc731550fd3e2ce7a33a9ea90b828fdf19a5c3bcf556fa992cfa99852" + url: "https://pub.dev" + source: hosted + version: "1.1.5" + window_to_front: + dependency: transitive + description: + name: window_to_front + sha256: "7aef379752b7190c10479e12b5fd7c0b9d92adc96817d9e96c59937929512aee" + url: "https://pub.dev" + source: hosted + version: "0.0.3" + wkt_parser: + dependency: transitive + description: + name: wkt_parser + sha256: "8a555fc60de3116c00aad67891bcab20f81a958e4219cc106e3c037aa3937f13" + url: "https://pub.dev" + source: hosted + version: "2.0.0" + xdg_directories: + dependency: transitive + description: + name: xdg_directories + sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + xml: + dependency: transitive + description: + name: xml + sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226 + url: "https://pub.dev" + source: hosted + version: "6.5.0" + yaml: + dependency: transitive + description: + name: yaml + sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce + url: "https://pub.dev" + source: hosted + version: "3.1.3" +sdks: + dart: ">=3.8.0 <4.0.0" + flutter: ">=3.29.0" diff --git a/pubspec.yaml b/pubspec.yaml new file mode 100644 index 0000000..6763872 --- /dev/null +++ b/pubspec.yaml @@ -0,0 +1,144 @@ +name: fluffychat +description: Chat with your friends. +publish_to: none +# On version bump also increase the build number for F-Droid +version: 1.26.0+3538 + +environment: + sdk: ">=3.0.0 <4.0.0" + +dependencies: + animations: ^2.0.11 + app_links: ^6.3.3 + archive: ^3.4.10 + async: ^2.11.0 + badges: ^3.1.2 + blurhash_dart: ^1.2.1 + chewie: ^1.11.0 + collection: ^1.18.0 + cross_file: ^0.3.4+2 + cupertino_icons: any + desktop_drop: ^0.4.4 + desktop_notifications: ^0.6.3 + device_info_plus: ^10.0.1 + dynamic_color: ^1.7.0 + emoji_picker_flutter: ^3.1.0 + emojis: ^0.9.9 + #fcm_shared_isolate: ^0.2.0 + file_picker: ^8.1.2 + file_selector: ^1.0.3 + flutter: + sdk: flutter + flutter_cache_manager: ^3.4.1 + flutter_foreground_task: ^6.1.3 + flutter_highlighter: ^0.1.1 + flutter_linkify: ^6.0.0 + flutter_local_notifications: ^17.2.3 + flutter_localizations: + sdk: flutter + flutter_map: ^6.1.0 + flutter_new_badger: ^1.1.1 + flutter_olm: 2.0.0 + flutter_openssl_crypto: ^0.5.0 + flutter_secure_storage: ^9.2.2 + flutter_shortcuts_new: ^2.0.0 + flutter_typeahead: ## Custom fork from flutter_typeahead since the package is not maintain well. + git: + url: https://github.com/famedly/flutter_typeahead.git + ref: main + flutter_web_auth_2: ^3.1.1 # Version 4 blocked by https://github.com/MixinNetwork/flutter-plugins/issues/379 + flutter_webrtc: ^0.12.9 + geolocator: ^13.0.1 + go_router: ^14.8.1 + handy_window: ^0.4.0 + hive: ^2.2.3 + hive_flutter: ^1.1.0 + html: ^0.15.4 + http: ^1.2.0 + image: ^4.1.7 + image_picker: ^1.1.0 + intl: ^0.20.2 + just_audio: ^0.9.39 + latlong2: ^0.9.1 + linkify: ^5.0.0 + material: ^1.0.0+2 + matrix: 0.40.0 + mime: ^1.0.6 + native_imaging: ^0.2.0 + opus_caf_converter_dart: ^1.0.1 + package_info_plus: ^8.0.2 + pasteboard: ^0.2.0 + path: ^1.9.0 + path_provider: ^2.1.2 + permission_handler: ^11.0.1 + pretty_qr_code: ^3.2.1 + provider: ^6.0.2 + punycode: ^1.0.0 + qr_code_scanner_plus: ^2.0.10+1 + qr_image: ^1.0.0 + receive_sharing_intent: ^1.8.1 + record: ^5.1.2 + scroll_to_index: ^3.0.1 + share_plus: ^10.0.2 + shared_preferences: ^2.2.0 # Pinned because https://github.com/flutter/flutter/issues/118401 + slugify: ^2.0.0 + sqflite_common_ffi: ^2.3.3 + sqlcipher_flutter_libs: ^0.6.1 + swipe_to_action: ^0.3.0 + tor_detector_web: ^1.1.0 + unifiedpush: ^5.0.1 + unifiedpush_ui: ^0.1.0 + universal_html: ^2.2.4 + url_launcher: ^6.2.5 + video_compress: ^3.1.4 + video_player: ^2.9.2 + wakelock_plus: ^1.2.2 + webrtc_interface: ^1.0.13 + +dev_dependencies: + flutter_lints: ^3.0.0 + flutter_native_splash: ^2.0.3+1 + flutter_test: + sdk: flutter + import_sorter: ^4.6.0 + integration_test: + sdk: flutter + license_checker: ^1.6.0 + msix: ^3.6.2 + translations_cleaner: ^0.0.5 + +flutter_native_splash: + color: "#ffffff" + color_dark: "#000000" + image: "assets/info-logo.png" + +flutter: + generate: true + uses-material-design: true + assets: + - assets/ + - assets/sounds/ + - assets/js/ + - assets/js/package/ + +msix_config: + display_name: FluffyChat + publisher_display_name: FluffyChat + publisher: CN=FluffyChat, O=Head of bad integration tests, L=Matrix, S=Internet, C=EU + identity_name: chat.fluffy.fluffychat + logo_path: assets\logo.png + capabilities: internetClient, location, microphone, webcam + protocol_activation: https + app_uri_handler_hosts: fluffychat.im, matrix.to + execution_alias: fluffychat + sign_msix: false + install_certificate: false + +dependency_overrides: + # https://github.com/ThexXTURBOXx/flutter_web_auth_2/issues/155 + flutter_web_auth_2: + git: + url: https://github.com/ThexXTURBOXx/flutter_web_auth_2.git + ref: 3.x-without-v1 + path: flutter_web_auth_2 + win32: 5.5.3 diff --git a/replace.js b/replace.js new file mode 100644 index 0000000..8a2838f --- /dev/null +++ b/replace.js @@ -0,0 +1,23 @@ +import fs from 'fs'; + +const files = fs.readdirSync('lib/', { + recursive: true +}); + +const q = process.argv[2]; + +var total = 0; + +for (const f of files) { + try { + if (f.includes('lib/generated')) continue; + const b = fs.readFileSync(`lib/${f}`, 'utf-8'); + total ++; + fs.writeFileSync(`lib/${f}`, b.replace(`package:flutter_gen/gen_l10n/l10n.dart`, `package:fluffychat/generated/l10n/l10n.dart`)); + console.log(f); + } catch (error) { + + } +} + +console.log(`${total} files in total`); \ No newline at end of file diff --git a/scripts/build-ios.sh b/scripts/build-ios.sh new file mode 100755 index 0000000..7fd791b --- /dev/null +++ b/scripts/build-ios.sh @@ -0,0 +1,78 @@ +#!/usr/bin/env bash +git apply ./scripts/enable-android-google-services.patch +FLUFFYCHAT_ORIG_GROUP="im.fluffychat" +FLUFFYCHAT_ORIG_TEAM="4NXF6Z997G" +#FLUFFYCHAT_NEW_GROUP="com.example.fluffychat" +#FLUFFYCHAT_NEW_TEAM="ABCDE12345" + +# In some cases (ie: running beta XCode releases) some pods haven't updated their minimum version +# but XCode will reject the package for using too old of a minimum version. +# This will fix that, but. Well. Use at your own risk. +# export I_PROMISE_IM_REALLY_SMART=1 + +# If you want to automatically install the app +# export FLUFFYCHAT_INSTALL_IPA=1 + +### Rotate IDs ### +[ -n "${FLUFFYCHAT_NEW_GROUP}" ] && { + # App group IDs + sed -i "" "s/group.${FLUFFYCHAT_ORIG_GROUP}.app/group.${FLUFFYCHAT_NEW_GROUP}.app/g" "ios/FluffyChat Share/FluffyChat Share.entitlements" + sed -i "" "s/group.${FLUFFYCHAT_ORIG_GROUP}.app/group.${FLUFFYCHAT_NEW_GROUP}.app/g" "ios/Runner/Runner.entitlements" + sed -i "" "s/group.${FLUFFYCHAT_ORIG_GROUP}.app/group.${FLUFFYCHAT_NEW_GROUP}.app/g" "ios/Runner.xcodeproj/project.pbxproj" + # Bundle identifiers + sed -i "" "s/${FLUFFYCHAT_ORIG_GROUP}.app/${FLUFFYCHAT_NEW_GROUP}.app/g" "ios/Runner.xcodeproj/project.pbxproj" +} + +[ -n "${FLUFFYCHAT_NEW_TEAM}" ] && { + # Code signing team + sed -i "" "s/${FLUFFYCHAT_ORIG_TEAM}/${FLUFFYCHAT_NEW_TEAM}/g" "ios/Runner.xcodeproj/project.pbxproj" +} +cat << EOHELP +If something later in the build explodes, and looks possibly related to App IDs: +1. Ask Xcode nicely + - Open ios/Runner.xcodeproj in Xcode + - Go to the Signing & Capabilities tab + - Ask it to repair the certificates/register app IDs/etc +2. Fix it yourself + - Go to https://developer.apple.com/account/resources/identifiers/list + - Ensure that Xcode created the App ID successfully (for fluffychat.app and fluffychat.app.FluffyChat-Share) + - Under "App Groups", make sure it registered your group + - Back "App IDs", check that the App Group was added to each App ID's entitlements +EOHELP + +### [optional] override pods minimum iphoneos deployment target ### +[ -n "${I_PROMISE_IM_REALLY_SMART}" ] && { +# 1. I'm sorry about the indentation't ;_; heredocs are weird about it +# 2. The patch basically just removes any preference on target iOS version +# This lets our default from ios/Flutter/AppFrameworkInfo.plist take precendence +cat << EOPATCH | patch --forward --reject-file=apple_please_fix_your_coreutils --silent ios/Podfile +diff --git a/ios/Podfile b/ios/Podfile +index 9411102b..0446120a 100644 +--- a/ios/Podfile ++++ b/ios/Podfile +@@ -37,5 +37,8 @@ end + post_install do |installer| + installer.pods_project.targets.each do |target| + flutter_additional_ios_build_settings(target) ++ target.build_configurations.each do |config| ++ config.build_settings.delete 'IPHONEOS_DEPLOYMENT_TARGET' ++ end + end + end +EOPATCH +rm -f apple_please_fix_your_coreutils +} + +### Make release build ### +flutter build ipa --release + +### [optional] Install release build ### +[ -n "${FLUFFYCHAT_INSTALL_IPA}" ] && { + TMPDIR=$(mktemp -d) + # 1. Turn the xcarchive that flutter created into a dev-signed IPA + echo '{"compileBitcode":false,"method":"development"}' | plutil -convert xml1 -o "${TMPDIR}/options.plist" - + xcodebuild -exportArchive -archivePath ./build/ios/archive/Runner.xcarchive -exportPath "${TMPDIR}" -exportOptionsPlist "${TMPDIR}/options.plist" + # 2. ...and install it on your connected devices + cfgutil --foreach install-app "${TMPDIR}/fluffychat.ipa" + rm -rf "${TMPDIR}" +} diff --git a/scripts/build-macos.sh b/scripts/build-macos.sh new file mode 100755 index 0000000..11d3e4a --- /dev/null +++ b/scripts/build-macos.sh @@ -0,0 +1,35 @@ +#!/usr/bin/env bash +git apply ./scripts/enable-android-google-services.patch +FLUFFYCHAT_ORIG_GROUP="im.fluffychat" +FLUFFYCHAT_ORIG_TEAM="4NXF6Z997G" +#FLUFFYCHAT_NEW_GROUP="com.example.fluffychat" +#FLUFFYCHAT_NEW_TEAM="ABCDE12345" + +# In some cases (ie: running beta XCode releases) some pods haven't updated their minimum version +# but XCode will reject the package for using too old of a minimum version. +# This will fix that, but. Well. Use at your own risk. +# export I_PROMISE_IM_REALLY_SMART=1 + +# If you want to automatically install the app +# export FLUFFYCHAT_INSTALL_IPA=1 + +### Rotate IDs ### +[ -n "${FLUFFYCHAT_NEW_GROUP}" ] && { + # App group IDs + sed -i "" "s/group.${FLUFFYCHAT_ORIG_GROUP}.app/group.${FLUFFYCHAT_NEW_GROUP}.app/g" "macos/Runner/Runner.entitlements" + sed -i "" "s/group.${FLUFFYCHAT_ORIG_GROUP}.app/group.${FLUFFYCHAT_NEW_GROUP}.app/g" "macos/Runner.xcodeproj/project.pbxproj" + # Bundle identifiers + sed -i "" "s/${FLUFFYCHAT_ORIG_GROUP}.app/${FLUFFYCHAT_NEW_GROUP}.app/g" "macos/Runner.xcodeproj/project.pbxproj" +} + +[ -n "${FLUFFYCHAT_NEW_TEAM}" ] && { + # Code signing team + sed -i "" "s/${FLUFFYCHAT_ORIG_TEAM}/${FLUFFYCHAT_NEW_TEAM}/g" "macos/Runner.xcodeproj/project.pbxproj" +} + +### Make release build ### +flutter build macos --release + +cp /usr/local/Cellar/libolm/**/lib/libolm.3.dylib build/macos/Build/Products/Release/FluffyChat.app/Contents/Frameworks/libolm.3.dylib + +echo "Build build/macos/Build/Products/Release/FluffyChat.app" diff --git a/scripts/build-olm-windows.sh b/scripts/build-olm-windows.sh new file mode 100755 index 0000000..003b98e --- /dev/null +++ b/scripts/build-olm-windows.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash + +git clone https://gitlab.matrix.org/matrix-org/olm.git -b 3.2.12 +cd olm +cmake . -Bbuild -DCMAKE_TOOLCHAIN_FILE=Windows64.cmake +cmake --build build +cd .. diff --git a/scripts/build-windows.ps1 b/scripts/build-windows.ps1 new file mode 100644 index 0000000..0c02f80 --- /dev/null +++ b/scripts/build-windows.ps1 @@ -0,0 +1,7 @@ +flutter doctor +flutter config --enable-windows-desktop +flutter clean +flutter pub get + +flutter build windows --release -v + diff --git a/scripts/create_fdroid_repos.sh b/scripts/create_fdroid_repos.sh new file mode 100755 index 0000000..595e1cf --- /dev/null +++ b/scripts/create_fdroid_repos.sh @@ -0,0 +1,67 @@ +#!/usr/bin/env bash + +GITLAB_PROJECT_ID="16112282" + +# repo directory for build +mkdir fdroid/repo +# ... and for deployment +mkdir repo + +git fetch + +# building nightly repo + +cd fdroid + +cp config.nightly.py config.py + +PIPELINES="$(curl https://gitlab.com/api/v4/projects/${GITLAB_PROJECT_ID}/pipelines\?ref=main\&status=success\&order_by=updated_at | jq '.[].id' | head -n3)" + +cp ../build/android/app-release.apk repo/fluffychat-latest.apk + +for PIPELINE in $PIPELINES +do + JOB="$(curl https://gitlab.com/api/v4/projects/${GITLAB_PROJECT_ID}/pipelines/$PIPELINE/jobs | jq -r '.[] | select(.name == "build_android_apk").id')" + if [ -n $JOB ]; then + URI="https://gitlab.com/api/v4/projects/${GITLAB_PROJECT_ID}/jobs/$JOB/artifacts/build/android/app-release.apk" + FILENAME="fluffychat-$PIPELINE.apk" + echo "Downloading $FILENAME from $URI ..." + wget --output-document="$FILENAME" "$URI" + mv "$FILENAME" repo + fi +done + +fdroid update --rename-apks +mkdir /fdroid && fdroid deploy +rm -rf /fdroid/archive +cd .. && mv -v /fdroid repo/nightly + +# building stable + RC repo + +rm -rf /fdroid fdroid/repo + +mkdir fdroid/repo + +cd fdroid +rm -f repo/*.apk + +cp config.stable.py config.py + +PIPELINES="$(curl https://gitlab.com/api/v4/projects/${GITLAB_PROJECT_ID}/pipelines\?scope=tags\&status=success\&order_by=updated_at | jq '.[].id' | head -n3)" + +for PIPELINE in $PIPELINES +do + JOB="$(curl https://gitlab.com/api/v4/projects/${GITLAB_PROJECT_ID}/pipelines/$PIPELINE/jobs | jq -r '.[] | select(.name == "build_android_apk").id')" + if [ -n $JOB ]; then + URI="https://gitlab.com/api/v4/projects/${GITLAB_PROJECT_ID}/jobs/$JOB/artifacts/build/android/app-release.apk" + FILENAME="fluffychat-$PIPELINE.apk" + echo "Downloading $FILENAME from $URI ..." + wget --output-document="$FILENAME" "$URI" + mv "$FILENAME" repo + fi +done + +fdroid update --rename-apks +mkdir /fdroid && fdroid deploy +rm -rf /fdroid/archive +cd .. && mv -v /fdroid repo/stable diff --git a/scripts/enable-android-google-services.patch b/scripts/enable-android-google-services.patch new file mode 100644 index 0000000..14101ed --- /dev/null +++ b/scripts/enable-android-google-services.patch @@ -0,0 +1,144 @@ +diff --git a/android/app/build.gradle b/android/app/build.gradle +index bb8e015cd..3ff4a7579 100644 +--- a/android/app/build.gradle ++++ b/android/app/build.gradle +@@ -2,7 +2,7 @@ plugins { + id "com.android.application" + id "kotlin-android" + id "dev.flutter.flutter-gradle-plugin" +- //id "com.google.gms.google-services" ++ id "com.google.gms.google-services" + } + + def localProperties = new Properties() +@@ -97,11 +97,12 @@ flutter { + } + + dependencies { +- //implementation 'com.google.firebase:firebase-messaging:19.0.1' // Workaround for https://github.com/microg/android_packages_apps_GmsCore/issues/313#issuecomment-617651698 ++ implementation 'com.google.firebase:firebase-messaging:19.0.1' ++ // Workaround for https://github.com/microg/android_packages_apps_GmsCore/issues/313#issuecomment-617651698 + implementation 'androidx.multidex:multidex:2.0.1' + coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.1.4") + } + + configurations.all { +- exclude group: 'com.google.android.gms' ++ //exclude group: 'com.google.android.gms' + } +\ No newline at end of file +diff --git a/android/app/proguard-rules.pro b/android/app/proguard-rules.pro +index d0e0fbc9..0a546da0 100644 +--- a/android/app/proguard-rules.pro ++++ b/android/app/proguard-rules.pro +@@ -1 +1,42 @@ +--keep class net.sqlcipher.** { *; } +\ No newline at end of file ++-optimizationpasses 5 ++## Flutter wrapper ++-keep class net.sqlcipher.** { *; } ++-keep class io.flutter.app.** { *; } ++-keep class io.flutter.plugin.** { *; } ++-keep class io.flutter.util.** { *; } ++-keep class io.flutter.view.** { *; } ++-keep class io.flutter.** { *; } ++-keep class io.flutter.plugins.** { *; } ++-dontwarn io.flutter.embedding.** ++ ++##---------------Begin: proguard configuration for Gson (Needed for flutter_local_notifications) ---------- ++# Gson uses generic type information stored in a class file when working with fields. Proguard ++# removes such information by default, so configure it to keep all of it. ++-keepattributes Signature ++ ++# For using GSON @Expose annotation ++-keepattributes *Annotation* ++ ++# Gson specific classes ++-dontwarn sun.misc.** ++ ++# Application classes that will be serialized/deserialized over Gson ++-keep class com.google.gson.examples.android.model.** { ; } ++ ++# Prevent proguard from stripping interface information from TypeAdapter, TypeAdapterFactory, ++# JsonSerializer, JsonDeserializer instances (so they can be used in @JsonAdapter) ++-keep class * extends com.google.gson.TypeAdapter ++-keep class * implements com.google.gson.TypeAdapterFactory ++-keep class * implements com.google.gson.JsonSerializer ++-keep class * implements com.google.gson.JsonDeserializer ++ ++# Prevent R8 from leaving Data object members always null ++-keepclassmembers,allowobfuscation class * { ++ @com.google.gson.annotations.SerializedName ; ++} ++ ++# Retain generic signatures of TypeToken and its subclasses with R8 version 3.0 and higher. ++-keep,allowobfuscation,allowshrinking class com.google.gson.reflect.TypeToken ++-keep,allowobfuscation,allowshrinking class * extends com.google.gson.reflect.TypeToken ++ ++##---------------End: proguard configuration for Gson (Needed for flutter_local_notifications) ---------- +\ No newline at end of file +diff --git a/android/app/src/main/kotlin/chat/fluffy/fluffychat/FcmPushService.kt b/android/app/src/main/kotlin/chat/fluffy/fluffychat/FcmPushService.kt +index d9930f55..510e9845 100644 +--- a/android/app/src/main/kotlin/chat/fluffy/fluffychat/FcmPushService.kt ++++ b/android/app/src/main/kotlin/chat/fluffy/fluffychat/FcmPushService.kt +@@ -1,4 +1,4 @@ +-/*package chat.fluffy.fluffychat ++package chat.fluffy.fluffychat + + import com.famedly.fcm_shared_isolate.FcmSharedIsolateService + +@@ -33,4 +33,3 @@ class FcmPushService : FcmSharedIsolateService() { + } + } + } +-*/ +\ No newline at end of file +diff --git a/android/settings.gradle b/android/settings.gradle +index b2fd960a..fdb01a4d 100644 +--- a/android/settings.gradle ++++ b/android/settings.gradle +@@ -20,7 +20,7 @@ plugins { + id "dev.flutter.flutter-plugin-loader" version "1.0.0" + id "com.android.application" version "8.7.3" apply false + id "org.jetbrains.kotlin.android" version "2.1.10" apply false +- // id "com.google.gms.google-services" version "4.3.8" apply false ++ id "com.google.gms.google-services" version "4.3.8" apply false + } + + include ":app" +\ No newline at end of file +diff --git a/lib/utils/background_push.dart b/lib/utils/background_push.dart +index 1ba2659a..989f458e 100644 +--- a/lib/utils/background_push.dart ++++ b/lib/utils/background_push.dart +@@ -39,7 +39,7 @@ import '../config/setting_keys.dart'; + import '../widgets/matrix.dart'; + import 'platform_infos.dart'; + +-//import 'package:fcm_shared_isolate/fcm_shared_isolate.dart'; ++import 'package:fcm_shared_isolate/fcm_shared_isolate.dart'; + + class NoTokenException implements Exception { + String get cause => 'Cannot get firebase token'; +@@ -64,7 +64,7 @@ class BackgroundPush { + + final pendingTests = >{}; + +- final dynamic firebase = null; //FcmSharedIsolate(); ++ final dynamic firebase = FcmSharedIsolate(); + + DateTime? lastReceivedPush; + +diff --git a/pubspec.yaml b/pubspec.yaml +index fb3e3ca4..039b2ccc 100644 +--- a/pubspec.yaml ++++ b/pubspec.yaml +@@ -25,7 +25,7 @@ dependencies: + dynamic_color: ^1.7.0 + emoji_picker_flutter: ^3.1.0 + emojis: ^0.9.9 +- #fcm_shared_isolate: ^0.2.0 ++ fcm_shared_isolate: ^0.2.0 + file_picker: ^8.1.2 + file_selector: ^1.0.3 + flutter: diff --git a/scripts/generate-locale-config.sh b/scripts/generate-locale-config.sh new file mode 100755 index 0000000..5f1b487 --- /dev/null +++ b/scripts/generate-locale-config.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +# Directory containing the ARB files +l10n_dir="./assets/l10n" +# Target directory for the locale_config.xml file +xml_dir="./android/app/src/main/res/xml" + +# Create the target directory if it does not exist +mkdir -p "$xml_dir" + +# Output file name +xml_file="$xml_dir/locale_config.xml" + +rm -rf "$xml_file" + +# XML Header +echo '' > "$xml_file" +echo '' >> "$xml_file" + +# Search for ARB files and extract language codes +for file in "$l10n_dir"/intl_*.arb; do + # Extract language code + language_code=$(basename "$file" | cut -d'_' -f2 | cut -d'.' -f1) + # Write language code to the XML file + echo " " >> "$xml_file" +done + +# XML Footer +echo '' >> "$xml_file" + +echo "locale_config.xml file has been successfully created in the $xml_dir directory." diff --git a/scripts/generate_command_hints_glue.sh b/scripts/generate_command_hints_glue.sh new file mode 100755 index 0000000..f0c941c --- /dev/null +++ b/scripts/generate_command_hints_glue.sh @@ -0,0 +1,30 @@ +#!/usr/bin/env bash +# Generates some glue code for translation of /command hints. + +# How to use this: +# - Add any new hints to assets/l10n/intl_en.arb +# They must be of the form commandHint_ with in lowercase. +# - Run this script to regenerate the glue code +# - Run flutter test to see if you did everything right + +# Looking to add descriptions for a new command, but don't know what it does? +# It is likely defined here (in registerDefaultCommands()): +# https://gitlab.com/famedly/company/frontend/famedlysdk/-/blob/main/lib/src/utils/commands_extension.dart + +echo "\ +// This file is auto-generated using scripts/generate_command_hints_glue.sh. + +import 'package:flutter_gen/gen_l10n/l10n.dart'; + +String commandHint(L10n l10n, String command) { + switch (command) { +$(sed -n \ + 's/[[:blank:]]*\"\(commandHint_\([[:lower:]]*\)\)\".*/ case "\2":\ + return l10n.\1;/p' \ + assets/l10n/intl_en.arb +) + default: + return \"\"; + } +}\ +" > lib/pages/chat/command_hints.dart diff --git a/scripts/integration-check-release-build.sh b/scripts/integration-check-release-build.sh new file mode 100755 index 0000000..5e32918 --- /dev/null +++ b/scripts/integration-check-release-build.sh @@ -0,0 +1,26 @@ +#!/usr/bin/env bash + +# generate a temporary signing key adn apply its configuration +cd android +KEYFILE="$(pwd)/key.jks" +echo "Generating signing configuration with $KEYFILE..." +keytool -genkey -keyalg RSA -alias key -keysize 4096 -dname "cn=FluffyChat CI, ou=Head of bad integration tests, o=FluffyChat HQ, c=TLH" -keypass FLUFFYCHAT -storepass FLUFFYCHAT -validity 1 -keystore "$KEYFILE" -storetype "pkcs12" +echo "storePassword=FLUFFYCHAT" >> key.properties +echo "keyPassword=FLUFFYCHAT" >> key.properties +echo "keyAlias=key" >> key.properties +echo "storeFile=$KEYFILE" >> key.properties +ls | grep key +cd .. + +# build release mode APK +flutter pub get +flutter build apk --release + +# install and launch APK +flutter install +adb shell am start -n chat.fluffy.fluffychat/chat.fluffy.fluffychat.MainActivity + +sleep 5 + +# check whether FluffyChat runs +adb shell ps | awk '{print $9}' | grep chat.fluffy.fluffychat diff --git a/scripts/integration-create-environment-variables.sh b/scripts/integration-create-environment-variables.sh new file mode 100755 index 0000000..d2b3a8f --- /dev/null +++ b/scripts/integration-create-environment-variables.sh @@ -0,0 +1,6 @@ +#!/usr/bin/env bash + +export USER1_NAME="alice" +export USER1_PW="AliceInWonderland" +export USER2_NAME="bob" +export USER2_PW="JoWirSchaffenDas" diff --git a/scripts/integration-prepare-homeserver.sh b/scripts/integration-prepare-homeserver.sh new file mode 100755 index 0000000..6bbee11 --- /dev/null +++ b/scripts/integration-prepare-homeserver.sh @@ -0,0 +1,60 @@ +#!/usr/bin/env bash + +if [ -z $HOMESERVER ]; then + echo "Please ensure HOMESERVER environment variable is set to the IP or hostname of the homeserver." + exit 1 +fi +if [ -z $USER1_NAME ]; then + echo "Please ensure USER1_NAME environment variable is set to first user name." + exit 1 +fi +if [ -z $USER1_PW ]; then + echo "Please ensure USER1_PW environment variable is set to first user password." + exit 1 +fi +if [ -z $USER2_NAME ]; then + echo "Please ensure USER2_NAME environment variable is set to second user name." + exit 1 +fi +if [ -z $USER2_PW ]; then + echo "Please ensure USER2_PW environment variable is set to second user password." + exit 1 +fi + +echo "Waiting for homeserver to be available... (GET http://$HOMESERVER/_matrix/client/v3/login)" + +while ! curl -XGET "http://$HOMESERVER/_matrix/client/v3/login" >/dev/null 2>/dev/null; do + sleep 2 +done + +echo "Homeserver is up." + +# create users + +curl -fS --retry 3 -XPOST -d "{\"username\":\"$USER1_NAME\", \"password\":\"$USER1_PW\", \"inhibit_login\":true, \"auth\": {\"type\":\"m.login.dummy\"}}" "http://$HOMESERVER/_matrix/client/r0/register" +curl -fS --retry 3 -XPOST -d "{\"username\":\"$USER2_NAME\", \"password\":\"$USER2_PW\", \"inhibit_login\":true, \"auth\": {\"type\":\"m.login.dummy\"}}" "http://$HOMESERVER/_matrix/client/r0/register" + +usertoken1=$(curl -fS --retry 3 "http://$HOMESERVER/_matrix/client/r0/login" -H "Content-Type: application/json" -d "{\"type\": \"m.login.password\", \"identifier\": {\"type\": \"m.id.user\",\"user\": \"$USER1_NAME\"},\"password\":\"$USER1_PW\"}" | jq -r '.access_token') +usertoken2=$(curl -fS --retry 3 "http://$HOMESERVER/_matrix/client/r0/login" -H "Content-Type: application/json" -d "{\"type\": \"m.login.password\", \"identifier\": {\"type\": \"m.id.user\",\"user\": \"$USER2_NAME\"},\"password\":\"$USER2_PW\"}" | jq -r '.access_token') + + +# get usernames' mxids +mxid1=$(curl -fS --retry 3 "http://$HOMESERVER/_matrix/client/r0/account/whoami" -H "Authorization: Bearer $usertoken1" | jq -r .user_id) +mxid2=$(curl -fS --retry 3 "http://$HOMESERVER/_matrix/client/r0/account/whoami" -H "Authorization: Bearer $usertoken2" | jq -r .user_id) + +# setting the display name to username +curl -fS --retry 3 -XPUT -d "{\"displayname\":\"$USER1_NAME\"}" "http://$HOMESERVER/_matrix/client/v3/profile/$mxid1/displayname" -H "Authorization: Bearer $usertoken1" +curl -fS --retry 3 -XPUT -d "{\"displayname\":\"$USER2_NAME\"}" "http://$HOMESERVER/_matrix/client/v3/profile/$mxid2/displayname" -H "Authorization: Bearer $usertoken2" + +echo "Set display names" + +# create new room to invite user too +roomID=$(curl --retry 3 --silent --fail -XPOST -d "{\"name\":\"$USER2_NAME\", \"is_direct\": true}" "http://$HOMESERVER/_matrix/client/r0/createRoom?access_token=$usertoken2" | jq -r '.room_id') +echo "Created room '$roomID'" + +# send message in created room +curl --retry 3 --fail --silent -XPOST -d '{"msgtype":"m.text", "body":"joined room successfully"}' "http://$HOMESERVER/_matrix/client/r0/rooms/$roomID/send/m.room.message?access_token=$usertoken2" +echo "Sent message" + +curl -fS --retry 3 -XPOST -d "{\"user_id\":\"$mxid1\"}" "http://$HOMESERVER/_matrix/client/r0/rooms/$roomID/invite?access_token=$usertoken2" +echo "Invited $USER1_NAME" diff --git a/scripts/integration-prepare-host.sh b/scripts/integration-prepare-host.sh new file mode 100755 index 0000000..f110aab --- /dev/null +++ b/scripts/integration-prepare-host.sh @@ -0,0 +1,6 @@ +#!/usr/bin/env bash +if ! command -v apk &>/dev/null; then + apt update && apt install -y -qq docker.io ldnsutils grep scrcpy ffmpeg +else + apk update && apk add docker drill grep scrcpy ffmpeg +fi diff --git a/scripts/integration-server-conduit.sh b/scripts/integration-server-conduit.sh new file mode 100755 index 0000000..f4b031f --- /dev/null +++ b/scripts/integration-server-conduit.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash +docker run -d \ + -e CONDUIT_SERVER_NAME="localhost" \ + -e CONDUIT_PORT="8008" \ + -e CONDUIT_DATABASE_BACKEND="rocksdb" \ + -e CONDUIT_ALLOW_REGISTRATION=true \ + -e CONDUIT_ALLOW_FEDERATION=true \ + -e CONDUIT_MAX_REQUEST_SIZE="20000000" \ + -e CONDUIT_TRUSTED_SERVERS="[\"conduit.rs\"]" \ + -e CONDUIT_MAX_CONCURRENT_REQUESTS="100" \ + -e CONDUIT_LOG="info,rocket=off,_=off,sled=off" \ + --name conduit -p 80:8008 matrixconduit/matrix-conduit:latest diff --git a/scripts/integration-server-dendrite.sh b/scripts/integration-server-dendrite.sh new file mode 100755 index 0000000..ee23da1 --- /dev/null +++ b/scripts/integration-server-dendrite.sh @@ -0,0 +1,14 @@ +#!/usr/bin/env bash +chown -R 991:991 integration_test/dendrite + +# creating integration test SSL certificates +docker run --rm --entrypoint="" \ + --volume="$(pwd)/integration_test/dendrite/data":/mnt:rw \ + matrixdotorg/dendrite-monolith:latest \ + /usr/bin/generate-keys \ + -private-key /mnt/matrix_key.pem \ + -tls-cert /mnt/server.crt \ + -tls-key /mnt/server.key + +docker run -d --volume="$(pwd)/integration_test/dendrite/data":/etc/dendrite:rw \ + --name dendrite -p 80:8008 matrixdotorg/dendrite-monolith:latest -really-enable-open-registration diff --git a/scripts/integration-server-synapse.sh b/scripts/integration-server-synapse.sh new file mode 100755 index 0000000..03d2184 --- /dev/null +++ b/scripts/integration-server-synapse.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +docker run -d --name synapse --tmpfs /data \ + --volume="$(pwd)/integration_test/synapse/data/homeserver.yaml":/data/homeserver.yaml:rw \ + --volume="$(pwd)/integration_test/synapse/data/localhost.log.config":/data/localhost.log.config:rw \ + -p 80:80 matrixdotorg/synapse:latest diff --git a/scripts/integration-start-avd.sh b/scripts/integration-start-avd.sh new file mode 100755 index 0000000..fb608e4 --- /dev/null +++ b/scripts/integration-start-avd.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +chmod 777 -R /dev/kvm +adb start-server +emulator -avd test -wipe-data -no-audio -no-boot-anim -no-window -accel on -gpu swiftshader_indirect diff --git a/scripts/package-windows.ps1 b/scripts/package-windows.ps1 new file mode 100644 index 0000000..b3ba0e7 --- /dev/null +++ b/scripts/package-windows.ps1 @@ -0,0 +1,5 @@ +Write-Output "$WINDOWN_PFX" +Move-Item -Path $WINDOWS_PFX -Destination fluffychat.pem +certutil -decode fluffychat.pem fluffychat.pfx + +flutter pub run msix:create -c fluffychat.pfx -p $WINDOWS_PFX_PASS --sign-msix true --install-certificate false diff --git a/scripts/prepare-android-release.sh b/scripts/prepare-android-release.sh new file mode 100755 index 0000000..a2a11dc --- /dev/null +++ b/scripts/prepare-android-release.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env bash +cd android +echo $FDROID_KEY | base64 --decode --ignore-garbage > key.jks +echo "storePassword=${FDROID_KEY_PASS}" >> key.properties +echo "keyPassword=${FDROID_KEY_PASS}" >> key.properties +echo "keyAlias=key" >> key.properties +echo "storeFile=../key.jks" >> key.properties +echo $PLAYSTORE_DEPLOY_KEY >> keys.json +ls | grep key +bundle install +bundle update fastlane +bundle exec fastlane set_build_code_internal +cd .. diff --git a/scripts/prepare-fdroid.sh b/scripts/prepare-fdroid.sh new file mode 100755 index 0000000..f9384b0 --- /dev/null +++ b/scripts/prepare-fdroid.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash + +cp -r android/fastlane fdroid/metadata/chat.fluffy.fluffychat +cd fdroid +echo $FDROID_KEY | base64 --decode --ignore-garbage > key.jks +echo $FDROID_NIGHTLY_KEY | base64 --decode --ignore-garbage > key.nightly.jks +echo "keypass=\"${FDROID_KEY_PASS}\"" >> config.stable.py +echo "keystorepass=\"${FDROID_KEY_PASS}\"" >> config.stable.py +echo "keypass=\"${FDROID_NIGHTLY_KEY_PASS}\"" >> config.nightly.py +echo "keystorepass=\"${FDROID_NIGHTLY_KEY_PASS}\"" >> config.nightly.py +chmod 600 config.stable.py key.jks config.nightly.py key.nightly.jks +cd .. diff --git a/scripts/prepare-macos.sh b/scripts/prepare-macos.sh new file mode 100755 index 0000000..95f2a9c --- /dev/null +++ b/scripts/prepare-macos.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash + +if ! type "flutter" > /dev/null; then + brew install flutter +fi + +brew install libolm + diff --git a/scripts/prepare-web.sh b/scripts/prepare-web.sh new file mode 100755 index 0000000..86c201a --- /dev/null +++ b/scripts/prepare-web.sh @@ -0,0 +1,10 @@ +#!/bin/sh -ve +rm -rf assets/js/package + +OLM_VERSION=$(cat pubspec.yaml | yq .dependencies.flutter_olm) +DOWNLOAD_PATH="https://github.com/famedly/olm/releases/download/v$OLM_VERSION/olm.zip" + +cd assets/js/ && curl -L $DOWNLOAD_PATH > olm.zip && cd ../../ +cd assets/js/ && unzip olm.zip && cd ../../ +cd assets/js/ && rm olm.zip && cd ../../ +cd assets/js/ && mv javascript package && cd ../../ diff --git a/scripts/prepare-windows.ps1 b/scripts/prepare-windows.ps1 new file mode 100644 index 0000000..97451b4 --- /dev/null +++ b/scripts/prepare-windows.ps1 @@ -0,0 +1,5 @@ +choco install flutter cmake --installargs 'ADD_CMAKE_TO_PATH=System' -y +Import-Module "$env:ChocolateyInstall\helpers\chocolateyProfile.psm1" +refreshenv + +flutter config --no-analytics diff --git a/scripts/release-ios-testflight.sh b/scripts/release-ios-testflight.sh new file mode 100755 index 0000000..b175266 --- /dev/null +++ b/scripts/release-ios-testflight.sh @@ -0,0 +1,16 @@ +#!/bin/sh -ve +git apply ./scripts/enable-android-google-services.patch +yq eval '.dependencies.fcm_shared_isolate = "0.1.0"' -i pubspec.yaml # Workaround: 0.2.0 does not work on iOS +flutter clean +flutter pub get +cd ios +rm -rf Pods +rm -f Podfile.lock +arch -x86_64 pod install +arch -x86_64 pod update +cd .. +flutter build ios --release +cd ios +bundle update fastlane +bundle exec fastlane beta +cd .. \ No newline at end of file diff --git a/scripts/update-dependencies.sh b/scripts/update-dependencies.sh new file mode 100755 index 0000000..5f783fc --- /dev/null +++ b/scripts/update-dependencies.sh @@ -0,0 +1,6 @@ +#!/bin/sh -ve +flutter pub upgrade --major-versions +flutter pub get +dart fix --apply +flutter format lib test +flutter pub run import_sorter:main --no-comments \ No newline at end of file diff --git a/snap/gui/fluffychat.desktop b/snap/gui/fluffychat.desktop new file mode 100755 index 0000000..8861487 --- /dev/null +++ b/snap/gui/fluffychat.desktop @@ -0,0 +1,9 @@ +[Desktop Entry] +Name=FluffyChat +GenericName=Matrix Client +Comment=Chat with your friends +Exec=fluffychat +Icon=${SNAP}/meta/gui/fluffychat.png +Terminal=false +Type=Application +Categories=Network;Chat;InstantMessaging; diff --git a/snap/gui/fluffychat.png b/snap/gui/fluffychat.png new file mode 100644 index 0000000..e007649 Binary files /dev/null and b/snap/gui/fluffychat.png differ diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml new file mode 100644 index 0000000..0e5a32f --- /dev/null +++ b/snap/snapcraft.yaml @@ -0,0 +1,112 @@ +name: fluffychat +title: FluffyChat +base: core24 +version: git +license: AGPL-3.0 +summary: The cutest messenger in the Matrix network +description: | + FluffyChat is an open source, nonprofit and cute matrix messenger app. The app is easy to use but secure and decentralized. + + + ## Features + + - Send all kinds of messages, images and files + - Voice messages + - Location sharing + - Push notifications + - Unlimited private and public group chats + - Public channels with thousands of participants + - Feature rich group moderation including all matrix features + - Discover and join public groups + - Dark mode + - Hides complexity of Matrix IDs behind simple QR codes + - Custom emotes and stickers + - Video calls via sharing links to Jitsi + - Spaces + - Compatible with Element, Nheko, NeoChat and all other Matrix apps + - End to end encryption + - Emoji verification & cross signing + - And much more... + + + ## FluffyChat comes with a dream + + Imagine a world where everyone can choose the messenger they like and is still able to chat with all of their friends. + + A world where there are no companies spying on you when you send selfies to friends and lovers. + + And a world where apps are made for fluffyness and not for profit. ♥ + + Join the community: https://matrix.to/#/#fluffychat:matrix.org + Website: http://fluffychat.im + Microblog: https://mastodon.art/@krille + +grade: stable +confinement: strict + +platforms: + amd64: + build-on: amd64 + arm64: + build-on: arm64 + +parts: + olm: + plugin: cmake + cmake-parameters: + - -DCMAKE_INSTALL_PREFIX=/usr + source: https://gitlab.matrix.org/matrix-org/olm.git + source-type: git + source-tag: '3.2.14' + build-packages: + - g++ + + fluffychat: + plugin: flutter + source: . + override-build: | + # Workaround for Flutter build error: + rm -rf build + craftctl default + build-packages: + - libsecret-1-dev + - libjsoncpp-dev + - libssl-dev + - curl + - libpciaccess-dev + stage-packages: + - libsecret-1-0 + - libjsoncpp25 + - libpciaccess0 + +slots: + dbus-svc: + interface: dbus + bus: session + name: chat.fluffy.fluffychat + +apps: + fluffychat: + command: fluffychat + extensions: [ gnome ] + plugs: + - audio-playback + - desktop + - desktop-legacy + - home + - network + - network-manager + - network-manager-observe + - opengl + - removable-media + - browser-support + - password-manager-service + slots: + - dbus-svc + # Workaround for: + # https://github.com/flutter-webrtc/flutter-webrtc/issues/1212#issuecomment-1611899344 + environment: + XDG_DATA_HOME: $SNAP_USER_DATA + XDG_DATA_DIRS: $SNAP/usr/share + GDK_GL: gles + LD_LIBRARY_PATH: "$LD_LIBRARY_PATH:$SNAP/lib:$SNAP/usr/lib/$SNAPCRAFT_ARCH_TRIPLET" \ No newline at end of file diff --git a/test/archive_test.dart b/test/archive_test.dart new file mode 100644 index 0000000..25bb090 --- /dev/null +++ b/test/archive_test.dart @@ -0,0 +1,10 @@ +import 'package:flutter_test/flutter_test.dart'; + +void main() { + testWidgets('Test if the widget can be created', (WidgetTester tester) async { + /*await tester.pumpWidget(FluffyChatApp( + testWidget: Archive(), + testClient: await testClient(loggedIn: true), + ));*/ + }); +} diff --git a/test/command_hint_test.dart b/test/command_hint_test.dart new file mode 100644 index 0000000..e56f060 --- /dev/null +++ b/test/command_hint_test.dart @@ -0,0 +1,25 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:flutter_test/flutter_test.dart'; + +import 'utils/test_client.dart'; + +void main() async { + test('Check for missing /command hints', () async { + final translated = + jsonDecode(File('assets/l10n/intl_en.arb').readAsStringSync()) + .keys + .where((String k) => k.startsWith('commandHint_')) + .map((k) => k.replaceFirst('commandHint_', '')); + final commands = (await prepareTestClient()).commands.keys; + final missing = commands.where((c) => !translated.contains(c)).toList(); + + expect( + 0, + missing.length, + reason: + 'missing hints for $missing\nAdding hints? See scripts/generate_command_hints_glue.sh', + ); + }); +} diff --git a/test/homeserver_picker_test.dart b/test/homeserver_picker_test.dart new file mode 100644 index 0000000..054f49c --- /dev/null +++ b/test/homeserver_picker_test.dart @@ -0,0 +1,17 @@ +//import 'package:fluffychat/pages/homeserver_picker.dart'; +//import 'package:fluffychat/main.dart'; + +import 'package:flutter_test/flutter_test.dart'; + +//import 'utils/test_client.dart'; + +void main() { + testWidgets('Test if the widget can be created', (WidgetTester tester) async { + /*await tester.pumpWidget( + FluffyChatApp( + client: await prepareTestClient(), + testWidget: HomeserverPicker(), + ), + );*/ + }); +} diff --git a/test/utils/test_client.dart.txt b/test/utils/test_client.dart.txt new file mode 100644 index 0000000..ec3c0b0 --- /dev/null +++ b/test/utils/test_client.dart.txt @@ -0,0 +1,38 @@ +// ignore_for_file: depend_on_referenced_packages + +import 'package:matrix/encryption/utils/key_verification.dart'; +import 'package:matrix/matrix.dart'; + +Future prepareTestClient({ + bool loggedIn = false, + Uri? homeserver, + String id = 'FluffyChat Widget Test', +}) async { + homeserver ??= Uri.parse('https://fakeserver.notexisting'); + final client = Client( + 'FluffyChat Widget Tests', + httpClient: FakeMatrixApi() + ..api['GET']!['/.well-known/matrix/client'] = (req) => {}, + verificationMethods: { + KeyVerificationMethod.numbers, + KeyVerificationMethod.emoji, + }, + importantStateEvents: { + 'im.ponies.room_emotes', // we want emotes to work properly + }, + databaseBuilder: FlutterHiveCollectionsDatabase.databaseBuilder, + supportedLoginTypes: { + AuthenticationTypes.password, + AuthenticationTypes.sso, + }, + ); + await client.checkHomeserver(homeserver); + if (loggedIn) { + await client.login( + LoginType.mLoginToken, + identifier: AuthenticationUserIdentifier(user: '@alice:example.invalid'), + password: '1234', + ); + } + return client; +} diff --git a/test/widget_test.dart b/test/widget_test.dart new file mode 100644 index 0000000..7d1d98e --- /dev/null +++ b/test/widget_test.dart @@ -0,0 +1,20 @@ +// This is a basic Flutter widget test. +// +// To perform an interaction with a widget in your test, use the WidgetTester +// utility that Flutter provides. For example, you can send tap and scroll +// gestures. You can also use WidgetTester to find child widgets in the widget +// tree, read text, and verify that the values of widget properties are correct. + +//import 'package:fluffychat/main.dart'; + +import 'package:flutter_test/flutter_test.dart'; + +//import 'utils/test_client.dart'; + +void main() { + testWidgets('Test if the app starts', (WidgetTester tester) async { + /* await tester.pumpWidget(FluffyChatApp( + client: await prepareTestClient(), + ));*/ + }); +} diff --git a/web/auth.html b/web/auth.html new file mode 100644 index 0000000..806485b --- /dev/null +++ b/web/auth.html @@ -0,0 +1,13 @@ + +Authentication complete +

Authentication is complete. If this does not happen automatically, please close the window.

+ \ No newline at end of file diff --git a/web/favicon.png b/web/favicon.png new file mode 100644 index 0000000..e062b83 Binary files /dev/null and b/web/favicon.png differ diff --git a/web/icons/Icon-192.png b/web/icons/Icon-192.png new file mode 100644 index 0000000..6003f5c Binary files /dev/null and b/web/icons/Icon-192.png differ diff --git a/web/icons/Icon-512.png b/web/icons/Icon-512.png new file mode 100644 index 0000000..f652f24 Binary files /dev/null and b/web/icons/Icon-512.png differ diff --git a/web/index.html b/web/index.html new file mode 100644 index 0000000..993109d --- /dev/null +++ b/web/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + FluffyChat + + + + + + + + + + + + + + + + + + diff --git a/web/manifest.json b/web/manifest.json new file mode 100644 index 0000000..e4f6c31 --- /dev/null +++ b/web/manifest.json @@ -0,0 +1,23 @@ +{ + "name": "FluffyChat", + "short_name": "FluffyChat", + "start_url": ".", + "display": "standalone", + "background_color": "#0175C2", + "theme_color": "#0175C2", + "description": "The cutest messenger in the Matrix network", + "orientation": "portrait-primary", + "prefer_related_applications": false, + "icons": [ + { + "src": "icons/Icon-192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "icons/Icon-512.png", + "sizes": "512x512", + "type": "image/png" + } + ] +} \ No newline at end of file diff --git a/web/splash/img/dark-1x.png b/web/splash/img/dark-1x.png new file mode 100644 index 0000000..f4c0bdb Binary files /dev/null and b/web/splash/img/dark-1x.png differ diff --git a/web/splash/img/dark-2x.png b/web/splash/img/dark-2x.png new file mode 100644 index 0000000..dafa3b7 Binary files /dev/null and b/web/splash/img/dark-2x.png differ diff --git a/web/splash/img/dark-3x.png b/web/splash/img/dark-3x.png new file mode 100644 index 0000000..b627f52 Binary files /dev/null and b/web/splash/img/dark-3x.png differ diff --git a/web/splash/img/dark-4x.png b/web/splash/img/dark-4x.png new file mode 100644 index 0000000..0d1d2a7 Binary files /dev/null and b/web/splash/img/dark-4x.png differ diff --git a/web/splash/img/light-1x.png b/web/splash/img/light-1x.png new file mode 100644 index 0000000..f4c0bdb Binary files /dev/null and b/web/splash/img/light-1x.png differ diff --git a/web/splash/img/light-2x.png b/web/splash/img/light-2x.png new file mode 100644 index 0000000..dafa3b7 Binary files /dev/null and b/web/splash/img/light-2x.png differ diff --git a/web/splash/img/light-3x.png b/web/splash/img/light-3x.png new file mode 100644 index 0000000..b627f52 Binary files /dev/null and b/web/splash/img/light-3x.png differ diff --git a/web/splash/img/light-4x.png b/web/splash/img/light-4x.png new file mode 100644 index 0000000..0d1d2a7 Binary files /dev/null and b/web/splash/img/light-4x.png differ diff --git a/web/splash/style.css b/web/splash/style.css new file mode 100644 index 0000000..6654d94 --- /dev/null +++ b/web/splash/style.css @@ -0,0 +1,45 @@ +body, +html { + margin: 0; + height: 100%; + background: #ffffff; + background-size: 100% 100%; +} + +.center { + margin: 0; + position: absolute; + top: 50%; + left: 50%; + -ms-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); +} + +.contain { + display: block; + width: 100%; + height: 100%; + object-fit: contain; +} + +.stretch { + display: block; + width: 100%; + height: 100%; +} + +.cover { + display: block; + width: 100%; + height: 100%; + object-fit: cover; +} + +@media (prefers-color-scheme: dark) { + body { + margin: 0; + height: 100%; + background: #000000; + background-size: 100% 100%; + } +} \ No newline at end of file diff --git a/windows/.gitignore b/windows/.gitignore new file mode 100644 index 0000000..d492d0d --- /dev/null +++ b/windows/.gitignore @@ -0,0 +1,17 @@ +flutter/ephemeral/ + +# Visual Studio user-specific files. +*.suo +*.user +*.userosscache +*.sln.docstates + +# Visual Studio build-related files. +x64/ +x86/ + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ diff --git a/windows/CMakeLists.txt b/windows/CMakeLists.txt new file mode 100644 index 0000000..1c2b994 --- /dev/null +++ b/windows/CMakeLists.txt @@ -0,0 +1,101 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.14) +project(fluffychat LANGUAGES CXX) + +# The name of the executable created for the application. Change this to change +# the on-disk name of your application. +set(BINARY_NAME "fluffychat") + +# Explicitly opt in to modern CMake behaviors to avoid warnings with recent +# versions of CMake. +cmake_policy(SET CMP0063 NEW) + +# Define build configuration option. +get_property(IS_MULTICONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) +if(IS_MULTICONFIG) + set(CMAKE_CONFIGURATION_TYPES "Debug;Profile;Release" + CACHE STRING "" FORCE) +else() + if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE "Debug" CACHE + STRING "Flutter build mode" FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS + "Debug" "Profile" "Release") + endif() +endif() +# Define settings for the Profile build mode. +set(CMAKE_EXE_LINKER_FLAGS_PROFILE "${CMAKE_EXE_LINKER_FLAGS_RELEASE}") +set(CMAKE_SHARED_LINKER_FLAGS_PROFILE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE}") +set(CMAKE_C_FLAGS_PROFILE "${CMAKE_C_FLAGS_RELEASE}") +set(CMAKE_CXX_FLAGS_PROFILE "${CMAKE_CXX_FLAGS_RELEASE}") + +# Use Unicode for all projects. +add_definitions(-DUNICODE -D_UNICODE) + +# Compilation settings that should be applied to most targets. +# +# Be cautious about adding new options here, as plugins use this function by +# default. In most cases, you should add new options to specific targets instead +# of modifying this function. +function(APPLY_STANDARD_SETTINGS TARGET) + target_compile_features(${TARGET} PUBLIC cxx_std_17) + target_compile_options(${TARGET} PRIVATE /W4 /WX /wd"4100") + target_compile_options(${TARGET} PRIVATE /EHsc) + target_compile_definitions(${TARGET} PRIVATE "_HAS_EXCEPTIONS=0") + target_compile_definitions(${TARGET} PRIVATE "$<$:_DEBUG>") +endfunction() + +# Flutter library and tool build rules. +set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") +add_subdirectory(${FLUTTER_MANAGED_DIR}) + +# Application build; see runner/CMakeLists.txt. +add_subdirectory("runner") + +# Generated plugin build rules, which manage building the plugins and adding +# them to the application. +include(flutter/generated_plugins.cmake) + + +# === Installation === +# Support files are copied into place next to the executable, so that it can +# run in place. This is done instead of making a separate bundle (as on Linux) +# so that building and running from within Visual Studio will work. +set(BUILD_BUNDLE_DIR "$") +# Make the "install" step default, as it's required to run. +set(CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD 1) +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) +endif() + +set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") +set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}") + +install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +if(PLUGIN_BUNDLED_LIBRARIES) + install(FILES "${PLUGIN_BUNDLED_LIBRARIES}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endif() + +# Fully re-copy the assets directory on each build to avoid having stale files +# from a previous install. +set(FLUTTER_ASSET_DIR_NAME "flutter_assets") +install(CODE " + file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") + " COMPONENT Runtime) +install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" + DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) + +# Install the AOT library on non-Debug builds only. +install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + CONFIGURATIONS Profile;Release + COMPONENT Runtime) diff --git a/windows/flutter/CMakeLists.txt b/windows/flutter/CMakeLists.txt new file mode 100644 index 0000000..930d207 --- /dev/null +++ b/windows/flutter/CMakeLists.txt @@ -0,0 +1,104 @@ +# This file controls Flutter-level build steps. It should not be edited. +cmake_minimum_required(VERSION 3.14) + +set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") + +# Configuration provided via flutter tool. +include(${EPHEMERAL_DIR}/generated_config.cmake) + +# TODO: Move the rest of this into files in ephemeral. See +# https://github.com/flutter/flutter/issues/57146. +set(WRAPPER_ROOT "${EPHEMERAL_DIR}/cpp_client_wrapper") + +# === Flutter Library === +set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/flutter_windows.dll") + +# Published to parent scope for install step. +set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) +set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) +set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) +set(AOT_LIBRARY "${PROJECT_DIR}/build/windows/app.so" PARENT_SCOPE) + +list(APPEND FLUTTER_LIBRARY_HEADERS + "flutter_export.h" + "flutter_windows.h" + "flutter_messenger.h" + "flutter_plugin_registrar.h" + "flutter_texture_registrar.h" +) +list(TRANSFORM FLUTTER_LIBRARY_HEADERS PREPEND "${EPHEMERAL_DIR}/") +add_library(flutter INTERFACE) +target_include_directories(flutter INTERFACE + "${EPHEMERAL_DIR}" +) +target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}.lib") +add_dependencies(flutter flutter_assemble) + +# === Wrapper === +list(APPEND CPP_WRAPPER_SOURCES_CORE + "core_implementations.cc" + "standard_codec.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_CORE PREPEND "${WRAPPER_ROOT}/") +list(APPEND CPP_WRAPPER_SOURCES_PLUGIN + "plugin_registrar.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_PLUGIN PREPEND "${WRAPPER_ROOT}/") +list(APPEND CPP_WRAPPER_SOURCES_APP + "flutter_engine.cc" + "flutter_view_controller.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_APP PREPEND "${WRAPPER_ROOT}/") + +# Wrapper sources needed for a plugin. +add_library(flutter_wrapper_plugin STATIC + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_PLUGIN} +) +apply_standard_settings(flutter_wrapper_plugin) +set_target_properties(flutter_wrapper_plugin PROPERTIES + POSITION_INDEPENDENT_CODE ON) +set_target_properties(flutter_wrapper_plugin PROPERTIES + CXX_VISIBILITY_PRESET hidden) +target_link_libraries(flutter_wrapper_plugin PUBLIC flutter) +target_include_directories(flutter_wrapper_plugin PUBLIC + "${WRAPPER_ROOT}/include" +) +add_dependencies(flutter_wrapper_plugin flutter_assemble) + +# Wrapper sources needed for the runner. +add_library(flutter_wrapper_app STATIC + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_APP} +) +apply_standard_settings(flutter_wrapper_app) +target_link_libraries(flutter_wrapper_app PUBLIC flutter) +target_include_directories(flutter_wrapper_app PUBLIC + "${WRAPPER_ROOT}/include" +) +add_dependencies(flutter_wrapper_app flutter_assemble) + +# === Flutter tool backend === +# _phony_ is a non-existent file to force this command to run every time, +# since currently there's no way to get a full input/output list from the +# flutter tool. +set(PHONY_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/_phony_") +set_source_files_properties("${PHONY_OUTPUT}" PROPERTIES SYMBOLIC TRUE) +add_custom_command( + OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} + ${CPP_WRAPPER_SOURCES_CORE} ${CPP_WRAPPER_SOURCES_PLUGIN} + ${CPP_WRAPPER_SOURCES_APP} + ${PHONY_OUTPUT} + COMMAND ${CMAKE_COMMAND} -E env + ${FLUTTER_TOOL_ENVIRONMENT} + "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.bat" + windows-x64 $ + VERBATIM +) +add_custom_target(flutter_assemble DEPENDS + "${FLUTTER_LIBRARY}" + ${FLUTTER_LIBRARY_HEADERS} + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_PLUGIN} + ${CPP_WRAPPER_SOURCES_APP} +) diff --git a/windows/flutter/generated_plugin_registrant.cc b/windows/flutter/generated_plugin_registrant.cc new file mode 100644 index 0000000..7ab3698 --- /dev/null +++ b/windows/flutter/generated_plugin_registrant.cc @@ -0,0 +1,56 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +void RegisterPlugins(flutter::PluginRegistry* registry) { + AppLinksPluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("AppLinksPluginCApi")); + DesktopDropPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("DesktopDropPlugin")); + DynamicColorPluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("DynamicColorPluginCApi")); + EmojiPickerFlutterPluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("EmojiPickerFlutterPluginCApi")); + FileSelectorWindowsRegisterWithRegistrar( + registry->GetRegistrarForPlugin("FileSelectorWindows")); + FlutterSecureStorageWindowsPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("FlutterSecureStorageWindowsPlugin")); + FlutterWebRTCPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("FlutterWebRTCPlugin")); + GeolocatorWindowsRegisterWithRegistrar( + registry->GetRegistrarForPlugin("GeolocatorWindows")); + PasteboardPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("PasteboardPlugin")); + PermissionHandlerWindowsPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("PermissionHandlerWindowsPlugin")); + RecordWindowsPluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("RecordWindowsPluginCApi")); + SharePlusWindowsPluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("SharePlusWindowsPluginCApi")); + Sqlite3FlutterLibsPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("Sqlite3FlutterLibsPlugin")); + UrlLauncherWindowsRegisterWithRegistrar( + registry->GetRegistrarForPlugin("UrlLauncherWindows")); + WindowToFrontPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("WindowToFrontPlugin")); +} diff --git a/windows/flutter/generated_plugin_registrant.h b/windows/flutter/generated_plugin_registrant.h new file mode 100644 index 0000000..dc139d8 --- /dev/null +++ b/windows/flutter/generated_plugin_registrant.h @@ -0,0 +1,15 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#ifndef GENERATED_PLUGIN_REGISTRANT_ +#define GENERATED_PLUGIN_REGISTRANT_ + +#include + +// Registers Flutter plugins. +void RegisterPlugins(flutter::PluginRegistry* registry); + +#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake new file mode 100644 index 0000000..aefa9bf --- /dev/null +++ b/windows/flutter/generated_plugins.cmake @@ -0,0 +1,38 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST + app_links + desktop_drop + dynamic_color + emoji_picker_flutter + file_selector_windows + flutter_secure_storage_windows + flutter_webrtc + geolocator_windows + pasteboard + permission_handler_windows + record_windows + share_plus + sqlcipher_flutter_libs + url_launcher_windows + window_to_front +) + +list(APPEND FLUTTER_FFI_PLUGIN_LIST +) + +set(PLUGIN_BUNDLED_LIBRARIES) + +foreach(plugin ${FLUTTER_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/windows plugins/${plugin}) + target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) + list(APPEND PLUGIN_BUNDLED_LIBRARIES $) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) +endforeach(plugin) + +foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/windows plugins/${ffi_plugin}) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) +endforeach(ffi_plugin) diff --git a/windows/runner/CMakeLists.txt b/windows/runner/CMakeLists.txt new file mode 100644 index 0000000..b9e550f --- /dev/null +++ b/windows/runner/CMakeLists.txt @@ -0,0 +1,32 @@ +cmake_minimum_required(VERSION 3.14) +project(runner LANGUAGES CXX) + +# Define the application target. To change its name, change BINARY_NAME in the +# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer +# work. +# +# Any new source files that you add to the application should be added here. +add_executable(${BINARY_NAME} WIN32 + "flutter_window.cpp" + "main.cpp" + "utils.cpp" + "win32_window.cpp" + "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" + "Runner.rc" + "runner.exe.manifest" +) + +# Apply the standard set of build settings. This can be removed for applications +# that need different build settings. +apply_standard_settings(${BINARY_NAME}) + +# Disable Windows macros that collide with C++ standard library functions. +target_compile_definitions(${BINARY_NAME} PRIVATE "NOMINMAX") + +# Add dependency libraries and include directories. Add any application-specific +# dependencies here. +target_link_libraries(${BINARY_NAME} PRIVATE flutter flutter_wrapper_app) +target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}") + +# Run the Flutter tool portions of the build. This must not be removed. +add_dependencies(${BINARY_NAME} flutter_assemble) diff --git a/windows/runner/Runner.rc b/windows/runner/Runner.rc new file mode 100644 index 0000000..52aa487 --- /dev/null +++ b/windows/runner/Runner.rc @@ -0,0 +1,121 @@ +// Microsoft Visual C++ generated resource script. +// +#pragma code_page(65001) +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (United States) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""winres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDI_APP_ICON ICON "resources\\app_icon.ico" + + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +#ifdef FLUTTER_BUILD_NUMBER +#define VERSION_AS_NUMBER FLUTTER_BUILD_NUMBER +#else +#define VERSION_AS_NUMBER 1,0,0 +#endif + +#ifdef FLUTTER_BUILD_NAME +#define VERSION_AS_STRING #FLUTTER_BUILD_NAME +#else +#define VERSION_AS_STRING "1.0.0" +#endif + +VS_VERSION_INFO VERSIONINFO + FILEVERSION VERSION_AS_NUMBER + PRODUCTVERSION VERSION_AS_NUMBER + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK +#ifdef _DEBUG + FILEFLAGS VS_FF_DEBUG +#else + FILEFLAGS 0x0L +#endif + FILEOS VOS__WINDOWS32 + FILETYPE VFT_APP + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904e4" + BEGIN + VALUE "CompanyName", "chat.fluffy" "\0" + VALUE "FileDescription", "fluffychat" "\0" + VALUE "FileVersion", VERSION_AS_STRING "\0" + VALUE "InternalName", "fluffychat" "\0" + VALUE "LegalCopyright", "Copyright (C) 2022 chat.fluffy. All rights reserved." "\0" + VALUE "OriginalFilename", "fluffychat.exe" "\0" + VALUE "ProductName", "fluffychat" "\0" + VALUE "ProductVersion", VERSION_AS_STRING "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1252 + END +END + +#endif // English (United States) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED diff --git a/windows/runner/flutter_window.cpp b/windows/runner/flutter_window.cpp new file mode 100644 index 0000000..b43b909 --- /dev/null +++ b/windows/runner/flutter_window.cpp @@ -0,0 +1,61 @@ +#include "flutter_window.h" + +#include + +#include "flutter/generated_plugin_registrant.h" + +FlutterWindow::FlutterWindow(const flutter::DartProject& project) + : project_(project) {} + +FlutterWindow::~FlutterWindow() {} + +bool FlutterWindow::OnCreate() { + if (!Win32Window::OnCreate()) { + return false; + } + + RECT frame = GetClientArea(); + + // The size here must match the window dimensions to avoid unnecessary surface + // creation / destruction in the startup path. + flutter_controller_ = std::make_unique( + frame.right - frame.left, frame.bottom - frame.top, project_); + // Ensure that basic setup of the controller was successful. + if (!flutter_controller_->engine() || !flutter_controller_->view()) { + return false; + } + RegisterPlugins(flutter_controller_->engine()); + SetChildContent(flutter_controller_->view()->GetNativeWindow()); + return true; +} + +void FlutterWindow::OnDestroy() { + if (flutter_controller_) { + flutter_controller_ = nullptr; + } + + Win32Window::OnDestroy(); +} + +LRESULT +FlutterWindow::MessageHandler(HWND hwnd, UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + // Give Flutter, including plugins, an opportunity to handle window messages. + if (flutter_controller_) { + std::optional result = + flutter_controller_->HandleTopLevelWindowProc(hwnd, message, wparam, + lparam); + if (result) { + return *result; + } + } + + switch (message) { + case WM_FONTCHANGE: + flutter_controller_->engine()->ReloadSystemFonts(); + break; + } + + return Win32Window::MessageHandler(hwnd, message, wparam, lparam); +} diff --git a/windows/runner/flutter_window.h b/windows/runner/flutter_window.h new file mode 100644 index 0000000..6da0652 --- /dev/null +++ b/windows/runner/flutter_window.h @@ -0,0 +1,33 @@ +#ifndef RUNNER_FLUTTER_WINDOW_H_ +#define RUNNER_FLUTTER_WINDOW_H_ + +#include +#include + +#include + +#include "win32_window.h" + +// A window that does nothing but host a Flutter view. +class FlutterWindow : public Win32Window { + public: + // Creates a new FlutterWindow hosting a Flutter view running |project|. + explicit FlutterWindow(const flutter::DartProject& project); + virtual ~FlutterWindow(); + + protected: + // Win32Window: + bool OnCreate() override; + void OnDestroy() override; + LRESULT MessageHandler(HWND window, UINT const message, WPARAM const wparam, + LPARAM const lparam) noexcept override; + + private: + // The project to run. + flutter::DartProject project_; + + // The Flutter instance hosted by this window. + std::unique_ptr flutter_controller_; +}; + +#endif // RUNNER_FLUTTER_WINDOW_H_ diff --git a/windows/runner/main.cpp b/windows/runner/main.cpp new file mode 100644 index 0000000..dabb4a3 --- /dev/null +++ b/windows/runner/main.cpp @@ -0,0 +1,43 @@ +#include +#include +#include + +#include "flutter_window.h" +#include "utils.h" + +int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev, + _In_ wchar_t *command_line, _In_ int show_command) { + // Attach to console when present (e.g., 'flutter run') or create a + // new console when running with a debugger. + if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent()) { + CreateAndAttachConsole(); + } + + // Initialize COM, so that it is available for use in the library and/or + // plugins. + ::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED); + + flutter::DartProject project(L"data"); + + std::vector command_line_arguments = + GetCommandLineArguments(); + + project.set_dart_entrypoint_arguments(std::move(command_line_arguments)); + + FlutterWindow window(project); + Win32Window::Point origin(10, 10); + Win32Window::Size size(1280, 720); + if (!window.CreateAndShow(L"Extera Next", origin, size)) { + return EXIT_FAILURE; + } + window.SetQuitOnClose(true); + + ::MSG msg; + while (::GetMessage(&msg, nullptr, 0, 0)) { + ::TranslateMessage(&msg); + ::DispatchMessage(&msg); + } + + ::CoUninitialize(); + return EXIT_SUCCESS; +} diff --git a/windows/runner/resource.h b/windows/runner/resource.h new file mode 100644 index 0000000..66a65d1 --- /dev/null +++ b/windows/runner/resource.h @@ -0,0 +1,16 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by Runner.rc +// +#define IDI_APP_ICON 101 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 102 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/windows/runner/resources/app_icon.ico b/windows/runner/resources/app_icon.ico new file mode 100644 index 0000000..f53c6c0 Binary files /dev/null and b/windows/runner/resources/app_icon.ico differ diff --git a/windows/runner/runner.exe.manifest b/windows/runner/runner.exe.manifest new file mode 100644 index 0000000..c977c4a --- /dev/null +++ b/windows/runner/runner.exe.manifest @@ -0,0 +1,20 @@ + + + + + PerMonitorV2 + + + + + + + + + + + + + + + diff --git a/windows/runner/utils.cpp b/windows/runner/utils.cpp new file mode 100644 index 0000000..f5bf9fa --- /dev/null +++ b/windows/runner/utils.cpp @@ -0,0 +1,64 @@ +#include "utils.h" + +#include +#include +#include +#include + +#include + +void CreateAndAttachConsole() { + if (::AllocConsole()) { + FILE *unused; + if (freopen_s(&unused, "CONOUT$", "w", stdout)) { + _dup2(_fileno(stdout), 1); + } + if (freopen_s(&unused, "CONOUT$", "w", stderr)) { + _dup2(_fileno(stdout), 2); + } + std::ios::sync_with_stdio(); + FlutterDesktopResyncOutputStreams(); + } +} + +std::vector GetCommandLineArguments() { + // Convert the UTF-16 command line arguments to UTF-8 for the Engine to use. + int argc; + wchar_t** argv = ::CommandLineToArgvW(::GetCommandLineW(), &argc); + if (argv == nullptr) { + return std::vector(); + } + + std::vector command_line_arguments; + + // Skip the first argument as it's the binary name. + for (int i = 1; i < argc; i++) { + command_line_arguments.push_back(Utf8FromUtf16(argv[i])); + } + + ::LocalFree(argv); + + return command_line_arguments; +} + +std::string Utf8FromUtf16(const wchar_t* utf16_string) { + if (utf16_string == nullptr) { + return std::string(); + } + int target_length = ::WideCharToMultiByte( + CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, + -1, nullptr, 0, nullptr, nullptr); + std::string utf8_string; + if (target_length == 0 || target_length > utf8_string.max_size()) { + return utf8_string; + } + utf8_string.resize(target_length); + int converted_length = ::WideCharToMultiByte( + CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, + -1, utf8_string.data(), + target_length, nullptr, nullptr); + if (converted_length == 0) { + return std::string(); + } + return utf8_string; +} diff --git a/windows/runner/utils.h b/windows/runner/utils.h new file mode 100644 index 0000000..3879d54 --- /dev/null +++ b/windows/runner/utils.h @@ -0,0 +1,19 @@ +#ifndef RUNNER_UTILS_H_ +#define RUNNER_UTILS_H_ + +#include +#include + +// Creates a console for the process, and redirects stdout and stderr to +// it for both the runner and the Flutter library. +void CreateAndAttachConsole(); + +// Takes a null-terminated wchar_t* encoded in UTF-16 and returns a std::string +// encoded in UTF-8. Returns an empty std::string on failure. +std::string Utf8FromUtf16(const wchar_t* utf16_string); + +// Gets the command line arguments passed in as a std::vector, +// encoded in UTF-8. Returns an empty std::vector on failure. +std::vector GetCommandLineArguments(); + +#endif // RUNNER_UTILS_H_ diff --git a/windows/runner/win32_window.cpp b/windows/runner/win32_window.cpp new file mode 100644 index 0000000..c10f08d --- /dev/null +++ b/windows/runner/win32_window.cpp @@ -0,0 +1,245 @@ +#include "win32_window.h" + +#include + +#include "resource.h" + +namespace { + +constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; + +// The number of Win32Window objects that currently exist. +static int g_active_window_count = 0; + +using EnableNonClientDpiScaling = BOOL __stdcall(HWND hwnd); + +// Scale helper to convert logical scaler values to physical using passed in +// scale factor +int Scale(int source, double scale_factor) { + return static_cast(source * scale_factor); +} + +// Dynamically loads the |EnableNonClientDpiScaling| from the User32 module. +// This API is only needed for PerMonitor V1 awareness mode. +void EnableFullDpiSupportIfAvailable(HWND hwnd) { + HMODULE user32_module = LoadLibraryA("User32.dll"); + if (!user32_module) { + return; + } + auto enable_non_client_dpi_scaling = + reinterpret_cast( + GetProcAddress(user32_module, "EnableNonClientDpiScaling")); + if (enable_non_client_dpi_scaling != nullptr) { + enable_non_client_dpi_scaling(hwnd); + FreeLibrary(user32_module); + } +} + +} // namespace + +// Manages the Win32Window's window class registration. +class WindowClassRegistrar { + public: + ~WindowClassRegistrar() = default; + + // Returns the singleton registar instance. + static WindowClassRegistrar* GetInstance() { + if (!instance_) { + instance_ = new WindowClassRegistrar(); + } + return instance_; + } + + // Returns the name of the window class, registering the class if it hasn't + // previously been registered. + const wchar_t* GetWindowClass(); + + // Unregisters the window class. Should only be called if there are no + // instances of the window. + void UnregisterWindowClass(); + + private: + WindowClassRegistrar() = default; + + static WindowClassRegistrar* instance_; + + bool class_registered_ = false; +}; + +WindowClassRegistrar* WindowClassRegistrar::instance_ = nullptr; + +const wchar_t* WindowClassRegistrar::GetWindowClass() { + if (!class_registered_) { + WNDCLASS window_class{}; + window_class.hCursor = LoadCursor(nullptr, IDC_ARROW); + window_class.lpszClassName = kWindowClassName; + window_class.style = CS_HREDRAW | CS_VREDRAW; + window_class.cbClsExtra = 0; + window_class.cbWndExtra = 0; + window_class.hInstance = GetModuleHandle(nullptr); + window_class.hIcon = + LoadIcon(window_class.hInstance, MAKEINTRESOURCE(IDI_APP_ICON)); + window_class.hbrBackground = 0; + window_class.lpszMenuName = nullptr; + window_class.lpfnWndProc = Win32Window::WndProc; + RegisterClass(&window_class); + class_registered_ = true; + } + return kWindowClassName; +} + +void WindowClassRegistrar::UnregisterWindowClass() { + UnregisterClass(kWindowClassName, nullptr); + class_registered_ = false; +} + +Win32Window::Win32Window() { + ++g_active_window_count; +} + +Win32Window::~Win32Window() { + --g_active_window_count; + Destroy(); +} + +bool Win32Window::CreateAndShow(const std::wstring& title, + const Point& origin, + const Size& size) { + Destroy(); + + const wchar_t* window_class = + WindowClassRegistrar::GetInstance()->GetWindowClass(); + + const POINT target_point = {static_cast(origin.x), + static_cast(origin.y)}; + HMONITOR monitor = MonitorFromPoint(target_point, MONITOR_DEFAULTTONEAREST); + UINT dpi = FlutterDesktopGetDpiForMonitor(monitor); + double scale_factor = dpi / 96.0; + + HWND window = CreateWindow( + window_class, title.c_str(), WS_OVERLAPPEDWINDOW | WS_VISIBLE, + Scale(origin.x, scale_factor), Scale(origin.y, scale_factor), + Scale(size.width, scale_factor), Scale(size.height, scale_factor), + nullptr, nullptr, GetModuleHandle(nullptr), this); + + if (!window) { + return false; + } + + return OnCreate(); +} + +// static +LRESULT CALLBACK Win32Window::WndProc(HWND const window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + if (message == WM_NCCREATE) { + auto window_struct = reinterpret_cast(lparam); + SetWindowLongPtr(window, GWLP_USERDATA, + reinterpret_cast(window_struct->lpCreateParams)); + + auto that = static_cast(window_struct->lpCreateParams); + EnableFullDpiSupportIfAvailable(window); + that->window_handle_ = window; + } else if (Win32Window* that = GetThisFromHandle(window)) { + return that->MessageHandler(window, message, wparam, lparam); + } + + return DefWindowProc(window, message, wparam, lparam); +} + +LRESULT +Win32Window::MessageHandler(HWND hwnd, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + switch (message) { + case WM_DESTROY: + window_handle_ = nullptr; + Destroy(); + if (quit_on_close_) { + PostQuitMessage(0); + } + return 0; + + case WM_DPICHANGED: { + auto newRectSize = reinterpret_cast(lparam); + LONG newWidth = newRectSize->right - newRectSize->left; + LONG newHeight = newRectSize->bottom - newRectSize->top; + + SetWindowPos(hwnd, nullptr, newRectSize->left, newRectSize->top, newWidth, + newHeight, SWP_NOZORDER | SWP_NOACTIVATE); + + return 0; + } + case WM_SIZE: { + RECT rect = GetClientArea(); + if (child_content_ != nullptr) { + // Size and position the child window. + MoveWindow(child_content_, rect.left, rect.top, rect.right - rect.left, + rect.bottom - rect.top, TRUE); + } + return 0; + } + + case WM_ACTIVATE: + if (child_content_ != nullptr) { + SetFocus(child_content_); + } + return 0; + } + + return DefWindowProc(window_handle_, message, wparam, lparam); +} + +void Win32Window::Destroy() { + OnDestroy(); + + if (window_handle_) { + DestroyWindow(window_handle_); + window_handle_ = nullptr; + } + if (g_active_window_count == 0) { + WindowClassRegistrar::GetInstance()->UnregisterWindowClass(); + } +} + +Win32Window* Win32Window::GetThisFromHandle(HWND const window) noexcept { + return reinterpret_cast( + GetWindowLongPtr(window, GWLP_USERDATA)); +} + +void Win32Window::SetChildContent(HWND content) { + child_content_ = content; + SetParent(content, window_handle_); + RECT frame = GetClientArea(); + + MoveWindow(content, frame.left, frame.top, frame.right - frame.left, + frame.bottom - frame.top, true); + + SetFocus(child_content_); +} + +RECT Win32Window::GetClientArea() { + RECT frame; + GetClientRect(window_handle_, &frame); + return frame; +} + +HWND Win32Window::GetHandle() { + return window_handle_; +} + +void Win32Window::SetQuitOnClose(bool quit_on_close) { + quit_on_close_ = quit_on_close; +} + +bool Win32Window::OnCreate() { + // No-op; provided for subclasses. + return true; +} + +void Win32Window::OnDestroy() { + // No-op; provided for subclasses. +} diff --git a/windows/runner/win32_window.h b/windows/runner/win32_window.h new file mode 100644 index 0000000..17ba431 --- /dev/null +++ b/windows/runner/win32_window.h @@ -0,0 +1,98 @@ +#ifndef RUNNER_WIN32_WINDOW_H_ +#define RUNNER_WIN32_WINDOW_H_ + +#include + +#include +#include +#include + +// A class abstraction for a high DPI-aware Win32 Window. Intended to be +// inherited from by classes that wish to specialize with custom +// rendering and input handling +class Win32Window { + public: + struct Point { + unsigned int x; + unsigned int y; + Point(unsigned int x, unsigned int y) : x(x), y(y) {} + }; + + struct Size { + unsigned int width; + unsigned int height; + Size(unsigned int width, unsigned int height) + : width(width), height(height) {} + }; + + Win32Window(); + virtual ~Win32Window(); + + // Creates and shows a win32 window with |title| and position and size using + // |origin| and |size|. New windows are created on the default monitor. Window + // sizes are specified to the OS in physical pixels, hence to ensure a + // consistent size to will treat the width height passed in to this function + // as logical pixels and scale to appropriate for the default monitor. Returns + // true if the window was created successfully. + bool CreateAndShow(const std::wstring& title, + const Point& origin, + const Size& size); + + // Release OS resources associated with window. + void Destroy(); + + // Inserts |content| into the window tree. + void SetChildContent(HWND content); + + // Returns the backing Window handle to enable clients to set icon and other + // window properties. Returns nullptr if the window has been destroyed. + HWND GetHandle(); + + // If true, closing this window will quit the application. + void SetQuitOnClose(bool quit_on_close); + + // Return a RECT representing the bounds of the current client area. + RECT GetClientArea(); + + protected: + // Processes and route salient window messages for mouse handling, + // size change and DPI. Delegates handling of these to member overloads that + // inheriting classes can handle. + virtual LRESULT MessageHandler(HWND window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept; + + // Called when CreateAndShow is called, allowing subclass window-related + // setup. Subclasses should return false if setup fails. + virtual bool OnCreate(); + + // Called when Destroy is called. + virtual void OnDestroy(); + + private: + friend class WindowClassRegistrar; + + // OS callback called by message pump. Handles the WM_NCCREATE message which + // is passed when the non-client area is being created and enables automatic + // non-client DPI scaling so that the non-client area automatically + // responsponds to changes in DPI. All other messages are handled by + // MessageHandler. + static LRESULT CALLBACK WndProc(HWND const window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept; + + // Retrieves a class instance pointer for |window| + static Win32Window* GetThisFromHandle(HWND const window) noexcept; + + bool quit_on_close_ = false; + + // window handle for top level window. + HWND window_handle_ = nullptr; + + // window handle for hosted content. + HWND child_content_ = nullptr; +}; + +#endif // RUNNER_WIN32_WINDOW_H_ diff --git a/winuwp/.gitignore b/winuwp/.gitignore new file mode 100644 index 0000000..d492d0d --- /dev/null +++ b/winuwp/.gitignore @@ -0,0 +1,17 @@ +flutter/ephemeral/ + +# Visual Studio user-specific files. +*.suo +*.user +*.userosscache +*.sln.docstates + +# Visual Studio build-related files. +x64/ +x86/ + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ diff --git a/winuwp/CMakeLists.txt b/winuwp/CMakeLists.txt new file mode 100644 index 0000000..7530c80 --- /dev/null +++ b/winuwp/CMakeLists.txt @@ -0,0 +1,64 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.8) +set(CMAKE_SYSTEM_NAME WindowsStore) +set(CMAKE_SYSTEM_VERSION 10.0) +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED YES) +project(fluffychat LANGUAGES CXX) + +# Explicitly opt in to modern CMake behaviors to avoid warnings with recent +# versions of CMake. +cmake_policy(SET CMP0079 NEW) + +# The name of the executable created for the application. Change this to change +# the on-disk name of your application. +set(BINARY_NAME "fluffychat") + +# Define build configuration options. +get_property(IS_MULTICONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) +if(IS_MULTICONFIG) + set(CMAKE_CONFIGURATION_TYPES "Debug;Profile;Release" + CACHE STRING "" FORCE) +else() + if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE "Debug" CACHE + STRING "Flutter build mode" FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS + "Debug" "Profile" "Release") + endif() +endif() +# Define settings for the Profile build mode. +set(CMAKE_EXE_LINKER_FLAGS_PROFILE "${CMAKE_EXE_LINKER_FLAGS_RELEASE}") +set(CMAKE_SHARED_LINKER_FLAGS_PROFILE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE}") +set(CMAKE_C_FLAGS_PROFILE "${CMAKE_C_FLAGS_RELEASE}") +set(CMAKE_CXX_FLAGS_PROFILE "${CMAKE_CXX_FLAGS_RELEASE}") + +# Use Unicode for all projects. +add_definitions(-DUNICODE -D_UNICODE) + +# Compilation settings that should be applied to most targets. +# +# Be cautious about adding new options here, as plugins use this function by +# default. In most cases, you should add new options to specific targets instead +# of modifying this function. +function(APPLY_STANDARD_SETTINGS TARGET) + target_compile_features(${TARGET} PUBLIC cxx_std_17) + target_compile_options(${TARGET} PRIVATE /W4 /WX /wd"4100" /await) + target_compile_options(${TARGET} PRIVATE /EHsc) + target_compile_definitions(${TARGET} PRIVATE "_HAS_EXCEPTIONS=0") + target_compile_definitions(${TARGET} PRIVATE "$<$:_DEBUG>") + target_compile_definitions(${TARGET} PRIVATE WINUWP) + set_target_properties(${TARGET} PROPERTIES VS_WINDOWS_TARGET_PLATFORM_MIN_VERSION 10.0.18362.0) +endfunction() + +set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") + +# Flutter library and tool build rules. +add_subdirectory(${FLUTTER_MANAGED_DIR}) + +# Application build; see runner/CMakeLists.txt. +add_subdirectory("runner_uwp") + +# Generated plugin build rules, which manage building the plugins and adding +# them to the application. +include(flutter/generated_plugins.cmake) diff --git a/winuwp/flutter/CMakeLists.txt b/winuwp/flutter/CMakeLists.txt new file mode 100644 index 0000000..9adbd9d --- /dev/null +++ b/winuwp/flutter/CMakeLists.txt @@ -0,0 +1,92 @@ +# This file controls Flutter-level build steps. It should not be edited. +cmake_minimum_required(VERSION 3.8) +set(CMAKE_SYSTEM_NAME WindowsStore) +set(CMAKE_SYSTEM_VERSION 10.0) +set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") + +include(CMakePrintHelpers) + +# Configuration provided via flutter tool. +include(${EPHEMERAL_DIR}/generated_config.cmake) + +# TODO: Move the rest of this into files in ephemeral. See +# https://github.com/flutter/flutter/issues/57146. +set(WRAPPER_ROOT "${EPHEMERAL_DIR}/cpp_client_wrapper") + +# === Flutter Library === +set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/flutter_windows_winuwp.dll") + +# === Assets === +set(CMAKE_INSTALL_MANIFEST "${EPHEMERAL_DIR}/install_manifest") +file(STRINGS ${CMAKE_INSTALL_MANIFEST} INSTALL_MANIFEST_CONTENT) + +# Published to parent scope for install step. +set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) +set(INSTALL_MANIFEST_CONTENT ${INSTALL_MANIFEST_CONTENT} PARENT_SCOPE) + +list(APPEND FLUTTER_LIBRARY_HEADERS + "flutter_export.h" + "flutter_windows.h" + "flutter_messenger.h" + "flutter_plugin_registrar.h" + "flutter_texture_registrar.h" +) +list(TRANSFORM FLUTTER_LIBRARY_HEADERS PREPEND "${EPHEMERAL_DIR}/") +add_library(flutter INTERFACE) +target_include_directories(flutter INTERFACE + "${EPHEMERAL_DIR}" +) +target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}.lib") +add_dependencies(flutter flutter_assemble) + +# === Wrapper === +list(APPEND CPP_WRAPPER_SOURCES_CORE + "core_implementations.cc" + "standard_codec.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_CORE PREPEND "${WRAPPER_ROOT}/") +list(APPEND CPP_WRAPPER_SOURCES_PLUGIN + "plugin_registrar.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_PLUGIN PREPEND "${WRAPPER_ROOT}/") +list(APPEND CPP_WRAPPER_SOURCES_APP + "flutter_engine.cc" + "flutter_view_controller.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_APP PREPEND "${WRAPPER_ROOT}/") + +# Wrapper sources needed for a plugin. +add_library(flutter_wrapper_plugin STATIC + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_PLUGIN} +) +apply_standard_settings(flutter_wrapper_plugin) +set_target_properties(flutter_wrapper_plugin PROPERTIES + POSITION_INDEPENDENT_CODE ON) +set_target_properties(flutter_wrapper_plugin PROPERTIES + CXX_VISIBILITY_PRESET hidden) +target_link_libraries(flutter_wrapper_plugin PUBLIC flutter) +target_include_directories(flutter_wrapper_plugin PUBLIC + "${WRAPPER_ROOT}/include" +) +add_dependencies(flutter_wrapper_plugin flutter_assemble) + +# Wrapper sources needed for the runner. +add_library(flutter_wrapper_app STATIC + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_APP} +) +apply_standard_settings(flutter_wrapper_app) +target_link_libraries(flutter_wrapper_app PUBLIC flutter) +target_include_directories(flutter_wrapper_app PUBLIC + "${WRAPPER_ROOT}/include" +) +add_dependencies(flutter_wrapper_app flutter_assemble) + +add_custom_target(flutter_assemble DEPENDS + "${FLUTTER_LIBRARY}" + ${FLUTTER_LIBRARY_HEADERS} + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_PLUGIN} + ${CPP_WRAPPER_SOURCES_APP} +) diff --git a/winuwp/flutter/flutter_windows.h b/winuwp/flutter/flutter_windows.h new file mode 100644 index 0000000..0aeb6fd --- /dev/null +++ b/winuwp/flutter/flutter_windows.h @@ -0,0 +1,270 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef FLUTTER_SHELL_PLATFORM_WINDOWS_PUBLIC_FLUTTER_H_ +#define FLUTTER_SHELL_PLATFORM_WINDOWS_PUBLIC_FLUTTER_H_ + +#include +#include +#include + +#include "flutter_export.h" +#include "flutter_messenger.h" +#include "flutter_plugin_registrar.h" + +#ifdef WINUWP +#include +#include +#endif + +#if defined(__cplusplus) +extern "C" { +#endif + +// Opaque reference to a Flutter window controller. +typedef struct FlutterDesktopViewControllerState* + FlutterDesktopViewControllerRef; + +// Opaque reference to a Flutter window. +struct FlutterDesktopView; +typedef struct FlutterDesktopView* FlutterDesktopViewRef; + +// Opaque reference to a Flutter engine instance. +struct FlutterDesktopEngine; +typedef struct FlutterDesktopEngine* FlutterDesktopEngineRef; + +// Properties for configuring a Flutter engine instance. +typedef struct { + // The path to the flutter_assets folder for the application to be run. + // This can either be an absolute path or a path relative to the directory + // containing the executable. + const wchar_t* assets_path; + + // The path to the icudtl.dat file for the version of Flutter you are using. + // This can either be an absolute path or a path relative to the directory + // containing the executable. + const wchar_t* icu_data_path; + + // The path to the AOT library file for your application, if any. + // This can either be an absolute path or a path relative to the directory + // containing the executable. This can be nullptr for a non-AOT build, as + // it will be ignored in that case. + const wchar_t* aot_library_path; + + // Number of elements in the array passed in as dart_entrypoint_argv. + int dart_entrypoint_argc; + + // Array of Dart entrypoint arguments. This is deep copied during the call + // to FlutterDesktopEngineCreate. + const char** dart_entrypoint_argv; + +} FlutterDesktopEngineProperties; + +// ========== View Controller ========== + +// Creates a view that hosts and displays the given engine instance. +// +// This takes ownership of |engine|, so FlutterDesktopEngineDestroy should no +// longer be called on it, as it will be called internally when the view +// controller is destroyed. If creating the view controller fails, the engine +// will be destroyed immediately. +// +// If |engine| is not already running, the view controller will start running +// it automatically before displaying the window. +// +// The caller owns the returned reference, and is responsible for calling +// FlutterDesktopViewControllerDestroy. Returns a null pointer in the event of +// an error. +#ifdef WINUWP +// The CoreApplicationView implementation accepts a pointer to the host +// CoreApplicationView and view hookup is performed in the construction path. +FLUTTER_EXPORT FlutterDesktopViewControllerRef +FlutterDesktopViewControllerCreateFromCoreApplicationView( + ABI::Windows::ApplicationModel::Core::CoreApplicationView* window, + ABI::Windows::ApplicationModel::Activation::IActivatedEventArgs* args, + FlutterDesktopEngineRef engine); +#else //! WINUWP +// The Win32 implementation accepts width, height +// with view hookup explicitly performed using the caller using HWND parenting. +FLUTTER_EXPORT FlutterDesktopViewControllerRef +FlutterDesktopViewControllerCreate(int width, + int height, + FlutterDesktopEngineRef engine); +#endif + +// Shuts down the engine instance associated with |controller|, and cleans up +// associated state. +// +// |controller| is no longer valid after this call. +FLUTTER_EXPORT void FlutterDesktopViewControllerDestroy( + FlutterDesktopViewControllerRef controller); + +// Returns the handle for the engine running in FlutterDesktopViewControllerRef. +// +// Its lifetime is the same as the |controller|'s. +FLUTTER_EXPORT FlutterDesktopEngineRef FlutterDesktopViewControllerGetEngine( + FlutterDesktopViewControllerRef controller); +// Returns the view managed by the given controller. + +FLUTTER_EXPORT FlutterDesktopViewRef +FlutterDesktopViewControllerGetView(FlutterDesktopViewControllerRef controller); + +// Requests new frame from engine and repaints the view +FLUTTER_EXPORT void FlutterDesktopViewControllerForceRedraw( + FlutterDesktopViewControllerRef controller); + +#ifndef WINUWP +// Allows the Flutter engine and any interested plugins an opportunity to +// handle the given message. +// +// If the WindowProc was handled and further handling should stop, this returns +// true and |result| will be populated. |result| is not set if returning false. +FLUTTER_EXPORT bool FlutterDesktopViewControllerHandleTopLevelWindowProc( + FlutterDesktopViewControllerRef controller, + HWND hwnd, + UINT message, + WPARAM wparam, + LPARAM lparam, + LRESULT* result); +#endif + +// ========== Engine ========== + +// Creates a Flutter engine with the given properties. +// +// The caller owns the returned reference, and is responsible for calling +// FlutterDesktopEngineDestroy. The lifetime of |engine_properties| is required +// to extend only until the end of this call. +FLUTTER_EXPORT FlutterDesktopEngineRef FlutterDesktopEngineCreate( + const FlutterDesktopEngineProperties* engine_properties); + +// Shuts down and destroys the given engine instance. Returns true if the +// shutdown was successful, or if the engine was not running. +// +// |engine| is no longer valid after this call. +FLUTTER_EXPORT bool FlutterDesktopEngineDestroy(FlutterDesktopEngineRef engine); + +// Starts running the given engine instance and optional entry point in the Dart +// project. If the entry point is null, defaults to main(). +// +// If provided, entry_point must be the name of a top-level function from the +// same Dart library that contains the app's main() function, and must be +// decorated with `@pragma(vm:entry-point)` to ensure the method is not +// tree-shaken by the Dart compiler. +// +// Returns false if running the engine failed. +FLUTTER_EXPORT bool FlutterDesktopEngineRun(FlutterDesktopEngineRef engine, + const char* entry_point); + +#ifndef WINUWP +// DEPRECATED: This is no longer necessary to call, Flutter will take care of +// processing engine messages transparently through DispatchMessage. +// +// Processes any pending events in the Flutter engine, and returns the +// number of nanoseconds until the next scheduled event (or max, if none). +// +// This should be called on every run of the application-level runloop, and +// a wait for native events in the runloop should never be longer than the +// last return value from this function. +FLUTTER_EXPORT uint64_t +FlutterDesktopEngineProcessMessages(FlutterDesktopEngineRef engine); +#endif + +FLUTTER_EXPORT void FlutterDesktopEngineReloadSystemFonts( + FlutterDesktopEngineRef engine); + +FLUTTER_EXPORT void FlutterDesktopEngineReloadPlatformBrightness( + FlutterDesktopEngineRef engine); + +// Returns the plugin registrar handle for the plugin with the given name. +// +// The name must be unique across the application. +FLUTTER_EXPORT FlutterDesktopPluginRegistrarRef +FlutterDesktopEngineGetPluginRegistrar(FlutterDesktopEngineRef engine, + const char* plugin_name); + +// Returns the messenger associated with the engine. +FLUTTER_EXPORT FlutterDesktopMessengerRef +FlutterDesktopEngineGetMessenger(FlutterDesktopEngineRef engine); + +// Returns the texture registrar associated with the engine. +FLUTTER_EXPORT FlutterDesktopTextureRegistrarRef +FlutterDesktopEngineGetTextureRegistrar( + FlutterDesktopTextureRegistrarRef texture_registrar); + +// ========== View ========== + +#ifdef WINUWP +// Return backing CoreApplicationView for manipulation of CoreWindow and +// CoreTitleBar in host application. +FLUTTER_EXPORT ABI::Windows::ApplicationModel::Core::CoreApplicationView* +FlutterDesktopViewGetCoreApplicationView(FlutterDesktopViewRef view); +#else +// Return backing HWND for manipulation in host application. +FLUTTER_EXPORT HWND FlutterDesktopViewGetHWND(FlutterDesktopViewRef view); +#endif + +// ========== Plugin Registrar (extensions) ========== +// These are Windows-specific extensions to flutter_plugin_registrar.h + +// Function pointer type for top level WindowProc delegate registration. +// +// The user data will be whatever was passed to +// FlutterDesktopRegisterTopLevelWindowProcHandler. +// +// Implementations should populate |result| and return true if the WindowProc +// was handled and further handling should stop. |result| is ignored if the +// function returns false. +typedef bool (*FlutterDesktopWindowProcCallback)(HWND /* hwnd */, + UINT /* uMsg */, + WPARAM /*wParam*/, + LPARAM /* lParam*/, + void* /* user data */, + LRESULT* result); + +// Returns the view associated with this registrar's engine instance. +FLUTTER_EXPORT FlutterDesktopViewRef FlutterDesktopPluginRegistrarGetView( + FlutterDesktopPluginRegistrarRef registrar); + +#ifndef WINUWP +FLUTTER_EXPORT void +FlutterDesktopPluginRegistrarRegisterTopLevelWindowProcDelegate( + FlutterDesktopPluginRegistrarRef registrar, + FlutterDesktopWindowProcCallback delegate, + void* user_data); + +FLUTTER_EXPORT void +FlutterDesktopPluginRegistrarUnregisterTopLevelWindowProcDelegate( + FlutterDesktopPluginRegistrarRef registrar, + FlutterDesktopWindowProcCallback delegate); +#endif + +// ========== Freestanding Utilities ========== + +// Gets the DPI for a given |hwnd|, depending on the supported APIs per +// windows version and DPI awareness mode. If nullptr is passed, returns the DPI +// of the primary monitor. +// +// This uses the same logic and fallback for older Windows versions that is used +// internally by Flutter to determine the DPI to use for displaying Flutter +// content, so should be used by any code (e.g., in plugins) that translates +// between Windows and Dart sizes/offsets. +FLUTTER_EXPORT UINT FlutterDesktopGetDpiForHWND(HWND hwnd); + +// Gets the DPI for a given |monitor|. If the API is not available, a default +// DPI of 96 is returned. +// +// See FlutterDesktopGetDpiForHWND for more information. +FLUTTER_EXPORT UINT FlutterDesktopGetDpiForMonitor(HMONITOR monitor); + +// Reopens stdout and stderr and resysncs the standard library output streams. +// Should be called if output is being directed somewhere in the runner process +// (e.g., after an AllocConsole call). +FLUTTER_EXPORT void FlutterDesktopResyncOutputStreams(); + +#if defined(__cplusplus) +} // extern "C" +#endif + +#endif // FLUTTER_SHELL_PLATFORM_WINDOWS_PUBLIC_FLUTTER_WINDOWS_H_ diff --git a/winuwp/flutter/generated_plugin_registrant.cc b/winuwp/flutter/generated_plugin_registrant.cc new file mode 100644 index 0000000..8b6d468 --- /dev/null +++ b/winuwp/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void RegisterPlugins(flutter::PluginRegistry* registry) { +} diff --git a/winuwp/flutter/generated_plugin_registrant.h b/winuwp/flutter/generated_plugin_registrant.h new file mode 100644 index 0000000..dc139d8 --- /dev/null +++ b/winuwp/flutter/generated_plugin_registrant.h @@ -0,0 +1,15 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#ifndef GENERATED_PLUGIN_REGISTRANT_ +#define GENERATED_PLUGIN_REGISTRANT_ + +#include + +// Registers Flutter plugins. +void RegisterPlugins(flutter::PluginRegistry* registry); + +#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/winuwp/flutter/generated_plugins.cmake b/winuwp/flutter/generated_plugins.cmake new file mode 100644 index 0000000..4d10c25 --- /dev/null +++ b/winuwp/flutter/generated_plugins.cmake @@ -0,0 +1,15 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +set(PLUGIN_BUNDLED_LIBRARIES) + +foreach(plugin ${FLUTTER_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/windows plugins/${plugin}) + target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) + list(APPEND PLUGIN_BUNDLED_LIBRARIES $) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) +endforeach(plugin) diff --git a/winuwp/project_version b/winuwp/project_version new file mode 100644 index 0000000..c227083 --- /dev/null +++ b/winuwp/project_version @@ -0,0 +1 @@ +0 \ No newline at end of file diff --git a/winuwp/runner_uwp/Assets/LargeTile.scale-100.png b/winuwp/runner_uwp/Assets/LargeTile.scale-100.png new file mode 100644 index 0000000..fa651eb Binary files /dev/null and b/winuwp/runner_uwp/Assets/LargeTile.scale-100.png differ diff --git a/winuwp/runner_uwp/Assets/LargeTile.scale-125.png b/winuwp/runner_uwp/Assets/LargeTile.scale-125.png new file mode 100644 index 0000000..649e076 Binary files /dev/null and b/winuwp/runner_uwp/Assets/LargeTile.scale-125.png differ diff --git a/winuwp/runner_uwp/Assets/LargeTile.scale-150.png b/winuwp/runner_uwp/Assets/LargeTile.scale-150.png new file mode 100644 index 0000000..fd14c60 Binary files /dev/null and b/winuwp/runner_uwp/Assets/LargeTile.scale-150.png differ diff --git a/winuwp/runner_uwp/Assets/LargeTile.scale-200.png b/winuwp/runner_uwp/Assets/LargeTile.scale-200.png new file mode 100644 index 0000000..873537f Binary files /dev/null and b/winuwp/runner_uwp/Assets/LargeTile.scale-200.png differ diff --git a/winuwp/runner_uwp/Assets/LargeTile.scale-400.png b/winuwp/runner_uwp/Assets/LargeTile.scale-400.png new file mode 100644 index 0000000..979878f Binary files /dev/null and b/winuwp/runner_uwp/Assets/LargeTile.scale-400.png differ diff --git a/winuwp/runner_uwp/Assets/LockScreenLogo.scale-200.png b/winuwp/runner_uwp/Assets/LockScreenLogo.scale-200.png new file mode 100644 index 0000000..735f57a Binary files /dev/null and b/winuwp/runner_uwp/Assets/LockScreenLogo.scale-200.png differ diff --git a/winuwp/runner_uwp/Assets/SmallTile.scale-100.png b/winuwp/runner_uwp/Assets/SmallTile.scale-100.png new file mode 100644 index 0000000..35e7f62 Binary files /dev/null and b/winuwp/runner_uwp/Assets/SmallTile.scale-100.png differ diff --git a/winuwp/runner_uwp/Assets/SmallTile.scale-125.png b/winuwp/runner_uwp/Assets/SmallTile.scale-125.png new file mode 100644 index 0000000..2a74cc6 Binary files /dev/null and b/winuwp/runner_uwp/Assets/SmallTile.scale-125.png differ diff --git a/winuwp/runner_uwp/Assets/SmallTile.scale-150.png b/winuwp/runner_uwp/Assets/SmallTile.scale-150.png new file mode 100644 index 0000000..1571248 Binary files /dev/null and b/winuwp/runner_uwp/Assets/SmallTile.scale-150.png differ diff --git a/winuwp/runner_uwp/Assets/SmallTile.scale-200.png b/winuwp/runner_uwp/Assets/SmallTile.scale-200.png new file mode 100644 index 0000000..07ec2dd Binary files /dev/null and b/winuwp/runner_uwp/Assets/SmallTile.scale-200.png differ diff --git a/winuwp/runner_uwp/Assets/SmallTile.scale-400.png b/winuwp/runner_uwp/Assets/SmallTile.scale-400.png new file mode 100644 index 0000000..c205729 Binary files /dev/null and b/winuwp/runner_uwp/Assets/SmallTile.scale-400.png differ diff --git a/winuwp/runner_uwp/Assets/SplashScreen.scale-100.png b/winuwp/runner_uwp/Assets/SplashScreen.scale-100.png new file mode 100644 index 0000000..6012579 Binary files /dev/null and b/winuwp/runner_uwp/Assets/SplashScreen.scale-100.png differ diff --git a/winuwp/runner_uwp/Assets/SplashScreen.scale-125.png b/winuwp/runner_uwp/Assets/SplashScreen.scale-125.png new file mode 100644 index 0000000..0c35be8 Binary files /dev/null and b/winuwp/runner_uwp/Assets/SplashScreen.scale-125.png differ diff --git a/winuwp/runner_uwp/Assets/SplashScreen.scale-150.png b/winuwp/runner_uwp/Assets/SplashScreen.scale-150.png new file mode 100644 index 0000000..f1e60f3 Binary files /dev/null and b/winuwp/runner_uwp/Assets/SplashScreen.scale-150.png differ diff --git a/winuwp/runner_uwp/Assets/SplashScreen.scale-200.png b/winuwp/runner_uwp/Assets/SplashScreen.scale-200.png new file mode 100644 index 0000000..73d2461 Binary files /dev/null and b/winuwp/runner_uwp/Assets/SplashScreen.scale-200.png differ diff --git a/winuwp/runner_uwp/Assets/SplashScreen.scale-400.png b/winuwp/runner_uwp/Assets/SplashScreen.scale-400.png new file mode 100644 index 0000000..b2b7ca9 Binary files /dev/null and b/winuwp/runner_uwp/Assets/SplashScreen.scale-400.png differ diff --git a/winuwp/runner_uwp/Assets/Square150x150Logo.scale-100.png b/winuwp/runner_uwp/Assets/Square150x150Logo.scale-100.png new file mode 100644 index 0000000..cdc3e97 Binary files /dev/null and b/winuwp/runner_uwp/Assets/Square150x150Logo.scale-100.png differ diff --git a/winuwp/runner_uwp/Assets/Square150x150Logo.scale-125.png b/winuwp/runner_uwp/Assets/Square150x150Logo.scale-125.png new file mode 100644 index 0000000..71e5a11 Binary files /dev/null and b/winuwp/runner_uwp/Assets/Square150x150Logo.scale-125.png differ diff --git a/winuwp/runner_uwp/Assets/Square150x150Logo.scale-150.png b/winuwp/runner_uwp/Assets/Square150x150Logo.scale-150.png new file mode 100644 index 0000000..60f2e18 Binary files /dev/null and b/winuwp/runner_uwp/Assets/Square150x150Logo.scale-150.png differ diff --git a/winuwp/runner_uwp/Assets/Square150x150Logo.scale-200.png b/winuwp/runner_uwp/Assets/Square150x150Logo.scale-200.png new file mode 100644 index 0000000..2081408 Binary files /dev/null and b/winuwp/runner_uwp/Assets/Square150x150Logo.scale-200.png differ diff --git a/winuwp/runner_uwp/Assets/Square150x150Logo.scale-400.png b/winuwp/runner_uwp/Assets/Square150x150Logo.scale-400.png new file mode 100644 index 0000000..605aacb Binary files /dev/null and b/winuwp/runner_uwp/Assets/Square150x150Logo.scale-400.png differ diff --git a/winuwp/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-16.png b/winuwp/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-16.png new file mode 100644 index 0000000..1c78d96 Binary files /dev/null and b/winuwp/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-16.png differ diff --git a/winuwp/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-256.png b/winuwp/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-256.png new file mode 100644 index 0000000..d49d3d8 Binary files /dev/null and b/winuwp/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-256.png differ diff --git a/winuwp/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-32.png b/winuwp/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-32.png new file mode 100644 index 0000000..8896224 Binary files /dev/null and b/winuwp/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-32.png differ diff --git a/winuwp/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-48.png b/winuwp/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-48.png new file mode 100644 index 0000000..6389ede Binary files /dev/null and b/winuwp/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-48.png differ diff --git a/winuwp/runner_uwp/Assets/Square44x44Logo.scale-100.png b/winuwp/runner_uwp/Assets/Square44x44Logo.scale-100.png new file mode 100644 index 0000000..47e3cd2 Binary files /dev/null and b/winuwp/runner_uwp/Assets/Square44x44Logo.scale-100.png differ diff --git a/winuwp/runner_uwp/Assets/Square44x44Logo.scale-125.png b/winuwp/runner_uwp/Assets/Square44x44Logo.scale-125.png new file mode 100644 index 0000000..50faa93 Binary files /dev/null and b/winuwp/runner_uwp/Assets/Square44x44Logo.scale-125.png differ diff --git a/winuwp/runner_uwp/Assets/Square44x44Logo.scale-150.png b/winuwp/runner_uwp/Assets/Square44x44Logo.scale-150.png new file mode 100644 index 0000000..f0293ed Binary files /dev/null and b/winuwp/runner_uwp/Assets/Square44x44Logo.scale-150.png differ diff --git a/winuwp/runner_uwp/Assets/Square44x44Logo.scale-200.png b/winuwp/runner_uwp/Assets/Square44x44Logo.scale-200.png new file mode 100644 index 0000000..e54a56d Binary files /dev/null and b/winuwp/runner_uwp/Assets/Square44x44Logo.scale-200.png differ diff --git a/winuwp/runner_uwp/Assets/Square44x44Logo.scale-400.png b/winuwp/runner_uwp/Assets/Square44x44Logo.scale-400.png new file mode 100644 index 0000000..4b5fb17 Binary files /dev/null and b/winuwp/runner_uwp/Assets/Square44x44Logo.scale-400.png differ diff --git a/winuwp/runner_uwp/Assets/Square44x44Logo.targetsize-16.png b/winuwp/runner_uwp/Assets/Square44x44Logo.targetsize-16.png new file mode 100644 index 0000000..a1a6ec7 Binary files /dev/null and b/winuwp/runner_uwp/Assets/Square44x44Logo.targetsize-16.png differ diff --git a/winuwp/runner_uwp/Assets/Square44x44Logo.targetsize-24.png b/winuwp/runner_uwp/Assets/Square44x44Logo.targetsize-24.png new file mode 100644 index 0000000..c67a8e1 Binary files /dev/null and b/winuwp/runner_uwp/Assets/Square44x44Logo.targetsize-24.png differ diff --git a/winuwp/runner_uwp/Assets/Square44x44Logo.targetsize-24_altform-unplated.png b/winuwp/runner_uwp/Assets/Square44x44Logo.targetsize-24_altform-unplated.png new file mode 100644 index 0000000..47d36f6 Binary files /dev/null and b/winuwp/runner_uwp/Assets/Square44x44Logo.targetsize-24_altform-unplated.png differ diff --git a/winuwp/runner_uwp/Assets/Square44x44Logo.targetsize-256.png b/winuwp/runner_uwp/Assets/Square44x44Logo.targetsize-256.png new file mode 100644 index 0000000..50efc00 Binary files /dev/null and b/winuwp/runner_uwp/Assets/Square44x44Logo.targetsize-256.png differ diff --git a/winuwp/runner_uwp/Assets/Square44x44Logo.targetsize-32.png b/winuwp/runner_uwp/Assets/Square44x44Logo.targetsize-32.png new file mode 100644 index 0000000..f86682c Binary files /dev/null and b/winuwp/runner_uwp/Assets/Square44x44Logo.targetsize-32.png differ diff --git a/winuwp/runner_uwp/Assets/Square44x44Logo.targetsize-48.png b/winuwp/runner_uwp/Assets/Square44x44Logo.targetsize-48.png new file mode 100644 index 0000000..7561269 Binary files /dev/null and b/winuwp/runner_uwp/Assets/Square44x44Logo.targetsize-48.png differ diff --git a/winuwp/runner_uwp/Assets/StoreLogo.png b/winuwp/runner_uwp/Assets/StoreLogo.png new file mode 100644 index 0000000..7385b56 Binary files /dev/null and b/winuwp/runner_uwp/Assets/StoreLogo.png differ diff --git a/winuwp/runner_uwp/Assets/StoreLogo.scale-100.png b/winuwp/runner_uwp/Assets/StoreLogo.scale-100.png new file mode 100644 index 0000000..fcefe81 Binary files /dev/null and b/winuwp/runner_uwp/Assets/StoreLogo.scale-100.png differ diff --git a/winuwp/runner_uwp/Assets/StoreLogo.scale-125.png b/winuwp/runner_uwp/Assets/StoreLogo.scale-125.png new file mode 100644 index 0000000..4381be7 Binary files /dev/null and b/winuwp/runner_uwp/Assets/StoreLogo.scale-125.png differ diff --git a/winuwp/runner_uwp/Assets/StoreLogo.scale-150.png b/winuwp/runner_uwp/Assets/StoreLogo.scale-150.png new file mode 100644 index 0000000..e49390b Binary files /dev/null and b/winuwp/runner_uwp/Assets/StoreLogo.scale-150.png differ diff --git a/winuwp/runner_uwp/Assets/StoreLogo.scale-200.png b/winuwp/runner_uwp/Assets/StoreLogo.scale-200.png new file mode 100644 index 0000000..fb740e8 Binary files /dev/null and b/winuwp/runner_uwp/Assets/StoreLogo.scale-200.png differ diff --git a/winuwp/runner_uwp/Assets/StoreLogo.scale-400.png b/winuwp/runner_uwp/Assets/StoreLogo.scale-400.png new file mode 100644 index 0000000..d147274 Binary files /dev/null and b/winuwp/runner_uwp/Assets/StoreLogo.scale-400.png differ diff --git a/winuwp/runner_uwp/Assets/Wide310x150Logo.scale-200.png b/winuwp/runner_uwp/Assets/Wide310x150Logo.scale-200.png new file mode 100644 index 0000000..288995b Binary files /dev/null and b/winuwp/runner_uwp/Assets/Wide310x150Logo.scale-200.png differ diff --git a/winuwp/runner_uwp/Assets/WideTile.scale-100.png b/winuwp/runner_uwp/Assets/WideTile.scale-100.png new file mode 100644 index 0000000..1cb688c Binary files /dev/null and b/winuwp/runner_uwp/Assets/WideTile.scale-100.png differ diff --git a/winuwp/runner_uwp/Assets/WideTile.scale-125.png b/winuwp/runner_uwp/Assets/WideTile.scale-125.png new file mode 100644 index 0000000..7292396 Binary files /dev/null and b/winuwp/runner_uwp/Assets/WideTile.scale-125.png differ diff --git a/winuwp/runner_uwp/Assets/WideTile.scale-150.png b/winuwp/runner_uwp/Assets/WideTile.scale-150.png new file mode 100644 index 0000000..d4b275a Binary files /dev/null and b/winuwp/runner_uwp/Assets/WideTile.scale-150.png differ diff --git a/winuwp/runner_uwp/Assets/WideTile.scale-200.png b/winuwp/runner_uwp/Assets/WideTile.scale-200.png new file mode 100644 index 0000000..6012579 Binary files /dev/null and b/winuwp/runner_uwp/Assets/WideTile.scale-200.png differ diff --git a/winuwp/runner_uwp/Assets/WideTile.scale-400.png b/winuwp/runner_uwp/Assets/WideTile.scale-400.png new file mode 100644 index 0000000..73d2461 Binary files /dev/null and b/winuwp/runner_uwp/Assets/WideTile.scale-400.png differ diff --git a/winuwp/runner_uwp/CMakeLists.txt b/winuwp/runner_uwp/CMakeLists.txt new file mode 100644 index 0000000..b4362a4 --- /dev/null +++ b/winuwp/runner_uwp/CMakeLists.txt @@ -0,0 +1,141 @@ +cmake_minimum_required (VERSION 3.8) +set(CMAKE_SYSTEM_NAME WindowsStore) +set(CMAKE_SYSTEM_VERSION 10.0) +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED YES) + +include(CMakePrintHelpers) + +project (runner LANGUAGES CXX) + +# UWP tile and icon assets. +set(ASSET_FILES ${ASSET_FILES} + Assets/LargeTile.scale-100.png + Assets/LargeTile.scale-125.png + Assets/LargeTile.scale-150.png + Assets/LargeTile.scale-200.png + Assets/LargeTile.scale-400.png + Assets/LockScreenLogo.scale-200.png + Assets/SmallTile.scale-100.png + Assets/SmallTile.scale-125.png + Assets/SmallTile.scale-150.png + Assets/SmallTile.scale-200.png + Assets/SmallTile.scale-400.png + Assets/SplashScreen.scale-100.png + Assets/SplashScreen.scale-125.png + Assets/SplashScreen.scale-150.png + Assets/SplashScreen.scale-200.png + Assets/SplashScreen.scale-400.png + Assets/Square44x44Logo.altform-unplated_targetsize-16.png + Assets/Square44x44Logo.altform-unplated_targetsize-32.png + Assets/Square44x44Logo.altform-unplated_targetsize-48.png + Assets/Square44x44Logo.altform-unplated_targetsize-256.png + Assets/Square44x44Logo.scale-100.png + Assets/Square44x44Logo.scale-125.png + Assets/Square44x44Logo.scale-150.png + Assets/Square44x44Logo.scale-200.png + Assets/Square44x44Logo.scale-400.png + Assets/Square44x44Logo.targetsize-16.png + Assets/Square44x44Logo.targetsize-24.png + Assets/Square44x44Logo.targetsize-24_altform-unplated.png + Assets/Square44x44Logo.targetsize-32.png + Assets/Square44x44Logo.targetsize-48.png + Assets/Square44x44Logo.targetsize-256.png + Assets/Square150x150Logo.scale-100.png + Assets/Square150x150Logo.scale-125.png + Assets/Square150x150Logo.scale-150.png + Assets/Square150x150Logo.scale-200.png + Assets/Square150x150Logo.scale-400.png + Assets/StoreLogo.png + Assets/StoreLogo.scale-100.png + Assets/StoreLogo.scale-125.png + Assets/StoreLogo.scale-150.png + Assets/StoreLogo.scale-200.png + Assets/StoreLogo.scale-400.png + Assets/Wide310x150Logo.scale-200.png + Assets/WideTile.scale-100.png + Assets/WideTile.scale-125.png + Assets/WideTile.scale-150.png + Assets/WideTile.scale-200.png + Assets/WideTile.scale-400.png +) + +# Configure package manifest file. +set(APP_MANIFEST_NAME Package.appxmanifest) +set(APP_MANIFEST_TARGET_LOCATION ${CMAKE_CURRENT_BINARY_DIR}/${APP_MANIFEST_NAME}) +set(SHORT_NAME ${BINARY_NAME}) +set(PACKAGE_GUID "086F9B60-CB52-4D0B-9B4E-AE891E7859D1") + +configure_file( + appxmanifest.in + ${APP_MANIFEST_TARGET_LOCATION} + @ONLY) + +set(CONTENT_FILES ${APP_MANIFEST_TARGET_LOCATION}) + +# Configure package content files. +set_property(SOURCE ${CONTENT_FILES} PROPERTY VS_DEPLOYMENT_CONTENT 1) + +set(RESOURCE_FILES ${ASSET_FILES} ${CONTENT_FILES} Windows_TemporaryKey.pfx) +set_property(SOURCE ${ASSET_FILES} PROPERTY VS_DEPLOYMENT_CONTENT 1) +set_property(SOURCE ${ASSET_FILES} PROPERTY VS_DEPLOYMENT_LOCATION "Assets") + +set(STRING_FILES Resources.pri) +set_property(SOURCE ${STRING_FILES} PROPERTY VS_TOOL_OVERRIDE "PRIResource") + +source_group("Resource Files" FILES ${RESOURCE_FILES} ${CONTENT_FILES} ${STRING_FILES}) + +# Configure Flutter assets using tool generated install manifest +foreach(ITEM ${INSTALL_MANIFEST_CONTENT}) + get_filename_component(ITEM_REL ${CMAKE_BINARY_DIR} DIRECTORY) + file(RELATIVE_PATH RELPATH ${ITEM_REL} ${ITEM}) + + get_filename_component(RELPATH ${RELPATH} DIRECTORY) + get_filename_component(ITEMEXT ${ITEM} LAST_EXT) + + if("${ITEMEXT}" STREQUAL ".dll" OR "${ITEMEXT}" STREQUAL ".pdb") + string(CONCAT RELPATH "") + elseif ("${ITEMEXT}" STREQUAL ".so") + file(RELATIVE_PATH RELPATH "${ITEM_REL}/winuwp" ${ITEM}) + string(REGEX REPLACE "/" "\\\\" RELPATH ${RELPATH}) + string(CONCAT RELPATH "Assets\\Data") + elseif("${ITEMEXT}" STREQUAL ".dat") + string(CONCAT RELPATH "Assets\\Data") + else() + string(REGEX REPLACE "/" "\\\\" RELPATH ${RELPATH}) + string(CONCAT RELPATH "Assets\\Data\\" ${RELPATH}) + endif() + + cmake_print_variables(${RELPATH}) + + set_property(SOURCE ${ITEM} PROPERTY VS_DEPLOYMENT_CONTENT 1) + set_property(SOURCE ${ITEM} PROPERTY VS_DEPLOYMENT_LOCATION ${RELPATH}) +endforeach() + +# Define the application target. To change its name, change BINARY_NAME in the +# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer +# work. +# +# Any new source files that you add to the application should be added here. +add_executable (${BINARY_NAME} WIN32 + main.cpp + flutter_frameworkview.cpp + "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" + ${RESOURCE_FILES} + ${INSTALL_MANIFEST_CONTENT} +) + +# Apply the standard set of build settings. This can be removed for applications +# that need different build settings. +apply_standard_settings(${BINARY_NAME}) + +# Disable Windows macros that collide with C++ standard library functions. +target_compile_definitions(${BINARY_NAME} PRIVATE "NOMINMAX") + +# Add dependency libraries and include directories. Add any application-specific +# dependencies here. +target_link_libraries(${BINARY_NAME} PRIVATE WindowsApp flutter flutter_wrapper_app) +target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}") + +# Run the Flutter tool portions of the build. This must not be removed. +add_dependencies(${BINARY_NAME} flutter_assemble) diff --git a/winuwp/runner_uwp/CMakeSettings.json b/winuwp/runner_uwp/CMakeSettings.json new file mode 100644 index 0000000..ba63a53 --- /dev/null +++ b/winuwp/runner_uwp/CMakeSettings.json @@ -0,0 +1,27 @@ +{ + // See https://go.microsoft.com//fwlink//?linkid=834763 for more information about this file. + "configurations": [ + { + "name": "Debug", + "generator": "Visual Studio 15 2017 Win64", + "configurationType": "Debug", + "inheritEnvironments": [ "msvc_x64_x64" ], + "buildRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\build\\${name}", + "installRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\install\\${name}", + "cmakeCommandArgs": "", + "buildCommandArgs": "", + "ctestCommandArgs": "" + }, + { + "name": "Release", + "generator": "Visual Studio 15 2017 Win64", + "configurationType": "Release", + "inheritEnvironments": [ "msvc_x64_x64" ], + "buildRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\build\\${name}", + "installRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\install\\${name}", + "cmakeCommandArgs": "", + "buildCommandArgs": "", + "ctestCommandArgs": "" + } + ] +} diff --git a/winuwp/runner_uwp/Windows_TemporaryKey.pfx b/winuwp/runner_uwp/Windows_TemporaryKey.pfx new file mode 100644 index 0000000..1cad999 Binary files /dev/null and b/winuwp/runner_uwp/Windows_TemporaryKey.pfx differ diff --git a/winuwp/runner_uwp/appxmanifest.in b/winuwp/runner_uwp/appxmanifest.in new file mode 100644 index 0000000..570d424 --- /dev/null +++ b/winuwp/runner_uwp/appxmanifest.in @@ -0,0 +1,42 @@ + + + + + + + + @SHORT_NAME@ + CMake Test Cert + Assets/StoreLogo.png + + + + + + + + + + + + + + + + + + + + + + diff --git a/winuwp/runner_uwp/flutter_frameworkview.cpp b/winuwp/runner_uwp/flutter_frameworkview.cpp new file mode 100644 index 0000000..bcdc73a --- /dev/null +++ b/winuwp/runner_uwp/flutter_frameworkview.cpp @@ -0,0 +1,155 @@ +#include "winrt/Windows.ApplicationModel.Core.h" +#include "winrt/Windows.Foundation.h" +#include "winrt/Windows.System.Profile.h" +#include "winrt/Windows.System.Threading.h" +#include "winrt/Windows.UI.Core.h" +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include + +struct FlutterFrameworkView + : winrt::implements< + FlutterFrameworkView, + winrt::Windows::ApplicationModel::Core::IFrameworkView> { + // |winrt::Windows::ApplicationModel::Core::IFrameworkView| + void + Initialize(winrt::Windows::ApplicationModel::Core::CoreApplicationView const + &applicationView) { + + // Layout scaling must be disabled in the appinitialization phase in order + // to take effect correctly. + if (winrt::Windows::System::Profile::AnalyticsInfo::VersionInfo() + .DeviceFamily() == L"Windows.Xbox") { + + bool result = winrt::Windows::UI::ViewManagement::ApplicationViewScaling:: + TrySetDisableLayoutScaling(true); + if (!result) { + OutputDebugString(L"Couldn't disable layout scaling"); + } + } + + main_view_ = applicationView; + main_view_.Activated({this, &FlutterFrameworkView::OnActivated}); + } + + // |winrt::Windows::ApplicationModel::Core::IFrameworkView| + void Uninitialize() { + main_view_.Activated(nullptr); + main_view_ = nullptr; + } + + // |winrt::Windows::ApplicationModel::Core::IFrameworkView| + void Load(winrt::hstring const &) {} + + // |winrt::Windows::ApplicationModel::Core::IFrameworkView| + void Run() { + winrt::Windows::UI::Core::CoreWindow window = + winrt::Windows::UI::Core::CoreWindow::GetForCurrentThread(); + + winrt::Windows::UI::Core::CoreDispatcher dispatcher = window.Dispatcher(); + dispatcher.ProcessEvents( + winrt::Windows::UI::Core::CoreProcessEventsOption::ProcessUntilQuit); + } + + // |winrt::Windows::ApplicationModel::Core::IFrameworkView| + winrt::Windows::Foundation::IAsyncAction + SetWindow(winrt::Windows::UI::Core::CoreWindow const &window) { + + // Capture reference to window. + window_ = window; + + // Lay out the window's content within the region occupied by the + // CoreWindow. + auto appView = winrt::Windows::UI::ViewManagement::ApplicationView:: + GetForCurrentView(); + + appView.SetDesiredBoundsMode(winrt::Windows::UI::ViewManagement:: + ApplicationViewBoundsMode::UseCoreWindow); + + // Configure folder paths. + try { + winrt::Windows::Storage::StorageFolder folder = + winrt::Windows::ApplicationModel::Package::Current() + .InstalledLocation(); + + winrt::Windows::Storage::StorageFolder assets = + co_await folder.GetFolderAsync(L"Assets"); + winrt::Windows::Storage::StorageFolder data = + co_await assets.GetFolderAsync(L"data"); + winrt::Windows::Storage::StorageFolder flutter_assets = + co_await data.GetFolderAsync(L"flutter_assets"); + winrt::Windows::Storage::StorageFile icu_data = + co_await data.GetFileAsync(L"icudtl.dat"); + +#if NDEBUG + winrt::Windows::Storage::StorageFile aot_data = + co_await data.GetFileAsync(L"app.so"); +#endif + + std::wstring flutter_assets_path{flutter_assets.Path()}; + std::wstring icu_data_path{icu_data.Path()}; + std::wstring aot_data_path { +#if NDEBUG + aot_data.Path() +#endif + }; + + flutter::DartProject project(flutter_assets_path, icu_data_path, + aot_data_path); + + // Construct viewcontroller using the Window and project + flutter_view_controller_ = std::make_unique( + static_cast(winrt::get_abi(main_view_)), + static_cast(winrt::get_abi(launch_args_)), + project); + + // If plugins present, register them. + RegisterPlugins(flutter_view_controller_.get()->engine()); + } catch (winrt::hresult_error &err) { + winrt::Windows::UI::Popups::MessageDialog md = + winrt::Windows::UI::Popups::MessageDialog::MessageDialog( + L"There was a problem starting the engine: " + err.message()); + md.ShowAsync(); + } + } + + void OnActivated( + winrt::Windows::ApplicationModel::Core::CoreApplicationView const + &applicationView, + winrt::Windows::ApplicationModel::Activation::IActivatedEventArgs const + &args) { + // Activate the application window, making it visible and enabling it to + // receive events. + applicationView.CoreWindow().Activate(); + + // Capture launch args to later pass to Flutter. + launch_args_ = args; + } + + // Current CoreApplicationView. + winrt::Windows::ApplicationModel::Core::CoreApplicationView main_view_{ + nullptr}; + + // Current CoreWindow. + winrt::Windows::UI::Core::CoreWindow window_{nullptr}; + + // Current FlutterViewController. + std::unique_ptr flutter_view_controller_{ + nullptr}; + + // Launch args that were passed in on activation. + winrt::Windows::ApplicationModel::Activation::IActivatedEventArgs + launch_args_; +}; diff --git a/winuwp/runner_uwp/main.cpp b/winuwp/runner_uwp/main.cpp new file mode 100644 index 0000000..1ce54b1 --- /dev/null +++ b/winuwp/runner_uwp/main.cpp @@ -0,0 +1,30 @@ + +#include + +#include "winrt/Windows.ApplicationModel.Core.h" +#include "winrt/Windows.Foundation.h" +#include +#include +#include + +#include + +#include "flutter_frameworkview.cpp" + +struct App + : winrt::implements< + App, winrt::Windows::ApplicationModel::Core::IFrameworkViewSource> { + App() { view_ = winrt::make_self(); } + + // |winrt::Windows::ApplicationModel::Core::IFrameworkViewSource| + winrt::Windows::ApplicationModel::Core::IFrameworkView CreateView() { + return view_.as(); + } + + winrt::com_ptr view_; +}; + +int __stdcall wWinMain(HINSTANCE, HINSTANCE, PWSTR, int) { + winrt::Windows::ApplicationModel::Core::CoreApplication::Run( + winrt::make()); +} diff --git a/winuwp/runner_uwp/resources.pri b/winuwp/runner_uwp/resources.pri new file mode 100644 index 0000000..7de03c9 Binary files /dev/null and b/winuwp/runner_uwp/resources.pri differ